📄 callbackhandler.py
字号:
"""Frontend callback handler. Responsible for handling all GUI actions."""import appimport gobjectimport gtkimport gtk.gdkimport osimport shutilimport frontendimport configimport prefsimport resourcesimport MainFrameimport singleclickimport eventloopimport mathimport dialogsimport folderimport playlistimport platformutilsimport startupfrom gtcache import gettext as _ def AttachBoolean (widget, descriptor, sensitive_widget = None): def BoolChanged (widget): config.set (descriptor, widget.get_active()) if (sensitive_widget != None): sensitive_widget.set_sensitive (widget.get_active()) widget.set_active (config.get(descriptor)) if (sensitive_widget != None): sensitive_widget.set_sensitive (widget.get_active()) widget.connect ('toggled', BoolChanged) def AttachBooleanRadio (widget_true, widget_false, descriptor, sensitive_widget = None): def BoolChanged (widget): config.set (descriptor, widget.get_active()) if (sensitive_widget != None): sensitive_widget.set_sensitive (widget.get_active()) if config.get(descriptor): widget_true.set_active (True) else: widget_false.set_active (False) if (sensitive_widget != None): sensitive_widget.set_sensitive (widget_true.get_active()) widget_true.connect ('toggled', BoolChanged)def AttachInteger (widget, descriptor): def IntegerChanged (widget): try: config.set (descriptor, widget.get_value_as_int()) except: pass widget.set_value (config.get(descriptor)) widget.connect ('changed', IntegerChanged)def AttachFloat (widget, descriptor): def FloatChanged (widget): try: config.set (descriptor, widget.get_value()) except: pass widget.set_value (config.get(descriptor)) widget.connect ('changed', FloatChanged)def AttachCombo (widget, descriptor, values): def ComboChanged (widget): config.set (descriptor, values[widget.get_active()]) value = config.get (descriptor) widget.set_active (-1) for i in xrange (len (values)): if values[i] == value: widget.set_active (i) break widget.connect ('changed', ComboChanged)class CallbackHandler(object): """Class to handle menu item activation, button presses, etc. The method names for this class correspond to the event handler that they implement. The event handler name's are chosen in glade. CallbackHandler uses the underscored_method_name convention for its methods, because that's the default for glade. """ current_folder = None def __init__(self, mainFrame): self.mainFrame = mainFrame self.mainApp = app.controller def actionGroups (self): platformutils.confirmMainThread() actionGroups = {} actionGroups["VideoSelected"] = gtk.ActionGroup("VideoSelected") actionGroups["VideosSelected"] = gtk.ActionGroup("VideosSelected") actionGroups["VideoPlaying"] = gtk.ActionGroup("VideoPlaying") actionGroups["VideoPlayable"] = gtk.ActionGroup("VideoPlayable") actionGroups["ChannelSelected"] = gtk.ActionGroup("ChannelSelected") actionGroups["ChannelsSelected"] = gtk.ActionGroup("ChannelsSelected") actionGroups["ChannelFolderSelected"] = gtk.ActionGroup("ChannelFolderSelected") actionGroups["ChannelLikeSelected"] = gtk.ActionGroup("ChannelLikeSelected") actionGroups["ChannelLikesSelected"] = gtk.ActionGroup("ChannelLikesSelected") actionGroups["PlaylistLikeSelected"] = gtk.ActionGroup("PlaylistLikeSelected") actionGroups["PlaylistLikesSelected"] = gtk.ActionGroup("PlaylistLikesSelected") actionGroups["Ubiquitous"] = gtk.ActionGroup("Ubiquitous") try: fullscreen = gtk.STOCK_FULLSCREEN except: fullscreen = None actionGroups["VideoSelected"].add_actions ([ ('SaveVideo', gtk.STOCK_SAVE, _('Save Video _As...'), '<Control>s', _('Save this video'), self.on_save_video_activate), ('CopyVideoURL', None, _('_Copy Video URL'), None, None, self.on_copy_video_link_activate), ]) actionGroups["VideosSelected"].add_actions ([ ('RemoveVideos', None, _('_Remove Video'), None, None, self.on_remove_video_activate), ]) actionGroups["VideoPlaying"].add_actions ([ ('Fullscreen', fullscreen, _('_Fullscreen'), '<Control>f', None, self.on_fullscreen_button_clicked), ('StopVideo', None, _('_Stop Video'), None, None, self.on_stop_activate), ('NextVideo', None, _('_Next Video'), '<Alt>Right', None, self.on_next_button_clicked), ('PreviousVideo', None, _('_Previous Video'), '<Alt>Left', None, self.on_previous_button_clicked), ]) actionGroups["VideoPlayable"].add_actions ([ ('PlayPauseVideo', gtk.STOCK_MEDIA_PLAY, _('_Play / Pause'), '<Control>space', None, self.on_play_pause_button_clicked), ]) actionGroups["ChannelSelected"].add_actions ([ ('CopyChannelURL', None, _("Copy Channel _Link"), None, None, self.on_copy_channel_link_activate), ('MailChannel', None, _("_Send this channel to a friend"), None, None, self.on_mail_channel_link_activate), ]) actionGroups["ChannelsSelected"].add_actions ([ ('UpdateChannels', None, _("_Update Channel"), None, None, self.on_update_channel_activate), ]) actionGroups["ChannelLikeSelected"].add_actions ([ ('RenameChannel', None, _("Re_name Channel"), None, None, self.on_rename_channel_activate), ]) actionGroups["ChannelLikesSelected"].add_actions ([ ('RemoveChannels', None, _("_Remove Channel"), None, None, self.on_remove_channel_activate), ]) actionGroups["PlaylistLikeSelected"].add_actions ([ ('RenamePlaylist', None, _("Re_name Playlist"), None, None, self.on_rename_playlist_activate), ]) actionGroups["PlaylistLikesSelected"].add_actions ([ ('RemovePlaylists', None, _("_Remove Playlist"), None, None, self.on_remove_playlist_activate), ]) actionGroups["Ubiquitous"].add_actions ([ ('Video', None, _('_Video')), ('Channels', None, _('_Channels')), ('Playlists', None, _('_Playlists')), ('Playback', None, _('P_layback')), ('Open', gtk.STOCK_OPEN, _('_Open...'), '<Control>o', _('Open various files'), self.on_open_video_activate), ('NewPlaylist', None, _('New _Playlist...'), None, _('Create new playlist'), self.on_new_playlist_activate), ('NewPlaylistFolder', None, _('New Playlist _Folder...'), None, _('Create new playlist folder'), self.on_new_playlist_folder_activate), ('NewChannelFolder', None, _('New Channel _Folder...'), None, _('Create new channel folder'), self.on_new_channel_folder_activate), ('NewChannel', None, _("Add _Channel..."), None, None, self.on_add_channel_button_clicked), ('NewSearchChannel', None, _("New Searc_h Channel..."), None, None, self.on_add_search_channel_button_clicked), ('NewGuide', None, _("New Channel _Guide..."), None, None, self.on_add_guide_button_clicked), ('EditPreferences', gtk.STOCK_PREFERENCES, _('P_references'), None, None, self.on_preference), ('Quit', gtk.STOCK_QUIT, _('_Quit'), '<Control>q', _('Quit the Program'), self.on_quit_activate), ('UpdateAllChannels', None, _("U_pdate All Channels"), None, None, self.on_update_all_channels_activate), ('Help', None, _('_Help')), ('About', gtk.STOCK_ABOUT, None, None, None, self.on_about_clicked), ('Donate', None, _("_Donate"), None, None, self.on_donate_clicked), ('Delete', None, _('Delete selection'), 'Delete', None, self.on_delete), ('Backspace', None, _('Delete selection'), 'BackSpace', None, self.on_delete), ]) return actionGroups def on_main_delete(self, *args): platformutils.confirmMainThread() app.controller.quit() return True def on_play_pause_button_clicked(self, event = None): videoDisplay = self.mainApp.videoDisplay if videoDisplay.isPlaying: videoDisplay.pause() else: videoTimeScale = self.mainFrame.widgetTree['video-time-scale'] videoDisplay.play(videoTimeScale.get_value()) self.mainFrame.windowChanger.updatePlayPauseButton() def on_previous_button_clicked(self, event): eventloop.addIdle(lambda:app.controller.playbackController.skip(-1), "Skip to previous track") def on_next_button_clicked(self, event): eventloop.addIdle(lambda:app.controller.playbackController.skip(1), "Skip to next track") def on_video_time_scale_button_press_event(self, scale, event): scale.buttonsDown.add(event.button) def on_video_time_scale_button_release_event(self, scale, event): platformutils.confirmMainThread() # we want to remove the button from the buttonsDown set, but we can't # yet, because we haven't run the default signal handler yet, which # will emit the value-changed signal. So we use use idle_add, to # remove the buttons once we're done with signal processing. button = event.button def remove(): try: scale.buttonsDown.remove(button) except KeyError: pass gobject.idle_add(remove)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -