mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-05 00:02:29 -04:00
Option to select image scaling method, as discussed in issue #275.
This commit is contained in:
parent
02e68785ee
commit
3fd823b2f5
8 changed files with 85 additions and 17 deletions
|
@ -599,8 +599,10 @@ class Application:
|
||||||
return d
|
return d
|
||||||
return self._getImagesDir('toolbar', 'default', size, check=False)
|
return self._getImagesDir('toolbar', 'default', size, check=False)
|
||||||
|
|
||||||
def setTile(self, i, force=0):
|
def setTile(self, i, scaling=-1, force=0):
|
||||||
if self.scrolled_canvas.setTile(self, i, force):
|
if scaling == -1:
|
||||||
|
scaling = self.opt.tabletile_scale_method
|
||||||
|
if self.scrolled_canvas.setTile(self, i, scaling, force):
|
||||||
tile = self.tabletile_manager.get(i)
|
tile = self.tabletile_manager.get(i)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
self.opt.colors['table'] = tile.color
|
self.opt.colors['table'] = tile.color
|
||||||
|
|
|
@ -417,7 +417,7 @@ class MfxScrolledCanvas(object):
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
def setTile(self, app, i, force=False):
|
def setTile(self, app, i, scale_method, force=False):
|
||||||
logging.info('MfxRoot: setTitle app=%s' % app)
|
logging.info('MfxRoot: setTitle app=%s' % app)
|
||||||
|
|
||||||
tile = app.tabletile_manager.get(i)
|
tile = app.tabletile_manager.get(i)
|
||||||
|
|
|
@ -120,6 +120,7 @@ sound_sample_volume = integer(0, 128)
|
||||||
sound_sample_buffer_size = integer(1, 4)
|
sound_sample_buffer_size = integer(1, 4)
|
||||||
music = boolean
|
music = boolean
|
||||||
tabletile_name = string
|
tabletile_name = string
|
||||||
|
tabletile_scale_method = integer
|
||||||
center_layout = boolean
|
center_layout = boolean
|
||||||
recent_gameid = int_list
|
recent_gameid = int_list
|
||||||
favorite_gameid = int_list
|
favorite_gameid = int_list
|
||||||
|
@ -274,6 +275,7 @@ class Options:
|
||||||
('sound_sample_buffer_size', 'int'),
|
('sound_sample_buffer_size', 'int'),
|
||||||
('music', 'bool'),
|
('music', 'bool'),
|
||||||
('tabletile_name', 'str'),
|
('tabletile_name', 'str'),
|
||||||
|
('tabletile_scale_method', 'int'),
|
||||||
('center_layout', 'bool'),
|
('center_layout', 'bool'),
|
||||||
('translate_game_names', 'bool'),
|
('translate_game_names', 'bool'),
|
||||||
('solver_presets', 'list'),
|
('solver_presets', 'list'),
|
||||||
|
@ -461,6 +463,7 @@ class Options:
|
||||||
self.spread_stacks = False
|
self.spread_stacks = False
|
||||||
self.center_layout = True
|
self.center_layout = True
|
||||||
self.preserve_aspect_ratio = True
|
self.preserve_aspect_ratio = True
|
||||||
|
self.tabletile_scale_method = 0
|
||||||
self.resampling = 0
|
self.resampling = 0
|
||||||
if USE_PIL:
|
if USE_PIL:
|
||||||
self.resampling = int(Image.ANTIALIAS)
|
self.resampling = int(Image.ANTIALIAS)
|
||||||
|
|
|
@ -685,8 +685,11 @@ class PysolMenubarTk:
|
||||||
tile = self.app.tabletile_manager.get(0)
|
tile = self.app.tabletile_manager.get(0)
|
||||||
tile.color = d.key
|
tile.color = d.key
|
||||||
self.app.setTile(0)
|
self.app.setTile(0)
|
||||||
elif d.key > 0 and d.key != self.app.tabletile_index:
|
elif d.key > 0 and (d.key != self.app.tabletile_index or
|
||||||
self.app.setTile(d.key)
|
d.preview_scaling !=
|
||||||
|
self.app.opt.tabletile_scale_method):
|
||||||
|
self.app.setTile(d.key, scaling=d.preview_scaling)
|
||||||
|
self.app.opt.tabletile_scale_method = d.preview_scaling
|
||||||
|
|
||||||
def mSelectCardsetDialog(self, *event):
|
def mSelectCardsetDialog(self, *event):
|
||||||
if self._cancelDrag(break_pause=False):
|
if self._cancelDrag(break_pause=False):
|
||||||
|
|
|
@ -417,7 +417,7 @@ class MfxCanvas(gnomecanvas.Canvas):
|
||||||
item._item.set(fill_color=self._text_color)
|
item._item.set(fill_color=self._text_color)
|
||||||
|
|
||||||
# PySol extension - set a tiled background image
|
# PySol extension - set a tiled background image
|
||||||
def setTile(self, app, i, force=False):
|
def setTile(self, app, i, scale_method, force=False):
|
||||||
# print 'setTile:', i
|
# print 'setTile:', i
|
||||||
tile = app.tabletile_manager.get(i)
|
tile = app.tabletile_manager.get(i)
|
||||||
if tile is None or tile.error:
|
if tile is None or tile.error:
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from pysollib.mfxutil import KwStruct
|
from pysollib.mfxutil import KwStruct, USE_PIL
|
||||||
from pysollib.mygettext import _
|
from pysollib.mygettext import _
|
||||||
from pysollib.ui.tktile.selecttree import SelectDialogTreeData
|
from pysollib.ui.tktile.selecttree import SelectDialogTreeData
|
||||||
from pysollib.ui.tktile.tkutil import bind
|
from pysollib.ui.tktile.tkutil import bind
|
||||||
|
@ -152,7 +152,8 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
paned_window.add(right_frame)
|
paned_window.add(right_frame)
|
||||||
|
|
||||||
notebook = ttk.Notebook(left_frame)
|
notebook = ttk.Notebook(left_frame)
|
||||||
notebook.pack(expand=True, fill='both')
|
notebook.grid(row=0, column=0, sticky='nsew',
|
||||||
|
padx=padx, pady=pady, columnspan=2)
|
||||||
tree_frame = ttk.Frame(notebook)
|
tree_frame = ttk.Frame(notebook)
|
||||||
notebook.add(tree_frame, text=_('Tree View'))
|
notebook.add(tree_frame, text=_('Tree View'))
|
||||||
search_frame = ttk.Frame(notebook)
|
search_frame = ttk.Frame(notebook)
|
||||||
|
@ -199,6 +200,33 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.list.config(yscrollcommand=self.list_scrollbar.set)
|
self.list.config(yscrollcommand=self.list_scrollbar.set)
|
||||||
self.list_scrollbar.config(command=self.list.yview)
|
self.list_scrollbar.config(command=self.list.yview)
|
||||||
|
|
||||||
|
if USE_PIL:
|
||||||
|
self.scaleOptions = {"Default": 0,
|
||||||
|
"Tile": 1,
|
||||||
|
"Stretch": 2,
|
||||||
|
"Preserve Aspect Ratio": 3}
|
||||||
|
scaleValues = list(self.scaleOptions.keys())
|
||||||
|
|
||||||
|
self.scaling = tkinter.StringVar()
|
||||||
|
self.scaling.set(next(key for key, value in
|
||||||
|
self.scaleOptions.items()
|
||||||
|
if value == app.opt.tabletile_scale_method))
|
||||||
|
self.labelScale = tkinter.Label(left_frame, text="Image scaling:",
|
||||||
|
anchor="w")
|
||||||
|
|
||||||
|
self.textScale = PysolCombo(left_frame, values=scaleValues,
|
||||||
|
state='readonly',
|
||||||
|
textvariable=self.scaling,
|
||||||
|
selectcommand=self.updateScaling)
|
||||||
|
self.labelScale.grid(row=4, column=0, sticky='ew',
|
||||||
|
padx=padx, pady=pady)
|
||||||
|
self.textScale.grid(row=4, column=1, sticky='ew',
|
||||||
|
padx=padx, pady=pady)
|
||||||
|
|
||||||
|
left_frame.rowconfigure(0, weight=1)
|
||||||
|
left_frame.columnconfigure(0, weight=1)
|
||||||
|
left_frame.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
self.preview = MfxScrolledCanvas(right_frame, hbar=0, vbar=0)
|
self.preview = MfxScrolledCanvas(right_frame, hbar=0, vbar=0)
|
||||||
self.preview.pack(side="right", fill='both', expand=True,
|
self.preview.pack(side="right", fill='both', expand=True,
|
||||||
padx=padx, pady=pady)
|
padx=padx, pady=pady)
|
||||||
|
@ -206,7 +234,9 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.preview.canvas.preview = 1
|
self.preview.canvas.preview = 1
|
||||||
# create a preview of the current state
|
# create a preview of the current state
|
||||||
self.preview_key = -1
|
self.preview_key = -1
|
||||||
self.updatePreview(key)
|
self.preview_scaling = -1
|
||||||
|
self.current_key = -1
|
||||||
|
self.updatePreview(key, app.opt.tabletile_scale_method)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
focus = self.tree.frame
|
focus = self.tree.frame
|
||||||
|
@ -258,6 +288,10 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
def basicSearch(self, *args):
|
def basicSearch(self, *args):
|
||||||
self.updateSearchList(self.list_searchtext.get())
|
self.updateSearchList(self.list_searchtext.get())
|
||||||
|
|
||||||
|
def updateScaling(self, *args):
|
||||||
|
self.updatePreview(self.preview_key,
|
||||||
|
self.scaleOptions[self.scaling.get()])
|
||||||
|
|
||||||
def updateSearchList(self, searchString):
|
def updateSearchList(self, searchString):
|
||||||
self.criteria.name = searchString
|
self.criteria.name = searchString
|
||||||
self.performSearch()
|
self.performSearch()
|
||||||
|
@ -316,12 +350,18 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.updatePreview(cardset)
|
self.updatePreview(cardset)
|
||||||
self.list["cursor"] = oldcur
|
self.list["cursor"] = oldcur
|
||||||
|
|
||||||
def updatePreview(self, key):
|
def updatePreview(self, key, scaling=-1):
|
||||||
if key == self.preview_key:
|
if scaling < 0:
|
||||||
|
scaling = self.preview_scaling
|
||||||
|
if key == self.preview_key and scaling == self.preview_scaling:
|
||||||
return
|
return
|
||||||
canvas = self.preview.canvas
|
canvas = self.preview.canvas
|
||||||
canvas.deleteAllItems()
|
canvas.deleteAllItems()
|
||||||
|
|
||||||
|
self.preview_scaling = scaling
|
||||||
if isinstance(key, six.string_types):
|
if isinstance(key, six.string_types):
|
||||||
|
if USE_PIL:
|
||||||
|
self.textScale['state'] = 'disabled'
|
||||||
# solid color
|
# solid color
|
||||||
canvas.config(bg=key)
|
canvas.config(bg=key)
|
||||||
canvas.setTile(None)
|
canvas.setTile(None)
|
||||||
|
@ -332,7 +372,13 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
# image
|
# image
|
||||||
tile = self.manager.get(key)
|
tile = self.manager.get(key)
|
||||||
if tile:
|
if tile:
|
||||||
if self.preview.setTile(self.app, key):
|
if USE_PIL:
|
||||||
|
if tile.stretch:
|
||||||
|
self.textScale['state'] = 'normal'
|
||||||
|
else:
|
||||||
|
self.textScale['state'] = 'disabled'
|
||||||
|
if self.preview.setTile(self.app, key, scaling):
|
||||||
|
self.preview_key = key
|
||||||
return
|
return
|
||||||
self.preview_key = -1
|
self.preview_key = -1
|
||||||
|
|
||||||
|
|
|
@ -510,7 +510,7 @@ class MfxScrolledCanvas:
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
def setTile(self, app, i, force=False):
|
def setTile(self, app, i, scale_method, force=False):
|
||||||
tile = app.tabletile_manager.get(i)
|
tile = app.tabletile_manager.get(i)
|
||||||
if tile is None or tile.error:
|
if tile is None or tile.error:
|
||||||
return False
|
return False
|
||||||
|
@ -527,8 +527,19 @@ class MfxScrolledCanvas:
|
||||||
tile.color == app.opt.colors['table']):
|
tile.color == app.opt.colors['table']):
|
||||||
return False
|
return False
|
||||||
#
|
#
|
||||||
if not self.canvas.setTile(tile.filename, tile.stretch,
|
stretch = tile.stretch
|
||||||
tile.save_aspect):
|
save_aspect = tile.save_aspect
|
||||||
|
|
||||||
|
if scale_method < 0 and stretch:
|
||||||
|
scale_method = app.opt.tabletile_scale_method
|
||||||
|
elif not stretch:
|
||||||
|
scale_method = 0
|
||||||
|
|
||||||
|
if scale_method > 0:
|
||||||
|
stretch = scale_method > 1
|
||||||
|
save_aspect = scale_method > 2
|
||||||
|
|
||||||
|
if not self.canvas.setTile(tile.filename, stretch, save_aspect):
|
||||||
tile.error = True
|
tile.error = True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -1759,9 +1759,12 @@ Unsupported game for import.
|
||||||
tile.color = d.key
|
tile.color = d.key
|
||||||
if self.app.setTile(0):
|
if self.app.setTile(0):
|
||||||
self.tkopt.tabletile.set(0)
|
self.tkopt.tabletile.set(0)
|
||||||
elif d.key > 0 and d.key != self.app.tabletile_index:
|
elif d.key > 0 and (d.key != self.app.tabletile_index or
|
||||||
if self.app.setTile(d.key):
|
d.preview_scaling !=
|
||||||
|
self.app.opt.tabletile_scale_method):
|
||||||
|
if self.app.setTile(d.key, d.preview_scaling):
|
||||||
self.tkopt.tabletile.set(d.key)
|
self.tkopt.tabletile.set(d.key)
|
||||||
|
self.app.opt.tabletile_scale_method = d.preview_scaling
|
||||||
|
|
||||||
def mOptToolbar(self, *event):
|
def mOptToolbar(self, *event):
|
||||||
# if self._cancelDrag(break_pause=False): return
|
# if self._cancelDrag(break_pause=False): return
|
||||||
|
|
Loading…
Add table
Reference in a new issue