## vim:ts=4:et:nowrap ## ##---------------------------------------------------------------------------## ## ## PySol -- a Python Solitaire game ## ## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer ## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer ## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; see the file COPYING. ## If not, write to the Free Software Foundation, Inc., ## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## Markus F.X.J. Oberhumer ## ## http://wildsau.idv.uni-linz.ac.at/mfx/pysol.html ## ##---------------------------------------------------------------------------## # imports import os, re, sys import gtk from gtk import gdk # PySol imports from pysollib.gamedb import GI from pysollib.actions import PysolMenubarActions from pysollib.settings import PACKAGE # toolkit imports from tkutil import setTransient from tkutil import color_tk2gtk, color_gtk2tk from selectcardset import SelectCardsetDialogWithPreview from selectcardset import SelectCardsetByTypeDialogWithPreview from selecttile import SelectTileDialogWithPreview from selectgame import SelectGameDialogWithPreview gettext = _ def ltk2gtk(s): return gettext(s).replace('&', '_') # /*********************************************************************** # // - create menubar # // - update menubar # // - menu actions # ************************************************************************/ class PysolMenubar(PysolMenubarActions): def __init__(self, app, top, progress=None): PysolMenubarActions.__init__(self, app, top) self.progress = progress # create menus menubar = self.createMenubar() self.top.table.attach(menubar, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, 0, 0, 0); menubar.show() # # create menubar # def m(self, *args): ##print args pass def createMenubar(self): entries = ( ('newgame', gtk.STOCK_NEW, ltk2gtk('&New game'), 'N', ltk2gtk('New game'), self.mNewGame), ('open', gtk.STOCK_OPEN, ltk2gtk('&Open...'), 'O', ltk2gtk('Open a\nsaved game'), self.mOpen), ('restart', gtk.STOCK_REFRESH, ltk2gtk('&Restart'), 'G', ltk2gtk('Restart the\ncurrent game'), self.mRestart), ('save', gtk.STOCK_SAVE, ltk2gtk('&Save'), 'S', ltk2gtk('Save game'), self.mSave), ('undo', gtk.STOCK_UNDO, ltk2gtk('&Undo'), 'Z', ltk2gtk('Undo'), self.mUndo), ('redo', gtk.STOCK_REDO, ltk2gtk('&Redo'), 'R', ltk2gtk('Redo'), self.mRedo), ('autodrop',gtk.STOCK_JUMP_TO, ltk2gtk('&Auto drop'), 'A', ltk2gtk('Auto drop'), self.mDrop), ('stats', gtk.STOCK_HOME, ltk2gtk('Stats'), None, ltk2gtk('Statistics'), self.mStatus), ('rules', gtk.STOCK_HELP, ltk2gtk('Rules'), 'F1', ltk2gtk('Rules'), self.mHelpRules), ('quit', gtk.STOCK_QUIT, ltk2gtk('&Quit'), 'Q', ltk2gtk('Quit PySol'), self.mQuit), ('file', None, ltk2gtk('&File')), ('selectgame', None, ltk2gtk('Select &game')), ('edit', None, ltk2gtk('&Edit')), ('game', None, ltk2gtk('&Game')), ('assist', None, ltk2gtk('&Assist')), ('options', None, ltk2gtk('&Options')), ("automaticplay", None, ltk2gtk("&Automatic play")), ('animations', None, ltk2gtk('A&nimations')), ('help', None, ltk2gtk('&Help')), ('playablepreview', None, ltk2gtk('Playable pre&view...'), 'V', None, self.mSelectGameDialogWithPreview), ('selectgamebynumber', None, ltk2gtk('Select game by nu&mber...'), None, None, self.mSelectGameById), ('saveas', None, ltk2gtk('Save &as...'), None, None, self.m), ('redoall', None, ltk2gtk('Redo &all'), None, None, self.mRedoAll), ('dealcards', None, ltk2gtk('&Deal cards'), 'D', None, self.mDeal), ('status', None, ltk2gtk('S&tatus...'), 'T', None, self.mStatus), ('hint', None, ltk2gtk('&Hint'), 'H', None, self.mHint), ('highlightpiles', None, ltk2gtk('Highlight p&iles'), None, None, self.mHighlightPiles), ('demo', None,ltk2gtk('&Demo'), 'D',None,self.mDemo), ('demoallgames', None,ltk2gtk('Demo (&all games)'), None,None,self.mMixedDemo), ('playeroptions',None,ltk2gtk('&Player options...'),None,None,self.mOptPlayerOptions), ('tabletile', None,ltk2gtk('Table t&ile...'), None,None,self.mOptTableTile), ('contents', None,ltk2gtk('&Contents'),'F1',None,self.mHelp), ('aboutpysol', None,ltk2gtk('&About ')+PACKAGE+'...', None,None,self.mHelpAbout), ) # toggle_entries = ( ('pause', gtk.STOCK_STOP, ltk2gtk('&Pause'), 'P', ltk2gtk('Pause game'), self.mPause), ('optautodrop', None, ltk2gtk('A&uto drop'), None, None, self.mOptAutoDrop), ('autofaceup', None, ltk2gtk('Auto &face up'), None, None, self.mOptAutoFaceUp), ("autodeal", None, ltk2gtk("Auto &deal"), None, None, self.mOptAutoDeal), ("quickplay", None, ltk2gtk('&Quick play'), None, None, self.mOptQuickPlay), ('highlightmatchingcards', None, ltk2gtk('Highlight &matching cards'), None, None, self.mOptEnableHighlightCards), ('cardshadow', None, ltk2gtk('Card shado&w'), None, None, self.mOptShadow), ('shadelegalmoves', None, ltk2gtk('Shade &legal moves'), None, None, self.mOptShade), ) # animations_entries = ( ('animationnone', None, ltk2gtk('&None'), None, None, 0), ('animationfast', None, ltk2gtk('&Fast'), None, None, 1), ('animationtimer', None, ltk2gtk('&Timer based'), None, None, 2), ('animationslow', None, ltk2gtk('&Slow'), None, None, 3), ('animationveryslow', None, ltk2gtk('&Very slow'), None, None, 4), ) # ui_info = ''' ''' # ui_manager = gtk.UIManager() ui_manager_id = ui_manager.add_ui_from_string(ui_info) action_group = gtk.ActionGroup('PySolActions') action_group.add_actions(entries) action_group.add_toggle_actions(toggle_entries) action_group.add_radio_actions(animations_entries, self.app.opt.animations, self.mOptAnimations) ui_manager.insert_action_group(action_group, 0) self.top.add_accel_group(ui_manager.get_accel_group()) self.top.ui_manager = ui_manager menubar = ui_manager.get_widget('/menubar') games = map(self.app.gdb.get, self.app.gdb.getGamesIdSortedByName()) menu_item = ui_manager.get_widget('/menubar/file/selectgame') menu_item.show() menu = gtk.Menu() menu_item.set_submenu(menu) self._addSelectAllGameSubMenu(games, menu, self.mSelectGame) return menubar def _createSubMenu(self, menu, label): menu_item = gtk.MenuItem(label) menu.add(menu_item) menu_item.show() submenu = gtk.Menu() menu_item.set_submenu(submenu) return submenu def _addSelectGameSubMenu(self, games, menu, command, group): for g in games: label = g.name label = gettext(label) menu_item = gtk.RadioMenuItem(group, label) group = menu_item menu.add(menu_item) menu_item.show() menu_item.connect('toggled', command, g.id) def _addSelectAllGameSubMenu(self, games, menu, command): cb_max = gdk.screen_height()/24 n, d = 0, cb_max i = 0 group = None while True: if self.progress: self.progress.update(step=1) i += 1 if not games[n:n+d]: break m = min(n+d-1, len(games)-1) n1, n2 = games[n].name, games[m].name n1, n2 = gettext(n1), gettext(n2) label = n1[:3]+' - '+n2[:3] submenu = self._createSubMenu(menu, label=label) group = self._addSelectGameSubMenu(games[n:n+d], submenu, command, group) n += d # # menu updates # ## WARNING: setMenuState: not found: /menubar/file/holdandquit ## WARNING: setMenuState: not found: /menubar/assist/findcard def setMenuState(self, state, path): path_map = { 'help.rulesforthisgame': '/menubar/help/rules', 'options.automaticplay.autodrop': '/menubar/options/automaticplay/optautodrop' } if path_map.has_key(path): path = path_map[path] else: path = '/menubar/'+path.replace('.', '/') menuitem = self.top.ui_manager.get_widget(path) if not menuitem: ##print 'WARNING: setMenuState: not found:', path return menuitem.set_sensitive(state) def setToolbarState(self, state, path): path = '/toolbar/'+path button = self.top.ui_manager.get_widget(path) if not button: print 'WARNING: setToolbarState: not found:', path else: button.set_sensitive(state) # # menu actions # def _createFileChooser(self, title, action, idir, ifile): d = gtk.FileChooserDialog(title, self.top, action, (gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) d.set_current_folder(idir) if ifile: d.set_current_name(ifile) filter = gtk.FileFilter() filter.set_name('PySol files') filter.add_pattern('*.pso') d.add_filter(filter) filter = gtk.FileFilter() filter.set_name('All files') filter.add_pattern('*') d.add_filter(filter) resp = d.run() if resp == gtk.RESPONSE_ACCEPT: filename = d.get_filename() else: filename = None d.destroy() return filename def mOpen(self, *args): if self._cancelDrag(break_pause=False): return filename = self.game.filename if filename: idir, ifile = os.path.split(os.path.normpath(filename)) else: idir, ifile = "", "" if not idir: idir = self.app.dn.savegames filename = self._createFileChooser(_('Open Game'), gtk.FILE_CHOOSER_ACTION_OPEN, idir, '') if filename: ##filename = os.path.normpath(filename) ##filename = os.path.normcase(filename) if os.path.isfile(filename): self.game.loadGame(filename) def mSaveAs(self, *event): if self._cancelDrag(break_pause=False): return if not self.menustate.save_as: return filename = self.game.filename if not filename: filename = self.app.getGameSaveName(self.game.id) if os.name == "posix": filename = filename + "-" + self.game.getGameNumber(format=0) elif os.path.supports_unicode_filenames: # new in python 2.3 filename = filename + "-" + self.game.getGameNumber(format=0) else: filename = filename + "-01" filename = filename + '.pso' idir, ifile = os.path.split(os.path.normpath(filename)) if not idir: idir = self.app.dn.savegames ##print self.game.filename, ifile filename = self._createFileChooser(_('Save Game'), gtk.FILE_CHOOSER_ACTION_SAVE, idir, ifile) if filename: ##filename = os.path.normpath(filename) ##filename = os.path.normcase(filename) self.game.saveGame(filename) self.updateMenus() def mOptCardset(self, *args): pass def mOptTableTile(self, *args): if self._cancelDrag(break_pause=False): return key = self.app.tabletile_index if key <= 0: key = self.app.opt.table_color.lower() d = SelectTileDialogWithPreview(self.top, app=self.app, title=_('Select table background'), manager=self.app.tabletile_manager, key=key) if d.status == 0 and d.button in (0, 1): if type(d.key) is str: self._mOptTableColor(d.key) elif d.key > 0 and d.key != self.app.tabletile_index: self._mOptTableTile(d.key) def mOptHintOptions(self, *args): pass def mOptDemoOptions(self, *args): pass def updateFavoriteGamesMenu(self, *args): pass def mSelectGame(self, menu_item, game_id): if menu_item.get_active(): self._mSelectGame(game_id) def mOptAnimations(self, a1, a2): ##print a1.get_current_value(), a2.get_current_value() self.app.opt.animations = a1.get_current_value() def _mOptTableTile(self, i): self.app.setTile(i) def _mOptTableColor(self, color): tile = self.app.tabletile_manager.get(0) tile.color = color self.app.setTile(0) def mSelectGameDialogWithPreview(self, *event): if self._cancelDrag(break_pause=False): return ## self.game.setCursor(cursor=CURSOR_WATCH) bookmark = None ## if 0: ## # use a bookmark for our preview game ## if self.game.setBookmark(-2, confirm=0): ## bookmark = self.game.gsaveinfo.bookmarks[-2][0] ## del self.game.gsaveinfo.bookmarks[-2] ##~ after_idle(self.top, self.__restoreCursor) d = SelectGameDialogWithPreview(self.top, title=_("Select game"), app=self.app, gameid=self.game.id, bookmark=bookmark) return self._mSelectGameDialog(d) def _mSelectGameDialog(self, d): if d.status == 0 and d.button == 0 and d.gameid != self.game.id: ##~ self.tkopt.gameid.set(d.gameid) ##~ self.tkopt.gameid_popular.set(d.gameid) if 0: self._mSelectGame(d.gameid, random=d.random) else: # don't ask areYouSure() self._cancelDrag() self.game.endGame() self.game.quitGame(d.gameid, random=d.random)