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])
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)
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)
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()
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: 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()
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)
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)
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])
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()