def __init__(self): DialogBox.__init__(self, _("Task Manager"), 350, 450, DIALOG_MASK_SINGLE_PAGE, modal=False, close_callback=self.hide_all) self.is_changed = False scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_align = gtk.Alignment() scrolled_align.set(1, 1, 1, 1) scrolled_align.set_padding(10, 0, 0, 0) scrolled_align.add(scrolled_window) self.jobs_view = JobsView() self.jobs_view.draw_mask = self.get_mask_func(self.jobs_view) scrolled_window.add_child(self.jobs_view) pause_button = Button(_("Pause")) pause_button.connect("clicked", self.pause_job) stop_button = Button(_("Close")) stop_button.connect("clicked", lambda w: self.hide_all()) self.body_box.add(scrolled_align) self.right_button_box.set_buttons([pause_button, stop_button]) Dispatcher.connect("transfor-job", self.add_new_job)
def __init__(self): DialogBox.__init__(self, _("Search"), 460, 300, DIALOG_MASK_SINGLE_PAGE, modal=False, window_hint=None, close_callback=self.hide_all) title_label = Label(_("Title:")) self.title_entry = TextEntry("") self.title_entry.set_size(300, 25) self.search_button = Button(_("Search")) self.search_button.connect("clicked", self.search_song) control_box = gtk.HBox(spacing=5) control_box.pack_start(title_label, False, False) control_box.pack_start(self.title_entry, False, False) control_box.pack_start(self.search_button, False, False) scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.result_view = ListView() self.result_view.connect("double-click-item", self.double_click_cb) self.result_view.draw_mask = self.get_mask_func(self.result_view) self.result_view.add_titles([_("Title"), _("Artist"), _("Album"), _("Type"), _("Size")]) scrolled_window.add_child(self.result_view) self.prompt_label = Label("") download_button = Button(_("Download")) download_button.connect("clicked", self.download_song) cancel_button = Button(_("Close")) cancel_button.connect("clicked", lambda w: self.hide_all()) self.body_box.set_spacing(5) self.body_box.pack_start(control_box, False, False) self.body_box.pack_start(scrolled_window, True, True) self.left_button_box.set_buttons([self.prompt_label]) self.right_button_box.set_buttons([download_button, cancel_button])
def get_scrolled_window(self): scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.connect("vscrollbar-state-changed", self.__on_vscrollbar_state_changed) scrolled_window.add_child(self) return scrolled_window
def get_scrolled_window(self): scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.connect("vscrollbar-state-changed", self.__on_vscrollbar_state_changed) scrolled_window.add_child(self) return scrolled_window
def __init__(self): DialogBox.__init__(self, _("Task Manager"), 350, 450, DIALOG_MASK_SINGLE_PAGE, modal=False, close_callback=self.hide_all) self.is_changed = False scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_align = gtk.Alignment() scrolled_align.set(1, 1, 1, 1) scrolled_align.set_padding(10, 0, 0, 0) scrolled_align.add(scrolled_window) self.jobs_view = JobsView() self.jobs_view.draw_mask = self.get_mask_func(self.jobs_view) scrolled_window.add_child(self.jobs_view) pause_button = Button(_("Pause")) pause_button.connect("clicked", self.pause_job) stop_button = Button(_("Close")) stop_button.connect("clicked", lambda w: self.hide_all()) self.body_box.add(scrolled_align) self.right_button_box.set_buttons([pause_button, stop_button]) Dispatcher.connect("transfor-job", self.add_new_job)
class DeviceIconView(ScrolledWindow): def __init__(self, items=None): ScrolledWindow.__init__(self, 0, 0) self.device_iconview = IconView() self.device_iconview.connect("right-click-item", self.__on_right_click_item) self.device_iconview.draw_mask = self.draw_mask if items: self.device_iconview.add_items(items) self.device_scrolledwindow = ScrolledWindow() self.device_scrolledwindow.add_child(self.device_iconview) self.add_child(self.device_scrolledwindow) event_manager.add_callback("text", self.__on_text) event_manager.add_callback("hide-text", self.__on_hide_text) def __on_text(self, name, obj, argv): disable(self, False) text(self, argv) def __on_hide_text(self, name, obj, argv): disable(self, True) def __do_remove_item(self, item): item.do_remove() self.device_iconview.delete_items([item]) def __on_right_click_item(self, widget, item, x, y): menu_items = [(None, _("Pair"), lambda: item.do_pair())] if item.is_paired: menu_items = [] menu_items.extend(item.menu_items) menu_items.append(None) menu_items.append((None, _("Remove Device"), lambda: self.__do_remove_item(item))) Menu(menu_items, True).show((int(x), int(y))) def clear(self): self.device_iconview.clear() def draw_mask(self, cr, x, y, w, h): cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(x, y, w, h) cr.fill() cr.set_source_rgb(*color_hex_to_cairo("#AEAEAE")) cr.rectangle(x, y, w, h) cr.stroke() def add_items(self, items, clear=False): if clear: self.device_iconview.clear() self.device_iconview.add_items(items)
class DeviceIconView(ScrolledWindow): def __init__(self, items=None): ScrolledWindow.__init__(self, 0, 0) self.device_iconview = IconView() self.device_iconview.connect("right-click-item", self.__on_right_click_item) self.device_iconview.draw_mask = self.draw_mask if items: self.device_iconview.add_items(items) self.device_scrolledwindow = ScrolledWindow() self.device_scrolledwindow.add_child(self.device_iconview) self.add_child(self.device_scrolledwindow) event_manager.add_callback("text", self.__on_text) event_manager.add_callback("hide-text", self.__on_hide_text) def __on_text(self, name, obj, argv): disable(self, False) text(self, argv) def __on_hide_text(self, name, obj, argv): disable(self, True) def __do_remove_item(self, item): item.do_remove() self.device_iconview.delete_items([item]) def __on_right_click_item(self, widget, item, x, y): menu_items = [(None, _("Pair"), lambda : item.do_pair())] if item.is_paired: menu_items = [] menu_items.extend(item.menu_items) menu_items.append(None) menu_items.append((None, _("Remove Device"), lambda : self.__do_remove_item(item))) Menu(menu_items, True).show((int(x), int(y))) def clear(self): self.device_iconview.clear() def draw_mask(self, cr, x, y, w, h): cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(x, y, w, h) cr.fill() cr.set_source_rgb(*color_hex_to_cairo("#AEAEAE")) cr.rectangle(x, y, w, h) cr.stroke() def add_items(self, items, clear=False): if clear: self.device_iconview.clear() self.device_iconview.add_items(items)
def __init__(self): DialogBox.__init__( self, _("Lyrics search"), 460, 300, DIALOG_MASK_MULTIPLE_PAGE, close_callback=self.hide_all, modal=False, window_hint=None, skip_taskbar_hint=False) self.artist_entry = InputEntry() self.artist_entry.set_size(130, 23) self.title_entry = InputEntry() self.title_entry.set_size(130, 23) artist_label = Label(_("Artist:")) title_label = Label(_("Title:")) right_align = gtk.Alignment() right_align.set(0, 0, 0, 1) search_button = Button(_("Search")) search_button.connect("clicked", self.search_lyric_cb) info_box = gtk.HBox(spacing=25) control_box = gtk.HBox(spacing=5) title_box = gtk.HBox(spacing=5) title_box.pack_start(title_label, False, False) title_box.pack_start(self.title_entry) artist_box = gtk.HBox(spacing=5) artist_box.pack_start(artist_label, False, False) artist_box.pack_start(self.artist_entry) control_box.pack_start(title_box, False, False) control_box.pack_start(artist_box, False, False) info_box.pack_start(control_box, False, False) info_box.pack_start(search_button, False, False) scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sort_items = [(lambda item: item.title, cmp), (lambda item: item.artist, cmp)] self.result_view = ListView(sort_items) self.result_view.connect("double-click-item", self.double_click_cb) self.result_view.add_titles([_("Title"), _("Artist")]) self.result_view.draw_mask = self.get_mask_func(self.result_view) scrolled_window.add_child(self.result_view) self.prompt_label = Label("") download_button = Button(_("Download")) download_button.connect("clicked", self.download_lyric_cb) cancel_button = Button(_("Close")) cancel_button.connect("clicked", lambda w: self.hide_all()) info_box_align = gtk.Alignment() info_box_align.set_padding(5, 0, 5, 0) info_box_align.add(info_box) self.body_box.set_spacing(5) self.body_box.pack_start(info_box_align, False, False) self.body_box.pack_start(scrolled_window, True, True) self.left_button_box.set_buttons([self.prompt_label]) self.right_button_box.set_buttons([download_button, cancel_button]) self.lrc_manager = LrcManager()
class AlbumSummaryView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.scrolled_window = ScrolledWindow() self.iconview = IconView() self.iconview.draw_mask = self.draw_mask self.scrolled_window.add_child(self.iconview) self.pack_start(self.scrolled_window, True, True) global_event.register_event('download-album-infos-finish', self.update_item) def try_fetch_data(self): FetchAlbumData(LANGUAGE).start() @post_gui def update_item(self, data): items = [] if data: for album_info in data: items.append(AlbumSummaryItem(album_info)) items.sort(key=attrgetter('album_order'), reverse=True) self.iconview.add_items(items) global_event.emit('switch-to-album-summary-view') else: global_event.emit('switch-to-network-problem-view') 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)), ])
class AlbumSummaryView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.scrolled_window = ScrolledWindow() self.iconview = IconView() self.iconview.draw_mask = self.draw_mask self.scrolled_window.add_child(self.iconview) self.pack_start(self.scrolled_window, True, True) global_event.register_event('download-album-infos-finish', self.update_item) def try_fetch_data(self): FetchAlbumData(LANGUAGE).start() @post_gui def update_item(self, data): items = [] if data: for album_info in data: items.append(AlbumSummaryItem(album_info)) items.sort(key=attrgetter('album_order'), reverse=True) self.iconview.add_items(items) global_event.emit('switch-to-album-summary-view') else: global_event.emit('switch-to-network-problem-view') 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 get_icon_view(self, padding_x=0, padding_y=10): ''' Draggable IconView ''' icon_view = IconView(padding_x, padding_y) targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)] icon_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY) icon_view.connect("drag-data-get", self.__on_drag_data_get) icon_view.connect("double-click-item", self.__on_double_click_item) icon_view.connect("single-click-item", self.__on_single_click_item) icon_view.connect("right-click-item", self.__on_right_click_item) icon_view.draw_mask = self.on_iconview_draw_mask scrolled_window = ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(icon_view) return icon_view, scrolled_window
def get_icon_view(self, padding_x=0, padding_y=10): ''' Draggable IconView ''' icon_view = IconView(padding_x, padding_y) targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)] icon_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY) icon_view.connect("drag-data-get", self.__on_drag_data_get) icon_view.connect("double-click-item", self.__on_double_click_item) icon_view.connect("single-click-item", self.__on_single_click_item) icon_view.connect("right-click-item", self.__on_right_click_item) icon_view.draw_mask = self.on_iconview_draw_mask scrolled_window = ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(icon_view) return icon_view, scrolled_window
class ConvTAskGui(DialogBox): def __init__(self): DialogBox.__init__(self, _("Task Manager for format conversion"), FORM_WIDTH, FORM_HEIGHT, mask_type=DIALOG_MASK_SINGLE_PAGE, #DIALOG_MASK_MULTIPLE_PAGE, close_callback=self.hide_all, modal=True, window_hint=gtk.gdk.WINDOW_TYPE_HINT_DIALOG, window_pos=gtk.WIN_POS_CENTER, resizable=False, ) self.init_widgets() # add widgets. self.body_box.pack_start(self.scrolled_window, False, False) def init_widgets(self): self.scrolled_window = ScrolledWindow() self.list_view = ListView() self.list_view.draw_mask = self.get_mask_func(self.list_view) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.scrolled_window.add_child(self.list_view) # self.start_btn = Button(_("Start")) self.show_time_label = Label("") self.pause_btn = Button(_("Pause")) self.close_btn = Button(_("Close")) self.show_time_label_align = gtk.Alignment() self.show_time_label_align.set(0.0, 0.5, 1.0, 1.0) self.show_time_label_align.add(self.show_time_label) self.left_button_box.set_buttons([self.show_time_label_align]) self.right_button_box.set_buttons([self.pause_btn, self.close_btn]) self.close_btn.connect("clicked", lambda w : self.hide_all())
class CategoryItem(TreeItem): ''' class docs ''' def __init__(self, index, first_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.index = index self.first_category_name = first_category_name self.data_manager = data_manager 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/%s.png" % (self.index)).get_pixbuf() category_img_path = os.path.join(get_parent_dir(__file__, 2), "image", "category", "%s.png" % (self.index + 1, )) 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, get_category_name(self.first_category_name), rect.x + pixbuf.get_width() + 22, rect.y, rect.width, rect.height, text_size=CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) if self.is_hover: if self.is_expand: pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() else: pixbuf = app_theme.get_pixbuf("sidebar/open.png").get_pixbuf() draw_pixbuf(cr, pixbuf, rect.x + rect.width - CATEGORY_ITEM_EXPAND_PADDING_X, rect.y + (rect.height - pixbuf.get_height()) / 2) 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 is_in_expand_button_area(self, column, offset_x, offset_y): pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() return is_in_rect( (offset_x, offset_y), (CATEGORY_VIEW_WIDTH - CATEGORY_ITEM_EXPAND_PADDING_X, (self.get_height() - pixbuf.get_height()) / 2, pixbuf.get_width(), pixbuf.get_height())) def motion_notify(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): global_event.emit("set-cursor", gtk.gdk.HAND2) else: global_event.emit("set-cursor", None) def button_press(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number + LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append( PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def single_click(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = [] self.all_desktop_infos = {} self.all_pkg_names = self.data_manager.get_first_category_packages( self.first_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message( _("%s: %s applications") % ( get_category_name(self.first_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect( "vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() 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 double_click(self, column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def add_child_item(self): items = [] second_category_names = self.data_manager.get_second_category( self.first_category_name) for second_category_name in second_category_names: items.append( SecondCategoryItem(self.first_category_name, second_category_name, self.data_manager)) self.child_items = items self.add_items_callback(self.child_items, self.row_index + 1) def delete_chlid_item(self): self.delete_items_callback(self.child_items) def expand(self): self.is_expand = True self.add_child_item() if self.redraw_request_callback: self.redraw_request_callback(self) global_event.emit("category-expand", self) def unexpand(self): self.is_expand = False self.delete_chlid_item() if self.redraw_request_callback: self.redraw_request_callback(self)
# Return True to tell IconView call gc.collect() to release memory resource. if self.pixbuf: del self.pixbuf self.pixbuf = None return True if __name__ == '__main__': gtk.gdk.threads_init() module_frame = ModuleFrame( os.path.join(get_parent_dir(__file__, 2), "config.ini")) scrolled_window = ScrolledWindow() scrolled_window.set_size_request(788, 467) wallpaper_view = WallpaperView() scrolled_window.add_child(wallpaper_view) module_frame.add(scrolled_window) scrolled_window.connect("vscrollbar-state-changed", wallpaper_view.load_more_background) download_pool = MissionThreadPool(5) download_pool.start() def message_handler(*message): (message_type, message_content) = message if message_type == "show_again": module_frame.send_module_info() elif message_type == "exit": module_frame.exit()
class ThemePage(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.status_box = StatusBox() self.scroll = ScrolledWindow() self.scroll.set_size_request(800, 432) self.scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.label_padding_x = 10 self.label_padding_y = 10 self.theme_box = gtk.VBox() self.user_theme_label = Label(_("My Themes"), text_size=TITLE_FONT_SIZE, text_color=app_theme.get_color("globalTitleForeground")) self.user_theme_view = UserThemeView(status_box = self.status_box) self.user_theme_scrolledwindow = self.user_theme_view.get_scrolled_window() self.system_theme_label = Label(_("System Themes"), text_size=TITLE_FONT_SIZE, text_color=app_theme.get_color("globalTitleForeground")) self.system_theme_view = SystemThemeView(status_box = self.status_box) self.system_theme_scrolledwindow = self.system_theme_view.get_scrolled_window() self.theme_box.pack_start(self.user_theme_label, False, False) self.theme_box.pack_start(get_separator(), False, False) self.theme_box.pack_start(self.user_theme_scrolledwindow, False, False) self.theme_box.pack_start(self.system_theme_label, False, False) self.theme_box.pack_start(get_separator(), False, False) self.theme_box.pack_start(self.system_theme_scrolledwindow, True, True) main_align = gtk.Alignment() main_align.set_padding(15, 0, 20, 20) main_align.set(1, 1, 1, 1) main_align.add(self.theme_box) self.scroll.add_child(main_align) main_align.connect("expose-event", self.expose_label_align) self.pack_start(self.scroll, False, False) self.pack_start(self.status_box) def expose_label_align(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation self.draw_mask(cr, rect.x, rect.y, rect.width, rect.height) def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' cr.set_source_rgb(1, 1, 1) cr.rectangle(x, y, w, h) cr.fill()
class 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()
class CategoryItem(TreeItem): ''' class docs ''' def __init__(self, index, first_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.index = index self.first_category_name = first_category_name self.data_manager = data_manager 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/%s.png" % (self.index)).get_pixbuf() category_img_path = os.path.join(get_parent_dir(__file__, 2), "image", "category", "%s.png" % (self.index+1, )) 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, get_category_name(self.first_category_name), rect.x + pixbuf.get_width() + 22, rect.y, rect.width, rect.height, text_size=CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) if self.is_hover: if self.is_expand: pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() else: pixbuf = app_theme.get_pixbuf("sidebar/open.png").get_pixbuf() draw_pixbuf( cr, pixbuf, rect.x + rect.width - CATEGORY_ITEM_EXPAND_PADDING_X, rect.y + (rect.height - pixbuf.get_height()) / 2) 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 is_in_expand_button_area(self, column, offset_x, offset_y): pixbuf = app_theme.get_pixbuf("sidebar/close.png").get_pixbuf() return is_in_rect((offset_x, offset_y), (CATEGORY_VIEW_WIDTH - CATEGORY_ITEM_EXPAND_PADDING_X, (self.get_height() - pixbuf.get_height()) / 2, pixbuf.get_width(), pixbuf.get_height())) def motion_notify(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): global_event.emit("set-cursor", gtk.gdk.HAND2) else: global_event.emit("set-cursor", None) def button_press(self, column, offset_x, offset_y): if self.is_in_expand_button_area(column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append(PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def single_click(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = [] self.all_desktop_infos = {} self.all_pkg_names = self.data_manager.get_first_category_packages(self.first_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s: %s applications") % ( get_category_name(self.first_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() 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 double_click(self, column, offset_x, offset_y): if self.is_expand: self.unexpand() else: self.expand() def add_child_item(self): items = [] second_category_names = self.data_manager.get_second_category(self.first_category_name) for second_category_name in second_category_names: items.append(SecondCategoryItem(self.first_category_name, second_category_name, self.data_manager)) self.child_items = items self.add_items_callback(self.child_items, self.row_index + 1) def delete_chlid_item(self): self.delete_items_callback(self.child_items) def expand(self): self.is_expand = True self.add_child_item() if self.redraw_request_callback: self.redraw_request_callback(self) global_event.emit("category-expand", self) def unexpand(self): self.is_expand = False self.delete_chlid_item() if self.redraw_request_callback: self.redraw_request_callback(self)
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 get_webcast_view(self): view = WebcastView() scrolled_window = ScrolledWindow(0, 0) scrolled_window.add_child(view) return scrolled_window, view
def get_webcasts_view(self): webcast_view = MultiDragWebcastView() scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(webcast_view) return webcast_view, scrolled_window
class DetailPage(gtk.HBox): ''' class docs ''' PADDING_Y = 20 ICON_SIZE = 64 ICON_PADDING_X = 50 STAR_PADDING_X = 36 STAR_PADDING_Y = 12 STAR_SIZE = 13 MARK_NUMBER_SIZE = 11 MARK_NUMBER_PADDING_X = 4 MARK_NUMBER_PADDING_Y = 10 INFO_RENDER_X = 10 INFO_RENDER_Y = 140 INFO_RENDER_HEIGHT = 18 INFO_CATEGORY_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT INFO_VERSION_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 2 INFO_SIZE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 3 INFO_DOWNLOAD_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 4 INFO_HOMEPAGE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 5 LEFT_INFO_PADDING_X = 18 LEFT_INFO_PADDING_Y = 50 LEFT_BUTTON_PADDING_Y = 50 LEFT_INFO_WIDTH = 164 RIGHT_INFO_PADDING_X = 30 RIGHT_TITLE_BOX_HEIGHT = 70 ALIAS_NAME_SIZE = 16 ALIAS_NAME_PADDING_Y = 20 LONG_DESC_PADDING_Y = 10 LONG_DESC_WRAP_WIDTH = 630 LONG_DESC_INIT_HEIGHT = 45 MARK_SIZE = 11 MARK_PADDING_X = 5 MARK_PADDING_Y = -3 def __init__(self, data_manager): ''' init docs ''' gtk.HBox.__init__(self) self.data_manager = data_manager self.pkg_name = None self.alias_name = "" self.pkg_pixbuf = None self.pkg_star_view = None self.left_view_box = gtk.VBox() self.left_view_box.set_size_request(self.LEFT_INFO_WIDTH, -1) self.left_logo_box = gtk.VBox() self.left_logo_box.set_size_request(-1, 90) self.star_box = gtk.HBox() self.star_align = gtk.Alignment(0.4, 0.5, 0, 0) self.star_align.set_padding(0, 5, 0, 0) self.star_align.add(self.star_box) self.left_action_box = gtk.HBox() self.left_action_align = gtk.Alignment() self.left_action_align.set(0.5, 0.5, 0, 0) self.left_action_align.set_padding(0, 30, 0, 0) self.left_action_align.add(self.left_action_box) self.left_label_table = gtk.Table(4, 1) self.left_label_table.set_row_spacings(4) self.left_label_align = gtk.Alignment() self.left_label_align.set(0.0, 0.5, 0, 0) self.left_label_align.set_padding(0, 0, 14, 0) self.left_category_name_label = Label() self.left_category_label = Label( hover_color=app_theme.get_color("homepage_hover")) self.left_category_label.set_clickable() self.left_category_label_align = gtk.Alignment() self.left_category_label_align.set(0.0, 0.5, 0, 0) self.left_category_label_align.add(self.left_category_label) self.left_category_label_box = gtk.HBox() self.left_category_label_box.pack_start(self.left_category_name_label, False, False) self.left_category_label_box.pack_start(self.left_category_label_align, True, True) self.left_category_box = gtk.VBox() self.left_version_label = Label(label_width=136) show_label_tooltip(self.left_version_label) self.left_version_label.set_ellipsize(pango.ELLIPSIZE_END) self.left_download_label = Label() self.left_size_label = Label() self.left_homepage_box = gtk.HBox() self.left_homepage_box_align = gtk.Alignment() self.left_homepage_box_align.set(0.0, 0.5, 0, 0) self.left_homepage_box_align.add(self.left_homepage_box) self.left_recommend_box = gtk.VBox() self.left_recommend_box_align = gtk.Alignment() self.left_recommend_box_align.set(0.0, 0.0, 0, 0) self.left_recommend_box_align.set_padding(30, 0, 14, 0) self.left_recommend_box_align.add(self.left_recommend_box) self.left_recommend_label = Label(_("Popular recommendations")) self.right_info_box = gtk.VBox() self.scrolled_window = ScrolledWindow(0, 0) self.right_view_box = gtk.VBox() self.right_top_box = gtk.HBox() self.right_top_box.set_size_request(-1, self.RIGHT_TITLE_BOX_HEIGHT) self.right_desc_box = gtk.VBox() self.right_slide_box = gtk.VBox() self.right_comment_box = gtk.VBox() self.right_title_box = gtk.VBox() self.return_button = ImageButton( app_theme.get_pixbuf("detail/normal.png"), app_theme.get_pixbuf("detail/hover.png"), app_theme.get_pixbuf("detail/press.png"), ) self.return_align = gtk.Alignment() self.return_align.set(0.5, 0.5, 1, 1) self.return_align.set_padding(self.ALIAS_NAME_PADDING_Y, 0, 0, self.RIGHT_INFO_PADDING_X) self.return_align.add(self.return_button) self.return_button.connect( "clicked", lambda w: global_event.emit("switch-from-detail-page")) self.right_top_box.pack_start(self.right_title_box, True, True) self.right_top_box.pack_start(self.return_align, False, False) self.right_view_box.pack_start(self.right_top_box, False, False) self.right_view_box.pack_start(self.right_desc_box, False, False) self.right_view_box.pack_start(self.right_slide_box, False, False) self.right_view_box.pack_start(self.right_comment_box, False, False) self.scrolled_window.add_child(self.right_view_box) self.left_view_box.pack_start(self.left_logo_box, False, False) self.left_view_box.pack_start(self.star_align, False, False) self.left_view_box.pack_start(self.left_action_align, False, False) self.left_label_table.attach(self.left_category_box, 0, 1, 0, 1) self.left_label_table.attach(self.left_version_label, 0, 1, 1, 2) self.left_label_table.attach(self.left_size_label, 0, 1, 2, 3) self.left_label_table.attach(self.left_download_label, 0, 1, 3, 4) self.left_label_table.attach(self.left_homepage_box_align, 0, 1, 4, 5) self.left_label_align.add(self.left_label_table) self.left_view_box.pack_start(self.left_label_align, False, False) self.left_view_box.pack_start(self.left_recommend_box_align, False, False) self.right_info_box.pack_start(self.scrolled_window, True, True) self.pack_start(self.left_view_box, False, False) self.pack_start(self.right_info_box, True, True) self.left_view_box.connect("expose-event", self.expose_left_view) self.right_view_box.connect("expose-event", self.expose_right_view) self.left_logo_box.connect("expose-event", self.expose_left_logo_box) self.right_top_box.connect("expose-event", self.expose_right_top_box) self.right_title_box.connect("expose-event", self.expose_right_title_box) self.connect("hierarchy-changed", self.hierarchy_change) self.left_category_label.connect("button-press-event", lambda w, e: self.jump_to_category()) global_event.register_event("download-screenshot-finish", self.download_screenshot_finish) self.loading_label = Label(_("Loading comments...")) self.loading_label_align = gtk.Alignment(0.5, 0, 0, 0) self.loading_label_align.add(self.loading_label) self.loading_label_align.set_padding(10, 0, 0, 0) self.update_pkg_time = 0 self.update_pkg_interval = 0.2 # in seconds def hierarchy_change(self, widget, previous_toplevel): # When detail page remove from it's container, previous_toplevel is not None. if previous_toplevel != None: container_remove_all( self.right_slide_box ) # remove slide box first, to avoid screenshot area flash container_remove_all( self.right_comment_box ) # remove comment box first, to avoid comment area flash def grade_pkg(self): if self.pkg_star_view: global_event.emit("grade-pkg", (self.pkg_name, self.pkg_star_view), self.pkg_star_view.star_buffer.star_level) self.pkg_star_view.set_star_level(int(self.star)) self.pkg_star_view.queue_draw() def jump_to_category(self): global_event.emit("jump-to-category", self.category[0], self.category[1]) def expose_left_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw split line. cr.set_source_rgb(*color_hex_to_cairo("#AAAAAA")) cr.rectangle(rect.x + rect.width - 1, rect.y, 1, rect.height) cr.fill() def expose_right_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_left_logo_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw pkg icon. self.pkg_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( get_icon_pixbuf_path(utils.get_origin_name(self.pkg_name)), self.ICON_SIZE, self.ICON_SIZE) draw_pixbuf( cr, self.pkg_pixbuf, rect.x + self.ICON_PADDING_X + (self.ICON_SIZE - self.pkg_pixbuf.get_width()) / 2, rect.y + self.PADDING_Y) def expose_right_top_box(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_right_title_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw alias name. draw_text(cr, "<b>%s</b>" % self.alias_name, rect.x + self.RIGHT_INFO_PADDING_X, rect.y + self.ALIAS_NAME_PADDING_Y, rect.width - self.RIGHT_INFO_PADDING_X, self.ALIAS_NAME_SIZE, text_size=self.ALIAS_NAME_SIZE) def expose_resizable_label_background(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def button_press_start_button(self, widget, event, desktops): pixbuf = app_theme.get_pixbuf("button/start_normal.png").get_pixbuf() desktop_infos = self.data_manager.get_pkg_desktop_info(desktops) global_event.emit( "start-pkg", self.alias_name, desktop_infos, (int(event.x), int(event.y), pixbuf.get_width() / 2, 0)) @post_gui def update_some_info(self, info): self.star = float(info[0]['mark'].encode('utf-8').strip()) if self.pkg_star_view: self.pkg_star_view.star_buffer.star_level = int(self.star) self.pkg_star_view.queue_draw() self.pkg_star_mark.update_star(self.star) self.pkg_star_mark.queue_draw() self.downlad_number = info[0]['down_nums'].encode('utf-8').strip() self.left_download_label.set_text( _('Download: %s') % self.downlad_number) def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text( get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label( _("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect( "button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start( RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel( self.long_desc.replace("&", "&").replace("<", "<").replace( ">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all() def handle_pkg_status(self, reply, success): container_remove_all(self.left_action_box) if success: install_status = str(reply) if install_status == "uninstalled": action_button = ImageButton( app_theme.get_pixbuf("button/install_normal.png"), app_theme.get_pixbuf("button/install_hover.png"), app_theme.get_pixbuf("button/install_press.png"), ) action_button.connect( "clicked", lambda w: global_event.emit( "install-pkg", [self.pkg_name])) self.left_action_box.pack_start(action_button) elif install_status == "unknown": status_label = Label(_("Not found")) self.left_action_box.pack_start(status_label) else: try: desktops = json.loads(install_status) if not desktops: status_label = Label(_("Successfully installed")) self.left_action_box.pack_start(status_label) else: action_button = ImageButton( app_theme.get_pixbuf("button/start_normal.png"), app_theme.get_pixbuf("button/start_hover.png"), app_theme.get_pixbuf("button/start_press.png"), ) action_button.connect( "button-press-event", lambda w, e: self.button_press_start_button( w, e, desktops)) self.left_action_box.pack_start(action_button) except: logging.error("detail install status: %s = %s" % (self.pkg_name, install_status)) self.left_action_box.show_all() global_event.emit('update-current-status-pkg-page', self) else: global_logger.error("get_pkg_installed handle_dbus_error") global_logger.error(reply) def handle_pkg_download_size(self, reply, success): # FIXME: download information display if success: if reply[0] == PKG_SIZE_OWN or reply[0] == PKG_SIZE_DOWNLOAD: self.left_size_label.set_text( _("Size: %s") % bit_to_human_str(reply[1])) elif reply[0] == PKG_SIZE_ERROR: self.left_size_label.set_text("") global_logger.error("Error for calculate pkg size!") else: global_logger.error( "request_pkgs_install_status handle_dbus_error") global_logger.error(reply) def fetch_pkg_status(self): self.data_manager.get_pkg_installed(self.pkg_name, self.handle_pkg_status) self.data_manager.get_pkg_download_size(self.pkg_name, self.handle_pkg_download_size) def open_url(self, webview, frame, network_request, nav_action, policy_dec): webbrowser.open(network_request.get_uri()) def webview_console_message_handler(self, webview, message, line, source_id): return True def fetch_comment(self): if is_network_connected(): container_remove_all(self.right_comment_box) loading_label = Label(_("Loading comments...")) loading_label_align = gtk.Alignment(0.5, 0, 0, 0) loading_label_align.add(loading_label) loading_label_align.set_padding(10, 0, 0, 0) self.right_comment_box.pack_start(loading_label_align, False, False) web_view = WebView(os.path.join(CONFIG_DIR, "cookie.txt")) web_view.connect("new-window-policy-decision-requested", self.open_url) web_view.connect('console-message', self.webview_console_message_handler) web_view_align = gtk.Alignment() web_view_align.set(0.5, 0, 0, 0) web_view_align.set_padding(33, 33, 33, 33) web_view_align.add(web_view) web_settings = web_view.get_settings() web_settings.set_property("enable-plugins", False) web_settings.set_property("enable-scripts", True) web_view.open("%s/softcenter/v1/comment?n=%s&hl=%s" % ( SERVER_ADDRESS, self.pkg_name, LANGUAGE, )) web_view.connect("load-finished", self.comment_load_finished_cb, web_view_align) create_thread(self.fetch_screenshot).start() def comment_load_finished_cb(self, webview, frame, web_view_align): self.scrolled_window.connect( "vscrollbar-state-changed", lambda w, p: self.load_more_comment(p, webview)) container_remove_all(self.right_comment_box) self.right_comment_box.pack_start(web_view_align, True, True) self.right_comment_box.show_all() def load_more_comment(self, postion, webview): if postion == "bottom": webview.execute_script('$("#nav_next").click();') def fetch_screenshot(self): screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) screenshot_md5_path = os.path.join(screenshot_dir, "screenshot_md5.txt") remote_screenshot_md5_url = "%s/zh_CN/%s/screenshot_md5.txt" % ( SCREENSHOT_HOST, self.pkg_name) remote_screenshot_zip_url = "%s/zh_CN/%s/screenshot.zip" % ( SCREENSHOT_HOST, self.pkg_name) try: remote_md5 = urllib2.urlopen(remote_screenshot_md5_url).read() need_download = False if os.path.exists(screenshot_dir): if os.path.exists(screenshot_md5_path): local_md5 = read_file(screenshot_md5_path) if remote_md5 != local_md5: need_download = True else: need_download = True else: need_download = True if need_download: write_file(screenshot_md5_path, remote_md5, True) try: urllib.urlretrieve( remote_screenshot_zip_url, os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name, "screenshot.zip")) global_event.emit("download-screenshot-finish", self.pkg_name) except Exception, e: global_logger.error("Download screenshot error: %s" % e) except Exception, e: global_logger.error("fetch_screenshot got error: %s" % e)
list_view = ListView( [(lambda item: item.title, cmp), (lambda item: item.artist, cmp), (lambda item: item.length, cmp)]) list_view.set_expand_column(0) list_view.add_titles(["歌名", "歌手", "时间"]) list_view.add_items(items) list_view.connect("double-click-item", lambda listview, item, i, x, y: list_view.set_highlight(item)) # list_view.connect("button-press-item", print_button_press) # list_view.connect("double-click-item", print_double_click) # list_view.connect("single-click-item", print_single_click) # list_view.connect("motion-notify-item", print_motion_notify) scrolled_window.add_child(list_view) # Add volume button. volume_button = VolumeButton(100, 50) volume_frame = gtk.Alignment() volume_frame.set(0.0, 0.5, 0, 0) volume_frame.set_padding(0, 0, 10, 0) volume_frame.add(volume_button) tab_1_box.pack_start(volume_frame, False, False) # Add entry widget. entry_button = ImageButton( app_theme.get_pixbuf("entry/search_normal.png"), app_theme.get_pixbuf("entry/search_hover.png"), app_theme.get_pixbuf("entry/search_press.png"), )
class DisplayView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.brightness_id = None self.display_manager = DisplayManager() self.__xrandr_settings = self.display_manager.get_xrandr_settings() self.__xrandr_settings.connect("changed", self.__xrandr_changed) self.resize_width = 790 self.resize_height = 200 self.monitor_items = [] self.__output_names = [] self.__current_output_name = self.display_manager.get_primary_output_name( ) self.__setup_monitor_items() self.sizes_items = [] self.monitor_combo = None if len(self.monitor_items ) > 1 and self.display_manager.is_copy_monitors(): self.__set_same_sizes() else: self.__setup_sizes_items() self.multi_monitors_items = [(_("Copy Display"), 1), (_("Extend Display"), 2), (_("Only shown in display 1"), 3), (_("Only shown in display 2"), 4)] self.rotation_items = [(_("Normal"), 1), (_("Right"), 2), (_("Left"), 3), (_("Inverted"), 4)] self.duration_items = [("1 %s" % _("Minute"), 1), ("2 %s" % _("Minutes"), 2), ("3 %s" % _("Minutes"), 3), ("5 %s" % _("Minutes"), 5), ("10 %s" % _("Minutes"), 10), ("30 %s" % _("Minutes"), 30), ("1 %s" % _("Hour"), 60), (_("Never"), DisplayManager.BIG_NUM / 60)] ''' scrolled_window ''' self.scrolled_window = ScrolledWindow() self.scrolled_window.set_size_request(-1, 425) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.main_box = gtk.VBox() self.main_box.set_size_request(600, -1) self.body_box = gtk.HBox() ''' left, right align ''' self.left_align = self.__setup_align( padding_top=FRAME_TOP_PADDING, padding_left=TEXT_WINDOW_LEFT_PADDING) self.right_align = self.__setup_align(padding_top=FRAME_TOP_PADDING, padding_left=0) ''' left, right box ''' self.left_box = gtk.VBox(spacing=WIDGET_SPACING) self.right_box = gtk.VBox(spacing=WIDGET_SPACING) ''' monitor operation && detect ''' self.monitor_resize_align = self.__setup_align( padding_top=11, padding_left=int(TEXT_WINDOW_LEFT_PADDING / 2)) self.monitor_resize_box = MonitorResizableBox(self.display_manager) self.monitor_resize_box.select_output(self.__current_output_name) self.monitor_resize_box.connect("select-output", self.__select_output) self.monitor_resize_box.connect("resize", self.__resize_box) self.monitor_resize_align.add(self.monitor_resize_box) ''' monitor display ''' self.monitor_display_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_display.png"), _("Display"), 0) ''' monitor ''' self.monitor_align = self.__setup_align() self.monitor_box = gtk.HBox(spacing=WIDGET_SPACING) self.monitor_label = self.__setup_label(_("Monitor")) self.monitor_combo = self.__setup_combo(self.monitor_items) self.monitor_combo.set_select_index( self.display_manager.get_primary_output_name_index( self.monitor_items)) self.monitor_combo.connect("item-selected", self.__combo_item_selected, "monitor_combo") self.__widget_pack_start(self.monitor_box, [self.monitor_label, self.monitor_combo]) self.monitor_align.add(self.monitor_box) ''' goto individuation or power setting ''' self.goto_align = self.__setup_align() self.goto_box = gtk.VBox(spacing=WIDGET_SPACING) self.goto_label = self.__setup_label(_("Relevant Settings"), text_size=TITLE_FONT_SIZE, width=None, align=ALIGN_START) goto_color = GOTO_FG_COLOR self.goto_individuation_label = self.__setup_label(text=_( "<span foreground=\"%s\" underline=\"single\">Personalization</span>" ) % goto_color, width=None, align=ALIGN_START) self.goto_individuation_label.connect("button-press-event", self.__button_press, "individuation") set_clickable_cursor(self.goto_individuation_label) self.goto_power_label = self.__setup_label( text=_("<span foreground=\"%s\" underline=\"single\">Power</span>") % goto_color, width=None, align=ALIGN_START) self.goto_power_label.connect("button-press-event", self.__button_press, "power") set_clickable_cursor(self.goto_power_label) self.__widget_pack_start(self.goto_box, [ self.goto_label, self.goto_individuation_label, self.goto_power_label ]) self.goto_align.add(self.goto_box) ''' sizes ''' self.sizes_align = self.__setup_align() self.sizes_box = gtk.HBox(spacing=WIDGET_SPACING) self.sizes_label = self.__setup_label(_("Resolution")) self.sizes_combo = self.__setup_combo(self.sizes_items) if self.sizes_combo: self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) self.sizes_combo.connect("item-selected", self.__combo_item_selected, "sizes_combo") self.__widget_pack_start(self.sizes_box, [self.sizes_label, self.sizes_combo]) self.sizes_align.add(self.sizes_box) ''' rotation ''' self.rotation_align = self.__setup_align() self.rotation_box = gtk.HBox(spacing=WIDGET_SPACING) self.rotation_label = self.__setup_label(_("Rotation")) self.rotation_combo = self.__setup_combo(self.rotation_items) self.rotation_combo.set_select_index( self.display_manager.get_screen_rotation_index( self.__current_output_name)) self.rotation_combo.connect("item-selected", self.__combo_item_selected, "rotation_combo") self.__widget_pack_start(self.rotation_box, [self.rotation_label, self.rotation_combo]) self.rotation_align.add(self.rotation_box) ''' multi-monitors ''' self.multi_monitors_align = self.__setup_align() self.multi_monitors_box = gtk.HBox(spacing=WIDGET_SPACING) self.multi_monitors_label = self.__setup_label(_("Multi-Monitor")) self.multi_monitors_combo = self.__setup_combo( self.multi_monitors_items) self.multi_monitors_combo.set_select_index( self.display_manager.get_multi_monitor_index()) self.multi_monitors_combo.connect("item-selected", self.__combo_item_selected, "multi_monitors_combo") self.__widget_pack_start( self.multi_monitors_box, [self.multi_monitors_label, self.multi_monitors_combo]) self.multi_monitors_align.add(self.multi_monitors_box) if self.display_manager.get_output_count() < 2: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) ''' monitor brightness ''' self.monitor_bright_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_bright.png"), _("Brightness")) ''' brightness ''' self.brightness_align = self.__setup_align() self.brightness_box = gtk.HBox(spacing=2) self.brightness_label_align = self.__setup_align(padding_top=8, padding_left=0, padding_right=5) self.brightness_label = self.__setup_label(_("Brightness")) self.brightness_label_align.add(self.brightness_label) self.brightness_scale = HScalebar( point_dpixbuf=app_theme.get_pixbuf("scalebar/point.png"), value_min=0.1, value_max=1.0) self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33) self.brightness_scale.set_value( self.display_manager.get_screen_brightness()) self.brightness_scale.connect("value-changed", self.__set_brightness) self.__widget_pack_start( self.brightness_box, [self.brightness_label_align, self.brightness_scale]) self.brightness_align.add(self.brightness_box) ''' auto adjust monitor brightness ''' self.auto_adjust_align = self.__setup_align() self.auto_adjust_box = gtk.HBox(spacing=WIDGET_SPACING) self.auto_adjust_label = self.__setup_label(_("Auto-Brightness")) self.auto_adjust_toggle_align = self.__setup_align(padding_top=4, padding_left=158) self.auto_adjust_toggle = self.__setup_toggle() self.auto_adjust_toggle.set_active( self.display_manager.is_enable_close_monitor()) self.auto_adjust_toggle.connect("toggled", self.__toggled, "auto_adjust_toggle") self.auto_adjust_toggle_align.add(self.auto_adjust_toggle) self.__widget_pack_start( self.auto_adjust_box, [self.auto_adjust_label, self.auto_adjust_toggle_align]) self.auto_adjust_align.add(self.auto_adjust_box) ''' close monitor ''' self.close_monitor_align = self.__setup_align() self.close_monitor_box = gtk.HBox(spacing=WIDGET_SPACING) self.close_monitor_label = self.__setup_label(_("Turn off monitor")) self.close_monitor_combo = self.__setup_combo(self.duration_items) self.close_monitor_combo.set_select_index( self.display_manager.get_close_monitor_index(self.duration_items)) self.close_monitor_combo.connect("item-selected", self.__combo_item_selected, "close_monitor_combo") self.__widget_pack_start( self.close_monitor_box, [self.close_monitor_label, self.close_monitor_combo]) self.close_monitor_align.add(self.close_monitor_box) ''' monitor lock ''' self.monitor_lock_align = self.__setup_title_align( app_theme.get_pixbuf("lock/lock.png"), _("Lock Screen")) ''' auto monitor lock ''' self.auto_lock_align = self.__setup_align() self.auto_lock_box = gtk.HBox(spacing=WIDGET_SPACING) self.auto_lock_label = self.__setup_label( _("Lock screen automatically")) self.auto_lock_toggle_align = self.__setup_align(padding_top=4, padding_left=158) self.auto_lock_toggle = self.__setup_toggle() is_enable_lock_display = self.display_manager.is_enable_lock_display() self.auto_lock_toggle.set_active(is_enable_lock_display) self.auto_lock_toggle.connect("toggled", self.__toggled, "auto_lock_toggle") self.auto_lock_toggle_align.add(self.auto_lock_toggle) self.__widget_pack_start( self.auto_lock_box, [self.auto_lock_label, self.auto_lock_toggle_align]) self.auto_lock_align.add(self.auto_lock_box) ''' lock display ''' self.lock_display_align = self.__setup_align(padding_bottom=20) self.lock_display_box = gtk.HBox(spacing=WIDGET_SPACING) self.lock_display_label = self.__setup_label(_("Lock Screen")) self.lock_display_combo = self.__setup_combo(self.duration_items) self.lock_display_combo.set_select_index( self.display_manager.get_lock_display_index(self.duration_items)) self.lock_display_combo.connect("item-selected", self.__combo_item_selected, "lock_display_combo") self.__widget_pack_start( self.lock_display_box, [self.lock_display_label, self.lock_display_combo]) self.lock_display_align.add(self.lock_display_box) ''' left_align pack_start ''' self.__widget_pack_start( self.left_box, [ self.monitor_display_align, self.monitor_align, self.sizes_align, self.rotation_align, self.multi_monitors_align, self.monitor_bright_align, self.brightness_align, #self.auto_adjust_align, #self.close_monitor_align, self.monitor_lock_align, self.auto_lock_align, self.lock_display_align ]) self.left_align.add(self.left_box) ''' right_align pack_start ''' self.__widget_pack_start(self.right_box, [self.goto_align]) self.right_box.set_size_request(280, -1) self.right_align.add(self.right_box) ''' main && body box ''' self.main_box.pack_start(self.monitor_resize_align, False, False) self.body_box.pack_start(self.left_align) self.body_box.pack_start(self.right_align, False, False) self.main_box.pack_start(self.body_box) ''' this->HBox pack_start ''' self.scrolled_window.add_child(self.main_box) self.pack_start(self.scrolled_window) self.__send_message("status", ("display", "")) def show_again(self): self.__send_message("status", ("display", "")) def reset(self): self.__send_message("status", ("display", _("Reset to default value"))) self.display_manager.reset() self.close_monitor_combo.set_select_index( self.display_manager.get_close_monitor_index(self.duration_items)) self.lock_display_combo.set_select_index( self.display_manager.get_lock_display_index(self.duration_items)) self.multi_monitors_combo.set_select_index(0) def __handle_dbus_replay(self, *reply): pass def __handle_dbus_error(self, *error): pass def __send_message(self, message_type, message_content): if is_dbus_name_exists(APP_DBUS_NAME): bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME, APP_OBJECT_NAME) method = bus_object.get_dbus_method("message_receiver") method(message_type, message_content, reply_handler=self.__handle_dbus_replay, error_handler=self.__handle_dbus_error) def __button_press(self, widget, event, module_id): self.__send_message("goto", (module_id, "")) def __expose(self, widget, event): try: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() except e: print "DEBUG", e def __change_current_output(self, output_name, from_monitor_combo=True): self.__current_output_name = output_name if not from_monitor_combo: self.monitor_combo.set_select_index( self.display_manager.get_output_name_index( output_name, self.monitor_items)) if not self.display_manager.is_copy_monitors(): self.__setup_sizes_items() if len(self.sizes_items): self.sizes_combo.add_items(items=self.sizes_items) self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) def __select_output(self, widget, output_name): print "Output name:", output_name self.__change_current_output(output_name, False) def __set_same_sizes(self): same_sizes = self.display_manager.get_same_sizes( self.display_manager.get_screen_sizes(self.monitor_items[0][1]), self.display_manager.get_screen_sizes(self.monitor_items[1][1])) i = 0 del self.sizes_items[:] while i < len(same_sizes): self.sizes_items.append((same_sizes[i], i)) i += 1 def __xrandr_changed(self, key): if key == "output-names": self.display_manager.init_xml() self.__setup_monitor_items() self.monitor_combo.add_items(items=self.monitor_items) if len(self.monitor_items) > 1: if self.display_manager.is_copy_monitors(): self.__set_same_sizes() self.sizes_combo.add_items(items=self.sizes_items) self.multi_monitors_align.set_size_request(-1, 30) self.multi_monitors_align.set_child_visible(True) else: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) return if key == "brightness": self.brightness_scale.set_value( self.display_manager.get_screen_brightness()) return def __set_brightness_value(self, value): self.display_manager.set_screen_brightness(self.__current_output_name, value) def __set_brightness(self, widget, event): value = self.brightness_scale.get_value() self.__send_message( "status", ("display", _("Changed brightness to %d%%") % int(value * 100))) if self.brightness_id: gobject.source_remove(self.brightness_id) self.brightness_id = gobject.timeout_add_seconds( 1, self.__set_brightness_value, value) def __setup_monitor_items(self): self.__output_names = self.display_manager.get_output_names() del self.monitor_items[:] i = 0 while (i < len(self.__output_names)): self.monitor_items.append( self.display_manager.get_output_name(self.__output_names[i])) i += 1 def __setup_sizes_items(self): screen_sizes = self.display_manager.get_screen_sizes( self.__current_output_name) del self.sizes_items[:] i = 0 while i < len(screen_sizes): self.sizes_items.append((screen_sizes[i], i)) i += 1 def __toggled(self, widget, object=None): if object == "auto_adjust_toggle": if not widget.get_active(): self.__send_message( "status", ("display", _("Changed to manual adjustment"))) self.display_manager.set_close_monitor(DisplayManager.BIG_NUM / 60) else: self.__send_message( "status", ("display", _("Changed to automatic adjustment"))) return if object == "auto_lock_toggle": if not widget.get_active(): self.lock_display_combo.set_sensitive(False) self.__send_message("status", ("display", _("Changed to manual lock"))) else: self.lock_display_combo.set_sensitive(True) self.__send_message( "status", ("display", _("Changed to automatic lock"))) return def __combo_item_selected(self, widget, item_text=None, item_value=None, item_index=None, object=None): if object == "monitor_combo": self.__send_message( "status", ("display", _("Changed current output to %s") % item_text)) self.__change_current_output(item_value) return if object == "sizes_combo": size = self.sizes_items[item_value][0] self.__send_message( "status", ("display", _("Changed resolution to %s") % size)) self.display_manager.set_screen_size(self.__current_output_name, size) return if object == "rotation_combo": self.__send_message( "status", ("display", _("Changed rotation to %s") % item_text)) self.display_manager.set_screen_rotation( self.__current_output_name, item_value) return if object == "multi_monitors_combo": self.__send_message( "status", ("display", _("Changed multi-monitor mode to %s") % item_text)) self.display_manager.set_multi_monitor(item_value) return if object == "close_monitor_combo": self.__send_message("status", ( "display", _("Idle time before turning off display has been changed to to %s" ) % item_text)) self.display_manager.set_close_monitor(item_value) return if object == "lock_display_combo": self.__send_message( "status", ("display", _("Idle time before locking display has been changed to %s") % item_text)) if item_value == DisplayManager.BIG_NUM / 60: self.auto_lock_toggle.set_active(False) else: self.auto_lock_toggle.set_active(True) self.display_manager.set_lock_display(item_value) return def __resize_box(self, widget, height): self.monitor_resize_box.set_size_request(self.resize_width, height - FRAME_TOP_PADDING) def __setup_separator(self): hseparator = HSeparator( app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0) hseparator.set_size_request(500, HSEPARATOR_HEIGHT) return hseparator def __setup_title_label( self, text="", text_color=app_theme.get_color("globalTitleForeground"), text_size=TITLE_FONT_SIZE, text_x_align=ALIGN_START, label_width=180): return Label(text=text, text_color=text_color, text_size=text_size, text_x_align=text_x_align, label_width=label_width, enable_select=False, enable_double_click=False) def __setup_label(self, text="", text_size=CONTENT_FONT_SIZE, width=180, align=ALIGN_END, wrap_width=None): label = Label(text=text, text_color=None, text_size=text_size, text_x_align=align, label_width=width, wrap_width=wrap_width, enable_select=False, enable_double_click=False) return label def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH): if len(items) == 0: return None combo = ComboBox(items=items, select_index=0, max_width=width, fixed_width=width) combo.set_size_request(width, WIDGET_HEIGHT) return combo def __setup_toggle(self): toggle = ToggleButton( app_theme.get_pixbuf("toggle_button/inactive_normal.png"), app_theme.get_pixbuf("toggle_button/active_normal.png")) return toggle def __setup_title_align(self, pixbuf, text, padding_top=FRAME_TOP_PADDING, padding_left=0): align = self.__setup_align(padding_top=padding_top, padding_left=padding_left) align_box = gtk.VBox(spacing=WIDGET_SPACING) title_box = gtk.HBox(spacing=WIDGET_SPACING) image = ImageBox(pixbuf) label = self.__setup_title_label(text) separator = self.__setup_separator() self.__widget_pack_start(title_box, [image, label]) self.__widget_pack_start(align_box, [title_box, separator]) align.add(align_box) return align def __setup_align(self, xalign=0, yalign=0, xscale=0, yscale=0, padding_top=0, padding_bottom=0, padding_left=FRAME_LEFT_PADDING + int(WIDGET_SPACING / 2), padding_right=0): align = gtk.Alignment() align.set(xalign, yalign, xscale, yscale) align.set_padding(padding_top, padding_bottom, padding_left, padding_right) align.connect("expose-event", self.__expose) return align def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False): if parent_widget == None: return for item in widgets: parent_widget.pack_start(item, expand, fill)
class StartDesktopWindow(Window): ''' class docs ''' def __init__(self): ''' init docs ''' Window.__init__(self) self.window_width = 0 self.window_height = 0 self.max_columns = 4 self.max_rows = 3 self.iconview = IconView(mask_bound_height=0) self.iconview.draw_mask = self.draw_iconview_mask self.iconview.draw_background = self.draw_iconvew_background self.iconview_scrolledwindow = ScrolledWindow(0, 0) self.iconview_scrolledwindow.add_child(self.iconview) self.window_frame.add(self.iconview_scrolledwindow) self.connect("show", self.show_start_desktop_window) wrap_grab_window(start_desktop_grab_window, self) def draw_iconview_mask(self, cr, x, y, w, h): cr.set_source_rgb(1, 1, 1) cr.rectangle(x, y, w, h) cr.fill() def draw_iconvew_background(self, widget, cr): pass def draw_background(self, cr, x, y, w, h): cr.set_operator(cairo.OPERATOR_CLEAR) cr.paint() pass def draw_skin(self, cr, x, y, w, h): pass def draw_mask(self, cr, x, y, w, h): pass def show_start_desktop_window(self, widget): (shadow_x, shadow_y) = self.get_shadow_size() self.window_width += shadow_x * 2 self.window_height += shadow_y * 2 self.set_geometry_hints( None, self.window_width, # minimum width self.window_height, # minimum height self.window_width, self.window_height, -1, -1, -1, -1, -1, -1) self.move_x -= shadow_x self.move_y -= shadow_y * 2 self.move(self.move_x, self.move_y) def get_scrolledwindow(self): return self.iconview_scrolledwindow def start(self, pkg_name, desktop_infos, (x, y)): desktop_num = len(desktop_infos) if desktop_num <= self.max_columns: window_width = DESKTOP_ICON_WIDTH * desktop_num window_height = DESKTOP_ICON_HEIGHT elif desktop_num <= self.max_columns * 2: window_width = DESKTOP_ICON_WIDTH * self.max_columns window_height = DESKTOP_ICON_HEIGHT * 2 else: window_width = DESKTOP_ICON_WIDTH * self.max_columns window_height = DESKTOP_ICON_HEIGHT * self.max_rows self.window_width = window_width self.window_height = window_height # Add items. self.iconview.clear() items = [] for desktop_info in desktop_infos: items.append(StartDesktopItem(pkg_name, desktop_info)) self.iconview.add_items(items) self.iconview_scrolledwindow.show_all() self.move_x = x - window_width / 2 self.move_y = y - window_height self.show_all()
def get_webcast_view(self): view = WebcastView() scrolled_window = ScrolledWindow(0, 0) scrolled_window.add_child(view) return scrolled_window, view
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 get_scrolled_window(self): scrolled_window = ScrolledWindow() scrolled_window.add_child(self) return scrolled_window
class ThemePage(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.status_box = StatusBox() self.scroll = ScrolledWindow() self.scroll.set_size_request(800, 432) self.scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.label_padding_x = 10 self.label_padding_y = 10 self.theme_box = gtk.VBox() self.user_theme_label = Label( _("My Themes"), text_size=TITLE_FONT_SIZE, text_color=app_theme.get_color("globalTitleForeground")) self.user_theme_view = UserThemeView(status_box=self.status_box) self.user_theme_scrolledwindow = self.user_theme_view.get_scrolled_window( ) self.system_theme_label = Label( _("System Themes"), text_size=TITLE_FONT_SIZE, text_color=app_theme.get_color("globalTitleForeground")) self.system_theme_view = SystemThemeView(status_box=self.status_box) self.system_theme_scrolledwindow = self.system_theme_view.get_scrolled_window( ) self.theme_box.pack_start(self.user_theme_label, False, False) self.theme_box.pack_start(get_separator(), False, False) self.theme_box.pack_start(self.user_theme_scrolledwindow, False, False) self.theme_box.pack_start(self.system_theme_label, False, False) self.theme_box.pack_start(get_separator(), False, False) self.theme_box.pack_start(self.system_theme_scrolledwindow, True, True) main_align = gtk.Alignment() main_align.set_padding(15, 0, 20, 20) main_align.set(1, 1, 1, 1) main_align.add(self.theme_box) self.scroll.add_child(main_align) main_align.connect("expose-event", self.expose_label_align) self.pack_start(self.scroll, False, False) self.pack_start(self.status_box) def expose_label_align(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation self.draw_mask(cr, rect.x, rect.y, rect.width, rect.height) def draw_mask(self, cr, x, y, w, h): ''' Draw mask interface. @param cr: Cairo context. @param x: X coordiante of draw area. @param y: Y coordiante of draw area. @param w: Width of draw area. @param h: Height of draw area. ''' cr.set_source_rgb(1, 1, 1) cr.rectangle(x, y, w, h) cr.fill()
class DownloadRankPage(gtk.VBox): __gsignals__ = { "get-rank-pkg-names-finish": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, )), } def __init__(self, data_manager): # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.tab_box = gtk.HBox() self.tab_box.set_size_request(-1, RANK_TAB_HEIGHT) self.tab_box.set_spacing(1) self.tab_box_align = gtk.Alignment() self.tab_box_align.set(1, 0, 0, 0) self.tab_box_align.set_padding(3, 9, 25, 48) for (tab_index, tab_name) in enumerate( [_("Top 25 weekly"), _("Top 25 monthly"), _("Top 25 totally")]): self.tab_box.pack_start( RankTab(tab_index, tab_name, tab_index == 0), False, False) self.page_box = gtk.VBox() self.page_align = gtk.Alignment() self.page_align.set(0.5, 0.5, 1, 1) self.page_align.set_padding(0, 0, 15, 15) self.week_rank_icon_view = IconView() self.week_rank_icon_view_scrlledwindow = ScrolledWindow() self.week_rank_icon_view.draw_mask = self.draw_mask self.month_rank_icon_view = IconView() self.month_rank_icon_view_scrlledwindow = ScrolledWindow() self.month_rank_icon_view.draw_mask = self.draw_mask self.all_rank_icon_view = IconView() self.all_rank_icon_view_scrlledwindow = ScrolledWindow() self.all_rank_icon_view.draw_mask = self.draw_mask self.week_rank_icon_view_scrlledwindow.add_child( self.week_rank_icon_view) self.month_rank_icon_view_scrlledwindow.add_child( self.month_rank_icon_view) self.all_rank_icon_view_scrlledwindow.add_child( self.all_rank_icon_view) self.tab_box_align.add(self.tab_box) self.page_box.pack_start(self.page_align) self.pack_start(self.tab_box_align, False, False) self.pack_start(self.page_box, True, True) self.loading = LoadingBox() self.view_list = [('week', self.week_rank_icon_view, self.week_rank_icon_view_scrlledwindow), ('month', self.month_rank_icon_view, self.month_rank_icon_view_scrlledwindow), ('all', self.all_rank_icon_view, self.all_rank_icon_view_scrlledwindow)] self.pkg_names = [] self.show_flag = None self.all_show_flag = ['week', 'month', 'all'] global_event.register_event("update-rank-page", self.update_rank_page) gtk.timeout_add(300, self.get_pkgs_status) global_event.emit("update-rank-page", 0) def get_rank_pkg_names(self, data_type): pkg_names = [] try: url = "%s/softcenter/v1/soft?a=top&r=%s" % (SERVER_ADDRESS, data_type) result = urllib2.urlopen(url, timeout=POST_TIMEOUT).read() if data_type == 'week' or data_type == 'month': rank = json.loads(result)[0] rank = eval(rank["rank_packages"].encode("utf-8")) for info in rank: pkg_names.append(info[0]) else: rank = json.loads(result) for info in rank: name = info['name'].encode('utf-8') if name not in pkg_names: pkg_names.append(name) except Exception, e: print "Get %s rank error: %s" % (data_type, e) self.pkg_names = pkg_names self.show_flag = data_type
def get_webcasts_view(self): webcast_view = MultiDragWebcastView() scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(webcast_view) return webcast_view, scrolled_window
def get_scrolled_window(self): scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(self) return scrolled_window
def __init__(self, account_setting): super(IconSetPage, self).__init__(False) #self.set_spacing(BETWEEN_SPACING) self.account_setting = account_setting self.choose_menu_without_camera = Menu( [(None, _("Local picture"), self.choose_from_picture), (None, _("Take a screeshot"), self.choose_from_screenshot),], True) self.choose_menu_with_camera = Menu( [(None, _("Local picture"), self.choose_from_picture), (None, _("Take a screeshot"), self.choose_from_screenshot), (None, _("From camera"), self.choose_from_camera)], True) self.tips_label = Label("Set icon", label_width=460, enable_select=False, enable_double_click=False) self.error_label = Label("", wrap_width=560, enable_select=False, enable_double_click=False) set_page_sw = ScrolledWindow() self.pack_start(set_page_sw) main_vbox = gtk.VBox(False) set_page_sw.add_child(main_vbox) self.icon_list_tabel = gtk.Table() self.icon_list_tabel.set_row_spacings(4) self.icon_list_tabel.set_col_spacings(4) main_vbox.pack_start(tools.make_align(self.tips_label), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) self.history_list_hbox = gtk.HBox(False) self.history_list_hbox.set_size_request(-1, 56) self.history_list_hbox.set_spacing(4) main_vbox.pack_start(tools.make_align(Label(_("Choose a new picture for your account"), label_width=460, enable_select=False, enable_double_click=False), height=CONTAINNER_HEIGHT), False, False) main_vbox.pack_start(tools.make_align(self.icon_list_tabel), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) main_vbox.pack_start(tools.make_align(Label(_("Previously used pictures"), label_width=460, enable_select=False, enable_double_click=False), height=CONTAINNER_HEIGHT), False, False) main_vbox.pack_start(tools.make_align(self.history_list_hbox), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) main_vbox.pack_start(tools.make_align(self.error_label), False, False) # public picture list #face_dir = '/usr/share/pixmaps/faces' face_dir = '/var/lib/AccountsService/icons' if os.path.exists(face_dir): pic_list = os.listdir(face_dir) else: pic_list = [] pic_list.sort() self.public_icon_list = [] inital_list = ['001.jpg', '002.jpg', '003.jpg', '004.jpg', '005.jpg', '006.jpg', '007.jpg', '008.jpg', '009.jpg', '010.jpg', '011.jpg', '012.jpg', '013.jpg', '014.jpg', '015.jpg', '016.jpg', '017.jpg', '018.jpg', '019.jpg', '020.jpg'] for pic in pic_list: if pic not in inital_list: continue try: icon_pixbuf = gtk.gdk.pixbuf_new_from_file( "%s/%s" %(face_dir, pic)).scale_simple(48, 48, gtk.gdk.INTERP_TILES) except: continue icon_bt = IconButton(icon_pixbuf, "%s/%s" %(face_dir, pic), has_frame=True) icon_bt.connect("pressed", self.on_icon_bt_pressed_cb) self.public_icon_list.append(icon_bt) self.more_icon_button = IconButton(app_theme.get_pixbuf("%s/more.png" % MODULE_NAME).get_pixbuf(), has_frame=True) self.more_icon_button.connect("button-press-event", self.choose_more_picture) main_vbox.connect("expose-event", self.draw_white_background)
class SecondCategoryItem(TreeItem): ''' class docs ''' def __init__(self, first_category_name, second_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.first_category_name = first_category_name self.second_category_name = second_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" 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" 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() draw_text(cr, get_category_name(self.second_category_name), rect.x + SECOND_CATEGORY_PADDING_X, rect.y, rect.width, rect.height, text_size=SECOND_CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) def get_height(self): return SECOND_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 scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number+LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and (current_item_number+LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append(PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages(self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message(_("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect("vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() 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 get_scrolled_window(self): scrolled_window = ScrolledWindow() scrolled_window.connect("vscrollbar-state-changed", self.__on_vscrollbar_state_changed) scrolled_window.add_child(self) return scrolled_window
class DetailPage(gtk.HBox): ''' class docs ''' PADDING_Y = 20 ICON_SIZE = 64 ICON_PADDING_X = 50 STAR_PADDING_X = 36 STAR_PADDING_Y = 12 STAR_SIZE = 13 MARK_NUMBER_SIZE = 11 MARK_NUMBER_PADDING_X = 4 MARK_NUMBER_PADDING_Y = 10 INFO_RENDER_X = 10 INFO_RENDER_Y = 140 INFO_RENDER_HEIGHT = 18 INFO_CATEGORY_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT INFO_VERSION_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 2 INFO_SIZE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 3 INFO_DOWNLOAD_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 4 INFO_HOMEPAGE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 5 LEFT_INFO_PADDING_X = 18 LEFT_INFO_PADDING_Y = 50 LEFT_BUTTON_PADDING_Y = 50 LEFT_INFO_WIDTH = 164 RIGHT_INFO_PADDING_X = 30 RIGHT_TITLE_BOX_HEIGHT = 70 ALIAS_NAME_SIZE = 16 ALIAS_NAME_PADDING_Y = 20 LONG_DESC_PADDING_Y = 10 LONG_DESC_WRAP_WIDTH = 630 LONG_DESC_INIT_HEIGHT = 45 MARK_SIZE = 11 MARK_PADDING_X = 5 MARK_PADDING_Y = -3 def __init__(self, data_manager): ''' init docs ''' gtk.HBox.__init__(self) self.data_manager = data_manager self.pkg_name = None self.alias_name = "" self.pkg_pixbuf = None self.pkg_star_view = None self.left_view_box = gtk.VBox() self.left_view_box.set_size_request(self.LEFT_INFO_WIDTH, - 1) self.left_logo_box = gtk.VBox() self.left_logo_box.set_size_request(-1, 90) self.star_box = gtk.HBox() self.star_align = gtk.Alignment(0.4, 0.5, 0, 0) self.star_align.set_padding(0, 5, 0, 0) self.star_align.add(self.star_box) self.left_action_box = gtk.HBox() self.left_action_align = gtk.Alignment() self.left_action_align.set(0.5, 0.5, 0, 0) self.left_action_align.set_padding(0, 30, 0, 0) self.left_action_align.add(self.left_action_box) self.left_label_table = gtk.Table(4, 1) self.left_label_table.set_row_spacings(4) self.left_label_align = gtk.Alignment() self.left_label_align.set(0.0, 0.5, 0, 0) self.left_label_align.set_padding(0, 0, 14, 0) self.left_category_name_label = Label() self.left_category_label = Label(hover_color=app_theme.get_color("homepage_hover")) self.left_category_label.set_clickable() self.left_category_label_align = gtk.Alignment() self.left_category_label_align.set(0.0, 0.5, 0, 0) self.left_category_label_align.add(self.left_category_label) self.left_category_label_box = gtk.HBox() self.left_category_label_box.pack_start(self.left_category_name_label, False, False) self.left_category_label_box.pack_start(self.left_category_label_align, True, True) self.left_category_box = gtk.VBox() self.left_version_label = Label(label_width=136) show_label_tooltip(self.left_version_label) self.left_version_label.set_ellipsize(pango.ELLIPSIZE_END) self.left_download_label = Label() self.left_size_label = Label() self.left_homepage_box = gtk.HBox() self.left_homepage_box_align = gtk.Alignment() self.left_homepage_box_align.set(0.0, 0.5, 0, 0) self.left_homepage_box_align.add(self.left_homepage_box) self.left_recommend_box = gtk.VBox() self.left_recommend_box_align = gtk.Alignment() self.left_recommend_box_align.set(0.0, 0.0, 0, 0) self.left_recommend_box_align.set_padding(30, 0, 14, 0) self.left_recommend_box_align.add(self.left_recommend_box) self.left_recommend_label = Label(_("Popular recommendations")) self.right_info_box = gtk.VBox() self.scrolled_window = ScrolledWindow(0, 0) self.right_view_box = gtk.VBox() self.right_top_box = gtk.HBox() self.right_top_box.set_size_request(-1, self.RIGHT_TITLE_BOX_HEIGHT) self.right_desc_box = gtk.VBox() self.right_slide_box = gtk.VBox() self.right_comment_box = gtk.VBox() self.right_title_box = gtk.VBox() self.return_button = ImageButton( app_theme.get_pixbuf("detail/normal.png"), app_theme.get_pixbuf("detail/hover.png"), app_theme.get_pixbuf("detail/press.png"), ) self.return_align = gtk.Alignment() self.return_align.set(0.5, 0.5, 1, 1) self.return_align.set_padding(self.ALIAS_NAME_PADDING_Y, 0, 0, self.RIGHT_INFO_PADDING_X) self.return_align.add(self.return_button) self.return_button.connect("clicked", lambda w: global_event.emit("switch-from-detail-page")) self.right_top_box.pack_start(self.right_title_box, True, True) self.right_top_box.pack_start(self.return_align, False, False) self.right_view_box.pack_start(self.right_top_box, False, False) self.right_view_box.pack_start(self.right_desc_box, False, False) self.right_view_box.pack_start(self.right_slide_box, False, False) self.right_view_box.pack_start(self.right_comment_box, False, False) self.scrolled_window.add_child(self.right_view_box) self.left_view_box.pack_start(self.left_logo_box, False, False) self.left_view_box.pack_start(self.star_align, False, False) self.left_view_box.pack_start(self.left_action_align, False, False) self.left_label_table.attach(self.left_category_box, 0, 1, 0, 1) self.left_label_table.attach(self.left_version_label, 0, 1, 1, 2) self.left_label_table.attach(self.left_size_label, 0, 1, 2, 3) self.left_label_table.attach(self.left_download_label, 0, 1, 3, 4) self.left_label_table.attach(self.left_homepage_box_align, 0, 1, 4, 5) self.left_label_align.add(self.left_label_table) self.left_view_box.pack_start(self.left_label_align, False, False) self.left_view_box.pack_start(self.left_recommend_box_align, False, False) self.right_info_box.pack_start(self.scrolled_window, True, True) self.pack_start(self.left_view_box, False, False) self.pack_start(self.right_info_box, True, True) self.left_view_box.connect("expose-event", self.expose_left_view) self.right_view_box.connect("expose-event", self.expose_right_view) self.left_logo_box.connect("expose-event", self.expose_left_logo_box) self.right_top_box.connect("expose-event", self.expose_right_top_box) self.right_title_box.connect("expose-event", self.expose_right_title_box) self.connect("hierarchy-changed", self.hierarchy_change) self.left_category_label.connect("button-press-event", lambda w, e: self.jump_to_category()) global_event.register_event("download-screenshot-finish", self.download_screenshot_finish) self.loading_label = Label(_("Loading comments...")) self.loading_label_align = gtk.Alignment(0.5, 0, 0, 0) self.loading_label_align.add(self.loading_label) self.loading_label_align.set_padding(10, 0, 0, 0) self.update_pkg_time = 0 self.update_pkg_interval = 0.2 # in seconds def hierarchy_change(self, widget, previous_toplevel): # When detail page remove from it's container, previous_toplevel is not None. if previous_toplevel != None: container_remove_all(self.right_slide_box) # remove slide box first, to avoid screenshot area flash container_remove_all(self.right_comment_box) # remove comment box first, to avoid comment area flash def grade_pkg(self): if self.pkg_star_view: global_event.emit("grade-pkg", (self.pkg_name, self.pkg_star_view), self.pkg_star_view.star_buffer.star_level) self.pkg_star_view.set_star_level(int(self.star)) self.pkg_star_view.queue_draw() def jump_to_category(self): global_event.emit("jump-to-category", self.category[0], self.category[1]) def expose_left_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw split line. cr.set_source_rgb(*color_hex_to_cairo("#AAAAAA")) cr.rectangle(rect.x + rect.width - 1, rect.y, 1, rect.height) cr.fill() def expose_right_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_left_logo_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw pkg icon. self.pkg_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( get_icon_pixbuf_path( utils.get_origin_name(self.pkg_name)), self.ICON_SIZE, self.ICON_SIZE) draw_pixbuf(cr, self.pkg_pixbuf, rect.x + self.ICON_PADDING_X + (self.ICON_SIZE - self.pkg_pixbuf.get_width()) / 2, rect.y + self.PADDING_Y) def expose_right_top_box(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_right_title_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw alias name. draw_text( cr, "<b>%s</b>" % self.alias_name, rect.x + self.RIGHT_INFO_PADDING_X, rect.y + self.ALIAS_NAME_PADDING_Y, rect.width - self.RIGHT_INFO_PADDING_X, self.ALIAS_NAME_SIZE, text_size=self.ALIAS_NAME_SIZE) def expose_resizable_label_background(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def button_press_start_button(self, widget, event, desktops): pixbuf = app_theme.get_pixbuf("button/start_normal.png").get_pixbuf() desktop_infos = self.data_manager.get_pkg_desktop_info(desktops) global_event.emit("start-pkg", self.alias_name, desktop_infos, (int(event.x), int(event.y), pixbuf.get_width() / 2, 0)) @post_gui def update_some_info(self, info): self.star = float(info[0]['mark'].encode('utf-8').strip()) if self.pkg_star_view: self.pkg_star_view.star_buffer.star_level = int(self.star) self.pkg_star_view.queue_draw() self.pkg_star_mark.update_star(self.star) self.pkg_star_mark.queue_draw() self.downlad_number = info[0]['down_nums'].encode('utf-8').strip() self.left_download_label.set_text(_('Download: %s') % self.downlad_number) def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text(get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label(_("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect("button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start(RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel(self.long_desc.replace("&", "&").replace("<", "<").replace(">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all() def handle_pkg_status(self, reply, success): container_remove_all(self.left_action_box) if success: install_status = str(reply) if install_status == "uninstalled": action_button = ImageButton( app_theme.get_pixbuf("button/install_normal.png"), app_theme.get_pixbuf("button/install_hover.png"), app_theme.get_pixbuf("button/install_press.png"), ) action_button.connect("clicked", lambda w: global_event.emit("install-pkg", [self.pkg_name])) self.left_action_box.pack_start(action_button) elif install_status == "unknown": status_label = Label(_("Not found")) self.left_action_box.pack_start(status_label) else: try: desktops = json.loads(install_status) if not desktops: status_label = Label(_("Successfully installed")) self.left_action_box.pack_start(status_label) else: action_button = ImageButton( app_theme.get_pixbuf("button/start_normal.png"), app_theme.get_pixbuf("button/start_hover.png"), app_theme.get_pixbuf("button/start_press.png"), ) action_button.connect("button-press-event", lambda w, e:self.button_press_start_button(w, e, desktops)) self.left_action_box.pack_start(action_button) except: logging.error("detail install status: %s = %s" % (self.pkg_name, install_status)) self.left_action_box.show_all() global_event.emit('update-current-status-pkg-page', self) else: global_logger.logerror("get_pkg_installed handle_dbus_error") global_logger.logerror(reply) def handle_pkg_download_size(self, reply, success): # FIXME: download information display if success: if reply[0] == PKG_SIZE_OWN or reply[0] == PKG_SIZE_DOWNLOAD: self.left_size_label.set_text(_("Size: %s") % bit_to_human_str(reply[1])) elif reply[0] == PKG_SIZE_ERROR: self.left_size_label.set_text("") global_logger.logerror("Error for calculate pkg size!") else: global_logger.logerror("request_pkgs_install_status handle_dbus_error") global_logger.logerror(reply) def fetch_pkg_status(self): self.data_manager.get_pkg_installed(self.pkg_name, self.handle_pkg_status) self.data_manager.get_pkg_download_size(self.pkg_name, self.handle_pkg_download_size) def open_url(self, webview, frame, network_request, nav_action, policy_dec): webbrowser.open(network_request.get_uri()) def webview_console_message_handler(self, webview, message, line, source_id): return True def fetch_comment(self): if is_network_connected(): container_remove_all(self.right_comment_box) loading_label = Label(_("Loading comments...")) loading_label_align = gtk.Alignment(0.5, 0, 0, 0) loading_label_align.add(loading_label) loading_label_align.set_padding(10, 0, 0, 0) self.right_comment_box.pack_start(loading_label_align, False, False) web_view = WebView(os.path.join(CONFIG_DIR, "cookie.txt")) web_view.connect("new-window-policy-decision-requested", self.open_url) web_view.connect('console-message', self.webview_console_message_handler) web_view_align = gtk.Alignment() web_view_align.set(0.5, 0, 0, 0) web_view_align.set_padding(33, 33, 33, 33) web_view_align.add(web_view) web_settings = web_view.get_settings() web_settings.set_property("enable-plugins", False) web_settings.set_property("enable-scripts", True) web_view.open("%s/softcenter/v1/comment?n=%s&hl=%s" % ( SERVER_ADDRESS, self.pkg_name, LANGUAGE, )) web_view.connect("load-finished", self.comment_load_finished_cb, web_view_align) create_thread(self.fetch_screenshot).start() def comment_load_finished_cb(self, webview, frame, web_view_align): self.scrolled_window.connect("vscrollbar-state-changed", lambda w, p: self.load_more_comment(p, webview)) container_remove_all(self.right_comment_box) self.right_comment_box.pack_start(web_view_align, True, True) self.right_comment_box.show_all() def load_more_comment(self, postion, webview): if postion == "bottom": webview.execute_script('$("#nav_next").click();') def fetch_screenshot(self): screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) screenshot_md5_path = os.path.join(screenshot_dir, "screenshot_md5.txt") remote_screenshot_md5_url = "%s/zh_CN/%s/screenshot_md5.txt" % (SCREENSHOT_HOST, self.pkg_name) remote_screenshot_zip_url = "%s/zh_CN/%s/screenshot.zip" % (SCREENSHOT_HOST, self.pkg_name) try: remote_md5 = urllib2.urlopen(remote_screenshot_md5_url).read() need_download = False if os.path.exists(screenshot_dir): if os.path.exists(screenshot_md5_path): local_md5 = read_file(screenshot_md5_path) if remote_md5 != local_md5: need_download = True else: need_download = True else: need_download = True if need_download: write_file(screenshot_md5_path, remote_md5, True) try: urllib.urlretrieve(remote_screenshot_zip_url, os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name, "screenshot.zip") ) global_event.emit("download-screenshot-finish", self.pkg_name) except Exception, e: global_logger.logerror("Download screenshot error: %s" % e) except Exception, e: global_logger.logerror("fetch_screenshot got error: %s" % e)
def icon_item_release_resource(self): # Return True to tell IconView call gc.collect() to release memory resource. if self.pixbuf: del self.pixbuf self.pixbuf = None return True if __name__ == '__main__': gtk.gdk.threads_init() module_frame = ModuleFrame(os.path.join(get_parent_dir(__file__, 2), "config.ini")) scrolled_window = ScrolledWindow() scrolled_window.set_size_request(788, 467) wallpaper_view = WallpaperView() scrolled_window.add_child(wallpaper_view) module_frame.add(scrolled_window) scrolled_window.connect("vscrollbar-state-changed", wallpaper_view.load_more_background) download_pool = MissionThreadPool(5) download_pool.start() def message_handler(*message): (message_type, message_content) = message if message_type == "show_again": module_frame.send_module_info() elif message_type == "exit": module_frame.exit() module_frame.module_message_handler = message_handler
list_view.add_titles(["歌名", "歌手", "时间"]) #list_view.add_items(items) #list_view.hide_column([1]) #list_view.set_hide_column_flag(False) #list_view.set_hide_column_resize(False) list_view.connect( "double-click-item", lambda listview, item, i, x, y: list_view.set_highlight(item)) list_view.connect("delete-select-items", print_delete_select_items) # list_view.connect("button-press-item", print_button_press) # list_view.connect("double-click-item", print_double_click) # list_view.connect("single-click-item", print_single_click) # list_view.connect("motion-notify-item", print_motion_notify) list_view.connect("right-press-items", print_right_press) scrolled_window.add_child(list_view) ''' if len(list_view.items): list_view.set_highlight(list_view.items[6]) ''' # Add volume button. volume_button = VolumeButton(100, 50) volume_frame = gtk.Alignment() volume_frame.set(0.0, 0.5, 0, 0) volume_frame.set_padding(0, 0, 10, 0) volume_frame.add(volume_button) tab_1_box.pack_start(volume_frame, False, False) # Add entry widget. entry_box = gtk.HBox(spacing=10)
class StartDesktopWindow(Window): ''' class docs ''' def __init__(self): ''' init docs ''' Window.__init__(self) self.window_width = 0 self.window_height = 0 self.max_columns = 4 self.max_rows = 3 self.iconview = IconView(mask_bound_height=0) self.iconview.draw_mask = self.draw_iconview_mask self.iconview.draw_background = self.draw_iconvew_background self.iconview_scrolledwindow = ScrolledWindow(0, 0) self.iconview_scrolledwindow.add_child(self.iconview) self.window_frame.add(self.iconview_scrolledwindow) self.connect("show", self.show_start_desktop_window) wrap_grab_window(start_desktop_grab_window, self) def draw_iconview_mask(self, cr, x, y, w, h): cr.set_source_rgb(1, 1, 1) cr.rectangle(x, y, w, h) cr.fill() def draw_iconvew_background(self, widget, cr): pass def draw_background(self, cr, x, y, w, h): cr.set_operator(cairo.OPERATOR_CLEAR) cr.paint() pass def draw_skin(self, cr, x, y, w, h): pass def draw_mask(self, cr, x, y, w, h): pass def show_start_desktop_window(self, widget): (shadow_x, shadow_y) = self.get_shadow_size() self.window_width += shadow_x * 2 self.window_height += shadow_y * 2 self.set_geometry_hints( None, self.window_width, # minimum width self.window_height, # minimum height self.window_width, self.window_height, -1, -1, -1, -1, -1, -1 ) self.move_x -= shadow_x self.move_y -= shadow_y * 2 self.move(self.move_x, self.move_y) def get_scrolledwindow(self): return self.iconview_scrolledwindow def start(self, pkg_name, desktop_infos, (x, y)): desktop_num = len(desktop_infos) if desktop_num <= self.max_columns: window_width = DESKTOP_ICON_WIDTH * desktop_num window_height = DESKTOP_ICON_HEIGHT elif desktop_num <= self.max_columns * 2: window_width = DESKTOP_ICON_WIDTH * self.max_columns window_height = DESKTOP_ICON_HEIGHT * 2 else: window_width = DESKTOP_ICON_WIDTH * self.max_columns window_height = DESKTOP_ICON_HEIGHT * self.max_rows self.window_width = window_width self.window_height = window_height # Add items. self.iconview.clear() items = [] for desktop_info in desktop_infos: items.append(StartDesktopItem(pkg_name, desktop_info)) self.iconview.add_items(items) self.iconview_scrolledwindow.show_all() self.move_x = x - window_width / 2 self.move_y = y - window_height self.show_all()
def get_scrolled_window(self): scrolled_window = ScrolledWindow() scrolled_window.connect("vscrollbar-state-changed", self.__on_vscrollbar_state_changed) scrolled_window.add_child(self) return scrolled_window
def get_scrolled_window(self): scrolled_window = ScrolledWindow(0, 0) scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled_window.add_child(self) return scrolled_window
class SecondCategoryItem(TreeItem): ''' class docs ''' def __init__(self, first_category_name, second_category_name, data_manager): ''' init docs ''' TreeItem.__init__(self) self.first_category_name = first_category_name self.second_category_name = second_category_name self.data_manager = data_manager def render_name(self, cr, rect): text_color = "#333333" 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" 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() draw_text( cr, get_category_name(self.second_category_name), rect.x + SECOND_CATEGORY_PADDING_X, rect.y, rect.width, rect.height, text_size=SECOND_CATEGORY_ITEM_NAME_SIZE, text_color=text_color, ) def get_height(self): return SECOND_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 scrolled_window_vscrollbar_handler(self, widget, state): if state == "bottom": current_item_number = len(self.pkg_icon_view.items) all_pkgs_number = len(self.all_pkg_names) start = current_item_number if current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) < all_pkgs_number: end = current_item_number + LOAD_ITEMS_NUMBER elif current_item_number < all_pkgs_number and ( current_item_number + LOAD_ITEMS_NUMBER) >= all_pkgs_number: end = all_pkgs_number else: return self.load_new_items(self.all_pkg_names[start:end]) def load_new_items(self, pkg_names): items = [] for pkg_name in pkg_names: info = self.data_manager.get_item_pkg_info(pkg_name) items.append( PkgIconItem(info[0], info[1], info[2], self.data_manager)) self.pkg_icon_view.add_items(items) global_event.emit("show-pkg-view", self.page_box) def handle_pkg_install_status_request(self, status, items): for (index, state) in enumerate(status): items[index].is_installed = state items[index].emit_redraw_request() def button_press(self, column, offset_x, offset_y): # init Loading widget loading_box = LoadingBox() global_event.emit("show-pkg-view", loading_box) self.page_box = gtk.VBox() self.all_pkg_names = self.data_manager.get_second_category_packages( self.second_category_name) self.message_bar = MessageBar(18) self.message_bar.set_message( _("%s > %s : %s applications") % ( get_category_name(self.first_category_name), get_category_name(self.second_category_name), len(self.all_pkg_names), )) self.pkg_icon_view = IconView() self.pkg_icon_view.connect("motion-notify-item", tooltip_aciton) if len(self.all_pkg_names) > LOAD_ITEMS_NUMBER: self.load_new_items(self.all_pkg_names[:LOAD_ITEMS_NUMBER]) else: self.load_new_items(self.all_pkg_names) self.pkg_icon_scrolled_window = ScrolledWindow() self.pkg_icon_scrolled_window.connect( "vscrollbar-state-changed", self.scrolled_window_vscrollbar_handler) self.pkg_icon_scrolled_window.add_child(self.pkg_icon_view) self.pkg_icon_view.draw_mask = self.draw_mask self.pkg_icon_view.draw_row_mask = self.draw_row_mask self.page_box.pack_start(self.message_bar, False, False) self.page_box.pack_start(self.pkg_icon_scrolled_window, True, True) global_event.emit("update-current-status-pkg-page", self.pkg_icon_view) def draw_row_mask(self, cr, rect, row): if row % 2 == 1: cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() 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)), ])
class DscPreferenceDialog(PreferenceDialog): def __init__(self): PreferenceDialog.__init__(self, 566, 488) self.current_mirror_item = None self.normal_settings = gtk.VBox() self.normal_settings.set_spacing(TABLE_ROW_SPACING) self.normal_settings.pack_start(self.create_uninstall_box(), False, True) self.normal_settings.pack_start(self.create_download_dir_table(), False, True) self.normal_settings_align = gtk.Alignment(0, 0, 1, 1) self.normal_settings_align.set_padding(padding_left=5, padding_right=5, padding_top=25, padding_bottom=10) self.normal_settings_align.add(self.normal_settings) self.mirror_settings = gtk.VBox() self.mirror_settings.set_app_paintable(True) self.mirror_settings.connect("expose-event", self.mirror_settings_align_expose) self.mirror_settings.set_spacing(TABLE_ROW_SPACING) self.mirror_settings.pack_start(self.create_mirror_select_table(), False, True) self.mirror_settings.pack_start(self.create_source_update_frequency_table(), False, True) self.mirror_settings_inner_align = gtk.Alignment(0.5, 0.5, 1, 1) self.mirror_settings_inner_align.set_padding(padding_top=25, padding_bottom=10, padding_left=0, padding_right=0) self.mirror_settings_inner_align.add(self.mirror_settings) self.mirror_settings_scrolled_win = ScrolledWindow() self.mirror_settings_scrolled_win.add_child(self.mirror_settings_inner_align) self.mirror_settings_align = gtk.Alignment(0, 0, 1, 1) self.mirror_settings_align.set_padding(padding_left=0, padding_right=0, padding_top=0, padding_bottom=3) self.mirror_settings_align.add(self.mirror_settings_scrolled_win) self.set_preference_items([ (_("General"), self.normal_settings_align), (_("Mirrors"), self.mirror_settings_align), (_("About"), AboutBox()), ]) def mirror_settings_align_expose(self, widget, event=None): cr = widget.window.cairo_create() rect = widget.allocation # draw backgound cr.rectangle(*rect) #cr.set_source_rgb(*color_hex_to_cairo("#ff0000")) cr.set_source_rgba(1, 1, 1, 0) cr.fill() def mirror_select_action(self, repo_urls): self.data_manager.change_source_list(repo_urls, reply_handler=handle_dbus_reply, error_handler=handle_dbus_error) def create_mirror_select_table(self): vbox = gtk.VBox() vbox.set_size_request(423, -1) main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Select mirror")) dir_title_label.set_size_request(423, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 10, 0) label_align.add(dir_title_label) self.mirrors_dir = os.path.join(get_parent_dir(__file__, 2), 'mirrors') self.current_mirror_hostname = utils.get_current_mirror_hostname() self.mirror_items = self.get_mirror_items() self.mirror_view = TreeView(self.mirror_items, enable_drag_drop=False, enable_multiple_select=False, #mask_bound_height=0, ) self.mirror_view.set_expand_column(1) self.mirror_view.set_size_request(-1, len(self.mirror_view.visible_items) * self.mirror_view.visible_items[0].get_height()) self.mirror_view.draw_mask = self.mirror_treeview_draw_mask #self.display_current_mirror() self.mirror_test_progressbar = ProgressBar() main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) title = _("Select best mirror") info_message = _("Please wait. The process will take 30 seconds or more depending on your network connection") self.select_best_mirror_dialog = WaitingDialog(title, info_message, self.cancel_mirror_test) global_event.register_event("mirror-changed", self.mirror_changed_handler) global_event.register_event("update-list-finish", self.update_list_finish_handler) vbox.pack_start(main_table, False, False) vbox.pack_start(self.mirror_view, False, False) return vbox def cancel_mirror_test(self, widget): try: self.mirror_test.terminated = True gobject.source_remove(self.update_status_id) except: pass self.select_best_mirror_dialog.hide_all() def update_list_finish_handler(self): self.select_best_mirror_dialog.hide_all() def mirror_changed_handler(self, item): for i in self.mirror_items: if i != item and i.radio_button.active == True: i.radio_button.active = False elif i == item: i.radio_button.active = True self.mirror_view.queue_draw() def test_mirror_action(self, widget): self.select_best_mirror_dialog.set_transient_for(self) self.select_best_mirror_dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT) self.select_best_mirror_dialog.show_all() distro = aptsources.distro.get_distro() #distro.get_sources(SourcesList()) pipe = os.popen("dpkg --print-architecture") arch = pipe.read().strip() test_file = "dists/%s/Contents-%s.gz" % \ ( distro.codename, #"quantal", arch, ) self.mirror_test = MirrorTest(self.mirrors_list, test_file) self.mirror_test.start() # now run the tests in a background thread, and update the UI on each event self.update_status_id = gtk.timeout_add(100, self.update_progress) def update_progress(self): if self.mirror_test.running: return True else: time.sleep(1) if self.mirror_test.best != None: for item in self.mirror_items: if item.mirror == self.mirror_test.best[1]: print item.mirror.get_repo_urls() self.mirror_clicked_callback(item) else: self.select_best_mirror_dialog.loading_widget.hide_all() self.select_best_mirror_dialog.info_message_label.set_text(_("Test for downloading mirror failed. Please check your network connection.")) self.select_best_mirror_dialog.close_button.set_label(_("Close")) return False def mirror_treeview_draw_mask(self, cr, x, y, w, h): cr.set_source_rgba(1, 1, 1, 0.9) cr.rectangle(x, y, w, h) cr.fill() def get_mirror_items(self): items = [] self.mirrors_list = [] for ini_file in os.listdir(self.mirrors_dir): m = Mirror(os.path.join(self.mirrors_dir, ini_file)) item = MirrorItem(m, self.mirror_clicked_callback) if m.hostname == self.current_mirror_hostname: item.radio_button.active = True self.current_mirror_item = item self.mirrors_list.append(m) items.append(item) items.sort(key=lambda x:x.mirror.priority) return items def mirror_clicked_callback(self, item): if item != self.current_mirror_item: self.current_mirror_item = item global_event.emit('change-mirror', item) self.hide_all() def create_source_update_frequency_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Update applications lists")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) self.is_auto_update_button = CheckButton(label_text=_('Update automatically')) self.is_auto_update_button.connect('toggled', self.change_auto_update) self.update_label = Label(_("Time interval: ")) self.update_spin = SpinBox(int(get_update_interval()), 0, 168, 1) self.update_spin.connect("value-changed", lambda w, v: set_update_interval(v)) self.hour_lablel = Label(_(" hour")) self.hour_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(self.update_label, False, False) spin_hbox.pack_start(self.update_spin, False, False) spin_hbox.pack_start(self.hour_lablel, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.is_auto_update_button, 0, 1, 2, 3, xpadding=10, xoptions=gtk.FILL) main_table.attach(spin_hbox, 1, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) if is_auto_update(): self.is_auto_update_button.set_active(True) else: self.is_auto_update_button.toggled() return main_table def create_download_dir_table(self): main_table = gtk.Table(4, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Download settings")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) download_number_label = Label(_('Max download task number: ')) self.download_number_comobox = ComboBox( items = [(str(i+1), i+1) for i in range(10)], select_index = int(get_download_number())-1, ) self.download_number_comobox.connect("item-selected", self.download_number_comobox_changed) download_number_hbox = gtk.HBox(spacing=5) download_number_hbox.pack_start(download_number_label, False, False) download_number_hbox.pack_start(self.download_number_comobox, False, False) change_download_dir_label = Label(_("Download directory: ")) self.dir_entry = InputEntry() self.dir_entry.set_text(get_software_download_dir()) self.dir_entry.set_editable(False) self.dir_entry.set_size(200, 25) modify_button = Button(_("Change")) modify_button.connect("clicked", self.change_download_save_dir) download_dir_hbox = gtk.HBox(spacing=5) download_dir_hbox.pack_start(change_download_dir_label, False, False) download_dir_hbox.pack_start(self.dir_entry, False, False) download_dir_hbox.pack_start(modify_button, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(download_number_hbox, 0, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) main_table.attach(download_dir_hbox, 0, 2, 3, 4, xpadding=10, xoptions=gtk.FILL) return main_table def create_uninstall_box(self): main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) uninstall_title_label = Label(_("On uninstall software")) uninstall_title_label.set_size_request(350, 12) # mini_check_button self.delete_check_button = CheckButton(_("Delete configuration files")) self.delete_check_button.set_active(get_purg_flag()) self.delete_check_button.connect("toggled", lambda w: set_purge_flag(self.delete_check_button.get_active())) main_table.attach(uninstall_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.delete_check_button, 0, 1, 2, 3, yoptions=gtk.FILL) return main_table def change_download_save_dir(self, widget): local_dir = WinDir(False).run() if local_dir: local_dir = os.path.expanduser(local_dir) if local_dir != get_software_download_dir(): self.dir_entry.set_editable(True) self.dir_entry.set_text(local_dir) self.dir_entry.set_editable(False) set_software_download_dir(local_dir) global_event.emit('download-directory-changed') def download_number_comobox_changed(self, widget, name, value, index): set_download_number(value) global_event.emit('max-download-number-changed', value) def change_auto_update(self, widget, data=None): self.update_spin.set_sensitive(widget.get_active()) set_auto_update(widget.get_active()) self.update_label.set_sensitive(widget.get_active()) self.hour_lablel.set_sensitive(widget.get_active()) dsc_daemon_path = os.path.join(get_parent_dir(__file__, 2), 'update_data/apt/dsc-daemon.py') if widget.get_active(): subprocess.Popen(['python', dsc_daemon_path], stderr=subprocess.STDOUT, shell=False)
class DownloadRankPage(gtk.VBox): __gsignals__ = { "get-rank-pkg-names-finish" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), } def __init__(self, data_manager): # Init. gtk.VBox.__init__(self) self.data_manager = data_manager self.tab_box = gtk.HBox() self.tab_box.set_size_request(-1, RANK_TAB_HEIGHT) self.tab_box.set_spacing(1) self.tab_box_align = gtk.Alignment() self.tab_box_align.set(1, 0, 0, 0) self.tab_box_align.set_padding(3, 9, 25, 48) for (tab_index, tab_name) in enumerate([_("Top 25 weekly"), _("Top 25 monthly"), _("Top 25 totally")]): self.tab_box.pack_start(RankTab(tab_index, tab_name, tab_index == 0), False, False) self.page_box = gtk.VBox() self.page_align = gtk.Alignment() self.page_align.set(0.5, 0.5, 1, 1) self.page_align.set_padding(0, 0, 15, 15) self.week_rank_icon_view = IconView() self.week_rank_icon_view_scrlledwindow = ScrolledWindow() self.week_rank_icon_view.draw_mask = self.draw_mask self.month_rank_icon_view = IconView() self.month_rank_icon_view_scrlledwindow = ScrolledWindow() self.month_rank_icon_view.draw_mask = self.draw_mask self.all_rank_icon_view = IconView() self.all_rank_icon_view_scrlledwindow = ScrolledWindow() self.all_rank_icon_view.draw_mask = self.draw_mask self.week_rank_icon_view_scrlledwindow.add_child(self.week_rank_icon_view) self.month_rank_icon_view_scrlledwindow.add_child(self.month_rank_icon_view) self.all_rank_icon_view_scrlledwindow.add_child(self.all_rank_icon_view) self.tab_box_align.add(self.tab_box) self.page_box.pack_start(self.page_align) self.pack_start(self.tab_box_align, False, False) self.pack_start(self.page_box, True, True) self.loading = LoadingBox() self.view_list = [ ('week', self.week_rank_icon_view, self.week_rank_icon_view_scrlledwindow), ('month', self.month_rank_icon_view, self.month_rank_icon_view_scrlledwindow), ('all', self.all_rank_icon_view, self.all_rank_icon_view_scrlledwindow)] self.pkg_names = [] self.show_flag = None self.all_show_flag = ['week', 'month', 'all'] global_event.register_event("update-rank-page", self.update_rank_page) gtk.timeout_add(300, self.get_pkgs_status) global_event.emit("update-rank-page", 0) def get_rank_pkg_names(self, data_type): pkg_names = [] try: url = "%s/softcenter/v1/soft?a=top&r=%s" % (SERVER_ADDRESS, data_type) result = urllib2.urlopen(url, timeout=POST_TIMEOUT).read() if data_type == 'week' or data_type == 'month': rank = json.loads(result)[0] rank = eval(rank["rank_packages"].encode("utf-8")) for info in rank: pkg_names.append(info[0]) else: rank = json.loads(result) for info in rank: name = info['name'].encode('utf-8') if name not in pkg_names: pkg_names.append(name) except Exception, e: print "Get %s rank error: %s" % (data_type, e) self.pkg_names = pkg_names self.show_flag = data_type
class Browser(gtk.VBox, SignalContainer): def __init__(self, db_query): gtk.VBox.__init__(self) SignalContainer.__init__(self) self.__db_query = db_query self._tree = {} self.__selected_tag = {"album": [], "artist": [], "genre": []} self.view_mode = ICON_VIEW_MODE self.__search_flag = False self.__song_cache_items = [] self.__cover_cache_items = [] # init widget. self.entry_box = SearchEntry("") self.entry_box.set_size(155, 22) self.entry_box.entry.connect("changed", self.__search_cb) # upper box. self.back_button = self.__create_simple_button("back", self.__switch_to_filter_view) self.back_button.set_no_show_all(True) back_align = gtk.Alignment() back_align.set(0.5, 0.5, 0, 0) back_align.set_padding(0, 0, 0, 10) back_align.add(self.back_button) # path control self.path_combo_box = ComboMenuButton() self.path_combo_box.connect("list-actived", lambda w: self.update_path_list_view()) self.path_combo_box.connect("combo-actived", lambda w, k : self.update_path_filter_view(k)) path_combo_align = gtk.Alignment() path_combo_align.set_padding(0, 0, 10, 0) path_combo_align.add(self.path_combo_box) self.path_combo_box.set_no_show_all(True) upper_box = gtk.HBox(spacing=5) upper_box.pack_start(path_combo_align, False, False) upper_box.pack_start(create_right_align(), True, True) upper_box.pack_start(back_align, False, False) entry_box_align = gtk.Alignment() entry_box_align.set(0.5, 0.5, 0, 0) entry_box_align.set_padding(1, 0, 0, 0) entry_box_align.add(self.entry_box) upper_box.pack_start(entry_box_align, False, False) upper_box_align = gtk.Alignment() upper_box_align.set_padding(0, 10, 0, 10) upper_box_align.set(0.5, 0.5, 1, 1) upper_box_align.connect("expose-event", self.expose_upper_box_mask) upper_box_align.add(upper_box) self.categorybar_status = "artist" self.filter_categorybar = OptionBar( [(app_theme.get_pixbuf("filter/artist_normal.png"), app_theme.get_pixbuf("filter/artist_press.png"), _("By artist"), lambda : self.reload_filter_view("artist", True)), (app_theme.get_pixbuf("filter/album_normal.png"), app_theme.get_pixbuf("filter/album_press.png"), _("By album"), lambda : self.reload_filter_view("album", True)), (app_theme.get_pixbuf("filter/genre_normal.png"), app_theme.get_pixbuf("filter/genre_press.png"), _("By genre"), lambda : self.reload_filter_view("genre", True)),] ) # Song path bar. self.__current_path = None self.current_icon_item = None self.reload_path_flag = True self.path_categorybar = SongPathBar(_("Local")) self.path_categorybar.set_size_request(-1, 205) # Song import bar. self.import_categorybar = SongImportBar() self.import_categorybar.reload_items( [ (_("Scan Home dir"), lambda : ImportFolderJob([os.path.expanduser("~")])), (_("Select dir to scan"), lambda : ImportFolderJob()), (_("Refresh library"), lambda : ReloadDBJob())] ) # iconview. self.filter_view = IconView(10, 10) targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2)] self.filter_view.drag_source_set(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_COPY) self.filter_view.connect("drag-data-get", self.__on_drag_data_get) self.filter_view.connect("double-click-item", self.__on_double_click_item) self.filter_view.connect("single-click-item", self.__on_single_click_item) self.filter_view.draw_mask = self.draw_filter_view_mask self.filter_scrolled_window = ScrolledWindow() self.filter_scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.filter_scrolled_window.add_child(self.filter_view) # songs_view self.songs_view = MultiDragSongView() self.songs_view.add_titles([_("Title"), _("Artist"), _("Album"), _("Added time")]) self.songs_scrolled_window = ScrolledWindow(0, 0) self.songs_scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.songs_scrolled_window.add_child(self.songs_view) # left_vbox align = gtk.Alignment() align.set(0, 1, 0, 0) left_box = gtk.VBox(spacing=10) left_box.set_size_request(140, -1) left_box.pack_start(self.filter_categorybar, False, False) left_box.pack_start(self.create_separator_box(), False, False) left_box.pack_start(self.path_categorybar, False, False) left_box.pack_start(self.create_separator_box(), False, False) left_box.pack_start(self.import_categorybar, False, False) left_box.pack_start(align, True, True) left_box.connect("expose-event", self.expose_left_box_mask) # right_box. self.right_box = gtk.VBox() self.right_box.add(self.filter_scrolled_window) # swith_box right_box_align = gtk.Alignment() right_box_align.set_padding(0, 0, 0, 2) right_box_align.set(1, 1, 1, 1) right_box_align.add(self.right_box) browser_box = gtk.VBox() browser_box.pack_start(upper_box_align, False, False) browser_box.pack_start(right_box_align, True, True) body_box = gtk.HBox() body_box.pack_start(left_box, False, False) body_box.pack_start(browser_box, True, True) self.pack_start(body_box, True, True) self.reload_flag = False Dispatcher.connect("reload-browser", self.reload_browser) gobject.timeout_add(5000, self.interval_reload_browser) def __create_simple_button(self, name, callback): button = ImageButton( app_theme.get_pixbuf("filter/%s_normal.png" % name), app_theme.get_pixbuf("filter/%s_hover.png" % name), app_theme.get_pixbuf("filter/%s_press.png" % name), ) if callback: button.connect("clicked", callback) return button def expose_left_box_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "layoutRight") return False def expose_upper_box_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x, rect.y, rect.width - 2, rect.height, "layoutLast") return False def draw_filter_view_mask(self, cr, x, y, width, height): draw_alpha_mask(cr, x, y, width, height, "layoutLast") def create_separator_box(self, padding_x=0, padding_y=0): separator_box = HSeparator( app_theme.get_shadow_color("hSeparator").get_color_info(), padding_x, padding_y) return separator_box def __switch_to_filter_view(self, widget): self.back_button.set_no_show_all(True) self.back_button.hide() self.switch_box(self.right_box, self.filter_scrolled_window) self.view_mode = ICON_VIEW_MODE def reload_filter_view(self, tag="artist", switch=False, use_path=False): self.entry_box.entry.set_text("") self.back_button.set_no_show_all(True) self.back_button.hide() self.categorybar_status = tag self.filter_view.clear() if not use_path: self.path_categorybar.set_index(-1) _dict = self.get_infos_from_db(tag) keys = _dict.keys() keys.sort() items = [] all_nb = len(self.__db_query.get_all_songs()) items.append(IconItem(("deepin-all-songs", "deepin-all-songs", all_nb, tag))) for key in keys: value, nb = _dict[key] items.append(IconItem((key, value, nb, tag))) self.filter_view.add_items(items) if switch: self.switch_box(self.right_box, self.filter_scrolled_window) self.view_mode = ICON_VIEW_MODE if not use_path: self.change_combo_box_status(True) def get_infos_from_db(self, tag, values=None): genres = [] artists = [] extened = False return self.__db_query.get_info(tag, genres, artists, values, extened) def get_attr_infos_from_db(self, info_type="###ALL###", song_dir=None): return self.__db_query.get_attr_infos(info_type, song_dir) def change_combo_box_status(self, hide=False): if not hide: self.path_combo_box.set_no_show_all(False) self.path_combo_box.show_all() else: self.path_combo_box.hide_all() self.path_combo_box.set_no_show_all(True) def update_path_songs(self, key): self.back_button.set_no_show_all(True) self.back_button.hide() self.filter_categorybar.set_index(-1) self.__current_path = key self.change_combo_box_status() if self.path_combo_box.get_combo_active(): self.update_path_filter_view(self.path_combo_box.current_status) else: songs = self.__db_query.get_attr_songs(key) self.update_songs_view(songs) def update_path_list_view(self): self.back_button.set_no_show_all(True) self.back_button.hide() if self.__current_path == "###ALL###": songs = self.__db_query.get_all_songs() else: songs = self.__db_query.get_attr_songs(self.__current_path) self.update_songs_view(songs) def update_path_filter_view(self, name): self.back_button.set_no_show_all(True) self.back_button.hide() self.entry_box.entry.set_text("") self.filter_view.clear() if self.__current_path == "###ALL###": self.reload_filter_view(name, True, True) else: attr_infos = self.get_attr_infos_from_db(name, self.__current_path) items = [] for info in attr_infos: key, value, nb, tag = info items.append(IconItem((key, value, nb, tag))) self.filter_view.add_items(items) if self.view_mode != ICON_VIEW_MODE: self.switch_box(self.right_box, self.filter_scrolled_window) self.view_mode = ICON_VIEW_MODE def reload_song_path(self): path_infos = self.get_attr_infos_from_db() if path_infos: self.path_categorybar.update_items([(name[0], self.update_path_songs, name[1]) for name in path_infos]) def connect_to_db(self): self.autoconnect(self.__db_query, "added", self.__added_song_cb) self.autoconnect(self.__db_query, "removed", self.__removed_song_cb) self.autoconnect(self.__db_query, "update-tag", self.__update_tag_view) self.autoconnect(self.__db_query, "full-update", self.__full_update) self.autoconnect(self.__db_query, "quick-update", self.__quick_update) self.__db_query.set_query("") def __added_song_cb(self, db_query, songs): self.reload_song_path() self.reload_flag = True def __removed_song_cb(self, db_query, songs): self.reload_song_path() self.reload_flag = True def reload_browser(self, obj, infos): if infos: self.reload_flag = True def interval_reload_browser(self): if self.reload_flag and not self.__search_flag: self.reload_all_items() self.reload_flag = False return True def reload_all_items(self): if self.view_mode == ICON_VIEW_MODE: if self.path_categorybar.get_index() == -1: self.reload_filter_view(self.categorybar_status) else: self.update_path_filter_view(self.path_combo_box.current_status) else: if self.path_categorybar.get_index() == -1: if self.current_icon_item: self.update_category_songs_view(self.current_icon_item) else: if self.current_icon_item: self.update_path_songs_view(self.current_icon_item) def __update_tag_view(self, db_query, tag, values): if values: self.reload_flag = True def __quick_update(self, db_query, songs): pass def __full_update(self, db_query): self.reload_filter_view() self.reload_song_path() def __get_selected_songs(self, tag="artist"): artists = [] albums = [] genres = [] if tag == "artist": artists = self.__selected_tag["artist"] elif tag == "album": albums = self.__selected_tag["album"] elif tag == "genre": genres = self.__selected_tag["genre"] return self.__db_query.get_songs(genres, artists, albums) def __on_drag_data_get(self, widget, context, selection, info, timestamp): item = self.filter_view.highlight_item if not item: return if item.key_name == "deepin-all-songs": songs = self.__db_query.get_all_songs() else: del self.__selected_tag[item.tag] self.__selected_tag[item.tag] = [item.key_name] songs = self.__get_selected_songs(item.tag) if not songs: return songs = list(songs) songs.sort() list_uris = list([ song.get("uri") for song in songs]) selection.set("text/deepin-songs", 8, "\n".join(list_uris)) selection.set_uris(list_uris) def __on_double_click_item(self, widget, item, x, y): self.current_icon_item = item self.entry_box.entry.set_text("") self.back_button.set_no_show_all(False) self.back_button.show() if self.path_categorybar.get_index() == -1: self.update_category_songs_view(item) else: self.update_path_songs_view(item) def update_category_songs_view(self, item): if item.key_name == "deepin-all-songs": songs = self.__db_query.get_all_songs() else: self.__selected_tag[item.tag] = [item.key_name] songs = self.__get_selected_songs(item.tag) self.update_songs_view(songs, item.tag) def update_path_songs_view(self, item): songs = self.__db_query.get_attr_songs(self.__current_path, item.tag, item.key_name) if songs: self.update_songs_view(songs, item.tag) def update_songs_view(self, items, sort_key="title"): self.songs_view.clear() self.entry_box.entry.set_text("") self.songs_view.add_songs(items) self.songs_view.set_sort_keyword(sort_key) if self.view_mode != LIST_VIEW_MODE: self.switch_box(self.right_box, self.songs_scrolled_window) self.view_mode= LIST_VIEW_MODE def __on_single_click_item(self, widget, item, x, y): if item.pointer_in_play_rect(x, y): if item.key_name == "deepin-all-songs": songs = self.__db_query.get_all_songs() else: del self.__selected_tag[item.tag] self.__selected_tag[item.tag] = [item.key_name] songs = self.__get_selected_songs(item.tag) if not songs: return songs = list(songs) songs.sort() if not songs: return Dispatcher.play_and_add_song(songs) def __search_cb(self, widget, text): if self.view_mode == LIST_VIEW_MODE: if not self.__search_flag: self.__song_cache_items = self.songs_view.items[:] # Clear song_view select status self.songs_view.select_rows = [] if text != "": self.__search_flag = True results = filter(lambda item: text.lower().replace(" ", "") in item.get_song().get("search", ""), self.__song_cache_items) self.songs_view.items = results self.songs_view.update_item_index() self.songs_view.update_vadjustment() else: self.__search_flag = False self.songs_view.items = self.__song_cache_items self.songs_view.update_item_index() self.songs_view.update_vadjustment() self.songs_view.queue_draw() elif self.view_mode == ICON_VIEW_MODE: if not self.__search_flag: self.__cover_cache_items = self.filter_view.items[:] if text != "": self.__search_flag = True results = filter(lambda item: text.lower().replace(" ", "") in item.retrieve, self.__cover_cache_items) self.filter_view.items = results else: self.__search_flag = False self.filter_view.items = self.__cover_cache_items self.filter_view.queue_draw() def switch_box(self, parent, child): switch_tab(parent, child)
class DisplayView(gtk.VBox): ''' class docs ''' def __init__(self): ''' init docs ''' gtk.VBox.__init__(self) self.brightness_id = None self.display_manager = DisplayManager() self.__xrandr_settings = self.display_manager.get_xrandr_settings() self.__xrandr_settings.connect("changed", self.__xrandr_changed) self.resize_width = 790 self.resize_height = 200 self.monitor_items = [] self.__output_names = [] self.__current_output_name = self.display_manager.get_primary_output_name() self.__setup_monitor_items() self.sizes_items = [] self.monitor_combo = None if len(self.monitor_items) > 1 and self.display_manager.is_copy_monitors(): self.__set_same_sizes() else: self.__setup_sizes_items() self.multi_monitors_items = [(_("Copy Display"), 1), (_("Extend Display"), 2), (_("Only shown in display 1"), 3), (_("Only shown in display 2"), 4)] self.rotation_items = [(_("Normal"), 1), (_("Right"), 2), (_("Left"), 3), (_("Inverted"), 4)] self.duration_items = [("1 %s" % _("Minute"), 1), ("2 %s" % _("Minutes"), 2), ("3 %s" % _("Minutes"), 3), ("5 %s" % _("Minutes"), 5), ("10 %s" % _("Minutes"), 10), ("30 %s" % _("Minutes"), 30), ("1 %s" % _("Hour"), 60), (_("Never"), DisplayManager.BIG_NUM / 60)] ''' scrolled_window ''' self.scrolled_window = ScrolledWindow() self.scrolled_window.set_size_request(-1, 425) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.main_box = gtk.VBox() self.main_box.set_size_request(600, -1) self.body_box = gtk.HBox() ''' left, right align ''' self.left_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, padding_left = TEXT_WINDOW_LEFT_PADDING) self.right_align = self.__setup_align(padding_top = FRAME_TOP_PADDING, padding_left = 0) ''' left, right box ''' self.left_box = gtk.VBox(spacing = WIDGET_SPACING) self.right_box = gtk.VBox(spacing = WIDGET_SPACING) ''' monitor operation && detect ''' self.monitor_resize_align = self.__setup_align(padding_top = 11, padding_left = int(TEXT_WINDOW_LEFT_PADDING / 2)) self.monitor_resize_box = MonitorResizableBox(self.display_manager) self.monitor_resize_box.select_output(self.__current_output_name) self.monitor_resize_box.connect("select-output", self.__select_output) self.monitor_resize_box.connect("resize", self.__resize_box) self.monitor_resize_align.add(self.monitor_resize_box) ''' monitor display ''' self.monitor_display_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_display.png"), _("Display"), 0) ''' monitor ''' self.monitor_align = self.__setup_align() self.monitor_box = gtk.HBox(spacing = WIDGET_SPACING) self.monitor_label = self.__setup_label(_("Monitor")) self.monitor_combo = self.__setup_combo(self.monitor_items) self.monitor_combo.set_select_index(self.display_manager.get_primary_output_name_index(self.monitor_items)) self.monitor_combo.connect("item-selected", self.__combo_item_selected, "monitor_combo") self.__widget_pack_start(self.monitor_box, [self.monitor_label, self.monitor_combo]) self.monitor_align.add(self.monitor_box) ''' goto individuation or power setting ''' self.goto_align = self.__setup_align() self.goto_box = gtk.VBox(spacing = WIDGET_SPACING) self.goto_label = self.__setup_label(_("Relevant Settings"), text_size = TITLE_FONT_SIZE, width = None, align = ALIGN_START) goto_color = GOTO_FG_COLOR self.goto_individuation_label = self.__setup_label( text = _("<span foreground=\"%s\" underline=\"single\">Personalization</span>") % goto_color, width = None, align = ALIGN_START) self.goto_individuation_label.connect("button-press-event", self.__button_press, "individuation") set_clickable_cursor(self.goto_individuation_label) self.goto_power_label = self.__setup_label( text = _("<span foreground=\"%s\" underline=\"single\">Power</span>") % goto_color, width = None, align = ALIGN_START) self.goto_power_label.connect("button-press-event", self.__button_press, "power") set_clickable_cursor(self.goto_power_label) self.__widget_pack_start(self.goto_box, [self.goto_label, self.goto_individuation_label, self.goto_power_label ]) self.goto_align.add(self.goto_box) ''' sizes ''' self.sizes_align = self.__setup_align() self.sizes_box = gtk.HBox(spacing = WIDGET_SPACING) self.sizes_label = self.__setup_label(_("Resolution")) self.sizes_combo = self.__setup_combo(self.sizes_items) if self.sizes_combo: self.sizes_combo.set_select_index( self.display_manager.get_screen_size_index(self.__current_output_name, self.sizes_items)) self.sizes_combo.connect("item-selected", self.__combo_item_selected, "sizes_combo") self.__widget_pack_start(self.sizes_box, [self.sizes_label, self.sizes_combo]) self.sizes_align.add(self.sizes_box) ''' rotation ''' self.rotation_align = self.__setup_align() self.rotation_box = gtk.HBox(spacing = WIDGET_SPACING) self.rotation_label = self.__setup_label(_("Rotation")) self.rotation_combo = self.__setup_combo(self.rotation_items) self.rotation_combo.set_select_index(self.display_manager.get_screen_rotation_index(self.__current_output_name)) self.rotation_combo.connect("item-selected", self.__combo_item_selected, "rotation_combo") self.__widget_pack_start(self.rotation_box, [self.rotation_label, self.rotation_combo]) self.rotation_align.add(self.rotation_box) ''' multi-monitors ''' self.multi_monitors_align = self.__setup_align() self.multi_monitors_box = gtk.HBox(spacing = WIDGET_SPACING) self.multi_monitors_label = self.__setup_label(_("Multi-Monitor")) self.multi_monitors_combo = self.__setup_combo(self.multi_monitors_items) self.multi_monitors_combo.set_select_index(self.display_manager.get_multi_monitor_index()) self.multi_monitors_combo.connect("item-selected", self.__combo_item_selected, "multi_monitors_combo") self.__widget_pack_start(self.multi_monitors_box, [self.multi_monitors_label, self.multi_monitors_combo]) self.multi_monitors_align.add(self.multi_monitors_box) if self.display_manager.get_output_count() < 2: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) ''' monitor brightness ''' self.monitor_bright_align = self.__setup_title_align( app_theme.get_pixbuf("display/monitor_bright.png"), _("Brightness")) ''' brightness ''' self.brightness_align = self.__setup_align() self.brightness_box = gtk.HBox(spacing = 2) self.brightness_label_align = self.__setup_align(padding_top = 8, padding_left = 0, padding_right = 5) self.brightness_label = self.__setup_label(_("Brightness")) self.brightness_label_align.add(self.brightness_label) self.brightness_scale = HScalebar(point_dpixbuf = app_theme.get_pixbuf("scalebar/point.png"), value_min = 0.1, value_max = 1.0) self.brightness_scale.set_size_request(HSCALEBAR_WIDTH, 33) self.brightness_scale.set_value(self.display_manager.get_screen_brightness()) self.brightness_scale.connect("value-changed", self.__set_brightness) self.__widget_pack_start(self.brightness_box, [self.brightness_label_align, self.brightness_scale]) self.brightness_align.add(self.brightness_box) ''' auto adjust monitor brightness ''' self.auto_adjust_align = self.__setup_align() self.auto_adjust_box = gtk.HBox(spacing = WIDGET_SPACING) self.auto_adjust_label = self.__setup_label(_("Auto-Brightness")) self.auto_adjust_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158) self.auto_adjust_toggle = self.__setup_toggle() self.auto_adjust_toggle.set_active(self.display_manager.is_enable_close_monitor()) self.auto_adjust_toggle.connect("toggled", self.__toggled, "auto_adjust_toggle") self.auto_adjust_toggle_align.add(self.auto_adjust_toggle) self.__widget_pack_start(self.auto_adjust_box, [self.auto_adjust_label, self.auto_adjust_toggle_align]) self.auto_adjust_align.add(self.auto_adjust_box) ''' close monitor ''' self.close_monitor_align = self.__setup_align() self.close_monitor_box = gtk.HBox(spacing = WIDGET_SPACING) self.close_monitor_label = self.__setup_label(_("Turn off monitor")) self.close_monitor_combo = self.__setup_combo(self.duration_items) self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items)) self.close_monitor_combo.connect("item-selected", self.__combo_item_selected, "close_monitor_combo") self.__widget_pack_start(self.close_monitor_box, [self.close_monitor_label, self.close_monitor_combo]) self.close_monitor_align.add(self.close_monitor_box) ''' monitor lock ''' self.monitor_lock_align = self.__setup_title_align( app_theme.get_pixbuf("lock/lock.png"), _("Lock Screen")) ''' auto monitor lock ''' self.auto_lock_align = self.__setup_align() self.auto_lock_box = gtk.HBox(spacing = WIDGET_SPACING) self.auto_lock_label = self.__setup_label(_("Lock screen automatically")) self.auto_lock_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158) self.auto_lock_toggle = self.__setup_toggle() is_enable_lock_display = self.display_manager.is_enable_lock_display() self.auto_lock_toggle.set_active(is_enable_lock_display) self.auto_lock_toggle.connect("toggled", self.__toggled, "auto_lock_toggle") self.auto_lock_toggle_align.add(self.auto_lock_toggle) self.__widget_pack_start(self.auto_lock_box, [self.auto_lock_label, self.auto_lock_toggle_align]) self.auto_lock_align.add(self.auto_lock_box) ''' lock display ''' self.lock_display_align = self.__setup_align(padding_bottom = 20) self.lock_display_box = gtk.HBox(spacing = WIDGET_SPACING) self.lock_display_label = self.__setup_label(_("Lock Screen")) self.lock_display_combo = self.__setup_combo(self.duration_items) self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items)) self.lock_display_combo.connect("item-selected", self.__combo_item_selected, "lock_display_combo") self.__widget_pack_start(self.lock_display_box, [self.lock_display_label, self.lock_display_combo]) self.lock_display_align.add(self.lock_display_box) ''' left_align pack_start ''' self.__widget_pack_start(self.left_box, [self.monitor_display_align, self.monitor_align, self.sizes_align, self.rotation_align, self.multi_monitors_align, self.monitor_bright_align, self.brightness_align, #self.auto_adjust_align, #self.close_monitor_align, self.monitor_lock_align, self.auto_lock_align, self.lock_display_align]) self.left_align.add(self.left_box) ''' right_align pack_start ''' self.__widget_pack_start(self.right_box, [self.goto_align]) self.right_box.set_size_request(280, -1) self.right_align.add(self.right_box) ''' main && body box ''' self.main_box.pack_start(self.monitor_resize_align, False, False) self.body_box.pack_start(self.left_align) self.body_box.pack_start(self.right_align, False, False) self.main_box.pack_start(self.body_box) ''' this->HBox pack_start ''' self.scrolled_window.add_child(self.main_box) self.pack_start(self.scrolled_window) self.__send_message("status", ("display", "")) def show_again(self): self.__send_message("status", ("display", "")) def reset(self): self.__send_message("status", ("display", _("Reset to default value"))) self.display_manager.reset() self.close_monitor_combo.set_select_index(self.display_manager.get_close_monitor_index(self.duration_items)) self.lock_display_combo.set_select_index(self.display_manager.get_lock_display_index(self.duration_items)) self.multi_monitors_combo.set_select_index(0) def __handle_dbus_replay(self, *reply): pass def __handle_dbus_error(self, *error): pass def __send_message(self, message_type, message_content): if is_dbus_name_exists(APP_DBUS_NAME): bus_object = dbus.SessionBus().get_object(APP_DBUS_NAME, APP_OBJECT_NAME) method = bus_object.get_dbus_method("message_receiver") method(message_type, message_content, reply_handler=self.__handle_dbus_replay, error_handler=self.__handle_dbus_error) def __button_press(self, widget, event, module_id): self.__send_message("goto", (module_id, "")) def __expose(self, widget, event): try: cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR)) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() except e: print "DEBUG", e def __change_current_output(self, output_name, from_monitor_combo=True): self.__current_output_name = output_name if not from_monitor_combo: self.monitor_combo.set_select_index(self.display_manager.get_output_name_index(output_name, self.monitor_items)) if not self.display_manager.is_copy_monitors(): self.__setup_sizes_items() if len(self.sizes_items): self.sizes_combo.add_items(items = self.sizes_items) self.sizes_combo.set_select_index(self.display_manager.get_screen_size_index( self.__current_output_name, self.sizes_items)) def __select_output(self, widget, output_name): print "Output name:", output_name self.__change_current_output(output_name, False) def __set_same_sizes(self): same_sizes = self.display_manager.get_same_sizes( self.display_manager.get_screen_sizes(self.monitor_items[0][1]), self.display_manager.get_screen_sizes(self.monitor_items[1][1])) i = 0 del self.sizes_items[:] while i < len(same_sizes): self.sizes_items.append((same_sizes[i], i)) i += 1 def __xrandr_changed(self, key): if key == "output-names": self.display_manager.init_xml() self.__setup_monitor_items() self.monitor_combo.add_items(items = self.monitor_items) if len(self.monitor_items) > 1: if self.display_manager.is_copy_monitors(): self.__set_same_sizes() self.sizes_combo.add_items(items = self.sizes_items) self.multi_monitors_align.set_size_request(-1, 30) self.multi_monitors_align.set_child_visible(True) else: self.multi_monitors_align.set_size_request(-1, 0) self.multi_monitors_align.set_child_visible(False) return if key == "brightness": self.brightness_scale.set_value(self.display_manager.get_screen_brightness()) return def __set_brightness_value(self, value): self.display_manager.set_screen_brightness(self.__current_output_name, value) def __set_brightness(self, widget, event): value = self.brightness_scale.get_value() self.__send_message("status", ("display", _("Changed brightness to %d%%") % int(value * 100))) if self.brightness_id: gobject.source_remove(self.brightness_id) self.brightness_id = gobject.timeout_add_seconds(1, self.__set_brightness_value, value) def __setup_monitor_items(self): self.__output_names = self.display_manager.get_output_names() del self.monitor_items[:] i = 0 while (i < len(self.__output_names)): self.monitor_items.append(self.display_manager.get_output_name(self.__output_names[i])) i += 1 def __setup_sizes_items(self): screen_sizes = self.display_manager.get_screen_sizes(self.__current_output_name) del self.sizes_items[:] i = 0 while i < len(screen_sizes): self.sizes_items.append((screen_sizes[i], i)) i += 1 def __toggled(self, widget, object=None): if object == "auto_adjust_toggle": if not widget.get_active(): self.__send_message("status", ("display", _("Changed to manual adjustment"))) self.display_manager.set_close_monitor(DisplayManager.BIG_NUM / 60) else: self.__send_message("status", ("display", _("Changed to automatic adjustment"))) return if object == "auto_lock_toggle": if not widget.get_active(): self.lock_display_combo.set_sensitive(False) self.__send_message("status", ("display", _("Changed to manual lock"))) else: self.lock_display_combo.set_sensitive(True) self.__send_message("status", ("display", _("Changed to automatic lock"))) return def __combo_item_selected(self, widget, item_text=None, item_value=None, item_index=None, object=None): if object == "monitor_combo": self.__send_message("status", ("display", _("Changed current output to %s") % item_text)) self.__change_current_output(item_value) return if object == "sizes_combo": size = self.sizes_items[item_value][0] self.__send_message("status", ("display", _("Changed resolution to %s") % size)) self.display_manager.set_screen_size(self.__current_output_name, size) return if object == "rotation_combo": self.__send_message("status", ("display", _("Changed rotation to %s") % item_text)) self.display_manager.set_screen_rotation(self.__current_output_name, item_value) return if object == "multi_monitors_combo": self.__send_message("status", ("display", _("Changed multi-monitor mode to %s") % item_text)) self.display_manager.set_multi_monitor(item_value) return if object == "close_monitor_combo": self.__send_message("status", ("display", _("Idle time before turning off display has been changed to to %s") % item_text)) self.display_manager.set_close_monitor(item_value) return if object == "lock_display_combo": self.__send_message("status", ("display", _("Idle time before locking display has been changed to %s") % item_text)) if item_value == DisplayManager.BIG_NUM / 60: self.auto_lock_toggle.set_active(False) else: self.auto_lock_toggle.set_active(True) self.display_manager.set_lock_display(item_value) return def __resize_box(self, widget, height): self.monitor_resize_box.set_size_request(self.resize_width, height - FRAME_TOP_PADDING) def __setup_separator(self): hseparator = HSeparator(app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0) hseparator.set_size_request(500, HSEPARATOR_HEIGHT) return hseparator def __setup_title_label(self, text="", text_color=app_theme.get_color("globalTitleForeground"), text_size=TITLE_FONT_SIZE, text_x_align=ALIGN_START, label_width=180): return Label(text = text, text_color = text_color, text_size = text_size, text_x_align = text_x_align, label_width = label_width, enable_select = False, enable_double_click = False) def __setup_label(self, text="", text_size=CONTENT_FONT_SIZE, width=180, align=ALIGN_END, wrap_width=None): label = Label(text = text, text_color = None, text_size = text_size, text_x_align = align, label_width = width, wrap_width = wrap_width, enable_select = False, enable_double_click = False) return label def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH): if len(items) == 0: return None combo = ComboBox(items = items, select_index = 0, max_width = width, fixed_width = width) combo.set_size_request(width, WIDGET_HEIGHT) return combo def __setup_toggle(self): toggle = ToggleButton(app_theme.get_pixbuf("toggle_button/inactive_normal.png"), app_theme.get_pixbuf("toggle_button/active_normal.png")) return toggle def __setup_title_align(self, pixbuf, text, padding_top=FRAME_TOP_PADDING, padding_left=0): align = self.__setup_align(padding_top = padding_top, padding_left = padding_left) align_box = gtk.VBox(spacing = WIDGET_SPACING) title_box = gtk.HBox(spacing = WIDGET_SPACING) image = ImageBox(pixbuf) label = self.__setup_title_label(text) separator = self.__setup_separator() self.__widget_pack_start(title_box, [image, label]) self.__widget_pack_start(align_box, [title_box, separator]) align.add(align_box) return align def __setup_align(self, xalign=0, yalign=0, xscale=0, yscale=0, padding_top=0, padding_bottom=0, padding_left=FRAME_LEFT_PADDING + int(WIDGET_SPACING / 2), padding_right=0): align = gtk.Alignment() align.set(xalign, yalign, xscale, yscale) align.set_padding(padding_top, padding_bottom, padding_left, padding_right) align.connect("expose-event", self.__expose) return align def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False): if parent_widget == None: return for item in widgets: parent_widget.pack_start(item, expand, fill)
def get_scrolled_window(self): scrolled_window = ScrolledWindow() scrolled_window.add_child(self) return scrolled_window
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])
def __init__(self, account_setting): super(IconSetPage, self).__init__(False) #self.set_spacing(BETWEEN_SPACING) self.account_setting = account_setting self.choose_menu_without_camera = Menu([ (None, _("Local picture"), self.choose_from_picture), (None, _("Take a screeshot"), self.choose_from_screenshot), ], True) self.choose_menu_with_camera = Menu( [(None, _("Local picture"), self.choose_from_picture), (None, _("Take a screeshot"), self.choose_from_screenshot), (None, _("From camera"), self.choose_from_camera)], True) self.tips_label = Label("Set icon", label_width=460, enable_select=False, enable_double_click=False) self.error_label = Label("", wrap_width=560, enable_select=False, enable_double_click=False) set_page_sw = ScrolledWindow() self.pack_start(set_page_sw) main_vbox = gtk.VBox(False) set_page_sw.add_child(main_vbox) self.icon_list_tabel = gtk.Table() self.icon_list_tabel.set_row_spacings(4) self.icon_list_tabel.set_col_spacings(4) main_vbox.pack_start(tools.make_align(self.tips_label), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) self.history_list_hbox = gtk.HBox(False) self.history_list_hbox.set_size_request(-1, 56) self.history_list_hbox.set_spacing(4) main_vbox.pack_start( tools.make_align(Label(_("Choose a new picture for your account"), label_width=460, enable_select=False, enable_double_click=False), height=CONTAINNER_HEIGHT), False, False) main_vbox.pack_start(tools.make_align(self.icon_list_tabel), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) main_vbox.pack_start( tools.make_align(Label(_("Previously used pictures"), label_width=460, enable_select=False, enable_double_click=False), height=CONTAINNER_HEIGHT), False, False) main_vbox.pack_start(tools.make_align(self.history_list_hbox), False, False) main_vbox.pack_start(tools.make_align(height=20), False, False) main_vbox.pack_start(tools.make_align(self.error_label), False, False) # public picture list #face_dir = '/usr/share/pixmaps/faces' face_dir = '/var/lib/AccountsService/icons' if os.path.exists(face_dir): pic_list = os.listdir(face_dir) else: pic_list = [] pic_list.sort() self.public_icon_list = [] inital_list = [ '001.jpg', '002.jpg', '003.jpg', '004.jpg', '005.jpg', '006.jpg', '007.jpg', '008.jpg', '009.jpg', '010.jpg', '011.jpg', '012.jpg', '013.jpg', '014.jpg', '015.jpg', '016.jpg', '017.jpg', '018.jpg', '019.jpg', '020.jpg' ] for pic in pic_list: if pic not in inital_list: continue try: icon_pixbuf = gtk.gdk.pixbuf_new_from_file( "%s/%s" % (face_dir, pic)).scale_simple( 48, 48, gtk.gdk.INTERP_TILES) except: continue icon_bt = IconButton(icon_pixbuf, "%s/%s" % (face_dir, pic), has_frame=True) icon_bt.connect("pressed", self.on_icon_bt_pressed_cb) self.public_icon_list.append(icon_bt) self.more_icon_button = IconButton(app_theme.get_pixbuf( "%s/more.png" % MODULE_NAME).get_pixbuf(), has_frame=True) self.more_icon_button.connect("button-press-event", self.choose_more_picture) main_vbox.connect("expose-event", self.draw_white_background)
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 PlaylistItem(gobject.GObject): def __init__(self, playlist): '''Init song item.''' self.item_id = None self.main_box = gtk.VBox() self.update(playlist) self.create_jobs_box() def draw_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "layoutMiddle") def create_jobs_box(self): self.file_job_button = self.create_job_button("plus", _("Add Music"), self.song_view.recursion_add_dir) # self.file_job_button.connect("clicked", self.open_file_or_dir) self.job_box = gtk.EventBox() self.job_box.set_size_request(220, -1) targets = [("text/deepin-songs", gtk.TARGET_SAME_APP, 1), ("text/uri-list", 0, 2), ("text/plain", 0, 3)] self.job_box.drag_dest_set(gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_DROP, targets, gtk.gdk.ACTION_COPY) self.job_box.set_visible_window(False) self.job_box.connect("drag-data-received", self.song_view.on_drag_data_received) # Content box. content_box = gtk.VBox() content_box.pack_start(create_bottom_align(), True, True) # content_box.pack_start(ImageBox(app_theme.get_pixbuf("jobs/scan_tip.png")), False, False) content_box.pack_start(self.file_job_button, False, False) content_box.pack_start(create_upper_align(), True, True) # Rind box. rind_box = gtk.HBox() rind_box.pack_start(create_right_align(), True, True) rind_box.pack_start(content_box, False, False) rind_box.pack_start(create_left_align(), True, True) self.job_box.add(rind_box) self.jobs_align = gtk.Alignment() self.jobs_align.set(0.5, 0.5, 1, 1) self.jobs_align.add(self.job_box) self.jobs_align.connect("expose-event", self.draw_mask) def create_job_button(self, icon_name, content, callback=None): button = ComplexButton( [app_theme.get_pixbuf("jobs/complex_normal.png"), app_theme.get_pixbuf("jobs/complex_hover.png"), app_theme.get_pixbuf("jobs/complex_press.png")], app_theme.get_pixbuf("jobs/%s.png" % icon_name), content ) if callback: button.connect("clicked", lambda w : callback()) return button def set_title(self, value): self.title = value def get_title(self): return self.title def get_left_image(self): return None def get_has_arrow(self): return None def set_item_id(self, index): self.item_id = index def get_item_id(self): return self.item_id def update(self, playlist): '''update''' self.playlist = playlist songs = self.playlist.get_songs() self.song_view = SongView() self.song_view.add_songs(songs) self.song_view.connect("begin-add-items", lambda w: self.switch_it()) self.song_view.connect("empty-items", lambda w: self.switch_it(False)) self.scrolled_window = ScrolledWindow(0, 0) self.scrolled_window.add_child(self.song_view) self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.scrolled_window.set_size_request(220, -1) self.title = playlist.get_name() def get_list_widget(self): if self.get_songs(): switch_box(self.main_box, self.scrolled_window) else: switch_box(self.main_box, self.jobs_align) return self.main_box def switch_it(self, scrolled_window=True): if scrolled_window: switch_box(self.main_box, self.scrolled_window) else: switch_box(self.main_box, self.jobs_align) def get_songs(self): if self.song_view: return self.song_view.get_songs()