From 5876134d11ae9e577279d35d4d9e50fd89229b45 Mon Sep 17 00:00:00 2001 From: Guillaumegaillard Date: Wed, 18 Nov 2020 16:18:37 +0100 Subject: [PATCH] Make auto_scale spread non-talon stacks on canvas make card size, scale and canvas changes independent check scale x after change cardset --- pysollib/game/__init__.py | 32 ++++++++++++++++++++++++-------- pysollib/tile/selectcardset.py | 20 +++++++++++--------- pysollib/ui/tktile/menubar.py | 12 +++++++----- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/pysollib/game/__init__.py b/pysollib/game/__init__.py index 377fcc1f..13e3088d 100644 --- a/pysollib/game/__init__.py +++ b/pysollib/game/__init__.py @@ -982,9 +982,9 @@ class Game(object): self.endGame(restart=1) self.newGame(restart=1, random=self.random) - def resizeImages(self): + def resizeImages(self, manually=False): # resizing images and cards - if self.app.opt.auto_scale: + if self.app.opt.auto_scale and not manually: if self.canvas.winfo_ismapped(): # apparent size of canvas vw = self.canvas.winfo_width() @@ -1006,24 +1006,40 @@ class Game(object): xf = yf = min(xf, yf) else: xf, yf = self.app.opt.scale_x, self.app.opt.scale_y - # images - self.app.images.resize(xf, yf) + # images + self.app.images.resize(xf, yf) # cards for card in self.cards: card.update(card.id, card.deck, card.suit, card.rank, self) - return xf, yf + return xf, yf, self.app.images._xfactor, self.app.images._yfactor - def resizeGame(self): + def resizeGame(self, card_size_manually=False): # if self.busy: # return if not USE_PIL: return self.deleteStackDesc() - xf, yf = self.resizeImages() + xf, yf, xf0, yf0 = self.resizeImages(manually=card_size_manually) for stack in self.allstacks: x0, y0 = stack.init_coord x, y = int(round(x0*xf)), int(round(y0*yf)) - stack.resize(xf, yf) + + # Do not move Talons + # (because one would need to reposition + # 'empty cross' and 'redeal' figures) + # But in that case, + # games with talon not placed top-left corner + # will get it misplaced when auto_scale + # e.g. Suit Elevens + # => player can fix that issue by setting auto_scale false + if stack is self.s.talon: + # stack.init_coord=(x, y) + if card_size_manually: + stack.resize(xf, yf0) + else: + stack.resize(xf0, yf0) + else: + stack.resize(xf, yf0) stack.updatePositions() self.regions.calc_info(xf, yf) # texts diff --git a/pysollib/tile/selectcardset.py b/pysollib/tile/selectcardset.py index 714a8a1b..6bda792e 100644 --- a/pysollib/tile/selectcardset.py +++ b/pysollib/tile/selectcardset.py @@ -358,22 +358,24 @@ class SelectCardsetDialogWithPreview(MfxDialog): if USE_PIL: auto_scale = bool(self.auto_scale.get()) - if button == 1: - self.app.menubar.tkopt.auto_scale.set(auto_scale) - + if button == 1: # Cancel # no changes self.cardset_values = None + elif button == 0: # OK + self.app.menubar.tkopt.auto_scale.set(auto_scale) + + self.app.opt.scale_x = self.scale_x.get() + self.app.opt.scale_y = self.scale_y.get() + self.app.opt.preserve_aspect_ratio = \ + self.preserve_aspect.get() - if auto_scale: self.scale_values = (self.app.opt.scale_x, self.app.opt.scale_y, auto_scale, - bool(self.preserve_aspect.get())) - else: - self.scale_values = (self.scale_x.get(), - self.scale_y.get(), - auto_scale, self.app.opt.preserve_aspect_ratio) + self.app.game.resizeGame(card_size_manually=True) + self.app.game.resizeGame(card_size_manually=False) + if button == 10: # Info cs = self.manager.get(self.tree.selection_key) if not cs: diff --git a/pysollib/ui/tktile/menubar.py b/pysollib/ui/tktile/menubar.py index 7f5a279f..5e2ca664 100644 --- a/pysollib/ui/tktile/menubar.py +++ b/pysollib/ui/tktile/menubar.py @@ -1439,10 +1439,12 @@ Unsupported game for import. geom = (self.app.canvas.winfo_width(), self.app.canvas.winfo_height()) self.app.opt.game_geometry = geom - self.app.game.resizeGame() + self.app.game.resizeGame(card_size_manually=True) if self.app.opt.auto_scale: w, h = self.app.opt.game_geometry self.app.canvas.setInitialSize(w, h, scrollregion=False) + # Resize a second time to auto scale + self.app.game.resizeGame(card_size_manually=False) else: w = int(round(self.app.game.width * self.app.opt.scale_x)) h = int(round(self.app.game.height * self.app.opt.scale_y)) @@ -1461,8 +1463,8 @@ Unsupported game for import. self.app.opt.scale_y += 0.1 else: return - self.app.opt.auto_scale = False - self.tkopt.auto_scale.set(False) + # self.app.opt.auto_scale = False + # self.tkopt.auto_scale.set(False) self._updateCardSize() def mDecreaseCardset(self, *event): @@ -1476,8 +1478,8 @@ Unsupported game for import. self.app.opt.scale_y -= 0.1 else: return - self.app.opt.auto_scale = False - self.tkopt.auto_scale.set(False) + # self.app.opt.auto_scale = False + # self.tkopt.auto_scale.set(False) self._updateCardSize() def mOptAutoScale(self, *event):