def __init__(self):
        super(PreferenceDialog, self).__init__(_("Preferences"), 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()
        self.plugins_manager = PluginsManager()
        
        # Category bar
        self.category_bar = TreeView(enable_drag_drop=False, enable_multiple_select=False)
        self.category_bar.set_expand_column(0)
        self.category_bar.draw_mask = self.draw_treeview_mask
        self.category_bar.set_size_request(132, 516)
        self.category_bar.connect("single-click-item", self.on_categorybar_single_click)

        # Init catagory bar.
        self.__init_category_bar()
        
        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_bar_align = gtk.Alignment()
        category_bar_align.set(0, 0, 1, 1,)
        category_bar_align.set_padding(0, 1, 0, 0)
        category_bar_align.add(self.category_bar)
        category_box.pack_start(category_bar_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_setting)
        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])        
Esempio n. 2
0
    def init_recommend_page(self):
        self.recommend_scrolled_window = ScrolledWindow()

        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask

        self.box = gtk.VBox()

        self.loading_box = LoadingBox()
        self.network_failed_box = NetworkConnectFailed(
            self.check_network_connection)
        self.network_timeout_box = NetworkConnectTimeout(
            self.check_network_connection)
        self.timeout_times = 0
        self.recommend_scrolled_window_initial = False
    def __init__(self):
        super(GuideBox, self).__init__()

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

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

        self.top_title = gtk.HBox()

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

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

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

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

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

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

        global_event.register_event('download-app-info-finish',
                                    self.update_content)
Esempio n. 4
0
    def __init__(self, session_bus):
        dbus.service.Object.__init__(self, session_bus, DSC_UPDATE_MANAGER_PATH)

        self.in_update_list = False
        self.in_upgrade_packages = False
        self.upgrade_pkg_infos = []

        self.application = Application()
        self.application.set_default_size(400, 250)
        self.application.add_titlebar(
                button_mask=['min', 'close'],
                app_name='Software Update Manager',
                )

        self.application.window.set_title("Software Update Manager")
        self.application.set_icon(get_common_image('update.png'))


        # Init page box.
        self.page_box = gtk.VBox()
        
        # Init page align.
        self.page_align = gtk.Alignment()
        self.page_align.set(0.5, 0.5, 1, 1)
        self.page_align.set_padding(0, 0, 2, 2)
        
        self.page_align.add(self.page_box)
        self.application.main_box.pack_start(self.page_align, True, True)
        
        # Init status bar.
        self.statusbar = Statusbar(28)
        status_box = gtk.HBox()

        self.statusbar.status_box.pack_start(status_box, True, True)
        self.application.main_box.pack_start(self.statusbar, False, False)

        self.background = BackgroundBox()
        self.background.draw_mask = self.draw_mask
        self.page_box.pack_start(self.background)

        self.upgrade_button = Button('更新软件')
        self.upgrade_button.set_sensitive(False)

        button_box = gtk.HBox()
        button_box.pack_start(self.upgrade_button, False, False)

        button_box_align = gtk.Alignment(0.5, 0.5, 0, 0)
        button_box_align.set_padding(3, 8, 4, 4)
        button_box_align.add(button_box)

        self.statusbar.status_item_box.pack_start(button_box_align)

        self.update_info_label = Label("初始化...")
        self.update_info_label_align = create_align((0.5, 0.5, 0, 0))
        self.update_info_label_align.add(self.update_info_label)
        
        self.upgrade_button.connect('clicked', self.upgrade_packages)
    def init_recommend_page(self):    
        self.recommend_scrolled_window = ScrolledWindow()
        
        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        
        self.box = gtk.VBox()

        self.loading_box = LoadingBox()
        self.network_failed_box = NetworkConnectFailed(self.check_network_connection)
        self.network_timeout_box = NetworkConnectTimeout(self.check_network_connection)
        self.timeout_times = 0
        self.recommend_scrolled_window_initial = False
    def __init__(self):
        super(GuideBox, self).__init__()

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

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

        self.top_title = gtk.HBox()

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

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

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

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

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

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

        global_event.register_event('download-app-info-finish', self.update_content)
Esempio n. 7
0
class RecommendItem(TreeItem):
    '''
    class docs
    '''
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        TreeItem.__init__(self)
        self.name = _("Home")
        self.data_manager = data_manager
        self.recommend_status = recommend_status

        self.page_cache = {}
        self.page_name = ['recommend', 'album', 'download_rank']

        self.init_recommend_page()
        global_event.register_event('download-home-infos-finish',
                                    self.update_home_page)

    def init_recommend_page(self):
        self.recommend_scrolled_window = ScrolledWindow()

        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask

        self.box = gtk.VBox()

        self.loading_box = LoadingBox()
        self.network_failed_box = NetworkConnectFailed(
            self.check_network_connection)
        self.network_timeout_box = NetworkConnectTimeout(
            self.check_network_connection)
        self.timeout_times = 0
        self.recommend_scrolled_window_initial = False

    @post_gui
    def update_home_page(self, data):

        if not data:
            self.check_network_connection()
            return

        slide_infos = sort_for_home_page_data(data['slide'])
        self.slider_switcher = IndexSlideSwitcher(slide_infos)
        self.slider_switcher.connect(
            "motion-notify-index",
            lambda w, i: global_event.emit("set-cursor", gtk.gdk.HAND2))
        self.slider_switcher.connect(
            "button-press-index", lambda w, i: global_event.emit(
                "switch-to-detail-page", slide_infos[i][0]))
        self.slider_switcher.connect(
            "leave-notify-index",
            lambda w, i: global_event.emit("set-cursor", None))

        self.recommend_infos = sort_for_home_page_data(data['recommend'])
        self.tab_switcher = TabSwitcher(
            [_("Recommendations"),
             _("HotApps"),
             _("Download rank")], CATEGORY_ITEM_NAME_SIZE)
        self.tab_switcher_align = gtk.Alignment()
        self.tab_switcher_align.set(0.5, 0.5, 1, 1)
        self.tab_switcher_align.set_padding(10, 0, 0, 9)
        self.tab_switcher_align.add(self.tab_switcher)
        self.tab_switcher_pages_callback = [
            "get_pkg_icon_view_page",
            "get_album_page",
            "get_download_rank_page",
        ]

        self.page_box = gtk.VBox()
        self.box.pack_start(self.slider_switcher, False, False)
        self.box.pack_start(self.tab_switcher_align, False, False)

        self.box_align = gtk.Alignment()
        self.box_align.set(0.5, 0.5, 1, 1)
        self.box_align.set_padding(5, 0, 10, 11)
        self.box_align.add(self.box)

        self.page_box_align = gtk.Alignment()
        self.page_box_align.set(0.5, 0, 1, 1)
        self.page_box_align.add(self.page_box)

        self.background_box.pack_start(self.box_align, False, False)
        self.background_box.pack_start(self.page_box_align)

        self.recommend_scrolled_window.add_child(self.background_box)
        self.switch_page(0)

        self.tab_switcher.connect(
            "tab-switch-start",
            lambda switcher, page_index: self.switch_page(page_index))
        self.tab_switcher.connect(
            "click-current-tab",
            lambda switcher, page_index: self.click_page())
        self.switch_page_view(self.recommend_scrolled_window)
        self.recommend_scrolled_window_initial = True

    def try_fetch_data(self):
        FetchHomeData(LANGUAGE, self.recommend_status).start()
        self.timeout_times += 1

    def check_network_connection(self):
        if is_network_connected():
            if self.timeout_times < NETWORK_TRY_TIMES:
                self.network_connected_flag = True
                self.switch_page_view(self.loading_box)
                self.try_fetch_data()
            else:
                self.network_connected_flag = False
                self.switch_page_view(self.network_timeout_box)
                self.timeout_times = 0
        else:
            self.network_connected_flag = False
            self.switch_page_view(self.network_failed_box)

    def switch_page_view(self, view):
        global_event.emit('show-pkg-view', view)

    def render_name(self, cr, rect):
        text_color = "#333333"
        font_image_color = app_theme.get_color("sidebar_select").get_color()
        if self.is_select:
            cr.set_source_rgba(*color_hex_to_cairo(
                app_theme.get_color("sidebar_select").get_color()))
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
            cr.fill()

            text_color = "#FFFFFF"
            font_image_color = "#FFFFFF"
        elif self.is_hover:
            cr.set_source_rgba(*color_hex_to_cairo(
                app_theme.get_color("sidebar_hover").get_color()))
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
            cr.fill()

        pixbuf = app_theme.get_pixbuf("category/12.png").get_pixbuf()
        #draw_pixbuf(
        #cr,
        #pixbuf,
        #rect.x + 12,
        #rect.y + (rect.height - pixbuf.get_height()) / 2)

        category_img_path = os.path.join(get_parent_dir(__file__, 2), "image",
                                         "category", "1.png")
        surface = cairo.ImageSurface.create_from_png(category_img_path)
        cr.set_source_rgb(*color_hex_to_cairo(font_image_color))
        cr.mask_surface(surface, rect.x + 14, rect.y + (rect.height - 24) / 2)

        draw_text(
            cr,
            self.name,
            rect.x + pixbuf.get_width() + 22,
            rect.y,
            rect.width,
            rect.height,
            text_size=CATEGORY_ITEM_NAME_SIZE,
            text_color=text_color,
        )

    def get_height(self):
        return CATEGORY_ITEM_HEIGHT

    def get_column_widths(self):
        return [CATEGORY_ITEM_NAME_WIDTH]

    def get_column_renders(self):
        return [self.render_name]

    def hover(self, column, offset_x, offset_y):
        self.is_hover = True
        if self.redraw_request_callback:
            self.redraw_request_callback(self)

    def unhover(self, column, offset_x, offset_y):
        self.is_hover = False
        if self.redraw_request_callback:
            self.redraw_request_callback(self)

    def select(self):
        self.is_select = True
        if self.redraw_request_callback:
            self.redraw_request_callback(self)

    def unselect(self):
        self.is_select = False
        if self.redraw_request_callback:
            self.redraw_request_callback(self)

    def button_press(self, column, offset_x, offset_y):
        self.show_page()

    def get_pkg_icon_view_page(self):
        items = []
        for info in self.recommend_infos:
            items.append(RecommendIconItem(info))

        self.pkg_icon_view = IconView()
        self.pkg_icon_view.add_items(items)
        self.pkg_icon_scrolled_window = ScrolledWindow()
        self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view)
        self.pkg_icon_view.draw_mask = self.draw_mask

        self.pkg_icon_view_align = gtk.Alignment()
        self.pkg_icon_view_align.set(0.5, 0.5, 1, 1)
        self.pkg_icon_view_align.set_padding(6, 0, 1, 11)
        self.pkg_icon_view_align.add(self.pkg_icon_scrolled_window)
        return self.pkg_icon_view_align

    def get_download_rank_page(self):
        self.download_rank_page = DownloadRankPage(self.data_manager)
        return self.download_rank_page

    def get_album_page(self):
        self.album_page = AlbumPage(self.data_manager)
        return self.album_page

    # from deepin_utils.date_time import print_exec_time
    # @print_exec_time
    def show_page(self):
        if self.recommend_scrolled_window_initial:
            global_event.emit("show-pkg-view", self.recommend_scrolled_window)
        else:
            self.check_network_connection()

    def draw_blank_mask(self, cr, x, y, w, h):
        pass

    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.
        '''
        draw_vlinear(cr, x, y, w, h, [
            (0, ("#FFFFFF", 0.9)),
            (1, ("#FFFFFF", 0.9)),
        ])

    def click_page(self):
        pass
        #if isinstance(self.active_page, AlbumPage) and self.active_page.in_detail_view:
        #self.active_page.switch_to_album_summary_view()

    def switch_page(self, page_index):
        container_remove_all(self.page_box)
        page_name = self.page_name[page_index]

        if not self.page_cache.has_key(self.page_name[page_index]):
            self.page_cache[page_name] = getattr(
                self, self.tab_switcher_pages_callback[page_index])()

        self.active_page = self.page_cache[page_name]
        self.page_box.pack_start(self.active_page, True, True)

        #if isinstance(self.active_page, AlbumPage):
        #if self.active_page.in_detail_view:
        #self.active_page.switch_to_album_summary_view()

        self.recommend_scrolled_window.show_all()
Esempio n. 8
0
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        # Init.
        gtk.HBox.__init__(self)
        self.data_manager = data_manager
        self.recommend_status = recommend_status

        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        self.sidebar_box = gtk.VBox()
        self.page_box = gtk.VBox()
        self.sidebar_box.set_size_request(CATEGORY_VIEW_WIDTH, -1)

        self.canopy = gtk.VBox()
        self.canopy.set_size_request(-1, 19)

        self.search_align = gtk.Alignment()
        self.search_align.set(0.5, 0.5, 0, 0)
        self.search_align.set_padding(15, 5, 13, 13)
        self.search_align.add(search_entry)

        self.in_press = False
        self.press_return = False
        self.press_id = 0
        self.show_timeout_id = None
        self.entry_changed = False

        search_entry.entry.connect("changed", self.search_entry_changed)
        search_entry.entry.connect("key-press-event",
                                   self.search_entry_key_press)
        search_entry.entry.connect("key-release-event",
                                   self.search_entry_key_release)
        search_entry.connect(
            "action-active",
            lambda entry, search_string: self.show_search_page(search_string))
        search_entry.entry.connect(
            "press-return",
            lambda entry: self.show_search_page(entry.get_text(), True))

        self.recommend_item = RecommendItem(data_manager,
                                            self.recommend_status)

        category_items = []
        for (index, first_category_name) in enumerate(
                data_manager.get_first_category()):
            category_items.append(
                CategoryItem(index + 1, first_category_name, data_manager))

        self.category_view = TreeView(
            [self.recommend_item] + category_items,
            enable_drag_drop=False,
            enable_multiple_select=False,
            expand_column=0,
        )
        self.category_view.draw_mask = self.draw_mask
        self.category_view.set_size_request(-1, 470)

        self.category_view_align = gtk.Alignment()
        self.category_view_align.set(0.5, 0.5, 1, 1)
        self.category_view_align.set_padding(10, 10, 0, 0)
        self.category_view_align.add(self.category_view)

        self.background_box.pack_start(self.canopy, False, False)
        self.background_box.pack_start(self.search_align, True, True)
        self.background_box.pack_end(self.category_view_align, False, False)
        self.sidebar_box.pack_start(self.background_box, False, False)

        self.split_line = gtk.VBox()
        self.split_line.set_size_request(1, -1)

        self.pack_start(self.sidebar_box, False, False)
        self.pack_start(self.split_line, False, False)
        self.pack_start(self.page_box, True, True)

        self.canopy.connect("expose-event", self.expose_canopy)
        self.split_line.connect("expose-event", self.expose_split_line)

        global_event.register_event("show-pkg-view", self.show_pkg_view)
        global_event.register_event("category-expand",
                                    self.category_expand_handler)
Esempio n. 9
0
class HomePage(gtk.HBox):
    '''
    class docs
    '''
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        # Init.
        gtk.HBox.__init__(self)
        self.data_manager = data_manager
        self.recommend_status = recommend_status

        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        self.sidebar_box = gtk.VBox()
        self.page_box = gtk.VBox()
        self.sidebar_box.set_size_request(CATEGORY_VIEW_WIDTH, -1)

        self.canopy = gtk.VBox()
        self.canopy.set_size_request(-1, 19)

        self.search_align = gtk.Alignment()
        self.search_align.set(0.5, 0.5, 0, 0)
        self.search_align.set_padding(15, 5, 13, 13)
        self.search_align.add(search_entry)

        self.in_press = False
        self.press_return = False
        self.press_id = 0
        self.show_timeout_id = None
        self.entry_changed = False

        search_entry.entry.connect("changed", self.search_entry_changed)
        search_entry.entry.connect("key-press-event",
                                   self.search_entry_key_press)
        search_entry.entry.connect("key-release-event",
                                   self.search_entry_key_release)
        search_entry.connect(
            "action-active",
            lambda entry, search_string: self.show_search_page(search_string))
        search_entry.entry.connect(
            "press-return",
            lambda entry: self.show_search_page(entry.get_text(), True))

        self.recommend_item = RecommendItem(data_manager,
                                            self.recommend_status)

        category_items = []
        for (index, first_category_name) in enumerate(
                data_manager.get_first_category()):
            category_items.append(
                CategoryItem(index + 1, first_category_name, data_manager))

        self.category_view = TreeView(
            [self.recommend_item] + category_items,
            enable_drag_drop=False,
            enable_multiple_select=False,
            expand_column=0,
        )
        self.category_view.draw_mask = self.draw_mask
        self.category_view.set_size_request(-1, 470)

        self.category_view_align = gtk.Alignment()
        self.category_view_align.set(0.5, 0.5, 1, 1)
        self.category_view_align.set_padding(10, 10, 0, 0)
        self.category_view_align.add(self.category_view)

        self.background_box.pack_start(self.canopy, False, False)
        self.background_box.pack_start(self.search_align, True, True)
        self.background_box.pack_end(self.category_view_align, False, False)
        self.sidebar_box.pack_start(self.background_box, False, False)

        self.split_line = gtk.VBox()
        self.split_line.set_size_request(1, -1)

        self.pack_start(self.sidebar_box, False, False)
        self.pack_start(self.split_line, False, False)
        self.pack_start(self.page_box, True, True)

        self.canopy.connect("expose-event", self.expose_canopy)
        self.split_line.connect("expose-event", self.expose_split_line)

        global_event.register_event("show-pkg-view", self.show_pkg_view)
        global_event.register_event("category-expand",
                                    self.category_expand_handler)

    def category_expand_handler(self, item):
        self.category_view.visible_item(item.child_items[-1])

    def jump_to_category(self, first_category_name, second_category_name):

        for item in self.category_view.visible_items:
            if isinstance(item, CategoryItem) and item.is_expand:
                item.unexpand()

        for item in self.category_view.visible_items:
            if isinstance(
                    item, CategoryItem
            ) and item.first_category_name == first_category_name:
                item.expand()
                break

        for item in self.category_view.visible_items:
            if isinstance(
                    item, SecondCategoryItem
            ) and item.second_category_name == second_category_name:
                self.category_view.select_items([item])
                self.category_view.visible_item(item)
                item.button_press(0, 0, 0)
                break

    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.
        '''
        sidebar_color = app_theme.get_color("sidebar_background").get_color()
        draw_vlinear(cr, x, y, w, h, [
            (0, (sidebar_color, 0.9)),
            (1, (sidebar_color, 0.9)),
        ])

    def expose_canopy(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation
        canopy_color = app_theme.get_color("sidebar_select").get_color()

        canopy_img_blue_path = os.path.join(get_parent_dir(__file__,
                                                           2), "image",
                                            "canopy", "canopy-blue.png")
        canopy_img_yellow_path = os.path.join(get_parent_dir(__file__,
                                                             2), "image",
                                              "canopy", "canopy-yellow.png")

        draw_pixbuf(cr, gtk.gdk.pixbuf_new_from_file(canopy_img_yellow_path),
                    rect.x, rect.y)

        surface = cairo.ImageSurface.create_from_png(canopy_img_blue_path)
        cr.set_source_rgb(*color_hex_to_cairo(canopy_color))
        cr.mask_surface(surface, rect.x, rect.y)

    def expose_split_line(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation

        cr.set_source_rgb(*color_hex_to_cairo("#e5e5e5"))
        cr.rectangle(rect.x, rect.y, 1, rect.height)
        cr.fill()

        return True

    def search_entry_changed(self, entry, entry_string):
        self.press_id += 1
        self.press_return = False
        self.entry_changed = True

    def search_entry_key_press(self, widget, event):
        self.in_press = True
        self.press_id += 1

        remove_timeout_id(self.show_timeout_id)

    def search_entry_key_release(self, widget, event):
        self.in_press = False
        press_id = copy.deepcopy(self.press_id)
        remove_timeout_id(self.show_timeout_id)
        self.show_timeout_id = gobject.timeout_add(
            200, lambda: self.popup_completion(press_id))

    def popup_completion(self, press_id):
        if (not self.in_press) and (
                not self.press_return
        ) and press_id == self.press_id and self.entry_changed:
            search_string = search_entry.get_text()
            if len(search_string.strip()) >= 3:
                match_pkgs = self.data_manager.get_pkgs_match_input(
                    search_string)
                if len(match_pkgs) > 0:
                    completion_window.show(search_string, match_pkgs)
                else:
                    completion_grab_window.popup_grab_window_focus_out()
            else:
                completion_grab_window.popup_grab_window_focus_out()

            self.entry_changed = False

    def show_search_page(self, search_string, press_return=False):
        if search_string.strip() != "":
            self.category_view.unselect_all()

            self.press_return = press_return

            if self.press_return:
                completion_grab_window.popup_grab_window_focus_out()

            search_page = SearchPage(self.data_manager)
            self.show_pkg_view(search_page)
            search_page.update(
                map(lambda word: word.encode("utf8"),
                    search_string.split(" ")))
        else:
            global_logger.warn("empty string in search text input")

    def show_pkg_view(self, widget):
        container_remove_all(self.page_box)
        self.page_box.pack_start(widget, True, True)

        self.page_box.show_all()
class RecommendItem(TreeItem):
    '''
    class docs
    '''
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        TreeItem.__init__(self)
        self.name = _("Home")
        self.data_manager = data_manager
        self.recommend_status = recommend_status
        
        self.page_cache = {}
        self.page_name = ['recommend', 'album', 'download_rank']
        
        self.init_recommend_page()
        global_event.register_event('download-home-infos-finish', self.update_home_page)
        
    def init_recommend_page(self):    
        self.recommend_scrolled_window = ScrolledWindow()
        
        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        
        self.box = gtk.VBox()

        self.loading_box = LoadingBox()
        self.network_failed_box = NetworkConnectFailed(self.check_network_connection)
        self.network_timeout_box = NetworkConnectTimeout(self.check_network_connection)
        self.timeout_times = 0
        self.recommend_scrolled_window_initial = False

    @post_gui
    def update_home_page(self, data):

        if not data:
            self.check_network_connection()
            return

        slide_infos = sort_for_home_page_data(data['slide'])
        self.slider_switcher = IndexSlideSwitcher(slide_infos)
        self.slider_switcher.connect("motion-notify-index", 
                lambda w, i: global_event.emit("set-cursor", gtk.gdk.HAND2))
        self.slider_switcher.connect("button-press-index", 
                lambda w, i: global_event.emit("switch-to-detail-page", slide_infos[i][0]))
        self.slider_switcher.connect("leave-notify-index", lambda w, i: global_event.emit("set-cursor", None))

        self.recommend_infos = sort_for_home_page_data(data['recommend'])
        self.tab_switcher = TabSwitcher([_("Recommendations"), _("Topics"), _("Download rank")], CATEGORY_ITEM_NAME_SIZE)
        self.tab_switcher_align = gtk.Alignment()
        self.tab_switcher_align.set(0.5, 0.5, 1, 1)
        self.tab_switcher_align.set_padding(10, 0, 0, 9)
        self.tab_switcher_align.add(self.tab_switcher)
        self.tab_switcher_pages_callback = [
                "get_pkg_icon_view_page",
                "get_album_page",
                "get_download_rank_page",
                ]
        
        self.page_box = gtk.VBox()
        self.box.pack_start(self.slider_switcher, False, False)
        self.box.pack_start(self.tab_switcher_align, False, False)
        
        self.box_align = gtk.Alignment()
        self.box_align.set(0.5, 0.5, 1, 1)
        self.box_align.set_padding(5, 0, 10, 11)
        self.box_align.add(self.box)

        self.page_box_align = gtk.Alignment()
        self.page_box_align.set(0.5, 0, 1, 1)
        self.page_box_align.add(self.page_box)

        self.background_box.pack_start(self.box_align, False, False)
        self.background_box.pack_start(self.page_box_align)
        
        self.recommend_scrolled_window.add_child(self.background_box)
        self.switch_page(0)
        
        self.tab_switcher.connect("tab-switch-start", lambda switcher, page_index: self.switch_page(page_index))
        self.tab_switcher.connect("click-current-tab", lambda switcher, page_index: self.click_page())
        self.switch_page_view(self.recommend_scrolled_window)
        self.recommend_scrolled_window_initial = True
    
    def try_fetch_data(self):
        FetchHomeData(LANGUAGE, self.recommend_status).start()
        self.timeout_times += 1

    def check_network_connection(self):
        if is_network_connected():
            if self.timeout_times < NETWORK_TRY_TIMES:
                self.network_connected_flag = True
                self.switch_page_view(self.loading_box)
                self.try_fetch_data()
            else:
                self.network_connected_flag = False
                self.switch_page_view(self.network_timeout_box)
                self.timeout_times = 0
        else:    
            self.network_connected_flag = False
            self.switch_page_view(self.network_failed_box)

    def switch_page_view(self, view):
        global_event.emit('show-pkg-view', view)
    
    def render_name(self, cr, rect):
        text_color = "#333333"
        font_image_color = app_theme.get_color("sidebar_select").get_color()
        if self.is_select:
            cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_select").get_color()))
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
            cr.fill()
            
            text_color = "#FFFFFF"
            font_image_color = "#FFFFFF"
        elif self.is_hover:
            cr.set_source_rgba(*color_hex_to_cairo(app_theme.get_color("sidebar_hover").get_color()))
            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
            cr.fill()
        
        pixbuf = app_theme.get_pixbuf("category/12.png").get_pixbuf()
        #draw_pixbuf(
            #cr,
            #pixbuf,
            #rect.x + 12,
            #rect.y + (rect.height - pixbuf.get_height()) / 2)
        
        category_img_path = os.path.join(get_parent_dir(__file__, 2), "image", "category", "1.png")
        surface = cairo.ImageSurface.create_from_png(category_img_path)
        cr.set_source_rgb(*color_hex_to_cairo(font_image_color))
        cr.mask_surface(surface, rect.x+14, rect.y+(rect.height-24)/2)

        draw_text(cr, 
                  self.name,
                  rect.x + pixbuf.get_width() + 22,
                  rect.y,
                  rect.width,
                  rect.height,
                  text_size=CATEGORY_ITEM_NAME_SIZE,
                  text_color=text_color,
                  )
        
    def get_height(self):
        return CATEGORY_ITEM_HEIGHT
    
    def get_column_widths(self):
        return [CATEGORY_ITEM_NAME_WIDTH]
        
    def get_column_renders(self):    
        return [self.render_name]
        
    def hover(self, column, offset_x, offset_y):
        self.is_hover = True
        if self.redraw_request_callback:
            self.redraw_request_callback(self)
        
    def unhover(self, column, offset_x, offset_y):
        self.is_hover = False
        if self.redraw_request_callback:
            self.redraw_request_callback(self)
    
    def select(self):
        self.is_select = True
        if self.redraw_request_callback:
            self.redraw_request_callback(self)
        
    def unselect(self):
        self.is_select = False
        if self.redraw_request_callback:
            self.redraw_request_callback(self)
            
    def button_press(self, column, offset_x, offset_y):
        self.show_page()

    def get_pkg_icon_view_page(self):
        items = []
        for info in self.recommend_infos:
            items.append(RecommendIconItem(info))
        
        self.pkg_icon_view = IconView() 
        self.pkg_icon_view.add_items(items)
        self.pkg_icon_scrolled_window = ScrolledWindow()
        self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view)
        self.pkg_icon_view.draw_mask = self.draw_mask
        
        self.pkg_icon_view_align = gtk.Alignment()
        self.pkg_icon_view_align.set(0.5, 0.5, 1, 1)
        self.pkg_icon_view_align.set_padding(6, 0, 1, 11)
        self.pkg_icon_view_align.add(self.pkg_icon_scrolled_window)
        return self.pkg_icon_view_align

    def get_download_rank_page(self):
        self.download_rank_page = DownloadRankPage(self.data_manager)
        return self.download_rank_page
    
    def get_album_page(self):
        self.album_page = AlbumPage(self.data_manager)
        return self.album_page
        
    # from deepin_utils.date_time import print_exec_time
    # @print_exec_time
    def show_page(self):
        if self.recommend_scrolled_window_initial:        
            global_event.emit("show-pkg-view", self.recommend_scrolled_window)
        else:
            self.check_network_connection()
        
    def draw_blank_mask(self, cr, x, y, w, h):
        pass
        
    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.
        '''
        draw_vlinear(cr, x, y, w, h,
                     [(0, ("#FFFFFF", 0.9)),
                      (1, ("#FFFFFF", 0.9)),]
                     )
        
    def click_page(self):
        if isinstance(self.active_page, AlbumPage) and self.active_page.in_detail_view:
            self.active_page.switch_to_album_summary_view()
        
    def switch_page(self, page_index):
        container_remove_all(self.page_box)
        page_name = self.page_name[page_index]

        if not self.page_cache.has_key(self.page_name[page_index]):
            self.page_cache[page_name] = getattr(self, self.tab_switcher_pages_callback[page_index])()

        self.active_page = self.page_cache[page_name]
        self.page_box.pack_start(self.active_page, True, True)
        
        if isinstance(self.active_page, AlbumPage):
            if self.active_page.in_detail_view:
                self.active_page.switch_to_album_summary_view()

        self.recommend_scrolled_window.show_all()
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        # Init.
        gtk.HBox.__init__(self)
        self.data_manager = data_manager
        self.recommend_status = recommend_status
        
        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        self.sidebar_box = gtk.VBox()
        self.page_box = gtk.VBox()
        self.sidebar_box.set_size_request(CATEGORY_VIEW_WIDTH, -1)
        
        self.canopy = gtk.VBox()
        self.canopy.set_size_request(-1, 19)
        
        self.search_align = gtk.Alignment()
        self.search_align.set(0.5, 0.5, 0, 0)
        self.search_align.set_padding(15, 5, 13, 13)
        self.search_align.add(search_entry)
        
        self.in_press = False
        self.press_return = False
        self.press_id = 0
        self.show_timeout_id = None
        self.entry_changed = False
        
        search_entry.entry.connect("changed", self.search_entry_changed)
        search_entry.entry.connect("key-press-event", self.search_entry_key_press)
        search_entry.entry.connect("key-release-event", self.search_entry_key_release)
        search_entry.connect("action-active", lambda entry, search_string: self.show_search_page(search_string))
        search_entry.entry.connect("press-return", lambda entry: self.show_search_page(entry.get_text(), True))
        
        self.recommend_item = RecommendItem(data_manager, self.recommend_status)
       
        category_items = []
        for (index, first_category_name) in enumerate(data_manager.get_first_category()):
            category_items.append(CategoryItem(index+1, first_category_name, data_manager))
        
        self.category_view = TreeView(
            [self.recommend_item] + category_items,
            enable_drag_drop=False,
            enable_multiple_select=False,
            expand_column=0,
            )
        self.category_view.draw_mask = self.draw_mask
        self.category_view.set_size_request(-1, 470)

        self.category_view_align = gtk.Alignment()
        self.category_view_align.set(0.5, 0.5, 1, 1)
        self.category_view_align.set_padding(10, 10, 0, 0)
        self.category_view_align.add(self.category_view)
        
        self.background_box.pack_start(self.canopy, False, False)
        self.background_box.pack_start(self.search_align, True, True)
        self.background_box.pack_end(self.category_view_align, False, False)
        self.sidebar_box.pack_start(self.background_box, False, False)
        
        self.split_line = gtk.VBox()
        self.split_line.set_size_request(1, -1)
        
        self.pack_start(self.sidebar_box, False, False)
        self.pack_start(self.split_line, False, False)
        self.pack_start(self.page_box, True, True)
        
        self.canopy.connect("expose-event", self.expose_canopy)
        self.split_line.connect("expose-event", self.expose_split_line)
        
        global_event.register_event("show-pkg-view", self.show_pkg_view)
        global_event.register_event("category-expand", self.category_expand_handler)
class HomePage(gtk.HBox):
    '''
    class docs
    '''
	
    def __init__(self, data_manager, recommend_status):
        '''
        init docs
        '''
        # Init.
        gtk.HBox.__init__(self)
        self.data_manager = data_manager
        self.recommend_status = recommend_status
        
        self.background_box = BackgroundBox()
        self.background_box.draw_mask = self.draw_mask
        self.sidebar_box = gtk.VBox()
        self.page_box = gtk.VBox()
        self.sidebar_box.set_size_request(CATEGORY_VIEW_WIDTH, -1)
        
        self.canopy = gtk.VBox()
        self.canopy.set_size_request(-1, 19)
        
        self.search_align = gtk.Alignment()
        self.search_align.set(0.5, 0.5, 0, 0)
        self.search_align.set_padding(15, 5, 13, 13)
        self.search_align.add(search_entry)
        
        self.in_press = False
        self.press_return = False
        self.press_id = 0
        self.show_timeout_id = None
        self.entry_changed = False
        
        search_entry.entry.connect("changed", self.search_entry_changed)
        search_entry.entry.connect("key-press-event", self.search_entry_key_press)
        search_entry.entry.connect("key-release-event", self.search_entry_key_release)
        search_entry.connect("action-active", lambda entry, search_string: self.show_search_page(search_string))
        search_entry.entry.connect("press-return", lambda entry: self.show_search_page(entry.get_text(), True))
        
        self.recommend_item = RecommendItem(data_manager, self.recommend_status)
       
        category_items = []
        for (index, first_category_name) in enumerate(data_manager.get_first_category()):
            category_items.append(CategoryItem(index+1, first_category_name, data_manager))
        
        self.category_view = TreeView(
            [self.recommend_item] + category_items,
            enable_drag_drop=False,
            enable_multiple_select=False,
            expand_column=0,
            )
        self.category_view.draw_mask = self.draw_mask
        self.category_view.set_size_request(-1, 470)

        self.category_view_align = gtk.Alignment()
        self.category_view_align.set(0.5, 0.5, 1, 1)
        self.category_view_align.set_padding(10, 10, 0, 0)
        self.category_view_align.add(self.category_view)
        
        self.background_box.pack_start(self.canopy, False, False)
        self.background_box.pack_start(self.search_align, True, True)
        self.background_box.pack_end(self.category_view_align, False, False)
        self.sidebar_box.pack_start(self.background_box, False, False)
        
        self.split_line = gtk.VBox()
        self.split_line.set_size_request(1, -1)
        
        self.pack_start(self.sidebar_box, False, False)
        self.pack_start(self.split_line, False, False)
        self.pack_start(self.page_box, True, True)
        
        self.canopy.connect("expose-event", self.expose_canopy)
        self.split_line.connect("expose-event", self.expose_split_line)
        
        global_event.register_event("show-pkg-view", self.show_pkg_view)
        global_event.register_event("category-expand", self.category_expand_handler)

    def category_expand_handler(self, item):
        self.category_view.visible_item(item.child_items[-1])
        
    def jump_to_category(self, first_category_name, second_category_name):
        
        for item in self.category_view.visible_items:
            if isinstance(item, CategoryItem) and item.is_expand:
                item.unexpand()
        
        for item in self.category_view.visible_items:
            if isinstance(item, CategoryItem) and item.first_category_name == first_category_name:
                item.expand()
                break

        for item in self.category_view.visible_items:
            if isinstance(item, SecondCategoryItem) and item.second_category_name == second_category_name:
                self.category_view.select_items([item])
                self.category_view.visible_item(item)
                item.button_press(0, 0, 0)
                break
        
    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.
        '''
        sidebar_color = app_theme.get_color("sidebar_background").get_color()
        draw_vlinear(cr, x, y, w, h,
                     [(0, (sidebar_color, 0.9)),
                      (1, (sidebar_color, 0.9)),]
                     )
        
    def expose_canopy(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation
        canopy_color = app_theme.get_color("sidebar_select").get_color()
        
        canopy_img_blue_path = os.path.join(get_parent_dir(__file__, 2), "image", "canopy", "canopy-blue.png")
        canopy_img_yellow_path = os.path.join(get_parent_dir(__file__, 2), "image", "canopy", "canopy-yellow.png")

        draw_pixbuf(
            cr,
            gtk.gdk.pixbuf_new_from_file(canopy_img_yellow_path),
            rect.x,
            rect.y)
        
        surface = cairo.ImageSurface.create_from_png(canopy_img_blue_path)
        cr.set_source_rgb(*color_hex_to_cairo(canopy_color))
        cr.mask_surface(surface, rect.x, rect.y)

    def expose_split_line(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation

        cr.set_source_rgb(*color_hex_to_cairo("#e5e5e5"))
        cr.rectangle(rect.x, rect.y, 1, rect.height)
        cr.fill()
        
        return True
        
    def search_entry_changed(self, entry, entry_string):
        self.press_id += 1
        self.press_return = False
        self.entry_changed = True
        
    def search_entry_key_press(self, widget, event):
        self.in_press = True
        self.press_id += 1
        
        remove_timeout_id(self.show_timeout_id)
        
    def search_entry_key_release(self, widget, event):
        self.in_press = False
        press_id = copy.deepcopy(self.press_id)
        remove_timeout_id(self.show_timeout_id)
        self.show_timeout_id = gobject.timeout_add(200, lambda : self.popup_completion(press_id))
        
    def popup_completion(self, press_id):
        if (not self.in_press) and (not self.press_return) and press_id == self.press_id and self.entry_changed:
            search_string = search_entry.get_text()
            if len(search_string.strip()) >= 3:
                match_pkgs = self.data_manager.get_pkgs_match_input(search_string)
                if len(match_pkgs) > 0:
                    completion_window.show(search_string, match_pkgs)
                else:
                    completion_grab_window.popup_grab_window_focus_out()
            else:
                completion_grab_window.popup_grab_window_focus_out()
                
            self.entry_changed = False
        
    def show_search_page(self, search_string, press_return=False):
        if search_string.strip() != "":
            self.category_view.unselect_all()
            
            self.press_return = press_return
            
            if self.press_return:
                completion_grab_window.popup_grab_window_focus_out()
            
            search_page = SearchPage(self.data_manager)
            self.show_pkg_view(search_page)
            search_page.update(map(lambda word: word.encode("utf8"), search_string.split(" ")))
        else:
            logger.warning("empty string in search text input")
        
    def show_pkg_view(self, widget):
        container_remove_all(self.page_box)
        self.page_box.pack_start(widget, True, True)
        
        self.page_box.show_all()
Esempio n. 13
0
class GuideBox(gtk.VBox):
    def __init__(self):
        super(GuideBox, self).__init__()

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

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

        self.top_title = gtk.HBox()

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

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

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

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

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

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

        global_event.register_event('download-app-info-finish', self.update_content)

    @post_gui
    def update_content(self, js):
        js = json.loads(js)
        self.guide_label.set_text(js['summary'])

    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.
        '''
        sidebar_color = "#ffffff"
        draw_vlinear(cr, x, y, w, h,
                     [(0, (sidebar_color, 0.9)),
                      (1, (sidebar_color, 0.9)),]
                     )
        
    def expose_top_left_icon(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation
        
        # Draw pkg icon.
        draw_pixbuf(cr,
                    self.guide_pixbuf,
                    rect.x,
                    rect.y)
Esempio n. 14
0
class GuideBox(gtk.VBox):
    def __init__(self):
        super(GuideBox, self).__init__()

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

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

        self.top_title = gtk.HBox()

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

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

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

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

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

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

        global_event.register_event('download-app-info-finish',
                                    self.update_content)

    @post_gui
    def update_content(self, js):
        js = json.loads(js)
        self.guide_label.set_text(js['summary'])

    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.
        '''
        sidebar_color = "#ffffff"
        draw_vlinear(cr, x, y, w, h, [
            (0, (sidebar_color, 0.9)),
            (1, (sidebar_color, 0.9)),
        ])

    def expose_top_left_icon(self, widget, event):
        # Init.
        cr = widget.window.cairo_create()
        rect = widget.allocation

        # Draw pkg icon.
        draw_pixbuf(cr, self.guide_pixbuf, rect.x, rect.y)
Esempio n. 15
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])        
Esempio n. 16
0
class UpdateManager(dbus.service.Object):
    def __init__(self, session_bus):
        dbus.service.Object.__init__(self, session_bus, DSC_UPDATE_MANAGER_PATH)

        self.in_update_list = False
        self.in_upgrade_packages = False
        self.upgrade_pkg_infos = []

        self.application = Application()
        self.application.set_default_size(400, 250)
        self.application.add_titlebar(
                button_mask=['min', 'close'],
                app_name='Software Update Manager',
                )

        self.application.window.set_title("Software Update Manager")
        self.application.set_icon(get_common_image('update.png'))


        # Init page box.
        self.page_box = gtk.VBox()
        
        # Init page align.
        self.page_align = gtk.Alignment()
        self.page_align.set(0.5, 0.5, 1, 1)
        self.page_align.set_padding(0, 0, 2, 2)
        
        self.page_align.add(self.page_box)
        self.application.main_box.pack_start(self.page_align, True, True)
        
        # Init status bar.
        self.statusbar = Statusbar(28)
        status_box = gtk.HBox()

        self.statusbar.status_box.pack_start(status_box, True, True)
        self.application.main_box.pack_start(self.statusbar, False, False)

        self.background = BackgroundBox()
        self.background.draw_mask = self.draw_mask
        self.page_box.pack_start(self.background)

        self.upgrade_button = Button('更新软件')
        self.upgrade_button.set_sensitive(False)

        button_box = gtk.HBox()
        button_box.pack_start(self.upgrade_button, False, False)

        button_box_align = gtk.Alignment(0.5, 0.5, 0, 0)
        button_box_align.set_padding(3, 8, 4, 4)
        button_box_align.add(button_box)

        self.statusbar.status_item_box.pack_start(button_box_align)

        self.update_info_label = Label("初始化...")
        self.update_info_label_align = create_align((0.5, 0.5, 0, 0))
        self.update_info_label_align.add(self.update_info_label)
        
        self.upgrade_button.connect('clicked', self.upgrade_packages)


    def draw_mask(self, cr, x, y, w, h):
        sidebar_color = ui_theme.get_color("menu_select_font").get_color()
        draw_vlinear(cr, x, y, w, h,
                     [(0, (sidebar_color, 0.9)),
                      (1, (sidebar_color, 0.9)),]
                     )

    def start_dsc_backend(self):
        self.system_bus = dbus.SystemBus()
        bus_object = self.system_bus.get_object(DSC_SERVICE_NAME, DSC_SERVICE_PATH)
        self.bus_interface = dbus.Interface(bus_object, DSC_SERVICE_NAME)
        self.system_bus.add_signal_receiver(
                self.backend_signal_receiver, 
                signal_name="update_signal", 
                dbus_interface=DSC_SERVICE_NAME, 
                path=DSC_SERVICE_PATH)

    def backend_signal_receiver(self, messages):
        for message in messages:
            (signal_type, action_content) = message
            
            if signal_type == "update-list-update":
                self.in_update_list = True
                message_str = "正在检查更新,请稍等...(%s%%)" % int(float(action_content[0]))
                self.update_info_label.set_text(message_str)
                self.upgrade_button.set_sensitive(False)
            elif signal_type == 'update-list-finish':
                message_str = "正在检查更新,请稍等..."
                self.update_info_label.set_text(message_str)
                self.in_update_list = False

                self.bus_interface.request_upgrade_pkgs(
                        reply_handler=self.render_upgrade_info, 
                        error_handler=lambda e:handle_dbus_error("request_upgrade_pkgs", e))
            elif signal_type == 'update-list-failed':
                message_str = '检查更新失败!'
                self.update_info_label.set_text(message_str)

            elif signal_type == 'upgrade-commit-update':
                pkg_names, action_type, percent, status = action_content
                message_str = "[%s%%]%s" % (percent, status)
                self.update_info_label.set_text(message_str)
                self.upgrade_button.set_sensitive(False)
                self.in_upgrade_packages = True

            elif signal_type == 'upgrade-commit-finish':
                self.in_upgrade_packages = False
                message_str = '软件更新完成!'
                self.update_info_label.set_text(message_str)

    def upgrade_packages(self, widget):
        if self.in_update_list:
            print 'Check update, please wait...'
        elif self.in_upgrade_packages:
            print 'Upgrade packages, please wait...'
        else:
            self.upgrade_button.set_sensitive(False)
            self.in_upgrade_packages = True
            all_upgrade_pkgs = []
            for info in self.upgrade_pkg_infos:
                all_upgrade_pkgs.append(str(eval(info)[0]))
            self.bus_interface.upgrade_pkgs_with_new_policy(
                    all_upgrade_pkgs,
                    reply_handler=lambda :handle_dbus_reply("upgrade_pkgs_with_new_policy"), 
                    error_handler=lambda e:handle_dbus_error("upgrade_pkgs_with_new_policy", e),
                    )

    def render_upgrade_info(self, pkg_infos):
        self.upgrade_pkg_infos = pkg_infos
        if len(pkg_infos) > 0:
            msg_str = '您的系统有%s个更新!' % (len(pkg_infos),)
            self.upgrade_button.set_sensitive(True)
        else:
            msg_str = '您的系统已经最新状态了~'
            self.upgrade_button.set_sensitive(False)

        self.update_info_label.set_text(msg_str)
        self.application.window.show_all()

    def run(self):
        self.start_dsc_backend()
        container_remove_all(self.background)
        self.background.pack_start(self.update_info_label_align)

        gtk.timeout_add(1000, lambda:self.bus_interface.start_update_list(
                reply_handler=lambda :handle_dbus_reply("start_update_list"),
                error_handler=lambda e:handle_dbus_error("start_update_list", e)))

        self.application.run()
        self.bus_interface.request_quit(
                reply_handler=lambda :handle_dbus_reply("request_quit"), 
                error_handler=lambda e:handle_dbus_error("request_quit", e))

    def quit(self):
        gtk.main_quit()

    @dbus.service.method(DSC_UPDATE_MANAGER_NAME, in_signature="", out_signature="")    
    def hello(self):
        self.application.window.present()