From 2520934d3553a03b0a0b91286b46cc57ba862e16 Mon Sep 17 00:00:00 2001 From: lufebe16 Date: Tue, 28 Nov 2023 11:45:27 +0100 Subject: [PATCH] Kivy - Added notifications for save and load commands - some fixes --- pysollib/game/__init__.py | 5 ++++- pysollib/kivy/LApp.py | 26 +++++++++++++++----------- pysollib/kivy/LImage.py | 4 ++-- pysollib/kivy/menubar.py | 33 +++++++++++++++++++++++---------- pysollib/kivy/tkcanvas.py | 13 ++++++++++++- 5 files changed, 56 insertions(+), 25 deletions(-) diff --git a/pysollib/game/__init__.py b/pysollib/game/__init__.py index 774e5b99..bf0e46b8 100644 --- a/pysollib/game/__init__.py +++ b/pysollib/game/__init__.py @@ -1455,7 +1455,7 @@ class Game(object): c0 = cards[0] dx, dy = (x - c0.x), (y - c0.y) base = float(self.app.opt.animations) - duration = base*base/40.0 + 0.05 + duration = base*base/20.0 + 0.05 for card in cards: card.animatedMove(dx, dy, duration) # self.top.waitAnimation(swallow=True, pickup=True) @@ -3267,6 +3267,7 @@ class Game(object): def saveGame(self, filename, protocol=-1): self.finishMove() # just in case self.setCursor(cursor=CURSOR_WATCH) + rval = False try: self._saveGame(filename, protocol) except Exception as ex: @@ -3274,8 +3275,10 @@ class Game(object): MfxExceptionDialog(self.top, ex, title=_("Save game error"), text=_("Error while saving game")) else: + rval = True self.filename = filename self.setCursor(cursor=self.app.top_cursor) + return rval # # low level load/save diff --git a/pysollib/kivy/LApp.py b/pysollib/kivy/LApp.py index 55449b06..2fdc6b43 100644 --- a/pysollib/kivy/LApp.py +++ b/pysollib/kivy/LApp.py @@ -152,10 +152,10 @@ class LAnimationMgr(object): self.animations.remove(anim) if not self.checkRunning(): - # print('LAnimationMgr: animEnd -> do callbacks') + # print('LAnimationMgr: animEnd ->', len(self.callbacks), 'callbacks') # noqa for cb in self.callbacks: cb() - print('LAnimationMgr: animEnd -> callbacks done') + # print('LAnimationMgr: animEnd -> callbacks done') self.callbacks = [] print('Clock.get_fps() ->', Clock.get_fps()) @@ -1557,15 +1557,18 @@ class LMainWindow(BoxLayout, LTkBase): # self.touches = [] # beispiel zu canvas (hintergrund) - # with self.canvas.before: - # Color(0, 1, 0.7, 0.5) - # self.rect = Rectangle(pos=self.pos, size=self.size) - # self.bind(pos=self.update_rect) - # self.bind(size=self.update_rect) - - # def update_rect(self, *args): - # self.rect.pos = self.pos - # self.rect.size = self.size + ''' + with self.canvas.before: + Color(0, 1, 0.7, 0.5) + self.rect = Rectangle(pos=self.pos, size=self.size) + self.bind(pos=self.update_rect) + self.bind(size=self.update_rect) + ''' + ''' + def update_rect(self, *args): + self.rect.pos = self.pos + self.rect.size = self.size + ''' def on_motion(self, m): print('on_motion', m) @@ -1773,6 +1776,7 @@ class LApp(App): self.baseWindow.add_widget(self.mainWindow) logging.info('top = %s' % str(self.mainWindow)) Cache.register('LAppCache', limit=10) + Cache.append('LAppCache', 'baseWindow', self.baseWindow, timeout=0) Cache.append('LAppCache', 'mainWindow', self.mainWindow, timeout=0) Cache.append('LAppCache', 'mainApp', self, timeout=0) self.startCode = 0 diff --git a/pysollib/kivy/LImage.py b/pysollib/kivy/LImage.py index 5bc7e02f..24840969 100644 --- a/pysollib/kivy/LImage.py +++ b/pysollib/kivy/LImage.py @@ -200,12 +200,12 @@ class LImage(Widget, LBase): self.make_format(self.size, p) def on_fit_mode(self, a, m): - print('on_fit_mode', m) + # print('on_fit_mode', m) self.fit_num_update(self.fit_mode) self.make_format(self.size, self.pos) def on_texture(self, a, texture): - print('on_texture', texture) + # print('on_texture', texture) self.tex_coord_update(self.texture) self.make_format(self.size, self.pos) diff --git a/pysollib/kivy/menubar.py b/pysollib/kivy/menubar.py index 990dde5f..d7e293e9 100644 --- a/pysollib/kivy/menubar.py +++ b/pysollib/kivy/menubar.py @@ -26,6 +26,8 @@ import math import os import re +from kivy.cache import Cache +from kivy.clock import Clock from kivy.event import EventDispatcher from kivy.properties import BooleanProperty from kivy.properties import NumericProperty @@ -48,6 +50,7 @@ from pysollib.kivy.tkconst import CURSOR_WATCH, EVENT_HANDLED, EVENT_PROPAGATE from pysollib.kivy.tkconst import TOOLBAR_BUTTONS from pysollib.kivy.tkutil import after_idle from pysollib.kivy.tkutil import bind +from pysollib.kivy.toast import Toast from pysollib.mfxutil import Struct from pysollib.mygettext import _ from pysollib.pysoltk import MfxMessageDialog @@ -229,6 +232,12 @@ class FileMenuDialog(LMenuDialog): command(key) return game_command + def make_command(self, command): + def _command(): + self.closeWindow(0) + command() + return _command + def buildTree(self, tv, node): rg = tv.add_node( LTreeNode(text=_('Recent games'))) @@ -263,9 +272,9 @@ class FileMenuDialog(LMenuDialog): LTreeNode(text=gi.name, command=command), rg) tv.add_node(LTreeNode( - text=_('Load'), command=self.menubar.mOpen)) + text=_('Load'), command=self.make_command(self.menubar.mOpen))) tv.add_node(LTreeNode( - text=_('Save'), command=self.menubar.mSaveAs)) + text=_('Save'), command=self.make_command(self.menubar.mSaveAs))) tv.add_node(LTreeNode( text=_('Quit'), command=self.menubar.mHoldAndQuit)) @@ -1372,6 +1381,7 @@ class PysolMenubarTk: self.__keybindings = {} self._createMenubar() self.top = top + self.app = app if self.progress: self.progress.update(step=1) @@ -2047,9 +2057,12 @@ class PysolMenubarTk: print('filename = %s' % filename) if filename: filename = os.path.normpath(filename) - # filename = os.path.normcase(filename) if os.path.isfile(filename): - self.game.loadGame(filename) + baseWindow = Cache.get('LAppCache', 'baseWindow') + text = _("loading game from:")+filename + toast = Toast(text=text) + toast.show(parent=baseWindow, duration=4.0) + Clock.schedule_once(lambda dt: self.game.loadGame(filename), 1.0) # noqa def mSaveAs(self, *event): if self._cancelDrag(break_pause=False): @@ -2070,16 +2083,16 @@ class PysolMenubarTk: idir, ifile = os.path.split(os.path.normpath(filename)) if not idir: idir = self.app.dn.savegames - # print self.game.filename, ifile - # d = tkFileDialog.SaveAs() - # filename = d.show(filetypes=self.FILETYPES, - # defaultextension=self.DEFAULTEXTENSION, - # initialdir=idir, initialfile=ifile) + filename = idir + "/" + ifile if filename: filename = os.path.normpath(filename) # filename = os.path.normcase(filename) - self.game.saveGame(filename) + if self.game.saveGame(filename): + baseWindow = Cache.get('LAppCache', 'baseWindow') + text = _("game saved to:")+filename + toast = Toast(text=text) + toast.show(parent=baseWindow, duration=5.0) self.updateMenus() def mPause(self, *args): diff --git a/pysollib/kivy/tkcanvas.py b/pysollib/kivy/tkcanvas.py index add0ef98..9a0f0fb2 100644 --- a/pysollib/kivy/tkcanvas.py +++ b/pysollib/kivy/tkcanvas.py @@ -163,13 +163,17 @@ class MfxCanvasGroup(): return imgs = self._imglist(self) - # print('number of imaages:', len(imgs)) + if len(imgs) == 0: + return if position is not None: # In self.canvas suchen: das oberste image, welches zu position # gehört und liste der images oberhalb einfüllen u.a.a.O weglassen. pimgs = self._imglist(position) + if len(pimgs) == 0: + return + ws = [] for c in reversed(self.canvas.children): if c not in imgs: @@ -207,8 +211,14 @@ class MfxCanvasGroup(): return imgs = self._imglist(self) + if len(imgs) == 0: + return + if position is not None: pimgs = self._imglist(position) + if len(pimgs) == 0: + return + ws = [] for c in reversed(self.canvas.children): if c == pimgs[0]: @@ -663,6 +673,7 @@ class MfxCanvas(LImage): self.update_widget(posorobj, size) def update_widget(self, posorobj, size): + logging.info('MfxCanvas: update_widget') # print('MfxCanvas: update_widget size=(%s, %s)' % # (self.size[0], self.size[1]))