1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-05 00:02:29 -04:00

Added option to center the game layout on the screen.

This commit is contained in:
Joe R 2021-05-16 11:13:50 -04:00
parent 0b27e6fd72
commit 72ff4f6079
4 changed files with 75 additions and 34 deletions

View file

@ -298,12 +298,14 @@ class StackRegions(NewStruct):
# init info (at the start)
init_info = attr.ib(factory=list)
def calc_info(self, xf, yf):
def calc_info(self, xf, yf, widthpad=0, heightpad=0):
"""docstring for calc_info"""
info = []
for stacks, rect in self.init_info:
newrect = (int(round(rect[0]*xf)), int(round(rect[1]*yf)),
int(round(rect[2]*xf)), int(round(rect[3]*yf)))
newrect = (int(round((rect[0] + widthpad) * xf)),
int(round((rect[1] + heightpad) * yf)),
int(round((rect[2] + widthpad) * xf)),
int(round((rect[3] + heightpad) * yf)))
info.append((stacks, newrect))
self.info = tuple(info)
@ -815,6 +817,7 @@ class Game(object):
if dealer:
dealer()
else:
self.resizeGame()
self.startGame()
self.startMoves()
for stack in self.allstacks:
@ -983,23 +986,24 @@ class Game(object):
self.newGame(restart=1, random=self.random)
def resizeImages(self, manually=False):
if self.canvas.winfo_ismapped():
# apparent size of canvas
vw = self.canvas.winfo_width()
vh = self.canvas.winfo_height()
else:
# we have no a real size of canvas
# (winfo_width / winfo_reqwidth)
# so we use a saved size
vw, vh = self.app.opt.game_geometry
if not vw:
# first run of the game
return 1, 1, 1, 1, 0, 0
# requested size of canvas (createGame -> setSize)
iw, ih = self.init_size
# resizing images and cards
if (self.app.opt.auto_scale or
(self.app.opt.spread_stacks and not manually)):
if self.canvas.winfo_ismapped():
# apparent size of canvas
vw = self.canvas.winfo_width()
vh = self.canvas.winfo_height()
else:
# we have no a real size of canvas
# (winfo_width / winfo_reqwidth)
# so we use a saved size
vw, vh = self.app.opt.game_geometry
if not vw:
# first run of the game
return 1, 1, 1, 1
# requested size of canvas (createGame -> setSize)
iw, ih = self.init_size
# calculate factor of resizing
xf = float(vw)/iw
yf = float(vh)/ih
@ -1008,13 +1012,29 @@ class Game(object):
xf = yf = min(xf, yf)
else:
xf, yf = self.app.opt.scale_x, self.app.opt.scale_y
cw, ch = self.getCenterOffset(vw, vh, iw, ih, xf, yf)
if (not self.app.opt.spread_stacks or manually):
# 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, self.app.images._xfactor, self.app.images._yfactor
return xf, yf, self.app.images._xfactor, self.app.images._yfactor, \
cw, ch
def getCenterOffset(self, vw, vh, iw, ih, xf, yf):
if (not self.app.opt.center_layout or self.app.opt.spread_stacks or
(self.app.opt.auto_scale and not
self.app.opt.preserve_aspect_ratio)):
return 0, 0
if ((vw > iw and vh > ih) or self.app.opt.auto_scale):
return (vw / xf - iw) / 2, (vh / yf - ih) / 2
elif (vw >= iw and vh < ih):
return (vw / xf - iw) / 2, 0
elif (vw < iw and vh >= ih):
return 0, (vh / yf - ih) / 2
else:
return 0, 0
def resizeGame(self, card_size_manually=False):
# if self.busy:
@ -1022,10 +1042,11 @@ class Game(object):
if not USE_PIL:
return
self.deleteStackDesc()
xf, yf, xf0, yf0 = self.resizeImages(manually=card_size_manually)
xf, yf, xf0, yf0, cw, ch = \
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))
x, y = int(round(x0 * xf) + cw), int(round(y0 * yf) + ch)
if (self.app.opt.spread_stacks):
# Do not move Talons
@ -1039,27 +1060,28 @@ class Game(object):
if stack is self.s.talon:
# stack.init_coord=(x, y)
if card_size_manually:
stack.resize(xf, yf0)
stack.resize(xf, yf0, widthpad=cw, heightpad=ch)
else:
stack.resize(xf0, yf0)
stack.resize(xf0, yf0, widthpad=cw, heightpad=ch)
else:
stack.resize(xf, yf0)
stack.resize(xf, yf0, widthpad=cw, heightpad=ch)
else:
stack.resize(xf, yf)
stack.resize(xf, yf, widthpad=cw, heightpad=ch)
stack.updatePositions()
self.regions.calc_info(xf, yf)
self.regions.calc_info(xf, yf, widthpad=cw, heightpad=ch)
# texts
for t in ('info', 'help', 'misc', 'score', 'base_rank'):
init_coord = getattr(self.init_texts, t)
if init_coord:
item = getattr(self.texts, t)
x, y = int(round(init_coord[0]*xf)), \
int(round(init_coord[1]*yf))
x, y = int(round((init_coord[0] + cw) * xf)), \
int(round((init_coord[1] + ch) * yf))
self.canvas.coords(item, x, y)
for i in range(len(self.texts.list)):
init_coord = self.init_texts.list[i]
item = self.texts.list[i]
x, y = int(round(init_coord[0]*xf)), int(round(init_coord[1]*yf))
x, y = int(round((init_coord[0] + cw) * xf)), \
int(round((init_coord[1] + ch) * yf))
self.canvas.coords(item, x, y)
def createRandom(self, random):
@ -1312,7 +1334,9 @@ class Game(object):
return
if not self.canvas:
return
if not self.app.opt.auto_scale:
if (not self.app.opt.auto_scale and
not self.app.opt.spread_stacks and
not self.app.opt.center_layout):
return
if self.preview:
return

View file

@ -439,6 +439,7 @@ class Options:
self.scale_y = 1.0
self.auto_scale = False
self.spread_stacks = False
self.center_layout = True
self.preserve_aspect_ratio = True
# solver
self.solver_presets = [

View file

@ -851,11 +851,15 @@ class Stack:
return True
return False
def resize(self, xf, yf):
def resize(self, xf, yf, widthpad=0, heightpad=0):
# resize and move stack
# xf, yf - a multiplicative factor (from the original values)
# print 'Stack.resize:', self, self.is_visible, xf, yf
x0, y0 = self.init_coord
if (x0 > 0):
x0 += widthpad
if (y0 > 0):
y0 += heightpad
x, y = int(round(x0*xf)), int(round(y0*yf))
self.x, self.y = x, y
# offsets
@ -893,8 +897,8 @@ class Stack:
# move the items
def move(item):
ix, iy = item.init_coord
x = int(round(ix*xf))
y = int(round(iy*yf))
x = int(round((ix + widthpad) * xf))
y = int(round((iy + heightpad) * yf))
item.moveTo(x, y)
# images
if self.images.redeal:
@ -1967,9 +1971,9 @@ class TalonStack(Stack,
# def getBaseCard(self):
# return self._getBaseCard()
def resize(self, xf, yf):
def resize(self, xf, yf, widthpad=0, heightpad=0):
self._addRedealImage()
Stack.resize(self, xf, yf)
Stack.resize(self, xf, yf, widthpad=widthpad, heightpad=heightpad)
# A single click deals one card to each of the RowStacks.

View file

@ -172,6 +172,7 @@ class PysolMenubarTkCommon:
sound=tkinter.BooleanVar(),
auto_scale=tkinter.BooleanVar(),
spread_stacks=tkinter.BooleanVar(),
center_layout=tkinter.BooleanVar(),
cardback=tkinter.IntVar(),
tabletile=tkinter.IntVar(),
animations=tkinter.IntVar(),
@ -224,6 +225,7 @@ class PysolMenubarTkCommon:
tkopt.sound.set(opt.sound)
tkopt.auto_scale.set(opt.auto_scale)
tkopt.spread_stacks.set(opt.spread_stacks)
tkopt.center_layout.set(opt.center_layout)
tkopt.cardback.set(self.app.cardset.backindex)
tkopt.tabletile.set(self.app.tabletile_index)
tkopt.animations.set(opt.animations)
@ -530,9 +532,13 @@ class PysolMenubarTkCommon:
submenu.add_checkbutton(
label=n_("&Auto scaling"), variable=self.tkopt.auto_scale,
command=self.mOptAutoScale, accelerator=m+'0')
submenu = MfxMenu(menu, label=n_("Card la&yout"))
submenu.add_checkbutton(
label=n_("&Spread stacks"), variable=self.tkopt.spread_stacks,
command=self.mOptSpreadStacks)
submenu.add_checkbutton(
label=n_("&Center layout"), variable=self.tkopt.center_layout,
command=self.mOptCenterLayout)
# manager = self.app.cardset_manager
# n = manager.len()
menu.add_command(
@ -1509,6 +1515,12 @@ Unsupported game for import.
self.tkopt.spread_stacks.set(spread_stacks)
self._updateCardSize()
def mOptCenterLayout(self, *event):
if self._cancelDrag(break_pause=True):
return
self.app.opt.center_layout = not self.app.opt.center_layout
self._updateCardSize()
def _mOptCardback(self, index):
if self._cancelDrag(break_pause=False):
return