Ejemplo n.º 1
0
    def __init__(self, callback=None):
        gtk.EventBox.__init__(self)
        self.set_visible_window(False)
        self.add_events(gtk.gdk.BUTTON_PRESS_MASK |
                        gtk.gdk.BUTTON_RELEASE_MASK |
                        gtk.gdk.POINTER_MOTION_MASK |
                        gtk.gdk.ENTER_NOTIFY_MASK |
                        gtk.gdk.LEAVE_NOTIFY_MASK
                        )

        
        self.connect("expose-event", self.on_expose_event)
        
        if LANGUAGE == "zh_CN":
            prefix = "cn"
        elif LANGUAGE in ["zh_HK", "zh_TW"]:    
            prefix = "tw"
        else:    
            prefix = "en"
            
        self.failed_dpixbuf = get_common_image_pixbuf("network/timeout_%s.png" % prefix)
        self.connect("motion-notify-event", self.on_motion_notify)
        self.connect("button-press-event", self.on_button_press)
        
        self.normal_text_dcolor = ui_theme.get_color("label_text")
        self.hover_text_dcolor = ui_theme.get_color("globalItemHighlight")
        self.prompt_text = _("Click here to refresh")
        self.text_padding_y = 5
        self.text_padding_x = 5
        self.text_rect = None
        self.is_hover = False
        self.press_callback = callback
Ejemplo n.º 2
0
    def render_text(self, cr, rect):
        if self.is_hover or self.is_select:
            # Draw background.
            draw_vlinear(
                cr, rect.x, rect.y, rect.width, rect.height,
                ui_theme.get_shadow_color("menu_item_select").get_color_info())

            # Set font color.
            font_color = ui_theme.get_color("menu_select_font").get_color()

            # Don't highlight when select.
            text = self.text
        else:
            # Set font color.
            font_color = ui_theme.get_color("menu_font").get_color()

            # Highilght match string.
            r = self.text.partition(self.search_string.lower())
            text = "%s<span foreground=\"#00AAFF\">%s</span>%s" % (r[0], r[1],
                                                                   r[2])

        draw_text(cr,
                  text,
                  rect.x + self.padding_x,
                  rect.y,
                  rect.width - self.padding_x * 2,
                  rect.height,
                  text_color=font_color)
Ejemplo n.º 3
0
    def render_text(self, cr, rect):
        if self.is_hover or self.is_select:
            # Draw background.
            draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height,
                         ui_theme.get_shadow_color("menu_item_select").get_color_info())

            # Set font color.
            font_color = ui_theme.get_color("menu_select_font").get_color()

            # Don't highlight when select.
            text = self.text
        else:
            # Set font color.
            font_color = ui_theme.get_color("menu_font").get_color()

            # Highilght match string.
            r = self.text.partition(self.search_string.lower())
            text = "%s<span foreground=\"#00AAFF\">%s</span>%s" % (r[0], r[1], r[2])

        draw_text(cr,
                  text,
                  rect.x + self.padding_x,
                  rect.y,
                  rect.width - self.padding_x * 2,
                  rect.height,
                  text_color=font_color)
Ejemplo n.º 4
0
 def text_view_changed(self, buf, button):
     '''text_view changed callback'''
     count = buf.get_char_count()
     if count <= self.MAX_CHAR:
         #self.input_tip_label.set_text(_("left"))
         self.input_num_label.set_text("%d" % (self.MAX_CHAR - count))
         self.input_num_label.text_color = ui_theme.get_color("category_item")
         if not button.is_sensitive():
             button.set_sensitive(True)
     else:
         #self.input_tip_label.set_text(_("exceeds"))
         self.input_num_label.set_text("-%d" % (count - self.MAX_CHAR))
         self.input_num_label.text_color = ui_theme.get_color("category_item")
         if button.is_sensitive():
             button.set_sensitive(False)
 def __init__(self):
     self.tree_view_open  = app_theme.get_pixbuf("treeview/open.png")
     self.tree_view_close = app_theme.get_pixbuf("treeview/close.png")
     self.tree_view_right = app_theme.get_pixbuf("treeview/right.png")
     self.tree_view_bottom = app_theme.get_pixbuf("treeview/bottom.png")
     #
     self.listview_color = ui_theme.get_color("scrolledbar")
     self.play_list_vbox = gtk.VBox()
     #
     self.list_scroll_win   = ScrolledWindow(0, 0)
     self.list_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.list_view    = ListView()
     #
     self.tree_scroll_win   = ScrolledWindow(0, 0)
     self.tree_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.tree_view     = TreeViewBase()
     self.note_book = NoteBook()
     #
     self.list_view.on_draw_sub_item =  self.__listview_on_draw_sub_item
     self.list_view.columns.add_range(["filename", "time"])
     self.list_view.columns[0].width = 120
     self.list_view.columns[1].width = 95
     #
     self.note_book.hide_title()
     self.tree_view.paint_nodes_event = self.__treeview_paint_nodes_event
     #
     self.list_scroll_win.add_with_viewport(self.list_view)
     self.tree_scroll_win.add_with_viewport(self.tree_view)
     self.note_book.add_layout1(self.list_scroll_win) 
     self.note_book.add_layout2(self.tree_scroll_win)
     #self.play_list_vbox.pack_start(self.scroll_win, True, True)
     self.play_list_vbox.pack_start(self.note_book, True, True)
    def on_expose_event(self, widget, event):
        '''
        docs
        '''
        cr = widget.window.cairo_create()
        rect = widget.allocation

        if widget.state == gtk.STATE_NORMAL:
            cr.set_source_rgba(0, 0, 0, 0)
        elif widget.state == gtk.STATE_PRELIGHT:
            cr.set_source_rgba(0.5, 0.5, 0.5, 0.5)
        elif widget.state == gtk.STATE_ACTIVE:
            cr.set_source_rgb(0.5, 0.5, 0.5)

        cr.rectangle(*rect)
        cr.fill()

        draw_pixbuf(cr, self.pixbuf, rect.x, rect.y + 5)

        draw_text(cr, self.content,
                  rect.x + self.pixbuf_width + 2,
                  rect.y + 8,
                  rect.width - self.pixbuf_width,
                  rect.height - self.pixbuf_height,
                  text_color=ui_theme.get_color("title_text").get_color(),
                  )

        return True
Ejemplo n.º 7
0
    def __init__(
            self,
            text,
            callback_action=None,
            enable_gaussian=False,
            text_color=ui_theme.get_color("link_text"),
    ):
        '''
        Initialize LinkButton class.

        @param text: Link content.
        @param link: Link address.
        @param enable_gaussian: To enable gaussian effect on link, default is True.
        @param text_color: Link color, just use when option enable_gaussian is False.
        '''
        Label.__init__(self,
                       text,
                       text_color,
                       enable_gaussian=enable_gaussian,
                       text_size=9,
                       gaussian_radious=1,
                       border_radious=0,
                       underline=True)
        self.callback_action = callback_action

        set_clickable_cursor(self)
        self.connect('button-press-event', self.button_press_action)
 def expose_event(self, widget, event):
     cr = widget.window.cairo_create()
     rect = widget.child.allocation
     width, height = get_content_size(self.label_name)
     cr.set_source_rgb(
         *color_hex_to_cairo(ui_theme.get_color("link_text").get_color()))
     draw_line(cr, rect.x, rect.y + rect.height, rect.x + width,
               rect.y + rect.height)
 def __init__(self):
     self.one_close = app_theme.get_pixbuf("treeview/1-close.png")
     self.one_open = app_theme.get_pixbuf("treeview/1-open.png")
     self.two_close = app_theme.get_pixbuf("treeview/2-close.png")
     self.two_open = app_theme.get_pixbuf("treeview/2-open.png")
     self.three_close = app_theme.get_pixbuf("treeview/3-close.png")
     self.three_open = app_theme.get_pixbuf("treeview/3-open.png")
     #
     self.tree_view_open = app_theme.get_pixbuf("treeview/open.png")
     self.tree_view_close = app_theme.get_pixbuf("treeview/close.png")
     self.tree_view_right = app_theme.get_pixbuf("treeview/right.png")
     self.tree_view_bottom = app_theme.get_pixbuf("treeview/bottom.png")
     #
     self.listview_color = ui_theme.get_color("scrolledbar")
     self.play_list_vbox = gtk.VBox()
     #
     self.list_view_vbox = gtk.VBox()
     self.list_scroll_win = ScrolledWindow(0, 0)
     self.list_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.list_view = ListView()
     #
     self.play_list_con = PlayListControl()
     #
     self.list_view_vbox.pack_start(self.list_scroll_win, True, True)
     self.list_view_vbox.pack_start(self.play_list_con, False, False)
     # 网络列表,搜索框.
     self.tree_scroll_win = ScrolledWindow(0, 0)
     self.tree_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.tree_view_vbox = gtk.VBox()
     self.tree_view = TreeViewBase()
     self.search_ali = gtk.Alignment(0, 0, 1, 1)
     self.search = Search()
     self.search_ali.add(self.search)
     #
     self.search_ali.set_padding(7, 5, 12, 12)
     self.tree_view_vbox.pack_start(self.search_ali, False, False)
     self.tree_view_vbox.pack_start(self.tree_scroll_win, True, True)
     self.search_ali.connect("expose-event", self.search_ali_expose_event)
     #
     self.note_book = NoteBook()
     #
     self.list_view.on_draw_sub_item = self.__listview_on_draw_sub_item
     self.list_view.columns.add_range(["filename", "time"])
     self.list_view.columns[0].width = 120
     self.list_view.columns[1].width = 95
     #
     self.note_book.hide_title()
     self.tree_view.paint_nodes_event = self.__treeview_paint_nodes_event
     #
     self.list_scroll_win.add_with_viewport(self.list_view)
     self.tree_scroll_win.add_with_viewport(self.tree_view)
     #self.note_book.add_layout1(self.list_scroll_win)
     self.note_book.add_layout1(self.list_view_vbox)
     self.note_book.add_layout2(self.tree_view_vbox)
     #self.play_list_vbox.pack_start(self.scroll_win, True, True)
     self.play_list_vbox.pack_start(self.note_book, True, True)
Ejemplo n.º 10
0
 def __init__(self):
     self.one_close = app_theme.get_pixbuf("treeview/1-close.png")
     self.one_open  = app_theme.get_pixbuf("treeview/1-open.png")
     self.two_close = app_theme.get_pixbuf("treeview/2-close.png")
     self.two_open  = app_theme.get_pixbuf("treeview/2-open.png")
     self.three_close = app_theme.get_pixbuf("treeview/3-close.png")
     self.three_open  = app_theme.get_pixbuf("treeview/3-open.png")
     #
     self.tree_view_open  = app_theme.get_pixbuf("treeview/open.png")
     self.tree_view_close = app_theme.get_pixbuf("treeview/close.png")
     self.tree_view_right = app_theme.get_pixbuf("treeview/right.png")
     self.tree_view_bottom = app_theme.get_pixbuf("treeview/bottom.png")
     #
     self.listview_color = ui_theme.get_color("scrolledbar")
     self.play_list_vbox = gtk.VBox()
     #
     self.list_view_vbox = gtk.VBox()
     self.list_scroll_win   = ScrolledWindow(0, 0)
     self.list_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.list_view    = ListView()
     #
     self.play_list_con = PlayListControl()
     #
     self.list_view_vbox.pack_start(self.list_scroll_win, True, True)
     self.list_view_vbox.pack_start(self.play_list_con, False, False)
     # 网络列表,搜索框.
     self.tree_scroll_win   = ScrolledWindow(0, 0)
     self.tree_scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
     self.tree_view_vbox = gtk.VBox()
     self.tree_view     = TreeViewBase()
     self.search_ali    = gtk.Alignment(0, 0, 1, 1)
     self.search        = Search()
     self.search_ali.add(self.search)
     #
     self.search_ali.set_padding(7, 5, 12, 12)
     self.tree_view_vbox.pack_start(self.search_ali, False, False)
     self.tree_view_vbox.pack_start(self.tree_scroll_win, True, True)
     self.search_ali.connect("expose-event", self.search_ali_expose_event)
     #
     self.note_book = NoteBook()
     #
     self.list_view.on_draw_sub_item =  self.__listview_on_draw_sub_item
     self.list_view.columns.add_range(["filename", "time"])
     self.list_view.columns[0].width = 120
     self.list_view.columns[1].width = 95
     #
     self.note_book.hide_title()
     self.tree_view.paint_nodes_event = self.__treeview_paint_nodes_event
     #
     self.list_scroll_win.add_with_viewport(self.list_view)
     self.tree_scroll_win.add_with_viewport(self.tree_view)
     #self.note_book.add_layout1(self.list_scroll_win) 
     self.note_book.add_layout1(self.list_view_vbox) 
     self.note_book.add_layout2(self.tree_view_vbox)
     #self.play_list_vbox.pack_start(self.scroll_win, True, True)
     self.play_list_vbox.pack_start(self.note_book, True, True)
Ejemplo n.º 11
0
    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()
Ejemplo n.º 12
0
    def __render_name(self, cr, rect):
        font_color = ui_theme.get_color("menu_font").get_color()
        '''
        cr.set_source_rgb(1, 1, 1)
        cr.rectangle(rect.x, rect.y, rect.width, rect.height)
        cr.fill()
        '''
        if self.is_hover:
            # Draw background.
            draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height,
                         ui_theme.get_shadow_color("menu_item_select").get_color_info())
            font_color = ui_theme.get_color("menu_select_font").get_color()

        draw_text(cr,
                  self.name,
                  rect.x + 10,
                  rect.y,
                  self.ITEM_WIDTH,
                  rect.height,
                  text_color=font_color)
Ejemplo n.º 13
0
    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 __init__(self, 
                 text, 
                 callback_action=None,
                 enable_gaussian=False, 
                 text_color=ui_theme.get_color("link_text"),
                 ):
        Label.__init__(self, text, text_color, enable_gaussian=enable_gaussian, text_size=9,
                       gaussian_radious=1, border_radious=0, underline=False)
        self.callback_action = callback_action

        set_clickable_cursor(self)
        self.connect('button-press-event', self.button_press_action)
Ejemplo n.º 15
0
    def __render_name(self, cr, rect):
        font_color = ui_theme.get_color("menu_font").get_color()
        '''
        cr.set_source_rgb(1, 1, 1)
        cr.rectangle(rect.x, rect.y, rect.width, rect.height)
        cr.fill()
        '''
        if self.is_hover:
            # Draw background.
            draw_vlinear(
                cr, rect.x, rect.y, rect.width, rect.height,
                ui_theme.get_shadow_color("menu_item_select").get_color_info())
            font_color = ui_theme.get_color("menu_select_font").get_color()

        draw_text(cr,
                  self.name,
                  rect.x + 10,
                  rect.y,
                  self.ITEM_WIDTH,
                  rect.height,
                  text_color=font_color)
Ejemplo n.º 16
0
 def __init_values(self):
     self.color = ui_theme.get_color("scrolledbar")
     self.fg_left_color  = app_theme.get_color("progressBarLeft")
     self.fg_right_color = app_theme.get_color("progressBarRight")
     self.bg_pixbuf      = app_theme.get_pixbuf("progressbar/bg.png").get_pixbuf()
     #
     self.drag_pixbuf = app_theme.get_pixbuf("progressbar/slide_block.png").get_pixbuf()
     self.drag_pixbuf_width = self.drag_pixbuf.get_width()
     self.drag_pixbuf_height = self.drag_pixbuf.get_height()
     #
     self.max_value = 100
     self.min_value = 0
     self.pos       = 0
     self.drag_show_check = False
     self.move_check = False
Ejemplo n.º 17
0
    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
Ejemplo n.º 18
0
    def __init__(self):
        super(GuideBox, self).__init__()

        self.scrolled_window = ScrolledWindow()
        self.backgroundbox = BackgroundBox()
        self.backgroundbox.draw_mask = self.draw_mask

        self.guide_pixbuf = utils.get_common_image_pixbuf('guide.png')

        self.top_title = gtk.HBox()

        self.top_left_icon = gtk.VBox()
        self.top_left_icon.set_size_request(self.guide_pixbuf.get_width(),
                                            self.guide_pixbuf.get_height())
        self.top_left_icon.connect('expose-event', self.expose_top_left_icon)
        top_left_icon_align = gtk.Alignment(0.5, 0.5, 0, 0)
        top_left_icon_align.set_padding(15, 3, 13, 3)
        top_left_icon_align.add(self.top_left_icon)

        self.top_right_text = Label(
            _("Introduction"), ui_theme.get_color('label_select_background'),
            14)
        top_right_text_align = gtk.Alignment(0.5, 0.5, 0, 0)
        top_right_text_align.set_padding(18, 3, 3, 3)
        top_right_text_align.add(self.top_right_text)

        self.top_title.pack_start(top_left_icon_align, False, False)
        self.top_title.pack_start(top_right_text_align, False, False)

        self.content_box = gtk.VBox()
        self.guide_label = Label('',
                                 enable_select=False,
                                 wrap_width=200,
                                 text_size=9,
                                 text_color=DynamicColor('#808080'))
        guide_label_align = gtk.Alignment(0.5, 0.5, 1, 1)
        guide_label_align.set_padding(5, 5, 10, 10)
        guide_label_align.add(self.guide_label)
        self.content_box.pack_start(guide_label_align, False, False)

        self.backgroundbox.pack_start(self.top_title, False, False)
        self.backgroundbox.pack_start(self.content_box)

        self.scrolled_window.add_child(self.backgroundbox)
        self.add(self.scrolled_window)

        global_event.register_event('download-app-info-finish',
                                    self.update_content)
Ejemplo n.º 19
0
    def render(self, cr, rect):
        # Init.
        x, y, w, h = rect.x, rect.y, rect.width, rect.height

        # Draw background frame.
        with cairo_state(cr):
            cr.rectangle(x, y + 1, w, h - 2)
            cr.rectangle(x + 1, y, w - 2, h)
            cr.clip()

            cr.set_source_rgb(*color_hex_to_cairo(
                ui_theme.get_color(
                    "progressbar_background_frame").get_color()))
            cr.rectangle(x, y, w, h)
            cr.set_line_width(1)
            cr.stroke()

        # Draw background.
        with cairo_state(cr):
            cr.rectangle(x + 1, y + 1, w - 2, h - 2)
            cr.clip()

            draw_vlinear(
                cr,
                x + 1,
                y + 1,
                w - 2,
                h - 2,
                ui_theme.get_shadow_color(
                    "progressbar_background").get_color_info(),
            )
            cache_pixbuf_object = CachePixbuf()
            if self.progress > 0 and self.progress < 100:
                cache_pixbuf_object.scale(
                    self.percentage_dpixbuf[int(self.progress /
                                                10)].get_pixbuf(), w, h)
            if self.progress == 100:
                cache_pixbuf_object.scale(
                    self.percentage_dpixbuf[9].get_pixbuf(), w, h)
            draw_pixbuf(cr, cache_pixbuf_object.get_cache(), x, y)

        # Draw light.
        with cairo_disable_antialias(cr):
            cr.set_source_rgba(1, 1, 1, 0.5)
            cr.rectangle(x + 1, y + 1, w - 2, 1)
            cr.fill()
Ejemplo n.º 20
0
    def __init__(
            self,
            text,
            callback_action=None,
            enable_gaussian=False,
            text_color=ui_theme.get_color("link_text"),
    ):
        Label.__init__(self,
                       text,
                       text_color,
                       enable_gaussian=enable_gaussian,
                       text_size=9,
                       gaussian_radious=1,
                       border_radious=0,
                       underline=False)
        self.callback_action = callback_action

        set_clickable_cursor(self)
        self.connect('button-press-event', self.button_press_action)
Ejemplo n.º 21
0
    def __init__(self, 
                 text, 
                 enable_gaussian=False, 
                 text_color=ui_theme.get_color("link_text"),
                 ):
        '''
        Initialize LinkButton class.
        
        @param text: Link content.
        @param link: Link address.
        @param enable_gaussian: To enable gaussian effect on link, default is True.
        @param text_color: Link color, just use when option enable_gaussian is False.
        '''
        Label.__init__(self, text, text_color, enable_gaussian=enable_gaussian, text_size=9,
                       gaussian_radious=1, border_radious=0, underline=True)
        self.callback_action = None

        set_clickable_cursor(self)
        self.connect('button-press-event', self.button_press_action)
Ejemplo n.º 22
0
    def __init__(self):
        super(GuideBox, self).__init__()

        self.scrolled_window = ScrolledWindow()
        self.backgroundbox = BackgroundBox()
        self.backgroundbox.draw_mask = self.draw_mask

        self.guide_pixbuf = utils.get_common_image_pixbuf('guide.png')

        self.top_title = gtk.HBox()

        self.top_left_icon = gtk.VBox()
        self.top_left_icon.set_size_request(self.guide_pixbuf.get_width(), self.guide_pixbuf.get_height())
        self.top_left_icon.connect('expose-event', self.expose_top_left_icon)
        top_left_icon_align = gtk.Alignment(0.5, 0.5, 0, 0)
        top_left_icon_align.set_padding(15, 3, 13, 3)
        top_left_icon_align.add(self.top_left_icon)

        self.top_right_text = Label(_("Introduction"), ui_theme.get_color('label_select_background'), 14)
        top_right_text_align = gtk.Alignment(0.5, 0.5, 0, 0)
        top_right_text_align.set_padding(18, 3, 3, 3)
        top_right_text_align.add(self.top_right_text)

        self.top_title.pack_start(top_left_icon_align, False, False)
        self.top_title.pack_start(top_right_text_align, False, False)

        self.content_box = gtk.VBox()
        self.guide_label = Label('', enable_select=False, wrap_width=200, text_size=9, text_color=DynamicColor('#808080'))
        guide_label_align = gtk.Alignment(0.5, 0.5, 1, 1)
        guide_label_align.set_padding(5, 5, 10, 10)
        guide_label_align.add(self.guide_label)
        self.content_box.pack_start(guide_label_align, False, False)

        self.backgroundbox.pack_start(self.top_title, False, False)
        self.backgroundbox.pack_start(self.content_box)

        self.scrolled_window.add_child(self.backgroundbox)
        self.add(self.scrolled_window)

        global_event.register_event('download-app-info-finish', self.update_content)
 def render(self, cr, rect):
     # Init.
     x, y, w, h = rect.x, rect.y, rect.width, rect.height
     
     # Draw background frame.
     with cairo_state(cr):
         cr.rectangle(x, y + 1, w, h - 2)
         cr.rectangle(x + 1, y, w - 2, h)
         cr.clip()
         
         cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("progressbar_background_frame").get_color()))
         cr.rectangle(x, y, w, h)
         cr.set_line_width(1)
         cr.stroke()
         
     # Draw background.
     with cairo_state(cr):
         cr.rectangle(x + 1, y + 1, w - 2, h - 2)
         cr.clip()
         
         draw_vlinear(cr, x + 1, y + 1, w - 2, h - 2,
                      ui_theme.get_shadow_color("progressbar_background").get_color_info(), 
                      )
         cache_pixbuf_object = CachePixbuf()
         if self.progress > 0 and self.progress < 100:
             cache_pixbuf_object.scale(self.percentage_dpixbuf[int(self.progress / 10)].get_pixbuf(), 
                                       w, 
                                       h)
         if self.progress == 100:
             cache_pixbuf_object.scale(self.percentage_dpixbuf[9].get_pixbuf(), 
                                       w, 
                                       h)
         draw_pixbuf(cr, cache_pixbuf_object.get_cache(), x, y)
     
     # Draw light.
     with cairo_disable_antialias(cr):
         cr.set_source_rgba(1, 1, 1, 0.5)
         cr.rectangle(x + 1, y + 1, w - 2, 1)
         cr.fill()
Ejemplo n.º 24
0
    def share_to_weibo_result(self):
        '''result of share to weibo'''
        font_color = ui_theme.get_color("category_item")
        res_hbox = gtk.HBox(False)
        res_hbox.set_size_request(-1, 240)

        res_left_box = DialogLeftButtonBox()
        res_right_box = DialogRightButtonBox()

        res_left_box.button_align.set(0.5, 0.0, 0, 1)
        res_right_box.button_align.set(0.5, 0.0, 0, 1)
        res_left_box.button_align.set_padding(5, 9, 19, 0)
        res_right_box.button_align.set_padding(30, 0, 0, 0)

        res_left_box.set_size_request(405, -1)
        res_right_box.set_size_request(195, -1)

        res_hbox.pack_start(res_left_box)
        res_hbox.pack_start(
            VSeparator(app_theme.get_shadow_color("VSeparator").get_color_info(), 0, 0))
        res_hbox.pack_start(res_right_box)

        res_vbox = gtk.VBox(False)
        follow_vbox = gtk.VBox(False)

        tmp_img = gtk.Image()       # only use as a placeholder
        tmp_img.set_size_request(-1, 50)
        res_vbox.pack_start(tmp_img, False, False)

        follow_tip_hbox = gtk.HBox(False)
        img = gtk.image_new_from_icon_name("deepin-logo", 16)
        if img.get_pixel_size() == -1:
            img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/deepin_logo.png"))
        follow_tip_hbox.pack_start(img, False, False, 5)
        follow_tip_hbox.pack_start(
            Label("%s %s" % (_("Follow"), "Linux Deepin"),
                text_color=app_theme_get_dynamic_color("#5f5f5f"),
                text_size=12, enable_select=False), False, False)
        follow_vbox.pack_start(follow_tip_hbox, False, False, 13)
        for weibo in self.to_share_weibo_res:
            vbox = gtk.VBox(False, 1)
            tip_box = gtk.HBox()
            error_box = gtk.HBox()
            vbox.pack_start(tip_box, False, False)
            vbox.pack_start(error_box, False, False)
            if self.to_share_weibo_res[weibo][0]:   # upload succeed
                img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_succeed.png"))
                #link = LinkButton(_(weibo.t_type), text_size=13, self.to_share_weibo_res[weibo][1])
                link = Label(self.weibo_name_l18n[weibo.t_type], text_size=12,
                    text_color=ui_theme.get_color("link_text"))
                #, enable_gaussian=True, gaussian_radious=1, border_radious=0)
                link.add_events(gtk.gdk.BUTTON_PRESS_MASK)
                link.connect("enter-notify-event", lambda w, e: self.__draw_under_line(w))
                link.connect("leave-notify-event", lambda w, e: w.queue_draw())
                link.connect("button-press-event", self.goto_weibo_button_clicked, weibo)
                link_box = gtk.HBox(False)
                link_box.pack_start(link, False, False)
                utils.set_clickable_cursor(link)
                text = _("Share to")
                label = Label(text, text_size=12,
                    text_color=font_color, enable_select=False)
                text = _("Successful")
                label1 = Label(text, text_size=12,
                    text_color=font_color, enable_select=False)
                tip_box.pack_start(img, False, False, 15)
                tip_box.pack_start(label, False, False, 3)
                tip_box.pack_start(link_box, False, False, 3)
                tip_box.pack_start(label1, False, False)
                # only use as a placeholder
                img = gtk.Image()
                img.set_size_request(20, 1)
                error_box.pack_start(img, False, False, 16)
                tmp = Label(" ", text_size=9, label_width=200)
                tmp.set_size_request(200, 1)
                error_box.pack_start(tmp, False, False)
                #print text
            else:   # upload failed
                img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_failed.png"))
                #text = "% %s %s." % (_(weibo.t_type), _("upload failed"))
                text = _("Share to")
                label1 = Label(text, text_size=12,
                    text_color=font_color, enable_select=False)
                label2 = Label(_(weibo.t_type), text_size=12,
                    text_color=font_color, enable_select=False)
                text = _("Failed")
                label3 = Label(text, text_size=12,
                    text_color=font_color, enable_select=False)
                if weibo.curl.error:
                    error = "(%s)" % _(weibo.curl.error)
                elif weibo.get_error_msg():
                    error = "(%s)" % _(weibo.get_error_msg())
                else:
                    error = "(%s)" % _("Unknown reason")
                #print "%s: %s" % (weibo.t_type, error)
                #print "%s: %s" % (weibo.t_type, weibo.get_error_msg())
                label = Label(text, text_size=12,
                    text_color=font_color, enable_select=False)
                tip_box.pack_start(img, False, False, 15)
                tip_box.pack_start(label1, False, False, 3)
                tip_box.pack_start(label2, False, False, 3)
                tip_box.pack_start(label3, False, False)
                img = gtk.Image()   # only use as a placeholder
                img.set_size_request(20, 20)
                error_box.pack_start(img, False, False, 16)
                error_box.pack_start(Label(error, text_size=9, label_width=200,
                    text_color=font_color, enable_select=False), False, False)
                #print text
            res_vbox.pack_start(vbox, False, False, 10)

        for weibo in self.deepin_info:
            box = gtk.HBox(False, 15)
            # followed
            img = gtk.image_new_from_pixbuf(app_theme.get_pixbuf("share/"+weibo.t_type+".png").get_pixbuf())
            box.pack_start(img, False, False)
            if self.deepin_info[weibo] is not None and self.deepin_info[weibo][3]:
                if not default_locale.startswith("zh_"):
                    button = gtk.image_new_from_pixbuf(
                        app_theme.get_pixbuf("share/followed_en.png").get_pixbuf())
                else:
                    button = gtk.image_new_from_pixbuf(
                        app_theme.get_pixbuf("share/followed.png").get_pixbuf())
            else:   # to follow
                if not default_locale.startswith("zh_"):
                    button = ImageButton(
                        app_theme.get_pixbuf("share/follow_normal_en.png"),
                        app_theme.get_pixbuf("share/follow_hover_en.png"),
                        app_theme.get_pixbuf("share/follow_press_en.png"))
                else:
                    button = ImageButton(
                        app_theme.get_pixbuf("share/follow_normal.png"),
                        app_theme.get_pixbuf("share/follow_hover.png"),
                        app_theme.get_pixbuf("share/follow_press.png"))
                button.connect("clicked", self.friendships_add_button_clicked, weibo, box)
            box.pack_start(button, False, False)
            align = gtk.Alignment()
            align.set(0.0, 0.5, 0, 0)
            align.set_padding(0, 0, 30, 0)
            align.add(box)
            follow_vbox.pack_start(align, False, False, 8)

        res_left_box.set_buttons([res_vbox])
        res_right_box.set_buttons([follow_vbox])

        self.result_box.pack_start(res_hbox, False, False)
        self.result_box.show_all()
        self.set_slide_index(2)
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    def init_share_box(self):
        '''get weibo info, and create button'''
        self.to_share_weibo = {}
        self.to_share_weibo_res = {}
        self.deepin_info = {}
        self.is_get_user_info = {}
        self.__weibo_check_button_list = []
        self.__weibo_image_button_list = []

        # create Thumbnail
        if exists(self.upload_image):
            pixbuf = gtk.gdk.pixbuf_new_from_file(self.upload_image)
            pix_w = pixbuf.get_width()
            pix_h = pixbuf.get_height()
            if pix_w > pix_h:
                pix_s_w = self.thumb_width
                pix_s_h = int(pix_h / (float(pix_w) / self.thumb_width))
            else:
                pix_s_h = self.thumb_height
                pix_s_w = int(pix_w / (float(pix_h) / self.thumb_height))
            pixbuf = pixbuf.scale_simple(pix_s_w, pix_s_h, gtk.gdk.INTERP_TILES)
            thumb = gtk.image_new_from_pixbuf(pixbuf)
        else:
            thumb = gtk.Image()
        thumb.set_size_request(self.thumb_width, self.thumb_height)

        # weibo context input
        text_box = gtk.HBox(False, 2)
        text_vbox = gtk.VBox(False, 2)
        text_bg_vbox = gtk.VBox(False)
        text_bg_align = gtk.Alignment()
        text_bg_align.set(0.5, 0.5, 0, 0)
        text_bg_align.set_padding(5, 5, 16, 5)
        text_bg_align.connect("expose-event", self.text_view_bg_expose)
        text_scrolled_win = gtk.ScrolledWindow()
        text_scrolled_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
        text_scrolled_win.set_size_request(340, 157)

        text_view = gtk.TextView()
        text_view.set_left_margin(10)
        text_view.set_right_margin(10)
        text_view.set_pixels_above_lines(5)
        text_view.set_pixels_below_lines(5)
        text_view.set_wrap_mode(gtk.WRAP_WORD| gtk.WRAP_CHAR)
        text_view.connect("expose-event", self.text_view_expose)
        buf = text_view.get_buffer()
        text_scrolled_win.add(text_view)
        text_bg_vbox.pack_start(text_scrolled_win)
        text_bg_align.add(text_bg_vbox)

        text_align = gtk.Alignment()
        text_align.set(0.5, 0.5, 0, 0)
        text_align.set_padding(25, 30, 10, 10)

        text_box.pack_start(thumb, False, False, 10)
        text_box.pack_start(text_bg_align)
        text_vbox.pack_start(text_box, False, False, 10)

        text_align.add(text_vbox)
        #tmp_align = gtk.Alignment()
        #tmp_align.set(0.5, 0, 0, 1)
        #self.share_box.pack_start(tmp_align, False, False)
        self.share_box.pack_start(text_align, False, False)

        # dialog button box
        left_box = self.window.left_button_box
        right_box = self.window.right_button_box

        # input tip label
        self.input_num_label = Label("%d" % self.MAX_CHAR,
            text_size=16, text_x_align=pango.ALIGN_CENTER, label_width=50, enable_select=False)
        self.input_num_label.text_color = ui_theme.get_color("label_select_text")

        # login box
        #weibo_box = gtk.HBox(False, 1)
        #weibo_box.set_size_request(-1, 50)
        weibo_box_list = []
        self.loading_label = Label("%s..." % _("Loading"), text_size=12,
            label_width=70, enable_select=False)
        weibo_box_list.append(self.loading_label)

        for weibo in self.__weibo_list:
            box = gtk.HBox(False, 2)
            weibo.set_box(box)
            weibo_box_list.append(box)
        left_box.set_buttons(weibo_box_list)

        # share button
        button = Button(_("Share"))
        #button.set_size_request(75, 25)
        button.connect("clicked", self.share_button_clicked, text_view)
        buf.connect("changed", self.text_view_changed, button)  # check char num

        tmp_vbox = gtk.VBox(False)
        tmp_align = gtk.Alignment()
        tmp_align.set(0.5, 0.5, 0, 0)
        tmp_vbox.pack_start(button, False, False)
        #tmp_vbox.pack_start(tmp_align)
        tmp_align.add(tmp_vbox)
        right_box.set_buttons([self.input_num_label, tmp_align])

        # at first, set widget insensitive
        button.set_sensitive(False)
        text_view.set_editable(False)
        t = threading.Thread(target=self.init_user_info_thread, args=(button, text_view))
        t.setDaemon(True)
        t.start()
Ejemplo n.º 27
0
 def draw_mask(self, cr, x, y, w, h):
     sidebar_color = ui_theme.get_color("menu_select_font").get_color()
     draw_vlinear(cr, x, y, w, h,
                  [(0, (sidebar_color, 0.9)),
                   (1, (sidebar_color, 0.9)),]
                  )
    def add_toolbar(self):

        toolbar_btn_box = gtk.HBox()
        toolbar_btn_box_align = gtk.Alignment(0.5, 0.5, 0, 0)

        import_btn = ToolbarItem(self.import_btn_pixbuf, _("Import"))
        import_btn.connect("clicked", self.on_toolbar_import_clicked)
        export_btn = ToolbarItem(self.export_btn_pixbuf, _("Export"))
        export_btn.connect("clicked", self.on_toolbar_export_clicked)
        delete_btn = ToolbarItem(self.delete_btn_pixbuf, _("Delete"))
        delete_btn.connect("clicked", self.on_toolbar_delete_clicked)
        refresh_btn = ToolbarItem(self.refresh_btn_pixbuf, _("Refresh"))
        refresh_btn.connect("clicked", self.on_toolbar_refresh_clicked)

        toolbar_btn_box.pack_start(import_btn, False, False, 2)
        toolbar_btn_box.pack_start(export_btn, False, False, 2)
        toolbar_btn_box.pack_start(delete_btn, False, False, 2)
        toolbar_btn_box.pack_start(refresh_btn, False, False, 2)
        toolbar_btn_box_align.add(toolbar_btn_box)

        look_in_Label = Label(
            _("Look up in"),
            text_color=ui_theme.get_color("title_text"),
            )

        self.category_comb = ComboBox([(_("All"), 0)])
        self.category_comb.add_items([(item, index) for index, item in enumerate(self.classified_items)], clear_first=False)
        self.time_comb = ComboBox([(_("Today"), 0),
                                   (_("Last week"), 1),
                                   (_("Last month"), 2),
                                   (_("Last three months"), 3),
                                   (_("Last year"), 4),
                                   (_("All"), 5)
                                   ])

        self.category_comb.set_size_request(-1, TOOLBAR_ENTRY_HEIGHT)
        self.category_comb.connect("item-selected", self.on_category_comb_item_selected)
        self.time_comb.set_size_request(-1, TOOLBAR_ENTRY_HEIGHT)
        self.time_comb.connect("item-selected", self.on_time_comb_item_selected)
        combos_box = gtk.HBox()
        combos_box.pack_start(self.category_comb, False, False, 5)
        combos_box.pack_start(self.time_comb, False, False)

        combos_box_align = gtk.Alignment(0.5, 0.5, 1, 1)
        padding_height = (TOOLBAR_HEIGHT - TOOLBAR_ENTRY_HEIGHT) / 2
        combos_box_align.set_padding(padding_height, padding_height, 5, 5)
        combos_box_align.add(combos_box)


        find_content_Label = Label(
            _("Find in content"),
            text_color=ui_theme.get_color("title_text"),
            )


        search_entry = SearchEntry()
        search_entry.connect("action-active", self.on_search_entry_action_active)
        search_entry_align = gtk.Alignment(0.5, 0.5, 1, 1)
        search_entry_align.set_padding(padding_height, padding_height, 5, 5)
        search_entry_align.add(search_entry)

        #Align left
        self.toolbar_box.pack_start(toolbar_btn_box_align, False, False, 5)

        #Align right
        self.toolbar_box.pack_end(search_entry_align, False, True, 5)
        self.toolbar_box.pack_end(find_content_Label, False, False, 5)
        self.toolbar_box.pack_end(combos_box_align, False, False, 0)
        self.toolbar_box.pack_end(look_in_Label, False, False, 5)
        self.toolbar_box.pack_end(ToolbarSep(), False, False, 5)
Ejemplo n.º 29
0
    def get_user_info(self, weibo):
        '''get weibo user info'''
        info = weibo.get_user_name()
        gtk.gdk.threads_enter()
        #self.get_user_error_text = ""
        weibo_hbox = weibo.get_box()
        hbox = gtk.HBox(False)
        vbox = gtk.VBox(False)
        weibo_hbox.pack_start(vbox, False, False)
        vbox.pack_start(hbox)
        #print weibo.t_type, info
        if info:
            self.is_get_user_info[weibo] = 1
            label = Label(text=info, label_width=70, enable_select=False)
            check = CheckButton()
            #check = gtk.CheckButton()
            check.connect("toggled", self.weibo_check_toggle, weibo)
            check.set_active(True)
            check_vbox = gtk.VBox(False)
            check_align = gtk.Alignment(0.5, 0.5, 0, 0)
            check_align.add(check_vbox)
            check_vbox.pack_start(check, False, False)
            button = ImageButton(
                app_theme.get_pixbuf("share/" + weibo.t_type + ".png"),
                app_theme.get_pixbuf("share/" + weibo.t_type + ".png"),
                app_theme.get_pixbuf("share/" + weibo.t_type + ".png"))
            utils.set_clickable_cursor(button)
            button.connect("enter-notify-event", self.show_tooltip, _("Click to switch user"))
            hbox.pack_start(check_align, False, False)
            hbox.pack_start(button, False, False, 5)
            hbox.pack_start(label, False, False)
        else:
            self.is_get_user_info[weibo] = 0
            check = CheckButton()
            #check = gtk.CheckButton()
            check.set_sensitive(False)
            check_vbox = gtk.VBox(False)
            check_align = gtk.Alignment(0.5, 0.5, 0, 0)
            check_align.add(check_vbox)
            check_vbox.pack_start(check, False, False)
            button = ImageButton(
                app_theme.get_pixbuf("share/" + weibo.t_type + "_no.png"),
                app_theme.get_pixbuf("share/" + weibo.t_type + "_no.png"),
                app_theme.get_pixbuf("share/" + weibo.t_type + "_no.png"))
            utils.set_clickable_cursor(button)
            button.connect("enter-notify-event", self.show_tooltip, _("Click to login"))
            hbox.pack_start(check_align, False, False)
            hbox.pack_start(button, False, False, 5)
            # curl time out
            info_error = weibo.get_curl_error()
            if info_error:
                #self.get_user_error_text += "%s:%s." % (weibo.t_type, _(info_error))
                hbox.pack_start(
                    Label(text="(%s)" % _(info_error), label_width=70,enable_select=False,
                    text_color = ui_theme.get_color("category_item")), False, False)

        button.connect("clicked", self.weibo_login, weibo)
        self.__weibo_check_button_list.append(check)
        self.__weibo_image_button_list.append(button)
        gtk.gdk.threads_leave()
        return weibo_hbox
Ejemplo n.º 30
0
 def expose_event(self, widget, event):
     cr = widget.window.cairo_create()
     rect = widget.child.allocation
     width, height = get_content_size(self.label_name)
     cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("link_text").get_color()))
     draw_line(cr, rect.x, rect.y + rect.height, rect.x + width, rect.y + rect.height)