def popup_right_menu(self, widget, x, y, item, select_items): menu_items = [ (None, _("Play"), self.play_song), (None, _("Add to Playlist"), self.emit_to_playlist), None, (None, _("Remove from Library"), self.remove_songs), (None, _("Move to Trash"), lambda: self.try_move_trash()), None, (None, _("Open Directory"), self.open_song_dir), (None, _("Converter"), self.songs_convert), (None, _("Properties"), self.open_song_editor) ] right_menu = Menu(menu_items, True) if item.song.get_type() == "cue": right_menu.set_menu_item_sensitive_by_index(4, False) right_menu.set_menu_item_sensitive_by_index(7, False) right_menu.show((int(x), int(y)))
def popup_right_menu(self, widget, x, y, item, select_items): menu_items = [ (None, _("Play"), self.play_song), (None, _("Add to Playlist"), self.emit_to_playlist), None, (None, _("Remove from Library"), self.remove_songs), (None, _("Move to Trash"), lambda : self.try_move_trash()), None, (None, _("Open Directory"), self.open_song_dir), (None, _("Converter"), self.songs_convert), (None, _("Properties"), self.open_song_editor) ] right_menu = Menu(menu_items, True) if item.song.get_type() == "cue": right_menu.set_menu_item_sensitive_by_index(4, False) right_menu.set_menu_item_sensitive_by_index(7, False) right_menu.show((int(x), int(y)))
def popup_predefine_menu(self, widget, event): menu_dict = OrderedDict() menu_dict["vitality_yellow"] = _("Vitality yellow") menu_dict["fresh_green"] = _("Fresh green") menu_dict["playful_pink"] = _("Playful pink") menu_dict["cool_blue"] = _("Cool blue") menu_items = [] save_predefine_color = config.get("lyrics", "predefine_color", "vitality_yellow") for key, value in menu_dict.iteritems(): item_pixbuf = None if key == save_predefine_color: item_pixbuf = (app_theme.get_pixbuf("menu/tick.png"), app_theme.get_pixbuf("menu/tick_press.png"), app_theme.get_pixbuf("menu/tick_disable.png")) if item_pixbuf is None: menu_items.append((None, value, self.set_predefine_color, key)) else: menu_items.append((item_pixbuf, value, self.set_predefine_color, key)) predefine_menu = Menu(menu_items, True) predefine_menu.show((int(event.x_root), int(event.y_root)))
def popup_predefine_menu(self, widget, event): menu_dict = OrderedDict() menu_dict["vitality_yellow"] = _("Vitality yellow") menu_dict["fresh_green"] = _("Fresh green") menu_dict["playful_pink"] = _("Playful pink") menu_dict["cool_blue"] = _("Cool blue") menu_items = [] save_predefine_color = config.get("lyrics", "predefine_color", "vitality_yellow") for key, value in menu_dict.iteritems(): item_pixbuf = None if key == save_predefine_color: item_pixbuf = (app_theme.get_pixbuf("menu/tick.png"), app_theme.get_pixbuf("menu/tick_press.png"), app_theme.get_pixbuf("menu/tick_disable.png")) if item_pixbuf is None: menu_items.append((None, value, self.set_predefine_color, key)) else: menu_items.append( (item_pixbuf, value, self.set_predefine_color, key)) predefine_menu = Menu(menu_items, True) predefine_menu.show((int(event.x_root), int(event.y_root)))
(None, "子菜单B3", sub_menu_c), ]) menu = Menu([ (None, "测试测试测试1", None), (None, "测试测试测试2", sub_menu_a), (None, "测试测试测试3", sub_menu_b), (None, "测试测试测试", None), (None, "测试测试测试", None), (None, "测试测试测试4", None, (1, 2, 3)), (None, "测试测试测试5", None), (None, "测试测试测试6", None), ], True) menu.set_menu_item_sensitive_by_index(1, False) application.set_menu_callback(lambda button: menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0))) # Add navigatebar. tab_window_items = map(create_tab_window_item, ["Tab1", "Tab2", "Tab3", "Tab4", "Tab5"]) droplist = Droplist([ ("测试测试测试1", None), ("测试测试测试2", None), ("测试测试测试3", None), None, ("测试测试测试", None), None, ("测试测试测试4", None), ("测试测试测试5", None),
class BaseTrayIcon(object): '''Trayicon base, needs to be derived from.''' def __init__(self, instance): self.update_icon() self.connect_events() self.instance = instance self.menu = None def update_icon(self): self.set_from_pixbuf( gtk.gdk.pixbuf_new_from_file( os.path.join(get_parent_dir(__file__, 3), "image", "logo1.png"))) def get_volume_menu(self): menu_items = [ (None, _("Volume Up"), Player.increase_volume), (None, _("Volume Down"), Player.decrease_volume), (None, _("Mute"), Player.mute_volume), ] return Menu(menu_items) def update_menu(self): menu_items = [] if Player.is_paused(): pixbuf_group = self.get_pixbuf_group("play") status_label = _("Play") else: pixbuf_group = self.get_pixbuf_group("pause") status_label = _("Pause") menu_items.append((pixbuf_group, status_label, Player.playpause)) menu_items.append((self.get_pixbuf_group("previous"), _("Previous"), Player.previous)) menu_items.append( (self.get_pixbuf_group("next"), _("Next"), Player.next)) menu_items.append(None) menu_items.append((self.get_pixbuf_group("volume"), _("Volume"), self.get_volume_menu())) menu_items.append(None) if config.getboolean("lyrics", "status"): menu_items.append( (None, _("Close Lyrics"), lambda: Dispatcher.close_lyrics())) menu_items.append((None, _("Search Lyrics"), lambda: Dispatcher.emit("search-lyrics"))) else: menu_items.append( (None, _("Show Lyrics"), lambda: Dispatcher.show_lyrics())) if config.getboolean("lyrics", "locked"): menu_items.append( (self.get_pixbuf_group("unlock"), _("Unlock Lyrics"), lambda: Dispatcher.unlock_lyrics())) else: menu_items.append((self.get_pixbuf_group("lock"), _("Lock Lyrics"), lambda: Dispatcher.lock_lyrics())) menu_items.append(None) menu_items.append((self.get_pixbuf_group("setting"), _("Preferences"), lambda: Dispatcher.show_setting())) menu_items.append((self.get_pixbuf_group("close"), _("Quit"), lambda: Dispatcher.quit())) if self.menu is not None: del self.menu self.menu = Menu(menu_items, True) def get_pixbuf_group(self, name): return (app_theme.get_pixbuf("tray/%s_normal.png" % name), app_theme.get_pixbuf("tray/%s_hover.png" % name), app_theme.get_pixbuf("tray/%s_disable.png" % name)) def connect_events(self): self.connect("button-press-event", self.on_button_press_event) def on_button_press_event(self, widget, event): if event.button == 1: if event.state == gtk.gdk.CONTROL_MASK: Player.previous() else: self.instance.toggle_visible() elif event.button == 2: Player.playpause() elif event.button == 3: if event.state == gtk.gdk.CONTROL_MASK: Player.next() else: menu = gtk.Menu() (x, y, z) = self.get_menu_position(menu, self) self.update_menu() self.menu.show((int(x), int(y)), (0, -32)) def destroy(self): self.instance.toggle_visible(True) self.set_visible(False)
class PlaylistUI(gtk.VBox): '''Playlist UI.''' def __init__(self): '''Init.''' gtk.VBox.__init__(self) # Init catagory list. self.category_list = CategoryView() setattr(self.category_list, "save_to_library", self.save_to_library) self.category_list.draw_mask = self.draw_category_list_mask self.category_list.connect("single-click-item", self.on_category_single_click) self.category_list.connect("right-press-items", self.on_category_right_press) self.category_list.set_size_request(CATEGROYLIST_WIDTH, -1) del self.category_list.keymap["Delete"] # Init SearchEntry. self.entry_box = SearchEntry("") self.entry_box.entry.connect("changed", self.search_cb) self.entry_box.set_no_show_all(True) entry_align = gtk.Alignment() entry_align.set(0, 0, 1, 1) entry_align.set_padding(2, 0, 10, 10) entry_align.add(self.entry_box) entry_align.connect("expose-event", self.expose_entry_mask) # Init toolbar. self.toolbar_box = gtk.HBox(spacing=45) self.search_button = self.__create_simple_toggle_button("search", self.show_text_entry, _("Search in Current Playlist")) self.__create_simple_button("list", self.popup_list_menu, _("Playlist Operations")) self.__create_simple_button("add", self.popup_add_menu, _("Add")) self.playmode_button = PlaymodeButton(config.get("setting", "loop_mode", "list_mode").split("_")[0]) Tooltip.text(self.playmode_button, _("Playback mode")) self.playmode_button.connect("button-press-event", self.popup_sort_menu) self.toolbar_box.pack_start(self.playmode_button, False, False) self.__create_simple_button("delete", self.popup_delete_menu, _("Delete")) toolbar_align = gtk.Alignment() toolbar_align.set_padding(6, 6, 28, 0) toolbar_align.add(self.toolbar_box) toolbar_align.connect("expose-event", self.expose_toolbar_mask) self.right_box = gtk.VBox() self.right_box.connect("size-allocate", self.on_right_box_size_allocate) self.list_paned = HPaned(handle_color=app_theme.get_color("panedHandler"), enable_drag=True) self.list_paned.pack1(self.category_list, True, True) self.list_paned.pack2(self.right_box, True, False) bottom_box = gtk.VBox() bottom_box.set_size_request(-1, 22) self.pack_start(self.list_paned, True, True) self.pack_start(entry_align, False, False) self.pack_start(toolbar_align, False, True) # Current self.current_playlist = None self.search_time_source = 0 self.current_item = None self.search_flag = False self.cache_items = None self.delete_source_id = None self.drag_source_id = None self.menu_source_id = None self.song_notify_id = None self.detail_menu = None self.save_flag = False if MediaDB.isloaded(): self.__on_db_loaded(MediaDB) else: MediaDB.connect("loaded", self.__on_db_loaded) Player.connect("loaded", self.__on_player_loaded) Dispatcher.connect("play-song", self.__play_and_add) Dispatcher.connect("add-songs", self.__add_songs_to_list) Dispatcher.connect("new-cd-playlist", self.__new_audiocd_playlist) Dispatcher.connect("del-cd-playlist", self.delete_audiocd_list) Dispatcher.connect("save-current-list", self.save_current_playlist) config.connect("config-changed", self.on_config_changed) def on_config_changed(self, config, section, option, value): if section == "setting" and option == "loop_mode": icon_name = value.split("_")[0] self.playmode_button.update_dpixbufs(icon_name, True) def on_right_box_size_allocate(self, widget, rect): if self.current_item: if rect.width > HIDE_PLAYLIST_WIDTH: self.current_item.song_view.set_hide_columns(None) else: self.current_item.song_view.set_hide_columns([1]) def expose_toolbar_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(1, 1, 1, 0.95) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_line(cr, (rect.x, rect.y + 1), (rect.x + rect.width, rect.y + 1), "#b0b0b0") return False def expose_entry_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x , rect.y, rect.width, rect.height, "toolbarEntry") def draw_category_list_mask(self, cr, x, y, width, height): draw_alpha_mask(cr, x, y, width, height, "layoutLeft") def draw_item_mask(self, cr, x, y, width, height): draw_vlinear(cr, x, y, width, height, app_theme.get_shadow_color("editlistItemPress").get_color_info()) def __on_db_loaded(self, db): if not MediaDB.get_playlists(): MediaDB.create_playlist("local", _("Default List")) # From MediaDB loaded playlists. init_items = [ListTreeItem(pl) for pl in MediaDB.get_playlists()] self.category_list.add_items(init_items) # Init Category_list. self.category_list.set_highlight_item(self.get_categroy_item_by_index(self.get_save_item_index())) self.current_item = self.category_list.get_highlight_item() self.delete_source_id = self.current_item.song_view.connect("delete-select-items", self.parser_delete_items) self.drag_source_id = self.current_item.song_view.connect("drag-data-received", self.parser_drag_event) self.menu_source_id = self.current_item.song_view.connect("right-press-items", self.popup_detail_menu) Player.set_source(self.current_item.song_view) self.right_box.add(self.current_item.get_list_widget()) self.category_list.check_view_status() self.list_paned.show_all() def __on_player_loaded(self, player): if self.current_item: self.current_item.song_view.reset_error_items() self.current_item.song_view.set_highlight_song(Player.song) def restore_status(self): uri = config.get("player", "uri") seek = int(config.get("player", "seek")) state = config.get("player", "state") play = False if config.getboolean("player", "play_on_startup") and state == "playing": play = True if uri and self.current_item: song = MediaDB.get_song(uri) if song.get_type() == "cue": seek = seek + song.get("seek", 0) if song and song.exists(): if not config.getboolean("player", "resume_last_progress") or not play: if song.get_type() == "cue": seek = song.get("seek", 0) else: seek = None self.current_item.song_view.play_song(song, play, seek) def __play_and_add(self, widget, song): self.current_item.song_view.add_songs(song, play=True) def __add_songs_to_list(self, widget, songs): if songs and self.current_item.song_view: self.current_item.song_view.add_songs(songs) def get_selected_song_view(self): if self.current_item: return self.current_item.song_view def search_cb(self, widget, text): if not self.search_flag: self.cache_items = self.current_item.song_view.get_items() # Clear song_view select status self.current_item.song_view.clear_highlight() self.current_item.song_view.select_rows = [] if text != "": self.search_flag = True results = filter(lambda item: text.lower().replace(" ", "") in item.get_song().get("search", ""), self.cache_items) self.current_item.song_view.set_song_items(results) else: self.search_flag = False self.current_item.song_view.set_song_items(self.cache_items) if Player.song: self.current_item.song_view.set_highlight_song(Player.song) def parser_delete_items(self, widget, items): if self.search_flag: if self.cache_items != None: [self.cache_items.remove(item) for item in items if item in self.cache_items] def parser_drag_event(self, widget, context, x, y, selection, info, timestamp): if self.search_flag: self.reset_search_entry() def reset_search_entry(self): self.search_button.set_active(False) def __create_simple_toggle_button(self, name, callback, tip_msg=""): toggle_button = ToggleButton( app_theme.get_pixbuf("toolbar/%s_normal.png" % name), app_theme.get_pixbuf("toolbar/%s_press.png" % name), ) toggle_button.connect("toggled", callback) if tip_msg: Tooltip.text(toggle_button, tip_msg) self.toolbar_box.pack_start(toggle_button, False, False) return toggle_button def __create_simple_button(self, name, callback, tip_msg=""): button = ImageButton( app_theme.get_pixbuf("toolbar/%s_normal.png" % name), app_theme.get_pixbuf("toolbar/%s_hover.png" % name), app_theme.get_pixbuf("toolbar/%s_press.png" % name), ) button.connect("button-press-event", callback) if tip_msg: Tooltip.text(button, tip_msg) self.toolbar_box.pack_start(button, False, False) return button def popup_add_menu(self, widget, event): self.current_item.song_view.popup_add_menu(int(event.x_root), int(event.y_root)) def popup_list_menu(self, widget, event): menu_items = [(None, _("New List"), self.new_list), (None, _("Import List"), self.leading_in_list), (None, _("Open List"), self.add_to_list), (None, _("Export List"), self.leading_out_list), (None, _("Remove List"), self.delete_item_list), None, (None, _("Save all Lists"), self.save_all_list)] Menu(menu_items, True).show((int(event.x_root), int(event.y_root))) def new_list(self, items=[], name=None): index = len(self.category_list.get_items()) if name is None: name = "%s%d" % (_("New List"), index) input_dialog = InputDialog(_("New List"), name, 300, 100, lambda name : self.create_new_playlist(name, items)) input_dialog.show_all() def create_new_playlist(self, name, items): self.category_list.add_items([ListTreeItem(Playlist("local", name, items))]) def __new_audiocd_playlist(self, obj, name, songs, udi): self.category_list.add_items([ListTreeItem(CDPlaylist("audiocd", name, songs), udi=udi)]) def get_categroy_other_items(self): other_items = [] highlight_item = self.category_list.get_highlight_item() for item in self.category_list.get_items(): if highlight_item == item: continue other_items.append(item) return other_items def get_categroy_index_by_item(self, item): index = -1 for each_index, each_item in enumerate(self.category_list.get_items()): if item == each_item: index = each_index break return index def get_categroy_item_by_index(self, index): try: return self.category_list.get_items()[index] except: return None def get_edit_sub_menu(self, select_items, move=False): sub_menu_items = [] if len(self.category_list.get_items()) > 1: other_category_items = self.get_categroy_other_items() sub_menu_items = [(None, category_item.get_title(), self.edit_list_item, category_item, select_items ,move) for category_item in other_category_items] if sub_menu_items: sub_menu_items.extend([None, ((app_theme.get_pixbuf("toolbar/add_normal.png"), None, None), _("New List"), self.edit_new_list_item, select_items, move)]) else: sub_menu_items.extend([((app_theme.get_pixbuf("toolbar/add_normal.png"), None, None), _("New List"), self.edit_new_list_item, select_items, move)]) return Menu(sub_menu_items) def edit_list_item(self, category_item, select_items, move): try: category_item.song_view.add_items(select_items) category_item.song_view.update_item_index() category_item.song_view.update_vadjustment() if move: self.current_item.song_view.remove_select_items() except: pass else: self.current_item.song_view.update_item_index() self.current_item.song_view.update_vadjustment() def edit_new_list_item(self, select_items, move): self.new_list([item.get_song().get("uri") for item in select_items]) if move: self.current_item.song_view.remove_select_items() self.current_item.song_view.update_item_index() self.current_item.song_view.update_vadjustment() def leading_in_list(self): uri = WindowLoadPlaylist().run() try: self.import_list_from_uri(uri) except: pass def import_list_from_uri(self, uri): p_name = utils.get_filename(uri) pl = MediaDB.create_playlist("local", p_name, []) new_item = ListTreeItem(pl) self.category_list.add_items([new_item]) new_item.song_view.async_add_uris(uri) def leading_out_list(self, item): if not item: item = self.current_item WindowExportPlaylist(item.get_songs()).run() def add_to_list(self, item=None): uri = WindowLoadPlaylist().run() if uri: try: if not item: item = self.current_item item.song_view.async_add_uris(uri) except: pass def delete_audiocd_list(self, obj, udi): reset = False for item in self.category_list.get_items(): if item.udi == udi: reset = True self.category_list.delete_items([item]) if reset: self.reset_highlight_item(self.category_list.get_items()[-1]) def delete_item_list(self, item): if len(self.category_list.get_items()) == 1: return index = self.get_categroy_index_by_item(item) self.category_list.delete_items([item]) max_index = len(self.category_list.get_items()) - 1 if index <= max_index: new_index = index else: new_index = index- 1 self.reset_highlight_item(self.category_list.get_items()[new_index]) def save_all_list(self): uri = WinDir().run() if uri: try: save_name_dict = {} dir_name = utils.get_path_from_uri(uri) for item in self.category_list.get_items(): item_name = item.get_title() save_name_dict[item_name] = save_name_dict.get(item_name, -1) + 1 if save_name_dict.get(item_name) > 0: filename = "%s%d.%s" % (os.path.join(dir_name, item_name), save_name_dict.get(item_name), "m3u") else: filename = "%s.%s" % (os.path.join(dir_name, item_name), "m3u") utils.export_playlist(item.get_songs(), filename, "m3u") except: pass def reset_highlight_item(self, item): self.category_list.set_highlight_item(item) self.on_category_single_click(None, item, None, None, None) def get_current_item_index(self): item = self.category_list.get_highlight_item() index = self.get_categroy_index_by_item(item) if index is None: return 0 else: return index def popup_sort_menu(self, widget, event): self.current_item.song_view.get_playmode_menu([int(event.x_root), int(event.y_root)]) def popup_delete_menu(self, widget, event): self.current_item.song_view.popup_delete_menu(int(event.x_root), int(event.y_root)) def get_save_item_index(self): index = config.getint("playlist", "current_index") if index <= len(self.category_list.get_items()) - 1: return index return 0 def on_category_right_press(self, widget, x, y, item, column): if not item: menu_items = [ (None, _("New List"), self.new_list), (None, _("Import List"), self.leading_in_list), None, (None, _("Save all Lists"), self.save_all_list) ] else: menu_items = [ (None, _("Rename"), lambda : self.rename_item_list(item)), (None, _("Remove List"), lambda : self.delete_item_list(item)), (None, _("Open List"), lambda : self.add_to_list(item)), None, (None, _("Save all Lists"), self.save_all_list) ] Menu(menu_items, True).show((x, y)) def rename_item_list(self, item): input_dialog = InputDialog(_("Rename"), item.get_title(), 300, 100, lambda name: item.set_title(name)) input_dialog.show_all() def on_category_button_press(self, widget, event): if event.button == 3: self.popup_list_menu(widget, event) def on_category_single_click(self, widget, item, column, x, y): self.reset_search_entry() if self.drag_source_id != None or self.delete_source_id != None or self.menu_source_id !=None: gobject.source_remove(self.drag_source_id) gobject.source_remove(self.delete_source_id) gobject.source_remove(self.menu_source_id) self.current_item = item self.category_list.set_highlight_item(item) self.delete_source_id = self.current_item.song_view.connect("delete-select-items", self.parser_delete_items) self.drag_source_id = self.current_item.song_view.connect("drag-data-received", self.parser_drag_event) self.menu_source_id = self.current_item.song_view.connect("right-press-items", self.popup_detail_menu) container_remove_all(self.right_box) self.right_box.add(item.get_list_widget()) self.list_paned.show_all() def show_text_entry(self, widget): if widget.get_active(): self.entry_box.set_no_show_all(False) self.entry_box.show_all() self.entry_box.focus_input() else: self.entry_box.hide_all() self.entry_box.set_no_show_all(True) self.entry_box.entry.set_text("") def popup_detail_menu(self, widget, x, y, item, select_items): if self.detail_menu != None: self.detail_menu.destroy() play_mode_menu = self.current_item.song_view.get_playmode_menu(align=True) sort_dict = OrderedDict() sort_dict["file"] = _("By Filename") sort_dict["title"] = _("By Title") sort_dict["artist"] = _("By Artist") sort_dict["album"] = _("By Album") sort_dict["genre"] = _("By Genre") sort_dict["#track"] = _("By Track") sort_dict["#playcount"] = _("By Play Count") sort_dict["#added"] = _("By Added Time") sort_items = [(None, value, self.current_item.song_view.set_sort_keyword, key) for key, value in sort_dict.iteritems()] sort_items.append(None) sort_items.append((None, _("Randomize"), self.current_item.song_view.random_reorder)) sub_sort_menu = Menu(sort_items) add_to_list_menu = self.get_edit_sub_menu(select_items) move_to_list_menu = self.get_edit_sub_menu(select_items, True) self.detail_menu = Menu([(None, _("Play"), self.current_item.song_view.play_select_item), (None, _("Add to List"), add_to_list_menu), (None, _("Move to List"), move_to_list_menu), None, (None, _("Remove Track"), self.current_item.song_view.remove_select_items), (None, _("Move to Trash"), self.current_item.song_view.try_move_trash), (None, _("Clear List"), self.current_item.song_view.erase_items), None, (None, _("Playback mode"), play_mode_menu), (None, _("Sort"), sub_sort_menu), (None, _("Converter"), self.current_item.song_view.songs_convert), (None, _("Open directory"), self.current_item.song_view.open_song_dir), (None, _("Properties"), self.current_item.song_view.open_song_editor), ], True) if item and item.song.get_type() == "cue": self.detail_menu.set_menu_item_sensitive_by_index(5, False) self.detail_menu.set_menu_item_sensitive_by_index(10, False) self.detail_menu.show((int(x), int(y))) def save_current_playlist(self, *args): index = 0 player_source = Player.get_source() for i, item in enumerate(self.category_list.get_items()): if item.song_view == player_source: index = i config.set("playlist","current_index", str(index)) def save_to_library(self): if self.save_flag: return self.save_flag = True if self.search_flag: self.reset_search_entry() MediaDB.full_erase_playlists() for item in self.category_list.get_items(): if item.udi is not None: continue songs = item.get_songs() name = item.get_title() MediaDB.create_playlist("local", name, songs) MediaDB.async_save() self.save_flag = False
class PlayMenus(object): def __init__(self): self.init_system_pixbuf() self.__init_menus() def init_system_pixbuf(self): # aspect state pixbuf. self.video_aspect_pixbuf = app_theme.get_pixbuf( "screen/check_normal.png") self.video_aspect_select_pixbuf = app_theme.get_pixbuf( "screen/check_hover.png") self.video_aspect_none_pixbuf = app_theme.get_pixbuf( "screen/check_none.png") self.select_pixbuf = (self.video_aspect_pixbuf, self.video_aspect_select_pixbuf, self.video_aspect_none_pixbuf) # full . self.menu_full_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_full_normal.png") self.menu_full_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_full_hover.png") self.menu_full_none_pixbuf = app_theme.get_pixbuf( "screen/menu_full_none.png") self.full_pixbufs = (self.menu_full_normal_pixbuf, self.menu_full_hover_pixbuf, self.menu_full_normal_pixbuf) # window mode. 正常模式. self.menu_window_mode_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_window_mode_normal.png") self.menu_window_mode_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_window_mode_hover.png") self.menu_window_mode_none_pixbuf = app_theme.get_pixbuf( "screen/menu_window_mode_none.png") self.window_mode_none_pixbus = (self.menu_window_mode_normal_pixbuf, self.menu_window_mode_hover_pixbuf, self.menu_window_mode_none_pixbuf) # concie pixbuf. 简洁模式. self.menu_concie_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_concise_normal.png") self.menu_concie_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_concise_hover.png") self.menu_concie_none_pixbuf = app_theme.get_pixbuf( "screen/menu_concise_none.png") self.concie_pixbufs = (self.menu_concie_normal_pixbuf, self.menu_concie_hover_pixbuf, self.menu_concie_normal_pixbuf) # pre. 上一曲. self.menu_pre_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_pre_normal.png") self.menu_pre_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_pre_hover.png") self.menu_pre_none_pixbuf = app_theme.get_pixbuf( "screen/menu_pre_none.png") self.pre_pixbufs = (self.menu_pre_normal_pixbuf, self.menu_pre_hover_pixbuf, self.menu_pre_none_pixbuf) # next. 下一曲. self.menu_next_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_next_normal.png") self.menu_next_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_next_hover.png") self.menu_next_none_pixbuf = app_theme.get_pixbuf( "screen/menu_next_none.png") self.next_pixbufs = (self.menu_next_normal_pixbuf, self.menu_next_hover_pixbuf, self.menu_next_none_pixbuf) # f seek 5. self.menu_f_seek_5_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_f_seek_5_normal.png") self.menu_f_seek_5_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_f_seek_5_hover.png") self.menu_f_seek_5_none_pixbuf = app_theme.get_pixbuf( "screen/menu_f_seek_5_none.png") self.f_seek_5_pixbufs = (self.menu_f_seek_5_normal_pixbuf, self.menu_f_seek_5_hover_pixbuf, self.menu_f_seek_5_none_pixbuf) # b seek 5. self.menu_b_seek_5_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_b_seek_5_normal.png") self.menu_b_seek_5_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_b_seek_5_hover.png") self.menu_b_seek_5_none_pixbuf = app_theme.get_pixbuf( "screen/menu_b_seek_5_none.png") self.b_seek_5_pixbufs = (self.menu_b_seek_5_normal_pixbuf, self.menu_b_seek_5_hover_pixbuf, self.menu_b_seek_5_none_pixbuf) # play sequence. 播放顺序. self.menu_play_sequence_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_play_sequence_normal.png") self.menu_play_sequence_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_play_sequence_hover.png") self.menu_play_sequence_none_pixbuf = app_theme.get_pixbuf( "screen/menu_play_sequence_none.png") self.play_sequence_pixbufs = (self.menu_play_sequence_normal_pixbuf, self.menu_play_sequence_hover_pixbuf, self.menu_play_sequence_none_pixbuf) # volume. self.menu_volume_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_normal.png") self.menu_volume_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_hover.png") self.menu_volume_none_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_none.png") self.volume_pixbufs = (self.menu_volume_normal_pixbuf, self.menu_volume_hover_pixbuf, self.menu_volume_none_pixbuf) # mute/add/sub volume pixbuf. 声音的静音,添加/减少 音量. self.mute_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_menu_normal.png") self.mute_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_menu_hover.png") self.mute_none_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_menu_none.png") self.mute_volume_pixbufs = (self.mute_normal_pixbuf, self.mute_hover_pixbuf, self.mute_none_pixbuf) # add volume. self.add_volume_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_add_normal.png") self.add_volume_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_add_hover.png") self.add_volume_none_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_add_none.png") self.add_volume_pixbufs = (self.add_volume_normal_pixbuf, self.add_volume_hover_pixbuf, self.add_volume_none_pixbuf) # sub volume. self.sub_volume_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_sub_normal.png") self.sub_volume_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_sub_hover.png") self.sub_volume_none_pixbuf = app_theme.get_pixbuf( "screen/menu_volume_sub_none.png") self.sub_volume_pixbufs = (self.sub_volume_normal_pixbuf, self.sub_volume_hover_pixbuf, self.sub_volume_none_pixbuf) # quit. 退出. self.menu_quit_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_quit_normal.png") self.menu_quit_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_quit_hover.png") self.menu_quit_none_pixbuf = app_theme.get_pixbuf( "screen/menu_quit_none.png") self.quit_pixbufs = (self.menu_quit_normal_pixbuf, self.menu_quit_hover_pixbuf, self.menu_quit_none_pixbuf) # settin. 配置界面. self.menu_setting_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_setting_normal.png") self.menu_setting_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_setting_hover.png") self.menu_setting_none_pixbuf = app_theme.get_pixbuf( "screen/menu_setting_none.png") self.settings_pixbufs = (self.menu_setting_normal_pixbuf, self.menu_setting_hover_pixbuf, self.menu_setting_none_pixbuf) # subtitle. 字幕. self.menu_subtitle_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_subtitle_normal.png") self.menu_subtitle_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_subtitle_hover.png") self.menu_subtitle_none_pixbuf = app_theme.get_pixbuf( "screen/menu_subtitle_none.png") self.subtitle_pixbus = (self.menu_subtitle_normal_pixbuf, self.menu_subtitle_hover_pixbuf, self.menu_subtitle_none_pixbuf) # sort 截图. self.menu_sort_normal_pixbuf = app_theme.get_pixbuf( "screen/menu_sort_normal.png") self.menu_sort_hover_pixbuf = app_theme.get_pixbuf( "screen/menu_sort_hover.png") self.menu_sort_none_pixbuf = app_theme.get_pixbuf( "screen/menu_sort_none.png") self.sort_pixbufs = (self.menu_sort_normal_pixbuf, self.menu_sort_hover_pixbuf, self.menu_sort_none_pixbuf) def __init_menus(self): self.config_gui = None self.quit = None self.init_user_guide = None self.full_screen = None self.normal_mode = None self.compact_mode = None # 简洁模式. self.next = None self.prev = None self.fseek = None self.bseek = None self.open_file = None self.open_dir = None self.open_url = None self.menu_play_disc = Menu(None) ############################################################## self.file_menu = Menu([(None, _("Open File"), self.__menu_open_file), (None, _("Open Directory"), self.__menu_open_dir), (None, _("Play Disc"), self.menu_play_disc)]) self.play_track = None self.play_default = None self.play_random = None self.play_repeat_track = None self.play_repeat_play_list = None # 播放顺序. self.play_state_menu = Menu([ (None, _("Play (track)"), self.__menu_play_track), # 单曲 (None, _("Default"), self.__menu_play_default), # 顺序 (None, _("Random"), self.__menu_play_random), # 随机 (None, _("Repeat (track)"), self.__menu_play_repeat_track), # 单曲循环 (None, _("Repeat (playlist)"), self.__menu_play_repeat_play_list) ] # 列表循环 ) self.play_menu = Menu([ (self.full_pixbufs, _("Full Screen"), self.__menu_full_screen), (self.window_mode_none_pixbus, _("Normal Mode"), self.__menu_normal_mode), (self.concie_pixbufs, _("Compact Mode"), self.__menu_compact_mode), (self.pre_pixbufs, _("Previous"), self.__menu_prev), (self.next_pixbufs, _("Next"), self.__menu_next), (None), (self.f_seek_5_pixbufs, _("Jump Forward"), self.__menu_fseek), (self.b_seek_5_pixbufs, _("Jump Backward"), self.__menu_bseek), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), ]) self.normal_ascept = None self._4X3_ascept = None self._16X9_ascept = None self._16X10_ascept = None self._1_85X1_ascept = None self._2_35X1_ascept = None self._50_ascept = None self._100_ascept = None self._150_ascept = None self._200_ascept = None self.video_menu = Menu([ (None, _("Original"), self.__menu_normal_ascept), (None, "4:3", self.__menu_4X3_ascept), (None, "16:9", self.__menu_16X9_ascept), (None, "16:10", self.__menu_16X10_ascept), (None, "1.85:1", self.__menu_1_85X1_ascept), (None, "2.35:1", self.__menu_2_35X1_ascept), (None), (None, _("50%"), self.__menu_50_ascept), (None, _("100%"), self.__menu_100_ascept), (None, _("150%"), self.__menu_150_ascept), (None, _("200%"), self.__menu_200_ascept), ]) self.stereo_channel = None self.left_channel = None self.right_channel = None self.mute_unmute = None self.inc_volume = None self.dec_volume = None ## 截图. self.take_scrot = None self.open_scrot_dir = None self.set_scrot_dir = None ## 格式转换. self.format_conversion = None self.task_manager = None # 切换左右声道. self.channel_select_menu = Menu([ (None, _("Stereo"), self.__menu_stereo_channel), (None, _("Left"), self.__menu_left_channel), (None, _("Right"), self.__menu_right_channel) ]) self.audio_menu = Menu([ (None, _("Channels"), self.channel_select_menu), (None), (self.add_volume_pixbufs, _("Increase Volume"), self.__menu_inc_volume), (self.sub_volume_pixbufs, _("Decrease Volume"), self.__menu_dec_volume), (self.mute_volume_pixbufs, _("Mute/Unmute"), self.__menu_mute_unmute), ]) self.sort_menu = Menu([ (None, _("Take Screenshot"), self.__menu_take_scrot), (None, _("Open Screenshot Directory"), self.__menu_open_scrot_dir), (None, _("Set Screenshot Directory"), self.__menu_set_scrot_dir) ]) self.format_menu = Menu([ (None, _("Format conversion"), self.__menu_format_conversion), (None, _("Task Manager"), self.__menu_task_manager) ]) ################################################################ ## 主题弹出菜单. self.title_root_menu = Menu( [(None, _("File"), self.file_menu), (None, _("Play"), self.play_menu), (None, _("Video"), self.video_menu), (self.volume_pixbufs, _("Audio"), self.audio_menu), (self.sort_pixbufs, _("Take Screenshots"), self.sort_menu), (None, _("Format conversion"), self.format_menu), (None, _("View New Features"), self.__menu_init_user_guide), (self.settings_pixbufs, _("Preferences"), self.__menu_config_gui), (None), (self.quit_pixbufs, _("Quit"), self.__menu_quit)], True) ############################################################### # 排序. self.sort_by_name = None self.sort_by_type = None self.sort_menu = Menu([(None, _("By Name"), self.__menu_sort_by_name), (None, _("By Type"), self.__menu_sort_by_type)]) # ############################################################### self.remove_selected = None #self.__menu_remove_selected self.save_playlist = None # 保存播放列表 self.clear_playlist = None #self.__menu_clear_playlist self.remove_unavailable_files = None #self.__menu_remove_unavailable_files self.open_containing_directory = None #self.__menu_open_containing_directory self.add_open_file = None self.add_open_dir = None self.add_open_url = None self.screen_format_conversion = None # 最近播放. self.recent_played_menu = Menu(None) ## 播放列表弹出菜单. self.play_list_root_menu = Menu( [ (None, _("Add File"), self.__menu_add_open_file), (None, _("Add Directory"), self.__menu_add_open_dir), (None, _("Add URL"), self.__menu_add_open_url), (None), (None, _("Remove Selected"), self.__menu_remove_selected), (None, _("Save Playlist"), self.__menu_save_playlist), (None, _("Clear Playlist"), self.__menu_clear_playlist), (None, _("Remove Unavailable Files"), self.__menu_remove_unavailable_files), (None), (None, _("Recent Played"), self.recent_played_menu), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), (None, _("Sort"), self.sort_menu), (None), (None, _("Format conversion"), self.__menu_screen_format_conversion), (None, _("Open Containing Directory"), self.__menu_open_containing_directory), #(None, _("Properties"), None), ], True) ######################################################### # 播放菜单 self.screen_play_menu = Menu([ (self.pre_pixbufs, _("Previous"), self.__menu_prev), (self.next_pixbufs, _("Next"), self.__menu_next), (None), (self.f_seek_5_pixbufs, _("Jump Forward"), self.__menu_fseek), (self.b_seek_5_pixbufs, _("Jump Backward"), self.__menu_bseek), ]) ## 音轨选择 # Menu([(None, "音轨一", None), (... "音轨二", None)...]) self.switch_audio_menu = Menu(None) self.audio_lang_menu = (None, _("Dubbing selection"), self.switch_audio_menu) # 声音. self.channel_select = Menu([ (None, _("Audio channels"), self.channel_select_menu), self.audio_lang_menu, ]) ### DVD内置菜单. self.return_to_root = None self.return_to_title = None self.dvd_select = None self.dvd_right = None self.dvd_left = None self.dvd_down = None self.dvd_up = None self.dvd_built_in_menu = Menu([ (None, _("Move Up"), self.__menu_dvd_up), (None, _("Move Down"), self.__menu_dvd_down), (None, _("Move Left"), self.__menu_dvd_left), (None, _("Move Right"), self.__menu_dvd_right), (None, _("Select"), self.__menu_dvd_select), (None, _("Return to Title"), self.__menu_return_to_title), (None, _("Return to Root"), self.__menu_return_to_root), ]) ## DVD控制菜单. 有DVD的时候才显示出来. self.jump_to = Menu(None) self.dvd_prev_title = None self.dvd_next_title = None self.dvd_navigation_menu = Menu([ (None, _("Previous Title"), self.__menu_dvd_prev_title), (None, _("Next title"), self.__menu_dvd_next_title), (None, _("Jump to"), self.jump_to), (None, _("DVD Menu"), self.dvd_built_in_menu), ]) ## 字幕选择: self.subtitles_select = Menu(None) self.load_subtitles = None # 手动载入字幕. self.subtitles_child_menu = Menu([ (None, _("Load subtitles"), self.__menu_load_subtitles), # 手动载入字幕. (None, _("Select a subtitle"), self.subtitles_select), # 字幕选择 ]) # 属性窗口. self.properties = None # 屏幕弹出菜单. self.screen_right_root_menu = Menu( [ (None, _("Open File"), self.__menu_open_file), (None, _("Open Directory"), self.__menu_open_dir), (None, _("Open URL"), self.__menu_open_url), (None), (self.full_pixbufs, _("Full Screen On/Off"), self.__menu_full_screen), (self.window_mode_none_pixbus, _("Normal Mode"), self.__menu_normal_mode), (self.concie_pixbufs, _("Compact Mode"), self.__menu_compact_mode), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), (None, _("Play"), self.screen_play_menu), (None, _("Video"), self.video_menu), (self.volume_pixbufs, _("Audio"), self.channel_select), #(self.subtitle_pixbus, _("Subtitles"), self.subtitles_select), (self.subtitle_pixbus, _("Subtitles"), self.subtitles_child_menu), (None, _("DVD Navigation"), self.dvd_navigation_menu), (self.settings_pixbufs, _("Preferences"), self.__menu_config_gui), (None), (None, _("Properties"), self.__menu_properties), ], True) def show_theme_menu(self, button): # 显示主题上菜单. self.title_root_menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0)) def show_play_list_menu(self, event): # 显示播放列表上的菜单. self.play_list_root_menu.show((int(event.x_root), int(event.y_root)), (0, 0)) def show_screen_menu(self, event): # 显示屏幕右键菜单. self.screen_right_root_menu.show( (int(event.x_root), int(event.y_root)), (0, 0)) def __menu_init_user_guide(self): if self.init_user_guide: self.init_user_guide() def __menu_config_gui(self): if self.config_gui: self.config_gui() def __menu_quit(self): if self.quit: self.quit() def __menu_full_screen(self): if self.full_screen: self.full_screen() def __menu_normal_mode(self): if self.normal_mode: self.normal_mode() def __menu_compact_mode(self): if self.compact_mode: self.compact_mode() def __menu_next(self): if self.next: self.next() def __menu_prev(self): if self.prev: self.prev() def __menu_fseek(self): if self.fseek: self.fseek() def __menu_bseek(self): if self.bseek: self.bseek() def __menu_inc_volume(self): if self.inc_volume: self.inc_volume() def __menu_dec_volume(self): if self.dec_volume: self.dec_volume() def __menu_stereo_channel(self): if self.stereo_channel: self.stereo_channel() def __menu_left_channel(self): if self.left_channel: self.left_channel() def __menu_right_channel(self): if self.right_channel: self.right_channel() def __menu_mute_unmute(self): if self.mute_unmute: self.mute_unmute() def __menu_normal_ascept(self): if self.normal_ascept: self.normal_ascept() def __menu_4X3_ascept(self): if self._4X3_ascept: self._4X3_ascept() def __menu_16X9_ascept(self): if self._16X9_ascept: self._16X9_ascept() def __menu_16X10_ascept(self): if self._16X10_ascept: self._16X10_ascept() def __menu_1_85X1_ascept(self): if self._1_85X1_ascept: self._1_85X1_ascept() def __menu_2_35X1_ascept(self): if self._2_35X1_ascept: self._2_35X1_ascept() def __menu_50_ascept(self): if self._50_ascept: self._50_ascept() def __menu_100_ascept(self): if self._100_ascept: self._100_ascept() def __menu_150_ascept(self): if self._150_ascept: self._150_ascept() def __menu_200_ascept(self): if self._200_ascept: self._200_ascept() def __menu_play_track(self): if self.play_track: self.play_track() def __menu_play_default(self): if self.play_default: self.play_default() def __menu_play_random(self): if self.play_random: self.play_random() def __menu_play_repeat_track(self): if self.play_repeat_track: self.play_repeat_track() def __menu_play_repeat_play_list(self): if self.play_repeat_play_list: self.play_repeat_play_list() def __menu_remove_selected(self): if self.remove_selected: self.remove_selected() def __menu_clear_playlist(self): if self.clear_playlist: self.clear_playlist() def __menu_remove_unavailable_files(self): # 删除无效文件. if self.remove_unavailable_files: self.remove_unavailable_files() def __menu_open_containing_directory(self): # 开打文件的所在路径. if self.open_containing_directory: self.open_containing_directory() def __menu_open_file(self): if self.open_file: self.open_file() def __menu_open_dir(self): print "__menu_open_dir..." if self.open_dir: print "run..run" self.open_dir() def __menu_open_url(self): if self.open_url: self.open_url(True) def __menu_add_open_url(self): if self.add_open_url: self.add_open_url(False, False) def __menu_add_open_file(self): if self.add_open_file: self.add_open_file() def __menu_add_open_dir(self): if self.add_open_dir: self.add_open_dir() def __menu_format_conversion(self): if self.format_conversion: self.format_conversion() def __menu_task_manager(self): if self.task_manager: self.task_manager() def __menu_screen_format_conversion(self): if self.screen_format_conversion: self.screen_format_conversion() def __menu_properties(self): if self.properties: self.properties() # 排序. def __menu_sort_by_name(self): if self.sort_by_name: self.sort_by_name() def __menu_sort_by_type(self): if self.sort_by_type: self.sort_by_type() # dvd 菜单. def __menu_return_to_root(self): # 主菜单. if self.return_to_root: self.return_to_root() def __menu_return_to_title(self): # 标题菜单. if self.return_to_title: self.return_to_title() def __menu_dvd_select(self): # 选择 if self.dvd_select: self.dvd_select() def __menu_dvd_right(self): if self.dvd_right: self.dvd_right() def __menu_dvd_left(self): if self.dvd_left: self.dvd_left() def __menu_dvd_down(self): if self.dvd_down: self.dvd_down() def __menu_dvd_up(self): if self.dvd_up: self.dvd_up() def __menu_dvd_prev_title(self): # dvd 上一标题. if self.dvd_prev_title: self.dvd_prev_title() def __menu_dvd_next_title(self): # dvd 下一标题. if self.dvd_next_title: self.dvd_next_title() # 截图设置. def __menu_take_scrot(self): if self.take_scrot: self.take_scrot() def __menu_open_scrot_dir(self): if self.open_scrot_dir: self.open_scrot_dir() def __menu_set_scrot_dir(self): if self.set_scrot_dir: self.set_scrot_dir() # 保存播放列表. def __menu_save_playlist(self): if self.save_playlist: self.save_playlist() # 手动载入字幕. def __menu_load_subtitles(self): if self.load_subtitles: self.load_subtitles()
class BaseTrayIcon(object): """Trayicon base, needs to be derived from.""" def __init__(self, instance): self.update_icon() self.connect_events() self.instance = instance self.menu = None def update_icon(self): self.set_from_pixbuf( gtk.gdk.pixbuf_new_from_file(os.path.join(get_parent_dir(__file__, 3), "image", "logo1.png")) ) def get_volume_menu(self): menu_items = [ (None, _("Volume Up"), Player.increase_volume), (None, _("Volume Down"), Player.decrease_volume), (None, _("Mute"), Player.mute_volume), ] return Menu(menu_items) def update_menu(self): menu_items = [] if Player.is_paused(): pixbuf_group = self.get_pixbuf_group("play") status_label = _("Play") else: pixbuf_group = self.get_pixbuf_group("pause") status_label = _("Pause") menu_items.append((pixbuf_group, status_label, Player.playpause)) menu_items.append((self.get_pixbuf_group("previous"), _("Previous"), Player.previous)) menu_items.append((self.get_pixbuf_group("next"), _("Next"), Player.next)) menu_items.append(None) menu_items.append((self.get_pixbuf_group("volume"), _("Volume"), self.get_volume_menu())) menu_items.append(None) if config.getboolean("lyrics", "status"): menu_items.append((None, _("Close Lyrics"), lambda: Dispatcher.close_lyrics())) menu_items.append((None, _("Search Lyrics"), lambda: Dispatcher.emit("search-lyrics"))) else: menu_items.append((None, _("Show Lyrics"), lambda: Dispatcher.show_lyrics())) if config.getboolean("lyrics", "locked"): menu_items.append((self.get_pixbuf_group("unlock"), _("Unlock Lyrics"), lambda: Dispatcher.unlock_lyrics())) else: menu_items.append((self.get_pixbuf_group("lock"), _("Lock Lyrics"), lambda: Dispatcher.lock_lyrics())) menu_items.append(None) menu_items.append((self.get_pixbuf_group("setting"), _("Preferences"), lambda: Dispatcher.show_setting())) menu_items.append((self.get_pixbuf_group("close"), _("Quit"), lambda: Dispatcher.quit())) if self.menu is not None: del self.menu self.menu = Menu(menu_items, True) def get_pixbuf_group(self, name): return ( app_theme.get_pixbuf("tray/%s_normal.png" % name), app_theme.get_pixbuf("tray/%s_hover.png" % name), app_theme.get_pixbuf("tray/%s_disable.png" % name), ) def connect_events(self): self.connect("button-press-event", self.on_button_press_event) def on_button_press_event(self, widget, event): if event.button == 1: if event.state == gtk.gdk.CONTROL_MASK: Player.previous() else: self.instance.toggle_visible() elif event.button == 2: Player.playpause() elif event.button == 3: if event.state == gtk.gdk.CONTROL_MASK: Player.next() else: menu = gtk.Menu() (x, y, z) = self.get_menu_position(menu, self) self.update_menu() self.menu.show((int(x), int(y)), (0, -8)) def destroy(self): self.instance.toggle_visible(True) self.set_visible(False)
def init_ui(self): self.application = Application() self.application.set_default_size(1000, 660) self.application.set_skin_preview(get_common_image("frame.png")) self.application.set_icon(get_common_image("logo48.png")) self.application.add_titlebar( ["theme", "menu", "max","min", "close"], show_title=False ) self.application.window.set_title(_("Deepin Games")) # Init page box. self.page_box = gtk.VBox() self.page_box.connect('expose-event', self.page_box_render) # Init page align. self.page_align = gtk.Alignment() self.page_align.set(0.5, 0.5, 1, 1) self.page_align.set_padding(0, 0, 2, 2) # Append page to switcher. self.paned_box = PanedBox(24) self.paned_box.add_content_widget(self.page_box) self.bottom_tip_bar = BottomTipBar() self.bottom_tip_bar.close_button.connect('clicked', lambda w: self.paned_box.bottom_window.hide()) self.paned_box.add_bottom_widget(self.bottom_tip_bar) self.page_align.add(self.paned_box) self.application.main_box.pack_start(self.page_align, True, True) # Init status bar. self.statusbar = Statusbar(30) status_box = gtk.HBox() self.statusbar.status_box.pack_start(status_box, True, True) self.application.main_box.pack_start(self.statusbar, False, False) self.webview = WebView(COOKIE_FILE) webkit.set_web_database_directory_path(CACHE_DIR) web_settings = self.webview.get_settings() web_settings.set_property("enable-page-cache", True) web_settings.set_property("enable-offline-web-application-cache", True) #web_settings.set_property("enable-file-access-from-file-uris", True) web_settings.set_property("enable-xss-auditor", False) web_settings.set_property('enable-universal-access-from-file-uris', True) web_settings.set_property("enable-default-context-menu", False) self.webview.set_settings(web_settings) #self.webview.enable_inspector() self.webview.connect('new-window-policy-decision-requested', self.navigation_policy_decision_requested_cb) #self.webview.connect('notify::load-status', self.webview_load_status_handler) self.webview.connect('notify::title', self.webview_title_changed_handler) self.webview.connect('script-alert', self.webview_script_alert_handler) self.webview.connect('window-object-cleared', self.webview_window_object_cleared) #self.webview.connect('load-progress-changed', self.load_progress) self.home_url = urllib.basejoin(GAME_CENTER_SERVER_ADDRESS, 'game/?hl=%s' % LANGUAGE) self.network_failed_box = NetworkConnectFailed(self.check_network_connection) self.check_network_connection() #self.page_box.add(self.network_failed_box) self.navigatebar = Navigatebar( [ (None, _("Home"), self.show_home_page), (None, _("Topics"), self.show_subject_page), (None, _("My Games"), self.show_mygame_page), ], font_size = 11, padding_x = 5, padding_y = 16, vertical=False, item_normal_pixbuf=DynamicPixbuf(get_common_image('top/nav_normal.png')), item_hover_pixbuf=DynamicPixbuf(get_common_image('top/nav_hover.png')), item_press_pixbuf=DynamicPixbuf(get_common_image('top/nav_press.png')), ) self.navigatebar.set_size_request(-1, 56) self.navigatebar_align = gtk.Alignment(0, 0, 1, 1) self.navigatebar_align.set_padding(0, 0, 4, 0) self.navigatebar_align.add(self.navigatebar) self.application.titlebar.set_size_request(-1, 56) self.application.titlebar.left_box.pack_start(self.navigatebar_align, True, True) self.application.window.add_move_event(self.navigatebar) self.about_dialog = AboutDialog(_('About us')) self.about_dialog.set_transient_for(self.application.window) # Init menu. #if LANGUAGE == 'en_US': #menu_min_width = 185 #else: #menu_min_width = 150 menu = Menu( [ (None, _("Clear all cached data"), self.clean_download_cache), (None, _("See what's new"), lambda : self.show_wizard_win()), (None, _("About us"), self.show_about_dialog), (None, _("Quit"), lambda: gtk.main_quit()), ], is_root_menu=True, #menu_min_width=menu_min_width, ) self.application.set_menu_callback( lambda button: menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0))) self.no_favorite_html_path = os.path.join(static_dir, "error-no-favorite.html") self.no_recent_html_path = os.path.join(static_dir, "error-no-recent.html") self.mygame_frame_path = os.path.join(static_dir, "mygame-frame.html") self.gallery_html_path = os.path.join(static_dir, 'game-mygame.html') skin_config.connect('theme-changed', self.theme_changed_handler) global_event.register_event('show-message', self.update_message)
class RightMenu(): ''' Right Button Menu''' def __init__(self, screenshot): self.screenshot = screenshot # a DeepinScreenshot object # sub menu in save node menu_item = [ (None, _("save automatically"), self.save_sub_menu_clicked, SAVE_OP_AUTO), (None, _("save as"), self.save_sub_menu_clicked, SAVE_OP_AS), (None, _("save to clipboard"), self.save_sub_menu_clicked, SAVE_OP_CLIP), (None, _("save automatically to file and clipboard"), self.save_sub_menu_clicked, SAVE_OP_AUTO_AND_CLIP)] self.save_sub_menu = save_sub_menu = Menu(menu_item, menu_item_select_color=app_theme.get_shadow_color("menu_item_select").get_color_info()) # right button menu self.window = Menu([ ((app_theme_get_dynamic_pixbuf('image/action_menu/rect_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/rect_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/rect_normal.png')), _("draw rectangle"), self._menu_click, "rect"), ((app_theme_get_dynamic_pixbuf('image/action_menu/ellipse_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/ellipse_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/ellipse_normal.png')), _("draw ellipse"), self._menu_click, "ellipse"), ((app_theme_get_dynamic_pixbuf('image/action_menu/arrow_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/arrow_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/arrow_normal.png')), _("draw arrow"), self._menu_click, "arrow"), ((app_theme_get_dynamic_pixbuf('image/action_menu/line_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/line_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/line_normal.png')), _("draw line"), self._menu_click, "line"), ((app_theme_get_dynamic_pixbuf('image/action_menu/text_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/text_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/text_normal.png')), _("draw Text"), self._menu_click, "text"), None, ((app_theme_get_dynamic_pixbuf('image/action_menu/undo_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/undo_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/undo_normal.png')), _("undo"), self._menu_click, "undo"), ((app_theme_get_dynamic_pixbuf('image/action_menu/save_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/save_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/save_normal.png')), _("save"), save_sub_menu), ((app_theme_get_dynamic_pixbuf('image/action_menu/cancel_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/cancel_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/cancel_normal.png')), _("cancel"), self._menu_click, "cancel"), ((app_theme_get_dynamic_pixbuf('image/action_menu/share_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/share_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/share_normal.png')), _("share"), self._menu_click, "share"), ], True, menu_item_select_color=app_theme.get_shadow_color("menu_item_select").get_color_info()) def _menu_click(self, name): '''menu clicked callback''' buttons = self.screenshot.toolbar.toolbox.get_children() for each in buttons: if each.name == name: each.pressed() each.released() each.clicked() return # save current input text if self.screenshot.show_text_window_flag: self.screenshot.window.save_text_window() self.screenshot.toolbar.set_button_active(name, True) def save_sub_menu_clicked(self, save_op_index): '''save sub menu clicked callback''' self.screenshot.toolbar._list_menu_click(save_op_index) def show(self, coord=(0, 0)): ''' show menu ''' # set current operate icon items = self.save_sub_menu.get_menu_items() i = 0 for menu_item in items: item = list(menu_item.item) if i == self.screenshot.save_op_index: item[0] = ( app_theme.get_pixbuf("action/selected.png"), app_theme.get_pixbuf("action/selected_hover.png"), app_theme.get_pixbuf("action/selected.png")) else: item[0] = None i += 1 menu_item.item = tuple(item) self.window.show(coord)
class PlayMenus(object): def __init__(self): self.init_system_pixbuf() self.__init_menus() def init_system_pixbuf(self): # aspect state pixbuf. self.video_aspect_pixbuf = app_theme.get_pixbuf("screen/check_normal.png") self.video_aspect_select_pixbuf = app_theme.get_pixbuf("screen/check_hover.png") self.video_aspect_none_pixbuf = app_theme.get_pixbuf("screen/check_none.png") self.select_pixbuf = (self.video_aspect_pixbuf, self.video_aspect_select_pixbuf, self.video_aspect_none_pixbuf) # full . self.menu_full_normal_pixbuf = app_theme.get_pixbuf("screen/menu_full_normal.png") self.menu_full_hover_pixbuf = app_theme.get_pixbuf("screen/menu_full_hover.png") self.menu_full_none_pixbuf = app_theme.get_pixbuf("screen/menu_full_none.png") self.full_pixbufs = (self.menu_full_normal_pixbuf, self.menu_full_hover_pixbuf, self.menu_full_normal_pixbuf) # window mode. 正常模式. self.menu_window_mode_normal_pixbuf = app_theme.get_pixbuf("screen/menu_window_mode_normal.png") self.menu_window_mode_hover_pixbuf = app_theme.get_pixbuf("screen/menu_window_mode_hover.png") self.menu_window_mode_none_pixbuf = app_theme.get_pixbuf("screen/menu_window_mode_none.png") self.window_mode_none_pixbus = (self.menu_window_mode_normal_pixbuf, self.menu_window_mode_hover_pixbuf, self.menu_window_mode_none_pixbuf) # concie pixbuf. 简洁模式. self.menu_concie_normal_pixbuf = app_theme.get_pixbuf("screen/menu_concise_normal.png") self.menu_concie_hover_pixbuf = app_theme.get_pixbuf("screen/menu_concise_hover.png") self.menu_concie_none_pixbuf = app_theme.get_pixbuf("screen/menu_concise_none.png") self.concie_pixbufs = (self.menu_concie_normal_pixbuf, self.menu_concie_hover_pixbuf, self.menu_concie_normal_pixbuf) # pre. 上一曲. self.menu_pre_normal_pixbuf = app_theme.get_pixbuf("screen/menu_pre_normal.png") self.menu_pre_hover_pixbuf = app_theme.get_pixbuf("screen/menu_pre_hover.png") self.menu_pre_none_pixbuf = app_theme.get_pixbuf("screen/menu_pre_none.png") self.pre_pixbufs = (self.menu_pre_normal_pixbuf, self.menu_pre_hover_pixbuf, self.menu_pre_none_pixbuf) # next. 下一曲. self.menu_next_normal_pixbuf = app_theme.get_pixbuf("screen/menu_next_normal.png") self.menu_next_hover_pixbuf = app_theme.get_pixbuf("screen/menu_next_hover.png") self.menu_next_none_pixbuf = app_theme.get_pixbuf("screen/menu_next_none.png") self.next_pixbufs = (self.menu_next_normal_pixbuf, self.menu_next_hover_pixbuf, self.menu_next_none_pixbuf) # f seek 5. self.menu_f_seek_5_normal_pixbuf = app_theme.get_pixbuf("screen/menu_f_seek_5_normal.png") self.menu_f_seek_5_hover_pixbuf = app_theme.get_pixbuf("screen/menu_f_seek_5_hover.png") self.menu_f_seek_5_none_pixbuf = app_theme.get_pixbuf("screen/menu_f_seek_5_none.png") self.f_seek_5_pixbufs = (self.menu_f_seek_5_normal_pixbuf, self.menu_f_seek_5_hover_pixbuf, self.menu_f_seek_5_none_pixbuf) # b seek 5. self.menu_b_seek_5_normal_pixbuf = app_theme.get_pixbuf("screen/menu_b_seek_5_normal.png") self.menu_b_seek_5_hover_pixbuf = app_theme.get_pixbuf("screen/menu_b_seek_5_hover.png") self.menu_b_seek_5_none_pixbuf = app_theme.get_pixbuf("screen/menu_b_seek_5_none.png") self.b_seek_5_pixbufs = (self.menu_b_seek_5_normal_pixbuf, self.menu_b_seek_5_hover_pixbuf, self.menu_b_seek_5_none_pixbuf) # play sequence. 播放顺序. self.menu_play_sequence_normal_pixbuf = app_theme.get_pixbuf("screen/menu_play_sequence_normal.png") self.menu_play_sequence_hover_pixbuf = app_theme.get_pixbuf("screen/menu_play_sequence_hover.png") self.menu_play_sequence_none_pixbuf = app_theme.get_pixbuf("screen/menu_play_sequence_none.png") self.play_sequence_pixbufs = (self.menu_play_sequence_normal_pixbuf, self.menu_play_sequence_hover_pixbuf, self.menu_play_sequence_none_pixbuf) # volume. self.menu_volume_normal_pixbuf = app_theme.get_pixbuf("screen/menu_volume_normal.png") self.menu_volume_hover_pixbuf = app_theme.get_pixbuf("screen/menu_volume_hover.png") self.menu_volume_none_pixbuf = app_theme.get_pixbuf("screen/menu_volume_none.png") self.volume_pixbufs = (self.menu_volume_normal_pixbuf, self.menu_volume_hover_pixbuf, self.menu_volume_none_pixbuf) # mute/add/sub volume pixbuf. 声音的静音,添加/减少 音量. self.mute_normal_pixbuf = app_theme.get_pixbuf("screen/menu_volume_menu_normal.png") self.mute_hover_pixbuf = app_theme.get_pixbuf("screen/menu_volume_menu_hover.png") self.mute_none_pixbuf = app_theme.get_pixbuf("screen/menu_volume_menu_none.png") self.mute_volume_pixbufs = (self.mute_normal_pixbuf, self.mute_hover_pixbuf, self.mute_none_pixbuf) # add volume. self.add_volume_normal_pixbuf = app_theme.get_pixbuf("screen/menu_volume_add_normal.png") self.add_volume_hover_pixbuf = app_theme.get_pixbuf("screen/menu_volume_add_hover.png") self.add_volume_none_pixbuf = app_theme.get_pixbuf("screen/menu_volume_add_none.png") self.add_volume_pixbufs = (self.add_volume_normal_pixbuf, self.add_volume_hover_pixbuf, self.add_volume_none_pixbuf) # sub volume. self.sub_volume_normal_pixbuf = app_theme.get_pixbuf("screen/menu_volume_sub_normal.png") self.sub_volume_hover_pixbuf = app_theme.get_pixbuf("screen/menu_volume_sub_hover.png") self.sub_volume_none_pixbuf = app_theme.get_pixbuf("screen/menu_volume_sub_none.png") self.sub_volume_pixbufs = (self.sub_volume_normal_pixbuf, self.sub_volume_hover_pixbuf, self.sub_volume_none_pixbuf) # quit. 退出. self.menu_quit_normal_pixbuf = app_theme.get_pixbuf("screen/menu_quit_normal.png") self.menu_quit_hover_pixbuf = app_theme.get_pixbuf("screen/menu_quit_hover.png") self.menu_quit_none_pixbuf = app_theme.get_pixbuf("screen/menu_quit_none.png") self.quit_pixbufs = (self.menu_quit_normal_pixbuf, self.menu_quit_hover_pixbuf, self.menu_quit_none_pixbuf) # settin. 配置界面. self.menu_setting_normal_pixbuf = app_theme.get_pixbuf("screen/menu_setting_normal.png") self.menu_setting_hover_pixbuf = app_theme.get_pixbuf("screen/menu_setting_hover.png") self.menu_setting_none_pixbuf = app_theme.get_pixbuf("screen/menu_setting_none.png") self.settings_pixbufs = (self.menu_setting_normal_pixbuf, self.menu_setting_hover_pixbuf, self.menu_setting_none_pixbuf) # subtitle. 字幕. self.menu_subtitle_normal_pixbuf = app_theme.get_pixbuf("screen/menu_subtitle_normal.png") self.menu_subtitle_hover_pixbuf = app_theme.get_pixbuf("screen/menu_subtitle_hover.png") self.menu_subtitle_none_pixbuf = app_theme.get_pixbuf("screen/menu_subtitle_none.png") self.subtitle_pixbus = (self.menu_subtitle_normal_pixbuf, self.menu_subtitle_hover_pixbuf, self.menu_subtitle_none_pixbuf) # sort 截图. self.menu_sort_normal_pixbuf = app_theme.get_pixbuf("screen/menu_sort_normal.png") self.menu_sort_hover_pixbuf = app_theme.get_pixbuf("screen/menu_sort_hover.png") self.menu_sort_none_pixbuf = app_theme.get_pixbuf("screen/menu_sort_none.png") self.sort_pixbufs = (self.menu_sort_normal_pixbuf, self.menu_sort_hover_pixbuf, self.menu_sort_none_pixbuf) def __init_menus(self): self.config_gui = None self.quit = None self.init_user_guide = None self.full_screen = None self.normal_mode = None self.compact_mode = None # 简洁模式. self.next = None self.prev = None self.fseek = None self.bseek = None self.open_file = None self.open_dir = None self.open_url = None self.menu_play_disc = Menu(None) ############################################################## self.file_menu = Menu([(None, _("Open File"), self.__menu_open_file), (None, _("Open Directory"), self.__menu_open_dir), (None, _("Play Disc"), self.menu_play_disc) ]) self.play_track = None self.play_default = None self.play_random = None self.play_repeat_track = None self.play_repeat_play_list = None # 播放顺序. self.play_state_menu = Menu([(None, _("Play (track)"), self.__menu_play_track), # 单曲 (None, _("Default"), self.__menu_play_default), # 顺序 (None, _("Random"), self.__menu_play_random), # 随机 (None, _("Repeat (track)"), self.__menu_play_repeat_track), # 单曲循环 (None, _("Repeat (playlist)"), self.__menu_play_repeat_play_list)] # 列表循环 ) self.play_menu = Menu([(self.full_pixbufs, _("Full Screen"), self.__menu_full_screen), (self.window_mode_none_pixbus, _("Normal Mode"), self.__menu_normal_mode), (self.concie_pixbufs, _("Compact Mode"), self.__menu_compact_mode), (self.pre_pixbufs, _("Previous"), self.__menu_prev), (self.next_pixbufs, _("Next"), self.__menu_next), (None), (self.f_seek_5_pixbufs, _("Jump Forward"), self.__menu_fseek), (self.b_seek_5_pixbufs, _("Jump Backward"), self.__menu_bseek), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), ]) self.normal_ascept = None self._4X3_ascept = None self._16X9_ascept = None self._16X10_ascept = None self._1_85X1_ascept = None self._2_35X1_ascept = None self._50_ascept = None self._100_ascept = None self._150_ascept = None self._200_ascept = None self.video_menu = Menu([(None, _("Original"), self.__menu_normal_ascept), (None, "4:3", self.__menu_4X3_ascept), (None, "16:9", self.__menu_16X9_ascept), (None, "16:10", self.__menu_16X10_ascept), (None, "1.85:1", self.__menu_1_85X1_ascept), (None, "2.35:1", self.__menu_2_35X1_ascept), (None), (None, _("50%"), self.__menu_50_ascept), (None, _("100%"), self.__menu_100_ascept), (None, _("150%"), self.__menu_150_ascept), (None, _("200%"), self.__menu_200_ascept), ]) self.stereo_channel = None self.left_channel = None self.right_channel = None self.mute_unmute = None self.inc_volume = None self.dec_volume = None ## 截图. self.take_scrot = None self.open_scrot_dir = None self.set_scrot_dir = None ## 格式转换. self.format_conversion = None self.task_manager = None # 切换左右声道. self.channel_select_menu = Menu([ (None, _("Stereo"), self.__menu_stereo_channel), (None, _("Left"), self.__menu_left_channel), (None, _("Right"), self.__menu_right_channel) ]) self.audio_menu = Menu([(None, _("Channels"), self.channel_select_menu), (None), (self.add_volume_pixbufs, _("Increase Volume"), self.__menu_inc_volume), (self.sub_volume_pixbufs, _("Decrease Volume"), self.__menu_dec_volume), (self.mute_volume_pixbufs, _("Mute/Unmute"), self.__menu_mute_unmute), ]) self.sort_menu = Menu([(None, _("Take Screenshot"), self.__menu_take_scrot), (None, _("Open Screenshot Directory"), self.__menu_open_scrot_dir), (None, _("Set Screenshot Directory"), self.__menu_set_scrot_dir) ]) self.format_menu = Menu([(None, _("Format conversion"), self.__menu_format_conversion), (None, _("Task Manager"), self.__menu_task_manager) ]) ################################################################ ## 主题弹出菜单. self.title_root_menu = Menu([ (None, _("File"), self.file_menu), (None, _("Play"), self.play_menu), (None, _("Video"), self.video_menu), (self.volume_pixbufs, _("Audio"), self.audio_menu), (self.sort_pixbufs, _("Take Screenshots"), self.sort_menu), (None, _("Format conversion"), self.format_menu), (None, _("View New Features"), self.__menu_init_user_guide), (self.settings_pixbufs, _("Preferences"), self.__menu_config_gui), (None), (self.quit_pixbufs, _("Quit"), self.__menu_quit) ], True) ############################################################### # 排序. self.sort_by_name = None self.sort_by_type = None self.sort_menu = Menu([(None, _("By Name"), self.__menu_sort_by_name), (None, _("By Type"), self.__menu_sort_by_type)]) # ############################################################### self.remove_selected = None #self.__menu_remove_selected self.save_playlist = None # 保存播放列表 self.clear_playlist = None #self.__menu_clear_playlist self.remove_unavailable_files = None #self.__menu_remove_unavailable_files self.open_containing_directory = None #self.__menu_open_containing_directory self.add_open_file = None self.add_open_dir = None self.add_open_url = None self.screen_format_conversion = None # 最近播放. self.recent_played_menu = Menu(None) ## 播放列表弹出菜单. self.play_list_root_menu = Menu([(None, _("Add File"), self.__menu_add_open_file), (None, _("Add Directory"), self.__menu_add_open_dir), (None, _("Add URL"), self.__menu_add_open_url), (None), (None, _("Remove Selected"), self.__menu_remove_selected), (None, _("Save Playlist"), self.__menu_save_playlist), (None, _("Clear Playlist"), self.__menu_clear_playlist), (None, _("Remove Unavailable Files"), self.__menu_remove_unavailable_files), (None), (None, _("Recent Played"), self.recent_played_menu), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), (None, _("Sort"), self.sort_menu), (None), (None, _("Format conversion"), self.__menu_screen_format_conversion), (None, _("Open Containing Directory"), self.__menu_open_containing_directory), #(None, _("Properties"), None), ], True) ######################################################### # 播放菜单 self.screen_play_menu = Menu([ (self.pre_pixbufs, _("Previous"), self.__menu_prev), (self.next_pixbufs, _("Next"), self.__menu_next), (None), (self.f_seek_5_pixbufs, _("Jump Forward"), self.__menu_fseek), (self.b_seek_5_pixbufs, _("Jump Backward"), self.__menu_bseek), ]) ## 音轨选择 # Menu([(None, "音轨一", None), (... "音轨二", None)...]) self.switch_audio_menu = Menu(None) self.audio_lang_menu = (None, _("Dubbing selection"), self.switch_audio_menu) # 声音. self.channel_select = Menu([ (None, _("Audio channels"), self.channel_select_menu), self.audio_lang_menu, ]) ### DVD内置菜单. self.return_to_root = None self.return_to_title = None self.dvd_select = None self.dvd_right = None self.dvd_left = None self.dvd_down = None self.dvd_up = None self.dvd_built_in_menu = Menu([ (None, _("Move Up"), self.__menu_dvd_up), (None, _("Move Down"), self.__menu_dvd_down), (None, _("Move Left"), self.__menu_dvd_left), (None, _("Move Right"), self.__menu_dvd_right), (None, _("Select"), self.__menu_dvd_select), (None, _("Return to Title"), self.__menu_return_to_title), (None, _("Return to Root"), self.__menu_return_to_root), ]) ## DVD控制菜单. 有DVD的时候才显示出来. self.jump_to = Menu(None) self.dvd_prev_title = None self.dvd_next_title = None self.dvd_navigation_menu = Menu([(None, _("Previous Title"), self.__menu_dvd_prev_title), (None, _("Next title"), self.__menu_dvd_next_title), (None, _("Jump to"), self.jump_to), (None, _("DVD Menu"), self.dvd_built_in_menu), ]) ## 字幕选择: self.subtitles_select = Menu(None) self.load_subtitles = None # 手动载入字幕. self.subtitles_child_menu = Menu([ (None, _("Load subtitles"), self.__menu_load_subtitles), # 手动载入字幕. (None, _("Select a subtitle"), self.subtitles_select), # 字幕选择 ]) # 属性窗口. self.properties = None # 屏幕弹出菜单. self.screen_right_root_menu = Menu([ (None, _("Open File"), self.__menu_open_file), (None, _("Open Directory"), self.__menu_open_dir), (None, _("Open URL"), self.__menu_open_url), (None), (self.full_pixbufs, _("Full Screen On/Off"), self.__menu_full_screen), (self.window_mode_none_pixbus, _("Normal Mode"), self.__menu_normal_mode), (self.concie_pixbufs, _("Compact Mode"), self.__menu_compact_mode), (self.play_sequence_pixbufs, _("Order"), self.play_state_menu), (None, _("Play"), self.screen_play_menu), (None, _("Video"), self.video_menu), (self.volume_pixbufs, _("Audio"), self.channel_select), #(self.subtitle_pixbus, _("Subtitles"), self.subtitles_select), (self.subtitle_pixbus, _("Subtitles"), self.subtitles_child_menu), (None, _("DVD Navigation"), self.dvd_navigation_menu), (self.settings_pixbufs, _("Preferences"), self.__menu_config_gui), (None), (None, _("Properties"), self.__menu_properties), ], True) def show_theme_menu(self, button): # 显示主题上菜单. self.title_root_menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0)) def show_play_list_menu(self, event): # 显示播放列表上的菜单. self.play_list_root_menu.show((int(event.x_root), int(event.y_root)), (0, 0)) def show_screen_menu(self, event): # 显示屏幕右键菜单. self.screen_right_root_menu.show( (int(event.x_root), int(event.y_root)), (0, 0)) def __menu_init_user_guide(self): if self.init_user_guide: self.init_user_guide() def __menu_config_gui(self): if self.config_gui: self.config_gui() def __menu_quit(self): if self.quit: self.quit() def __menu_full_screen(self): if self.full_screen: self.full_screen() def __menu_normal_mode(self): if self.normal_mode: self.normal_mode() def __menu_compact_mode(self): if self.compact_mode: self.compact_mode() def __menu_next(self): if self.next: self.next() def __menu_prev(self): if self.prev: self.prev() def __menu_fseek(self): if self.fseek: self.fseek() def __menu_bseek(self): if self.bseek: self.bseek() def __menu_inc_volume(self): if self.inc_volume: self.inc_volume() def __menu_dec_volume(self): if self.dec_volume: self.dec_volume() def __menu_stereo_channel(self): if self.stereo_channel: self.stereo_channel() def __menu_left_channel(self): if self.left_channel: self.left_channel() def __menu_right_channel(self): if self.right_channel: self.right_channel() def __menu_mute_unmute(self): if self.mute_unmute: self.mute_unmute() def __menu_normal_ascept(self): if self.normal_ascept: self.normal_ascept() def __menu_4X3_ascept(self): if self._4X3_ascept: self._4X3_ascept() def __menu_16X9_ascept(self): if self._16X9_ascept: self._16X9_ascept() def __menu_16X10_ascept(self): if self._16X10_ascept: self._16X10_ascept() def __menu_1_85X1_ascept(self): if self._1_85X1_ascept: self._1_85X1_ascept() def __menu_2_35X1_ascept(self): if self._2_35X1_ascept: self._2_35X1_ascept() def __menu_50_ascept(self): if self._50_ascept: self._50_ascept() def __menu_100_ascept(self): if self._100_ascept: self._100_ascept() def __menu_150_ascept(self): if self._150_ascept: self._150_ascept() def __menu_200_ascept(self): if self._200_ascept: self._200_ascept() def __menu_play_track(self): if self.play_track: self.play_track() def __menu_play_default(self): if self.play_default: self.play_default() def __menu_play_random(self): if self.play_random: self.play_random() def __menu_play_repeat_track(self): if self.play_repeat_track: self.play_repeat_track() def __menu_play_repeat_play_list(self): if self.play_repeat_play_list: self.play_repeat_play_list() def __menu_remove_selected(self): if self.remove_selected: self.remove_selected() def __menu_clear_playlist(self): if self.clear_playlist: self.clear_playlist() def __menu_remove_unavailable_files(self): # 删除无效文件. if self.remove_unavailable_files: self.remove_unavailable_files() def __menu_open_containing_directory(self): # 开打文件的所在路径. if self.open_containing_directory: self.open_containing_directory() def __menu_open_file(self): if self.open_file: self.open_file() def __menu_open_dir(self): print "__menu_open_dir..." if self.open_dir: print "run..run" self.open_dir() def __menu_open_url(self): if self.open_url: self.open_url(True) def __menu_add_open_url(self): if self.add_open_url: self.add_open_url(False, False) def __menu_add_open_file(self): if self.add_open_file: self.add_open_file() def __menu_add_open_dir(self): if self.add_open_dir: self.add_open_dir() def __menu_format_conversion(self): if self.format_conversion: self.format_conversion() def __menu_task_manager(self): if self.task_manager: self.task_manager() def __menu_screen_format_conversion(self): if self.screen_format_conversion: self.screen_format_conversion() def __menu_properties(self): if self.properties: self.properties() # 排序. def __menu_sort_by_name(self): if self.sort_by_name: self.sort_by_name() def __menu_sort_by_type(self): if self.sort_by_type: self.sort_by_type() # dvd 菜单. def __menu_return_to_root(self): # 主菜单. if self.return_to_root: self.return_to_root() def __menu_return_to_title(self): # 标题菜单. if self.return_to_title: self.return_to_title() def __menu_dvd_select(self): # 选择 if self.dvd_select: self.dvd_select() def __menu_dvd_right(self): if self.dvd_right: self.dvd_right() def __menu_dvd_left(self): if self.dvd_left: self.dvd_left() def __menu_dvd_down(self): if self.dvd_down: self.dvd_down() def __menu_dvd_up(self): if self.dvd_up: self.dvd_up() def __menu_dvd_prev_title(self): # dvd 上一标题. if self.dvd_prev_title: self.dvd_prev_title() def __menu_dvd_next_title(self): # dvd 下一标题. if self.dvd_next_title: self.dvd_next_title() # 截图设置. def __menu_take_scrot(self): if self.take_scrot: self.take_scrot() def __menu_open_scrot_dir(self): if self.open_scrot_dir: self.open_scrot_dir() def __menu_set_scrot_dir(self): if self.set_scrot_dir: self.set_scrot_dir() # 保存播放列表. def __menu_save_playlist(self): if self.save_playlist: self.save_playlist() # 手动载入字幕. def __menu_load_subtitles(self): if self.load_subtitles: self.load_subtitles()
class PlaylistUI(gtk.VBox): '''Playlist UI.''' def __init__(self): '''Init.''' gtk.VBox.__init__(self) # Init catagory list. self.category_list = CategoryView() setattr(self.category_list, "save_to_library", self.save_to_library) self.category_list.draw_mask = self.draw_category_list_mask self.category_list.connect("single-click-item", self.on_category_single_click) self.category_list.connect("right-press-items", self.on_category_right_press) self.category_list.set_size_request(CATEGROYLIST_WIDTH, -1) del self.category_list.keymap["Delete"] # Init SearchEntry. self.entry_box = SearchEntry("") self.entry_box.entry.connect("changed", self.search_cb) self.entry_box.set_no_show_all(True) entry_align = gtk.Alignment() entry_align.set(0, 0, 1, 1) entry_align.set_padding(2, 0, 10, 10) entry_align.add(self.entry_box) entry_align.connect("expose-event", self.expose_entry_mask) # Init toolbar. self.toolbar_box = gtk.HBox(spacing=45) self.search_button = self.__create_simple_toggle_button("search", self.show_text_entry, _("Search in Current Playlist")) self.__create_simple_button("list", self.popup_list_menu, _("Playlist Operations")) self.__create_simple_button("add", self.popup_add_menu, _("Add")) self.playmode_button = PlaymodeButton(config.get("setting", "loop_mode", "list_mode").split("_")[0]) Tooltip.text(self.playmode_button, _("Playback Order")) self.playmode_button.connect("button-press-event", self.popup_sort_menu) self.toolbar_box.pack_start(self.playmode_button, False, False) self.__create_simple_button("delete", self.popup_delete_menu, _("Delete")) toolbar_align = gtk.Alignment() toolbar_align.set_padding(6, 6, 28, 0) toolbar_align.add(self.toolbar_box) toolbar_align.connect("expose-event", self.expose_toolbar_mask) self.right_box = gtk.VBox() self.right_box.connect("size-allocate", self.on_right_box_size_allocate) self.list_paned = HPaned(handle_color=app_theme.get_color("panedHandler"), enable_drag=True) self.list_paned.pack1(self.category_list, True, True) self.list_paned.pack2(self.right_box, True, False) bottom_box = gtk.VBox() bottom_box.set_size_request(-1, 22) self.pack_start(self.list_paned, True, True) self.pack_start(entry_align, False, False) self.pack_start(toolbar_align, False, True) # Current self.current_playlist = None self.search_time_source = 0 self.current_item = None self.search_flag = False self.cache_items = None self.delete_source_id = None self.drag_source_id = None self.menu_source_id = None self.song_notify_id = None self.detail_menu = None self.save_flag = False if MediaDB.isloaded(): self.__on_db_loaded(MediaDB) else: MediaDB.connect("loaded", self.__on_db_loaded) Player.connect("loaded", self.__on_player_loaded) Dispatcher.connect("play-song", self.__play_and_add) Dispatcher.connect("add-songs", self.__add_songs_to_list) Dispatcher.connect("new-cd-playlist", self.__new_audiocd_playlist) Dispatcher.connect("del-cd-playlist", self.delete_audiocd_list) Dispatcher.connect("save-current-list", self.save_current_playlist) config.connect("config-changed", self.on_config_changed) def on_config_changed(self, config, section, option, value): if section == "setting" and option == "loop_mode": icon_name = value.split("_")[0] self.playmode_button.update_dpixbufs(icon_name, True) def on_right_box_size_allocate(self, widget, rect): if self.current_item: if rect.width > HIDE_PLAYLIST_WIDTH: self.current_item.song_view.set_hide_columns(None) else: self.current_item.song_view.set_hide_columns([1]) def expose_toolbar_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(1, 1, 1, 0.95) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() draw_line(cr, (rect.x, rect.y + 1), (rect.x + rect.width, rect.y + 1), "#b0b0b0") return False def expose_entry_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x , rect.y, rect.width, rect.height, "toolbarEntry") def draw_category_list_mask(self, cr, x, y, width, height): draw_alpha_mask(cr, x, y, width, height, "layoutLeft") def draw_item_mask(self, cr, x, y, width, height): draw_vlinear(cr, x, y, width, height, app_theme.get_shadow_color("editlistItemPress").get_color_info()) def __on_db_loaded(self, db): if not MediaDB.get_playlists(): MediaDB.create_playlist("local", _("Default List")) # From MediaDB loaded playlists. init_items = [ListTreeItem(pl) for pl in MediaDB.get_playlists()] self.category_list.add_items(init_items) # Init Category_list. self.category_list.set_highlight_item(self.get_categroy_item_by_index(self.get_save_item_index())) self.current_item = self.category_list.get_highlight_item() self.delete_source_id = self.current_item.song_view.connect("delete-select-items", self.parser_delete_items) self.drag_source_id = self.current_item.song_view.connect("drag-data-received", self.parser_drag_event) self.menu_source_id = self.current_item.song_view.connect("right-press-items", self.popup_detail_menu) Player.set_source(self.current_item.song_view) self.right_box.add(self.current_item.get_list_widget()) self.category_list.check_view_status() self.list_paned.show_all() def __on_player_loaded(self, player): if self.current_item: self.current_item.song_view.reset_error_items() self.current_item.song_view.set_highlight_song(Player.song) def restore_status(self): uri = config.get("player", "uri") seek = int(config.get("player", "seek")) state = config.get("player", "state") play = False if config.getboolean("player", "play_on_startup") and state == "playing": play = True if uri and self.current_item: song = MediaDB.get_song(uri) if song.get_type() == "cue": seek = seek + song.get("seek", 0) if song and song.exists(): if not config.getboolean("player", "resume_last_progress") or not play: if song.get_type() == "cue": seek = song.get("seek", 0) else: seek = None self.current_item.song_view.play_song(song, play, seek) def __play_and_add(self, widget, song): self.current_item.song_view.add_songs(song, play=True) def __add_songs_to_list(self, widget, songs): if songs and self.current_item.song_view: self.current_item.song_view.add_songs(songs) def get_selected_song_view(self): if self.current_item: return self.current_item.song_view def search_cb(self, widget, text): if not self.search_flag: self.cache_items = self.current_item.song_view.get_items() # Clear song_view select status self.current_item.song_view.clear_highlight() self.current_item.song_view.select_rows = [] if text != "": self.search_flag = True results = filter(lambda item: text.lower().replace(" ", "") in item.get_song().get("search", ""), self.cache_items) self.current_item.song_view.set_song_items(results) else: self.search_flag = False self.current_item.song_view.set_song_items(self.cache_items) if Player.song: self.current_item.song_view.set_highlight_song(Player.song) def parser_delete_items(self, widget, items): if self.search_flag: if self.cache_items != None: [self.cache_items.remove(item) for item in items if item in self.cache_items] def parser_drag_event(self, widget, context, x, y, selection, info, timestamp): if self.search_flag: self.reset_search_entry() def reset_search_entry(self): self.search_button.set_active(False) def __create_simple_toggle_button(self, name, callback, tip_msg=""): toggle_button = ToggleButton( app_theme.get_pixbuf("toolbar/%s_normal.png" % name), app_theme.get_pixbuf("toolbar/%s_press.png" % name), ) toggle_button.connect("toggled", callback) if tip_msg: Tooltip.text(toggle_button, tip_msg) self.toolbar_box.pack_start(toggle_button, False, False) return toggle_button def __create_simple_button(self, name, callback, tip_msg=""): button = ImageButton( app_theme.get_pixbuf("toolbar/%s_normal.png" % name), app_theme.get_pixbuf("toolbar/%s_hover.png" % name), app_theme.get_pixbuf("toolbar/%s_press.png" % name), ) button.connect("button-press-event", callback) if tip_msg: Tooltip.text(button, tip_msg) self.toolbar_box.pack_start(button, False, False) return button def popup_add_menu(self, widget, event): self.current_item.song_view.popup_add_menu(int(event.x_root), int(event.y_root)) def popup_list_menu(self, widget, event): menu_items = [(None, _("New List"), self.new_list), (None, _("Import List"), self.leading_in_list), (None, _("Open List"), self.add_to_list), (None, _("Export List"), self.leading_out_list), (None, _("Remove List"), self.delete_item_list), None, (None, _("Save all Lists"), self.save_all_list)] Menu(menu_items, True).show((int(event.x_root), int(event.y_root))) def new_list(self, items=[], name=None): index = len(self.category_list.get_items()) if name is None: name = "%s%d" % (_("New List"), index) input_dialog = InputDialog(_("New List"), name, 300, 100, lambda name : self.create_new_playlist(name, items)) input_dialog.show_all() def create_new_playlist(self, name, items): self.category_list.add_items([ListTreeItem(Playlist("local", name, items))]) def __new_audiocd_playlist(self, obj, name, songs, udi): self.category_list.add_items([ListTreeItem(CDPlaylist("audiocd", name, songs), udi=udi)]) def get_categroy_other_items(self): other_items = [] highlight_item = self.category_list.get_highlight_item() for item in self.category_list.get_items(): if highlight_item == item: continue other_items.append(item) return other_items def get_categroy_index_by_item(self, item): index = -1 for each_index, each_item in enumerate(self.category_list.get_items()): if item == each_item: index = each_index break return index def get_categroy_item_by_index(self, index): try: return self.category_list.get_items()[index] except: return None def get_edit_sub_menu(self, select_items, move=False): sub_menu_items = [] if len(self.category_list.get_items()) > 1: other_category_items = self.get_categroy_other_items() sub_menu_items = [(None, category_item.get_title(), self.edit_list_item, category_item, select_items ,move) for category_item in other_category_items] if sub_menu_items: sub_menu_items.extend([None, ((app_theme.get_pixbuf("toolbar/add_normal.png"), None, None), _("New List"), self.edit_new_list_item, select_items, move)]) else: sub_menu_items.extend([((app_theme.get_pixbuf("toolbar/add_normal.png"), None, None), _("New List"), self.edit_new_list_item, select_items, move)]) return Menu(sub_menu_items) def edit_list_item(self, category_item, select_items, move): try: category_item.song_view.add_items(select_items) category_item.song_view.update_item_index() category_item.song_view.update_vadjustment() if move: self.current_item.song_view.remove_select_items() except: pass else: self.current_item.song_view.update_item_index() self.current_item.song_view.update_vadjustment() def edit_new_list_item(self, select_items, move): self.new_list([item.get_song().get("uri") for item in select_items]) if move: self.current_item.song_view.remove_select_items() self.current_item.song_view.update_item_index() self.current_item.song_view.update_vadjustment() def leading_in_list(self): uri = WindowLoadPlaylist().run() try: p_name = utils.get_filename(uri) pl = MediaDB.create_playlist("local", p_name, []) new_item = ListTreeItem(pl) self.category_list.add_items([new_item]) new_item.song_view.async_add_uris(uri) except: pass def leading_out_list(self, item): if not item: item = self.current_item WindowExportPlaylist(item.get_songs()).run() def add_to_list(self, item=None): uri = WindowLoadPlaylist().run() if uri: try: if not item: item = self.current_item item.song_view.async_add_uris(uri) except: pass def delete_audiocd_list(self, obj, udi): reset = False for item in self.category_list.get_items(): if item.udi == udi: reset = True self.category_list.delete_items([item]) if reset: self.reset_highlight_item(self.category_list.get_items()[-1]) def delete_item_list(self, item): if len(self.category_list.get_items()) == 1: return index = self.get_categroy_index_by_item(item) self.category_list.delete_items([item]) max_index = len(self.category_list.get_items()) - 1 if index <= max_index: new_index = index else: new_index = index- 1 self.reset_highlight_item(self.category_list.get_items()[new_index]) def save_all_list(self): uri = WinDir().run() if uri: try: save_name_dict = {} dir_name = utils.get_path_from_uri(uri) for item in self.category_list.get_items(): item_name = item.get_title() save_name_dict[item_name] = save_name_dict.get(item_name, -1) + 1 if save_name_dict.get(item_name) > 0: filename = "%s%d.%s" % (os.path.join(dir_name, item_name), save_name_dict.get(item_name), "m3u") else: filename = "%s.%s" % (os.path.join(dir_name, item_name), "m3u") utils.export_playlist(item.get_songs(), filename, "m3u") except: pass def reset_highlight_item(self, item): self.category_list.set_highlight_item(item) self.on_category_single_click(None, item, None, None, None) def get_current_item_index(self): item = self.category_list.get_highlight_item() index = self.get_categroy_index_by_item(item) if index is None: return 0 else: return index def popup_sort_menu(self, widget, event): self.current_item.song_view.get_playmode_menu([int(event.x_root), int(event.y_root)]) def popup_delete_menu(self, widget, event): self.current_item.song_view.popup_delete_menu(int(event.x_root), int(event.y_root)) def get_save_item_index(self): index = config.getint("playlist", "current_index") if index <= len(self.category_list.get_items()) - 1: return index return 0 def on_category_right_press(self, widget, x, y, item, column): if not item: menu_items = [ (None, _("New List"), self.new_list), (None, _("Import List"), self.leading_in_list), None, (None, _("Save all Lists"), self.save_all_list) ] else: menu_items = [ (None, _("Rename"), lambda : self.rename_item_list(item)), (None, _("Remove List"), lambda : self.delete_item_list(item)), (None, _("Open List"), lambda : self.add_to_list(item)), None, (None, _("Save all Lists"), self.save_all_list) ] Menu(menu_items, True).show((x, y)) def rename_item_list(self, item): input_dialog = InputDialog(_("Rename"), item.get_title(), 300, 100, lambda name: item.set_title(name)) input_dialog.show_all() def on_category_button_press(self, widget, event): if event.button == 3: self.popup_list_menu(widget, event) def on_category_single_click(self, widget, item, column, x, y): self.reset_search_entry() if self.drag_source_id != None or self.delete_source_id != None or self.menu_source_id !=None: gobject.source_remove(self.drag_source_id) gobject.source_remove(self.delete_source_id) gobject.source_remove(self.menu_source_id) self.current_item = item self.category_list.set_highlight_item(item) self.delete_source_id = self.current_item.song_view.connect("delete-select-items", self.parser_delete_items) self.drag_source_id = self.current_item.song_view.connect("drag-data-received", self.parser_drag_event) self.menu_source_id = self.current_item.song_view.connect("right-press-items", self.popup_detail_menu) container_remove_all(self.right_box) self.right_box.add(item.get_list_widget()) self.list_paned.show_all() def show_text_entry(self, widget): if widget.get_active(): self.entry_box.set_no_show_all(False) self.entry_box.show_all() self.entry_box.focus_input() else: self.entry_box.hide_all() self.entry_box.set_no_show_all(True) self.entry_box.entry.set_text("") def popup_detail_menu(self, widget, x, y, item, select_items): if self.detail_menu != None: self.detail_menu.destroy() play_mode_menu = self.current_item.song_view.get_playmode_menu(align=True) sort_dict = OrderedDict() sort_dict["file"] = _("By Filename") sort_dict["title"] = _("By Title") sort_dict["artist"] = _("By Artist") sort_dict["album"] = _("By Album") sort_dict["genre"] = _("By Genre") sort_dict["#track"] = _("By Track") sort_dict["#playcount"] = _("By Play Count") sort_dict["#added"] = _("By Date Added") sort_items = [(None, value, self.current_item.song_view.set_sort_keyword, key) for key, value in sort_dict.iteritems()] sort_items.append(None) sort_items.append((None, _("Randomize"), self.current_item.song_view.random_reorder)) sub_sort_menu = Menu(sort_items) add_to_list_menu = self.get_edit_sub_menu(select_items) move_to_list_menu = self.get_edit_sub_menu(select_items, True) self.detail_menu = Menu([(None, _("Play"), self.current_item.song_view.play_select_item), (None, _("Add to List"), add_to_list_menu), (None, _("move to List"), move_to_list_menu), None, (None, _("Remove Track"), self.current_item.song_view.remove_select_items), (None, _("Move to Trash"), self.current_item.song_view.try_move_trash), (None, _("Clear List"), self.current_item.song_view.erase_items), None, (None, _("Playback Order"), play_mode_menu), (None, _("Sort"), sub_sort_menu), (None, _("Convert"), self.current_item.song_view.songs_convert), (None, _("Open directory"), self.current_item.song_view.open_song_dir), (None, _("Properties"), self.current_item.song_view.open_song_editor), ], True) if item and item.song.get_type() == "cue": self.detail_menu.set_menu_item_sensitive_by_index(5, False) self.detail_menu.set_menu_item_sensitive_by_index(10, False) self.detail_menu.show((int(x), int(y))) def save_current_playlist(self, *args): index = 0 player_source = Player.get_source() for i, item in enumerate(self.category_list.get_items()): if item.song_view == player_source: index = i config.set("playlist","current_index", str(index)) def save_to_library(self): if self.save_flag: return self.save_flag = True if self.search_flag: self.reset_search_entry() MediaDB.full_erase_playlists() for item in self.category_list.get_items(): if item.udi is not None: continue songs = item.get_songs() name = item.get_title() MediaDB.create_playlist("local", name, songs) MediaDB.async_save() self.save_flag = False
class Toolbar(): ''' Toolbar window''' def __init__(self, parent=None, screenshot=None): ''' init toolbar @param parent: the transient parent for this window @param screenshot: a Screenshot object ''' self.screenshot = screenshot self.win = screenshot.window self.__config = OperateConfig() save_op = self.__config.get("save", "save_op") if save_op: self.screenshot.save_op_index = int(save_op) else: self.screenshot.save_op_index = SAVE_OP_AUTO #toolbar_padding_x = 15 #toolbar_padding_y = 5 #toolbar_icon_width = toolbar_icon_height = 28 #toolbar_icon_num = 10 #self.height = toolbar_icon_height + toolbar_padding_y * 2 self.height = 30 self.width = 279 #self.width = 240 self.window = Window(window_type=gtk.WINDOW_POPUP, shadow_visible=False) self.window.set_keep_above(True) self.window.set_decorated(False) self.window.set_transient_for(parent) self.toolbox = gtk.HBox(False, 6) toolbox_align = gtk.Alignment() toolbox_align.set(0, 0.5, 0, 0) toolbox_align.set_padding(2, 2, 11, 11) toolbox_align.add(self.toolbox) self.window.window_frame.pack_start(toolbox_align, True, True) #self.window.set_size_request(self.width, self.height) self.window.set_size_request(-1, self.height) self._toggle_button_list = [] self._toggle_button_group = ToggleButtonGroup([], 6) self.toolbox.pack_start(self._toggle_button_group) self.create_toggle_button("rect", ACTION_RECTANGLE, 0, _("draw rectangle")) self.create_toggle_button("ellipse", ACTION_ELLIPSE, 1, _("draw ellipse")) self.create_toggle_button("arrow", ACTION_ARROW, 2, _("draw arrow")) self.create_toggle_button("line", ACTION_LINE, 3, _("draw line")) self.create_toggle_button("text", ACTION_TEXT, 4, _("draw Text")) self.create_button("undo", _("undo")) # pack save and list button save_combo_button = ComboButton( app_theme.get_pixbuf("action/save_normal.png"), app_theme.get_pixbuf("action/save_hover.png"), app_theme.get_pixbuf("action/save_press.png"), app_theme.get_pixbuf("action/save_normal.png"), app_theme.get_pixbuf("action/list_normal.png"), app_theme.get_pixbuf("action/list_hover.png"), app_theme.get_pixbuf("action/list_press.png"), app_theme.get_pixbuf("action/list_normal.png"), ) save_combo_button.set_name("save") save_combo_button.connect("button-clicked", self._button_clicked, "save") save_combo_button.connect("arrow-clicked", self._list_menu_show) save_tip_text_list = [ "save automatically", "save as", "save to clipboard", "save automatically to file and clipboard" ] tip_text = save_tip_text_list[self.screenshot.save_op_index] save_combo_button.connect("enter-notify-event", self._show_tooltip, _(tip_text)) self.toolbox.pack_start(save_combo_button) self.create_button("cancel", _("cancel")) self.create_button("share", _("share")) if self.screenshot: self._button_clicked_cb = { 'undo': self.screenshot.undo, 'save': self.save_operate, 'cancel': self.win.quit, 'share': self.share_picture } def create_toggle_button(self, name, action, index, text=''): ''' create a togglebutton @param name: the button's name, a string @param action: one of ACTION Type Constants @param index: the button's index in button list, an int num @param text: the button's tooltip text, a string ''' button = ToggleButtonItem( (app_theme.get_pixbuf("action/" + name + "_normal.png"), app_theme.get_pixbuf("action/" + name + "_press.png"), app_theme.get_pixbuf("action/" + name + "_hover.png"), app_theme.get_pixbuf("action/" + name + "_press.png"), None), index, self._toggle_button_group.set_index, self._toggle_button_group.get_index) button.connect("pressed", self._toggle_button_pressed) button.connect("toggled", self._toggle_button_toggled, action) button.connect("enter-notify-event", self._show_tooltip, text) button.set_name(name) #self.toolbox.pack_start(button) self._toggle_button_group.pack_start(button) self._toggle_button_list.append(button) def create_button(self, name, text=''): ''' make a button @param name: the button's name, a string @param text: the button's tooltip text, a string ''' button = ImageButton( app_theme.get_pixbuf("action/" + name + "_normal.png"), app_theme.get_pixbuf("action/" + name + "_hover.png"), app_theme.get_pixbuf("action/" + name + "_press.png")) button.connect("enter-notify-event", self._show_tooltip, text) button.connect("clicked", self._button_clicked, name) button.set_name(name) #button.set_size_request(28, 28) self.toolbox.pack_start(button) return button def _show_tooltip(self, widget, event, text): '''the button enter-notify-event callback. Create help tooltip.''' #widget.set_has_tooltip(True) #widget.set_tooltip_text(text) #widget.trigger_tooltip_query() Tooltip.text(widget, text) def _list_menu_show(self, button, x, y, offset_x, offset_y): '''the combo button clicked callback. show combo_buton list menu''' menu_item = [(None, _("save automatically"), self._list_menu_click, SAVE_OP_AUTO, button), (None, _("save as"), self._list_menu_click, SAVE_OP_AS, button), (None, _("save to clipboard"), self._list_menu_click, SAVE_OP_CLIP, button), (None, _("save automatically to file and clipboard"), self._list_menu_click, SAVE_OP_AUTO_AND_CLIP, button)] # set current operate icon current_item = menu_item[self.screenshot.save_op_index] menu_pixbuf = (app_theme.get_pixbuf("action/selected.png"), app_theme.get_pixbuf("action/selected_hover.png"), app_theme.get_pixbuf("action/selected.png")) menu_item[self.screenshot.save_op_index] = (menu_pixbuf, current_item[1], current_item[2], current_item[3]) self.combo_menu = Menu( menu_item, is_root_menu=True, menu_item_select_color=app_theme.get_shadow_color( "menu_item_select").get_color_info()) self.set_all_inactive() self.combo_menu.show((x, y), (offset_x, offset_y)) def _list_menu_click(self, save_op_index, button=None): '''list menu clicked callback''' self.screenshot.save_op_index = save_op_index self.__config.set("save", save_op=str(save_op_index)) # reset the save button's tooltip if button: item = self.combo_menu.get_menu_items()[save_op_index] button.disconnect_by_func(self._show_tooltip) button.connect("enter-notify-event", self._show_tooltip, item.item[1]) self.combo_menu.destroy() self.save_operate() def _button_clicked(self, widget, name): ''' button clicked callback ''' if self.screenshot is None: return # save current input text if self.screenshot.show_text_window_flag: self.win.save_text_window() if name in self._button_clicked_cb: self._button_clicked_cb[name](widget) def _toggle_button_pressed(self, widget): ''' toggle button pressed callback ''' # save current input text if self.screenshot.show_text_window_flag: self.win.save_text_window() def _toggle_button_toggled(self, widget, action): ''' toggle button toggled callback''' if self.screenshot is None: return if widget.get_active(): self.screenshot.set_action_type(action) self.win.set_cursor(action) self.win.show_colorbar() self.win.adjust_colorbar() else: self.win.set_cursor(None) self.win.hide_colorbar() if not self.screenshot.action_list and not self.screenshot.text_action_list and self.screenshot.show_toolbar_flag and not self.screenshot.window_flag: self.screenshot.set_action_type(ACTION_SELECT) elif self.screenshot.action_list: self.screenshot.set_action_type(None) def set_button_active(self, name, state): ''' set button active @param name: the button's name which will set, a string type @param state: the state to set, True or False ''' if self._toggle_button_group.is_active(): button = self._toggle_button_list[ self._toggle_button_group.get_index()] # if the button has been in this state, ignore if button.name == name: if button.get_active() == state: return else: button.set_active(False) self._toggle_button_group.set_index(-1) i = 0 for each in self._toggle_button_list: if name == each.get_name(): each.set_active(state) self._toggle_button_group.set_index(i) break i += 1 def has_button_active(self): ''' is has one toggle button active @return: True if has one togglebutton active, otherwise False ''' return self._toggle_button_group.is_active() def save_operate(self, widget=None): '''do save operate''' screenshot = self.screenshot #print "operate:", screenshot.save_op_index # auto save if screenshot.save_op_index == SAVE_OP_AUTO: folder = utils.get_pictures_dir() filename = "%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png") screenshot.save_snapshot("%s/%s" % (folder, filename)) # save as elif screenshot.save_op_index == SAVE_OP_AS: self.save_to_file() # copy to clip elif screenshot.save_op_index == SAVE_OP_CLIP: screenshot.save_snapshot() # auto save and copy to clip else: folder = utils.get_pictures_dir() filename = "%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png") screenshot.save_snapshot("%s/%s" % (folder, filename), clip_flag=True) def share_picture(self, widget): '''share picture. share button clicked callback''' self.screenshot.share_to_flag = True self.screenshot.save_op_index = SAVE_OP_AUTO self.save_operate() def save_to_file(self): ''' save to file ''' self.win.hide_colorbar() self.win.hide_toolbar() #dialog = SaveFileDialog('', self.screenshot.window.window, #ok_callback=self._save_to_file_cb, cancel_callback=self._save_to_file_cancel) dialog = gtk.FileChooserDialog("Save..", self.win.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT)) dialog.set_action(gtk.FILE_CHOOSER_ACTION_SAVE) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.set_position(gtk.WIN_POS_MOUSE) dialog.set_local_only(True) last_folder = self.__config.get("save", "folder") if last_folder: dialog.set_current_folder(last_folder) else: dialog.set_current_folder(utils.get_pictures_dir()) dialog.set_current_name( "%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png")) response = dialog.run() filename = dialog.get_filename() if response == gtk.RESPONSE_ACCEPT: self.__config.set("save", folder=dialog.get_current_folder()) self._save_to_file_cb(filename) else: self._save_to_file_cancel(filename) dialog.destroy() def _save_to_file_cancel(self, filename): ''' save file dialog cancel_callback''' self.screenshot.share_to_flag = False self.win.adjust_toolbar() self.win.show_toolbar() if self.has_button_active(): self.win.show_colorbar() def _save_to_file_cb(self, filename): ''' save file dialog ok_callback''' print "save", filename self.screenshot.save_snapshot(filename=filename) def set_all_inactive(self): '''set all toggle button inactive''' #index = self._toggle_button_group.get_index() #if index != -1: #self._toggle_button_list[index].set_active(False) #for each in self._toggle_button_list: #each.set_active(False) if self._toggle_button_group.is_active(): self._toggle_button_group.set_index(-1) def show(self): ''' show the toolbar ''' if not self.window.get_visible(): self.window.show_window() #print "toolbox:", self.toolbox.allocation, self.window.allocation def hide(self): '''hide the toolbar''' if self.window.get_visible(): self.window.hide_all()
class RightMenu(): ''' Right Button Menu''' def __init__(self, screenshot): self.screenshot = screenshot # a DeepinScreenshot object # sub menu in save node menu_item = [(None, _("save automatically"), self.save_sub_menu_clicked, SAVE_OP_AUTO), (None, _("save as"), self.save_sub_menu_clicked, SAVE_OP_AS), (None, _("save to clipboard"), self.save_sub_menu_clicked, SAVE_OP_CLIP), (None, _("save automatically to file and clipboard"), self.save_sub_menu_clicked, SAVE_OP_AUTO_AND_CLIP)] self.save_sub_menu = save_sub_menu = Menu( menu_item, menu_item_select_color=app_theme.get_shadow_color( "menu_item_select").get_color_info()) # right button menu self.window = Menu([ ((app_theme_get_dynamic_pixbuf( 'image/action_menu/rect_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/rect_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/rect_normal.png') ), _("draw rectangle"), self._menu_click, "rect"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/ellipse_normal.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/ellipse_hover.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/ellipse_normal.png')), _("draw ellipse"), self._menu_click, "ellipse"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/arrow_normal.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/arrow_hover.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/arrow_normal.png')), _("draw arrow"), self._menu_click, "arrow"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/line_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/line_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/line_normal.png') ), _("draw line"), self._menu_click, "line"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/text_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/text_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/text_normal.png') ), _("draw Text"), self._menu_click, "text"), None, ((app_theme_get_dynamic_pixbuf( 'image/action_menu/undo_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/undo_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/undo_normal.png') ), _("undo"), self._menu_click, "undo"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/save_normal.png'), app_theme_get_dynamic_pixbuf('image/action_menu/save_hover.png'), app_theme_get_dynamic_pixbuf('image/action_menu/save_normal.png') ), _("save"), save_sub_menu), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/cancel_normal.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/cancel_hover.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/cancel_normal.png')), _("cancel"), self._menu_click, "cancel"), ((app_theme_get_dynamic_pixbuf( 'image/action_menu/share_normal.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/share_hover.png'), app_theme_get_dynamic_pixbuf( 'image/action_menu/share_normal.png')), _("share"), self._menu_click, "share"), ], True, menu_item_select_color=app_theme.get_shadow_color( "menu_item_select").get_color_info()) def _menu_click(self, name): '''menu clicked callback''' buttons = self.screenshot.toolbar.toolbox.get_children() for each in buttons: if each.name == name: each.pressed() each.released() each.clicked() return # save current input text if self.screenshot.show_text_window_flag: self.screenshot.window.save_text_window() self.screenshot.toolbar.set_button_active(name, True) def save_sub_menu_clicked(self, save_op_index): '''save sub menu clicked callback''' self.screenshot.toolbar._list_menu_click(save_op_index) def show(self, coord=(0, 0)): ''' show menu ''' # set current operate icon items = self.save_sub_menu.get_menu_items() i = 0 for menu_item in items: item = list(menu_item.item) if i == self.screenshot.save_op_index: item[0] = (app_theme.get_pixbuf("action/selected.png"), app_theme.get_pixbuf("action/selected_hover.png"), app_theme.get_pixbuf("action/selected.png")) else: item[0] = None i += 1 menu_item.item = tuple(item) self.window.show(coord)
(None, "测试测试测试", None), (None, "测试测试测试", None), (None, "测试测试测试4", None, (1, 2, 3)), (None, "测试测试测试5", None), (None, "测试测试测试6", None), ], True ) menu.set_menu_item_sensitive_by_index(1, False) application.set_menu_callback(lambda button: menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0))) # Add navigatebar. tab_window_items = map(create_tab_window_item, ["Tab1", "Tab2", "Tab3", "Tab4", "Tab5"]) droplist = Droplist( [("测试测试测试1", None), ("测试测试测试2", None), ("测试测试测试3", None), None, ("测试测试测试", None), None, ("测试测试测试4", None), ("测试测试测试5", None), ("测试测试测试6", None),
class Toolbar(object): ''' Toolbar window''' def __init__(self, parent=None, screenshot=None): ''' init toolbar @param parent: the transient parent for this window @param screenshot: a Screenshot object ''' self.screenshot = screenshot self.win = screenshot.window self.__config = OperateConfig() save_op = self.__config.get("save", "save_op") if save_op: self.screenshot.save_op_index = int(save_op) else: self.screenshot.save_op_index = SAVE_OP_AUTO #toolbar_padding_x = 15 #toolbar_padding_y = 5 #toolbar_icon_width = toolbar_icon_height = 28 #toolbar_icon_num = 10 #self.height = toolbar_icon_height + toolbar_padding_y * 2 self.height = 30 self.width = 279 #self.width = 240 self.window = Window(window_type=gtk.WINDOW_POPUP, shadow_visible=False) self.window.set_keep_above(True) self.window.set_decorated(False) self.window.set_transient_for(parent) self.toolbox = gtk.HBox(False, 6) toolbox_align = gtk.Alignment() toolbox_align.set(0, 0.5, 0, 0) toolbox_align.set_padding(2, 2, 11, 11) toolbox_align.add(self.toolbox) self.window.window_frame.pack_start(toolbox_align, True, True) #self.window.set_size_request(self.width, self.height) self.window.set_size_request(-1, self.height) self._toggle_button_list = [] self.__button_accelerator_dict = {} self._toggle_button_group = ToggleButtonGroup([], 6) self.toolbox.pack_start(self._toggle_button_group) self.create_toggle_button("rect", ACTION_RECTANGLE, 0, _("Draw Rectangle"), "<Alt>1") self.create_toggle_button("ellipse", ACTION_ELLIPSE, 1, _("Draw Ellipse"), "<Alt>2") self.create_toggle_button("arrow",ACTION_ARROW, 2, _("Draw Arrow"), "<Alt>3") self.create_toggle_button("line",ACTION_LINE, 3, _("Draw Line"), "<Alt>4") self.create_toggle_button("text",ACTION_TEXT, 4, _("Draw Text"), "<Alt>5") self.create_button("undo", _("Undo"), "<Alt>6") if self.screenshot.is_subprocess: self.create_button("save", _("Save"), "<Alt>7") else: # pack save and list button save_combo_button = ComboButton( app_theme.get_pixbuf("action/save_normal.png"), app_theme.get_pixbuf("action/save_hover.png"), app_theme.get_pixbuf("action/save_press.png"), app_theme.get_pixbuf("action/save_normal.png"), app_theme.get_pixbuf("action/list_normal.png"), app_theme.get_pixbuf("action/list_hover.png"), app_theme.get_pixbuf("action/list_press.png"), app_theme.get_pixbuf("action/list_normal.png"),) save_combo_button.set_name("save") save_combo_button.connect("button-clicked", self._button_clicked, "save") save_combo_button.connect("arrow-clicked", self._list_menu_show) save_tip_text_list = ["Save automatically", "Save as", "Save to clipboard", "Save automatically to file and clipboard"] tip_text = save_tip_text_list[self.screenshot.save_op_index] save_combo_button.connect("enter-notify-event", self._show_tooltip, _(tip_text)) self.toolbox.pack_start(save_combo_button) self.create_button("cancel", _("Cancel"), "<Alt>8") if not self.screenshot.is_subprocess: self.create_button("share", _("Share"), "<Alt>9") if self.screenshot: self._button_clicked_cb = { 'undo': self.screenshot.undo, 'save': self.save_operate, 'cancel': self.win.quit, 'share': self.share_picture} def create_toggle_button(self, name, action, index, text='', accel_key=None): ''' create a togglebutton @param name: the button's name, a string @param action: one of ACTION Type Constants @param index: the button's index in button list, an int num @param text: the button's tooltip text, a string ''' button = ToggleButtonItem( (app_theme.get_pixbuf("action/" + name + "_normal.png"), app_theme.get_pixbuf("action/" + name + "_press.png"), app_theme.get_pixbuf("action/" + name + "_hover.png"), app_theme.get_pixbuf("action/" + name + "_press.png"), None), index, self._toggle_button_group.set_index, self._toggle_button_group.get_index) button.connect("pressed", self._toggle_button_pressed) button.connect("toggled", self._toggle_button_toggled, action) button.connect("enter-notify-event", self._show_tooltip, text) button.set_name(name) #self.toolbox.pack_start(button) self._toggle_button_group.pack_start(button) self._toggle_button_list.append(button) if accel_key: self.__button_accelerator_dict[gtk.accelerator_name( *gtk.accelerator_parse(accel_key))] = button def create_button(self, name, text='', accel_key=None): ''' make a button @param name: the button's name, a string @param text: the button's tooltip text, a string ''' button = ImageButton( app_theme.get_pixbuf("action/" + name + "_normal.png"), app_theme.get_pixbuf("action/" + name + "_hover.png"), app_theme.get_pixbuf("action/" + name + "_press.png")) button.connect("enter-notify-event", self._show_tooltip, text) button.connect("clicked", self._button_clicked, name) button.set_name(name) #button.set_size_request(28, 28) self.toolbox.pack_start(button) if accel_key: self.__button_accelerator_dict[gtk.accelerator_name( *gtk.accelerator_parse(accel_key))] = button return button def _show_tooltip(self, widget, event, text): '''the button enter-notify-event callback. Create help tooltip.''' #widget.set_has_tooltip(True) #widget.set_tooltip_text(text) #widget.trigger_tooltip_query() Tooltip.text(widget, text) def _list_menu_show(self, button, x, y, offset_x, offset_y): '''the combo button clicked callback. show combo_buton list menu''' menu_item = [ (None, _("Save automatically"), self._list_menu_click, SAVE_OP_AUTO, button), (None, _("Save as"), self._list_menu_click, SAVE_OP_AS, button), (None, _("Save to clipboard"), self._list_menu_click, SAVE_OP_CLIP, button), (None, _("Save automatically to file and clipboard"), self._list_menu_click, SAVE_OP_AUTO_AND_CLIP, button)] # set current operate icon current_item = menu_item[self.screenshot.save_op_index] menu_pixbuf = ( app_theme.get_pixbuf("action/selected.png"), app_theme.get_pixbuf("action/selected_hover.png"), app_theme.get_pixbuf("action/selected.png")) menu_item[self.screenshot.save_op_index] = (menu_pixbuf, current_item[1], current_item[2], current_item[3]) self.combo_menu = Menu(menu_item, is_root_menu=True, menu_item_select_color=app_theme.get_shadow_color("menu_item_select").get_color_info()) self.set_all_inactive() self.combo_menu.show((x, y), (offset_x, offset_y)) def _list_menu_click(self, save_op_index, button=None): '''list menu clicked callback''' self.screenshot.save_op_index = save_op_index self.__config.set("save", save_op=str(save_op_index)) # reset the save button's tooltip if button: item = self.combo_menu.get_menu_items()[save_op_index] button.disconnect_by_func(self._show_tooltip) button.connect("enter-notify-event", self._show_tooltip, item.item[1]) self.combo_menu.destroy() self.save_operate() def _button_clicked(self, widget, name): ''' button clicked callback ''' if self.screenshot is None: return # save current input text if self.screenshot.show_text_window_flag: self.win.save_text_window() if name in self._button_clicked_cb: self._button_clicked_cb[name](widget) def _toggle_button_pressed(self, widget): ''' toggle button pressed callback ''' # save current input text if self.screenshot.show_text_window_flag: self.win.save_text_window() widget.released() def _toggle_button_toggled(self, widget, action): ''' toggle button toggled callback''' if self.screenshot is None: return if widget.get_active(): self.screenshot.set_action_type(action) self.win.set_cursor(action) self.win.show_colorbar() self.win.adjust_colorbar() elif widget.index == widget.get_index(): self.win.set_cursor(None) self.win.hide_colorbar() if not self.screenshot.action_list and not self.screenshot.text_action_list and self.screenshot.show_toolbar_flag and not self.screenshot.window_flag: self.screenshot.set_action_type(ACTION_SELECT) elif self.screenshot.action_list: self.screenshot.set_action_type(None) def set_button_active(self, name, state): ''' set button active @param name: the button's name which will set, a string type @param state: the state to set, True or False ''' if self._toggle_button_group.is_active(): button = self._toggle_button_list[self._toggle_button_group.get_index()] # if the button has been in this state, ignore if button.name == name: if button.get_active() == state: return else: button.set_active(False) self._toggle_button_group.set_index(-1) i = 0 for each in self._toggle_button_list: if name == each.get_name(): each.set_active(state) self._toggle_button_group.set_index(i) break i += 1 def has_button_active(self): ''' is has one toggle button active @return: True if has one togglebutton active, otherwise False ''' return self._toggle_button_group.is_active() def save_operate(self, widget=None): '''do save operate''' screenshot = self.screenshot if screenshot.is_subprocess: screenshot.save_to_tmp_file() else: # auto save if screenshot.save_op_index == SAVE_OP_AUTO: folder = utils.get_pictures_dir() filename = "%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png") screenshot.save_snapshot("%s/%s" % (folder, filename)) # save as elif screenshot.save_op_index == SAVE_OP_AS: self.save_to_file() # copy to clip elif screenshot.save_op_index == SAVE_OP_CLIP: screenshot.save_snapshot() # auto save and copy to clip else: folder = utils.get_pictures_dir() filename = "%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png") screenshot.save_snapshot("%s/%s" % (folder, filename), clip_flag=True) def share_picture(self, widget): '''share picture. share button clicked callback''' self.screenshot.share_to_flag = True self.screenshot.save_op_index = SAVE_OP_AUTO self.save_operate() def save_to_file(self): ''' save to file ''' self.win.hide_colorbar() self.win.hide_toolbar() #dialog = SaveFileDialog('', self.screenshot.window.window, #ok_callback=self._save_to_file_cb, cancel_callback=self._save_to_file_cancel) dialog = gtk.FileChooserDialog( "Save..", self.win.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT)) dialog.set_action(gtk.FILE_CHOOSER_ACTION_SAVE) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.set_position(gtk.WIN_POS_MOUSE) dialog.set_local_only(True) last_folder = self.__config.get("save", "folder") if last_folder: dialog.set_current_folder(last_folder) else: dialog.set_current_folder(utils.get_pictures_dir()) if config.OPTION_FILE: dialog.set_current_name(config.OPTION_FILE) else: dialog.set_current_name("%s%s.%s" % (_(DEFAULT_FILENAME), utils.get_format_time(), "png")) response = dialog.run() filename = dialog.get_filename() if response == gtk.RESPONSE_ACCEPT: self.__config.set("save", folder=dialog.get_current_folder()) self._save_to_file_cb(filename) else: self._save_to_file_cancel(filename) dialog.destroy() def _save_to_file_cancel(self, filename): ''' save file dialog cancel_callback''' self.screenshot.share_to_flag = False self.win.adjust_toolbar() self.win.show_toolbar() if self.has_button_active(): self.win.show_colorbar() def _save_to_file_cb(self, filename): ''' save file dialog ok_callback''' print "save", filename self.screenshot.save_snapshot(filename=filename) def set_all_inactive(self): '''set all toggle button inactive''' #index = self._toggle_button_group.get_index() #if index != -1: #self._toggle_button_list[index].set_active(False) #for each in self._toggle_button_list: #each.set_active(False) if self._toggle_button_group.is_active(): self._toggle_button_group.set_index(-1) def accel_group_callback(self, group, acceleratable, keyval, modifier): accel_name = gtk.accelerator_name(keyval, modifier) if accel_name in self.__button_accelerator_dict: button = self.__button_accelerator_dict[accel_name] button.pressed() button.released() #button.clicked() self.set_button_active(button.get_name(), True) def show(self): ''' show the toolbar ''' if not self.window.get_visible(): self.window.show_window() #print "toolbox:", self.toolbox.allocation, self.window.allocation def hide(self): '''hide the toolbar''' if self.window.get_visible(): self.window.hide_all()
def init_ui(self): self.loginfo("Init ui") # Init application. self.application = Application( resizable=False, destroy_func=self.application_close_window, ) self.application.set_default_size(888, 634) self.application.set_skin_preview(utils.get_common_image("frame.png")) self.application.set_icon(utils.get_common_image("logo48.png")) self.application.add_titlebar( ["theme", "menu", "min", "close"], show_title=False ) self.application.window.set_title(_("Deepin Store")) self.application.window.connect("delete-event", self.application_close_window) # Init page box. self.page_box = gtk.VBox() # Init page switcher. self.page_switcher = HSlider(200) self.page_switcher.append_page(self.page_box) self.page_switcher.set_to_page(self.page_box) # Init page align. self.page_align = gtk.Alignment() self.page_align.set(0.5, 0.5, 1, 1) self.page_align.set_padding(0, 0, 2, 2) # Append page to switcher. self.paned_box = PanedBox(24) self.paned_box.add_content_widget(self.page_switcher) self.bottom_tip_bar = BottomTipBar() self.bottom_tip_bar.close_button.connect('clicked', lambda w: self.paned_box.bottom_window.hide()) self.paned_box.add_bottom_widget(self.bottom_tip_bar) self.page_align.add(self.paned_box) self.application.main_box.pack_start(self.page_align, True, True) # Init status bar. self.statusbar = Statusbar(24) status_box = gtk.HBox() self.message_box = gtk.HBox() self.message_label = Label("", enable_gaussian=True) label_align = gtk.Alignment() label_align.set(0.0, 0.5, 0, 0) label_align.set_padding(0, 0, 10, 0) label_align.add(self.message_label) self.message_box.pack_start(label_align) join_us_button = LinkButton(_("Join us"), "http://www.linuxdeepin.com/joinus/job") join_us_button_align = gtk.Alignment() join_us_button_align.set(0.5, 0.5, 0, 0) join_us_button_align.set_padding(0, 3, 0, 10) join_us_button_align.add(join_us_button) status_box.pack_start(self.message_box, True, True) status_box.pack_start(join_us_button_align, False, False) self.statusbar.status_box.pack_start(status_box, True, True) self.application.main_box.pack_start(self.statusbar, False, False) # Init navigatebar. self.detail_page = None self.home_page = None self.upgrade_page = None self.uninstall_page = None self.install_page = None self.navigatebar = Navigatebar( [ (DynamicPixbuf(utils.get_common_image("navigatebar/nav_home.png")), _("Home"), self.show_home_page), (DynamicPixbuf(utils.get_common_image("navigatebar/nav_update.png")), _("Upgrade"), self.show_upgrade_page), (DynamicPixbuf(utils.get_common_image("navigatebar/nav_uninstall.png")), _("Uninstall"), self.show_uninstall_page), (DynamicPixbuf(utils.get_common_image("navigatebar/nav_download.png")), _("Installation"), self.show_install_page), ], font_size = 11, padding_x = 2, padding_y = 2, vertical=False, item_hover_pixbuf=DynamicPixbuf(utils.get_common_image("navigatebar/nav_hover.png")), item_press_pixbuf=DynamicPixbuf(utils.get_common_image("navigatebar/nav_press.png")), ) self.navigatebar.set_size_request(-1, 56) self.navigatebar_align = gtk.Alignment(0, 0, 1, 1) self.navigatebar_align.set_padding(0, 0, 4, 0) self.navigatebar_align.add(self.navigatebar) self.application.titlebar.set_size_request(-1, 56) self.application.titlebar.left_box.pack_start(self.navigatebar_align, True, True) self.application.window.add_move_event(self.navigatebar) # Init menu. if LANGUAGE == 'en_US': menu_min_width = 185 else: menu_min_width = 150 menu = Menu( [ (None, _("Refresh package lists"), lambda:global_event.emit('start-update-list')), (None, _("Open download directory"), self.open_download_directory), (None, _("Clear up cached packages"), self.clean_download_cache), (None, _("View new features"), lambda : self.show_wizard_win()), (self.get_pixbuf_group("menu", "setting"), _("Preferences"), self.show_preference_dialog), (self.get_pixbuf_group("menu", "close"), _("Quit"), self.exit), ], is_root_menu=True, menu_min_width=menu_min_width, ) self.application.set_menu_callback( lambda button: menu.show( get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT), (button.get_allocation().width, 0))) self.preference_dialog = DscPreferenceDialog() if hasattr(self, 'recommend_status'): self.init_home_page(self.recommend_status) else: self.init_home_page()