home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / python / menubar.py < prev    next >
Encoding:
Python Source  |  2007-11-12  |  9.7 KB  |  261 lines

  1. # Miro - an RSS based video player application
  2. # Copyright (C) 2005-2007 Participatory Culture Foundation
  3. #
  4. # This program is free software; you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License as published by
  6. # the Free Software Foundation; either version 2 of the License, or
  7. # (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  17.  
  18. # Defines menu, accelerator keys, and shortcuts
  19. # THIS IS STILL A WORK IN PROGRESS. THE FORMAT IS NOT FINAL
  20. from gtcache import gettext as _
  21. import config
  22. import prefs
  23. from string import Template
  24. import app
  25.  
  26. CTRL, ALT, SHIFT, CMD, RIGHT_ARROW, LEFT_ARROW, UP_ARROW, DOWN_ARROW, SPACE, ENTER, DELETE, BKSPACE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12 = range(24)
  27. _ = lambda x : x
  28. platform = config.get(prefs.APP_PLATFORM)
  29.  
  30. if platform == "osx":
  31.    MOD = CMD
  32. else:
  33.    MOD = CTRL
  34.  
  35. class ShortCut:
  36.     def __init__(self, key, *modifiers):
  37.         self.modifiers = modifiers
  38.         self.key = key
  39.  
  40. Key = ShortCut
  41.  
  42. class MenuItem:
  43.     def __init__(self, label, action, shortcuts, impl = None, enabled = True, **stateLabels):
  44.         self.label = label
  45.         self.action = action
  46.         self.shortcuts = shortcuts
  47.         self.enabled = enabled
  48.         self.stateLabels = stateLabels
  49.         self.impl = impl
  50.  
  51. class Separator:
  52.     pass
  53.  
  54. class Menu:
  55.     def __init__(self, label, action, *menuitems):
  56.         self.label = label
  57.         self.action = action
  58.         self.labels = {action:label}
  59.         self.stateLabels = {}
  60.         self.shortcuts = {}
  61.         self.impls = {}
  62.         self.menuitems = menuitems
  63.         for item in menuitems:
  64.             if not isinstance(item, Separator):
  65.                 self.labels[item.action] = item.label
  66.                 self.shortcuts[item.action] = item.shortcuts
  67.                 self.impls[item.action] = item.impl
  68.                 if item.stateLabels:
  69.                     self.stateLabels[item.action] = item.stateLabels
  70.             
  71.     def getLabel(self, action, state=None, variables=None):
  72.         if variables == None:
  73.             variables = {}
  74.         if state is None:
  75.             try:
  76.                 return Template(self.labels[action]).substitute(**variables)
  77.             except KeyError:
  78.                 return action
  79.         else:
  80.             try:
  81.                 return Template(self.stateLabels[action][state]).substitute(**variables)
  82.             except KeyError:
  83.                 return self.getLabel(action)
  84.  
  85.     def getShortcuts(self, action):
  86.         try:
  87.             return self.shortcuts[action]
  88.         except:
  89.             return ()
  90.  
  91. class MenuBar:
  92.     def __init__(self, *menus):
  93.         self.menus = menus
  94.         self.labels = {}
  95.         self.stateLabels = {}
  96.         self.shortcuts = {}
  97.         self.impls = {}
  98.         for menu in menus:
  99.             self.labels.update(menu.labels)
  100.             self.stateLabels.update(menu.stateLabels)
  101.             self.shortcuts.update(menu.shortcuts)
  102.             self.impls.update(menu.impls)
  103.  
  104.     def __iter__(self):
  105.         for menu in self.menus:
  106.             yield menu
  107.  
  108.     def getLabel(self, action, state=None, variables=None):
  109.         if variables == None:
  110.             variables = {}
  111.  
  112.         if state is None:
  113.             try:
  114.                 return Template(self.labels[action]).substitute(**variables)
  115.             except KeyError:
  116.                 return action
  117.         else:
  118.             try:
  119.                 return Template(self.stateLabels[action][state]).substitute(**variables)
  120.             except KeyError:
  121.                 return self.getLabel(action)
  122.     def getShortcuts(self, action):
  123.         try:
  124.             if self.shortcuts[action] is None:
  125.                 return ()
  126.             else:
  127.                 return self.shortcuts[action]
  128.         except KeyError:
  129.             return ()
  130.     def getShortcut(self, action):
  131.         all = self.getShortcuts(action)
  132.         if len(all) > 0:
  133.             return all[0]
  134.         else:
  135.             return ShortCut(None)
  136.  
  137.     def getImpl(self, action):
  138.         try:
  139.             return self.impls[action]
  140.         except KeyError:
  141.             return None
  142.  
  143. VideoItems = [
  144.     MenuItem(_("_Open"), "Open", (Key("o", MOD),)),
  145.     MenuItem(_("_Download Video"), "NewDownload", (), impl=lambda:app.controller.newDownload()),
  146.     #MenuItem(_("Op_en Recent"), "OpenRecent", ()),
  147.     MenuItem(_("Check _Version"), "CheckVersion", ()),
  148.     Separator(),
  149.     MenuItem(_("_Remove Video"), "RemoveVideos", (Key(DELETE),Key(BKSPACE, MOD)), enabled=False,
  150.              plural=_("_Remove Videos")),
  151.     MenuItem(_("Re_name Video"), "RenameVideo", (), enabled=False),
  152.     MenuItem(_("Save Video _As..."), "SaveVideo", (Key("s",MOD),), enabled=False,
  153.              plural=_("Save Videos _As...")),
  154.     MenuItem(_("Copy Video _URL"), "CopyVideoURL", (Key("u", MOD),), enabled=False),
  155.     Separator(),
  156.     MenuItem(_("_Options..."), "EditPreferences", ()),
  157.     MenuItem(_("_Quit"),"Quit", (Key("q",MOD),)),
  158. ]
  159.  
  160. if platform == "gtk-x11":
  161.     del VideoItems[2] # No "Check version" on GTK platforms. We use
  162.                       # the package management system instead
  163.  
  164. EditItems = [
  165.     MenuItem(_("Cu_t"), "ClipboardCut", (Key("x",MOD),)),
  166.     MenuItem(_("_Copy"), "ClipboardCopy", (Key("c",MOD),)),
  167.     MenuItem(_("_Paste"), "ClipboardPaste", (Key("v",MOD),)),
  168.     MenuItem(_("Select _All"), "ClipboardSelectAll", (Key("a",MOD),)),
  169.     MenuItem(_("_Delete"), "ClipboardSelectAll", (Key(DELETE),Key(BKSPACE,MOD))),
  170. ]
  171.  
  172. ChannelItems = [
  173.     MenuItem(_("Add _Channel"), "NewChannel", (Key("n",MOD),)),
  174.     MenuItem(_("New Searc_h Channel..."), "NewSearchChannel", ()),
  175.     MenuItem(_("New _Folder..."), "NewChannelFolder", (Key("n",MOD,SHIFT),)),
  176.     MenuItem(_("Add Channel _Guide..."), "NewGuide", ()),
  177.     Separator(),
  178.     MenuItem(_("Re_name Channel..."), "RenameChannel", (), enabled=False),
  179.     MenuItem(_("_Remove Channel..."), "RemoveChannels", (Key(DELETE),Key(BKSPACE, MOD)), enabled=False,
  180.              plural=_("_Remove Channels..."),
  181.              folders=_("_Remove Channel Folders..."),
  182.              folder=_("_Remove Channel Folder..."),
  183.              ),
  184.     MenuItem(_("_Update Channel..."), "UpdateChannels", (Key("r",MOD),Key(F5)), enabled=False,
  185.              plural=_("_Update Channels...")),
  186.     MenuItem(_("Update _All Channels"), "UpdateAllChannels", (Key("r",MOD,SHIFT),)),
  187.     Separator(),
  188.     MenuItem(_("_Import Channels (OPML)..."), "ImportChannels", (), impl=lambda:app.controller.importChannels()),
  189.     MenuItem(_("E_xport Channels (OPML)..."), "ExportChannels", (), impl=lambda:app.controller.exportChannels()),
  190.     Separator(),
  191.     MenuItem(_("_Send this channel to a friend"), "MailChannel", (), enabled=False),
  192.     MenuItem(_("Copy Channel _Link"), "CopyChannelURL", (), enabled=False),
  193. ]
  194. PlaylistItems = [
  195.     MenuItem(_("New _Playlist"), "NewPlaylist", (Key("p",MOD),)),
  196.     MenuItem(_("New Playlist Fol_der"), "NewPlaylistFolder",(Key("p",MOD,SHIFT),)),
  197.     Separator(),
  198.     MenuItem(_("Re_name Playlist"),"RenamePlaylist",(), enabled=False),
  199.     MenuItem(_("_Remove Playlist"),"RemovePlaylists", (Key(DELETE),Key(BKSPACE, MOD)), enabled=False,
  200.              plural=_("_Remove Playlists"),
  201.              folders=_("_Remove Playlist Folders"),
  202.              folder=_("_Remove Playlist Folder"),
  203.              ),
  204. ]
  205.  
  206. if platform == "windows-xul":
  207.     fullscreen_shortcuts = (Key("f", MOD), Key(ENTER, ALT))
  208. else:
  209.     fullscreen_shortcuts = (Key("f", MOD), )
  210.  
  211. PlaybackItems = [
  212.     MenuItem(_("_Play"), "PlayPauseVideo", (Key(SPACE, MOD), ), enabled=False,
  213.              play=_("_Play"),
  214.              pause=_("_Pause")),
  215.     MenuItem(_("_Stop"), "StopVideo", (Key("d",MOD),), enabled=False),
  216.     Separator(),
  217.     MenuItem(_("_Next Video"), "NextVideo", (Key(RIGHT_ARROW, MOD),), enabled=False),
  218.     MenuItem(_("_Previous Video"), "PreviousVideo", (Key(LEFT_ARROW, MOD),), enabled=False),
  219.     Separator(),
  220.     MenuItem(_("Skip _Forward"), "FastForward", (Key(RIGHT_ARROW),), enabled=False),
  221.     MenuItem(_("Skip _Back"), "Rewind", (Key(LEFT_ARROW),), enabled=False),
  222.     Separator(),
  223.     MenuItem(_("Volume _Up"), "UpVolume", (Key(UP_ARROW, MOD),), enabled=False),
  224.     MenuItem(_("Volume _Down"), "DownVolume", (Key(DOWN_ARROW,MOD),), enabled=False),
  225.     Separator(),
  226.     MenuItem(_("_Fullscreen"), "Fullscreen", fullscreen_shortcuts, enabled=False),
  227. ]
  228.  
  229. HelpItems = [
  230.     MenuItem(_("_About"), "About", ()),
  231.     MenuItem(_("_Donate"), "Donate", ()),
  232.     MenuItem(_("_Help"), "Help", (Key(F1),)),
  233.     Separator(),
  234.     MenuItem(_("Report a _Bug"), "ReportBug", ()),
  235. ]
  236.  
  237. if platform == "gtk-x11":
  238.     main_title = _("_Video")
  239. else:
  240.     main_title = _("_File")
  241.  
  242. menubar = \
  243.         MenuBar(Menu(main_title, "Video", *VideoItems),
  244.                 Menu(_("_Channels"), "Channels", *ChannelItems),
  245.                 Menu(_("_Playlists"), "Playlists", *PlaylistItems),
  246.                 Menu(_("P_layback"), "Playback", *PlaybackItems),
  247.                 Menu(_("_Help"), "Help", *HelpItems),
  248.                 )
  249.  
  250. traymenu = Menu("Miro","Miro",
  251.                 MenuItem(_("Play Unwatched ($numUnwatched)"), "PlayUnwatched", ()),
  252.                 MenuItem(_("Pause All Downloads ($numDownloading)"), "PauseDownloads", ()),
  253.                 MenuItem(_("Resume All Downloads ($numPaused)"), "ResumeDownloads", ()),
  254.                 Separator(),
  255.                 MenuItem(_("Options..."), "EditPreferences", ()),
  256.                 Separator(),
  257.                 MenuItem(_("Hide Window"),"RestoreWindow", (),
  258.                          restore=_("Show Window")),
  259.                 MenuItem(_("Quit"),"Quit", ()),
  260.                 )                
  261.