From c4282f29abbd1812c5d91343561886129751390c Mon Sep 17 00:00:00 2001 From: Giorgos Retsinas Date: Sat, 22 Oct 2016 02:26:35 +0300 Subject: [PATCH] [GtkUI] Refactor out duplicate code in piecesbar draw pieces --- deluge/ui/gtkui/piecesbar.py | 91 +++++++++++------------------------- 1 file changed, 27 insertions(+), 64 deletions(-) diff --git a/deluge/ui/gtkui/piecesbar.py b/deluge/ui/gtkui/piecesbar.py index 5ed6a4684..a9a01b7eb 100644 --- a/deluge/ui/gtkui/piecesbar.py +++ b/deluge/ui/gtkui/piecesbar.py @@ -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_pieces() 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)