mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-05 00:02:29 -04:00
* fixed scrolling in MfxScrolledCanvas
* added clickable url to About dialog * many other improvements and bugfixes git-svn-id: file:///home/shlomif/Backup/svn-dumps/PySolFC/svnsync-repos/pysolfc/PySolFC/trunk@173 efabe8c0-fbe8-4139-b769-b5e6d273206e
This commit is contained in:
parent
67bd2b8cd8
commit
9eaeadce61
72 changed files with 1780 additions and 1899 deletions
data/themes/blue/blue
po
pysollib
actions.pyapp.pycustomgame.py
setup.pygames
beleagueredcastle.pybristol.pycanfield.pyfreecell.pyglenwood.pyheadsandtails.pylabyrinth.py
help.pymahjongg
napoleon.pynumerica.pypushpin.pythreepeaks.pyultra
pysolgtk
stats.pytile
edittextdialog.pyfindcarddialog.pymenubar.pyplayeroptionsdialog.pyprogressbar.pyselectcardset.pyselectgame.pyselecttile.pysolverdialog.pysoundoptionsdialog.pystatusbar.pytkcanvas.pytkhtml.pytkstats.pytktree.pytkwidget.pytkwrap.pytoolbar.pywizarddialog.py
tk
edittextdialog.pyfindcarddialog.pymenubar.pyplayeroptionsdialog.pyprogressbar.pyselectcardset.pyselectgame.pyselecttile.pysolverdialog.pysoundoptionsdialog.pystatusbar.pytabpage.pytkcanvas.pytkhtml.pytkstats.pytktree.pytkwidget.pytkwrap.pytoolbar.py
winsystems
wizardutil.py
Binary file not shown.
Before ![]() (image error) Size: 770 B After ![]() (image error) Size: 770 B ![]() ![]() |
|
@ -5,7 +5,7 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PySol 0.0.1\n"
|
"Project-Id-Version: PySol 0.0.1\n"
|
||||||
"POT-Creation-Date: Sat May 19 16:39:10 2007\n"
|
"POT-Creation-Date: Tue Jun 5 04:28:06 2007\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|
1182
po/pysol.pot
1182
po/pysol.pot
File diff suppressed because it is too large
Load diff
|
@ -5,7 +5,7 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PySol 0.0.1\n"
|
"Project-Id-Version: PySol 0.0.1\n"
|
||||||
"POT-Creation-Date: Sat May 19 16:39:10 2007\n"
|
"POT-Creation-Date: Tue Jun 5 04:28:06 2007\n"
|
||||||
"PO-Revision-Date: 2007-05-11 17:25+0400\n"
|
"PO-Revision-Date: 2007-05-11 17:25+0400\n"
|
||||||
"Last-Translator: Скоморох <skomoroh@gmail.com>\n"
|
"Last-Translator: Скоморох <skomoroh@gmail.com>\n"
|
||||||
"Language-Team: Russian <ru@li.org>\n"
|
"Language-Team: Russian <ru@li.org>\n"
|
||||||
|
|
1269
po/ru_pysol.po
1269
po/ru_pysol.po
File diff suppressed because it is too large
Load diff
|
@ -212,13 +212,13 @@ class PysolMenubarActions:
|
||||||
self.setMenuState(ms.undo, "edit.undo")
|
self.setMenuState(ms.undo, "edit.undo")
|
||||||
self.setMenuState(ms.redo, "edit.redo")
|
self.setMenuState(ms.redo, "edit.redo")
|
||||||
self.setMenuState(ms.redo, "edit.redoall")
|
self.setMenuState(ms.redo, "edit.redoall")
|
||||||
self.setMenuState(ms.shuffle, "edit.shuffletiles")
|
|
||||||
self.updateBookmarkMenuState()
|
self.updateBookmarkMenuState()
|
||||||
self.setMenuState(ms.restart, "edit.restart")
|
self.setMenuState(ms.restart, "edit.restart")
|
||||||
self.setMenuState(ms.custom_game, "edit.editcurrentgame")
|
self.setMenuState(ms.custom_game, "edit.editcurrentgame")
|
||||||
# Game menu
|
# Game menu
|
||||||
self.setMenuState(ms.deal, "game.dealcards")
|
self.setMenuState(ms.deal, "game.dealcards")
|
||||||
self.setMenuState(ms.autodrop, "game.autodrop")
|
self.setMenuState(ms.autodrop, "game.autodrop")
|
||||||
|
self.setMenuState(ms.shuffle, "game.shuffletiles")
|
||||||
self.setMenuState(ms.pause, "game.pause")
|
self.setMenuState(ms.pause, "game.pause")
|
||||||
# Assist menu
|
# Assist menu
|
||||||
self.setMenuState(ms.hint, "assist.hint")
|
self.setMenuState(ms.hint, "assist.hint")
|
||||||
|
|
|
@ -929,7 +929,7 @@ class Application:
|
||||||
self.helpbar = HelpStatusbar(self.top)
|
self.helpbar = HelpStatusbar(self.top)
|
||||||
self.helpbar.show(self.opt.helpbar)
|
self.helpbar.show(self.opt.helpbar)
|
||||||
# create the canvas
|
# create the canvas
|
||||||
self.scrolled_canvas = MfxScrolledCanvas(self.top)
|
self.scrolled_canvas = MfxScrolledCanvas(self.top, propagate=True)
|
||||||
self.canvas = self.scrolled_canvas.canvas
|
self.canvas = self.scrolled_canvas.canvas
|
||||||
padx, pady = TkSettings.canvas_padding
|
padx, pady = TkSettings.canvas_padding
|
||||||
self.scrolled_canvas.grid(row=1, column=1, sticky='nsew',
|
self.scrolled_canvas.grid(row=1, column=1, sticky='nsew',
|
||||||
|
@ -1045,7 +1045,9 @@ class Application:
|
||||||
self.menubar.updateRecentGamesMenu(self.opt.recent_gameid)
|
self.menubar.updateRecentGamesMenu(self.opt.recent_gameid)
|
||||||
self.menubar.updateFavoriteGamesMenu()
|
self.menubar.updateFavoriteGamesMenu()
|
||||||
# hide/show "Shuffle" button
|
# hide/show "Shuffle" button
|
||||||
##self.toolbar.config('shuffle', self.game.canShuffle() and self.opt.toolbar_vars['shuffle'])
|
self.toolbar.config(
|
||||||
|
'shuffle',
|
||||||
|
self.opt.toolbar_vars['shuffle'] and self.game.canShuffle())
|
||||||
# delete intro progress bar
|
# delete intro progress bar
|
||||||
if self.intro.progress:
|
if self.intro.progress:
|
||||||
self.intro.progress.destroy()
|
self.intro.progress.destroy()
|
||||||
|
|
|
@ -25,7 +25,6 @@ from stack import *
|
||||||
from game import Game
|
from game import Game
|
||||||
from layout import Layout
|
from layout import Layout
|
||||||
from hint import AbstractHint, DefaultHint, CautiousDefaultHint, Yukon_Hint
|
from hint import AbstractHint, DefaultHint, CautiousDefaultHint, Yukon_Hint
|
||||||
#from pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
from wizardutil import WizardWidgets
|
from wizardutil import WizardWidgets
|
||||||
|
|
||||||
|
@ -238,7 +237,7 @@ class CustomGame(Game):
|
||||||
|
|
||||||
def startGame(self):
|
def startGame(self):
|
||||||
|
|
||||||
min_cards = max(len(self.s.rows), 8)
|
s = get_settings(self.SETTINGS)
|
||||||
anim_frames = -1
|
anim_frames = -1
|
||||||
|
|
||||||
def deal(rows, flip, frames, max_cards):
|
def deal(rows, flip, frames, max_cards):
|
||||||
|
@ -253,14 +252,17 @@ class CustomGame(Game):
|
||||||
frames=frames)
|
frames=frames)
|
||||||
return frames, max_cards
|
return frames, max_cards
|
||||||
|
|
||||||
|
|
||||||
frames = 0
|
frames = 0
|
||||||
s = get_settings(self.SETTINGS)
|
|
||||||
if isinstance(self.s.talon, InitialDealTalonStack):
|
if isinstance(self.s.talon, InitialDealTalonStack):
|
||||||
max_cards = 52 * s['decks']
|
max_cards = 52 * s['decks']
|
||||||
else:
|
else:
|
||||||
max_cards = s['deal_max_cards']
|
max_cards = s['deal_max_cards']
|
||||||
|
|
||||||
|
min_cards = max(len(self.s.rows), 8)
|
||||||
|
max_rows = s['deal_face_down'] + s['deal_face_up'] + s['deal_to_reserves']
|
||||||
|
if max_rows <= 1:
|
||||||
|
min_cards = max_cards
|
||||||
|
|
||||||
# deal to foundations
|
# deal to foundations
|
||||||
if s['deal_found']:
|
if s['deal_found']:
|
||||||
frames, max_cards = deal(self.s.foundations,
|
frames, max_cards = deal(self.s.foundations,
|
||||||
|
|
|
@ -101,7 +101,8 @@ class StreetsAndAlleys(Game):
|
||||||
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
||||||
tx, ty = x+tx, y-l.YS+ty
|
tx, ty = x+tx, y-l.YS+ty
|
||||||
font = self.app.getFont("canvas_default")
|
font = self.app.getFont("canvas_default")
|
||||||
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font)
|
self.texts.info = MfxCanvasText(self.canvas, tx, ty,
|
||||||
|
anchor=ta, font=font)
|
||||||
for x in (x0, x2):
|
for x in (x0, x2):
|
||||||
y = l.YM+l.YS*int(reserves!=0)
|
y = l.YM+l.YS*int(reserves!=0)
|
||||||
for i in range(4):
|
for i in range(4):
|
||||||
|
|
|
@ -213,7 +213,8 @@ class Dover(Bristol):
|
||||||
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
||||||
tx, ty = x+tx+l.XM, y+ty
|
tx, ty = x+tx+l.XM, y+ty
|
||||||
font = self.app.getFont("canvas_default")
|
font = self.app.getFont("canvas_default")
|
||||||
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font)
|
self.texts.info = MfxCanvasText(self.canvas, tx, ty,
|
||||||
|
anchor=ta, font=font)
|
||||||
|
|
||||||
x, y = 2*l.XM+(max_rows-rows)*l.XS, l.YM+l.YS
|
x, y = 2*l.XM+(max_rows-rows)*l.XS, l.YM+l.YS
|
||||||
if text:
|
if text:
|
||||||
|
|
|
@ -145,7 +145,8 @@ class Canfield(Game):
|
||||||
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
||||||
tx, ty = x + tx, y + ty
|
tx, ty = x + tx, y + ty
|
||||||
font = self.app.getFont("canvas_default")
|
font = self.app.getFont("canvas_default")
|
||||||
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font)
|
self.texts.info = MfxCanvasText(self.canvas, tx, ty,
|
||||||
|
anchor=ta, font=font)
|
||||||
x, y = l.XM, l.YM + l.YS + l.TEXT_HEIGHT
|
x, y = l.XM, l.YM + l.YS + l.TEXT_HEIGHT
|
||||||
s.reserves.append(self.ReserveStack_Class(x, y, self))
|
s.reserves.append(self.ReserveStack_Class(x, y, self))
|
||||||
s.reserves[0].CARD_YOFFSET = yoffset
|
s.reserves[0].CARD_YOFFSET = yoffset
|
||||||
|
|
|
@ -526,14 +526,9 @@ class OceanTowers(TripleFreecell):
|
||||||
# // KingCell
|
# // KingCell
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class KingCell_RowStack(RK_RowStack):
|
|
||||||
def canMoveCards(self, cards):
|
|
||||||
max_move = getNumberOfFreeStacks(self.game.s.reserves) + 1
|
|
||||||
return len(cards) <= max_move and RK_RowStack.canMoveCards(self, cards)
|
|
||||||
|
|
||||||
class KingCell(FreeCell):
|
class KingCell(FreeCell):
|
||||||
Solver_Class = FreeCellSolverWrapper(esf='kings')
|
Solver_Class = FreeCellSolverWrapper(sbb='rank', esf='kings')
|
||||||
RowStack_Class = StackWrapper(KingCell_RowStack, base_rank=KING)
|
RowStack_Class = StackWrapper(SuperMoveRK_RowStack, base_rank=KING)
|
||||||
|
|
||||||
shallHighlightMatch = Game._shallHighlightMatch_RK
|
shallHighlightMatch = Game._shallHighlightMatch_RK
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,8 @@ class Glenwood(Game):
|
||||||
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
tx, ty, ta, tf = l.getTextAttr(None, "ss")
|
||||||
tx, ty = x - l.XS + tx, y + ty
|
tx, ty = x - l.XS + tx, y + ty
|
||||||
font = self.app.getFont("canvas_default")
|
font = self.app.getFont("canvas_default")
|
||||||
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font)
|
self.texts.info = MfxCanvasText(self.canvas, tx, ty,
|
||||||
|
anchor=ta, font=font)
|
||||||
|
|
||||||
for i in range(4):
|
for i in range(4):
|
||||||
x = 2*l.XM + (i+2)*l.XS
|
x = 2*l.XM + (i+2)*l.XS
|
||||||
|
|
|
@ -32,7 +32,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
|
|
@ -32,7 +32,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
|
|
@ -39,10 +39,10 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
|
from pysollib.settings import TOOLKIT, DEBUG
|
||||||
from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage
|
from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage
|
||||||
from pysollib.pysoltk import bind, EVENT_HANDLED, ANCHOR_NW
|
from pysollib.pysoltk import bind, EVENT_HANDLED, ANCHOR_NW
|
||||||
from pysollib.pysoltk import MfxMessageDialog
|
from pysollib.pysoltk import MfxMessageDialog
|
||||||
from pysollib.settings import TOOLKIT, DEBUG
|
|
||||||
|
|
||||||
|
|
||||||
def factorial(x):
|
def factorial(x):
|
||||||
|
|
|
@ -236,7 +236,8 @@ class DerFreieNapoleon(DerKleineNapoleon):
|
||||||
if texts:
|
if texts:
|
||||||
tx, ty, ta, tf = l.getTextAttr(s.foundations[-1], "se")
|
tx, ty, ta, tf = l.getTextAttr(s.foundations[-1], "se")
|
||||||
font = self.app.getFont("canvas_default")
|
font = self.app.getFont("canvas_default")
|
||||||
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font)
|
self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta,
|
||||||
|
font=font)
|
||||||
# talon
|
# talon
|
||||||
x, y = l.XM, self.height - l.YS
|
x, y = l.XM, self.height - l.YS
|
||||||
s.talon = InitialDealTalonStack(x, y, self)
|
s.talon = InitialDealTalonStack(x, y, self)
|
||||||
|
|
|
@ -42,7 +42,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
from pysollib.mfxutil import kwdefault
|
from pysollib.mfxutil import kwdefault
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
|
|
|
@ -37,7 +37,7 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage, bind, ANCHOR_NW
|
from pysollib.pysoltk import MfxCanvasText
|
||||||
|
|
||||||
from golf import Golf_Waste, Golf_Hint
|
from golf import Golf_Waste, Golf_Hint
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
|
|
@ -35,7 +35,6 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
from pysollib.games.larasgame import LarasGame_Talon, LarasGame, LarasGame_Reserve
|
from pysollib.games.larasgame import LarasGame_Talon, LarasGame, LarasGame_Reserve
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint
|
||||||
from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage, bind, ANCHOR_NW
|
from pysollib.pysoltk import bind
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
|
|
@ -36,7 +36,6 @@ from pysollib.mfxutil import kwdefault
|
||||||
from pysollib.stack import *
|
from pysollib.stack import *
|
||||||
from pysollib.game import Game
|
from pysollib.game import Game
|
||||||
from pysollib.layout import Layout
|
from pysollib.layout import Layout
|
||||||
#from pysollib.pysoltk import MfxCanvasText
|
|
||||||
|
|
||||||
from pysollib.games.special.tarock import AbstractTarockGame, Grasshopper
|
from pysollib.games.special.tarock import AbstractTarockGame, Grasshopper
|
||||||
from pysollib.games.threepeaks import ThreePeaksNoScore
|
from pysollib.games.threepeaks import ThreePeaksNoScore
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
from settings import PACKAGE, PACKAGE_URL, TOOLKIT, FC_VERSION
|
from settings import PACKAGE, PACKAGE_URL, TOOLKIT, FC_VERSION
|
||||||
from pysoltk import make_help_toplevel
|
from pysoltk import make_help_toplevel
|
||||||
from pysoltk import MfxMessageDialog
|
from pysoltk import MfxMessageDialog
|
||||||
|
from pysoltk import PysolAboutDialog
|
||||||
from pysoltk import HTMLViewer
|
from pysoltk import HTMLViewer
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,12 +48,6 @@ from pysoltk import HTMLViewer
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class AboutDialog(MfxMessageDialog):
|
|
||||||
def createFrames(self, kw):
|
|
||||||
top_frame, bottom_frame = MfxMessageDialog.createFrames(self, kw)
|
|
||||||
return top_frame, bottom_frame
|
|
||||||
|
|
||||||
|
|
||||||
def help_about(app, timeout=0, sound=1):
|
def help_about(app, timeout=0, sound=1):
|
||||||
if sound:
|
if sound:
|
||||||
app.audio.playSample("about")
|
app.audio.playSample("about")
|
||||||
|
@ -62,22 +57,23 @@ def help_about(app, timeout=0, sound=1):
|
||||||
strings=(_("&Nice"), _("&Credits..."))
|
strings=(_("&Nice"), _("&Credits..."))
|
||||||
if timeout:
|
if timeout:
|
||||||
strings=(_("&Enjoy"),)
|
strings=(_("&Enjoy"),)
|
||||||
##version = _("Version %s (%s)\n\n") % (FC_VERSION, VERSION)
|
version = _("Version %s") % FC_VERSION
|
||||||
version = _("Version %s\n\n") % FC_VERSION
|
d = PysolAboutDialog(app, app.top, title=_("About ") + PACKAGE,
|
||||||
d = AboutDialog(app.top, title=_("About ") + PACKAGE, timeout=timeout,
|
timeout=timeout,
|
||||||
text=_('''PySol Fan Club edition
|
text=_('''PySol Fan Club edition
|
||||||
%s%s
|
%s%s
|
||||||
|
|
||||||
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||||
Markus F.X.J. Oberhumer
|
Markus F.X.J. Oberhumer
|
||||||
Copyright (C) 2003 Mt. Hood Playing Card Co.
|
Copyright (C) 2003 Mt. Hood Playing Card Co.
|
||||||
Copyright (C) 2005 Skomoroh (Fan Club edition)
|
Copyright (C) 2005 Skomoroh
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
PySol is free software distributed under the terms
|
PySol is free software distributed under the terms
|
||||||
of the GNU General Public License.
|
of the GNU General Public License.
|
||||||
|
|
||||||
For more information about this application visit
|
For more information about this application visit''') % (t, version),
|
||||||
%s''') % (t, version, PACKAGE_URL),
|
url=PACKAGE_URL,
|
||||||
image=app.gimages.logos[2],
|
image=app.gimages.logos[2],
|
||||||
strings=strings, default=0,
|
strings=strings, default=0,
|
||||||
separatorwidth=2)
|
separatorwidth=2)
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
## vim:ts=4:et:nowrap
|
|
||||||
##
|
|
||||||
##---------------------------------------------------------------------------##
|
|
||||||
##
|
|
||||||
## PySol -- a Python Solitaire game
|
|
||||||
##
|
|
||||||
## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
##
|
|
||||||
## This program is free software; you can redistribute it and/or modify
|
|
||||||
## it under the terms of the GNU General Public License as published by
|
|
||||||
## the Free Software Foundation; either version 2 of the License, or
|
|
||||||
## (at your option) any later version.
|
|
||||||
##
|
|
||||||
## This program is distributed in the hope that it will be useful,
|
|
||||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
## GNU General Public License for more details.
|
|
||||||
##
|
|
||||||
## You should have received a copy of the GNU General Public License
|
|
||||||
## along with this program; see the file COPYING.
|
|
||||||
## If not, write to the Free Software Foundation, Inc.,
|
|
||||||
## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
##
|
|
||||||
## Markus F.X.J. Oberhumer
|
|
||||||
## <markus.oberhumer@jk.uni-linz.ac.at>
|
|
||||||
## http://wildsau.idv.uni-linz.ac.at/mfx/pysol.html
|
|
||||||
##
|
|
||||||
##---------------------------------------------------------------------------##
|
|
||||||
|
|
||||||
|
|
||||||
# imports
|
|
||||||
import os, sys
|
|
||||||
from gtk import *
|
|
||||||
|
|
||||||
# PySol imports
|
|
||||||
from mfxutil import destruct, kwdefault, KwStruct, Struct
|
|
||||||
|
|
||||||
# Toolkit imports
|
|
||||||
from tkwidget import MfxDialog
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# //
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
class DemoOptionsDialog(MfxDialog):
|
|
||||||
def __init__(self, parent, title, app, **kw):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class HintOptionsDialog(MfxDialog):
|
|
||||||
def __init__(self, parent, title, app, **kw):
|
|
||||||
pass
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ TOOLBAR_BUTTONS = (
|
||||||
"undo",
|
"undo",
|
||||||
"redo",
|
"redo",
|
||||||
"autodrop",
|
"autodrop",
|
||||||
|
"shuffle",
|
||||||
"pause",
|
"pause",
|
||||||
"statistics",
|
"statistics",
|
||||||
"rules",
|
"rules",
|
||||||
|
|
|
@ -285,6 +285,7 @@ class HTMLViewer:
|
||||||
|
|
||||||
parent.set_default_size(600, 440)
|
parent.set_default_size(600, 440)
|
||||||
parent.show_all()
|
parent.show_all()
|
||||||
|
gobject.idle_add(gtk.main)
|
||||||
|
|
||||||
|
|
||||||
def motion_notify_event(self, widget, event):
|
def motion_notify_event(self, widget, event):
|
||||||
|
|
|
@ -48,7 +48,7 @@ class StatsFormatter(PysolStatsFormatter):
|
||||||
for result in self.getStatResults(player, sort_by):
|
for result in self.getStatResults(player, sort_by):
|
||||||
iter = self.store.append(None)
|
iter = self.store.append(None)
|
||||||
self.store.set(iter,
|
self.store.set(iter,
|
||||||
0, _(result[0]),
|
0, result[0],
|
||||||
1, result[1],
|
1, result[1],
|
||||||
2, result[2],
|
2, result[2],
|
||||||
3, result[3],
|
3, result[3],
|
||||||
|
|
|
@ -34,14 +34,14 @@
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
import gtk
|
import gtk
|
||||||
from gtk import gdk
|
gdk = gtk.gdk
|
||||||
|
|
||||||
# PySol imports
|
# PySol imports
|
||||||
|
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
from tkutil import makeToplevel, setTransient, wm_withdraw
|
from tkutil import makeToplevel, setTransient, wm_withdraw
|
||||||
|
|
||||||
from pysollib.mfxutil import kwdefault, KwStruct
|
from pysollib.mfxutil import kwdefault, KwStruct, openURL
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
@ -78,7 +78,8 @@ class MfxDialog(_MyDialog):
|
||||||
bitmap=None, bitmap_side='left',
|
bitmap=None, bitmap_side='left',
|
||||||
bitmap_padx=20, bitmap_pady=20,
|
bitmap_padx=20, bitmap_pady=20,
|
||||||
image=None, image_side='left',
|
image=None, image_side='left',
|
||||||
image_padx=10, image_pady=20):
|
image_padx=10, image_pady=20,
|
||||||
|
**kw):
|
||||||
_MyDialog.__init__(self)
|
_MyDialog.__init__(self)
|
||||||
self.status = 1
|
self.status = 1
|
||||||
self.button = -1
|
self.button = -1
|
||||||
|
@ -215,6 +216,55 @@ class MfxMessageDialog(MfxDialog):
|
||||||
return MfxDialog.initKw(self, kw)
|
return MfxDialog.initKw(self, kw)
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# //
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
class PysolAboutDialog(MfxDialog):
|
||||||
|
def __init__(self, app, parent, title, **kw):
|
||||||
|
self._url = kw['url']
|
||||||
|
kw = self.initKw(kw)
|
||||||
|
MfxDialog.__init__(self, parent, title, **kw)
|
||||||
|
|
||||||
|
top_box, bottom_box = self.createBox()
|
||||||
|
self.createBitmaps(top_box, kw)
|
||||||
|
|
||||||
|
box = gtk.VBox()
|
||||||
|
box.set_property('border-width', 20)
|
||||||
|
top_box.pack_start(box)
|
||||||
|
|
||||||
|
label = gtk.Label(kw['text'])
|
||||||
|
label.set_justify(gtk.JUSTIFY_CENTER)
|
||||||
|
box.pack_start(label)
|
||||||
|
|
||||||
|
url_label = gtk.Label()
|
||||||
|
url_label.set_justify(gtk.JUSTIFY_CENTER)
|
||||||
|
url_label.set_markup(
|
||||||
|
'<span foreground="blue" underline="single">%s</span>' % kw['url'])
|
||||||
|
|
||||||
|
event_box = gtk.EventBox()
|
||||||
|
box.pack_start(event_box)
|
||||||
|
event_box.connect('button-press-event', self._urlClicked)
|
||||||
|
event_box.add(url_label)
|
||||||
|
|
||||||
|
self.createButtons(bottom_box, kw)
|
||||||
|
|
||||||
|
self.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
##self.set_position(gtk.WIN_POS_CENTER)
|
||||||
|
|
||||||
|
self.show_all()
|
||||||
|
event_box.window.set_cursor(gdk.Cursor(gdk.HAND2))
|
||||||
|
gtk.main()
|
||||||
|
|
||||||
|
def initKw(self, kw):
|
||||||
|
#if kw.has_key('bitmap'):
|
||||||
|
# kwdefault(kw, width=250, height=150)
|
||||||
|
return MfxDialog.initKw(self, kw)
|
||||||
|
|
||||||
|
def _urlClicked(self, *args):
|
||||||
|
openURL(self._url)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
@ -234,19 +284,6 @@ class MfxExceptionDialog(MfxDialog):
|
||||||
MfxDialog.__init__(self, parent, title, **kw.__dict__)
|
MfxDialog.__init__(self, parent, title, **kw.__dict__)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# //
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
class MfxSimpleSlider(_MyDialog):
|
|
||||||
def __init__(self, parent, title,
|
|
||||||
label, value, from_, to, resolution,
|
|
||||||
resizable=0):
|
|
||||||
self.button = 0
|
|
||||||
self.status = 1
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
|
@ -73,18 +73,21 @@ class PysolStatsFormatter:
|
||||||
g = sort_func(player=player)
|
g = sort_func(player=player)
|
||||||
twon, tlost, tgames, ttime, tmoves = 0, 0, 0, 0, 0
|
twon, tlost, tgames, ttime, tmoves = 0, 0, 0, 0, 0
|
||||||
for id in g:
|
for id in g:
|
||||||
name = app.getGameTitleName(id)
|
|
||||||
#won, lost = app.stats.getStats(player, id)
|
|
||||||
won, lost, time, moves = app.stats.getFullStats(player, id)
|
won, lost, time, moves = app.stats.getFullStats(player, id)
|
||||||
|
if won > 0 or lost > 0 or id == app.game.id:
|
||||||
|
# yield only played games
|
||||||
|
name = app.getGameTitleName(id)
|
||||||
twon, tlost = twon + won, tlost + lost
|
twon, tlost = twon + won, tlost + lost
|
||||||
ttime, tmoves = ttime+time, tmoves+moves
|
ttime, tmoves = ttime+time, tmoves+moves
|
||||||
if won + lost > 0: perc = "%.1f" % (100.0 * won / (won + lost))
|
if won + lost > 0:
|
||||||
else: perc = "0.0"
|
perc = "%.1f" % (100.0 * won / (won + lost))
|
||||||
if won > 0 or lost > 0 or id == app.game.id:
|
else:
|
||||||
|
perc = "0.0"
|
||||||
t = format_time(time)
|
t = format_time(time)
|
||||||
m = str(round(moves, 1))
|
m = str(round(moves, 1))
|
||||||
yield [name, won+lost, won, lost, t, m, perc, id]
|
yield [name, won+lost, won, lost, t, m, perc, id]
|
||||||
tgames = tgames + 1
|
tgames += 1
|
||||||
|
# summary
|
||||||
won, lost = twon, tlost
|
won, lost = twon, tlost
|
||||||
if won + lost > 0:
|
if won + lost > 0:
|
||||||
if won > 0:
|
if won > 0:
|
||||||
|
@ -94,7 +97,8 @@ class PysolStatsFormatter:
|
||||||
time = format_time(0)
|
time = format_time(0)
|
||||||
moves = 0
|
moves = 0
|
||||||
perc = "%.1f" % (100.0*won/(won+lost))
|
perc = "%.1f" % (100.0*won/(won+lost))
|
||||||
else: perc = "0.0"
|
else:
|
||||||
|
perc = "0.0"
|
||||||
self.total_games = len(g)
|
self.total_games = len(g)
|
||||||
self.played_games = tgames
|
self.played_games = tgames
|
||||||
self.won_games = won
|
self.won_games = won
|
||||||
|
|
|
@ -59,8 +59,8 @@ class EditTextDialog(MfxDialog):
|
||||||
#
|
#
|
||||||
self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken",
|
self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken",
|
||||||
wrap="word", width=64, height=16)
|
wrap="word", width=64, height=16)
|
||||||
self.text_w.pack(side='left', fill="both", expand=1)
|
self.text_w.pack(side='left', fill="both", expand=True)
|
||||||
###self.text_w.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
###self.text_w.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
vbar = Tkinter.Scrollbar(top_frame)
|
vbar = Tkinter.Scrollbar(top_frame)
|
||||||
vbar.pack(side='right', fill='y')
|
vbar.pack(side='right', fill='y')
|
||||||
self.text_w["yscrollcommand"] = vbar.set
|
self.text_w["yscrollcommand"] = vbar.set
|
||||||
|
|
|
@ -139,6 +139,7 @@ class FindCardDialog(Tkinter.Toplevel):
|
||||||
def enterEvent(self, suit, rank, rect, group):
|
def enterEvent(self, suit, rank, rect, group):
|
||||||
##print 'enterEvent', suit, rank, self.busy
|
##print 'enterEvent', suit, rank, self.busy
|
||||||
if self.busy: return
|
if self.busy: return
|
||||||
|
if self.game.demo: return
|
||||||
self.busy = True
|
self.busy = True
|
||||||
self.highlight_items = self.game.highlightCard(suit, rank)
|
self.highlight_items = self.game.highlightCard(suit, rank)
|
||||||
if not self.highlight_items:
|
if not self.highlight_items:
|
||||||
|
|
|
@ -62,7 +62,6 @@ from selectcardset import SelectCardsetDialogWithPreview
|
||||||
from selecttile import SelectTileDialogWithPreview
|
from selecttile import SelectTileDialogWithPreview
|
||||||
from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog
|
from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog
|
||||||
from solverdialog import connect_game_solver_dialog
|
from solverdialog import connect_game_solver_dialog
|
||||||
from tkwrap import MfxRadioMenuItem, MfxCheckMenuItem, StringVar
|
|
||||||
from tkwidget import MfxMessageDialog
|
from tkwidget import MfxMessageDialog
|
||||||
|
|
||||||
#from toolbar import TOOLBAR_BUTTONS
|
#from toolbar import TOOLBAR_BUTTONS
|
||||||
|
@ -74,16 +73,16 @@ from tkconst import TOOLBAR_BUTTONS
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
def createToolbarMenu(menubar, menu):
|
def createToolbarMenu(menubar, menu):
|
||||||
data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar')
|
|
||||||
tearoff = menu.cget('tearoff')
|
tearoff = menu.cget('tearoff')
|
||||||
submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff)
|
## data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar')
|
||||||
for f in os.listdir(data_dir):
|
## submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff)
|
||||||
d = os.path.join(data_dir, f)
|
## for f in os.listdir(data_dir):
|
||||||
if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')):
|
## d = os.path.join(data_dir, f)
|
||||||
name = f.replace('_', ' ').capitalize()
|
## if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')):
|
||||||
submenu.add_radiobutton(label=name,
|
## name = f.replace('_', ' ').capitalize()
|
||||||
variable=menubar.tkopt.toolbar_style,
|
## submenu.add_radiobutton(label=name,
|
||||||
value=f, command=menubar.mOptToolbarStyle)
|
## variable=menubar.tkopt.toolbar_style,
|
||||||
|
## value=f, command=menubar.mOptToolbarStyle)
|
||||||
submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff)
|
submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff)
|
||||||
for comp, label in COMPOUNDS:
|
for comp, label in COMPOUNDS:
|
||||||
submenu.add_radiobutton(
|
submenu.add_radiobutton(
|
||||||
|
@ -105,15 +104,13 @@ def createToolbarMenu(menubar, menu):
|
||||||
menu.add_radiobutton(label=n_("Right"),
|
menu.add_radiobutton(label=n_("Right"),
|
||||||
variable=menubar.tkopt.toolbar, value=4,
|
variable=menubar.tkopt.toolbar, value=4,
|
||||||
command=menubar.mOptToolbar)
|
command=menubar.mOptToolbar)
|
||||||
menu.add_separator()
|
## menu.add_separator()
|
||||||
menu.add_radiobutton(label=n_("Small icons"),
|
## menu.add_radiobutton(label=n_("Small icons"),
|
||||||
variable=menubar.tkopt.toolbar_size, value=0,
|
## variable=menubar.tkopt.toolbar_size, value=0,
|
||||||
command=menubar.mOptToolbarSize)
|
## command=menubar.mOptToolbarSize)
|
||||||
menu.add_radiobutton(label=n_("Large icons"),
|
## menu.add_radiobutton(label=n_("Large icons"),
|
||||||
variable=menubar.tkopt.toolbar_size, value=1,
|
## variable=menubar.tkopt.toolbar_size, value=1,
|
||||||
command=menubar.mOptToolbarSize)
|
## command=menubar.mOptToolbarSize)
|
||||||
#
|
|
||||||
#return
|
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff)
|
submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
|
@ -210,52 +207,52 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
def _createTkOpt(self):
|
def _createTkOpt(self):
|
||||||
# structure to convert menu-options to Toolkit variables
|
# structure to convert menu-options to Toolkit variables
|
||||||
self.tkopt = Struct(
|
self.tkopt = Struct(
|
||||||
gameid = MfxRadioMenuItem(self),
|
gameid = Tkinter.IntVar(),
|
||||||
gameid_popular = MfxRadioMenuItem(self),
|
gameid_popular = Tkinter.IntVar(),
|
||||||
comment = MfxCheckMenuItem(self),
|
comment = Tkinter.BooleanVar(),
|
||||||
autofaceup = MfxCheckMenuItem(self),
|
autofaceup = Tkinter.BooleanVar(),
|
||||||
autodrop = MfxCheckMenuItem(self),
|
autodrop = Tkinter.BooleanVar(),
|
||||||
autodeal = MfxCheckMenuItem(self),
|
autodeal = Tkinter.BooleanVar(),
|
||||||
quickplay = MfxCheckMenuItem(self),
|
quickplay = Tkinter.BooleanVar(),
|
||||||
undo = MfxCheckMenuItem(self),
|
undo = Tkinter.BooleanVar(),
|
||||||
bookmarks = MfxCheckMenuItem(self),
|
bookmarks = Tkinter.BooleanVar(),
|
||||||
hint = MfxCheckMenuItem(self),
|
hint = Tkinter.BooleanVar(),
|
||||||
highlight_piles = MfxCheckMenuItem(self),
|
highlight_piles = Tkinter.BooleanVar(),
|
||||||
highlight_cards = MfxCheckMenuItem(self),
|
highlight_cards = Tkinter.BooleanVar(),
|
||||||
highlight_samerank = MfxCheckMenuItem(self),
|
highlight_samerank = Tkinter.BooleanVar(),
|
||||||
highlight_not_matching = MfxCheckMenuItem(self),
|
highlight_not_matching = Tkinter.BooleanVar(),
|
||||||
mahjongg_show_removed = MfxCheckMenuItem(self),
|
mahjongg_show_removed = Tkinter.BooleanVar(),
|
||||||
shisen_show_hint = MfxCheckMenuItem(self),
|
shisen_show_hint = Tkinter.BooleanVar(),
|
||||||
sound = MfxCheckMenuItem(self),
|
sound = Tkinter.BooleanVar(),
|
||||||
cardback = MfxRadioMenuItem(self),
|
cardback = Tkinter.IntVar(),
|
||||||
tabletile = MfxRadioMenuItem(self),
|
tabletile = Tkinter.IntVar(),
|
||||||
animations = MfxRadioMenuItem(self),
|
animations = Tkinter.IntVar(),
|
||||||
redeal_animation = MfxCheckMenuItem(self),
|
redeal_animation = Tkinter.BooleanVar(),
|
||||||
win_animation = MfxCheckMenuItem(self),
|
win_animation = Tkinter.BooleanVar(),
|
||||||
shadow = MfxCheckMenuItem(self),
|
shadow = Tkinter.BooleanVar(),
|
||||||
shade = MfxCheckMenuItem(self),
|
shade = Tkinter.BooleanVar(),
|
||||||
shade_filled_stacks = MfxCheckMenuItem(self),
|
shade_filled_stacks = Tkinter.BooleanVar(),
|
||||||
shrink_face_down = MfxCheckMenuItem(self),
|
shrink_face_down = Tkinter.BooleanVar(),
|
||||||
toolbar = MfxRadioMenuItem(self),
|
toolbar = Tkinter.IntVar(),
|
||||||
toolbar_style = StringVar(),
|
toolbar_style = Tkinter.StringVar(),
|
||||||
toolbar_relief = StringVar(),
|
toolbar_relief = Tkinter.StringVar(),
|
||||||
toolbar_compound = StringVar(),
|
toolbar_compound = Tkinter.StringVar(),
|
||||||
toolbar_size = MfxRadioMenuItem(self),
|
toolbar_size = Tkinter.IntVar(),
|
||||||
statusbar = MfxCheckMenuItem(self),
|
statusbar = Tkinter.BooleanVar(),
|
||||||
num_cards = MfxCheckMenuItem(self),
|
num_cards = Tkinter.BooleanVar(),
|
||||||
helpbar = MfxCheckMenuItem(self),
|
helpbar = Tkinter.BooleanVar(),
|
||||||
save_games_geometry = MfxCheckMenuItem(self),
|
save_games_geometry = Tkinter.BooleanVar(),
|
||||||
splashscreen = MfxCheckMenuItem(self),
|
splashscreen = Tkinter.BooleanVar(),
|
||||||
demo_logo = MfxCheckMenuItem(self),
|
demo_logo = Tkinter.BooleanVar(),
|
||||||
mouse_type = StringVar(),
|
mouse_type = Tkinter.StringVar(),
|
||||||
mouse_undo = MfxCheckMenuItem(self),
|
mouse_undo = Tkinter.BooleanVar(),
|
||||||
negative_bottom = MfxCheckMenuItem(self),
|
negative_bottom = Tkinter.BooleanVar(),
|
||||||
pause = MfxCheckMenuItem(self),
|
pause = Tkinter.BooleanVar(),
|
||||||
theme = StringVar(),
|
theme = Tkinter.StringVar(),
|
||||||
toolbar_vars = {},
|
toolbar_vars = {},
|
||||||
)
|
)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
self.tkopt.toolbar_vars[w] = MfxCheckMenuItem(self)
|
self.tkopt.toolbar_vars[w] = Tkinter.BooleanVar()
|
||||||
|
|
||||||
def _setOptions(self):
|
def _setOptions(self):
|
||||||
tkopt, opt = self.tkopt, self.app.opt
|
tkopt, opt = self.tkopt, self.app.opt
|
||||||
|
@ -300,7 +297,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
tkopt.negative_bottom.set(opt.negative_bottom)
|
tkopt.negative_bottom.set(opt.negative_bottom)
|
||||||
tkopt.theme.set(opt.tile_theme)
|
tkopt.theme.set(opt.tile_theme)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
tkopt.toolbar_vars[w].set(opt.toolbar_vars[w])
|
tkopt.toolbar_vars[w].set(opt.toolbar_vars.get(w, False))
|
||||||
|
|
||||||
def connectGame(self, game):
|
def connectGame(self, game):
|
||||||
self.game = game
|
self.game = game
|
||||||
|
@ -386,7 +383,6 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z")
|
menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z")
|
||||||
menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R")
|
menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R")
|
||||||
menu.add_command(label=n_("Redo &all"), command=self.mRedoAll)
|
menu.add_command(label=n_("Redo &all"), command=self.mRedoAll)
|
||||||
menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F")
|
|
||||||
|
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
submenu = MfxMenu(menu, label=n_("&Set bookmark"))
|
submenu = MfxMenu(menu, label=n_("&Set bookmark"))
|
||||||
|
@ -410,6 +406,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu = MfxMenu(self.__menubar, label=n_("&Game"))
|
menu = MfxMenu(self.__menubar, label=n_("&Game"))
|
||||||
menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D")
|
menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D")
|
||||||
menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A")
|
menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A")
|
||||||
|
menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F")
|
||||||
menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P")
|
menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P")
|
||||||
#menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P")
|
#menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P")
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
|
@ -431,7 +428,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
if USE_FREECELL_SOLVER:
|
if USE_FREECELL_SOLVER:
|
||||||
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver)
|
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver)
|
||||||
else:
|
else:
|
||||||
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state=Tkinter.DISABLED)
|
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state='disabled')
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2")
|
menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2")
|
||||||
|
|
||||||
|
@ -459,7 +456,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
label = n_("&Sound...")
|
label = n_("&Sound...")
|
||||||
if not self.app.audio.CAN_PLAY_SOUND:
|
if not self.app.audio.CAN_PLAY_SOUND:
|
||||||
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state=Tkinter.DISABLED)
|
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state='disabled')
|
||||||
else:
|
else:
|
||||||
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog)
|
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog)
|
||||||
# cardsets
|
# cardsets
|
||||||
|
|
|
@ -68,7 +68,7 @@ class PlayerOptionsDialog(MfxDialog):
|
||||||
self.win_animation_var.set(app.opt.win_animation != 0)
|
self.win_animation_var.set(app.opt.win_animation != 0)
|
||||||
#
|
#
|
||||||
frame = Tkinter.Frame(top_frame)
|
frame = Tkinter.Frame(top_frame)
|
||||||
frame.pack(expand=1, fill='both', padx=5, pady=10)
|
frame.pack(expand=True, fill='both', padx=5, pady=10)
|
||||||
widget = Tkinter.Label(frame, text=_("\nPlease enter your name"),
|
widget = Tkinter.Label(frame, text=_("\nPlease enter your name"),
|
||||||
takefocus=0)
|
takefocus=0)
|
||||||
widget.grid(row=0, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
widget.grid(row=0, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
||||||
|
@ -87,7 +87,7 @@ class PlayerOptionsDialog(MfxDialog):
|
||||||
widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
||||||
### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var,
|
### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var,
|
||||||
### text="Win animation")
|
### text="Win animation")
|
||||||
### widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
### widget.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
#
|
#
|
||||||
self.player = self.player_var.get()
|
self.player = self.player_var.get()
|
||||||
|
|
|
@ -66,12 +66,12 @@ class PysolProgressBar:
|
||||||
if images:
|
if images:
|
||||||
self.f1 = Tkinter.Label(self.frame, image=images[0])
|
self.f1 = Tkinter.Label(self.frame, image=images[0])
|
||||||
self.f1.pack(side='left', ipadx=8, ipady=4)
|
self.f1.pack(side='left', ipadx=8, ipady=4)
|
||||||
self.progress.pack(side='left', expand='yes', fill='x')
|
self.progress.pack(side='left', expand=True, fill='x')
|
||||||
self.f2 = Tkinter.Label(self.frame, image=images[1])
|
self.f2 = Tkinter.Label(self.frame, image=images[1])
|
||||||
self.f2.pack(side='left', ipadx=8, ipady=4)
|
self.f2.pack(side='left', ipadx=8, ipady=4)
|
||||||
else:
|
else:
|
||||||
self.progress.pack(expand='yes', fill='x')
|
self.progress.pack(expand=True, fill='x')
|
||||||
self.frame.pack(expand='yes', fill='both')
|
self.frame.pack(expand=True, fill='both')
|
||||||
if 1:
|
if 1:
|
||||||
setTransient(self.top, None, relx=0.5, rely=0.5)
|
setTransient(self.top, None, relx=0.5, rely=0.5)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -201,7 +201,7 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
else:
|
else:
|
||||||
w1, w2 = 200, 300
|
w1, w2 = 200, 300
|
||||||
paned_window = Tkinter.PanedWindow(top_frame)
|
paned_window = Tkinter.PanedWindow(top_frame)
|
||||||
paned_window.pack(expand=1, fill='both')
|
paned_window.pack(expand=True, fill='both')
|
||||||
left_frame = Tkinter.Frame(paned_window)
|
left_frame = Tkinter.Frame(paned_window)
|
||||||
right_frame = Tkinter.Frame(paned_window)
|
right_frame = Tkinter.Frame(paned_window)
|
||||||
paned_window.add(left_frame)
|
paned_window.add(left_frame)
|
||||||
|
@ -210,10 +210,10 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
self.tree = self.Tree_Class(self, left_frame, key=key,
|
self.tree = self.Tree_Class(self, left_frame, key=key,
|
||||||
default=kw.default,
|
default=kw.default,
|
||||||
font=font, width=w1)
|
font=font, width=w1)
|
||||||
self.tree.frame.pack(fill='both', expand=1, padx=padx, pady=pady)
|
self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady)
|
||||||
self.preview = MfxScrolledCanvas(right_frame, width=w2)
|
self.preview = MfxScrolledCanvas(right_frame, width=w2)
|
||||||
self.preview.setTile(app, app.tabletile_index, force=True)
|
self.preview.setTile(app, app.tabletile_index, force=True)
|
||||||
self.preview.pack(fill='both', expand=1, padx=padx, pady=pady)
|
self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
|
||||||
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
|
||||||
|
@ -283,11 +283,12 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
x, y = 10, y + dy
|
x, y = 10, y + dy
|
||||||
else:
|
else:
|
||||||
x = x + dx
|
x = x + dx
|
||||||
canvas.config(scrollregion=(0, 0, sx+dx, sy+dy))
|
## canvas.config(scrollregion=(0, 0, sx+dx, sy+dy))
|
||||||
canvas.config(width=sx+dx, height=sy+dy)
|
## canvas.config(width=sx+dx, height=sy+dy)
|
||||||
|
canvas.config(scrollregion=(0, 0, sx+dx, sy+dy),
|
||||||
|
width=sx+dx, height=sy+dy)
|
||||||
#canvas.config(xscrollincrement=dx, yscrollincrement=dy)
|
#canvas.config(xscrollincrement=dx, yscrollincrement=dy)
|
||||||
## self.preview.showHbar()
|
canvas.event_generate('<Configure>') # update bg image
|
||||||
## self.preview.showVbar()
|
|
||||||
self.preview_key = key
|
self.preview_key = key
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -288,9 +288,8 @@ class SelectGameDialog(MfxDialog):
|
||||||
self.top.wm_minsize(200, 200)
|
self.top.wm_minsize(200, 200)
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, top_frame, key=gameid,
|
self.tree = self.Tree_Class(self, top_frame, key=gameid,
|
||||||
font=font,
|
font=font, default=kw.default)
|
||||||
default=kw.default)
|
self.tree.frame.pack(fill='both', expand=True,
|
||||||
self.tree.frame.pack(fill=Tkinter.BOTH, expand=1,
|
|
||||||
padx=kw.padx, pady=kw.pady)
|
padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
|
@ -363,7 +362,7 @@ class SelectGameDialogWithPreview(SelectGameDialog):
|
||||||
padx, pady = 4, 4
|
padx, pady = 4, 4
|
||||||
# PanedWindow
|
# PanedWindow
|
||||||
paned_window = Tkinter.PanedWindow(top_frame)
|
paned_window = Tkinter.PanedWindow(top_frame)
|
||||||
paned_window.pack(expand=1, fill='both', padx=8, pady=8)
|
paned_window.pack(expand=True, fill='both', padx=8, pady=8)
|
||||||
left_frame = Tkinter.Frame(paned_window)
|
left_frame = Tkinter.Frame(paned_window)
|
||||||
right_frame = Tkinter.Frame(paned_window)
|
right_frame = Tkinter.Frame(paned_window)
|
||||||
paned_window.add(left_frame)
|
paned_window.add(left_frame)
|
||||||
|
@ -372,7 +371,7 @@ class SelectGameDialogWithPreview(SelectGameDialog):
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, left_frame, key=gameid,
|
self.tree = self.Tree_Class(self, left_frame, key=gameid,
|
||||||
default=kw.default, font=font, width=w1)
|
default=kw.default, font=font, width=w1)
|
||||||
self.tree.frame.pack(padx=padx, pady=pady, expand=1, fill='both')
|
self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both')
|
||||||
# LabelFrame
|
# LabelFrame
|
||||||
info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
|
info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
|
||||||
info_frame.grid(row=0, column=0, padx=padx, pady=pady,
|
info_frame.grid(row=0, column=0, padx=padx, pady=pady,
|
||||||
|
|
|
@ -134,11 +134,10 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, top_frame, key=key,
|
self.tree = self.Tree_Class(self, top_frame, key=key,
|
||||||
default=kw.default,
|
default=kw.default,
|
||||||
font=font,
|
font=font, width=w1)
|
||||||
width=w1)
|
self.tree.frame.pack(side="left", fill='both', expand=False, padx=kw.padx, pady=kw.pady)
|
||||||
self.tree.frame.pack(side="left", fill=Tkinter.BOTH, expand=0, padx=kw.padx, pady=kw.pady)
|
|
||||||
self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0)
|
self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0)
|
||||||
self.preview.pack(side="right", fill=Tkinter.BOTH, expand=1,
|
self.preview.pack(side="right", fill='both', expand=True,
|
||||||
padx=kw.padx, pady=kw.pady)
|
padx=kw.padx, pady=kw.pady)
|
||||||
self.preview.canvas.preview = 1
|
self.preview.canvas.preview = 1
|
||||||
# create a preview of the current state
|
# create a preview of the current state
|
||||||
|
@ -173,9 +172,13 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.key = self.tree.selection_key
|
self.key = self.tree.selection_key
|
||||||
self.tree.n_expansions = 1 # save xyview in any case
|
self.tree.n_expansions = 1 # save xyview in any case
|
||||||
if button == 10: # "Solid color..."
|
if button == 10: # "Solid color..."
|
||||||
|
try:
|
||||||
c = tkColorChooser.askcolor(master=self.top,
|
c = tkColorChooser.askcolor(master=self.top,
|
||||||
initialcolor=self.table_color,
|
initialcolor=self.table_color,
|
||||||
title=_("Select table color"))
|
title=_("Select table color"))
|
||||||
|
except Tkinter.TclError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
if c and c[1]:
|
if c and c[1]:
|
||||||
color = str(c[1])
|
color = str(c[1])
|
||||||
self.key = color.lower()
|
self.key = color.lower()
|
||||||
|
|
|
@ -39,7 +39,7 @@ from pysollib.settings import PACKAGE
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
||||||
from tkwidget import MfxDialog
|
from tkwidget import MfxDialog
|
||||||
from tkwidget import PysolScale
|
from tkwidget import PysolScale, PysolCombo
|
||||||
from tkutil import bind, unbind_destroy
|
from tkutil import bind, unbind_destroy
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,10 +85,10 @@ class SolverDialog(MfxDialog):
|
||||||
self.games[name] = id
|
self.games[name] = id
|
||||||
gamenames.sort()
|
gamenames.sort()
|
||||||
self.gamenames = gamenames
|
self.gamenames = gamenames
|
||||||
cb = Tkinter.Combobox(frame, values=tuple(gamenames),
|
cb = PysolCombo(frame, values=tuple(gamenames),
|
||||||
|
selectcommand=self.gameSelected,
|
||||||
state='readonly', width=40)
|
state='readonly', width=40)
|
||||||
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
||||||
bind(cb, '<<ComboboxSelected>>', self.gameSelected)
|
|
||||||
self.games_var = cb
|
self.games_var = cb
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -103,7 +103,7 @@ class SolverDialog(MfxDialog):
|
||||||
'A randomized DFS',
|
'A randomized DFS',
|
||||||
##'"Soft" DFS'
|
##'"Soft" DFS'
|
||||||
]
|
]
|
||||||
cb = Tkinter.Combobox(frame, values=tuple(sm), state='readonly')
|
cb = PysolCombo(frame, values=tuple(sm), state='readonly')
|
||||||
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
||||||
cb.current(sm.index('Depth-First Search'))
|
cb.current(sm.index('Depth-First Search'))
|
||||||
self.solving_method_var = cb
|
self.solving_method_var = cb
|
||||||
|
@ -125,7 +125,7 @@ class SolverDialog(MfxDialog):
|
||||||
'yellow-brick-road',
|
'yellow-brick-road',
|
||||||
]
|
]
|
||||||
self.presets = presets
|
self.presets = presets
|
||||||
cb = Tkinter.Combobox(frame, values=tuple(presets), state='readonly')
|
cb = PysolCombo(frame, values=tuple(presets), state='readonly')
|
||||||
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
||||||
cb.current(0)
|
cb.current(0)
|
||||||
self.preset_var = cb
|
self.preset_var = cb
|
||||||
|
@ -191,14 +191,11 @@ class SolverDialog(MfxDialog):
|
||||||
|
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout, transient=False)
|
|
||||||
|
|
||||||
self.start_button = self.buttons[0]
|
self.start_button = self.buttons[0]
|
||||||
self.play_button = self.buttons[1]
|
self.play_button = self.buttons[1]
|
||||||
|
|
||||||
#
|
|
||||||
self._reset()
|
self._reset()
|
||||||
self.connectGame(self.app.game)
|
self.connectGame(self.app.game)
|
||||||
|
self.mainloop(focus, kw.timeout, transient=False)
|
||||||
|
|
||||||
def initKw(self, kw):
|
def initKw(self, kw):
|
||||||
strings=[_('&Start'), _('&Play'), _('&New'), 'sep', _('&Close'),]
|
strings=[_('&Start'), _('&Play'), _('&New'), 'sep', _('&Close'),]
|
||||||
|
@ -256,6 +253,8 @@ class SolverDialog(MfxDialog):
|
||||||
self.play_button.config(state='disabled')
|
self.play_button.config(state='disabled')
|
||||||
|
|
||||||
def startSolving(self):
|
def startSolving(self):
|
||||||
|
from gettext import ungettext
|
||||||
|
|
||||||
self._reset()
|
self._reset()
|
||||||
game = self.app.game
|
game = self.app.game
|
||||||
solver = game.Solver_Class(game, self) # create solver instance
|
solver = game.Solver_Class(game, self) # create solver instance
|
||||||
|
@ -271,7 +270,10 @@ class SolverDialog(MfxDialog):
|
||||||
solver.computeHints()
|
solver.computeHints()
|
||||||
hints_len = len(solver.hints)-1
|
hints_len = len(solver.hints)-1
|
||||||
if hints_len > 0:
|
if hints_len > 0:
|
||||||
self.result_label['text'] = _('This game is solveable in %s moves.') % hints_len
|
t = ungettext('This game is solveable in %d move.',
|
||||||
|
'This game is solveable in %d moves.',
|
||||||
|
hints_len) % hints_len
|
||||||
|
self.result_label['text'] = t
|
||||||
self.play_button.config(state='normal')
|
self.play_button.config(state='normal')
|
||||||
else:
|
else:
|
||||||
self.result_label['text'] = _('I could not solve this game.')
|
self.result_label['text'] = _('I could not solve this game.')
|
||||||
|
@ -279,9 +281,13 @@ class SolverDialog(MfxDialog):
|
||||||
|
|
||||||
def startPlay(self):
|
def startPlay(self):
|
||||||
self.play_button.config(state='disabled')
|
self.play_button.config(state='disabled')
|
||||||
|
self.start_button.focus()
|
||||||
|
if self.app.game.pause:
|
||||||
|
self.app.menubar.mPause()
|
||||||
self.app.top.tkraise()
|
self.app.top.tkraise()
|
||||||
self.app.top.update_idletasks()
|
self.app.top.update_idletasks()
|
||||||
self.app.top.update()
|
self.app.top.update()
|
||||||
|
self.app.top.after(200)
|
||||||
self.app.game.startDemo(level=3)
|
self.app.game.startDemo(level=3)
|
||||||
|
|
||||||
def setText(self, **kw):
|
def setText(self, **kw):
|
||||||
|
|
|
@ -143,7 +143,7 @@ class SoundOptionsDialog(MfxDialog):
|
||||||
kw.strings[1] = None
|
kw.strings[1] = None
|
||||||
#
|
#
|
||||||
frame = Tkinter.LabelFrame(top_frame, text=_('Enable samples'))
|
frame = Tkinter.LabelFrame(top_frame, text=_('Enable samples'))
|
||||||
frame.pack(expand=1, fill='both', padx=5, pady=5)
|
frame.pack(expand=True, fill='both', padx=5, pady=5)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
frame.columnconfigure(1, weight=1)
|
frame.columnconfigure(1, weight=1)
|
||||||
#
|
#
|
||||||
|
|
|
@ -75,9 +75,8 @@ class MfxStatusbar:
|
||||||
self.frame.pack(side='left', expand=True, fill='both', padx=0, pady=1)
|
self.frame.pack(side='left', expand=True, fill='both', padx=0, pady=1)
|
||||||
|
|
||||||
# util
|
# util
|
||||||
def _createLabel(self, name, side='left',
|
def _createLabel(self, name, side='left', fill='none',
|
||||||
fill='none', expand=0, width=0,
|
expand=False, width=0, tooltip=None):
|
||||||
tooltip=None):
|
|
||||||
frame = Tkinter.Frame(self.frame, borderwidth=1, relief=self.label_relief)
|
frame = Tkinter.Frame(self.frame, borderwidth=1, relief=self.label_relief)
|
||||||
frame.pack(side=side, fill=fill, padx=self.padx, expand=expand)
|
frame.pack(side=side, fill=fill, padx=self.padx, expand=expand)
|
||||||
label = Tkinter.Label(frame, width=width)
|
label = Tkinter.Label(frame, width=width)
|
||||||
|
@ -154,7 +153,7 @@ class PysolStatusbar(MfxStatusbar):
|
||||||
):
|
):
|
||||||
self._createLabel(n, tooltip=t, width=w)
|
self._createLabel(n, tooltip=t, width=w)
|
||||||
#
|
#
|
||||||
l = self._createLabel("info", fill='both', expand=1)
|
l = self._createLabel("info", fill='both', expand=True)
|
||||||
##l.config(text="", justify="left", anchor='w')
|
##l.config(text="", justify="left", anchor='w')
|
||||||
l.config(padding=(8, 0))
|
l.config(padding=(8, 0))
|
||||||
self._createSizegrip()
|
self._createSizegrip()
|
||||||
|
@ -163,14 +162,14 @@ class PysolStatusbar(MfxStatusbar):
|
||||||
class HelpStatusbar(MfxStatusbar):
|
class HelpStatusbar(MfxStatusbar):
|
||||||
def __init__(self, top):
|
def __init__(self, top):
|
||||||
MfxStatusbar.__init__(self, top, row=3, column=0, columnspan=3)
|
MfxStatusbar.__init__(self, top, row=3, column=0, columnspan=3)
|
||||||
l = self._createLabel("info", fill='both', expand=1)
|
l = self._createLabel("info", fill='both', expand=True)
|
||||||
l.config(justify="left", anchor='w', padding=(8, 0))
|
l.config(justify="left", anchor='w', padding=(8, 0))
|
||||||
|
|
||||||
|
|
||||||
class HtmlStatusbar(MfxStatusbar):
|
class HtmlStatusbar(MfxStatusbar):
|
||||||
def __init__(self, top, row, column, columnspan):
|
def __init__(self, top, row, column, columnspan):
|
||||||
MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan)
|
MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan)
|
||||||
l = self._createLabel("url", fill='both', expand=1)
|
l = self._createLabel("url", fill='both', expand=True)
|
||||||
l.config(justify="left", anchor='w', padding=(8, 0))
|
l.config(justify="left", anchor='w', padding=(8, 0))
|
||||||
self._createSizegrip()
|
self._createSizegrip()
|
||||||
|
|
||||||
|
|
|
@ -142,10 +142,10 @@ class MfxCanvas(Tkinter.Canvas):
|
||||||
#
|
#
|
||||||
self.xmargin, self.ymargin = 10, 10
|
self.xmargin, self.ymargin = 10, 10
|
||||||
# resize bg image
|
# resize bg image
|
||||||
self.bind('<Configure>', lambda e: self.set_bg_image())
|
self.bind('<Configure>', self.setBackgroundImage)
|
||||||
|
|
||||||
def set_bg_image(self):
|
def setBackgroundImage(self, event=None):
|
||||||
##print 'set_bg_image', self._bg_img
|
##print 'setBackgroundImage', self._bg_img
|
||||||
if not hasattr(self, '_bg_img'):
|
if not hasattr(self, '_bg_img'):
|
||||||
return
|
return
|
||||||
if not self._bg_img: # solid color
|
if not self._bg_img: # solid color
|
||||||
|
@ -306,7 +306,7 @@ class MfxCanvas(Tkinter.Canvas):
|
||||||
except:
|
except:
|
||||||
return 0
|
return 0
|
||||||
self._stretch_bg_image = stretch
|
self._stretch_bg_image = stretch
|
||||||
self.set_bg_image()
|
self.setBackgroundImage()
|
||||||
else:
|
else:
|
||||||
for id in self.__tiles:
|
for id in self.__tiles:
|
||||||
self.delete(id)
|
self.delete(id)
|
||||||
|
|
|
@ -247,8 +247,9 @@ class HTMLViewer:
|
||||||
##self.defcursor = 'xterm'
|
##self.defcursor = 'xterm'
|
||||||
self.handcursor = "hand2"
|
self.handcursor = "hand2"
|
||||||
|
|
||||||
frame = Tkinter.Frame(parent)
|
frame = Tkinter.Frame(parent, width=640, height=440)
|
||||||
frame.pack(expand=True, fill='both')
|
frame.pack(expand=True, fill='both')
|
||||||
|
frame.grid_propagate(False)
|
||||||
|
|
||||||
# create buttons
|
# create buttons
|
||||||
button_width = 8
|
button_width = 8
|
||||||
|
@ -274,13 +275,13 @@ class HTMLViewer:
|
||||||
text_frame.grid(row=1, column=0, columnspan=4,
|
text_frame.grid(row=1, column=0, columnspan=4,
|
||||||
sticky='nsew', padx=1, pady=1)
|
sticky='nsew', padx=1, pady=1)
|
||||||
vbar = Tkinter.Scrollbar(text_frame)
|
vbar = Tkinter.Scrollbar(text_frame)
|
||||||
vbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
|
vbar.pack(side='right', fill='y')
|
||||||
self.text = Tkinter.Text(text_frame,
|
self.text = Tkinter.Text(text_frame,
|
||||||
fg='black', bg='white',
|
fg='black', bg='white',
|
||||||
bd=1, relief='sunken',
|
bd=1, relief='sunken',
|
||||||
cursor=self.defcursor,
|
cursor=self.defcursor,
|
||||||
wrap='word', padx=10)
|
wrap='word', padx=10)
|
||||||
self.text.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1)
|
self.text.pack(side='left', fill='both', expand=True)
|
||||||
self.text["yscrollcommand"] = vbar.set
|
self.text["yscrollcommand"] = vbar.set
|
||||||
vbar["command"] = self.text.yview
|
vbar["command"] = self.text.yview
|
||||||
|
|
||||||
|
|
|
@ -374,7 +374,6 @@ class TreeFormatter(PysolStatsFormatter):
|
||||||
for result in self.getStatResults(player, sort_by):
|
for result in self.getStatResults(player, sort_by):
|
||||||
# result == [name, won+lost, won, lost, time, moves, perc, id]
|
# result == [name, won+lost, won, lost, time, moves, perc, id]
|
||||||
t1, t2, t3, t4, t5, t6, t7, t8 = result
|
t1, t2, t3, t4, t5, t6, t7, t8 = result
|
||||||
t1 = _(t1) # game name
|
|
||||||
id = self.tree.insert(None, "end", text=t1,
|
id = self.tree.insert(None, "end", text=t1,
|
||||||
values=(t2, t3, t4, t5, t6, t7))
|
values=(t2, t3, t4, t5, t6, t7))
|
||||||
self.parent_window.tree_items.append(id)
|
self.parent_window.tree_items.append(id)
|
||||||
|
@ -486,7 +485,6 @@ class AllGamesFrame(Tkinter.Frame):
|
||||||
|
|
||||||
def fillTreeview(self, player):
|
def fillTreeview(self, player):
|
||||||
if self.tree_items:
|
if self.tree_items:
|
||||||
#return
|
|
||||||
self.tree.delete(tuple(self.tree_items))
|
self.tree.delete(tuple(self.tree_items))
|
||||||
self.tree_items = []
|
self.tree_items = []
|
||||||
self.formatter.writeStats(player, sort_by=self.sort_by)
|
self.formatter.writeStats(player, sort_by=self.sort_by)
|
||||||
|
@ -667,7 +665,7 @@ class _TopDialog(MfxDialog):
|
||||||
'padding': (4, 1),
|
'padding': (4, 1),
|
||||||
}
|
}
|
||||||
frame = Tkinter.Frame(**cnf)
|
frame = Tkinter.Frame(**cnf)
|
||||||
frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10)
|
frame.pack(expand=True, fill='both', padx=10, pady=10)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
cnf['master'] = frame
|
cnf['master'] = frame
|
||||||
cnf['text'] = _('N')
|
cnf['text'] = _('N')
|
||||||
|
|
|
@ -258,7 +258,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas):
|
||||||
bind(self.canvas, "<ButtonPress-1>", self.singleClick)
|
bind(self.canvas, "<ButtonPress-1>", self.singleClick)
|
||||||
bind(self.canvas, "<Double-Button-1>", self.doubleClick)
|
bind(self.canvas, "<Double-Button-1>", self.doubleClick)
|
||||||
##bind(self.canvas, "<ButtonRelease-1>", xxx)
|
##bind(self.canvas, "<ButtonRelease-1>", xxx)
|
||||||
self.pack(fill=Tkinter.BOTH, expand=1)
|
self.pack(fill='both', expand=True)
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
for node in self.keys.get(self.selection_key, []):
|
for node in self.keys.get(self.selection_key, []):
|
||||||
|
@ -266,7 +266,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas):
|
||||||
MfxScrolledCanvas.destroy(self)
|
MfxScrolledCanvas.destroy(self)
|
||||||
|
|
||||||
def findNode(self, event=None):
|
def findNode(self, event=None):
|
||||||
id = self.canvas.find_withtag(Tkinter.CURRENT)
|
id = self.canvas.find_withtag('current')
|
||||||
if id:
|
if id:
|
||||||
return self.nodes.get(id[0])
|
return self.nodes.get(id[0])
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -37,6 +37,7 @@ __all__ = ['MfxDialog',
|
||||||
'MfxMessageDialog',
|
'MfxMessageDialog',
|
||||||
'MfxExceptionDialog',
|
'MfxExceptionDialog',
|
||||||
'MfxSimpleEntry',
|
'MfxSimpleEntry',
|
||||||
|
'PysolAboutDialog',
|
||||||
'MfxTooltip',
|
'MfxTooltip',
|
||||||
'MfxScrolledCanvas',
|
'MfxScrolledCanvas',
|
||||||
'StackDesc',
|
'StackDesc',
|
||||||
|
@ -46,10 +47,11 @@ __all__ = ['MfxDialog',
|
||||||
import os, sys, time, locale
|
import os, sys, time, locale
|
||||||
import Tkinter as Tk
|
import Tkinter as Tk
|
||||||
import Tile as Tkinter
|
import Tile as Tkinter
|
||||||
|
import tkFont
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# PySol imports
|
# PySol imports
|
||||||
from pysollib.mfxutil import destruct, kwdefault, KwStruct
|
from pysollib.mfxutil import destruct, kwdefault, KwStruct, openURL
|
||||||
from pysollib.settings import WIN_SYSTEM
|
from pysollib.settings import WIN_SYSTEM
|
||||||
|
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
|
@ -167,7 +169,7 @@ class MfxDialog: # ex. _ToplevelDialog
|
||||||
|
|
||||||
def createFrames(self, kw):
|
def createFrames(self, kw):
|
||||||
bottom_frame = Tkinter.Frame(self._frame, relief='flat', borderwidth=4)
|
bottom_frame = Tkinter.Frame(self._frame, relief='flat', borderwidth=4)
|
||||||
bottom_frame.pack(side='bottom', fill='both', expand=0)
|
bottom_frame.pack(side='bottom', fill='both', expand=False)
|
||||||
if kw.separatorwidth > 0:
|
if kw.separatorwidth > 0:
|
||||||
separator = Tkinter.Separator(self._frame)
|
separator = Tkinter.Separator(self._frame)
|
||||||
separator.pack(side='bottom', fill='x')
|
separator.pack(side='bottom', fill='x')
|
||||||
|
@ -275,7 +277,7 @@ class MfxMessageDialog(MfxDialog):
|
||||||
self.button = kw.default
|
self.button = kw.default
|
||||||
msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify,
|
msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify,
|
||||||
width=kw.width)
|
width=kw.width)
|
||||||
msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady)
|
msg.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout)
|
self.mainloop(focus, kw.timeout)
|
||||||
|
@ -300,6 +302,39 @@ class MfxExceptionDialog(MfxMessageDialog):
|
||||||
MfxMessageDialog.__init__(self, parent, title, **kw.getKw())
|
MfxMessageDialog.__init__(self, parent, title, **kw.getKw())
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# //
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
class PysolAboutDialog(MfxMessageDialog):
|
||||||
|
def __init__(self, app, parent, title, **kw):
|
||||||
|
self._url = kw['url']
|
||||||
|
kw = self.initKw(kw)
|
||||||
|
MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
|
||||||
|
top_frame, bottom_frame = self.createFrames(kw)
|
||||||
|
self.createBitmaps(top_frame, kw)
|
||||||
|
#
|
||||||
|
self.button = kw.default
|
||||||
|
frame = Tkinter.Frame(top_frame)
|
||||||
|
frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady)
|
||||||
|
msg = Tkinter.Label(frame, text=kw.text, justify=kw.justify,
|
||||||
|
width=kw.width)
|
||||||
|
msg.pack(fill='both', expand=True)
|
||||||
|
|
||||||
|
font = tkFont.Font(parent, app.getFont('default'))
|
||||||
|
font.configure(underline=True)
|
||||||
|
url_label = Tkinter.Label(frame, text=kw.url, font=font,
|
||||||
|
foreground='blue', cursor='hand2')
|
||||||
|
url_label.pack()
|
||||||
|
url_label.bind('<1>', self._urlClicked)
|
||||||
|
#
|
||||||
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
|
self.mainloop(focus, kw.timeout)
|
||||||
|
|
||||||
|
def _urlClicked(self, event):
|
||||||
|
openURL(self._url)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
@ -318,7 +353,7 @@ class MfxSimpleEntry(MfxDialog):
|
||||||
w = kw.get("e_width", 0) # width in characters
|
w = kw.get("e_width", 0) # width in characters
|
||||||
self.var = Tkinter.Entry(top_frame, exportselection=1, width=w)
|
self.var = Tkinter.Entry(top_frame, exportselection=1, width=w)
|
||||||
self.var.insert(0, value)
|
self.var.insert(0, value)
|
||||||
self.var.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
self.var.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
focus = self.var
|
focus = self.var
|
||||||
|
@ -408,7 +443,7 @@ class MfxTooltip:
|
||||||
if self.tooltip or not self.text:
|
if self.tooltip or not self.text:
|
||||||
return
|
return
|
||||||
## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)):
|
## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)):
|
||||||
## if self.widget["state"] == Tkinter.DISABLED:
|
## if self.widget["state"] == 'disabled':
|
||||||
## return
|
## return
|
||||||
import Tkinter # not Tile
|
import Tkinter # not Tile
|
||||||
##x = self.widget.winfo_rootx()
|
##x = self.widget.winfo_rootx()
|
||||||
|
@ -435,30 +470,24 @@ class MfxTooltip:
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class MfxScrolledCanvas:
|
class MfxScrolledCanvas:
|
||||||
def __init__(self, parent, hbar=2, vbar=2, **kw):
|
def __init__(self, parent, hbar=True, vbar=True, propagate=0, **kw):
|
||||||
kwdefault(kw, highlightthickness=0, bd=1, relief='sunken')
|
kwdefault(kw, highlightthickness=0, bd=1, relief='sunken')
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.createFrame(kw)
|
self.createFrame(kw)
|
||||||
self.canvas = None
|
self.canvas = None
|
||||||
self.hbar = None
|
self.hbar = None
|
||||||
self.hbar_mode = hbar
|
|
||||||
self.vbar = None
|
self.vbar = None
|
||||||
self.vbar_mode = vbar
|
self.hbar_show = False
|
||||||
self.hbar_show = 0
|
self.vbar_show = False
|
||||||
self.vbar_show = 0
|
|
||||||
self.resize_pending = 0
|
|
||||||
self.timer = None
|
|
||||||
self.createCanvas(kw)
|
self.createCanvas(kw)
|
||||||
self.frame.grid_rowconfigure(0, weight=1)
|
self.frame.grid_rowconfigure(0, weight=1)
|
||||||
self.frame.grid_columnconfigure(0, weight=1)
|
self.frame.grid_columnconfigure(0, weight=1)
|
||||||
|
self.frame.grid_propagate(propagate)
|
||||||
if hbar:
|
if hbar:
|
||||||
self.createHbar()
|
self.createHbar()
|
||||||
if not vbar:
|
|
||||||
bind(self.hbar, "<Map>", self._mapBar)
|
|
||||||
self.bindHbar()
|
self.bindHbar()
|
||||||
if vbar:
|
if vbar:
|
||||||
self.createVbar()
|
self.createVbar()
|
||||||
bind(self.vbar, "<Map>", self._mapBar)
|
|
||||||
self.bindVbar()
|
self.bindVbar()
|
||||||
###self.canvas.focus_set()
|
###self.canvas.focus_set()
|
||||||
|
|
||||||
|
@ -467,8 +496,6 @@ class MfxScrolledCanvas:
|
||||||
#
|
#
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
after_cancel(self.timer)
|
|
||||||
self.timer = None
|
|
||||||
self.unbind_all()
|
self.unbind_all()
|
||||||
self.canvas.destroy()
|
self.canvas.destroy()
|
||||||
self.frame.destroy()
|
self.frame.destroy()
|
||||||
|
@ -534,14 +561,18 @@ class MfxScrolledCanvas:
|
||||||
self.canvas = MfxCanvas(self.frame, **kw)
|
self.canvas = MfxCanvas(self.frame, **kw)
|
||||||
self.canvas.grid(row=0, column=0, sticky="news")
|
self.canvas.grid(row=0, column=0, sticky="news")
|
||||||
def createHbar(self):
|
def createHbar(self):
|
||||||
self.hbar = Tkinter.Scrollbar(self.frame, name="hbar",
|
self.hbar = Tkinter.Scrollbar(self.frame, takefocus=0,
|
||||||
takefocus=0, orient="horizontal")
|
orient="horizontal")
|
||||||
self.canvas["xscrollcommand"] = self._setHbar
|
self.canvas["xscrollcommand"] = self._setHbar
|
||||||
self.hbar["command"] = self.canvas.xview
|
self.hbar["command"] = self.canvas.xview
|
||||||
|
self.hbar.grid(row=1, column=0, sticky="we")
|
||||||
|
self.hbar.grid_remove()
|
||||||
def createVbar(self):
|
def createVbar(self):
|
||||||
self.vbar = Tkinter.Scrollbar(self.frame, name="vbar", takefocus=0)
|
self.vbar = Tkinter.Scrollbar(self.frame, takefocus=0)
|
||||||
self.canvas["yscrollcommand"] = self._setVbar
|
self.canvas["yscrollcommand"] = self._setVbar
|
||||||
self.vbar["command"] = self.canvas.yview
|
self.vbar["command"] = self.canvas.yview
|
||||||
|
self.vbar.grid(row=0, column=1, sticky="ns")
|
||||||
|
self.vbar.grid_remove()
|
||||||
def bindHbar(self, w=None):
|
def bindHbar(self, w=None):
|
||||||
if w is None:
|
if w is None:
|
||||||
w = self.canvas
|
w = self.canvas
|
||||||
|
@ -567,66 +598,30 @@ class MfxScrolledCanvas:
|
||||||
def mouse_wheel(self, *args):
|
def mouse_wheel(self, *args):
|
||||||
print 'MfxScrolledCanvas.mouse_wheel', args
|
print 'MfxScrolledCanvas.mouse_wheel', args
|
||||||
|
|
||||||
def _mapBar(self, event):
|
def _setHbar(self, first, last):
|
||||||
# see: autoscroll.tcl, http://mini.net/cgi-bin/wikit/950.html
|
sb = self.hbar
|
||||||
top = event.widget.winfo_toplevel()
|
|
||||||
g = top.wm_geometry()
|
|
||||||
if self.resize_pending:
|
|
||||||
self.resize_pending = 0
|
|
||||||
self.canvas.update()
|
|
||||||
self.canvas.update_idletasks()
|
|
||||||
top.wm_geometry(g)
|
|
||||||
|
|
||||||
def _setHbar(self, *args):
|
|
||||||
self.canvas.update()
|
|
||||||
self.hbar.set(*self.canvas.xview())
|
|
||||||
self.showHbar()
|
|
||||||
##self.hbar.update_idletasks()
|
|
||||||
def _setVbar(self, *args):
|
|
||||||
self.canvas.update()
|
|
||||||
self.vbar.set(*self.canvas.yview())
|
|
||||||
self.showVbar()
|
|
||||||
##self.vbar.update_idletasks()
|
|
||||||
|
|
||||||
def showHbar(self, show=-1):
|
|
||||||
if not self.hbar:
|
|
||||||
return 0
|
|
||||||
if show < 0:
|
|
||||||
show = self.hbar_mode
|
|
||||||
if show > 1:
|
|
||||||
if not self.canvas.winfo_ismapped():
|
if not self.canvas.winfo_ismapped():
|
||||||
return 0
|
sb.set(first, last)
|
||||||
##self.canvas.update()
|
return
|
||||||
view = self.canvas.xview()
|
if float(first) <= 0 and float(last) >= 1:
|
||||||
show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001
|
sb.grid_remove()
|
||||||
if show == self.hbar_show:
|
self.hbar_show = False
|
||||||
return 0
|
|
||||||
if show:
|
|
||||||
self.hbar.grid(row=1, column=0, sticky="we")
|
|
||||||
else:
|
else:
|
||||||
self.hbar.grid_forget()
|
sb.grid()
|
||||||
self.hbar_show = show
|
self.hbar_show = True
|
||||||
return 1
|
sb.set(first, last)
|
||||||
|
def _setVbar(self, first, last):
|
||||||
def showVbar(self, show=-1):
|
sb = self.vbar
|
||||||
if not self.vbar:
|
|
||||||
return 0
|
|
||||||
if show < 0:
|
|
||||||
show = self.vbar_mode
|
|
||||||
if show > 1:
|
|
||||||
if not self.canvas.winfo_ismapped():
|
if not self.canvas.winfo_ismapped():
|
||||||
return 0
|
sb.set(first, last)
|
||||||
##self.canvas.update()
|
return
|
||||||
view = self.canvas.yview()
|
if float(first) <= 0and float(last) >= 1:
|
||||||
show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001
|
sb.grid_remove()
|
||||||
if show == self.vbar_show:
|
self.vbar_show = False
|
||||||
return 0
|
|
||||||
if show:
|
|
||||||
self.vbar.grid(row=0, column=1, sticky="ns")
|
|
||||||
else:
|
else:
|
||||||
self.vbar.grid_forget()
|
sb.grid()
|
||||||
self.vbar_show = show
|
self.vbar_show = True
|
||||||
return 1
|
sb.set(first, last)
|
||||||
|
|
||||||
def _xview(self, *args):
|
def _xview(self, *args):
|
||||||
if self.hbar_show: self.canvas.xview(*args)
|
if self.hbar_show: self.canvas.xview(*args)
|
||||||
|
@ -805,3 +800,30 @@ class TkinterScale(Tk.Scale):
|
||||||
|
|
||||||
PysolScale = MyPysolScale
|
PysolScale = MyPysolScale
|
||||||
#PysolScale = TkinterScale
|
#PysolScale = TkinterScale
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# // Tile.Combobox workaround (clear selection)
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
class PysolCombo(Tkinter.Combobox):
|
||||||
|
def __init__(self, master=None, **kw):
|
||||||
|
self._command = None
|
||||||
|
if 'selectcommand' in kw:
|
||||||
|
self._command = kw['selectcommand']
|
||||||
|
del kw['selectcommand']
|
||||||
|
Tkinter.Combobox.__init__(self, master, **kw)
|
||||||
|
self.bind('<<ComboboxSelected>>', self._callback)
|
||||||
|
|
||||||
|
def _callback(self, *args):
|
||||||
|
##self.selection_clear()
|
||||||
|
self.selection_range(0,0)
|
||||||
|
if self._command is not None:
|
||||||
|
return self._command(*args)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,9 +34,6 @@
|
||||||
##---------------------------------------------------------------------------##
|
##---------------------------------------------------------------------------##
|
||||||
|
|
||||||
__all__ = ['TclError',
|
__all__ = ['TclError',
|
||||||
'MfxCheckMenuItem',
|
|
||||||
'MfxRadioMenuItem',
|
|
||||||
'StringVar',
|
|
||||||
'MfxRoot']
|
'MfxRoot']
|
||||||
|
|
||||||
# imports
|
# imports
|
||||||
|
@ -52,31 +49,6 @@ from pysollib.macosx.appSupport import setupApp
|
||||||
from tkutil import after_idle
|
from tkutil import after_idle
|
||||||
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // menubar
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
class MfxCheckMenuItem(Tkinter.BooleanVar):
|
|
||||||
def __init__(self, menubar, path=None):
|
|
||||||
Tkinter.BooleanVar.__init__(self)
|
|
||||||
def set(self, value):
|
|
||||||
if not value or value == "false": value = 0
|
|
||||||
##print value, type(value)
|
|
||||||
Tkinter.BooleanVar.set(self, value)
|
|
||||||
|
|
||||||
|
|
||||||
class MfxRadioMenuItem(Tkinter.IntVar):
|
|
||||||
def __init__(self, menubar, path=None):
|
|
||||||
Tkinter.IntVar.__init__(self)
|
|
||||||
def set(self, value):
|
|
||||||
Tkinter.IntVar.set(self, value)
|
|
||||||
|
|
||||||
|
|
||||||
## BooleanVar = Tkinter.BooleanVar
|
|
||||||
## IntVar = Tkinter.IntVar
|
|
||||||
|
|
||||||
StringVar = Tkinter.StringVar
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // Wrapper class for Tk.
|
# // Wrapper class for Tk.
|
||||||
|
|
|
@ -164,8 +164,7 @@ class ToolbarLabel(Tkinter.Message):
|
||||||
|
|
||||||
class PysolToolbar(PysolToolbarActions):
|
class PysolToolbar(PysolToolbarActions):
|
||||||
|
|
||||||
def __init__(self, top, dir, size=0, relief=Tkinter.FLAT,
|
def __init__(self, top, dir, size=0, relief='flat', compound='none'):
|
||||||
compound=Tkinter.NONE):
|
|
||||||
|
|
||||||
PysolToolbarActions.__init__(self)
|
PysolToolbarActions.__init__(self)
|
||||||
|
|
||||||
|
@ -364,7 +363,7 @@ class PysolToolbar(PysolToolbarActions):
|
||||||
padx, pady = TkSettings.vertical_toolbar_padding
|
padx, pady = TkSettings.vertical_toolbar_padding
|
||||||
pack_func(row=1, column=2, sticky='ns', padx=padx, pady=pady)
|
pack_func(row=1, column=2, sticky='ns', padx=padx, pady=pady)
|
||||||
# set orient
|
# set orient
|
||||||
orient = side in (1, 2) and Tkinter.HORIZONTAL or Tkinter.VERTICAL
|
orient = side in (1, 2) and 'horizontal' or 'vertical'
|
||||||
self._setOrient(orient)
|
self._setOrient(orient)
|
||||||
self.side = side
|
self.side = side
|
||||||
return 1
|
return 1
|
||||||
|
@ -467,6 +466,6 @@ class PysolToolbar(PysolToolbarActions):
|
||||||
if self.compound == 'text':
|
if self.compound == 'text':
|
||||||
return 0
|
return 0
|
||||||
size = self.size
|
size = self.size
|
||||||
comp = int(self.compound in (Tkinter.TOP, Tkinter.BOTTOM))
|
comp = int(self.compound in ('top', 'bottom'))
|
||||||
return int((size+comp) != 0)
|
return int((size+comp) != 0)
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ from pysollib.wizardpresets import presets
|
||||||
|
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
from tkwidget import MfxDialog
|
from tkwidget import MfxDialog
|
||||||
from tkwidget import PysolScale
|
from tkwidget import PysolScale, PysolCombo
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
@ -71,12 +71,13 @@ class WizardDialog(MfxDialog):
|
||||||
values.remove(default)
|
values.remove(default)
|
||||||
values.sort()
|
values.sort()
|
||||||
values.insert(0, default)
|
values.insert(0, default)
|
||||||
cb = Combobox(frame, values=tuple(values),
|
callback = lambda e, w=w: self.presetSelected(e, w)
|
||||||
|
cb = PysolCombo(frame, values=tuple(values),
|
||||||
textvariable=w.variable,
|
textvariable=w.variable,
|
||||||
|
exportselection=False,
|
||||||
|
selectcommand=callback,
|
||||||
state='readonly', width=32)
|
state='readonly', width=32)
|
||||||
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
||||||
callback = lambda e, w=w: self.presetSelected(e, w)
|
|
||||||
cb.bind('<<ComboboxSelected>>', callback)
|
|
||||||
elif w.widget == 'entry':
|
elif w.widget == 'entry':
|
||||||
if w.variable is None:
|
if w.variable is None:
|
||||||
w.variable = StringVar()
|
w.variable = StringVar()
|
||||||
|
@ -86,8 +87,9 @@ class WizardDialog(MfxDialog):
|
||||||
if w.variable is None:
|
if w.variable is None:
|
||||||
w.variable = StringVar()
|
w.variable = StringVar()
|
||||||
values = [_(v) for v in w.values]
|
values = [_(v) for v in w.values]
|
||||||
cb = Combobox(frame, values=tuple(values),
|
cb = PysolCombo(frame, values=tuple(values),
|
||||||
textvariable=w.variable,
|
textvariable=w.variable,
|
||||||
|
exportselection=False,
|
||||||
state='readonly', width=32)
|
state='readonly', width=32)
|
||||||
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2)
|
||||||
elif w.widget == 'spin':
|
elif w.widget == 'spin':
|
||||||
|
|
|
@ -58,8 +58,8 @@ class EditTextDialog(MfxDialog):
|
||||||
#
|
#
|
||||||
self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken",
|
self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken",
|
||||||
wrap="word", width=64, height=16)
|
wrap="word", width=64, height=16)
|
||||||
self.text_w.pack(side='left', fill="both", expand=1)
|
self.text_w.pack(side='left', fill="both", expand=True)
|
||||||
###self.text_w.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
###self.text_w.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
vbar = Tkinter.Scrollbar(top_frame)
|
vbar = Tkinter.Scrollbar(top_frame)
|
||||||
vbar.pack(side='right', fill='y')
|
vbar.pack(side='right', fill='y')
|
||||||
self.text_w["yscrollcommand"] = vbar.set
|
self.text_w["yscrollcommand"] = vbar.set
|
||||||
|
|
|
@ -139,6 +139,7 @@ class FindCardDialog(Tkinter.Toplevel):
|
||||||
def enterEvent(self, suit, rank, rect, group):
|
def enterEvent(self, suit, rank, rect, group):
|
||||||
##print 'enterEvent', suit, rank, self.busy
|
##print 'enterEvent', suit, rank, self.busy
|
||||||
if self.busy: return
|
if self.busy: return
|
||||||
|
if self.game.demo: return
|
||||||
self.busy = True
|
self.busy = True
|
||||||
self.highlight_items = self.game.highlightCard(suit, rank)
|
self.highlight_items = self.game.highlightCard(suit, rank)
|
||||||
if not self.highlight_items:
|
if not self.highlight_items:
|
||||||
|
|
|
@ -61,9 +61,7 @@ from selectcardset import SelectCardsetDialogWithPreview
|
||||||
from selecttile import SelectTileDialogWithPreview
|
from selecttile import SelectTileDialogWithPreview
|
||||||
from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog
|
from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog
|
||||||
from solverdialog import connect_game_solver_dialog
|
from solverdialog import connect_game_solver_dialog
|
||||||
from tkwrap import MfxRadioMenuItem, MfxCheckMenuItem, StringVar
|
|
||||||
|
|
||||||
#from toolbar import TOOLBAR_BUTTONS
|
|
||||||
from tkconst import TOOLBAR_BUTTONS
|
from tkconst import TOOLBAR_BUTTONS
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,16 +70,16 @@ from tkconst import TOOLBAR_BUTTONS
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
def createToolbarMenu(menubar, menu):
|
def createToolbarMenu(menubar, menu):
|
||||||
data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar')
|
|
||||||
tearoff = menu.cget('tearoff')
|
tearoff = menu.cget('tearoff')
|
||||||
submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff)
|
## data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar')
|
||||||
for f in os.listdir(data_dir):
|
## submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff)
|
||||||
d = os.path.join(data_dir, f)
|
## for f in os.listdir(data_dir):
|
||||||
if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')):
|
## d = os.path.join(data_dir, f)
|
||||||
name = f.replace('_', ' ').capitalize()
|
## if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')):
|
||||||
submenu.add_radiobutton(label=name,
|
## name = f.replace('_', ' ').capitalize()
|
||||||
variable=menubar.tkopt.toolbar_style,
|
## submenu.add_radiobutton(label=name,
|
||||||
value=f, command=menubar.mOptToolbarStyle)
|
## variable=menubar.tkopt.toolbar_style,
|
||||||
|
## value=f, command=menubar.mOptToolbarStyle)
|
||||||
if Tkinter.TkVersion >= 8.4:
|
if Tkinter.TkVersion >= 8.4:
|
||||||
submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff)
|
submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff)
|
||||||
for comp, label in COMPOUNDS:
|
for comp, label in COMPOUNDS:
|
||||||
|
@ -104,15 +102,13 @@ def createToolbarMenu(menubar, menu):
|
||||||
menu.add_radiobutton(label=n_("Right"),
|
menu.add_radiobutton(label=n_("Right"),
|
||||||
variable=menubar.tkopt.toolbar, value=4,
|
variable=menubar.tkopt.toolbar, value=4,
|
||||||
command=menubar.mOptToolbar)
|
command=menubar.mOptToolbar)
|
||||||
menu.add_separator()
|
## menu.add_separator()
|
||||||
menu.add_radiobutton(label=n_("Small icons"),
|
## menu.add_radiobutton(label=n_("Small icons"),
|
||||||
variable=menubar.tkopt.toolbar_size, value=0,
|
## variable=menubar.tkopt.toolbar_size, value=0,
|
||||||
command=menubar.mOptToolbarSize)
|
## command=menubar.mOptToolbarSize)
|
||||||
menu.add_radiobutton(label=n_("Large icons"),
|
## menu.add_radiobutton(label=n_("Large icons"),
|
||||||
variable=menubar.tkopt.toolbar_size, value=1,
|
## variable=menubar.tkopt.toolbar_size, value=1,
|
||||||
command=menubar.mOptToolbarSize)
|
## command=menubar.mOptToolbarSize)
|
||||||
#
|
|
||||||
#return
|
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff)
|
submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
|
@ -209,51 +205,51 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
def _createTkOpt(self):
|
def _createTkOpt(self):
|
||||||
# structure to convert menu-options to Toolkit variables
|
# structure to convert menu-options to Toolkit variables
|
||||||
self.tkopt = Struct(
|
self.tkopt = Struct(
|
||||||
gameid = MfxRadioMenuItem(self),
|
gameid = Tkinter.IntVar(),
|
||||||
gameid_popular = MfxRadioMenuItem(self),
|
gameid_popular = Tkinter.IntVar(),
|
||||||
comment = MfxCheckMenuItem(self),
|
comment = Tkinter.BooleanVar(),
|
||||||
autofaceup = MfxCheckMenuItem(self),
|
autofaceup = Tkinter.BooleanVar(),
|
||||||
autodrop = MfxCheckMenuItem(self),
|
autodrop = Tkinter.BooleanVar(),
|
||||||
autodeal = MfxCheckMenuItem(self),
|
autodeal = Tkinter.BooleanVar(),
|
||||||
quickplay = MfxCheckMenuItem(self),
|
quickplay = Tkinter.BooleanVar(),
|
||||||
undo = MfxCheckMenuItem(self),
|
undo = Tkinter.BooleanVar(),
|
||||||
bookmarks = MfxCheckMenuItem(self),
|
bookmarks = Tkinter.BooleanVar(),
|
||||||
hint = MfxCheckMenuItem(self),
|
hint = Tkinter.BooleanVar(),
|
||||||
highlight_piles = MfxCheckMenuItem(self),
|
highlight_piles = Tkinter.BooleanVar(),
|
||||||
highlight_cards = MfxCheckMenuItem(self),
|
highlight_cards = Tkinter.BooleanVar(),
|
||||||
highlight_samerank = MfxCheckMenuItem(self),
|
highlight_samerank = Tkinter.BooleanVar(),
|
||||||
highlight_not_matching = MfxCheckMenuItem(self),
|
highlight_not_matching = Tkinter.BooleanVar(),
|
||||||
mahjongg_show_removed = MfxCheckMenuItem(self),
|
mahjongg_show_removed = Tkinter.BooleanVar(),
|
||||||
shisen_show_hint = MfxCheckMenuItem(self),
|
shisen_show_hint = Tkinter.BooleanVar(),
|
||||||
sound = MfxCheckMenuItem(self),
|
sound = Tkinter.BooleanVar(),
|
||||||
cardback = MfxRadioMenuItem(self),
|
cardback = Tkinter.IntVar(),
|
||||||
tabletile = MfxRadioMenuItem(self),
|
tabletile = Tkinter.IntVar(),
|
||||||
animations = MfxRadioMenuItem(self),
|
animations = Tkinter.IntVar(),
|
||||||
redeal_animation = MfxCheckMenuItem(self),
|
redeal_animation = Tkinter.BooleanVar(),
|
||||||
win_animation = MfxCheckMenuItem(self),
|
win_animation = Tkinter.BooleanVar(),
|
||||||
shadow = MfxCheckMenuItem(self),
|
shadow = Tkinter.BooleanVar(),
|
||||||
shade = MfxCheckMenuItem(self),
|
shade = Tkinter.BooleanVar(),
|
||||||
shade_filled_stacks = MfxCheckMenuItem(self),
|
shade_filled_stacks = Tkinter.BooleanVar(),
|
||||||
shrink_face_down = MfxCheckMenuItem(self),
|
shrink_face_down = Tkinter.BooleanVar(),
|
||||||
toolbar = MfxRadioMenuItem(self),
|
toolbar = Tkinter.IntVar(),
|
||||||
toolbar_style = StringVar(),
|
toolbar_style = Tkinter.StringVar(),
|
||||||
toolbar_relief = StringVar(),
|
toolbar_relief = Tkinter.StringVar(),
|
||||||
toolbar_compound = StringVar(),
|
toolbar_compound = Tkinter.StringVar(),
|
||||||
toolbar_size = MfxRadioMenuItem(self),
|
toolbar_size = Tkinter.IntVar(),
|
||||||
statusbar = MfxCheckMenuItem(self),
|
statusbar = Tkinter.BooleanVar(),
|
||||||
num_cards = MfxCheckMenuItem(self),
|
num_cards = Tkinter.BooleanVar(),
|
||||||
helpbar = MfxCheckMenuItem(self),
|
helpbar = Tkinter.BooleanVar(),
|
||||||
save_games_geometry = MfxCheckMenuItem(self),
|
save_games_geometry = Tkinter.BooleanVar(),
|
||||||
splashscreen = MfxCheckMenuItem(self),
|
splashscreen = Tkinter.BooleanVar(),
|
||||||
demo_logo = MfxCheckMenuItem(self),
|
demo_logo = Tkinter.BooleanVar(),
|
||||||
mouse_type = StringVar(),
|
mouse_type = Tkinter.StringVar(),
|
||||||
mouse_undo = MfxCheckMenuItem(self),
|
mouse_undo = Tkinter.BooleanVar(),
|
||||||
negative_bottom = MfxCheckMenuItem(self),
|
negative_bottom = Tkinter.BooleanVar(),
|
||||||
pause = MfxCheckMenuItem(self),
|
pause = Tkinter.BooleanVar(),
|
||||||
toolbar_vars = {},
|
toolbar_vars = {},
|
||||||
)
|
)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
self.tkopt.toolbar_vars[w] = MfxCheckMenuItem(self)
|
self.tkopt.toolbar_vars[w] = Tkinter.BooleanVar()
|
||||||
|
|
||||||
def _setOptions(self):
|
def _setOptions(self):
|
||||||
tkopt, opt = self.tkopt, self.app.opt
|
tkopt, opt = self.tkopt, self.app.opt
|
||||||
|
@ -297,7 +293,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
tkopt.mouse_undo.set(opt.mouse_undo)
|
tkopt.mouse_undo.set(opt.mouse_undo)
|
||||||
tkopt.negative_bottom.set(opt.negative_bottom)
|
tkopt.negative_bottom.set(opt.negative_bottom)
|
||||||
for w in TOOLBAR_BUTTONS:
|
for w in TOOLBAR_BUTTONS:
|
||||||
tkopt.toolbar_vars[w].set(opt.toolbar_vars[w])
|
tkopt.toolbar_vars[w].set(opt.toolbar_vars.get(w, False))
|
||||||
|
|
||||||
def connectGame(self, game):
|
def connectGame(self, game):
|
||||||
self.game = game
|
self.game = game
|
||||||
|
@ -383,7 +379,6 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z")
|
menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z")
|
||||||
menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R")
|
menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R")
|
||||||
menu.add_command(label=n_("Redo &all"), command=self.mRedoAll)
|
menu.add_command(label=n_("Redo &all"), command=self.mRedoAll)
|
||||||
menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F")
|
|
||||||
|
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
submenu = MfxMenu(menu, label=n_("&Set bookmark"))
|
submenu = MfxMenu(menu, label=n_("&Set bookmark"))
|
||||||
|
@ -407,6 +402,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu = MfxMenu(self.__menubar, label=n_("&Game"))
|
menu = MfxMenu(self.__menubar, label=n_("&Game"))
|
||||||
menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D")
|
menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D")
|
||||||
menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A")
|
menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A")
|
||||||
|
menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F")
|
||||||
menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P")
|
menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P")
|
||||||
#menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P")
|
#menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P")
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
|
@ -436,7 +432,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
if USE_FREECELL_SOLVER:
|
if USE_FREECELL_SOLVER:
|
||||||
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver)
|
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver)
|
||||||
else:
|
else:
|
||||||
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state=Tkinter.DISABLED)
|
menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state='disabled')
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2")
|
menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2")
|
||||||
|
|
||||||
|
@ -464,7 +460,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
label = n_("&Sound...")
|
label = n_("&Sound...")
|
||||||
if not self.app.audio.CAN_PLAY_SOUND:
|
if not self.app.audio.CAN_PLAY_SOUND:
|
||||||
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state=Tkinter.DISABLED)
|
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state='disabled')
|
||||||
else:
|
else:
|
||||||
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog)
|
menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog)
|
||||||
# cardsets
|
# cardsets
|
||||||
|
|
|
@ -59,7 +59,7 @@ class SelectUserNameDialog(MfxDialog):
|
||||||
self.createBitmaps(top_frame, kw)
|
self.createBitmaps(top_frame, kw)
|
||||||
#
|
#
|
||||||
listbox = Tkinter.Listbox(top_frame)
|
listbox = Tkinter.Listbox(top_frame)
|
||||||
listbox.pack(side='left', fill='both', expand=1)
|
listbox.pack(side='left', fill='both', expand=True)
|
||||||
scrollbar = Tkinter.Scrollbar(top_frame)
|
scrollbar = Tkinter.Scrollbar(top_frame)
|
||||||
scrollbar.pack(side='right', fill='y')
|
scrollbar.pack(side='right', fill='y')
|
||||||
listbox.configure(yscrollcommand=scrollbar.set)
|
listbox.configure(yscrollcommand=scrollbar.set)
|
||||||
|
@ -108,7 +108,7 @@ class PlayerOptionsDialog(MfxDialog):
|
||||||
self.win_animation_var.set(app.opt.win_animation != 0)
|
self.win_animation_var.set(app.opt.win_animation != 0)
|
||||||
#
|
#
|
||||||
frame = Tkinter.Frame(top_frame)
|
frame = Tkinter.Frame(top_frame)
|
||||||
frame.pack(expand=1, fill='both', padx=5, pady=10)
|
frame.pack(expand=True, fill='both', padx=5, pady=10)
|
||||||
widget = Tkinter.Label(frame, text=_("\nPlease enter your name"),
|
widget = Tkinter.Label(frame, text=_("\nPlease enter your name"),
|
||||||
#justify='left', anchor='w',
|
#justify='left', anchor='w',
|
||||||
takefocus=0)
|
takefocus=0)
|
||||||
|
@ -129,7 +129,7 @@ class PlayerOptionsDialog(MfxDialog):
|
||||||
widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5)
|
||||||
### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var,
|
### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var,
|
||||||
### text="Win animation")
|
### text="Win animation")
|
||||||
### widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
### widget.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
#
|
#
|
||||||
self.player = self.player_var.get()
|
self.player = self.player_var.get()
|
||||||
|
|
|
@ -56,9 +56,9 @@ class PysolProgressBar:
|
||||||
self.top.wm_protocol("WM_DELETE_WINDOW", self.wmDeleteWindow)
|
self.top.wm_protocol("WM_DELETE_WINDOW", self.wmDeleteWindow)
|
||||||
self.top.wm_group(parent)
|
self.top.wm_group(parent)
|
||||||
self.top.wm_resizable(0, 0)
|
self.top.wm_resizable(0, 0)
|
||||||
self.frame = Tkinter.Frame(self.top, relief=Tkinter.FLAT, bd=0,
|
self.frame = Tkinter.Frame(self.top, relief='flat', bd=0,
|
||||||
takefocus=0)
|
takefocus=0)
|
||||||
self.cframe = Tkinter.Frame(self.frame, relief=Tkinter.SUNKEN, bd=1,
|
self.cframe = Tkinter.Frame(self.frame, relief='sunken', bd=1,
|
||||||
takefocus=0)
|
takefocus=0)
|
||||||
self.canvas = Tkinter.Canvas(self.cframe, width=width, height=height,
|
self.canvas = Tkinter.Canvas(self.cframe, width=width, height=height,
|
||||||
takefocus=0, bd=0, highlightthickness=0)
|
takefocus=0, bd=0, highlightthickness=0)
|
||||||
|
@ -95,7 +95,7 @@ class PysolProgressBar:
|
||||||
self.top = None
|
self.top = None
|
||||||
|
|
||||||
def pack(self, **kw):
|
def pack(self, **kw):
|
||||||
self.canvas.pack(fill=Tkinter.X, expand=0)
|
self.canvas.pack(fill=Tkinter.X, expand=False)
|
||||||
self.frame.pack(**kw)
|
self.frame.pack(**kw)
|
||||||
|
|
||||||
def reset(self, percent=0):
|
def reset(self, percent=0):
|
||||||
|
|
|
@ -201,7 +201,7 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
w1, w2 = 200, 300
|
w1, w2 = 200, 300
|
||||||
if Tkinter.TkVersion >= 8.4:
|
if Tkinter.TkVersion >= 8.4:
|
||||||
paned_window = Tkinter.PanedWindow(top_frame)
|
paned_window = Tkinter.PanedWindow(top_frame)
|
||||||
paned_window.pack(expand=1, fill='both')
|
paned_window.pack(expand=True, fill='both')
|
||||||
left_frame = Tkinter.Frame(paned_window)
|
left_frame = Tkinter.Frame(paned_window)
|
||||||
right_frame = Tkinter.Frame(paned_window)
|
right_frame = Tkinter.Frame(paned_window)
|
||||||
paned_window.add(left_frame)
|
paned_window.add(left_frame)
|
||||||
|
@ -209,16 +209,16 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
else:
|
else:
|
||||||
left_frame = Tkinter.Frame(top_frame)
|
left_frame = Tkinter.Frame(top_frame)
|
||||||
right_frame = Tkinter.Frame(top_frame)
|
right_frame = Tkinter.Frame(top_frame)
|
||||||
left_frame.pack(side='left', expand=0, fill='both')
|
left_frame.pack(side='left', expand=False, fill='both')
|
||||||
right_frame.pack(side='right', expand=1, fill='both')
|
right_frame.pack(side='right', expand=True, fill='both')
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, left_frame, key=key,
|
self.tree = self.Tree_Class(self, left_frame, key=key,
|
||||||
default=kw.default,
|
default=kw.default,
|
||||||
font=font, width=w1)
|
font=font, width=w1)
|
||||||
self.tree.frame.pack(fill='both', expand=1, padx=padx, pady=pady)
|
self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady)
|
||||||
self.preview = MfxScrolledCanvas(right_frame, width=w2)
|
self.preview = MfxScrolledCanvas(right_frame, width=w2)
|
||||||
self.preview.setTile(app, app.tabletile_index, force=True)
|
self.preview.setTile(app, app.tabletile_index, force=True)
|
||||||
self.preview.pack(fill='both', expand=1, padx=padx, pady=pady)
|
self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
|
||||||
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
|
||||||
|
@ -289,11 +289,10 @@ class SelectCardsetDialogWithPreview(MfxDialog):
|
||||||
x, y = 10, y + dy
|
x, y = 10, y + dy
|
||||||
else:
|
else:
|
||||||
x = x + dx
|
x = x + dx
|
||||||
canvas.config(scrollregion=(0, 0, sx+dx, sy+dy))
|
canvas.config(scrollregion=(0, 0, sx+dx, sy+dy),
|
||||||
canvas.config(width=sx+dx, height=sy+dy)
|
width=sx+dx, height=sy+dy)
|
||||||
|
canvas.event_generate('<Configure>') # update bg image
|
||||||
#canvas.config(xscrollincrement=dx, yscrollincrement=dy)
|
#canvas.config(xscrollincrement=dx, yscrollincrement=dy)
|
||||||
## self.preview.showHbar()
|
|
||||||
## self.preview.showVbar()
|
|
||||||
self.preview_key = key
|
self.preview_key = key
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -289,9 +289,8 @@ class SelectGameDialog(MfxDialog):
|
||||||
self.top.wm_minsize(200, 200)
|
self.top.wm_minsize(200, 200)
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, top_frame, key=gameid,
|
self.tree = self.Tree_Class(self, top_frame, key=gameid,
|
||||||
font=font,
|
font=font, default=kw.default)
|
||||||
default=kw.default)
|
self.tree.frame.pack(fill='both', expand=True,
|
||||||
self.tree.frame.pack(fill=Tkinter.BOTH, expand=1,
|
|
||||||
padx=kw.padx, pady=kw.pady)
|
padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
|
@ -366,7 +365,7 @@ class SelectGameDialogWithPreview(SelectGameDialog):
|
||||||
# PanedWindow
|
# PanedWindow
|
||||||
if Tkinter.TkVersion >= 8.4:
|
if Tkinter.TkVersion >= 8.4:
|
||||||
paned_window = Tkinter.PanedWindow(top_frame)
|
paned_window = Tkinter.PanedWindow(top_frame)
|
||||||
paned_window.pack(expand=1, fill='both')
|
paned_window.pack(expand=True, fill='both')
|
||||||
left_frame = Tkinter.Frame(paned_window)
|
left_frame = Tkinter.Frame(paned_window)
|
||||||
right_frame = Tkinter.Frame(paned_window)
|
right_frame = Tkinter.Frame(paned_window)
|
||||||
paned_window.add(left_frame)
|
paned_window.add(left_frame)
|
||||||
|
@ -374,13 +373,13 @@ class SelectGameDialogWithPreview(SelectGameDialog):
|
||||||
else:
|
else:
|
||||||
left_frame = Tkinter.Frame(top_frame)
|
left_frame = Tkinter.Frame(top_frame)
|
||||||
right_frame = Tkinter.Frame(top_frame)
|
right_frame = Tkinter.Frame(top_frame)
|
||||||
left_frame.pack(side='left', expand=1, fill='both')
|
left_frame.pack(side='left', expand=True, fill='both')
|
||||||
right_frame.pack(side='right', expand=1, fill='both')
|
right_frame.pack(side='right', expand=True, fill='both')
|
||||||
# Tree
|
# Tree
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, left_frame, key=gameid,
|
self.tree = self.Tree_Class(self, left_frame, key=gameid,
|
||||||
default=kw.default, font=font, width=w1)
|
default=kw.default, font=font, width=w1)
|
||||||
self.tree.frame.pack(padx=padx, pady=pady, expand=1, fill='both')
|
self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both')
|
||||||
# LabelFrame
|
# LabelFrame
|
||||||
if Tkinter.TkVersion >= 8.4:
|
if Tkinter.TkVersion >= 8.4:
|
||||||
info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
|
info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
|
||||||
|
|
|
@ -133,11 +133,11 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
font = app.getFont("default")
|
font = app.getFont("default")
|
||||||
self.tree = self.Tree_Class(self, top_frame, key=key,
|
self.tree = self.Tree_Class(self, top_frame, key=key,
|
||||||
default=kw.default,
|
default=kw.default,
|
||||||
font=font,
|
font=font, width=w1)
|
||||||
width=w1)
|
self.tree.frame.pack(side="left", fill='both', expand=False,
|
||||||
self.tree.frame.pack(side="left", fill=Tkinter.BOTH, expand=0, padx=kw.padx, pady=kw.pady)
|
padx=kw.padx, pady=kw.pady)
|
||||||
self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0)
|
self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0)
|
||||||
self.preview.pack(side="right", fill=Tkinter.BOTH, expand=1,
|
self.preview.pack(side="right", fill='both', expand=True,
|
||||||
padx=kw.padx, pady=kw.pady)
|
padx=kw.padx, pady=kw.pady)
|
||||||
self.preview.canvas.preview = 1
|
self.preview.canvas.preview = 1
|
||||||
# create a preview of the current state
|
# create a preview of the current state
|
||||||
|
@ -173,9 +173,13 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.key = self.tree.selection_key
|
self.key = self.tree.selection_key
|
||||||
self.tree.n_expansions = 1 # save xyview in any case
|
self.tree.n_expansions = 1 # save xyview in any case
|
||||||
if button == 1: # "Solid color..."
|
if button == 1: # "Solid color..."
|
||||||
|
try:
|
||||||
c = tkColorChooser.askcolor(master=self.top,
|
c = tkColorChooser.askcolor(master=self.top,
|
||||||
initialcolor=self.table_color,
|
initialcolor=self.table_color,
|
||||||
title=_("Select table color"))
|
title=_("Select table color"))
|
||||||
|
except Tkinter.TclError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
if c and c[1]:
|
if c and c[1]:
|
||||||
color = str(c[1])
|
color = str(c[1])
|
||||||
self.key = color.lower()
|
self.key = color.lower()
|
||||||
|
|
|
@ -194,14 +194,11 @@ class SolverDialog(MfxDialog):
|
||||||
|
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout, transient=False)
|
|
||||||
|
|
||||||
self.start_button = self.buttons[0]
|
self.start_button = self.buttons[0]
|
||||||
self.play_button = self.buttons[1]
|
self.play_button = self.buttons[1]
|
||||||
|
|
||||||
#
|
|
||||||
self._reset()
|
self._reset()
|
||||||
self.connectGame(self.app.game)
|
self.connectGame(self.app.game)
|
||||||
|
self.mainloop(focus, kw.timeout, transient=False)
|
||||||
|
|
||||||
def initKw(self, kw):
|
def initKw(self, kw):
|
||||||
strings=[_('&Start'), _('&Play'), _('&New'), _('&Close'),]
|
strings=[_('&Start'), _('&Play'), _('&New'), _('&Close'),]
|
||||||
|
@ -259,6 +256,8 @@ class SolverDialog(MfxDialog):
|
||||||
self.play_button.config(state='disabled')
|
self.play_button.config(state='disabled')
|
||||||
|
|
||||||
def startSolving(self):
|
def startSolving(self):
|
||||||
|
from gettext import ungettext
|
||||||
|
|
||||||
self._reset()
|
self._reset()
|
||||||
game = self.app.game
|
game = self.app.game
|
||||||
solver = game.Solver_Class(game, self) # create solver instance
|
solver = game.Solver_Class(game, self) # create solver instance
|
||||||
|
@ -274,7 +273,10 @@ class SolverDialog(MfxDialog):
|
||||||
solver.computeHints()
|
solver.computeHints()
|
||||||
hints_len = len(solver.hints)-1
|
hints_len = len(solver.hints)-1
|
||||||
if hints_len > 0:
|
if hints_len > 0:
|
||||||
self.result_label['text'] = _('This game is solveable in %s moves.') % hints_len
|
t = ungettext('This game is solveable in %d move.',
|
||||||
|
'This game is solveable in %d moves.',
|
||||||
|
hints_len) % hints_len
|
||||||
|
self.result_label['text'] = t
|
||||||
self.play_button.config(state='normal')
|
self.play_button.config(state='normal')
|
||||||
else:
|
else:
|
||||||
self.result_label['text'] = _('I could not solve this game.')
|
self.result_label['text'] = _('I could not solve this game.')
|
||||||
|
@ -282,9 +284,13 @@ class SolverDialog(MfxDialog):
|
||||||
|
|
||||||
def startPlay(self):
|
def startPlay(self):
|
||||||
self.play_button.config(state='disabled')
|
self.play_button.config(state='disabled')
|
||||||
|
self.start_button.focus()
|
||||||
|
if self.app.game.pause:
|
||||||
|
self.app.menubar.mPause()
|
||||||
self.app.top.tkraise()
|
self.app.top.tkraise()
|
||||||
self.app.top.update_idletasks()
|
self.app.top.update_idletasks()
|
||||||
self.app.top.update()
|
self.app.top.update()
|
||||||
|
self.app.top.after(200)
|
||||||
self.app.game.startDemo(level=3)
|
self.app.game.startDemo(level=3)
|
||||||
|
|
||||||
def setText(self, **kw):
|
def setText(self, **kw):
|
||||||
|
|
|
@ -145,7 +145,7 @@ class SoundOptionsDialog(MfxDialog):
|
||||||
padx=5, pady=5)
|
padx=5, pady=5)
|
||||||
else:
|
else:
|
||||||
frame = Tkinter.Frame(top_frame, bd=2, relief='groove')
|
frame = Tkinter.Frame(top_frame, bd=2, relief='groove')
|
||||||
frame.pack(expand=1, fill='both', padx=5, pady=5)
|
frame.pack(expand=True, fill='both', padx=5, pady=5)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
frame.columnconfigure(1, weight=1)
|
frame.columnconfigure(1, weight=1)
|
||||||
#
|
#
|
||||||
|
|
|
@ -82,9 +82,8 @@ class MfxStatusbar:
|
||||||
self.padx = 0
|
self.padx = 0
|
||||||
|
|
||||||
# util
|
# util
|
||||||
def _createLabel(self, name, side='left',
|
def _createLabel(self, name, side='left', fill='none',
|
||||||
fill='none', expand=0, width=0,
|
expand=False, width=0, tooltip=None):
|
||||||
tooltip=None):
|
|
||||||
if 0:
|
if 0:
|
||||||
frame = Tkinter.Frame(self.frame, bd=1, relief=self.label_relief,
|
frame = Tkinter.Frame(self.frame, bd=1, relief=self.label_relief,
|
||||||
highlightbackground='#9e9a9e',
|
highlightbackground='#9e9a9e',
|
||||||
|
@ -163,7 +162,7 @@ class PysolStatusbar(MfxStatusbar):
|
||||||
):
|
):
|
||||||
self._createLabel(n, tooltip=t, width=w)
|
self._createLabel(n, tooltip=t, width=w)
|
||||||
#
|
#
|
||||||
l = self._createLabel("info", fill='both', expand=1)
|
l = self._createLabel("info", fill='both', expand=True)
|
||||||
##l.config(text="", justify="left", anchor='w')
|
##l.config(text="", justify="left", anchor='w')
|
||||||
l.config(padx=8)
|
l.config(padx=8)
|
||||||
|
|
||||||
|
@ -171,14 +170,14 @@ class PysolStatusbar(MfxStatusbar):
|
||||||
class HelpStatusbar(MfxStatusbar):
|
class HelpStatusbar(MfxStatusbar):
|
||||||
def __init__(self, top):
|
def __init__(self, top):
|
||||||
MfxStatusbar.__init__(self, top, row=4, column=0, columnspan=3)
|
MfxStatusbar.__init__(self, top, row=4, column=0, columnspan=3)
|
||||||
l = self._createLabel("info", fill='both', expand=1)
|
l = self._createLabel("info", fill='both', expand=True)
|
||||||
l.config(justify="left", anchor='w', padx=8)
|
l.config(justify="left", anchor='w', padx=8)
|
||||||
|
|
||||||
|
|
||||||
class HtmlStatusbar(MfxStatusbar):
|
class HtmlStatusbar(MfxStatusbar):
|
||||||
def __init__(self, top, row, column, columnspan):
|
def __init__(self, top, row, column, columnspan):
|
||||||
MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan)
|
MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan)
|
||||||
l = self._createLabel("url", fill='both', expand=1)
|
l = self._createLabel("url", fill='both', expand=True)
|
||||||
l.config(justify="left", anchor='w', padx=8)
|
l.config(justify="left", anchor='w', padx=8)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ class PageTab(Frame):
|
||||||
"""
|
"""
|
||||||
def __init__(self,parent):
|
def __init__(self,parent):
|
||||||
Frame.__init__(self, parent, borderwidth=2, relief=MYRIDGE)
|
Frame.__init__(self, parent, borderwidth=2, relief=MYRIDGE)
|
||||||
self.button=Radiobutton(self, padx=5, pady=5, takefocus=FALSE,
|
self.button=Radiobutton(self, padx=5, pady=5, takefocus=0,
|
||||||
indicatoron=FALSE, highlightthickness=0,
|
indicatoron=FALSE, highlightthickness=0,
|
||||||
borderwidth=0, selectcolor=self.cget('bg'))
|
borderwidth=0, selectcolor=self.cget('bg'))
|
||||||
self.button.pack()
|
self.button.pack()
|
||||||
|
|
|
@ -141,10 +141,10 @@ class MfxCanvas(Tkinter.Canvas):
|
||||||
#
|
#
|
||||||
self.xmargin, self.ymargin = 10, 10
|
self.xmargin, self.ymargin = 10, 10
|
||||||
# resize bg image
|
# resize bg image
|
||||||
self.bind('<Configure>', lambda e: self.set_bg_image())
|
self.bind('<Configure>', self.setBackgroundImage)
|
||||||
|
|
||||||
def set_bg_image(self):
|
def setBackgroundImage(self, event=None):
|
||||||
##print 'set_bg_image', self._bg_img
|
##print 'setBackgroundImage', self._bg_img
|
||||||
if not hasattr(self, '_bg_img'):
|
if not hasattr(self, '_bg_img'):
|
||||||
return
|
return
|
||||||
if not self._bg_img: # solid color
|
if not self._bg_img: # solid color
|
||||||
|
@ -305,7 +305,7 @@ class MfxCanvas(Tkinter.Canvas):
|
||||||
except:
|
except:
|
||||||
return 0
|
return 0
|
||||||
self._stretch_bg_image = stretch
|
self._stretch_bg_image = stretch
|
||||||
self.set_bg_image()
|
self.setBackgroundImage()
|
||||||
else:
|
else:
|
||||||
for id in self.__tiles:
|
for id in self.__tiles:
|
||||||
self.delete(id)
|
self.delete(id)
|
||||||
|
|
|
@ -269,14 +269,15 @@ class HTMLViewer:
|
||||||
# create text widget
|
# create text widget
|
||||||
text_frame = Tkinter.Frame(parent)
|
text_frame = Tkinter.Frame(parent)
|
||||||
text_frame.grid(row=1, column=0, columnspan=4, sticky='nsew')
|
text_frame.grid(row=1, column=0, columnspan=4, sticky='nsew')
|
||||||
|
text_frame.grid_propagate(False)
|
||||||
vbar = Tkinter.Scrollbar(text_frame)
|
vbar = Tkinter.Scrollbar(text_frame)
|
||||||
vbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
|
vbar.pack(side='right', fill='y')
|
||||||
self.text = Tkinter.Text(text_frame,
|
self.text = Tkinter.Text(text_frame,
|
||||||
fg='black', bg='white',
|
fg='black', bg='white',
|
||||||
bd=1, relief='sunken',
|
bd=1, relief='sunken',
|
||||||
cursor=self.defcursor,
|
cursor=self.defcursor,
|
||||||
wrap='word', padx=10)
|
wrap='word', padx=10)
|
||||||
self.text.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1)
|
self.text.pack(side='left', fill='both', expand=True)
|
||||||
self.text["yscrollcommand"] = vbar.set
|
self.text["yscrollcommand"] = vbar.set
|
||||||
vbar["command"] = self.text.yview
|
vbar["command"] = self.text.yview
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,7 @@ class SingleGame_StatsDialog(MfxDialog):
|
||||||
def _createChartInit(self, text):
|
def _createChartInit(self, text):
|
||||||
w, h = self.tab_x[-1]+20, self.tab_y[-1]+20
|
w, h = self.tab_x[-1]+20, self.tab_y[-1]+20
|
||||||
c = Tkinter.Canvas(self.top_frame, width=w, height=h)
|
c = Tkinter.Canvas(self.top_frame, width=w, height=h)
|
||||||
c.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=0, padx=20, pady=10)
|
c.pack(side='top', fill='both', expand=False, padx=20, pady=10)
|
||||||
self.canvas = c
|
self.canvas = c
|
||||||
##self.fg = c.cget("insertbackground")
|
##self.fg = c.cget("insertbackground")
|
||||||
self.fg = c.option_get('foreground', '') or c.cget("insertbackground")
|
self.fg = c.option_get('foreground', '') or c.cget("insertbackground")
|
||||||
|
@ -411,7 +411,6 @@ class CanvasFormatter(PysolStatsFormatter):
|
||||||
y += 2*self.h
|
y += 2*self.h
|
||||||
for result in self.getStatResults(player, sort_by):
|
for result in self.getStatResults(player, sort_by):
|
||||||
gameid = result.pop()
|
gameid = result.pop()
|
||||||
result[0] = _(result[0]) # game name
|
|
||||||
self.pstats(y, result, gameid)
|
self.pstats(y, result, gameid)
|
||||||
y += self.h
|
y += self.h
|
||||||
#
|
#
|
||||||
|
@ -489,7 +488,7 @@ class AllGames_StatsDialog(MfxDialog):
|
||||||
#
|
#
|
||||||
self.sc = AllGames_StatsDialogScrolledCanvas(top_frame,
|
self.sc = AllGames_StatsDialogScrolledCanvas(top_frame,
|
||||||
width=kw.width, height=kw.height)
|
width=kw.width, height=kw.height)
|
||||||
self.sc.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady)
|
self.sc.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
self.nodes = {}
|
self.nodes = {}
|
||||||
self.canvas = self.sc.canvas
|
self.canvas = self.sc.canvas
|
||||||
|
@ -532,7 +531,7 @@ class AllGames_StatsDialog(MfxDialog):
|
||||||
self.fillCanvas(self.player, self.title)
|
self.fillCanvas(self.player, self.title)
|
||||||
|
|
||||||
def singleClick(self, event=None):
|
def singleClick(self, event=None):
|
||||||
id = self.canvas.find_withtag(Tkinter.CURRENT)
|
id = self.canvas.find_withtag('current')
|
||||||
if not id:
|
if not id:
|
||||||
return
|
return
|
||||||
##print 'singleClick:', id, self.nodes.get(id[0])
|
##print 'singleClick:', id, self.nodes.get(id[0])
|
||||||
|
@ -657,7 +656,7 @@ class _TopDialog(MfxDialog):
|
||||||
'highlightbackground': 'black',
|
'highlightbackground': 'black',
|
||||||
}
|
}
|
||||||
frame = Tkinter.Frame(**cnf)
|
frame = Tkinter.Frame(**cnf)
|
||||||
frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10)
|
frame.pack(expand=True, fill='both', padx=10, pady=10)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
cnf['master'] = frame
|
cnf['master'] = frame
|
||||||
cnf['text'] = _('N')
|
cnf['text'] = _('N')
|
||||||
|
@ -718,7 +717,7 @@ class Top_StatsDialog(MfxDialog):
|
||||||
self.createBitmaps(top_frame, kw)
|
self.createBitmaps(top_frame, kw)
|
||||||
|
|
||||||
frame = Tkinter.Frame(top_frame)
|
frame = Tkinter.Frame(top_frame)
|
||||||
frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10)
|
frame.pack(expand=True, fill='both', padx=10, pady=10)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
if (player in app.stats.games_stats and
|
if (player in app.stats.games_stats and
|
||||||
|
|
|
@ -258,7 +258,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas):
|
||||||
bind(self.canvas, "<ButtonPress-1>", self.singleClick)
|
bind(self.canvas, "<ButtonPress-1>", self.singleClick)
|
||||||
bind(self.canvas, "<Double-Button-1>", self.doubleClick)
|
bind(self.canvas, "<Double-Button-1>", self.doubleClick)
|
||||||
##bind(self.canvas, "<ButtonRelease-1>", xxx)
|
##bind(self.canvas, "<ButtonRelease-1>", xxx)
|
||||||
self.pack(fill=Tkinter.BOTH, expand=1)
|
self.pack(fill='both', expand=True)
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
for node in self.keys.get(self.selection_key, []):
|
for node in self.keys.get(self.selection_key, []):
|
||||||
|
@ -266,7 +266,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas):
|
||||||
MfxScrolledCanvas.destroy(self)
|
MfxScrolledCanvas.destroy(self)
|
||||||
|
|
||||||
def findNode(self, event=None):
|
def findNode(self, event=None):
|
||||||
id = self.canvas.find_withtag(Tkinter.CURRENT)
|
id = self.canvas.find_withtag('current')
|
||||||
if id:
|
if id:
|
||||||
return self.nodes.get(id[0])
|
return self.nodes.get(id[0])
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -37,6 +37,7 @@ __all__ = ['MfxDialog',
|
||||||
'MfxMessageDialog',
|
'MfxMessageDialog',
|
||||||
'MfxExceptionDialog',
|
'MfxExceptionDialog',
|
||||||
'MfxSimpleEntry',
|
'MfxSimpleEntry',
|
||||||
|
'PysolAboutDialog',
|
||||||
'MfxTooltip',
|
'MfxTooltip',
|
||||||
'MfxScrolledCanvas',
|
'MfxScrolledCanvas',
|
||||||
'StackDesc',
|
'StackDesc',
|
||||||
|
@ -45,10 +46,11 @@ __all__ = ['MfxDialog',
|
||||||
# imports
|
# imports
|
||||||
import os, sys, time, types
|
import os, sys, time, types
|
||||||
import Tkinter
|
import Tkinter
|
||||||
|
import tkFont
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# PySol imports
|
# PySol imports
|
||||||
from pysollib.mfxutil import destruct, kwdefault, KwStruct
|
from pysollib.mfxutil import destruct, kwdefault, KwStruct, openURL
|
||||||
from pysollib.settings import WIN_SYSTEM
|
from pysollib.settings import WIN_SYSTEM
|
||||||
|
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
|
@ -173,14 +175,15 @@ class MfxDialog: # ex. _ToplevelDialog
|
||||||
|
|
||||||
def createFrames(self, kw):
|
def createFrames(self, kw):
|
||||||
bottom_frame = Tkinter.Frame(self.top)
|
bottom_frame = Tkinter.Frame(self.top)
|
||||||
bottom_frame.pack(side='bottom', fill='both', expand=0, ipadx=3, ipady=3)
|
bottom_frame.pack(side='bottom', fill='both', expand=False,
|
||||||
|
ipadx=3, ipady=3)
|
||||||
if kw.separatorwidth > 0:
|
if kw.separatorwidth > 0:
|
||||||
separator = Tkinter.Frame(self.top, relief="sunken",
|
separator = Tkinter.Frame(self.top, relief="sunken",
|
||||||
height=kw.separatorwidth, width=kw.separatorwidth,
|
height=kw.separatorwidth, width=kw.separatorwidth,
|
||||||
borderwidth=kw.separatorwidth / 2)
|
borderwidth=kw.separatorwidth / 2)
|
||||||
separator.pack(side='bottom', fill='x')
|
separator.pack(side='bottom', fill='x')
|
||||||
top_frame = Tkinter.Frame(self.top)
|
top_frame = Tkinter.Frame(self.top)
|
||||||
top_frame.pack(side='top', fill='both', expand=1)
|
top_frame.pack(side='top', fill='both', expand=True)
|
||||||
return top_frame, bottom_frame
|
return top_frame, bottom_frame
|
||||||
|
|
||||||
def createBitmaps(self, frame, kw):
|
def createBitmaps(self, frame, kw):
|
||||||
|
@ -270,7 +273,7 @@ class MfxMessageDialog(MfxDialog):
|
||||||
self.button = kw.default
|
self.button = kw.default
|
||||||
msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify,
|
msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify,
|
||||||
width=kw.width)
|
width=kw.width)
|
||||||
msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady)
|
msg.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout)
|
self.mainloop(focus, kw.timeout)
|
||||||
|
@ -295,6 +298,39 @@ class MfxExceptionDialog(MfxMessageDialog):
|
||||||
MfxMessageDialog.__init__(self, parent, title, **kw.getKw())
|
MfxMessageDialog.__init__(self, parent, title, **kw.getKw())
|
||||||
|
|
||||||
|
|
||||||
|
# /***********************************************************************
|
||||||
|
# //
|
||||||
|
# ************************************************************************/
|
||||||
|
|
||||||
|
class PysolAboutDialog(MfxMessageDialog):
|
||||||
|
def __init__(self, app, parent, title, **kw):
|
||||||
|
self._url = kw['url']
|
||||||
|
kw = self.initKw(kw)
|
||||||
|
MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
|
||||||
|
top_frame, bottom_frame = self.createFrames(kw)
|
||||||
|
self.createBitmaps(top_frame, kw)
|
||||||
|
#
|
||||||
|
self.button = kw.default
|
||||||
|
frame = Tkinter.Frame(top_frame)
|
||||||
|
frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady)
|
||||||
|
msg = Tkinter.Label(frame, text=kw.text, justify=kw.justify,
|
||||||
|
width=kw.width)
|
||||||
|
msg.pack(fill='both', expand=True)
|
||||||
|
|
||||||
|
font = tkFont.Font(parent, app.getFont('default'))
|
||||||
|
font.configure(underline=True)
|
||||||
|
url_label = Tkinter.Label(frame, text=kw.url, font=font,
|
||||||
|
foreground='blue', cursor='hand2')
|
||||||
|
url_label.pack()
|
||||||
|
url_label.bind('<1>', self._urlClicked)
|
||||||
|
#
|
||||||
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
|
self.mainloop(focus, kw.timeout)
|
||||||
|
|
||||||
|
def _urlClicked(self, event):
|
||||||
|
openURL(self._url)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
@ -313,7 +349,7 @@ class MfxSimpleEntry(MfxDialog):
|
||||||
w = kw.get("e_width", 0) # width in characters
|
w = kw.get("e_width", 0) # width in characters
|
||||||
self.var = Tkinter.Entry(top_frame, exportselection=1, width=w)
|
self.var = Tkinter.Entry(top_frame, exportselection=1, width=w)
|
||||||
self.var.insert(0, value)
|
self.var.insert(0, value)
|
||||||
self.var.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady)
|
self.var.pack(side='top', padx=kw.padx, pady=kw.pady)
|
||||||
#
|
#
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
focus = self.var
|
focus = self.var
|
||||||
|
@ -355,8 +391,8 @@ class MfxTooltip:
|
||||||
self.timeout = 800 # milliseconds
|
self.timeout = 800 # milliseconds
|
||||||
self.cancel_timeout = 5000
|
self.cancel_timeout = 5000
|
||||||
self.leave_timeout = 400
|
self.leave_timeout = 400
|
||||||
self.relief = Tkinter.SOLID
|
self.relief = 'solid'
|
||||||
self.justify = Tkinter.LEFT
|
self.justify = 'left'
|
||||||
self.fg = "#000000"
|
self.fg = "#000000"
|
||||||
self.bg = "#ffffe0"
|
self.bg = "#ffffe0"
|
||||||
self.xoffset = 0
|
self.xoffset = 0
|
||||||
|
@ -403,7 +439,7 @@ class MfxTooltip:
|
||||||
if self.tooltip or not self.text:
|
if self.tooltip or not self.text:
|
||||||
return
|
return
|
||||||
## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)):
|
## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)):
|
||||||
## if self.widget["state"] == Tkinter.DISABLED:
|
## if self.widget["state"] == 'disabled':
|
||||||
## return
|
## return
|
||||||
##x = self.widget.winfo_rootx()
|
##x = self.widget.winfo_rootx()
|
||||||
x = self.widget.winfo_pointerx()
|
x = self.widget.winfo_pointerx()
|
||||||
|
@ -429,36 +465,24 @@ class MfxTooltip:
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class MfxScrolledCanvas:
|
class MfxScrolledCanvas:
|
||||||
def __init__(self, parent, hbar=2, vbar=2, **kw):
|
def __init__(self, parent, hbar=True, vbar=True, propagate=False, **kw):
|
||||||
kwdefault(kw, highlightthickness=0, bd=1, relief='sunken')
|
kwdefault(kw, highlightthickness=0, bd=1, relief='sunken')
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.createFrame(kw)
|
self.createFrame(kw)
|
||||||
self.canvas = None
|
self.canvas = None
|
||||||
self.hbar = None
|
self.hbar = None
|
||||||
self.hbar_mode = hbar
|
|
||||||
self.vbar = None
|
self.vbar = None
|
||||||
self.vbar_mode = vbar
|
self.hbar_show = False
|
||||||
self.hbar_show = 0
|
self.vbar_show = False
|
||||||
self.vbar_show = 0
|
|
||||||
self.resize_pending = 0
|
|
||||||
self.timer = None
|
|
||||||
self.createCanvas(kw)
|
self.createCanvas(kw)
|
||||||
self.frame.grid_rowconfigure(0, weight=1)
|
self.frame.grid_rowconfigure(0, weight=1)
|
||||||
self.frame.grid_columnconfigure(0, weight=1)
|
self.frame.grid_columnconfigure(0, weight=1)
|
||||||
|
self.frame.grid_propagate(propagate)
|
||||||
if hbar:
|
if hbar:
|
||||||
if hbar == 3:
|
|
||||||
w = 21
|
|
||||||
self.frame.grid_rowconfigure(1, minsize=w)
|
|
||||||
self.createHbar()
|
self.createHbar()
|
||||||
if not vbar:
|
|
||||||
bind(self.hbar, "<Map>", self._mapBar)
|
|
||||||
self.bindHbar()
|
self.bindHbar()
|
||||||
if vbar:
|
if vbar:
|
||||||
if vbar == 3:
|
|
||||||
w = 21
|
|
||||||
self.frame.grid_columnconfigure(1, minsize=w)
|
|
||||||
self.createVbar()
|
self.createVbar()
|
||||||
bind(self.vbar, "<Map>", self._mapBar)
|
|
||||||
self.bindVbar()
|
self.bindVbar()
|
||||||
###self.canvas.focus_set()
|
###self.canvas.focus_set()
|
||||||
|
|
||||||
|
@ -467,8 +491,6 @@ class MfxScrolledCanvas:
|
||||||
#
|
#
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
after_cancel(self.timer)
|
|
||||||
self.timer = None
|
|
||||||
self.unbind_all()
|
self.unbind_all()
|
||||||
self.canvas.destroy()
|
self.canvas.destroy()
|
||||||
self.frame.destroy()
|
self.frame.destroy()
|
||||||
|
@ -534,14 +556,18 @@ class MfxScrolledCanvas:
|
||||||
self.canvas = MfxCanvas(self.frame, **kw)
|
self.canvas = MfxCanvas(self.frame, **kw)
|
||||||
self.canvas.grid(row=0, column=0, sticky="news")
|
self.canvas.grid(row=0, column=0, sticky="news")
|
||||||
def createHbar(self):
|
def createHbar(self):
|
||||||
self.hbar = Tkinter.Scrollbar(self.frame, name="hbar",
|
self.hbar = Tkinter.Scrollbar(self.frame, takefocus=0,
|
||||||
takefocus=0, orient="horizontal")
|
orient="horizontal")
|
||||||
self.canvas["xscrollcommand"] = self._setHbar
|
self.canvas["xscrollcommand"] = self._setHbar
|
||||||
self.hbar["command"] = self.canvas.xview
|
self.hbar["command"] = self.canvas.xview
|
||||||
|
self.hbar.grid(row=1, column=0, sticky="we")
|
||||||
|
self.hbar.grid_remove()
|
||||||
def createVbar(self):
|
def createVbar(self):
|
||||||
self.vbar = Tkinter.Scrollbar(self.frame, name="vbar", takefocus=0)
|
self.vbar = Tkinter.Scrollbar(self.frame, takefocus=0)
|
||||||
self.canvas["yscrollcommand"] = self._setVbar
|
self.canvas["yscrollcommand"] = self._setVbar
|
||||||
self.vbar["command"] = self.canvas.yview
|
self.vbar["command"] = self.canvas.yview
|
||||||
|
self.vbar.grid(row=0, column=1, sticky="ns")
|
||||||
|
self.vbar.grid_remove()
|
||||||
def bindHbar(self, w=None):
|
def bindHbar(self, w=None):
|
||||||
if w is None:
|
if w is None:
|
||||||
w = self.canvas
|
w = self.canvas
|
||||||
|
@ -564,70 +590,33 @@ class MfxScrolledCanvas:
|
||||||
# don't work on Linux
|
# don't work on Linux
|
||||||
#bind(w, '<MouseWheel>', self.mouse_wheel)
|
#bind(w, '<MouseWheel>', self.mouse_wheel)
|
||||||
|
|
||||||
|
|
||||||
def mouse_wheel(self, *args):
|
def mouse_wheel(self, *args):
|
||||||
print 'MfxScrolledCanvas.mouse_wheel', args
|
print 'MfxScrolledCanvas.mouse_wheel', args
|
||||||
|
|
||||||
def _mapBar(self, event):
|
def _setHbar(self, first, last):
|
||||||
# see: autoscroll.tcl, http://mini.net/cgi-bin/wikit/950.html
|
sb = self.hbar
|
||||||
top = event.widget.winfo_toplevel()
|
|
||||||
g = top.wm_geometry()
|
|
||||||
if self.resize_pending:
|
|
||||||
self.resize_pending = 0
|
|
||||||
self.canvas.update()
|
|
||||||
self.canvas.update_idletasks()
|
|
||||||
top.wm_geometry(g)
|
|
||||||
|
|
||||||
def _setHbar(self, *args):
|
|
||||||
self.canvas.update()
|
|
||||||
self.hbar.set(*self.canvas.xview())
|
|
||||||
self.showHbar()
|
|
||||||
##self.hbar.update_idletasks()
|
|
||||||
def _setVbar(self, *args):
|
|
||||||
self.canvas.update()
|
|
||||||
self.vbar.set(*self.canvas.yview())
|
|
||||||
self.showVbar()
|
|
||||||
##self.vbar.update_idletasks()
|
|
||||||
|
|
||||||
def showHbar(self, show=-1):
|
|
||||||
if not self.hbar:
|
|
||||||
return 0
|
|
||||||
if show < 0:
|
|
||||||
show = self.hbar_mode
|
|
||||||
if show > 1:
|
|
||||||
if not self.canvas.winfo_ismapped():
|
if not self.canvas.winfo_ismapped():
|
||||||
return 0
|
sb.set(first, last)
|
||||||
##self.canvas.update()
|
return
|
||||||
view = self.canvas.xview()
|
if float(first) <= 0 and float(last) >= 1:
|
||||||
show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001
|
sb.grid_remove()
|
||||||
if show == self.hbar_show:
|
self.hbar_show = False
|
||||||
return 0
|
|
||||||
if show:
|
|
||||||
self.hbar.grid(row=1, column=0, sticky="we")
|
|
||||||
else:
|
else:
|
||||||
self.hbar.grid_forget()
|
sb.grid()
|
||||||
self.hbar_show = show
|
self.hbar_show = True
|
||||||
return 1
|
sb.set(first, last)
|
||||||
|
def _setVbar(self, first, last):
|
||||||
def showVbar(self, show=-1):
|
sb = self.vbar
|
||||||
if not self.vbar:
|
|
||||||
return 0
|
|
||||||
if show < 0:
|
|
||||||
show = self.vbar_mode
|
|
||||||
if show > 1:
|
|
||||||
if not self.canvas.winfo_ismapped():
|
if not self.canvas.winfo_ismapped():
|
||||||
return 0
|
sb.set(first, last)
|
||||||
##self.canvas.update()
|
return
|
||||||
view = self.canvas.yview()
|
if float(first) <= 0 and float(last) >= 1:
|
||||||
show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001
|
sb.grid_remove()
|
||||||
if show == self.vbar_show:
|
self.vbar_show = False
|
||||||
return 0
|
|
||||||
if show:
|
|
||||||
self.vbar.grid(row=0, column=1, sticky="ns")
|
|
||||||
else:
|
else:
|
||||||
self.vbar.grid_forget()
|
sb.grid()
|
||||||
self.vbar_show = show
|
self.vbar_show = True
|
||||||
return 1
|
sb.set(first, last)
|
||||||
|
|
||||||
def _xview(self, *args):
|
def _xview(self, *args):
|
||||||
if self.hbar_show: self.canvas.xview(*args)
|
if self.hbar_show: self.canvas.xview(*args)
|
||||||
|
|
|
@ -34,9 +34,6 @@
|
||||||
##---------------------------------------------------------------------------##
|
##---------------------------------------------------------------------------##
|
||||||
|
|
||||||
__all__ = ['TclError',
|
__all__ = ['TclError',
|
||||||
'MfxCheckMenuItem',
|
|
||||||
'MfxRadioMenuItem',
|
|
||||||
'StringVar',
|
|
||||||
'MfxRoot']
|
'MfxRoot']
|
||||||
|
|
||||||
# imports
|
# imports
|
||||||
|
@ -53,32 +50,6 @@ from tkutil import after_idle
|
||||||
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // menubar
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
class MfxCheckMenuItem(Tkinter.BooleanVar):
|
|
||||||
def __init__(self, menubar, path=None):
|
|
||||||
Tkinter.BooleanVar.__init__(self)
|
|
||||||
def set(self, value):
|
|
||||||
if not value or value == "false": value = 0
|
|
||||||
##print value, type(value)
|
|
||||||
Tkinter.BooleanVar.set(self, value)
|
|
||||||
|
|
||||||
|
|
||||||
class MfxRadioMenuItem(Tkinter.IntVar):
|
|
||||||
def __init__(self, menubar, path=None):
|
|
||||||
Tkinter.IntVar.__init__(self)
|
|
||||||
def set(self, value):
|
|
||||||
Tkinter.IntVar.set(self, value)
|
|
||||||
|
|
||||||
|
|
||||||
## BooleanVar = Tkinter.BooleanVar
|
|
||||||
## IntVar = Tkinter.IntVar
|
|
||||||
|
|
||||||
StringVar = Tkinter.StringVar
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // Wrapper class for Tk.
|
# // Wrapper class for Tk.
|
||||||
# // Required so that a Game will get properly destroyed.
|
# // Required so that a Game will get properly destroyed.
|
||||||
|
|
|
@ -69,7 +69,7 @@ class AbstractToolbarButton:
|
||||||
return
|
return
|
||||||
self.visible = True
|
self.visible = True
|
||||||
padx, pady = 2, 2
|
padx, pady = 2, 2
|
||||||
if orient == Tkinter.HORIZONTAL:
|
if orient == 'horizontal':
|
||||||
self.grid(row=0,
|
self.grid(row=0,
|
||||||
column=self.position,
|
column=self.position,
|
||||||
ipadx=padx, ipady=pady,
|
ipadx=padx, ipady=pady,
|
||||||
|
@ -112,7 +112,7 @@ class ToolbarSeparator(Tkinter.Frame):
|
||||||
height = 4
|
height = 4
|
||||||
padx = 6
|
padx = 6
|
||||||
pady = 6
|
pady = 6
|
||||||
if orient == Tkinter.HORIZONTAL:
|
if orient == 'horizontal':
|
||||||
self.config(width=width, height=height)
|
self.config(width=width, height=height)
|
||||||
self.grid(row=0,
|
self.grid(row=0,
|
||||||
column=self.position,
|
column=self.position,
|
||||||
|
@ -144,7 +144,7 @@ class ToolbarLabel(Tkinter.Message):
|
||||||
return
|
return
|
||||||
self.visible = True
|
self.visible = True
|
||||||
padx, pady = TkSettings.toolbar_label_padding
|
padx, pady = TkSettings.toolbar_label_padding
|
||||||
if orient == Tkinter.HORIZONTAL:
|
if orient == 'horizontal':
|
||||||
self.grid(row=0,
|
self.grid(row=0,
|
||||||
column=self.position,
|
column=self.position,
|
||||||
padx=padx, pady=pady,
|
padx=padx, pady=pady,
|
||||||
|
@ -166,8 +166,7 @@ class ToolbarLabel(Tkinter.Message):
|
||||||
|
|
||||||
class PysolToolbar(PysolToolbarActions):
|
class PysolToolbar(PysolToolbarActions):
|
||||||
|
|
||||||
def __init__(self, top, dir, size=0, relief=Tkinter.FLAT,
|
def __init__(self, top, dir, size=0, relief='flat', compound='none'):
|
||||||
compound=Tkinter.NONE):
|
|
||||||
|
|
||||||
PysolToolbarActions.__init__(self)
|
PysolToolbarActions.__init__(self)
|
||||||
|
|
||||||
|
@ -179,7 +178,7 @@ class PysolToolbar(PysolToolbarActions):
|
||||||
self.dir = dir
|
self.dir = dir
|
||||||
self.size = size
|
self.size = size
|
||||||
self.compound = compound
|
self.compound = compound
|
||||||
self.orient=Tkinter.HORIZONTAL
|
self.orient = 'horizontal'
|
||||||
self.button_pad = 2
|
self.button_pad = 2
|
||||||
#
|
#
|
||||||
self.frame = Tkinter.Frame(top, relief=TkSettings.toolbar_relief,
|
self.frame = Tkinter.Frame(top, relief=TkSettings.toolbar_relief,
|
||||||
|
@ -401,7 +400,7 @@ class PysolToolbar(PysolToolbarActions):
|
||||||
# right
|
# right
|
||||||
pack_func(row=1, column=2, sticky='ns')
|
pack_func(row=1, column=2, sticky='ns')
|
||||||
# set orient
|
# set orient
|
||||||
orient = side in (1, 2) and Tkinter.HORIZONTAL or Tkinter.VERTICAL
|
orient = side in (1, 2) and 'horizontal' or 'vertical'
|
||||||
self._setOrient(orient)
|
self._setOrient(orient)
|
||||||
self.side = side
|
self.side = side
|
||||||
return 1
|
return 1
|
||||||
|
@ -516,6 +515,6 @@ class PysolToolbar(PysolToolbarActions):
|
||||||
if self.compound == 'text':
|
if self.compound == 'text':
|
||||||
return 0
|
return 0
|
||||||
size = self.size
|
size = self.size
|
||||||
comp = int(self.compound in (Tkinter.TOP, Tkinter.BOTTOM))
|
comp = int(self.compound in ('top', 'bottom'))
|
||||||
return int((size+comp) != 0)
|
return int((size+comp) != 0)
|
||||||
|
|
||||||
|
|
|
@ -53,9 +53,16 @@ class initRootWindow(baseInitRootWindow):
|
||||||
color = style.lookup('.', 'background')
|
color = style.lookup('.', 'background')
|
||||||
if color:
|
if color:
|
||||||
root.tk_setPalette(color)
|
root.tk_setPalette(color)
|
||||||
|
|
||||||
|
root.option_add('*Menu.borderWidth', 1, 60)
|
||||||
|
root.option_add('*Menu.activeBorderWidth', 1, 60)
|
||||||
color = style.lookup('.', 'background', 'active')
|
color = style.lookup('.', 'background', 'active')
|
||||||
if color:
|
if color:
|
||||||
root.option_add('*Menu.activeBackground', color)
|
root.option_add('*Menu.activeBackground', color, 60)
|
||||||
|
|
||||||
|
root.option_add('*Listbox.background', 'white', 60)
|
||||||
|
root.option_add('*Listbox.foreground', 'black', 60)
|
||||||
|
|
||||||
font = root.option_get('font', PACKAGE)
|
font = root.option_get('font', PACKAGE)
|
||||||
if font:
|
if font:
|
||||||
# use font from xrdb
|
# use font from xrdb
|
||||||
|
@ -75,10 +82,10 @@ class initRootWindow(baseInitRootWindow):
|
||||||
if fn:
|
if fn:
|
||||||
root.option_add('*font', font)
|
root.option_add('*font', font)
|
||||||
app.opt.fonts['default'] = fn
|
app.opt.fonts['default'] = fn
|
||||||
root.option_add('*Menu.borderWidth', 1, 60)
|
if app.opt.tile_theme in ('clam', 'clearlooks'):
|
||||||
root.option_add('*Menu.activeBorderWidth', 1, 60)
|
|
||||||
if app.opt.tile_theme == 'clam':
|
|
||||||
root.wm_minsize(550, 360)
|
root.wm_minsize(550, 360)
|
||||||
|
style.configure('TLabelframe', labeloutside=False,
|
||||||
|
labelmargins=(8, 0, 8, 0))
|
||||||
#
|
#
|
||||||
else:
|
else:
|
||||||
root.option_add('*Entry.background', 'white', 60)
|
root.option_add('*Entry.background', 'white', 60)
|
||||||
|
|
|
@ -168,13 +168,6 @@ FoundDir = WizSetting(
|
||||||
label = _('Direction:'),
|
label = _('Direction:'),
|
||||||
var_name = 'found_dir',
|
var_name = 'found_dir',
|
||||||
)
|
)
|
||||||
FoundWrap = WizSetting(
|
|
||||||
values_map = (0, 1),
|
|
||||||
default = 0,
|
|
||||||
label = _('Wrapping:'),
|
|
||||||
var_name = 'found_wrap',
|
|
||||||
widget = 'check',
|
|
||||||
)
|
|
||||||
FoundMaxMove = WizSetting(
|
FoundMaxMove = WizSetting(
|
||||||
values_map = ((n_('None'), 0,), (n_('Top card'), 1)),
|
values_map = ((n_('None'), 0,), (n_('Top card'), 1)),
|
||||||
default = n_('Top card'),
|
default = n_('Top card'),
|
||||||
|
@ -328,7 +321,6 @@ WizardWidgets = (
|
||||||
FoundType,
|
FoundType,
|
||||||
FoundBaseCard,
|
FoundBaseCard,
|
||||||
FoundDir,
|
FoundDir,
|
||||||
##FoundWrap,
|
|
||||||
FoundMaxMove,
|
FoundMaxMove,
|
||||||
FoundEqual,
|
FoundEqual,
|
||||||
_('Tableau'),
|
_('Tableau'),
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -44,8 +44,10 @@ if os.name == 'posix':
|
||||||
for l in ('ru', 'ru_RU'):
|
for l in ('ru', 'ru_RU'):
|
||||||
data_files.append(('share/locale/%s/LC_MESSAGES' % l,
|
data_files.append(('share/locale/%s/LC_MESSAGES' % l,
|
||||||
['locale/%s/LC_MESSAGES/pysol.mo' % l]))
|
['locale/%s/LC_MESSAGES/pysol.mo' % l]))
|
||||||
|
data_files.append((data_dir, ['data/pysolfc.glade']))
|
||||||
|
|
||||||
##from pprint import pprint; pprint(data_files)
|
##from pprint import pprint; pprint(data_files)
|
||||||
|
##import sys; sys.exit()
|
||||||
|
|
||||||
long_description = '''\
|
long_description = '''\
|
||||||
PySol is a solitaire card game. Its features include support for many
|
PySol is a solitaire card game. Its features include support for many
|
||||||
|
|
Loading…
Add table
Reference in a new issue