def expose_progressbar(self, widget, event): '''Expose progressbar.''' # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw frame. cr.set_source_rgba(*alpha_color_hex_to_cairo(ui_theme.get_alpha_color("progressbar_frame").get_color_info())) cr.set_operator(cairo.OPERATOR_OVER) draw_round_rectangle(cr, rect.x, rect.y, rect.width, rect.height, 1) cr.stroke() # Draw background. draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height, ui_theme.get_shadow_color("progressbar_background").get_color_info(), 1) # Draw foreground. draw_vlinear(cr, rect.x, rect.y, rect.width * self.progress / 100.0, rect.height, ui_theme.get_shadow_color("progressbar_foreground").get_color_info(), 1) # Draw font. draw_text(cr, str(self.progress) + "%", rect.x, rect.y, rect.width, rect.height, rect.height - 5, "#000000", alignment=pango.ALIGN_CENTER) # Draw light. light_radius = rect.height * 4 light_offset_x = min(self.light_ticker % 150, 100) / 100.0 * (rect.width + light_radius * 2) with cairo_state(cr): cr.rectangle(rect.x, rect.y, rect.width * self.progress / 100.0, rect.height) cr.clip() draw_radial_round(cr, rect.x + light_offset_x - light_radius, rect.y - light_radius / 2, light_radius, ui_theme.get_shadow_color("progressbar_light").get_color_info()) # Propagate expose. propagate_expose(widget, event) return True
def expose_tab_title_box(self, widget, event): ''' Internal callback for `expose-event` signal. ''' cr = widget.window.cairo_create() rect = widget.allocation if self.dockfill: self.update_tab_title_widths(rect.width) # Draw background. self.draw_title_background(cr, widget) if len(self.tab_items) > 0: # Draw title unselect tab. tab_title_width = sum(self.tab_title_widths) with cairo_state(cr): with cairo_disable_antialias(cr): cr.set_source_rgba(*alpha_color_hex_to_cairo(( self.tab_unselect_bg_color.get_color(), 0.7))) cr.rectangle(1, 1, tab_title_width, self.tab_height) cr.fill() cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo(( self.tab_unselect_frame_color.get_color(), 1.0))) cr.rectangle(1, 1, tab_title_width, self.tab_height) cr.stroke() for (index, width) in enumerate(self.tab_title_widths[:-1]): cr.set_source_rgba(*alpha_color_hex_to_cairo(( self.tab_unselect_frame_color.get_color(), 1.0))) cr.rectangle( 1 + sum(self.tab_title_widths[0:index]) + width, 1, 1, self.tab_height) cr.fill() cr.set_source_rgb(*color_hex_to_cairo( self.tab_select_frame_color.get_color())) cr.rectangle(0, rect.height - 1, sum(self.tab_title_widths[0:self.tab_index]), 1) cr.fill() cr.set_source_rgb(*color_hex_to_cairo( self.tab_select_frame_color.get_color())) cr.rectangle( 1 + sum(self.tab_title_widths[0:self.tab_index]), rect.height - 1, rect.width - sum(self.tab_title_widths[0:self.tab_index]), 1) cr.fill() for (index, item) in enumerate(self.tab_items): # Draw title background. title = item[0] # Draw title tab. with cairo_disable_antialias(cr): if index == self.tab_index: # Draw title select tab. cr.set_source_rgba(*alpha_color_hex_to_cairo(( self.tab_select_bg_color.get_color(), 0.93))) if index == 0: cr.rectangle(sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 1, self.tab_height) else: cr.rectangle( 1 + sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index], self.tab_height) cr.fill() if index == 0: cr.rectangle(0, 0, rect.width, self.tab_height) cr.clip() cr.set_line_width(1) cr.set_source_rgb(*color_hex_to_cairo( self.tab_select_frame_color.get_color())) if index == 0: cr.rectangle(sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 2, self.tab_height) else: cr.rectangle( 1 + sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 1, self.tab_height) cr.stroke() draw_text( cr, title, sum(self.tab_title_widths[0:index]) + self.tab_padding_x, self.tab_padding_y, self.tab_title_widths[index] - self.tab_padding_x * 2, self.tab_height - self.tab_padding_y * 2, ) # Draw close button. if self.can_close_tab: button_x = sum( self.tab_title_widths[0:index + 1] ) - self.close_button_padding_x - self.close_button_size button_y = self.close_button_padding_y if self.hover_close_button_index == index: cr.set_source_rgb(*color_hex_to_cairo( self.close_button_select_background_color)) draw_round_rectangle( cr, button_x - self.close_button_frame_size, button_y - self.close_button_frame_size, self.close_button_size + self.close_button_frame_size * 2, self.close_button_size + self.close_button_frame_size * 2, 2) cr.fill() cr.set_line_width(1.5) if self.hover_close_button_index == index: cr.set_source_rgb(*color_hex_to_cairo( self.close_button_select_foreground_color)) else: cr.set_source_rgb( *color_hex_to_cairo(self.close_button_color)) cr.move_to(button_x, button_y) cr.line_to(button_x + self.close_button_size, button_y + self.close_button_size) cr.stroke() cr.move_to(button_x + self.close_button_size, button_y) cr.line_to(button_x, button_y + self.close_button_size) cr.stroke() else: cr.set_source_rgba(*alpha_color_hex_to_cairo(( self.tab_select_bg_color.get_color(), 0.93))) cr.rectangle(0, 0, rect.width, rect.height) cr.fill()
def expose_tab_title_box(self, widget, event): ''' Internal callback for `expose-event` signal. ''' cr = widget.window.cairo_create() rect = widget.allocation if self.dockfill: self.update_tab_title_widths(rect.width) # Draw background. self.draw_title_background(cr, widget) if len(self.tab_items) > 0: # Draw title unselect tab. tab_title_width = sum(self.tab_title_widths) with cairo_state(cr): with cairo_disable_antialias(cr): cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_bg_color.get_color(), 0.7))) cr.rectangle(1, 1, tab_title_width, self.tab_height) cr.fill() cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0))) cr.rectangle(1, 1, tab_title_width, self.tab_height) cr.stroke() for (index, width) in enumerate(self.tab_title_widths[:-1]): cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0))) cr.rectangle(1 + sum(self.tab_title_widths[0:index]) + width, 1, 1, self.tab_height) cr.fill() cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color())) cr.rectangle(0, rect.height - 1, sum(self.tab_title_widths[0:self.tab_index]), 1) cr.fill() cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color())) cr.rectangle(1 + sum(self.tab_title_widths[0:self.tab_index]), rect.height - 1, rect.width - sum(self.tab_title_widths[0:self.tab_index]), 1) cr.fill() for (index, item) in enumerate(self.tab_items): # Draw title background. title = item[0] # Draw title tab. with cairo_disable_antialias(cr): if index == self.tab_index: # Draw title select tab. cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93))) if index == 0: cr.rectangle(sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 1, self.tab_height) else: cr.rectangle(1 + sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index], self.tab_height) cr.fill() if index == 0: cr.rectangle(0, 0, rect.width, self.tab_height) cr.clip() cr.set_line_width(1) cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color())) if index == 0: cr.rectangle(sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 2, self.tab_height) else: cr.rectangle(1 + sum(self.tab_title_widths[0:index]), 1, self.tab_title_widths[index] + 1, self.tab_height) cr.stroke() draw_text(cr, title, sum(self.tab_title_widths[0:index]) + self.tab_padding_x, self.tab_padding_y, self.tab_title_widths[index] - self.tab_padding_x * 2, self.tab_height - self.tab_padding_y * 2, ) # Draw close button. if self.can_close_tab: button_x = sum(self.tab_title_widths[0:index + 1]) - self.close_button_padding_x - self.close_button_size button_y = self.close_button_padding_y if self.hover_close_button_index == index: cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_background_color)) draw_round_rectangle( cr, button_x - self.close_button_frame_size, button_y - self.close_button_frame_size, self.close_button_size + self.close_button_frame_size * 2, self.close_button_size + self.close_button_frame_size * 2, 2 ) cr.fill() cr.set_line_width(1.5) if self.hover_close_button_index == index: cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_foreground_color)) else: cr.set_source_rgb(*color_hex_to_cairo(self.close_button_color)) cr.move_to(button_x, button_y) cr.line_to(button_x + self.close_button_size, button_y + self.close_button_size) cr.stroke() cr.move_to(button_x + self.close_button_size, button_y) cr.line_to(button_x, button_y + self.close_button_size) cr.stroke() else: cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93))) cr.rectangle(0, 0, rect.width, rect.height) cr.fill()
def expose_nav_item(self, widget, event): ''' Internal callback `expose-event` signal. ''' # Init. cr = widget.window.cairo_create() rect = widget.allocation select_index = self.get_index() hover_pixbuf = self.item_hover_pixbuf.get_pixbuf() press_pixbuf = self.item_press_pixbuf.get_pixbuf() # Draw background. if widget.state == gtk.STATE_NORMAL: if select_index == self.index: select_pixbuf = press_pixbuf else: select_pixbuf = None elif widget.state == gtk.STATE_PRELIGHT: if select_index == self.index: select_pixbuf = press_pixbuf else: select_pixbuf = hover_pixbuf elif widget.state == gtk.STATE_ACTIVE: select_pixbuf = press_pixbuf if select_pixbuf: select_pixbuf = select_pixbuf.scale_simple( rect.width, rect.height, gtk.gdk.INTERP_BILINEAR) draw_pixbuf(cr, select_pixbuf, rect.x, rect.y) # Draw navigate item. if self.vertical: draw_pixbuf( cr, self.nav_item_pixbuf, rect.x + (rect.width - self.nav_item_pixbuf.get_width()) / 2, rect.y) draw_text(cr, self.content, rect.x, rect.y + self.nav_item_pixbuf.get_height() - 3, rect.width, rect.height - self.nav_item_pixbuf.get_height(), text_size=self.font_size, text_color="#FFFFFF", alignment=pango.ALIGN_CENTER, gaussian_radious=2, gaussian_color="#000000", border_radious=1, border_color="#000000", ) else: padding_x = (rect.width - self.nav_item_pixbuf.get_width() - self.text_width) / 2 draw_pixbuf( cr, self.nav_item_pixbuf, rect.x + padding_x, rect.y + (rect.height - self.nav_item_pixbuf.get_height()) / 2) draw_text(cr, self.content, rect.x + self.nav_item_pixbuf.get_width() + padding_x, rect.y, rect.width, rect.height, text_size=self.font_size, text_color="#FFFFFF", gaussian_radious=2, gaussian_color="#000000", border_radious=1, border_color="#000000", ) # Draw notify number. text_size = 8 (number_width, number_height) = get_content_size(str(self.notify_num), text_size) padding_x = 2 padding_y = 0 radious = 3 draw_offset_x = -5 draw_offset_y = 8 draw_x = rect.x + self.nav_item_pixbuf.get_width() + padding_x + draw_offset_x draw_y = rect.y + draw_offset_y if self.notify_num > 0: cr.set_source_rgb(*color_hex_to_cairo("#BF0000")) draw_round_rectangle( cr, draw_x, draw_y, number_width + padding_x * 2, number_height + padding_y * 2, radious) cr.fill() draw_text( cr, str(self.notify_num), draw_x + padding_x, draw_y + padding_y, number_width, number_height, text_color="#FFFFFF", text_size=text_size, ) # Propagate expose to children. propagate_expose(widget, event) return True
def expose_nav_item(self, widget, event): ''' Internal callback `expose-event` signal. ''' # Init. cr = widget.window.cairo_create() rect = widget.allocation select_index = self.get_index() hover_pixbuf = self.item_hover_pixbuf.get_pixbuf() press_pixbuf = self.item_press_pixbuf.get_pixbuf() # Draw background. if widget.state == gtk.STATE_NORMAL: if select_index == self.index: select_pixbuf = press_pixbuf else: select_pixbuf = None elif widget.state == gtk.STATE_PRELIGHT: if select_index == self.index: select_pixbuf = press_pixbuf else: select_pixbuf = hover_pixbuf elif widget.state == gtk.STATE_ACTIVE: select_pixbuf = press_pixbuf if select_pixbuf: select_pixbuf = select_pixbuf.scale_simple(rect.width, rect.height, gtk.gdk.INTERP_BILINEAR) draw_pixbuf(cr, select_pixbuf, rect.x, rect.y) # Draw navigate item. if self.vertical: draw_pixbuf( cr, self.nav_item_pixbuf, rect.x + (rect.width - self.nav_item_pixbuf.get_width()) / 2, rect.y) draw_text( cr, self.content, rect.x, rect.y + self.nav_item_pixbuf.get_height() - 3, rect.width, rect.height - self.nav_item_pixbuf.get_height(), text_size=self.font_size, text_color="#FFFFFF", alignment=pango.ALIGN_CENTER, gaussian_radious=2, gaussian_color="#000000", border_radious=1, border_color="#000000", ) else: padding_x = (rect.width - self.nav_item_pixbuf.get_width() - self.text_width) / 2 draw_pixbuf( cr, self.nav_item_pixbuf, rect.x + padding_x, rect.y + (rect.height - self.nav_item_pixbuf.get_height()) / 2) draw_text( cr, self.content, rect.x + self.nav_item_pixbuf.get_width() + padding_x, rect.y, rect.width, rect.height, text_size=self.font_size, text_color="#FFFFFF", gaussian_radious=2, gaussian_color="#000000", border_radious=1, border_color="#000000", ) # Draw notify number. text_size = 8 (number_width, number_height) = get_content_size(str(self.notify_num), text_size) padding_x = 2 padding_y = 0 radious = 3 draw_offset_x = -5 draw_offset_y = 8 draw_x = rect.x + self.nav_item_pixbuf.get_width( ) + padding_x + draw_offset_x draw_y = rect.y + draw_offset_y if self.notify_num > 0: cr.set_source_rgb(*color_hex_to_cairo("#BF0000")) draw_round_rectangle(cr, draw_x, draw_y, number_width + padding_x * 2, number_height + padding_y * 2, radious) cr.fill() draw_text( cr, str(self.notify_num), draw_x + padding_x, draw_y + padding_y, number_width, number_height, text_color="#FFFFFF", text_size=text_size, ) # Propagate expose to children. propagate_expose(widget, event) return True