diff --git a/pysollib/actions.py b/pysollib/actions.py index 65280458..c6c87109 100644 --- a/pysollib/actions.py +++ b/pysollib/actions.py @@ -272,7 +272,6 @@ class PysolMenubarActions: ms.autodeal = 1 if autostacks[2]: ms.quickplay = 1 - ms.highlight_piles = 0 if opt.highlight_piles and game.getHighlightPilesStacks(): ms.highlight_piles = 1 if game.app.getGameRulesFilename(game.id): # note: this may return "" @@ -321,7 +320,7 @@ class PysolMenubarActions: self.setToolbarState(ms.rules, "rules") # self.tkopt.comment.set(bool(self.game.gsaveinfo.comment)) - #self.setToolbarState(ms.pause, "pause") + self.tkopt.pause.set(self.game.pause) # update menu items and toolbar def updateMenus(self): diff --git a/pysollib/move.py b/pysollib/move.py index cc2e9ed7..d27adab4 100644 --- a/pysollib/move.py +++ b/pysollib/move.py @@ -147,11 +147,15 @@ class AFlipAllMove(AtomicMove): for card in stack.cards: if card.face_up: card.showBack() + else: + card.showFace() def undo(self, game): stack = game.allstacks[self.stack_id] for card in stack.cards: - if not card.face_up: + if card.face_up: + card.showBack() + else: card.showFace() def cmpForRedo(self, other): diff --git a/pysollib/stack.py b/pysollib/stack.py index fa32495c..f7145e42 100644 --- a/pysollib/stack.py +++ b/pysollib/stack.py @@ -429,7 +429,8 @@ class Stack: view._position(card) if update: view.updateText() - self.closeStackMove() + if not self.game.moves.state == self.game.S_REDO: + self.closeStackMove() return card def insertCard(self, card, positon, unhide=1, update=1): @@ -445,7 +446,8 @@ class Stack: view._position(c) if update: view.updateText() - self.closeStackMove() + if not self.game.moves.state == self.game.S_REDO: + self.closeStackMove() return card # Remove a card from the stack. Also update display. {model -> view} diff --git a/pysollib/tk/gameinfodialog.py b/pysollib/tk/gameinfodialog.py index 7f13117f..3e34891b 100644 --- a/pysollib/tk/gameinfodialog.py +++ b/pysollib/tk/gameinfodialog.py @@ -85,6 +85,10 @@ class GameInfoDialog(MfxDialog): 5: 'SL_SKILL', } skill_level = sl.get(gi.skill_level) + if game.Hint_Class is None: + hint = None + else: + hint = game.Hint_Class.__name__ row = 0 for n, t in (('Name:', gi.name), ('Short name:', gi.short_name), @@ -101,7 +105,7 @@ class GameInfoDialog(MfxDialog): ('Rules filename:', gi.rules_filename), ('Module:', game.__module__), ('Class:', game.__class__.__name__), - ('Hint:', game.Hint_Class.__name__), + ('Hint:', hint), ): if t: Label(frame, text=n, anchor=W).grid(row=row, column=0, sticky=N+W) diff --git a/pysollib/tk/tkwidget.py b/pysollib/tk/tkwidget.py index 5d7400dd..b6fd0086 100644 --- a/pysollib/tk/tkwidget.py +++ b/pysollib/tk/tkwidget.py @@ -41,7 +41,7 @@ __all__ = ['MfxMessageDialog', ] # imports -import os, sys, types, Tkinter +import os, sys, time, types, Tkinter import traceback # PySol imports @@ -333,6 +333,8 @@ class MfxSimpleEntry(MfxDialog): # ************************************************************************/ class MfxTooltip: + last_leave_time = 0 + def __init__(self, widget): # private vars self.widget = widget @@ -346,8 +348,9 @@ class MfxTooltip: self.bindings.append(self.widget.bind("", self._leave)) self.bindings.append(self.widget.bind("", self._leave)) # user overrideable settings - self.time = 600 # milliseconds - self.cancel_time = 5000 + self.timeout = 800 # milliseconds + self.cancel_timeout = 5000 + self.leave_timeout = 400 self.relief = Tkinter.SOLID self.justify = Tkinter.LEFT self.fg = "#000000" @@ -373,7 +376,10 @@ class MfxTooltip: after_cancel(self.timer) after_cancel(self.cancel_timer) self.cancel_timer = None - self.timer = after(self.widget, self.time, self._showTip) + if time.time() - MfxTooltip.last_leave_time < self.leave_timeout/1000.: + self._showTip() + else: + self.timer = after(self.widget, self.timeout, self._showTip) def _leave(self, *event): after_cancel(self.timer) @@ -386,14 +392,15 @@ class MfxTooltip: self.tooltip.destroy() destruct(self.tooltip) self.tooltip = None + MfxTooltip.last_leave_time = time.time() def _showTip(self): self.timer = None if self.tooltip or not self.text: return - if isinstance(self.widget, Tkinter.Button): - if self.widget["state"] == Tkinter.DISABLED: - return +## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)): +## if self.widget["state"] == Tkinter.DISABLED: +## return ##x = self.widget.winfo_rootx() x = self.widget.winfo_pointerx() y = self.widget.winfo_rooty() + self.widget.winfo_height() @@ -409,7 +416,7 @@ class MfxTooltip: self.label.pack(ipadx=1, ipady=1) self.tooltip.wm_geometry("%+d%+d" % (x, y)) self.tooltip.wm_deiconify() - self.cancel_timer = after(self.widget, self.cancel_time, self._leave) + self.cancel_timer = after(self.widget, self.cancel_timeout, self._leave) ##self.tooltip.tkraise() diff --git a/pysollib/tk/toolbar.py b/pysollib/tk/toolbar.py index 77d2fbb9..f03dd1ef 100644 --- a/pysollib/tk/toolbar.py +++ b/pysollib/tk/toolbar.py @@ -214,7 +214,7 @@ class PysolToolbar(PysolToolbarActions): sep = self._createSeparator() sep.bind("<1>", self.clickHandler) sep.bind("<3>", self.rightclickHandler) - elif l == 'Pause': + elif l == 'Pause' and Tkinter.TkVersion >= 8.4: self._createButton(l, f, check=True, tooltip=t) else: self._createButton(l, f, tooltip=t)