[GtkUI] Refactor out duplicate code in piecesbar draw pieces

This commit is contained in:
Giorgos Retsinas 2016-10-22 02:26:35 +03:00 committed by Calum Lind
parent 642913b0f8
commit c4282f29ab
1 changed files with 27 additions and 64 deletions

View File

@ -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)