예제 #1
0
    def __init__(self):
        DialogBox.__init__(self,
                           _("Task Manager"),
                           350,
                           450,
                           DIALOG_MASK_SINGLE_PAGE,
                           modal=False,
                           close_callback=self.hide_all)

        self.is_changed = False
        scrolled_window = ScrolledWindow(0, 0)
        scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

        scrolled_align = gtk.Alignment()
        scrolled_align.set(1, 1, 1, 1)
        scrolled_align.set_padding(10, 0, 0, 0)
        scrolled_align.add(scrolled_window)

        self.jobs_view = JobsView()
        self.jobs_view.draw_mask = self.get_mask_func(self.jobs_view)
        scrolled_window.add_child(self.jobs_view)

        pause_button = Button(_("Pause"))
        pause_button.connect("clicked", self.pause_job)
        stop_button = Button(_("Close"))
        stop_button.connect("clicked", lambda w: self.hide_all())

        self.body_box.add(scrolled_align)
        self.right_button_box.set_buttons([pause_button, stop_button])

        Dispatcher.connect("transfor-job", self.add_new_job)
예제 #2
0
 def get_scrolled_window(self):
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.connect("vscrollbar-state-changed",
                             self.__on_vscrollbar_state_changed)
     scrolled_window.add_child(self)
     return scrolled_window
예제 #3
0
 def get_scrolled_window(self):
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.connect("vscrollbar-state-changed",
                             self.__on_vscrollbar_state_changed)
     scrolled_window.add_child(self)
     return scrolled_window
예제 #4
0
 def __init__(self):
     DialogBox.__init__(self, _("Search"), 460, 300, DIALOG_MASK_SINGLE_PAGE,
                        modal=False, window_hint=None, close_callback=self.hide_all)
     title_label = Label(_("Title:"))
     self.title_entry = TextEntry("")
     self.title_entry.set_size(300, 25)
     self.search_button = Button(_("Search"))
     self.search_button.connect("clicked", self.search_song)
     
     control_box = gtk.HBox(spacing=5)
     control_box.pack_start(title_label, False, False)
     control_box.pack_start(self.title_entry, False, False)
     control_box.pack_start(self.search_button, False, False)
     
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     self.result_view = ListView()
     self.result_view.connect("double-click-item", self.double_click_cb)
     self.result_view.draw_mask = self.get_mask_func(self.result_view)
     self.result_view.add_titles([_("Title"), _("Artist"), _("Album"), _("Type"), _("Size")])
     scrolled_window.add_child(self.result_view)
     
     self.prompt_label = Label("")
     download_button = Button(_("Download"))
     download_button.connect("clicked", self.download_song)
     cancel_button = Button(_("Close"))
     cancel_button.connect("clicked", lambda w: self.hide_all())
     
     self.body_box.set_spacing(5)
     self.body_box.pack_start(control_box, False, False)
     self.body_box.pack_start(scrolled_window, True, True)
     self.left_button_box.set_buttons([self.prompt_label])
     self.right_button_box.set_buttons([download_button, cancel_button])
예제 #5
0
 def __init__(self):
     DialogBox.__init__(self, _("Task Manager"), 350, 450, DIALOG_MASK_SINGLE_PAGE,
                        modal=False, close_callback=self.hide_all)
     
     self.is_changed = False
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     
     scrolled_align = gtk.Alignment()
     scrolled_align.set(1, 1, 1, 1)
     scrolled_align.set_padding(10, 0, 0, 0)
     scrolled_align.add(scrolled_window)
     
     self.jobs_view = JobsView()
     self.jobs_view.draw_mask = self.get_mask_func(self.jobs_view)
     scrolled_window.add_child(self.jobs_view)
     
     pause_button = Button(_("Pause"))
     pause_button.connect("clicked", self.pause_job)
     stop_button = Button(_("Close"))
     stop_button.connect("clicked", lambda w: self.hide_all())
     
     self.body_box.add(scrolled_align)
     self.right_button_box.set_buttons([pause_button, stop_button])
     
     Dispatcher.connect("transfor-job", self.add_new_job)
 def __init__(self):
     DialogBox.__init__(
         self, _("Lyrics search"), 460, 300, DIALOG_MASK_MULTIPLE_PAGE, close_callback=self.hide_all, 
         modal=False, window_hint=None, skip_taskbar_hint=False)
     self.artist_entry = InputEntry()
     self.artist_entry.set_size(130, 23)
     self.title_entry = InputEntry()
     self.title_entry.set_size(130, 23)
     artist_label = Label(_("Artist:"))
     title_label = Label(_("Title:"))
     right_align = gtk.Alignment()
     right_align.set(0, 0, 0, 1)
     
     search_button = Button(_("Search"))
     search_button.connect("clicked", self.search_lyric_cb)
     
     info_box = gtk.HBox(spacing=25)
     
     control_box = gtk.HBox(spacing=5)
     title_box = gtk.HBox(spacing=5)        
     title_box.pack_start(title_label, False, False)
     title_box.pack_start(self.title_entry)
     artist_box = gtk.HBox(spacing=5)
     artist_box.pack_start(artist_label, False, False)
     artist_box.pack_start(self.artist_entry)
     control_box.pack_start(title_box, False, False)
     control_box.pack_start(artist_box, False, False)
     
     info_box.pack_start(control_box, False, False)
     info_box.pack_start(search_button, False, False)
     
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     sort_items = [(lambda item: item.title, cmp), (lambda item: item.artist, cmp)]
     self.result_view = ListView(sort_items)
     self.result_view.connect("double-click-item", self.double_click_cb)
     self.result_view.add_titles([_("Title"), _("Artist")])
     self.result_view.draw_mask = self.get_mask_func(self.result_view)
     scrolled_window.add_child(self.result_view)
     
     self.prompt_label = Label("")
     download_button = Button(_("Download"))
     download_button.connect("clicked", self.download_lyric_cb)
     cancel_button = Button(_("Close"))
     cancel_button.connect("clicked", lambda w: self.hide_all())
     
     info_box_align = gtk.Alignment()
     info_box_align.set_padding(5, 0, 5, 0)
     info_box_align.add(info_box)
     
     self.body_box.set_spacing(5)
     self.body_box.pack_start(info_box_align, False, False)
     self.body_box.pack_start(scrolled_window, True, True)
     self.left_button_box.set_buttons([self.prompt_label])
     self.right_button_box.set_buttons([download_button, cancel_button])
     self.lrc_manager = LrcManager()
예제 #7
0
 def get_icon_view(self, padding_x=0, padding_y=10):    
     ''' Draggable IconView '''
     icon_view = IconView(padding_x, padding_y)
     targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)]
     icon_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY)
     icon_view.connect("drag-data-get", self.__on_drag_data_get) 
     icon_view.connect("double-click-item", self.__on_double_click_item)
     icon_view.connect("single-click-item", self.__on_single_click_item)
     icon_view.connect("right-click-item", self.__on_right_click_item)
     
     icon_view.draw_mask  = self.on_iconview_draw_mask
     scrolled_window = ScrolledWindow()
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(icon_view)
     return icon_view, scrolled_window
 def get_icon_view(self, padding_x=0, padding_y=10):    
     ''' Draggable IconView '''
     icon_view = IconView(padding_x, padding_y)
     targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)]
     icon_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY)
     icon_view.connect("drag-data-get", self.__on_drag_data_get) 
     icon_view.connect("double-click-item", self.__on_double_click_item)
     icon_view.connect("single-click-item", self.__on_single_click_item)
     icon_view.connect("right-click-item", self.__on_right_click_item)
     
     icon_view.draw_mask  = self.on_iconview_draw_mask
     scrolled_window = ScrolledWindow()
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(icon_view)
     return icon_view, scrolled_window
예제 #9
0
class ConvTAskGui(DialogBox):
    def __init__(self):
        DialogBox.__init__(self, 
                           _("Task Manager for format conversion"), 
                           FORM_WIDTH, FORM_HEIGHT, 
                           mask_type=DIALOG_MASK_SINGLE_PAGE, #DIALOG_MASK_MULTIPLE_PAGE,
                           close_callback=self.hide_all,
                           modal=True,
                           window_hint=gtk.gdk.WINDOW_TYPE_HINT_DIALOG,
                           window_pos=gtk.WIN_POS_CENTER,
                           resizable=False,
                           )
        self.init_widgets()
        # add widgets.
        self.body_box.pack_start(self.scrolled_window, False, False)
        
        
    def init_widgets(self):
        
        self.scrolled_window = ScrolledWindow()
        self.list_view = ListView()                
        self.list_view.draw_mask = self.get_mask_func(self.list_view)
        self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.scrolled_window.add_child(self.list_view)
        
        # self.start_btn = Button(_("Start"))
        self.show_time_label = Label("")
        self.pause_btn = Button(_("Pause"))
        self.close_btn = Button(_("Close"))
        
        self.show_time_label_align = gtk.Alignment()
        self.show_time_label_align.set(0.0, 0.5, 1.0, 1.0)
        self.show_time_label_align.add(self.show_time_label)
                        
        self.left_button_box.set_buttons([self.show_time_label_align])
        self.right_button_box.set_buttons([self.pause_btn, self.close_btn])        
                
        self.close_btn.connect("clicked", lambda w : self.hide_all())
    def __init_ui(self):
        self.vbox = gtk.VBox(False, BETWEEN_SPACING)
        self.__init_sections(-1)
        self.vbox.set_size_request(WINDOW_WIDTH - 2 * TEXT_WINDOW_LEFT_PADDING,
                                   -1)

        scroll_win = ScrolledWindow(right_space=0, top_bottom_space=0)
        #scroll_win.connect("event", self.test)
        scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

        # FIXME UI a align to adjust ui
        ui_align = gtk.Alignment(0, 0, 0, 0)
        ui_align.set_padding(TEXT_WINDOW_TOP_PADDING, TEXT_WINDOW_TOP_PADDING,
                             TEXT_WINDOW_LEFT_PADDING,
                             TEXT_WINDOW_LEFT_PADDING)

        ui_align.add(self.vbox)
        scroll_win.add_with_viewport(ui_align)

        self.eventbox = gtk.EventBox()
        self.eventbox.set_above_child(False)
        self.eventbox.add(scroll_win)
        self.vbox.connect("expose-event", self.expose_callback)
        ui_align.connect("expose-event", self.expose_callback)
예제 #11
0
    def __init_ui(self):
        self.vbox = gtk.VBox(False, BETWEEN_SPACING)
        self.__init_sections( -1)
        self.vbox.set_size_request(WINDOW_WIDTH - 2 * TEXT_WINDOW_LEFT_PADDING, -1)
        
        scroll_win = ScrolledWindow(right_space=0, top_bottom_space=0)
        #scroll_win.connect("event", self.test)
        scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

        # FIXME UI a align to adjust ui
        ui_align = gtk.Alignment(0, 0, 0, 0)
        ui_align.set_padding(TEXT_WINDOW_TOP_PADDING,
                                    TEXT_WINDOW_TOP_PADDING,
                                    TEXT_WINDOW_LEFT_PADDING,
                                    TEXT_WINDOW_LEFT_PADDING)

        ui_align.add(self.vbox)
        scroll_win.add_with_viewport(ui_align)

        self.eventbox = gtk.EventBox()
        self.eventbox.set_above_child(False)
        self.eventbox.add(scroll_win)
        self.vbox.connect("expose-event", self.expose_callback)
        ui_align.connect("expose-event", self.expose_callback)
class PlayListView(object):
    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 __listview_on_draw_sub_item(self, e):
        color = self.listview_color.get_color()
        if e.double_items == e.item:
            e.text_color = "#000000"
            text_size=9
            color_info = [(0, (color, 0.8)), (1, (color, 0.8))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        elif e.item in e.single_items:
            e.text_color = "#FFFFFF"
            text_size=9
            color_info = [(0, (color, 0.5)), (1, (color, 0.5))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        elif e.motion_items == e.item:
            e.text_color  = "#FFFFFF"
            text_size=9
            color_info = [(0, (color, 0.2)), (1, (color, 0.2))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        else:
            e.text_color = "#FFFFFF"
            text_size=9


        text = e.text.decode("utf-8")
        one_width = self.list_view.columns[0].width
        two_width = self.list_view.columns[1].width
        if e.w == one_width: # 显示播放名字的第一列.
            #
            t_width = 0
            t_index = 0
            add_point = False
            for t in text:
                t_width += get_text_size(t, text_size=text_size)[0]
                if t_width > one_width:
                    add_point = True
                    break
                t_index += 1
            if add_point:
                text = text[:t_index] + "..."
            #
            alignment = Text.LEFT
            x = e.x + 15
        elif e.w == two_width:
            alignment = Text.RIGHT
            x = e.x - 15

        e.draw_text(e.cr, 
                str(text), 
                  x, e.y, e.w, e.h,
                  text_color=e.text_color, 
                  text_size=text_size,
                  alignment=alignment)

    def __treeview_paint_nodes_event(self, node_event):
        leave_width = 20
        color = self.listview_color.get_color()
        text_color = "#FFFFFF"
        #
        if node_event.node in node_event.single_items:
            color_info = [(0, (color, 0.45)), (1, (color, 0.45))] 
            draw_vlinear(node_event.cr,
                         node_event.x, node_event.y, node_event.w, node_event.h,
                         color_info
                         )
            text_color = "#000000"
        elif node_event.node in node_event.motion_items:
            color_info = [(0, (color, 0.75)), (1, (color, 0.75))] 
            draw_vlinear(node_event.cr,
                         node_event.x, node_event.y, node_event.w, node_event.h,
                         color_info
                         )
        #
        if node_event.node.leave == 1: # 根节点.
            x = node_event.x + 20
            # 画root的图标.
            if node_event.node.is_expanded:
                pixbuf = self.tree_view_close.get_pixbuf()
            else:
                pixbuf = self.tree_view_open.get_pixbuf()
            # node_event.x + 5 是图标与文字之间的宽度.
            draw_pixbuf(node_event.cr,
                        pixbuf,
                        node_event.x + 5,
                        node_event.y + node_event.h/2 - pixbuf.get_height()/2 )
        else:
            #x_padding = node_event.node.leave * leave_width
            #x = node_event.x + 18 + x_padding
            x = node_event.x + 20
            #
            if node_event.node.is_expanded:
                pixbuf = self.tree_view_bottom.get_pixbuf()
            else:
                pixbuf = self.tree_view_right.get_pixbuf()
            icon_x = node_event.x + pixbuf.get_width()/2
            icon_y = node_event.y + node_event.h/2 - pixbuf.get_height()/2

            if node_event.node.nodes or node_event.node.leave == 2:
                draw_pixbuf(node_event.cr, pixbuf, icon_x, icon_y)
        #
        draw_text(node_event.cr, 
                  node_event.node.text, 
                  x + 5,
                  node_event.y + node_event.h/2 - get_text_size(node_event.node.text, text_size=9)[1]/2,
                  text_color=text_color,
                  text_size=9
                  )
예제 #13
0
 def get_scrolled_window(self):
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(self)
     return scrolled_window
예제 #14
0
class PlayListView(object):
    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)

    def __listview_on_draw_sub_item(self, e):
        color = self.listview_color.get_color()
        if e.double_items == e.item:
            e.text_color = "#000000"
            text_size=9
            color_info = [(0, (color, 0.8)), (1, (color, 0.8))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        elif e.item in e.single_items:
            e.text_color = "#FFFFFF"
            text_size=9
            color_info = [(0, (color, 0.5)), (1, (color, 0.5))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        elif e.motion_items == e.item:
            e.text_color  = "#FFFFFF"
            text_size=9
            color_info = [(0, (color, 0.2)), (1, (color, 0.2))] 
            draw_vlinear(e.cr,
                         e.x, e.y, e.w, e.h,
                         color_info
                         )
        else:
            e.text_color = "#FFFFFF"
            text_size=9
        #
        text = e.text.decode("utf-8")
        one_width = self.list_view.columns[0].width
        two_width = self.list_view.columns[1].width
        #if e.w == one_width: # 显示播放名字的第一列.
        if e.column_index == 0:
            #
            t_width = 0
            t_index = 0
            add_point = False
            for t in text:
                t_width += get_text_size(t, text_size=text_size)[0]
                if t_width > one_width - 20:
                    add_point = True
                    break
                t_index += 1
            if add_point:
                text = text[:t_index] + "..."
            #
            alignment = Text.LEFT
            x = e.x + 15
        elif e.w == two_width:
            alignment = Text.RIGHT
            x = e.x - 15

        e.draw_text(e.cr, 
                str(text), 
                  x, e.y, e.w, e.h,
                  text_color=e.text_color, 
                  text_size=text_size,
                  alignment=alignment)

    def __treeview_paint_nodes_event(self, node_event):
        color = self.listview_color.get_color()
        text_color = "#FFFFFF"
        # 单击和移动, 双击.
        if node_event.node in node_event.single_items:
            color_info = [(0, (color, 0.45)), (1, (color, 0.45))] 
            draw_vlinear(node_event.cr,
                         node_event.x, node_event.y, node_event.w, node_event.h,
                         color_info
                         )
            #text_color = "#000000"
        elif node_event.node in node_event.motion_items:
            color_info = [(0, (color, 0.75)), (1, (color, 0.75))] 
            draw_vlinear(node_event.cr,
                         node_event.x, node_event.y, node_event.w, node_event.h,
                         color_info
                         )
        #
        x_padding = 12 # 因为要和搜索框对齐.
        if 0 == node_event.node.leave: # 根节点. :比如->> >我看过的. >优酷视频. >pps.
            if node_event.node.is_expanded:
                pixbuf = self.one_open.get_pixbuf()
            else:
                pixbuf = self.one_close.get_pixbuf()
        elif 1 == node_event.node.leave: # 
            if node_event.node.is_expanded:
                pixbuf = self.two_open.get_pixbuf()
            else:
                pixbuf = self.two_close.get_pixbuf()
        else:
            if node_event.node.is_expanded:
                pixbuf = self.three_open.get_pixbuf()
            else:
                pixbuf = self.three_close.get_pixbuf()
        #
        icon_x = node_event.x + x_padding
        icon_y = node_event.y + node_event.h/2 - pixbuf.get_height()/2 + 1
        if node_event.node.leave > 1:
            icon_x += (node_event.node.leave - 1) * pixbuf.get_width()
        if node_event.node.leave > 0:
            text_color = "#a8a8a8"
        ##########
        # 画图标.
        if node_event.node.nodes != []:
            draw_pixbuf(node_event.cr,
                        pixbuf,
                        icon_x,
                        icon_y) 
        # 画文本.
        text_x_padding = 15
        text_size = 9
        draw_text(node_event.cr, 
                  node_event.node.text, 
                  icon_x + text_x_padding,
                  node_event.y + node_event.h/2 - get_text_size(node_event.node.text, text_size=9)[1]/2,
                  text_color=text_color,
                  text_size=text_size
                  )

    def search_ali_expose_event(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        #
        bg_color = "#272727"
        cr.set_source_rgba(*alpha_color_hex_to_cairo((bg_color,1.0)))
        cr.rectangle(rect.x, rect.y, rect.width + 1, rect.height)
        cr.fill()
        #
        propagate_expose(widget, event)
        return True
예제 #15
0
class Browser(gtk.VBox, SignalContainer):
    
    def __init__(self, db_query):
        
        gtk.VBox.__init__(self)
        SignalContainer.__init__(self)
        
        self.__db_query = db_query
        self._tree = {}
        self.__selected_tag = {"album": [], "artist": [], "genre": []}
        self.view_mode = ICON_VIEW_MODE
        self.__search_flag = False
        self.__song_cache_items = []
        self.__cover_cache_items = []
        
        # init widget.
        self.entry_box = SearchEntry("")
        self.entry_box.set_size(155, 22)
        self.entry_box.entry.connect("changed", self.__search_cb)
        
        # upper box.
        self.back_button = self.__create_simple_button("back", self.__switch_to_filter_view)
        self.back_button.set_no_show_all(True)
        back_align = gtk.Alignment()
        back_align.set(0.5, 0.5, 0, 0)
        back_align.set_padding(0, 0, 0, 10)
        back_align.add(self.back_button)
        
        # path control
        self.path_combo_box = ComboMenuButton()
        self.path_combo_box.connect("list-actived", lambda w: self.update_path_list_view())
        self.path_combo_box.connect("combo-actived", lambda w, k : self.update_path_filter_view(k))
        path_combo_align = gtk.Alignment()
        path_combo_align.set_padding(0, 0, 10, 0)
        path_combo_align.add(self.path_combo_box)
        self.path_combo_box.set_no_show_all(True)
        
        upper_box = gtk.HBox(spacing=5)
        upper_box.pack_start(path_combo_align, False, False)
        upper_box.pack_start(create_right_align(), True, True)
        upper_box.pack_start(back_align, False, False)
        entry_box_align = gtk.Alignment()
        entry_box_align.set(0.5, 0.5, 0, 0)
        entry_box_align.set_padding(1, 0, 0, 0)
        entry_box_align.add(self.entry_box)
        upper_box.pack_start(entry_box_align, False, False)
        
        upper_box_align = gtk.Alignment()
        upper_box_align.set_padding(0, 10, 0, 10)
        upper_box_align.set(0.5, 0.5, 1, 1)
        upper_box_align.connect("expose-event", self.expose_upper_box_mask)
        upper_box_align.add(upper_box)
        
        self.categorybar_status = "artist"
        self.filter_categorybar = OptionBar(
            [(app_theme.get_pixbuf("filter/artist_normal.png"), app_theme.get_pixbuf("filter/artist_press.png"),
              _("By artist"), lambda : self.reload_filter_view("artist", True)),
             (app_theme.get_pixbuf("filter/album_normal.png"), app_theme.get_pixbuf("filter/album_press.png"),
              _("By album"), lambda : self.reload_filter_view("album", True)),
             (app_theme.get_pixbuf("filter/genre_normal.png"), app_theme.get_pixbuf("filter/genre_press.png"),
              _("By genre"), lambda : self.reload_filter_view("genre", True)),]
                                            )
        
        # Song path bar.
        self.__current_path = None
        self.current_icon_item = None
        self.reload_path_flag = True
        self.path_categorybar = SongPathBar(_("Local"))
        self.path_categorybar.set_size_request(-1, 205)
        
        # Song import bar.
        self.import_categorybar = SongImportBar()
        self.import_categorybar.reload_items(
            [
             (_("Scan Home dir"), lambda : ImportFolderJob([os.path.expanduser("~")])),                
             (_("Select dir to scan"), lambda : ImportFolderJob()),
             (_("Refresh library"), lambda : ReloadDBJob())]
            )
        
        # iconview.
        self.filter_view = IconView(10, 10)
        targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)]
        self.filter_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY)
        self.filter_view.connect("drag-data-get", self.__on_drag_data_get) 
        self.filter_view.connect("double-click-item", self.__on_double_click_item)
        self.filter_view.connect("single-click-item", self.__on_single_click_item)
        self.filter_view.draw_mask  = self.draw_filter_view_mask
        self.filter_scrolled_window = ScrolledWindow()
        self.filter_scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.filter_scrolled_window.add_child(self.filter_view)
        
        # songs_view
        self.songs_view = MultiDragSongView()
        self.songs_view.add_titles([_("Title"), _("Artist"), _("Album"), _("Added time")])
        self.songs_scrolled_window = ScrolledWindow(0, 0)
        self.songs_scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.songs_scrolled_window.add_child(self.songs_view)
        
        # left_vbox
        align = gtk.Alignment()
        align.set(0, 1, 0, 0)
        left_box = gtk.VBox(spacing=10)
        left_box.set_size_request(140, -1)
        left_box.pack_start(self.filter_categorybar, False, False)
        left_box.pack_start(self.create_separator_box(), False, False)
        left_box.pack_start(self.path_categorybar, False, False)
        left_box.pack_start(self.create_separator_box(), False, False)
        left_box.pack_start(self.import_categorybar, False, False)
        left_box.pack_start(align, True, True)
        left_box.connect("expose-event", self.expose_left_box_mask)
        
        # right_box.
        self.right_box = gtk.VBox()
        self.right_box.add(self.filter_scrolled_window)
        
        # swith_box
        right_box_align = gtk.Alignment()
        right_box_align.set_padding(0, 0, 0, 2)
        right_box_align.set(1, 1, 1, 1)
        right_box_align.add(self.right_box)
        browser_box = gtk.VBox()
        browser_box.pack_start(upper_box_align,  False, False)
        browser_box.pack_start(right_box_align, True, True)
        
        body_box = gtk.HBox()
        body_box.pack_start(left_box, False, False)
        body_box.pack_start(browser_box, True, True)
        self.pack_start(body_box, True, True)
        
        self.reload_flag = False
        Dispatcher.connect("reload-browser", self.reload_browser)
        gobject.timeout_add(5000, self.interval_reload_browser)
        
    def __create_simple_button(self, name, callback):    
        button = ImageButton(
            app_theme.get_pixbuf("filter/%s_normal.png" % name),
            app_theme.get_pixbuf("filter/%s_hover.png" % name),
            app_theme.get_pixbuf("filter/%s_press.png" % name),
            )
        if callback:
            button.connect("clicked", callback)
        return button    
    
    def expose_left_box_mask(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "layoutRight")
        return False
    
    def expose_upper_box_mask(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        draw_alpha_mask(cr, rect.x, rect.y, rect.width - 2, rect.height, "layoutLast")
        return False
    
    def draw_filter_view_mask(self, cr, x, y, width, height):
        draw_alpha_mask(cr, x, y, width, height, "layoutLast")
    
    def create_separator_box(self, padding_x=0, padding_y=0):
        separator_box = HSeparator(
            app_theme.get_shadow_color("hSeparator").get_color_info(),
            padding_x, padding_y)
        return separator_box
    
    def __switch_to_filter_view(self, widget):
        self.back_button.set_no_show_all(True)
        self.back_button.hide()
        self.switch_box(self.right_box, self.filter_scrolled_window)
        self.view_mode = ICON_VIEW_MODE
        
    def reload_filter_view(self, tag="artist", switch=False, use_path=False):    
        self.entry_box.entry.set_text("")
        self.back_button.set_no_show_all(True)
        self.back_button.hide()
        self.categorybar_status = tag
        self.filter_view.clear()
            
        if not use_path:    
            self.path_categorybar.set_index(-1)    
        
        _dict = self.get_infos_from_db(tag)
        keys = _dict.keys()
        keys.sort()
        items = []
        all_nb = len(self.__db_query.get_all_songs())
        items.append(IconItem(("deepin-all-songs", "deepin-all-songs", all_nb, tag)))

        for key in keys:
            value, nb = _dict[key] 
            items.append(IconItem((key, value, nb, tag)))
        self.filter_view.add_items(items)    
        
        if switch:
            self.switch_box(self.right_box, self.filter_scrolled_window)
            self.view_mode = ICON_VIEW_MODE
            if not use_path:
                self.change_combo_box_status(True)
            
    def get_infos_from_db(self, tag, values=None):
        genres = []
        artists = []
        extened = False
        return self.__db_query.get_info(tag, genres, artists, values, extened)
    
    def get_attr_infos_from_db(self, info_type="###ALL###", song_dir=None):
        return self.__db_query.get_attr_infos(info_type, song_dir)
    
    def change_combo_box_status(self, hide=False):    
        if not hide:
            self.path_combo_box.set_no_show_all(False)
            self.path_combo_box.show_all()
        else:    
            self.path_combo_box.hide_all()
            self.path_combo_box.set_no_show_all(True)
    
    def update_path_songs(self, key):
        self.back_button.set_no_show_all(True)
        self.back_button.hide()
        self.filter_categorybar.set_index(-1)        
        self.__current_path = key        
        self.change_combo_box_status()        
        
        if self.path_combo_box.get_combo_active():
            self.update_path_filter_view(self.path_combo_box.current_status)
        else:    
            songs = self.__db_query.get_attr_songs(key)
            self.update_songs_view(songs)
            
    def update_path_list_view(self):        
        self.back_button.set_no_show_all(True)
        self.back_button.hide()
        if self.__current_path == "###ALL###":
            songs = self.__db_query.get_all_songs()
        else:    
            songs = self.__db_query.get_attr_songs(self.__current_path)
        self.update_songs_view(songs)    
            
    def update_path_filter_view(self, name):
        self.back_button.set_no_show_all(True)
        self.back_button.hide()
        self.entry_box.entry.set_text("")
        
        self.filter_view.clear()
        if self.__current_path == "###ALL###":
            self.reload_filter_view(name, True, True)
        else:    
            attr_infos = self.get_attr_infos_from_db(name, self.__current_path)
            items = []
            for info in attr_infos:
                key, value, nb, tag = info
                items.append(IconItem((key, value, nb, tag)))
            self.filter_view.add_items(items)    
            
            if self.view_mode != ICON_VIEW_MODE:
                self.switch_box(self.right_box, self.filter_scrolled_window)
                self.view_mode = ICON_VIEW_MODE
                
    def reload_song_path(self):
        path_infos = self.get_attr_infos_from_db()
        if path_infos:
            self.path_categorybar.update_items([(name[0], self.update_path_songs, name[1]) for name in path_infos])
    
    def connect_to_db(self):    
        self.autoconnect(self.__db_query, "added", self.__added_song_cb)
        self.autoconnect(self.__db_query, "removed", self.__removed_song_cb)
        self.autoconnect(self.__db_query, "update-tag", self.__update_tag_view)
        self.autoconnect(self.__db_query, "full-update", self.__full_update)
        self.autoconnect(self.__db_query, "quick-update", self.__quick_update)
        self.__db_query.set_query("")                
        
    def __added_song_cb(self, db_query, songs):
        self.reload_song_path()        
        self.reload_flag = True

    def __removed_song_cb(self, db_query, songs):
        self.reload_song_path()        
        self.reload_flag = True
            
    def reload_browser(self,  obj, infos):
        if infos:
            self.reload_flag = True
            
    def interval_reload_browser(self):        
        if self.reload_flag and not self.__search_flag:
            self.reload_all_items()
            self.reload_flag = False    
        return True    
                    
    def reload_all_items(self):                
        if self.view_mode == ICON_VIEW_MODE:
            if self.path_categorybar.get_index() == -1:
                self.reload_filter_view(self.categorybar_status)
            else:    
                self.update_path_filter_view(self.path_combo_box.current_status)
        else:        
            if self.path_categorybar.get_index() == -1:
                if self.current_icon_item:
                    self.update_category_songs_view(self.current_icon_item)
            else:        
                if self.current_icon_item:
                    self.update_path_songs_view(self.current_icon_item)
    
    def __update_tag_view(self, db_query, tag, values):
        if values:
            self.reload_flag = True
    
    def __quick_update(self, db_query, songs):
        pass
        
    def __full_update(self, db_query):    
        self.reload_filter_view()
        self.reload_song_path()
    
    def __get_selected_songs(self, tag="artist"):
        artists = []
        albums = []
        genres = []
        
        if tag == "artist":
            artists = self.__selected_tag["artist"]
        elif tag == "album":    
            albums = self.__selected_tag["album"]
        elif tag == "genre":    
            genres = self.__selected_tag["genre"]
            
        return self.__db_query.get_songs(genres, artists, albums)    
    
    def __on_drag_data_get(self, widget, context, selection, info, timestamp):
        item = self.filter_view.highlight_item
        if not item:
            return 
        
        if item.key_name == "deepin-all-songs":
            songs = self.__db_query.get_all_songs()
        else:    
            del self.__selected_tag[item.tag]
            self.__selected_tag[item.tag] = [item.key_name]
            songs = self.__get_selected_songs(item.tag)
        if not songs:
            return 
        songs = list(songs)
        songs.sort()
        list_uris = list([ song.get("uri") for song in songs])
        selection.set("text/deepin-songs", 8, "\n".join(list_uris))
        selection.set_uris(list_uris)
    
    def __on_double_click_item(self, widget,  item, x, y):
        self.current_icon_item = item
        self.entry_box.entry.set_text("")
        self.back_button.set_no_show_all(False)
        self.back_button.show()
        if self.path_categorybar.get_index() == -1:
            self.update_category_songs_view(item)
        else:    
            self.update_path_songs_view(item)
        
    def update_category_songs_view(self, item):    
        if item.key_name == "deepin-all-songs":
            songs = self.__db_query.get_all_songs()
        else:    
            self.__selected_tag[item.tag] = [item.key_name]
            songs = self.__get_selected_songs(item.tag)
        self.update_songs_view(songs, item.tag)    
        
    def update_path_songs_view(self, item):    
        songs = self.__db_query.get_attr_songs(self.__current_path, item.tag, item.key_name)
        if songs:
            self.update_songs_view(songs, item.tag)
        
    def update_songs_view(self, items, sort_key="title"):    
        self.songs_view.clear()
        self.entry_box.entry.set_text("")
        self.songs_view.add_songs(items)
        self.songs_view.set_sort_keyword(sort_key)
        if self.view_mode != LIST_VIEW_MODE:
            self.switch_box(self.right_box, self.songs_scrolled_window)
            self.view_mode= LIST_VIEW_MODE
        
    def __on_single_click_item(self, widget, item, x, y):    
        if item.pointer_in_play_rect(x, y):
            if item.key_name == "deepin-all-songs":
                songs = self.__db_query.get_all_songs()
            else:    
                del self.__selected_tag[item.tag]
                self.__selected_tag[item.tag] = [item.key_name]
                songs = self.__get_selected_songs(item.tag)
            if not songs:
                return 
            songs = list(songs)
            songs.sort()
            if not songs:
                return 
            Dispatcher.play_and_add_song(songs)
        
        
    def __search_cb(self, widget, text):    
        if self.view_mode == LIST_VIEW_MODE:
            if not self.__search_flag:
                self.__song_cache_items = self.songs_view.items[:]
                
            # Clear song_view select status    
            self.songs_view.select_rows = []    
            if text != "":
                self.__search_flag = True
                results = filter(lambda item: text.lower().replace(" ", "") in item.get_song().get("search", ""), self.__song_cache_items)
                self.songs_view.items = results
                self.songs_view.update_item_index()
                self.songs_view.update_vadjustment()
            else:    
                self.__search_flag = False
                self.songs_view.items = self.__song_cache_items
                self.songs_view.update_item_index()
                self.songs_view.update_vadjustment()
            self.songs_view.queue_draw()    
        elif self.view_mode == ICON_VIEW_MODE:    
            if not self.__search_flag:
                self.__cover_cache_items = self.filter_view.items[:]
            if text != "":    
                self.__search_flag = True
                results = filter(lambda item: text.lower().replace(" ", "") in item.retrieve, self.__cover_cache_items)
                self.filter_view.items = results
            else:    
                self.__search_flag = False
                self.filter_view.items = self.__cover_cache_items
            self.filter_view.queue_draw()    
        
    def switch_box(self, parent, child):    
        switch_tab(parent, child)
예제 #16
0
 def get_scrolled_window(self):
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(self)
     return scrolled_window
class DisplayView(gtk.VBox):
    '''
    class docs
    '''
    def __init__(self):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.brightness_id = None

        self.display_manager = DisplayManager()
        self.__xrandr_settings = self.display_manager.get_xrandr_settings()
        self.__xrandr_settings.connect("changed", self.__xrandr_changed)

        self.resize_width = 790
        self.resize_height = 200
        self.monitor_items = []
        self.__output_names = []
        self.__current_output_name = self.display_manager.get_primary_output_name(
        )
        self.__setup_monitor_items()
        self.sizes_items = []
        self.monitor_combo = None
        if len(self.monitor_items
               ) > 1 and self.display_manager.is_copy_monitors():
            self.__set_same_sizes()
        else:
            self.__setup_sizes_items()
        self.multi_monitors_items = [(_("Copy Display"), 1),
                                     (_("Extend Display"), 2),
                                     (_("Only shown in display 1"), 3),
                                     (_("Only shown in display 2"), 4)]
        self.rotation_items = [(_("Normal"), 1), (_("Right"), 2),
                               (_("Left"), 3), (_("Inverted"), 4)]
        self.duration_items = [("1 %s" % _("Minute"), 1),
                               ("2 %s" % _("Minutes"), 2),
                               ("3 %s" % _("Minutes"), 3),
                               ("5 %s" % _("Minutes"), 5),
                               ("10 %s" % _("Minutes"), 10),
                               ("30 %s" % _("Minutes"), 30),
                               ("1 %s" % _("Hour"), 60),
                               (_("Never"), DisplayManager.BIG_NUM / 60)]
        '''
        scrolled_window
        '''
        self.scrolled_window = ScrolledWindow()
        self.scrolled_window.set_size_request(-1, 425)
        self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.main_box = gtk.VBox()
        self.main_box.set_size_request(600, -1)
        self.body_box = gtk.HBox()
        '''
        left, right align
        '''
        self.left_align = self.__setup_align(
            padding_top=FRAME_TOP_PADDING,
            padding_left=TEXT_WINDOW_LEFT_PADDING)
        self.right_align = self.__setup_align(padding_top=FRAME_TOP_PADDING,
                                              padding_left=0)
        '''
        left, right box
        '''
        self.left_box = gtk.VBox(spacing=WIDGET_SPACING)
        self.right_box = gtk.VBox(spacing=WIDGET_SPACING)
        '''
        monitor operation && detect
        '''
        self.monitor_resize_align = self.__setup_align(
            padding_top=11, padding_left=int(TEXT_WINDOW_LEFT_PADDING / 2))
        self.monitor_resize_box = MonitorResizableBox(self.display_manager)
        self.monitor_resize_box.select_output(self.__current_output_name)
        self.monitor_resize_box.connect("select-output", self.__select_output)
        self.monitor_resize_box.connect("resize", self.__resize_box)
        self.monitor_resize_align.add(self.monitor_resize_box)
        '''
        monitor display
        '''
        self.monitor_display_align = self.__setup_title_align(
            app_theme.get_pixbuf("display/monitor_display.png"), _("Display"),
            0)
        '''
        monitor
        '''
        self.monitor_align = self.__setup_align()
        self.monitor_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.monitor_label = self.__setup_label(_("Monitor"))
        self.monitor_combo = self.__setup_combo(self.monitor_items)
        self.monitor_combo.set_select_index(
            self.display_manager.get_primary_output_name_index(
                self.monitor_items))
        self.monitor_combo.connect("item-selected", self.__combo_item_selected,
                                   "monitor_combo")
        self.__widget_pack_start(self.monitor_box,
                                 [self.monitor_label, self.monitor_combo])
        self.monitor_align.add(self.monitor_box)
        '''
        goto individuation or power setting
        '''
        self.goto_align = self.__setup_align()
        self.goto_box = gtk.VBox(spacing=WIDGET_SPACING)
        self.goto_label = self.__setup_label(_("Relevant Settings"),
                                             text_size=TITLE_FONT_SIZE,
                                             width=None,
                                             align=ALIGN_START)
        goto_color = GOTO_FG_COLOR
        self.goto_individuation_label = self.__setup_label(text=_(
            "<span foreground=\"%s\" underline=\"single\">Personalization</span>"
        ) % goto_color,
                                                           width=None,
                                                           align=ALIGN_START)
        self.goto_individuation_label.connect("button-press-event",
                                              self.__button_press,
                                              "individuation")
        set_clickable_cursor(self.goto_individuation_label)
        self.goto_power_label = self.__setup_label(
            text=_("<span foreground=\"%s\" underline=\"single\">Power</span>")
            % goto_color,
            width=None,
            align=ALIGN_START)
        self.goto_power_label.connect("button-press-event",
                                      self.__button_press, "power")
        set_clickable_cursor(self.goto_power_label)
        self.__widget_pack_start(self.goto_box, [
            self.goto_label, self.goto_individuation_label,
            self.goto_power_label
        ])
        self.goto_align.add(self.goto_box)
        '''
        sizes
        '''
        self.sizes_align = self.__setup_align()
        self.sizes_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.sizes_label = self.__setup_label(_("Resolution"))
        self.sizes_combo = self.__setup_combo(self.sizes_items)
        if self.sizes_combo:
            self.sizes_combo.set_select_index(
                self.display_manager.get_screen_size_index(
                    self.__current_output_name, self.sizes_items))
            self.sizes_combo.connect("item-selected",
                                     self.__combo_item_selected, "sizes_combo")
            self.__widget_pack_start(self.sizes_box,
                                     [self.sizes_label, self.sizes_combo])
        self.sizes_align.add(self.sizes_box)
        '''
        rotation
        '''
        self.rotation_align = self.__setup_align()
        self.rotation_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.rotation_label = self.__setup_label(_("Rotation"))
        self.rotation_combo = self.__setup_combo(self.rotation_items)
        self.rotation_combo.set_select_index(
            self.display_manager.get_screen_rotation_index(
                self.__current_output_name))
        self.rotation_combo.connect("item-selected",
                                    self.__combo_item_selected,
                                    "rotation_combo")
        self.__widget_pack_start(self.rotation_box,
                                 [self.rotation_label, self.rotation_combo])
        self.rotation_align.add(self.rotation_box)
        '''
        multi-monitors
        '''
        self.multi_monitors_align = self.__setup_align()
        self.multi_monitors_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.multi_monitors_label = self.__setup_label(_("Multi-Monitor"))
        self.multi_monitors_combo = self.__setup_combo(
            self.multi_monitors_items)
        self.multi_monitors_combo.set_select_index(
            self.display_manager.get_multi_monitor_index())
        self.multi_monitors_combo.connect("item-selected",
                                          self.__combo_item_selected,
                                          "multi_monitors_combo")
        self.__widget_pack_start(
            self.multi_monitors_box,
            [self.multi_monitors_label, self.multi_monitors_combo])
        self.multi_monitors_align.add(self.multi_monitors_box)
        if self.display_manager.get_output_count() < 2:
            self.multi_monitors_align.set_size_request(-1, 0)
            self.multi_monitors_align.set_child_visible(False)
        '''
        monitor brightness
        '''
        self.monitor_bright_align = self.__setup_title_align(
            app_theme.get_pixbuf("display/monitor_bright.png"),
            _("Brightness"))
        '''
        brightness
        '''
        self.brightness_align = self.__setup_align()
        self.brightness_box = gtk.HBox(spacing=2)
        self.brightness_label_align = self.__setup_align(padding_top=8,
                                                         padding_left=0,
                                                         padding_right=5)
        self.brightness_label = self.__setup_label(_("Brightness"))
        self.brightness_label_align.add(self.brightness_label)

        self.brightness_scale = HScalebar(
            point_dpixbuf=app_theme.get_pixbuf("scalebar/point.png"),
            value_min=0.1,
            value_max=1.0)
        self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33)
        self.brightness_scale.set_value(
            self.display_manager.get_screen_brightness())
        self.brightness_scale.connect("value-changed", self.__set_brightness)
        self.__widget_pack_start(
            self.brightness_box,
            [self.brightness_label_align, self.brightness_scale])
        self.brightness_align.add(self.brightness_box)
        '''
        auto adjust monitor brightness
        '''
        self.auto_adjust_align = self.__setup_align()
        self.auto_adjust_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.auto_adjust_label = self.__setup_label(_("Auto-Brightness"))
        self.auto_adjust_toggle_align = self.__setup_align(padding_top=4,
                                                           padding_left=158)
        self.auto_adjust_toggle = self.__setup_toggle()
        self.auto_adjust_toggle.set_active(
            self.display_manager.is_enable_close_monitor())
        self.auto_adjust_toggle.connect("toggled", self.__toggled,
                                        "auto_adjust_toggle")
        self.auto_adjust_toggle_align.add(self.auto_adjust_toggle)
        self.__widget_pack_start(
            self.auto_adjust_box,
            [self.auto_adjust_label, self.auto_adjust_toggle_align])
        self.auto_adjust_align.add(self.auto_adjust_box)
        '''
        close monitor
        '''
        self.close_monitor_align = self.__setup_align()
        self.close_monitor_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.close_monitor_label = self.__setup_label(_("Turn off monitor"))
        self.close_monitor_combo = self.__setup_combo(self.duration_items)
        self.close_monitor_combo.set_select_index(
            self.display_manager.get_close_monitor_index(self.duration_items))
        self.close_monitor_combo.connect("item-selected",
                                         self.__combo_item_selected,
                                         "close_monitor_combo")
        self.__widget_pack_start(
            self.close_monitor_box,
            [self.close_monitor_label, self.close_monitor_combo])
        self.close_monitor_align.add(self.close_monitor_box)
        '''
        monitor lock
        '''
        self.monitor_lock_align = self.__setup_title_align(
            app_theme.get_pixbuf("lock/lock.png"), _("Lock Screen"))
        '''
        auto monitor lock
        '''
        self.auto_lock_align = self.__setup_align()
        self.auto_lock_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.auto_lock_label = self.__setup_label(
            _("Lock screen automatically"))
        self.auto_lock_toggle_align = self.__setup_align(padding_top=4,
                                                         padding_left=158)
        self.auto_lock_toggle = self.__setup_toggle()
        is_enable_lock_display = self.display_manager.is_enable_lock_display()
        self.auto_lock_toggle.set_active(is_enable_lock_display)
        self.auto_lock_toggle.connect("toggled", self.__toggled,
                                      "auto_lock_toggle")
        self.auto_lock_toggle_align.add(self.auto_lock_toggle)
        self.__widget_pack_start(
            self.auto_lock_box,
            [self.auto_lock_label, self.auto_lock_toggle_align])
        self.auto_lock_align.add(self.auto_lock_box)
        '''
        lock display
        '''
        self.lock_display_align = self.__setup_align(padding_bottom=20)
        self.lock_display_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.lock_display_label = self.__setup_label(_("Lock Screen"))
        self.lock_display_combo = self.__setup_combo(self.duration_items)
        self.lock_display_combo.set_select_index(
            self.display_manager.get_lock_display_index(self.duration_items))
        self.lock_display_combo.connect("item-selected",
                                        self.__combo_item_selected,
                                        "lock_display_combo")
        self.__widget_pack_start(
            self.lock_display_box,
            [self.lock_display_label, self.lock_display_combo])
        self.lock_display_align.add(self.lock_display_box)
        '''
        left_align pack_start
        '''
        self.__widget_pack_start(
            self.left_box,
            [
                self.monitor_display_align,
                self.monitor_align,
                self.sizes_align,
                self.rotation_align,
                self.multi_monitors_align,
                self.monitor_bright_align,
                self.brightness_align,
                #self.auto_adjust_align,
                #self.close_monitor_align,
                self.monitor_lock_align,
                self.auto_lock_align,
                self.lock_display_align
            ])
        self.left_align.add(self.left_box)
        '''
        right_align pack_start
        '''
        self.__widget_pack_start(self.right_box, [self.goto_align])
        self.right_box.set_size_request(280, -1)
        self.right_align.add(self.right_box)
        '''
        main && body box
        '''
        self.main_box.pack_start(self.monitor_resize_align, False, False)
        self.body_box.pack_start(self.left_align)
        self.body_box.pack_start(self.right_align, False, False)
        self.main_box.pack_start(self.body_box)
        '''
        this->HBox pack_start
        '''
        self.scrolled_window.add_child(self.main_box)
        self.pack_start(self.scrolled_window)

        self.__send_message("status", ("display", ""))

    def show_again(self):
        self.__send_message("status", ("display", ""))

    def reset(self):
        self.__send_message("status", ("display", _("Reset to default value")))
        self.display_manager.reset()
        self.close_monitor_combo.set_select_index(
            self.display_manager.get_close_monitor_index(self.duration_items))
        self.lock_display_combo.set_select_index(
            self.display_manager.get_lock_display_index(self.duration_items))
        self.multi_monitors_combo.set_select_index(0)

    def __handle_dbus_replay(self, *reply):
        pass

    def __handle_dbus_error(self, *error):
        pass

    def __send_message(self, message_type, message_content):
        if is_dbus_name_exists(APP_DBUS_NAME):
            bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME,
                                                      APP_OBJECT_NAME)
            method = bus_object.get_dbus_method("message_receiver")
            method(message_type,
                   message_content,
                   reply_handler=self.__handle_dbus_replay,
                   error_handler=self.__handle_dbus_error)

    def __button_press(self, widget, event, module_id):
        self.__send_message("goto", (module_id, ""))

    def __expose(self, widget, event):
        try:
            cr = widget.window.cairo_create()
            rect = widget.allocation

            cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR))
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
            cr.fill()
        except e:
            print "DEBUG", e

    def __change_current_output(self, output_name, from_monitor_combo=True):
        self.__current_output_name = output_name

        if not from_monitor_combo:
            self.monitor_combo.set_select_index(
                self.display_manager.get_output_name_index(
                    output_name, self.monitor_items))

        if not self.display_manager.is_copy_monitors():
            self.__setup_sizes_items()
        if len(self.sizes_items):
            self.sizes_combo.add_items(items=self.sizes_items)
        self.sizes_combo.set_select_index(
            self.display_manager.get_screen_size_index(
                self.__current_output_name, self.sizes_items))

    def __select_output(self, widget, output_name):
        print "Output name:", output_name
        self.__change_current_output(output_name, False)

    def __set_same_sizes(self):
        same_sizes = self.display_manager.get_same_sizes(
            self.display_manager.get_screen_sizes(self.monitor_items[0][1]),
            self.display_manager.get_screen_sizes(self.monitor_items[1][1]))
        i = 0

        del self.sizes_items[:]
        while i < len(same_sizes):
            self.sizes_items.append((same_sizes[i], i))

            i += 1

    def __xrandr_changed(self, key):
        if key == "output-names":
            self.display_manager.init_xml()
            self.__setup_monitor_items()
            self.monitor_combo.add_items(items=self.monitor_items)
            if len(self.monitor_items) > 1:
                if self.display_manager.is_copy_monitors():
                    self.__set_same_sizes()
                    self.sizes_combo.add_items(items=self.sizes_items)

                self.multi_monitors_align.set_size_request(-1, 30)
                self.multi_monitors_align.set_child_visible(True)
            else:
                self.multi_monitors_align.set_size_request(-1, 0)
                self.multi_monitors_align.set_child_visible(False)
            return

        if key == "brightness":
            self.brightness_scale.set_value(
                self.display_manager.get_screen_brightness())
            return

    def __set_brightness_value(self, value):
        self.display_manager.set_screen_brightness(self.__current_output_name,
                                                   value)

    def __set_brightness(self, widget, event):
        value = self.brightness_scale.get_value()
        self.__send_message(
            "status",
            ("display", _("Changed brightness to %d%%") % int(value * 100)))
        if self.brightness_id:
            gobject.source_remove(self.brightness_id)
        self.brightness_id = gobject.timeout_add_seconds(
            1, self.__set_brightness_value, value)

    def __setup_monitor_items(self):
        self.__output_names = self.display_manager.get_output_names()
        del self.monitor_items[:]
        i = 0

        while (i < len(self.__output_names)):
            self.monitor_items.append(
                self.display_manager.get_output_name(self.__output_names[i]))
            i += 1

    def __setup_sizes_items(self):
        screen_sizes = self.display_manager.get_screen_sizes(
            self.__current_output_name)
        del self.sizes_items[:]
        i = 0

        while i < len(screen_sizes):
            self.sizes_items.append((screen_sizes[i], i))
            i += 1

    def __toggled(self, widget, object=None):
        if object == "auto_adjust_toggle":
            if not widget.get_active():
                self.__send_message(
                    "status", ("display", _("Changed to manual adjustment")))
                self.display_manager.set_close_monitor(DisplayManager.BIG_NUM /
                                                       60)
            else:
                self.__send_message(
                    "status",
                    ("display", _("Changed to automatic adjustment")))
            return

        if object == "auto_lock_toggle":
            if not widget.get_active():
                self.lock_display_combo.set_sensitive(False)
                self.__send_message("status",
                                    ("display", _("Changed to manual lock")))
            else:
                self.lock_display_combo.set_sensitive(True)
                self.__send_message(
                    "status", ("display", _("Changed to automatic lock")))
            return

    def __combo_item_selected(self,
                              widget,
                              item_text=None,
                              item_value=None,
                              item_index=None,
                              object=None):
        if object == "monitor_combo":
            self.__send_message(
                "status",
                ("display", _("Changed current output to %s") % item_text))
            self.__change_current_output(item_value)
            return

        if object == "sizes_combo":
            size = self.sizes_items[item_value][0]
            self.__send_message(
                "status", ("display", _("Changed resolution to %s") % size))
            self.display_manager.set_screen_size(self.__current_output_name,
                                                 size)
            return

        if object == "rotation_combo":
            self.__send_message(
                "status", ("display", _("Changed rotation to %s") % item_text))
            self.display_manager.set_screen_rotation(
                self.__current_output_name, item_value)
            return

        if object == "multi_monitors_combo":
            self.__send_message(
                "status",
                ("display", _("Changed multi-monitor mode to %s") % item_text))
            self.display_manager.set_multi_monitor(item_value)
            return

        if object == "close_monitor_combo":
            self.__send_message("status", (
                "display",
                _("Idle time before turning off display has been changed to to %s"
                  ) % item_text))
            self.display_manager.set_close_monitor(item_value)
            return

        if object == "lock_display_combo":
            self.__send_message(
                "status",
                ("display",
                 _("Idle time before locking display has been changed to %s") %
                 item_text))
            if item_value == DisplayManager.BIG_NUM / 60:
                self.auto_lock_toggle.set_active(False)
            else:
                self.auto_lock_toggle.set_active(True)
            self.display_manager.set_lock_display(item_value)
            return

    def __resize_box(self, widget, height):
        self.monitor_resize_box.set_size_request(self.resize_width,
                                                 height - FRAME_TOP_PADDING)

    def __setup_separator(self):
        hseparator = HSeparator(
            app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0)
        hseparator.set_size_request(500, HSEPARATOR_HEIGHT)
        return hseparator

    def __setup_title_label(
            self,
            text="",
            text_color=app_theme.get_color("globalTitleForeground"),
            text_size=TITLE_FONT_SIZE,
            text_x_align=ALIGN_START,
            label_width=180):
        return Label(text=text,
                     text_color=text_color,
                     text_size=text_size,
                     text_x_align=text_x_align,
                     label_width=label_width,
                     enable_select=False,
                     enable_double_click=False)

    def __setup_label(self,
                      text="",
                      text_size=CONTENT_FONT_SIZE,
                      width=180,
                      align=ALIGN_END,
                      wrap_width=None):
        label = Label(text=text,
                      text_color=None,
                      text_size=text_size,
                      text_x_align=align,
                      label_width=width,
                      wrap_width=wrap_width,
                      enable_select=False,
                      enable_double_click=False)
        return label

    def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH):
        if len(items) == 0:
            return None

        combo = ComboBox(items=items,
                         select_index=0,
                         max_width=width,
                         fixed_width=width)
        combo.set_size_request(width, WIDGET_HEIGHT)
        return combo

    def __setup_toggle(self):
        toggle = ToggleButton(
            app_theme.get_pixbuf("toggle_button/inactive_normal.png"),
            app_theme.get_pixbuf("toggle_button/active_normal.png"))
        return toggle

    def __setup_title_align(self,
                            pixbuf,
                            text,
                            padding_top=FRAME_TOP_PADDING,
                            padding_left=0):
        align = self.__setup_align(padding_top=padding_top,
                                   padding_left=padding_left)
        align_box = gtk.VBox(spacing=WIDGET_SPACING)
        title_box = gtk.HBox(spacing=WIDGET_SPACING)
        image = ImageBox(pixbuf)
        label = self.__setup_title_label(text)
        separator = self.__setup_separator()
        self.__widget_pack_start(title_box, [image, label])
        self.__widget_pack_start(align_box, [title_box, separator])
        align.add(align_box)
        return align

    def __setup_align(self,
                      xalign=0,
                      yalign=0,
                      xscale=0,
                      yscale=0,
                      padding_top=0,
                      padding_bottom=0,
                      padding_left=FRAME_LEFT_PADDING +
                      int(WIDGET_SPACING / 2),
                      padding_right=0):
        align = gtk.Alignment()
        align.set(xalign, yalign, xscale, yscale)
        align.set_padding(padding_top, padding_bottom, padding_left,
                          padding_right)
        align.connect("expose-event", self.__expose)
        return align

    def __widget_pack_start(self,
                            parent_widget,
                            widgets=[],
                            expand=False,
                            fill=False):
        if parent_widget == None:
            return
        for item in widgets:
            parent_widget.pack_start(item, expand, fill)
 def get_webcasts_view(self):    
     webcast_view = MultiDragWebcastView()
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(webcast_view)
     return webcast_view, scrolled_window
class ThemePage(gtk.VBox):
    '''
    class docs
    '''
	
    def __init__(self):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.status_box = StatusBox()

        self.scroll = ScrolledWindow()
        self.scroll.set_size_request(800, 432)
        self.scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

        self.label_padding_x = 10
        self.label_padding_y = 10
        
        self.theme_box = gtk.VBox()
        self.user_theme_label = Label(_("My Themes"), text_size=TITLE_FONT_SIZE, 
                                      text_color=app_theme.get_color("globalTitleForeground"))
        self.user_theme_view = UserThemeView(status_box = self.status_box)
        self.user_theme_scrolledwindow = self.user_theme_view.get_scrolled_window()
        
        self.system_theme_label = Label(_("System Themes"), text_size=TITLE_FONT_SIZE, 
                                      text_color=app_theme.get_color("globalTitleForeground"))
        self.system_theme_view = SystemThemeView(status_box = self.status_box)
        self.system_theme_scrolledwindow = self.system_theme_view.get_scrolled_window()
        
        self.theme_box.pack_start(self.user_theme_label, False, False)
        self.theme_box.pack_start(get_separator(), False, False)
        self.theme_box.pack_start(self.user_theme_scrolledwindow, False, False)
        
        self.theme_box.pack_start(self.system_theme_label, False, False)
        self.theme_box.pack_start(get_separator(), False, False)
        self.theme_box.pack_start(self.system_theme_scrolledwindow, True, True)
        
        main_align = gtk.Alignment()
        main_align.set_padding(15, 0, 20, 20)
        main_align.set(1, 1, 1, 1)
        main_align.add(self.theme_box)
        
        self.scroll.add_child(main_align)
        
        main_align.connect("expose-event", self.expose_label_align)

        self.pack_start(self.scroll, False, False)
        self.pack_start(self.status_box)
        
    def expose_label_align(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        
        self.draw_mask(cr, rect.x, rect.y, rect.width, rect.height)
                
    def draw_mask(self, cr, x, y, w, h):
        '''
        Draw mask interface.
        
        @param cr: Cairo context.
        @param x: X coordiante of draw area.
        @param y: Y coordiante of draw area.
        @param w: Width of draw area.
        @param h: Height of draw area.
        '''
        cr.set_source_rgb(1, 1, 1)
        cr.rectangle(x, y, w, h)
        cr.fill()
class SettingUI(gtk.Alignment):
    def __init__(self, slide_back_cb, change_crumb_cb):
        gtk.Alignment.__init__(self, 0, 0, 0, 0)
        self.slide_back = slide_back_cb
        self.change_crumb = change_crumb_cb
        
        self.scroll_win = ScrolledWindow()
        self.scroll_win.set_can_focus(False)

        self.scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        main_vbox = gtk.VBox()
        self.foot_box = FootBox()
        self.hbox = gtk.HBox()

        self.scroll_win.add_with_viewport(self.hbox)
        self.scroll_align = gtk.Alignment()
        self.scroll_win.set_size_request(800, 435)
        self.scroll_align.set(0, 0, 0, 0)
        self.scroll_align.set_padding(0, 0, 30, 0)
        self.scroll_align.add(self.scroll_win)
        
        padding_align = gtk.Alignment(0, 0, 0, 0)
        padding_align.set_padding(15, 0, 0, 0)
        self.sidebar = SideBar( None)
        padding_align.add(self.sidebar)
        self.hpaned = MyPaned()
        self.hpaned.set_size_request(800, -1)
        self.hpaned.connect("expose-event",self.expose_line)
        #self.hpaned.do_enter_notify_event = self.enter_notify_event
        self.hpaned.add1(padding_align)
        self.hpaned.add2(self.scroll_align)
        self.connect_after("show", self.__init_paned)
        main_vbox.pack_start(self.hpaned, True, True)
        main_vbox.pack_start(self.foot_box, False, False)
        self.add(main_vbox)

        self.__init_signals()

    def enter_notify_event(self, e):
        pass

    def __init_paned(self, widget):
        log.debug("")
        self.hpaned.saved_position = 160
        self.hpaned.set_position(1)
        self.hpaned.animation_position_frames = [0]
        self.hpaned.update_position()

    def __init_signals(self):
        Dispatcher.connect("connection-change", self.switch_content)
        Dispatcher.connect("setting-saved", self.save_connection_setting)
        Dispatcher.connect("setting-appled", self.apply_connection_setting)
        Dispatcher.connect("request_redraw", lambda w: self.scroll_win.show_all())

    def load_module(self, module_obj, hide_left):
        # create a reference
        self.setting_group = module_obj
        
        # init paned
        self.__init_paned(None)
        log.info("dss start load module", module_obj)
        self.hpaned.set_button_show(hide_left)
        
        # init foot_box
        self.foot_box.set_setting(module_obj)

        # init sidebar
        self.sidebar.load_list(module_obj)
        self.apply_method = module_obj.apply_changes
        self.save_method = module_obj.save_changes
        

    def switch_content(self, widget, connection):
        container_remove_all(self.hbox)
        self.set_tab_content(connection)
        self.set_foot_bar_button(connection)
    
        self.focus_connection = connection

    def set_foot_bar_button(self, connection):
        if type(connection) == NMRemoteConnection:
            self.foot_box.show_delete(connection)
        else:
            self.foot_box.hide_delete()
        states = self.setting_group.get_button_state(connection)
        if states:
            Dispatcher.set_button(*states)
        
    def set_tab_content(self, connection):
        log.debug("set tab content", connection)
        setting = self.setting_group.init_items(connection)
        self.hbox.add(setting)
        self.hbox.show_all()
        self.foot_box.set_lock(False)

    def expose_line(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        style.draw_out_line(cr, rect, exclude=["left", "right", "top"])

    def draw_tab_title_background(self, cr, widget):
        rect = widget.allocation
        cr.set_source_rgb(1, 1, 1)    
        cr.rectangle(0, 0, rect.width, rect.height - 1)
        cr.fill()

    def save_connection_setting(self, widget):
        self.save_method(self.focus_connection)

    def apply_connection_setting(self, widget):
        #print type(self.focus_connection)
        self.apply_method(self.focus_connection)

    def create_new_connection(self):
        self.sidebar.add_new_connection()
class PlayListView(object):
    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)

    def __listview_on_draw_sub_item(self, e):
        color = self.listview_color.get_color()
        if e.double_items == e.item:
            e.text_color = "#000000"
            text_size = 9
            color_info = [(0, (color, 0.8)), (1, (color, 0.8))]
            draw_vlinear(e.cr, e.x, e.y, e.w, e.h, color_info)
        elif e.item in e.single_items:
            e.text_color = "#FFFFFF"
            text_size = 9
            color_info = [(0, (color, 0.5)), (1, (color, 0.5))]
            draw_vlinear(e.cr, e.x, e.y, e.w, e.h, color_info)
        elif e.motion_items == e.item:
            e.text_color = "#FFFFFF"
            text_size = 9
            color_info = [(0, (color, 0.2)), (1, (color, 0.2))]
            draw_vlinear(e.cr, e.x, e.y, e.w, e.h, color_info)
        else:
            e.text_color = "#FFFFFF"
            text_size = 9
        #
        text = e.text.decode("utf-8")
        one_width = self.list_view.columns[0].width
        two_width = self.list_view.columns[1].width
        #if e.w == one_width: # 显示播放名字的第一列.
        if e.column_index == 0:
            #
            t_width = 0
            t_index = 0
            add_point = False
            for t in text:
                t_width += get_text_size(t, text_size=text_size)[0]
                if t_width > one_width - 20:
                    add_point = True
                    break
                t_index += 1
            if add_point:
                text = text[:t_index] + "..."
            #
            alignment = Text.LEFT
            x = e.x + 15
        elif e.w == two_width:
            alignment = Text.RIGHT
            x = e.x - 15

        e.draw_text(e.cr,
                    str(text),
                    x,
                    e.y,
                    e.w,
                    e.h,
                    text_color=e.text_color,
                    text_size=text_size,
                    alignment=alignment)

    def __treeview_paint_nodes_event(self, node_event):
        color = self.listview_color.get_color()
        text_color = "#FFFFFF"
        # 单击和移动, 双击.
        if node_event.node in node_event.single_items:
            color_info = [(0, (color, 0.45)), (1, (color, 0.45))]
            draw_vlinear(node_event.cr, node_event.x, node_event.y,
                         node_event.w, node_event.h, color_info)
            #text_color = "#000000"
        elif node_event.node in node_event.motion_items:
            color_info = [(0, (color, 0.75)), (1, (color, 0.75))]
            draw_vlinear(node_event.cr, node_event.x, node_event.y,
                         node_event.w, node_event.h, color_info)
        #
        x_padding = 12  # 因为要和搜索框对齐.
        if 0 == node_event.node.leave:  # 根节点. :比如->> >我看过的. >优酷视频. >pps.
            if node_event.node.is_expanded:
                pixbuf = self.one_open.get_pixbuf()
            else:
                pixbuf = self.one_close.get_pixbuf()
        elif 1 == node_event.node.leave:  #
            if node_event.node.is_expanded:
                pixbuf = self.two_open.get_pixbuf()
            else:
                pixbuf = self.two_close.get_pixbuf()
        else:
            if node_event.node.is_expanded:
                pixbuf = self.three_open.get_pixbuf()
            else:
                pixbuf = self.three_close.get_pixbuf()
        #
        icon_x = node_event.x + x_padding
        icon_y = node_event.y + node_event.h / 2 - pixbuf.get_height() / 2 + 1
        if node_event.node.leave > 1:
            icon_x += (node_event.node.leave - 1) * pixbuf.get_width()
        if node_event.node.leave > 0:
            text_color = "#a8a8a8"
        ##########
        # 画图标.
        if node_event.node.nodes != []:
            draw_pixbuf(node_event.cr, pixbuf, icon_x, icon_y)
        # 画文本.
        text_x_padding = 15
        text_size = 9
        draw_text(node_event.cr,
                  node_event.node.text,
                  icon_x + text_x_padding,
                  node_event.y + node_event.h / 2 -
                  get_text_size(node_event.node.text, text_size=9)[1] / 2,
                  text_color=text_color,
                  text_size=text_size)

    def search_ali_expose_event(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        #
        bg_color = "#272727"
        cr.set_source_rgba(*alpha_color_hex_to_cairo((bg_color, 1.0)))
        cr.rectangle(rect.x, rect.y, rect.width + 1, rect.height)
        cr.fill()
        #
        propagate_expose(widget, event)
        return True
class DisplayView(gtk.VBox):
    '''
    class docs
    '''
	
    def __init__(self):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.brightness_id = None

        self.display_manager = DisplayManager()
        self.__xrandr_settings = self.display_manager.get_xrandr_settings()
        self.__xrandr_settings.connect("changed", self.__xrandr_changed)

        self.resize_width = 790
        self.resize_height = 200
        self.monitor_items = []
        self.__output_names = []
        self.__current_output_name = self.display_manager.get_primary_output_name()
        self.__setup_monitor_items()
        self.sizes_items = []
        self.monitor_combo = None
        if len(self.monitor_items) > 1 and self.display_manager.is_copy_monitors():
            self.__set_same_sizes()
        else:
            self.__setup_sizes_items()
        self.multi_monitors_items = [(_("Copy Display"), 1), 
                                     (_("Extend Display"), 2), 
                                     (_("Only shown in display 1"), 3), 
                                     (_("Only shown in display 2"), 4)]
        self.rotation_items = [(_("Normal"), 1), 
                               (_("Right"), 2), 
                               (_("Left"), 3), 
                               (_("Inverted"), 4)]
        self.duration_items = [("1 %s" % _("Minute"), 1), 
                               ("2 %s" % _("Minutes"), 2), 
                               ("3 %s" % _("Minutes"), 3), 
                               ("5 %s" % _("Minutes"), 5), 
                               ("10 %s" % _("Minutes"), 10), 
                               ("30 %s" % _("Minutes"), 30), 
                               ("1 %s" % _("Hour"), 60), 
                               (_("Never"), DisplayManager.BIG_NUM / 60)]
        '''
        scrolled_window
        '''
        self.scrolled_window = ScrolledWindow()
        self.scrolled_window.set_size_request(-1, 425)
        self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.main_box = gtk.VBox()
        self.main_box.set_size_request(600, -1)
        self.body_box = gtk.HBox()
        '''
        left, right align
        '''
        self.left_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, 
                                             padding_left = TEXT_WINDOW_LEFT_PADDING)
        self.right_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, 
                                              padding_left = 0)
        '''
        left, right box
        '''
        self.left_box = gtk.VBox(spacing = WIDGET_SPACING)
        self.right_box = gtk.VBox(spacing = WIDGET_SPACING)
        '''
        monitor operation && detect
        '''
        self.monitor_resize_align = self.__setup_align(padding_top = 11, 
                                                       padding_left = int(TEXT_WINDOW_LEFT_PADDING / 2))
        self.monitor_resize_box = MonitorResizableBox(self.display_manager)
        self.monitor_resize_box.select_output(self.__current_output_name)
        self.monitor_resize_box.connect("select-output", self.__select_output)
        self.monitor_resize_box.connect("resize", self.__resize_box)
        self.monitor_resize_align.add(self.monitor_resize_box)
        '''
        monitor display
        '''
        self.monitor_display_align = self.__setup_title_align(
            app_theme.get_pixbuf("display/monitor_display.png"), 
            _("Display"), 
            0)
        '''
        monitor
        '''
        self.monitor_align = self.__setup_align()
        self.monitor_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.monitor_label = self.__setup_label(_("Monitor"))
        self.monitor_combo = self.__setup_combo(self.monitor_items)
        self.monitor_combo.set_select_index(self.display_manager.get_primary_output_name_index(self.monitor_items))
        self.monitor_combo.connect("item-selected", self.__combo_item_selected, "monitor_combo")
        self.__widget_pack_start(self.monitor_box, 
            [self.monitor_label, 
             self.monitor_combo])
        self.monitor_align.add(self.monitor_box)
        '''
        goto individuation or power setting
        '''
        self.goto_align = self.__setup_align()
        self.goto_box = gtk.VBox(spacing = WIDGET_SPACING)
        self.goto_label = self.__setup_label(_("Relevant Settings"), 
                                             text_size = TITLE_FONT_SIZE, 
                                             width = None, 
                                             align = ALIGN_START)
        goto_color = GOTO_FG_COLOR
        self.goto_individuation_label = self.__setup_label(
            text = _("<span foreground=\"%s\" underline=\"single\">Personalization</span>") % goto_color, 
            width = None, 
            align = ALIGN_START)
        self.goto_individuation_label.connect("button-press-event", 
                                              self.__button_press, 
                                              "individuation")
        set_clickable_cursor(self.goto_individuation_label)
        self.goto_power_label = self.__setup_label(
            text = _("<span foreground=\"%s\" underline=\"single\">Power</span>") % goto_color, 
            width = None, 
            align = ALIGN_START)
        self.goto_power_label.connect("button-press-event", 
                                      self.__button_press, 
                                      "power")
        set_clickable_cursor(self.goto_power_label)
        self.__widget_pack_start(self.goto_box, 
                                 [self.goto_label, 
                                  self.goto_individuation_label, 
                                  self.goto_power_label
                                 ])
        self.goto_align.add(self.goto_box)
        '''
        sizes
        '''
        self.sizes_align = self.__setup_align()
        self.sizes_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.sizes_label = self.__setup_label(_("Resolution"))
        self.sizes_combo = self.__setup_combo(self.sizes_items)
        if self.sizes_combo:
            self.sizes_combo.set_select_index(
                self.display_manager.get_screen_size_index(self.__current_output_name, 
                                                           self.sizes_items))
            self.sizes_combo.connect("item-selected", self.__combo_item_selected, "sizes_combo")
            self.__widget_pack_start(self.sizes_box, 
                                     [self.sizes_label, self.sizes_combo])
        self.sizes_align.add(self.sizes_box)
        '''
        rotation
        '''
        self.rotation_align = self.__setup_align()
        self.rotation_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.rotation_label = self.__setup_label(_("Rotation"))
        self.rotation_combo = self.__setup_combo(self.rotation_items)
        self.rotation_combo.set_select_index(self.display_manager.get_screen_rotation_index(self.__current_output_name))
        self.rotation_combo.connect("item-selected", self.__combo_item_selected, "rotation_combo")
        self.__widget_pack_start(self.rotation_box, 
            [self.rotation_label, 
             self.rotation_combo])
        self.rotation_align.add(self.rotation_box)
        '''
        multi-monitors
        '''
        self.multi_monitors_align = self.__setup_align()
        self.multi_monitors_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.multi_monitors_label = self.__setup_label(_("Multi-Monitor"))
        self.multi_monitors_combo = self.__setup_combo(self.multi_monitors_items)
        self.multi_monitors_combo.set_select_index(self.display_manager.get_multi_monitor_index())
        self.multi_monitors_combo.connect("item-selected", self.__combo_item_selected, "multi_monitors_combo")
        self.__widget_pack_start(self.multi_monitors_box, 
            [self.multi_monitors_label, self.multi_monitors_combo])
        self.multi_monitors_align.add(self.multi_monitors_box)
        if self.display_manager.get_output_count() < 2:
            self.multi_monitors_align.set_size_request(-1, 0)
            self.multi_monitors_align.set_child_visible(False)
        '''
        monitor brightness
        '''
        self.monitor_bright_align = self.__setup_title_align(
            app_theme.get_pixbuf("display/monitor_bright.png"), 
            _("Brightness"))
        '''
        brightness
        '''
        self.brightness_align = self.__setup_align()
        self.brightness_box = gtk.HBox(spacing = 2)
        self.brightness_label_align = self.__setup_align(padding_top = 8, 
                                                         padding_left = 0, 
                                                         padding_right = 5)
        self.brightness_label = self.__setup_label(_("Brightness"))
        self.brightness_label_align.add(self.brightness_label)
        
        self.brightness_scale = HScalebar(point_dpixbuf = app_theme.get_pixbuf("scalebar/point.png"), 
                                          value_min = 0.1, 
                                          value_max = 1.0)
        self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33)
        self.brightness_scale.set_value(self.display_manager.get_screen_brightness())
        self.brightness_scale.connect("value-changed", self.__set_brightness)
        self.__widget_pack_start(self.brightness_box, 
            [self.brightness_label_align, 
             self.brightness_scale])
        self.brightness_align.add(self.brightness_box)
        '''
        auto adjust monitor brightness
        '''
        self.auto_adjust_align = self.__setup_align()
        self.auto_adjust_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.auto_adjust_label = self.__setup_label(_("Auto-Brightness"))
        self.auto_adjust_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158)
        self.auto_adjust_toggle = self.__setup_toggle()
        self.auto_adjust_toggle.set_active(self.display_manager.is_enable_close_monitor())
        self.auto_adjust_toggle.connect("toggled", self.__toggled, "auto_adjust_toggle")
        self.auto_adjust_toggle_align.add(self.auto_adjust_toggle)
        self.__widget_pack_start(self.auto_adjust_box, 
            [self.auto_adjust_label, self.auto_adjust_toggle_align])
        self.auto_adjust_align.add(self.auto_adjust_box)
        '''
        close monitor
        '''
        self.close_monitor_align = self.__setup_align()
        self.close_monitor_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.close_monitor_label = self.__setup_label(_("Turn off monitor"))
        self.close_monitor_combo = self.__setup_combo(self.duration_items)
        self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items))
        self.close_monitor_combo.connect("item-selected", self.__combo_item_selected, "close_monitor_combo")
        self.__widget_pack_start(self.close_monitor_box, 
            [self.close_monitor_label, 
             self.close_monitor_combo])
        self.close_monitor_align.add(self.close_monitor_box)
        '''
        monitor lock
        '''
        self.monitor_lock_align = self.__setup_title_align(
            app_theme.get_pixbuf("lock/lock.png"), 
            _("Lock Screen"))
        '''
        auto monitor lock
        '''
        self.auto_lock_align = self.__setup_align()
        self.auto_lock_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.auto_lock_label = self.__setup_label(_("Lock screen automatically"))
        self.auto_lock_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158)
        self.auto_lock_toggle = self.__setup_toggle()
        is_enable_lock_display = self.display_manager.is_enable_lock_display()
        self.auto_lock_toggle.set_active(is_enable_lock_display)
        self.auto_lock_toggle.connect("toggled", self.__toggled, "auto_lock_toggle")
        self.auto_lock_toggle_align.add(self.auto_lock_toggle)
        self.__widget_pack_start(self.auto_lock_box, 
            [self.auto_lock_label, self.auto_lock_toggle_align])
        self.auto_lock_align.add(self.auto_lock_box)
        '''
        lock display
        '''
        self.lock_display_align = self.__setup_align(padding_bottom = 20)
        self.lock_display_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.lock_display_label = self.__setup_label(_("Lock Screen")) 
        self.lock_display_combo = self.__setup_combo(self.duration_items)
        self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items))
        self.lock_display_combo.connect("item-selected", self.__combo_item_selected, "lock_display_combo")
        self.__widget_pack_start(self.lock_display_box, 
            [self.lock_display_label, 
             self.lock_display_combo])
        self.lock_display_align.add(self.lock_display_box)
        '''
        left_align pack_start
        '''
        self.__widget_pack_start(self.left_box, 
            [self.monitor_display_align, 
             self.monitor_align, 
             self.sizes_align, 
             self.rotation_align, 
             self.multi_monitors_align, 
             self.monitor_bright_align, 
             self.brightness_align, 
             #self.auto_adjust_align, 
             #self.close_monitor_align, 
             self.monitor_lock_align, 
             self.auto_lock_align, 
             self.lock_display_align])
        self.left_align.add(self.left_box)
        '''
        right_align pack_start
        '''
        self.__widget_pack_start(self.right_box, 
            [self.goto_align])
        self.right_box.set_size_request(280, -1)
        self.right_align.add(self.right_box)
        '''
        main && body box
        '''
        self.main_box.pack_start(self.monitor_resize_align, False, False)
        self.body_box.pack_start(self.left_align)
        self.body_box.pack_start(self.right_align, False, False)
        self.main_box.pack_start(self.body_box)
        '''
        this->HBox pack_start
        '''
        self.scrolled_window.add_child(self.main_box)
        self.pack_start(self.scrolled_window)

        self.__send_message("status", ("display", ""))

    def show_again(self):
        self.__send_message("status", ("display", ""))

    def reset(self):
        self.__send_message("status", ("display", _("Reset to default value")))
        self.display_manager.reset()
        self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items))
        self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items))
        self.multi_monitors_combo.set_select_index(0)

    def __handle_dbus_replay(self, *reply):
        pass

    def __handle_dbus_error(self, *error):
        pass

    def __send_message(self, message_type, message_content):
        if is_dbus_name_exists(APP_DBUS_NAME):
            bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME, APP_OBJECT_NAME)
            method = bus_object.get_dbus_method("message_receiver")
            method(message_type, 
                   message_content, 
                   reply_handler=self.__handle_dbus_replay, 
                   error_handler=self.__handle_dbus_error)

    def __button_press(self, widget, event, module_id):
        self.__send_message("goto", (module_id, ""))

    def __expose(self, widget, event):
        try:
            cr = widget.window.cairo_create()                                        
            rect = widget.allocation                                                 
        
            cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR))                  
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)                    
            cr.fill()
        except e:
            print "DEBUG", e

    def __change_current_output(self, output_name, from_monitor_combo=True):
        self.__current_output_name = output_name

        if not from_monitor_combo:
            self.monitor_combo.set_select_index(self.display_manager.get_output_name_index(output_name, self.monitor_items))

        if not self.display_manager.is_copy_monitors():
            self.__setup_sizes_items()
        if len(self.sizes_items):
            self.sizes_combo.add_items(items = self.sizes_items)
        self.sizes_combo.set_select_index(self.display_manager.get_screen_size_index(
            self.__current_output_name, self.sizes_items))
    
    def __select_output(self, widget, output_name):
        print "Output name:", output_name
        self.__change_current_output(output_name, False)
    
    def __set_same_sizes(self):
        same_sizes = self.display_manager.get_same_sizes(                      
            self.display_manager.get_screen_sizes(self.monitor_items[0][1]), 
            self.display_manager.get_screen_sizes(self.monitor_items[1][1]))
        i = 0
        
        del self.sizes_items[:]                                             
        while i < len(same_sizes):                                          
            self.sizes_items.append((same_sizes[i], i))                     
                                                                                
            i += 1                                                          
    
    def __xrandr_changed(self, key):
        if key == "output-names":
            self.display_manager.init_xml()
            self.__setup_monitor_items()
            self.monitor_combo.add_items(items = self.monitor_items)
            if len(self.monitor_items) > 1:
                if self.display_manager.is_copy_monitors():
                    self.__set_same_sizes()
                    self.sizes_combo.add_items(items = self.sizes_items) 

                self.multi_monitors_align.set_size_request(-1, 30)
                self.multi_monitors_align.set_child_visible(True)
            else:
                self.multi_monitors_align.set_size_request(-1, 0)
                self.multi_monitors_align.set_child_visible(False)
            return

        if key == "brightness":
            self.brightness_scale.set_value(self.display_manager.get_screen_brightness())
            return

    def __set_brightness_value(self, value):
        self.display_manager.set_screen_brightness(self.__current_output_name, value)

    def __set_brightness(self, widget, event):
        value = self.brightness_scale.get_value()
        self.__send_message("status", 
                ("display", _("Changed brightness to %d%%") % int(value * 100)))
        if self.brightness_id:
            gobject.source_remove(self.brightness_id)
        self.brightness_id = gobject.timeout_add_seconds(1, self.__set_brightness_value, value)
    
    def __setup_monitor_items(self):
        self.__output_names = self.display_manager.get_output_names()
        del self.monitor_items[:]
        i = 0

        while (i < len(self.__output_names)):
            self.monitor_items.append(self.display_manager.get_output_name(self.__output_names[i]))
            i += 1

    def __setup_sizes_items(self):
        screen_sizes = self.display_manager.get_screen_sizes(self.__current_output_name)
        del self.sizes_items[:]
        i = 0

        while i < len(screen_sizes):
            self.sizes_items.append((screen_sizes[i], i))
            i += 1

    def __toggled(self, widget, object=None):
        if object == "auto_adjust_toggle":
            if not widget.get_active():
                self.__send_message("status", ("display", _("Changed to manual adjustment")))
                self.display_manager.set_close_monitor(DisplayManager.BIG_NUM / 60)
            else:
                self.__send_message("status", ("display", _("Changed to automatic adjustment")))
            return

        if object == "auto_lock_toggle":
            if not widget.get_active():
                self.lock_display_combo.set_sensitive(False)
                self.__send_message("status", ("display", _("Changed to manual lock")))
            else:
                self.lock_display_combo.set_sensitive(True)
                self.__send_message("status", ("display", _("Changed to automatic lock")))
            return

    def __combo_item_selected(self, widget, item_text=None, item_value=None, item_index=None, object=None):
        if object == "monitor_combo":
            self.__send_message("status", ("display", _("Changed current output to %s") % item_text))
            self.__change_current_output(item_value)
            return

        if object == "sizes_combo":
            size = self.sizes_items[item_value][0]
            self.__send_message("status", ("display", _("Changed resolution to %s") % size))
            self.display_manager.set_screen_size(self.__current_output_name, size)
            return
        
        if object == "rotation_combo":
            self.__send_message("status", ("display", _("Changed rotation to %s") % item_text))
            self.display_manager.set_screen_rotation(self.__current_output_name, item_value)
            return

        if object == "multi_monitors_combo":
            self.__send_message("status", ("display", _("Changed multi-monitor mode to %s") % item_text))
            self.display_manager.set_multi_monitor(item_value)
            return
        
        if object == "close_monitor_combo":
            self.__send_message("status", ("display", _("Idle time before turning off display has been changed to to %s") % item_text))
            self.display_manager.set_close_monitor(item_value)
            return

        if object == "lock_display_combo":
            self.__send_message("status", ("display", _("Idle time before locking display has been changed to %s") % item_text))
            if item_value == DisplayManager.BIG_NUM / 60:
                self.auto_lock_toggle.set_active(False)
            else:
                self.auto_lock_toggle.set_active(True)
            self.display_manager.set_lock_display(item_value)
            return

    def __resize_box(self, widget, height):
        self.monitor_resize_box.set_size_request(self.resize_width, height - FRAME_TOP_PADDING)

    def __setup_separator(self):
        hseparator = HSeparator(app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0)
        hseparator.set_size_request(500, HSEPARATOR_HEIGHT)
        return hseparator
    
    def __setup_title_label(self, 
                            text="", 
                            text_color=app_theme.get_color("globalTitleForeground"), 
                            text_size=TITLE_FONT_SIZE, 
                            text_x_align=ALIGN_START, 
                            label_width=180):
        return Label(text = text, 
                     text_color = text_color, 
                     text_size = text_size, 
                     text_x_align = text_x_align, 
                     label_width = label_width, 
                     enable_select = False, 
                     enable_double_click = False)
    
    def __setup_label(self, text="", text_size=CONTENT_FONT_SIZE, width=180, align=ALIGN_END, wrap_width=None):
        label = Label(text = text, 
                      text_color = None, 
                      text_size = text_size, 
                      text_x_align = align, 
                      label_width = width, 
                      wrap_width = wrap_width, 
                      enable_select = False, 
                      enable_double_click = False)
        return label

    def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH):
        if len(items) == 0:
            return None

        combo = ComboBox(items = items, select_index = 0, max_width = width, fixed_width = width)
        combo.set_size_request(width, WIDGET_HEIGHT)
        return combo

    def __setup_toggle(self):
        toggle = ToggleButton(app_theme.get_pixbuf("toggle_button/inactive_normal.png"), 
            app_theme.get_pixbuf("toggle_button/active_normal.png"))
        return toggle

    def __setup_title_align(self, pixbuf, text, padding_top=FRAME_TOP_PADDING, padding_left=0):
        align = self.__setup_align(padding_top = padding_top, padding_left = padding_left)          
        align_box = gtk.VBox(spacing = WIDGET_SPACING)           
        title_box = gtk.HBox(spacing = WIDGET_SPACING)        
        image = ImageBox(pixbuf)
        label = self.__setup_title_label(text)
        separator = self.__setup_separator()               
        self.__widget_pack_start(title_box, [image, label])                  
        self.__widget_pack_start(align_box, [title_box, separator])
        align.add(align_box)
        return align
    
    def __setup_align(self, 
                      xalign=0, 
                      yalign=0, 
                      xscale=0, 
                      yscale=0, 
                      padding_top=0, 
                      padding_bottom=0, 
                      padding_left=FRAME_LEFT_PADDING + int(WIDGET_SPACING / 2), 
                      padding_right=0):
        align = gtk.Alignment()
        align.set(xalign, yalign, xscale, yscale)
        align.set_padding(padding_top, padding_bottom, padding_left, padding_right)
        align.connect("expose-event", self.__expose)
        return align

    def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False):
        if parent_widget == None:
            return
        for item in widgets:
            parent_widget.pack_start(item, expand, fill)
예제 #23
0
    def __init__(self):
        super(PreferenceDialog, self).__init__(_("Preference"), 575, 495, 
                                               mask_type=DIALOG_MASK_MULTIPLE_PAGE,
                                               close_callback=self.hide_all)
        
        self.set_position(gtk.WIN_POS_CENTER)
        
        self.main_box = gtk.VBox()
        close_button = Button(_("Close"))
        close_button.connect("clicked", lambda w: self.hide_all())
        
        # Init widget.
        self.general_setting = GeneralSetting()
        self.hotkey_setting = HotKeySetting()
        self.desktop_lyrics_setting = DesktopLyricsSetting()
        self.scroll_lyrics_setting = ScrollLyricsSetting()
        
        # Category bar
        self.category_bar = TreeView(font_x_padding=20)
        self.category_bar.draw_mask = self.draw_treeview_mask
        self.general_category_item = CategoryItem(_("General"), self.general_setting)
        self.category_bar.add_item(None, self.general_category_item)
        self.category_bar.add_item(None, CategoryItem(_("Hotkeys"), self.hotkey_setting))
        lyrics_node = self.category_bar.add_item(None, CategoryItem(_("Lyrics")))
        self.category_bar.add_item(lyrics_node, CategoryItem(_("Desktop"), self.desktop_lyrics_setting))
        self.category_bar.add_item(lyrics_node, CategoryItem(_("Window"), self.scroll_lyrics_setting))
        self.category_bar.add_item(None, CategoryItem(_("About us"), AboutBox()))
        self.category_bar.connect("single-click-item", self.category_single_click_cb)
        self.category_bar.set_highlight_index(0)
        
        category_box = gtk.VBox()
        background_box = BackgroundBox()
        background_box.set_size_request(132, 11)
        background_box.draw_mask = self.draw_treeview_mask
        category_box.pack_start(background_box, False, False)
        
        category_scrolled_window = ScrolledWindow()
        category_scrolled_window.add_child(self.category_bar)
        category_scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
        category_scrolled_window.set_size_request(132, 516)
        
        category_scrolled_window_align = gtk.Alignment()
        category_scrolled_window_align.set(0, 0, 1, 1,)
        category_scrolled_window_align.set_padding(0, 1, 0, 0)
        category_scrolled_window_align.add(category_scrolled_window)
        
        category_box.pack_start(category_scrolled_window_align, True, True)
        
        # Pack widget.
        left_box = gtk.VBox()
        self.right_box = gtk.VBox()
        left_box.add(category_box)
        self.right_box.add(self.general_category_item.get_allocated_widget())
        right_align = gtk.Alignment()
        right_align.set_padding(0, 0, 10, 0)
        right_align.add(self.right_box)

        body_box = gtk.HBox()
        body_box.pack_start(left_box, False, False)
        body_box.pack_start(right_align, False, False)
        self.main_box.add(body_box)
        
        # DialogBox code.
        self.body_box.pack_start(self.main_box, True, True)
        self.right_button_box.set_buttons([close_button])        
예제 #24
0
 def get_webcasts_view(self):
     webcast_view = MultiDragWebcastView()
     scrolled_window = ScrolledWindow(0, 0)
     scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_child(webcast_view)
     return webcast_view, scrolled_window
예제 #25
0
class SettingUI(gtk.Alignment):
    def __init__(self, slide_back_cb, change_crumb_cb):
        gtk.Alignment.__init__(self, 0, 0, 0, 0)
        self.slide_back = slide_back_cb
        self.change_crumb = change_crumb_cb

        self.scroll_win = ScrolledWindow()
        self.scroll_win.set_can_focus(False)

        self.scroll_win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        main_vbox = gtk.VBox()
        self.foot_box = FootBox()
        self.hbox = gtk.HBox()

        self.scroll_win.add_with_viewport(self.hbox)
        self.scroll_align = gtk.Alignment()
        self.scroll_win.set_size_request(800, 435)
        self.scroll_align.set(0, 0, 0, 0)
        self.scroll_align.set_padding(0, 0, 30, 0)
        self.scroll_align.add(self.scroll_win)

        padding_align = gtk.Alignment(0, 0, 0, 0)
        padding_align.set_padding(15, 0, 0, 0)
        self.sidebar = SideBar(None)
        padding_align.add(self.sidebar)
        self.hpaned = MyPaned()
        self.hpaned.set_size_request(800, -1)
        self.hpaned.connect("expose-event", self.expose_line)
        #self.hpaned.do_enter_notify_event = self.enter_notify_event
        self.hpaned.add1(padding_align)
        self.hpaned.add2(self.scroll_align)
        self.connect_after("show", self.__init_paned)
        main_vbox.pack_start(self.hpaned, True, True)
        main_vbox.pack_start(self.foot_box, False, False)
        self.add(main_vbox)

        self.__init_signals()

    def enter_notify_event(self, e):
        pass

    def __init_paned(self, widget):
        log.debug("")
        self.hpaned.saved_position = 160
        self.hpaned.set_position(1)
        self.hpaned.animation_position_frames = [0]
        self.hpaned.update_position()

    def __init_signals(self):
        Dispatcher.connect("connection-change", self.switch_content)
        Dispatcher.connect("setting-saved", self.save_connection_setting)
        Dispatcher.connect("setting-appled", self.apply_connection_setting)
        Dispatcher.connect("request_redraw",
                           lambda w: self.scroll_win.show_all())

    def load_module(self, module_obj, hide_left):
        # create a reference
        self.setting_group = module_obj

        # init paned
        self.__init_paned(None)
        log.info("dss start load module", module_obj)
        self.hpaned.set_button_show(hide_left)

        # init foot_box
        self.foot_box.set_setting(module_obj)

        # init sidebar
        self.sidebar.load_list(module_obj)
        self.apply_method = module_obj.apply_changes
        self.save_method = module_obj.save_changes

    def switch_content(self, widget, connection):
        container_remove_all(self.hbox)
        self.set_tab_content(connection)
        self.set_foot_bar_button(connection)

        self.focus_connection = connection

    def set_foot_bar_button(self, connection):
        if type(connection) == NMRemoteConnection:
            self.foot_box.show_delete(connection)
        else:
            self.foot_box.hide_delete()
        states = self.setting_group.get_button_state(connection)
        if states:
            Dispatcher.set_button(*states)

    def set_tab_content(self, connection):
        log.debug("set tab content", connection)
        setting = self.setting_group.init_items(connection)
        self.hbox.add(setting)
        self.hbox.show_all()
        self.foot_box.set_lock(False)

    def expose_line(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation
        style.draw_out_line(cr, rect, exclude=["left", "right", "top"])

    def draw_tab_title_background(self, cr, widget):
        rect = widget.allocation
        cr.set_source_rgb(1, 1, 1)
        cr.rectangle(0, 0, rect.width, rect.height - 1)
        cr.fill()

    def save_connection_setting(self, widget):
        self.save_method(self.focus_connection)

    def apply_connection_setting(self, widget):
        #print type(self.focus_connection)
        self.apply_method(self.focus_connection)

    def create_new_connection(self):
        self.sidebar.add_new_connection()
예제 #26
0
class ThemePage(gtk.VBox):
    '''
    class docs
    '''
    def __init__(self):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.status_box = StatusBox()

        self.scroll = ScrolledWindow()
        self.scroll.set_size_request(800, 432)
        self.scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)

        self.label_padding_x = 10
        self.label_padding_y = 10

        self.theme_box = gtk.VBox()
        self.user_theme_label = Label(
            _("My Themes"),
            text_size=TITLE_FONT_SIZE,
            text_color=app_theme.get_color("globalTitleForeground"))
        self.user_theme_view = UserThemeView(status_box=self.status_box)
        self.user_theme_scrolledwindow = self.user_theme_view.get_scrolled_window(
        )

        self.system_theme_label = Label(
            _("System Themes"),
            text_size=TITLE_FONT_SIZE,
            text_color=app_theme.get_color("globalTitleForeground"))
        self.system_theme_view = SystemThemeView(status_box=self.status_box)
        self.system_theme_scrolledwindow = self.system_theme_view.get_scrolled_window(
        )

        self.theme_box.pack_start(self.user_theme_label, False, False)
        self.theme_box.pack_start(get_separator(), False, False)
        self.theme_box.pack_start(self.user_theme_scrolledwindow, False, False)

        self.theme_box.pack_start(self.system_theme_label, False, False)
        self.theme_box.pack_start(get_separator(), False, False)
        self.theme_box.pack_start(self.system_theme_scrolledwindow, True, True)

        main_align = gtk.Alignment()
        main_align.set_padding(15, 0, 20, 20)
        main_align.set(1, 1, 1, 1)
        main_align.add(self.theme_box)

        self.scroll.add_child(main_align)

        main_align.connect("expose-event", self.expose_label_align)

        self.pack_start(self.scroll, False, False)
        self.pack_start(self.status_box)

    def expose_label_align(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation

        self.draw_mask(cr, rect.x, rect.y, rect.width, rect.height)

    def draw_mask(self, cr, x, y, w, h):
        '''
        Draw mask interface.
        
        @param cr: Cairo context.
        @param x: X coordiante of draw area.
        @param y: Y coordiante of draw area.
        @param w: Width of draw area.
        @param h: Height of draw area.
        '''
        cr.set_source_rgb(1, 1, 1)
        cr.rectangle(x, y, w, h)
        cr.fill()
예제 #27
0
class PlaylistItem(gobject.GObject):
    
    def __init__(self, playlist):
        '''Init song item.'''
        self.item_id = None
        self.main_box = gtk.VBox()
        self.update(playlist)        
        self.create_jobs_box()


    def draw_mask(self, widget, event):            
        cr = widget.window.cairo_create()
        rect = widget.allocation
        draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "layoutMiddle")
        
    def create_jobs_box(self):    
        
        self.file_job_button = self.create_job_button("plus", _("Add Music"), self.song_view.recursion_add_dir)
        # self.file_job_button.connect("clicked", self.open_file_or_dir)

        self.job_box = gtk.EventBox()
        self.job_box.set_size_request(220, -1)
        targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2), ("text/plain", 0, 3)]
        self.job_box.drag_dest_set(gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_DROP,
                           targets, gtk.gdk.ACTION_COPY)
        self.job_box.set_visible_window(False)
        self.job_box.connect("drag-data-received", self.song_view.on_drag_data_received)
        
        # Content box. 
        
        content_box = gtk.VBox()
        content_box.pack_start(create_bottom_align(), True, True)
        # content_box.pack_start(ImageBox(app_theme.get_pixbuf("jobs/scan_tip.png")), False, False)
        content_box.pack_start(self.file_job_button, False, False)
        content_box.pack_start(create_upper_align(), True, True)
        
        # Rind box.
        rind_box = gtk.HBox()
        rind_box.pack_start(create_right_align(), True, True)
        rind_box.pack_start(content_box, False, False)
        rind_box.pack_start(create_left_align(), True, True)
        
        self.job_box.add(rind_box)
        self.jobs_align = gtk.Alignment()
        self.jobs_align.set(0.5, 0.5, 1, 1)
        self.jobs_align.add(self.job_box)
        self.jobs_align.connect("expose-event", self.draw_mask)
        
    def create_job_button(self, icon_name, content, callback=None):    
        button = ComplexButton(
            [app_theme.get_pixbuf("jobs/complex_normal.png"),
             app_theme.get_pixbuf("jobs/complex_hover.png"),
             app_theme.get_pixbuf("jobs/complex_press.png")],
            app_theme.get_pixbuf("jobs/%s.png" % icon_name),
            content
            )
        if callback:
            button.connect("clicked", lambda w : callback())
        return button    
        
    def set_title(self, value):    
        self.title = value
        
    def get_title(self):    
        return self.title
    
    def get_left_image(self):
        return None
    
    def get_has_arrow(self):
        return None
    
    def set_item_id(self, index):
        self.item_id = index
        
    def get_item_id(self):    
        return self.item_id
        
    def update(self, playlist):
        '''update'''
        self.playlist = playlist
        songs = self.playlist.get_songs()
        self.song_view = SongView()
        self.song_view.add_songs(songs)
        self.song_view.connect("begin-add-items", lambda w: self.switch_it())
        self.song_view.connect("empty-items", lambda w: self.switch_it(False))
        self.scrolled_window = ScrolledWindow(0, 0)
        self.scrolled_window.add_child(self.song_view)
        self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.scrolled_window.set_size_request(220, -1)
        self.title = playlist.get_name()
        
    def get_list_widget(self):
        if self.get_songs():
            switch_box(self.main_box, self.scrolled_window)
        else:    
            switch_box(self.main_box, self.jobs_align)
        return self.main_box    
    
    def switch_it(self, scrolled_window=True):
        if scrolled_window:
            switch_box(self.main_box, self.scrolled_window)
        else:    
            switch_box(self.main_box, self.jobs_align)
    
    def get_songs(self):
        if self.song_view:
            return self.song_view.get_songs()