[GtkUI] Refactor out duplicate code in piecesbar draw pieces
This commit is contained in:
parent
642913b0f8
commit
c4282f29ab
|
@ -12,22 +12,17 @@ from __future__ import division
|
|||
import logging
|
||||
from math import pi
|
||||
|
||||
import cairo
|
||||
import gtk
|
||||
import pango
|
||||
import pangocairo
|
||||
from cairo import FORMAT_ARGB32, Context, ImageSurface
|
||||
|
||||
from deluge.configmanager import ConfigManager
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
COLOR_STATES = {
|
||||
0: "missing",
|
||||
1: "waiting",
|
||||
2: "downloading",
|
||||
3: "completed"
|
||||
}
|
||||
COLOR_STATES = ["missing", "waiting", "downloading", "completed"]
|
||||
|
||||
|
||||
class PiecesBar(gtk.DrawingArea):
|
||||
|
@ -75,13 +70,7 @@ class PiecesBar(gtk.DrawingArea):
|
|||
# Restrict Cairo to the exposed area; avoid extra work
|
||||
self.__roundcorners_clipping()
|
||||
|
||||
if self.__pieces:
|
||||
self.__draw_pieces()
|
||||
elif self.__num_pieces:
|
||||
# Special case. Completed torrents do not send any pieces in their
|
||||
# status.
|
||||
self.__draw_pieces_completed()
|
||||
|
||||
self.__draw_progress_overlay()
|
||||
self.__write_text()
|
||||
self.__roundcorners_border()
|
||||
|
@ -104,7 +93,8 @@ class PiecesBar(gtk.DrawingArea):
|
|||
self.__cr.set_source_rgba(0.0, 0.0, 0.0, 0.9)
|
||||
self.__cr.stroke()
|
||||
|
||||
def __create_roundcorners_subpath(self, ctx, x, y, width, height):
|
||||
@staticmethod
|
||||
def __create_roundcorners_subpath(ctx, x, y, width, height):
|
||||
aspect = 1.0
|
||||
corner_radius = height / 10
|
||||
radius = corner_radius / aspect
|
||||
|
@ -118,24 +108,26 @@ class PiecesBar(gtk.DrawingArea):
|
|||
return ctx
|
||||
|
||||
def __draw_pieces(self):
|
||||
if (self.__resized() or self.__pieces != self.__old_pieces or
|
||||
self.__pieces_overlay is None):
|
||||
# Need to recreate the cache drawing
|
||||
self.__pieces_overlay = cairo.ImageSurface(
|
||||
cairo.FORMAT_ARGB32, self.__width, self.__height
|
||||
)
|
||||
ctx = cairo.Context(self.__pieces_overlay)
|
||||
start_pos = 0
|
||||
num_pieces = self.__num_pieces and self.__num_pieces or len(self.__pieces)
|
||||
piece_width = self.__width * 1 / num_pieces
|
||||
if not self.__pieces and not self.__num_pieces:
|
||||
# Nothing to draw.
|
||||
return
|
||||
|
||||
for state in self.__pieces:
|
||||
if self.__resized() or self.__pieces != self.__old_pieces or self.__pieces_overlay is None:
|
||||
# Need to recreate the cache drawing
|
||||
self.__pieces_overlay = ImageSurface(FORMAT_ARGB32, self.__width, self.__height)
|
||||
ctx = Context(self.__pieces_overlay)
|
||||
|
||||
start_pos = 0
|
||||
if self.__pieces:
|
||||
pieces = self.__pieces
|
||||
elif self.__num_pieces:
|
||||
# Completed torrents do not send any pieces so create list using 'completed' state.
|
||||
pieces = [COLOR_STATES.index("completed")] * self.__num_pieces
|
||||
piece_width = self.__width / len(pieces)
|
||||
|
||||
for state in pieces:
|
||||
color = self.gtkui_config["pieces_color_%s" % COLOR_STATES[state]]
|
||||
ctx.set_source_rgb(
|
||||
color[0] / 65535,
|
||||
color[1] / 65535,
|
||||
color[2] / 65535,
|
||||
)
|
||||
ctx.set_source_rgb(color[0] / 65535, color[1] / 65535, color[2] / 65535)
|
||||
ctx.rectangle(start_pos, 0, piece_width, self.__height)
|
||||
ctx.fill()
|
||||
start_pos += piece_width
|
||||
|
@ -143,41 +135,14 @@ class PiecesBar(gtk.DrawingArea):
|
|||
self.__cr.set_source_surface(self.__pieces_overlay)
|
||||
self.__cr.paint()
|
||||
|
||||
def __draw_pieces_completed(self):
|
||||
if (self.__resized() or self.__pieces != self.__old_pieces or
|
||||
self.__pieces_overlay is None):
|
||||
# Need to recreate the cache drawing
|
||||
self.__pieces_overlay = cairo.ImageSurface(
|
||||
cairo.FORMAT_ARGB32, self.__width, self.__height
|
||||
)
|
||||
ctx = cairo.Context(self.__pieces_overlay)
|
||||
piece_width = self.__width * 1 / self.__num_pieces
|
||||
start = 0
|
||||
for _ in range(self.__num_pieces):
|
||||
# Like this to keep same aspect ratio
|
||||
color = self.gtkui_config["pieces_color_%s" % COLOR_STATES[3]]
|
||||
ctx.set_source_rgb(
|
||||
color[0] / 65535,
|
||||
color[1] / 65535,
|
||||
color[2] / 65535,
|
||||
)
|
||||
ctx.rectangle(start, 0, piece_width, self.__height)
|
||||
ctx.fill()
|
||||
start += piece_width
|
||||
|
||||
self.__cr.set_source_surface(self.__pieces_overlay)
|
||||
self.__cr.paint()
|
||||
|
||||
def __draw_progress_overlay(self):
|
||||
if not self.__state:
|
||||
# Nothing useful to draw, return now!
|
||||
return
|
||||
if (self.__resized() or self.__fraction != self.__old_fraction) or self.__progress_overlay is None:
|
||||
# Need to recreate the cache drawing
|
||||
self.__progress_overlay = cairo.ImageSurface(
|
||||
cairo.FORMAT_ARGB32, self.__width, self.__height
|
||||
)
|
||||
ctx = cairo.Context(self.__progress_overlay)
|
||||
self.__progress_overlay = ImageSurface(FORMAT_ARGB32, self.__width, self.__height)
|
||||
ctx = Context(self.__progress_overlay)
|
||||
ctx.set_source_rgba(0.1, 0.1, 0.1, 0.3) # Transparent
|
||||
ctx.rectangle(0.0, 0.0, self.__width * self.__fraction, self.__height)
|
||||
ctx.fill()
|
||||
|
@ -193,10 +158,8 @@ class PiecesBar(gtk.DrawingArea):
|
|||
self.__state != self.__old_state or
|
||||
self.__text_overlay is None):
|
||||
# Need to recreate the cache drawing
|
||||
self.__text_overlay = cairo.ImageSurface(
|
||||
cairo.FORMAT_ARGB32, self.__width, self.__height
|
||||
)
|
||||
ctx = cairo.Context(self.__text_overlay)
|
||||
self.__text_overlay = ImageSurface(FORMAT_ARGB32, self.__width, self.__height)
|
||||
ctx = Context(self.__text_overlay)
|
||||
pg = pangocairo.CairoContext(ctx)
|
||||
pl = pg.create_layout()
|
||||
pl.set_font_description(self.__text_font)
|
||||
|
|
Loading…
Reference in New Issue