def compute_shadow(self, rect): self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, rect.height) surface_cr = cairo.Context(self.surface) draw_round_rectangle_with_triangle(surface_cr, rect, self.radius, self.arrow_width, self.arrow_height, self.offset, border=5, pos_type=self.pos_type) surface_cr.set_line_width(2) surface_cr.set_source_rgba(*alpha_color_hex_to_cairo(self.shadow_color)) surface_cr.stroke_preserve() gaussian_blur(self.surface, 2) # border. # out border. surface_cr.clip() draw_round_rectangle_with_triangle(surface_cr, rect, self.radius, self.arrow_width, self.arrow_height, self.offset, border=6, pos_type=self.pos_type) surface_cr.set_source_rgba(*alpha_color_hex_to_cairo(self.mask_color)) surface_cr.set_line_width(1) surface_cr.fill()
def expose_completion_window_frame(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation with cairo_disable_antialias(cr): cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo(ui_theme.get_alpha_color("window_frame_outside_3").get_color_info())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() cr.set_source_rgba(*alpha_color_hex_to_cairo(ui_theme.get_alpha_color("window_frame_inside_2").get_color_info())) cr.rectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2) cr.fill()
def expose_event_draw(self, cr, rect): x, y, w, h = rect # out border. cairo_popover(cr, x, y, w, h, self.radius, self.arrow_width, self.arrow_height, self.offset) cr.set_source_rgba(*alpha_color_hex_to_cairo(self.border_out_color)) cr.set_line_width(self.border_width) cr.fill() # in border. padding_h = 0.7 cairo_popover(cr, x + 1, y + 1, w - 2, h - 2, self.radius, self.arrow_width, self.arrow_height, self.offset) cr.set_source_rgba(*alpha_color_hex_to_cairo(self.in_border_color)) # set in border color. cr.set_line_width(self.border_width) cr.fill()
def __paint_bottom_toolbar_background(self, e): # 将皮肤的图片画在bottom toolbar上,作为背景. cr = e.window.cairo_create() bottom_size = e.window.get_size() # draw background. cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ebebeb", 0.1))) cr.rectangle(0, 0, bottom_size[0], bottom_size[1]) cr.fill() # draw background pixbuf. pixbuf = skin_config.background_pixbuf app_h = self.application.window.allocation.height app_w = self.application.window.allocation.width bottom_h = bottom_size[1] # 当图片的高度小雨窗口高度的时候,只拿出图片的最尾巴. if pixbuf.get_height() > app_h + bottom_h: h = app_h else: h = pixbuf.get_height() - bottom_h # 当图片小于窗口宽度的时候,拉伸图片. if pixbuf.get_width() < app_w: pixbuf = pixbuf.scale_simple(app_w, pixbuf.get_width(), gtk.gdk.INTERP_BILINEAR) draw_pixbuf(cr, pixbuf, 0, -(h))
def expose_event_draw(self, cr, rect): x, y, w, h = rect # out border. cairo_popover(cr, x, y, w, h, self.radius, self.arrow_width, self.arrow_height, self.offset) cr.set_source_rgba(*alpha_color_hex_to_cairo(self.border_out_color)) cr.set_line_width(self.border_width) cr.fill() # in border. padding_h = 0.7 cairo_popover(cr, x + 1, y + 1, w - 2, h - 2, self.radius, self.arrow_width, self.arrow_height, self.offset) cr.set_source_rgba(*alpha_color_hex_to_cairo( self.in_border_color)) # set in border color. cr.set_line_width(self.border_width) cr.fill()
def draw_alpha_mask(cr, x, y, width, height, color_name, radius): if not isinstance(color_name, tuple): color_info = app_theme.get_alpha_color(color_name).get_color_info() else: color_info = color_name cr.set_source_rgba(*alpha_color_hex_to_cairo(color_info)) cr.rectangle(x, y, width, height) cr.fill()
def expose_completion_window_frame(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation with cairo_disable_antialias(cr): cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo( ui_theme.get_alpha_color( "window_frame_outside_3").get_color_info())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() cr.set_source_rgba(*alpha_color_hex_to_cairo( ui_theme.get_alpha_color( "window_frame_inside_2").get_color_info())) cr.rectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2) cr.fill()
def render_background(self, cr, rect): backgound_color = ("#FFFFFF", 0.9) cr.set_source_rgba(*alpha_color_hex_to_cairo(backgound_color)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() background_color = get_background_color(self.is_highlight, False, self.is_hover) if background_color: cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color(background_color).get_color())) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill()
def expose_button(self, widget, event, font_size, label_dcolor): # Init. rect = widget.allocation image = self.pixbuf_normal.get_pixbuf() # Get pixbuf along with button's sate. if widget.state == gtk.STATE_NORMAL: image = self.pixbuf_normal.get_pixbuf() label_dcolor = app_theme.get_color('button_text_fg_normal') bg_dcolor = app_theme.get_alpha_color('button_bg_normal') elif widget.state == gtk.STATE_PRELIGHT: image = self.pixbuf_hover.get_pixbuf() label_dcolor = app_theme.get_color('button_text_fg_hover') bg_dcolor = app_theme.get_alpha_color('button_bg_hover') elif widget.state == gtk.STATE_ACTIVE: image = self.pixbuf_press.get_pixbuf() label_dcolor = app_theme.get_color('button_text_fg_press') bg_dcolor = app_theme.get_alpha_color('button_bg_press') # Draw button. cr = widget.window.cairo_create() draw_pixbuf(cr, image, rect.x + self.padding_edge, rect.y) # Draw font. if widget.state == gtk.STATE_INSENSITIVE: label_color = ui_theme.get_color("disable_text").get_color() else: label_color = label_dcolor.get_color() if self.button_label: draw_text(cr, self.button_label, rect.x + image.get_width() + self.padding_edge + self.padding_middle, rect.y, rect.width - image.get_width() - self.padding_middle - self.padding_edge*2, rect.height, font_size, label_color, alignment=pango.ALIGN_LEFT ) if self.draw_background: cr.set_source_rgba(*alpha_color_hex_to_cairo(bg_dcolor.get_color_info())) draw_round_rectangle(cr, rect.x, rect.y, rect.width, rect.height, rect.height/2) cr.fill() # Propagate expose to children. propagate_expose(widget, event) return True
def __paint_top_titlebar_background(self, e): # 将皮肤的图片画在bottom toolbar上,作为背景. cr = e.window.cairo_create() bottom_size = e.window.get_size() # draw background. cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ebebeb", 0.1))) cr.rectangle(0, 0, bottom_size[0], bottom_size[1]) cr.fill() # draw background pixbuf. pixbuf = skin_config.background_pixbuf app_w = self.application.window.allocation.width # 当图片小于窗口宽度的时候,拉伸图片. if pixbuf.get_width() < app_w: pixbuf = pixbuf.scale_simple(app_w, pixbuf.get_width(), gtk.gdk.INTERP_BILINEAR) draw_pixbuf(cr, pixbuf, 0, 0)
def expose_input_entry(self, widget, event): ''' Internal callback for `expose-event` signal. ''' # Init. cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(*alpha_color_hex_to_cairo(("#FFFFFF", 0.9))) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw frame. with cairo_disable_antialias(cr): cr.set_line_width(1) cr.set_source_rgba(*color_hex_to_cairo("#C3C4C5")) cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() propagate_expose(widget, event)
def expose(self, widget, event=None): cr = widget.window.cairo_create() rect = widget.get_allocation() cr.translate(rect.x+rect.width/2, rect.y+rect.height/2) cr.rotate(self.rotate_angle) cr.set_line_width(self.line_width) for i in range(int(self.rate)): cr.set_source_rgba(*alpha_color_hex_to_cairo(("#000", i/self.rate))) cr.arc( #rect.x + rect.width / 2, #rect.y + rect.height / 2, 0, 0, (self.diameter-self.line_width)/2.0, i * self.radian_per_part, (i+1) * self.radian_per_part, ) cr.stroke() return True
def expose_input_entry(self, widget, event): ''' Internal callback for `expose-event` signal. ''' # Init. cr = widget.window.cairo_create() rect = widget.allocation x, y, w, h = rect.x, rect.y, rect.width, rect.height # Draw frame. with cairo_disable_antialias(cr): cr.set_line_width(1) cr.set_source_rgb(*color_hex_to_cairo(self.border_color)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.stroke() cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ffffff", 0.9))) cr.rectangle(rect.x, rect.y, rect.width - 1, rect.height - 1) cr.fill() propagate_expose(widget, event) return True
def expose(self, widget, event=None): cr = widget.window.cairo_create() rect = widget.get_allocation() cr.translate(rect.x + rect.width / 2, rect.y + rect.height / 2) cr.rotate(self.rotate_angle) cr.set_line_width(self.line_width) for i in range(int(self.rate)): cr.set_source_rgba(*alpha_color_hex_to_cairo(( app_theme.get_color("sidebar_select").get_color(), i / self.rate))) cr.arc( #rect.x + rect.width / 2, #rect.y + rect.height / 2, 0, 0, (self.diameter - self.line_width) / 2.0, i * self.radian_per_part, (i + 1) * self.radian_per_part, ) cr.stroke() return True
def __paint_top_window(self, e): top_width, top_height = self.top_window.get_size() cr = self.top_window.cairo_create() cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ffffff", 0.0))) cr.rectangle(0, 0, top_width, top_height) cr.fill()
def __paint_bottom_window(self, e): bottom_rect = self.bottom_window.get_size() cr = self.bottom_window.cairo_create() cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ffffff", 0.0))) cr.rectangle(0, 0, bottom_rect[0], bottom_rect[1]) cr.fill()
def on_expose_event(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation rect.x = rect.y = 0 cr.set_source_rgb(1, 1, 1) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() if not self.channel_infos: render_text( cr, self.prompt_text, rect.x, rect.y, rect.width, rect.height, text_color=app_theme.get_color("labelText").get_color(), alignment=pango.ALIGN_CENTER) return True if self.active_alpha > 0.0: self.draw_channel_info(cr, rect, self.active_index, self.active_alpha) if self.target_index != None and self.target_alpha > 0.0: self.draw_channel_info(cr, rect, self.target_index, self.target_alpha) if self.mask_flag: draw_pixbuf(cr, self.mask_pixbuf, rect.x, rect.y) # Draw select pointer. for index in range(0, self.slide_number): if self.target_index == None: if self.active_index == index: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#9DD6C5", 0.9))) else: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D4E1DC", 0.9))) else: if self.target_index == index: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#9DD6C5", 0.9))) else: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D4E1DC", 0.9))) p_x = rect.x + rect.width + self.pointer_offset_x + index * self.pointer_padding p_y = rect.y + self.pointer_offset_y cr.arc(p_x, p_y, self.pointer_radious, 0, 2 * math.pi) cr.fill() pointer_rect = gtk.gdk.Rectangle(p_x - self.pointer_radious, p_y - self.pointer_radious, self.pointer_radious * 2, self.pointer_radious * 2) # Draw index number. render_text(cr, str(index + 1), pointer_rect.x, pointer_rect.y, pointer_rect.width, pointer_rect.height, text_size=9, text_color="#444444", alignment=pango.ALIGN_CENTER) pointer_rect.x -= rect.x pointer_rect.y -= rect.y self.pointer_coords[index] = pointer_rect return True
def render(self, cr, rect): color = "#EFEFEF" if self.is_select: color = "#FFFFFF" alpha_color = (color, 0.95) with cairo_disable_antialias(cr): cr.set_source_rgba(*alpha_color_hex_to_cairo(alpha_color)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D6D6D6", 0.95))) if self.index == 0: if self.is_select: if self.total == 1: pass else: cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() if self.total <= 2: dashed = [4.0, 4.0] cr.save() cr.move_to(rect.x, rect.y + rect.height) cr.line_to(rect.x + rect.width, rect.y + rect.height) cr.set_dash(dashed) cr.stroke() cr.restore() elif self.index == self.total - 1: if self.is_select: cr.move_to(rect.x + 1, rect.y) cr.rel_line_to(0, rect.height) else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() else: if self.is_select: cr.move_to(rect.x + 1, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() cr.save() cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() if self.icon_pixbuf: icon_y = rect.y + (rect.height - self.icon_size) / 2 draw_pixbuf(cr, self.icon_pixbuf, rect.x + self.padding_x, rect.y + icon_y) if self.is_select or self.is_hover: color = app_theme.get_color("progressBarLeft").get_color() # color = app_theme.get_color("simpleItemHighlight").get_color() else: color = app_theme.get_color("labelText").get_color() draw_text(cr, self.title, rect.x, rect.y, rect.width, rect.height, text_color= color, alignment=pango.ALIGN_CENTER, text_size=10)
def expose_toggle_button(self, widget, event, font_size, label_dcolor): ''' Callback for `expose-event` signal. @param widget: ToggleButton widget. @param event: Expose event. @param button_label: Button label string. @param padding_x: horticultural padding value. @param font_size: Font size. @param label_dcolor: Label DynamicColor. ''' # Init. inactive_normal_dpixbuf, inactive_hover_dpixbuf, inactive_press_dpixbuf, inactive_disable_dpixbuf = self.inactive_pixbuf_group active_normal_dpixbuf, active_hover_dpixbuf, active_press_dpixbuf, active_disable_dpixbuf = self.active_pixbuf_group rect = widget.allocation image = inactive_normal_dpixbuf.get_pixbuf() if not widget.get_active(): button_label = self.active_button_label else: button_label = self.inactive_button_label # Get pixbuf along with button's sate. if widget.state == gtk.STATE_INSENSITIVE: if widget.get_active(): image = active_disable_dpixbuf.get_pixbuf() else: image = inactive_disable_dpixbuf.get_pixbuf() elif widget.state == gtk.STATE_NORMAL: label_dcolor = app_theme.get_color('button_text_fg_normal') bg_dcolor = app_theme.get_alpha_color('button_bg_normal') image = inactive_normal_dpixbuf.get_pixbuf() elif widget.state == gtk.STATE_PRELIGHT: label_dcolor = app_theme.get_color('button_text_fg_hover') bg_dcolor = app_theme.get_alpha_color('button_bg_hover') if not inactive_hover_dpixbuf and not active_hover_dpixbuf: if widget.get_active(): image = active_normal_dpixbuf.get_pixbuf() else: image = inactive_normal_dpixbuf.get_pixbuf() else: if inactive_hover_dpixbuf and active_hover_dpixbuf: if widget.get_active(): image = active_hover_dpixbuf.get_pixbuf() else: image = inactive_hover_dpixbuf.get_pixbuf() elif inactive_hover_dpixbuf: image = inactive_hover_dpixbuf.get_pixbuf() elif active_hover_dpixbuf: image = active_hover_dpixbuf.get_pixbuf() elif widget.state == gtk.STATE_ACTIVE: if inactive_press_dpixbuf and active_press_dpixbuf: if self.button_press_flag: label_dcolor = app_theme.get_color('button_text_fg_press') bg_dcolor = app_theme.get_alpha_color('button_bg_press') if widget.get_active(): image = active_press_dpixbuf.get_pixbuf() else: image = inactive_press_dpixbuf.get_pixbuf() else: label_dcolor = app_theme.get_color('button_text_fg_normal') bg_dcolor = app_theme.get_alpha_color('button_bg_normal') image = active_normal_dpixbuf.get_pixbuf() else: image = active_normal_dpixbuf.get_pixbuf() # Draw button. cr = widget.window.cairo_create() draw_pixbuf(cr, image, rect.x + self.padding_edge, rect.y) # Draw font. if widget.state == gtk.STATE_INSENSITIVE: label_color = ui_theme.get_color("disable_text").get_color() else: label_color = label_dcolor.get_color() if button_label: draw_text(cr, button_label, rect.x + image.get_width() + self.padding_edge + self.padding_middle, rect.y, rect.width - image.get_width() - self.padding_edge * 2 - self.padding_middle + self.more_width, rect.height, font_size, label_color, alignment=pango.ALIGN_LEFT ) if self.draw_background: cr.set_source_rgba(*alpha_color_hex_to_cairo(bg_dcolor.get_color_info())) draw_round_rectangle(cr, rect.x, rect.y, rect.width, rect.height, rect.height/2) cr.fill() # Propagate expose to children. propagate_expose(widget, event) return True
def on_expose_event(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation rect.x = rect.y = 0 cr.set_source_rgb(1, 1, 1) cr.rectangle(rect.x, rect.y, rect.width,rect.height) cr.fill() if not self.channel_infos: render_text(cr, self.prompt_text, rect.x, rect.y, rect.width, rect.height, text_color=app_theme.get_color("labelText").get_color(), alignment=pango.ALIGN_CENTER) return True if self.active_alpha > 0.0: self.draw_channel_info(cr, rect, self.active_index, self.active_alpha) if self.target_index != None and self.target_alpha > 0.0: self.draw_channel_info(cr, rect, self.target_index, self.target_alpha) if self.mask_flag: draw_pixbuf(cr, self.mask_pixbuf, rect.x, rect.y) # Draw select pointer. for index in range(0, self.slide_number): if self.target_index == None: if self.active_index == index: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#9DD6C5", 0.9))) else: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D4E1DC", 0.9))) else: if self.target_index == index: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#9DD6C5", 0.9))) else: cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D4E1DC", 0.9))) p_x = rect.x + rect.width + self.pointer_offset_x + index * self.pointer_padding p_y = rect.y + self.pointer_offset_y cr.arc(p_x, p_y, self.pointer_radious, 0, 2 * math.pi) cr.fill() pointer_rect = gtk.gdk.Rectangle(p_x - self.pointer_radious, p_y - self.pointer_radious, self.pointer_radious * 2, self.pointer_radious * 2) # Draw index number. render_text(cr, str(index + 1), pointer_rect.x, pointer_rect.y, pointer_rect.width, pointer_rect.height, text_size=9, text_color="#444444", alignment=pango.ALIGN_CENTER ) pointer_rect.x -= rect.x pointer_rect.y -= rect.y self.pointer_coords[index] = pointer_rect return True
def __paint_bottom_window(self, e): bottom_rect = self.bottom_window.get_size() cr = self.window.cairo_create() cr.set_source_rgba(*alpha_color_hex_to_cairo(("#ff0000", 0.1))) cr.rectangle(0, 0, bottom_rect[0], bottom_rect[1]) cr.fill()
def render(self, cr, rect): color = "#EFEFEF" if self.is_select: color = "#FFFFFF" alpha_color = (color, 0.95) with cairo_disable_antialias(cr): cr.set_source_rgba(*alpha_color_hex_to_cairo(alpha_color)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() cr.set_line_width(1) cr.set_source_rgba(*alpha_color_hex_to_cairo(("#D6D6D6", 0.95))) if self.index == 0: if self.is_select: if self.total == 1: pass else: cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() if self.total <= 2: dashed = [4.0, 4.0] cr.save() cr.move_to(rect.x, rect.y + rect.height) cr.line_to(rect.x + rect.width, rect.y + rect.height) cr.set_dash(dashed) cr.stroke() cr.restore() elif self.index == self.total - 1: if self.is_select: cr.move_to(rect.x + 1, rect.y) cr.rel_line_to(0, rect.height) else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() else: if self.is_select: cr.move_to(rect.x + 1, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() cr.save() cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() else: cr.move_to(rect.x, rect.y + rect.height) cr.rel_line_to(rect.width, 0) cr.stroke() if self.icon_pixbuf: icon_y = rect.y + (rect.height - self.icon_size) / 2 draw_pixbuf(cr, self.icon_pixbuf, rect.x + self.padding_x, rect.y + icon_y) if self.is_select or self.is_hover: color = app_theme.get_color("progressBarLeft").get_color() # color = app_theme.get_color("simpleItemHighlight").get_color() else: color = app_theme.get_color("labelText").get_color() draw_text(cr, self.title, rect.x, rect.y, rect.width, rect.height, text_color=color, alignment=pango.ALIGN_CENTER, text_size=10)