mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-05 00:02:29 -04:00
* improved GTK bindings; menu, stats-dialog, colors-dialog, timeouts-dialog
git-svn-id: https://pysolfc.svn.sourceforge.net/svnroot/pysolfc/PySolFC/trunk@53 39dd0a4e-7c14-0410-91b3-c4f2d318f732
This commit is contained in:
parent
b2ee652928
commit
e4e11cc237
23 changed files with 1066 additions and 489 deletions
|
@ -6,7 +6,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PySol 0.0.1\n"
|
"Project-Id-Version: PySol 0.0.1\n"
|
||||||
"POT-Creation-Date: Fri Aug 11 02:14:56 2006\n"
|
"POT-Creation-Date: Fri Aug 11 02:14:56 2006\n"
|
||||||
"PO-Revision-Date: 2006-08-11 02:13+0400\n"
|
"PO-Revision-Date: 2006-08-20 17:42+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"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
@ -2386,7 +2386,7 @@ msgstr "Разрешить показывать карты &одного дос
|
||||||
|
|
||||||
#: pysollib/tk/menubar.py:353
|
#: pysollib/tk/menubar.py:353
|
||||||
msgid "Highlight &no matching"
|
msgid "Highlight &no matching"
|
||||||
msgstr "Подсветка отсутствия &совпадения:"
|
msgstr "Подсветка отсутствия &совпадения"
|
||||||
|
|
||||||
#: pysollib/tk/menubar.py:355
|
#: pysollib/tk/menubar.py:355
|
||||||
msgid "&Show removed tiles (in Mahjongg games)"
|
msgid "&Show removed tiles (in Mahjongg games)"
|
||||||
|
|
|
@ -378,12 +378,6 @@ class PysolMenubarActions:
|
||||||
self.game.endGame()
|
self.game.endGame()
|
||||||
self.game.quitGame(id, random=random)
|
self.game.quitGame(id, random=random)
|
||||||
|
|
||||||
def mSelectGame(self, *args):
|
|
||||||
self._mSelectGame(self.tkopt.gameid.get())
|
|
||||||
|
|
||||||
def mSelectGamePopular(self, *args):
|
|
||||||
self._mSelectGame(self.tkopt.gameid_popular.get())
|
|
||||||
|
|
||||||
def _mNewGameBySeed(self, seed, origin):
|
def _mNewGameBySeed(self, seed, origin):
|
||||||
try:
|
try:
|
||||||
random = constructRandom(seed)
|
random = constructRandom(seed)
|
||||||
|
@ -762,19 +756,19 @@ class PysolMenubarActions:
|
||||||
def mHint(self, *args):
|
def mHint(self, *args):
|
||||||
if self._cancelDrag(): return
|
if self._cancelDrag(): return
|
||||||
if self.app.opt.hint:
|
if self.app.opt.hint:
|
||||||
if self.game.showHint(0, self.app.opt.hint_sleep):
|
if self.game.showHint(0, self.app.opt.timeouts['hint']):
|
||||||
self.game.stats.hints += 1
|
self.game.stats.hints += 1
|
||||||
|
|
||||||
def mHint1(self, *args):
|
def mHint1(self, *args):
|
||||||
if self._cancelDrag(): return
|
if self._cancelDrag(): return
|
||||||
if self.app.opt.hint:
|
if self.app.opt.hint:
|
||||||
if self.game.showHint(1, self.app.opt.hint_sleep):
|
if self.game.showHint(1, self.app.opt.timeouts['hint']):
|
||||||
self.game.stats.hints += 1
|
self.game.stats.hints += 1
|
||||||
|
|
||||||
def mHighlightPiles(self, *args):
|
def mHighlightPiles(self, *args):
|
||||||
if self._cancelDrag(): return
|
if self._cancelDrag(): return
|
||||||
if self.app.opt.highlight_piles:
|
if self.app.opt.highlight_piles:
|
||||||
if self.game.highlightPiles(self.app.opt.highlight_piles_sleep):
|
if self.game.highlightPiles(self.app.opt.timeouts['highlight_piles']):
|
||||||
self.game.stats.highlight_piles += 1
|
self.game.stats.highlight_piles += 1
|
||||||
|
|
||||||
def mDemo(self, *args):
|
def mDemo(self, *args):
|
||||||
|
@ -787,7 +781,6 @@ class PysolMenubarActions:
|
||||||
self._mDemo(mixed=1)
|
self._mDemo(mixed=1)
|
||||||
|
|
||||||
def _mDemo(self, mixed):
|
def _mDemo(self, mixed):
|
||||||
if self._cancelDrag(): return
|
|
||||||
if self.changed():
|
if self.changed():
|
||||||
# only ask if there have been no demo moves or hints yet
|
# only ask if there have been no demo moves or hints yet
|
||||||
if self.game.stats.demo_moves == 0 and self.game.stats.hints == 0:
|
if self.game.stats.demo_moves == 0 and self.game.stats.hints == 0:
|
||||||
|
@ -814,134 +807,36 @@ class PysolMenubarActions:
|
||||||
self.game.updateStatus(player=self.app.opt.player)
|
self.game.updateStatus(player=self.app.opt.player)
|
||||||
self.game.updateStatus(stats=self.app.stats.getStats(self.app.opt.player, self.game.id))
|
self.game.updateStatus(stats=self.app.stats.getStats(self.app.opt.player, self.game.id))
|
||||||
|
|
||||||
def mOptAutoFaceUp(self, *args):
|
|
||||||
if self._cancelDrag(): return
|
|
||||||
self.app.opt.autofaceup = self.tkopt.autofaceup.get()
|
|
||||||
if self.app.opt.autofaceup:
|
|
||||||
self.game.autoPlay()
|
|
||||||
|
|
||||||
def mOptAutoDrop(self, *args):
|
|
||||||
if self._cancelDrag(): return
|
|
||||||
self.app.opt.autodrop = self.tkopt.autodrop.get()
|
|
||||||
if self.app.opt.autodrop:
|
|
||||||
self.game.autoPlay()
|
|
||||||
|
|
||||||
def mOptAutoDeal(self, *args):
|
|
||||||
if self._cancelDrag(): return
|
|
||||||
self.app.opt.autodeal = self.tkopt.autodeal.get()
|
|
||||||
if self.app.opt.autodeal:
|
|
||||||
self.game.autoPlay()
|
|
||||||
|
|
||||||
def mOptQuickPlay(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.quickplay = self.tkopt.quickplay.get()
|
|
||||||
|
|
||||||
def mOptEnableUndo(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.undo = self.tkopt.undo.get()
|
|
||||||
self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableBookmarks(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.bookmarks = self.tkopt.bookmarks.get()
|
|
||||||
self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableHint(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.hint = self.tkopt.hint.get()
|
|
||||||
self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableHighlightPiles(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.highlight_piles = self.tkopt.highlight_piles.get()
|
|
||||||
self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableHighlightCards(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.highlight_cards = self.tkopt.highlight_cards.get()
|
|
||||||
self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableHighlightSameRank(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.highlight_samerank = self.tkopt.highlight_samerank.get()
|
|
||||||
##self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptEnableHighlightNotMatching(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.highlight_not_matching = self.tkopt.highlight_not_matching.get()
|
|
||||||
##self.game.updateMenus()
|
|
||||||
|
|
||||||
def mOptShrinkFaceDown(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.shrink_face_down = self.tkopt.shrink_face_down.get()
|
|
||||||
self.game.endGame(bookmark=1)
|
|
||||||
self.game.quitGame(bookmark=1)
|
|
||||||
|
|
||||||
def mOptShadeFilledStacks(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.shade_filled_stacks = self.tkopt.shade_filled_stacks.get()
|
|
||||||
self.game.endGame(bookmark=1)
|
|
||||||
self.game.quitGame(bookmark=1)
|
|
||||||
|
|
||||||
def mOptMahjonggShowRemoved(self, *args):
|
|
||||||
if self._cancelDrag(): return
|
|
||||||
self.app.opt.mahjongg_show_removed = self.tkopt.mahjongg_show_removed.get()
|
|
||||||
##self.game.updateMenus()
|
|
||||||
self.game.endGame(bookmark=1)
|
|
||||||
self.game.quitGame(bookmark=1)
|
|
||||||
|
|
||||||
def mOptShisenShowHint(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.shisen_show_hint = self.tkopt.shisen_show_hint.get()
|
|
||||||
##self.game.updateMenus()
|
|
||||||
|
|
||||||
## def mOptSound(self, *args):
|
|
||||||
## if self._cancelDrag(break_pause=False): return
|
|
||||||
## self.app.opt.sound = self.tkopt.sound.get()
|
|
||||||
## if not self.app.opt.sound:
|
|
||||||
## self.app.audio.stopAll()
|
|
||||||
|
|
||||||
def mOptSoundDialog(self, *args):
|
def mOptSoundDialog(self, *args):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
d = SoundOptionsDialog(self.top, _("Sound settings"), self.app)
|
d = SoundOptionsDialog(self.top, _("Sound settings"), self.app)
|
||||||
self.tkopt.sound.set(self.app.opt.sound)
|
self.tkopt.sound.set(self.app.opt.sound)
|
||||||
|
|
||||||
def mOptAnimations(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.animations = self.tkopt.animations.get()
|
|
||||||
|
|
||||||
def mOptShadow(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.shadow = self.tkopt.shadow.get()
|
|
||||||
|
|
||||||
def mOptShade(self, *args):
|
|
||||||
if self._cancelDrag(break_pause=False): return
|
|
||||||
self.app.opt.shade = self.tkopt.shade.get()
|
|
||||||
|
|
||||||
## def mOptIrregularPiles(self, *args):
|
## def mOptIrregularPiles(self, *args):
|
||||||
## if self._cancelDrag(): return
|
## if self._cancelDrag(): return
|
||||||
## self.app.opt.irregular_piles = self.tkopt.irregular_piles.get()
|
## self.app.opt.irregular_piles = self.tkopt.irregular_piles.get()
|
||||||
|
|
||||||
def mOptColorsOptions(self, *args):
|
def mOptColors(self, *args):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
d = ColorsDialog(self.top, _("Set colors"), self.app)
|
d = ColorsDialog(self.top, _("Set colors"), self.app)
|
||||||
table_text_color = self.app.opt.table_text_color
|
text_color = self.app.opt.colors['text']
|
||||||
table_text_color_value = self.app.opt.table_text_color_value
|
use_default_text_color = self.app.opt.use_default_text_color
|
||||||
if d.status == 0 and d.button == 0:
|
if d.status == 0 and d.button == 0:
|
||||||
self.app.opt.table_text_color = d.table_text_color
|
self.app.opt.use_default_text_color = d.use_default_color
|
||||||
self.app.opt.table_text_color_value = d.table_text_color_value
|
self.app.opt.colors['text'] = d.text_color
|
||||||
##self.app.opt.table_color = d.table_color
|
self.app.opt.colors['piles'] = d.piles_color
|
||||||
self.app.opt.highlight_piles_colors = d.highlight_piles_colors
|
self.app.opt.colors['cards_1'] = d.cards_1_color
|
||||||
self.app.opt.highlight_cards_colors = d.highlight_cards_colors
|
self.app.opt.colors['cards_2'] = d.cards_2_color
|
||||||
self.app.opt.highlight_samerank_colors = d.highlight_samerank_colors
|
self.app.opt.colors['samerank_1'] = d.samerank_1_color
|
||||||
self.app.opt.hintarrow_color = d.hintarrow_color
|
self.app.opt.colors['samerank_2'] = d.samerank_2_color
|
||||||
self.app.opt.highlight_not_matching_color = d.highlight_not_matching_color
|
self.app.opt.colors['hintarrow'] = d.hintarrow_color
|
||||||
|
self.app.opt.colors['not_matching'] = d.not_matching_color
|
||||||
#
|
#
|
||||||
if table_text_color != self.app.opt.table_text_color \
|
if (text_color != self.app.opt.colors['text'] or
|
||||||
or table_text_color_value != self.app.opt.table_text_color_value:
|
use_default_text_color != self.app.opt.use_default_text_color):
|
||||||
self.app.setTile(self.tkopt.tabletile.get(), 1)
|
self.app.setTile(self.tkopt.tabletile.get(), 1)
|
||||||
|
|
||||||
def mOptFontsOptions(self, *args):
|
def mOptFonts(self, *args):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
d = FontsDialog(self.top, _("Set fonts"), self.app)
|
d = FontsDialog(self.top, _("Set fonts"), self.app)
|
||||||
if d.status == 0 and d.button == 0:
|
if d.status == 0 and d.button == 0:
|
||||||
|
@ -950,16 +845,16 @@ class PysolMenubarActions:
|
||||||
self.game.endGame(bookmark=1)
|
self.game.endGame(bookmark=1)
|
||||||
self.game.quitGame(bookmark=1)
|
self.game.quitGame(bookmark=1)
|
||||||
|
|
||||||
def mOptTimeoutsOptions(self, *args):
|
def mOptTimeouts(self, *args):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
d = TimeoutsDialog(self.top, _("Set timeouts"), self.app)
|
d = TimeoutsDialog(self.top, _("Set timeouts"), self.app)
|
||||||
if d.status == 0 and d.button == 0:
|
if d.status == 0 and d.button == 0:
|
||||||
self.app.opt.demo_sleep = d.demo_sleep
|
self.app.opt.timeouts['demo'] = d.demo_timeout
|
||||||
self.app.opt.hint_sleep = d.hint_sleep
|
self.app.opt.timeouts['hint'] = d.hint_timeout
|
||||||
self.app.opt.raise_card_sleep = d.raise_card_sleep
|
self.app.opt.timeouts['raise_card'] = d.raise_card_timeout
|
||||||
self.app.opt.highlight_piles_sleep = d.highlight_piles_sleep
|
self.app.opt.timeouts['highlight_piles'] = d.highlight_piles_timeout
|
||||||
self.app.opt.highlight_cards_sleep = d.highlight_cards_sleep
|
self.app.opt.timeouts['highlight_cards'] = d.highlight_cards_timeout
|
||||||
self.app.opt.highlight_samerank_sleep = d.highlight_samerank_sleep
|
self.app.opt.timeouts['highlight_samerank'] = d.highlight_samerank_timeout
|
||||||
|
|
||||||
## def mOptSave(self, *args):
|
## def mOptSave(self, *args):
|
||||||
## if self._cancelDrag(break_pause=False): return
|
## if self._cancelDrag(break_pause=False): return
|
||||||
|
|
|
@ -167,21 +167,27 @@ class Options:
|
||||||
self.fonts["sans"] = ("times new roman", 12)
|
self.fonts["sans"] = ("times new roman", 12)
|
||||||
self.fonts["fixed"] = ("courier new", 10)
|
self.fonts["fixed"] = ("courier new", 10)
|
||||||
# colors
|
# colors
|
||||||
self.table_color = "#008200"
|
self.colors = {
|
||||||
self.highlight_piles_colors = (None, "#ffc000")
|
'table': '#008200',
|
||||||
self.highlight_cards_colors = (None, "#ffc000", None, "#0000ff")
|
'text': '#ffffff',
|
||||||
self.highlight_samerank_colors = (None, "#ffc000", None, "#0000ff")
|
'piles': '#ffc000',
|
||||||
self.hintarrow_color = "#303030"
|
'cards_1': '#ffc000',
|
||||||
self.highlight_not_matching_color = '#ff0000'
|
'cards_2': '#0000ff',
|
||||||
self.table_text_color = False # `False' is mean use default
|
'samerank_1': '#ffc000',
|
||||||
self.table_text_color_value = '#ffffff'
|
'samerank_2': '#0000ff',
|
||||||
|
'hintarrow': '#303030',
|
||||||
|
'not_matching': '#ff0000',
|
||||||
|
}
|
||||||
|
self.use_default_text_color = True
|
||||||
# delays
|
# delays
|
||||||
self.hint_sleep = 1.0
|
self.timeouts = {
|
||||||
self.demo_sleep = 1.0
|
'hint': 1.0,
|
||||||
self.raise_card_sleep = 1.0
|
'demo': 1.0,
|
||||||
self.highlight_piles_sleep = 1.0
|
'raise_card': 1.0,
|
||||||
self.highlight_cards_sleep = 1.0
|
'highlight_piles': 1.0,
|
||||||
self.highlight_samerank_sleep = 1.0
|
'highlight_cards': 1.0,
|
||||||
|
'highlight_samerank': 1.0,
|
||||||
|
}
|
||||||
# additional startup information
|
# additional startup information
|
||||||
self.num_recent_games = 15
|
self.num_recent_games = 15
|
||||||
self.recent_gameid = []
|
self.recent_gameid = []
|
||||||
|
@ -935,7 +941,7 @@ class Application:
|
||||||
if self.scrolled_canvas.setTile(self, i, force):
|
if self.scrolled_canvas.setTile(self, i, force):
|
||||||
tile = self.tabletile_manager.get(i)
|
tile = self.tabletile_manager.get(i)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
self.opt.table_color = tile.color
|
self.opt.colors['table'] = tile.color
|
||||||
self.opt.tabletile_name = None
|
self.opt.tabletile_name = None
|
||||||
else:
|
else:
|
||||||
self.opt.tabletile_name = tile.basename
|
self.opt.tabletile_name = tile.basename
|
||||||
|
@ -1005,7 +1011,7 @@ class Application:
|
||||||
self.wm_save_state()
|
self.wm_save_state()
|
||||||
self.wm_withdraw()
|
self.wm_withdraw()
|
||||||
title = _("Loading %s %s...") % (CARDSET, cs.name)
|
title = _("Loading %s %s...") % (CARDSET, cs.name)
|
||||||
color = self.opt.table_color
|
color = self.opt.colors['table']
|
||||||
if self.tabletile_index > 0:
|
if self.tabletile_index > 0:
|
||||||
color = "#008200"
|
color = "#008200"
|
||||||
progress = PysolProgressBar(self, self.top, title=title,
|
progress = PysolProgressBar(self, self.top, title=title,
|
||||||
|
|
|
@ -1470,7 +1470,7 @@ for %d moves.
|
||||||
def highlightCard(self, suit, rank):
|
def highlightCard(self, suit, rank):
|
||||||
if not self.app:
|
if not self.app:
|
||||||
return None
|
return None
|
||||||
col = self.app.opt.highlight_samerank_colors[1]
|
col = self.app.opt.colors['samerank_1']
|
||||||
info = []
|
info = []
|
||||||
for s in self.allstacks:
|
for s in self.allstacks:
|
||||||
for c in s.cards:
|
for c in s.cards:
|
||||||
|
@ -1546,10 +1546,19 @@ for %d moves.
|
||||||
y2 = y2 + self.app.images.CARDH
|
y2 = y2 + self.app.images.CARDH
|
||||||
tkraise = True
|
tkraise = True
|
||||||
##print c1, c2, x1, y1, x2, y2
|
##print c1, c2, x1, y1, x2, y2
|
||||||
r = MfxCanvasRectangle(self.canvas, x1-1, y1-1, x2+1, y2+1,
|
if TOOLKIT == 'tk':
|
||||||
width=4, fill=None, outline=color)
|
r = MfxCanvasRectangle(self.canvas, x1-1, y1-1, x2+1, y2+1,
|
||||||
if tkraise:
|
width=4, fill=None, outline=color)
|
||||||
r.tkraise(c2.item)
|
if tkraise:
|
||||||
|
r.tkraise(c2.item)
|
||||||
|
elif TOOLKIT == 'gtk':
|
||||||
|
r = MfxCanvasRectangle(self.canvas, x1-1, y1-1, x2+1, y2+1,
|
||||||
|
width=4, fill=None, outline=color,
|
||||||
|
group=s.group)
|
||||||
|
if tkraise:
|
||||||
|
i = s.cards.index(c2)
|
||||||
|
for c in s.cards[i+1:]:
|
||||||
|
c.tkraise(1)
|
||||||
items.append(r)
|
items.append(r)
|
||||||
if not items:
|
if not items:
|
||||||
return 0
|
return 0
|
||||||
|
@ -1575,14 +1584,14 @@ for %d moves.
|
||||||
y = int(int(self.canvas.cget('height'))*(self.canvas.yview()[0]))
|
y = int(int(self.canvas.cget('height'))*(self.canvas.yview()[0]))
|
||||||
w, h = self.canvas.winfo_width(), self.canvas.winfo_height()
|
w, h = self.canvas.winfo_width(), self.canvas.winfo_height()
|
||||||
#
|
#
|
||||||
color = self.app.opt.highlight_not_matching_color
|
color = self.app.opt.colors['not_matching']
|
||||||
width = 6
|
width = 6
|
||||||
x0, y0 = x+width/2-self.canvas.xmargin, y+width/2-self.canvas.ymargin
|
x0, y0 = x+width/2-self.canvas.xmargin, y+width/2-self.canvas.ymargin
|
||||||
x1, y1 = x+w-width-self.canvas.xmargin, y+h-width-self.canvas.ymargin
|
x1, y1 = x+w-width-self.canvas.xmargin, y+h-width-self.canvas.ymargin
|
||||||
r = MfxCanvasRectangle(self.canvas, x0, y0, x1, y1,
|
r = MfxCanvasRectangle(self.canvas, x0, y0, x1, y1,
|
||||||
width=width, fill=None, outline=color)
|
width=width, fill=None, outline=color)
|
||||||
self.canvas.update_idletasks()
|
self.canvas.update_idletasks()
|
||||||
self.sleep(self.app.opt.highlight_cards_sleep)
|
self.sleep(self.app.opt.timeouts['highlight_cards'])
|
||||||
r.delete()
|
r.delete()
|
||||||
self.canvas.update_idletasks()
|
self.canvas.update_idletasks()
|
||||||
|
|
||||||
|
@ -1591,7 +1600,7 @@ for %d moves.
|
||||||
if not stackinfo:
|
if not stackinfo:
|
||||||
self.highlightNotMatching()
|
self.highlightNotMatching()
|
||||||
return 0
|
return 0
|
||||||
col = self.app.opt.highlight_piles_colors
|
col = self.app.opt.colors['piles']
|
||||||
hi = []
|
hi = []
|
||||||
for si in stackinfo:
|
for si in stackinfo:
|
||||||
for s in si[0]:
|
for s in si[0]:
|
||||||
|
@ -1771,7 +1780,7 @@ for %d moves.
|
||||||
y2 = y2 + images.CARDH / 2
|
y2 = y2 + images.CARDH / 2
|
||||||
# draw the hint
|
# draw the hint
|
||||||
arrow = MfxCanvasLine(self.canvas, x1, y1, x2, y2, width=7,
|
arrow = MfxCanvasLine(self.canvas, x1, y1, x2, y2, width=7,
|
||||||
fill=self.app.opt.hintarrow_color,
|
fill=self.app.opt.colors['hintarrow'],
|
||||||
arrow="last", arrowshape=(30,30,10))
|
arrow="last", arrowshape=(30,30,10))
|
||||||
self.canvas.update_idletasks()
|
self.canvas.update_idletasks()
|
||||||
# wait
|
# wait
|
||||||
|
@ -1794,7 +1803,7 @@ for %d moves.
|
||||||
self.demo = Struct(
|
self.demo = Struct(
|
||||||
level = level,
|
level = level,
|
||||||
mixed = mixed,
|
mixed = mixed,
|
||||||
sleep = self.app.opt.demo_sleep,
|
sleep = self.app.opt.timeouts['demo'],
|
||||||
last_deal = [],
|
last_deal = [],
|
||||||
hint = None,
|
hint = None,
|
||||||
keypress = None,
|
keypress = None,
|
||||||
|
@ -1979,8 +1988,9 @@ for %d moves.
|
||||||
ta = self.getDemoInfoTextAttr(tinfo)
|
ta = self.getDemoInfoTextAttr(tinfo)
|
||||||
if ta:
|
if ta:
|
||||||
font = self.app.getFont("canvas_large")
|
font = self.app.getFont("canvas_large")
|
||||||
self.demo.info_text = MfxCanvasText(self.canvas, ta[1], ta[2], anchor=ta[0],
|
self.demo.info_text = MfxCanvasText(self.canvas, ta[1], ta[2],
|
||||||
font=font, text=self.getDemoInfoText())
|
anchor=ta[0], font=font,
|
||||||
|
text=self.getDemoInfoText())
|
||||||
|
|
||||||
def getDemoInfoText(self):
|
def getDemoInfoText(self):
|
||||||
return self.gameinfo.short_name
|
return self.gameinfo.short_name
|
||||||
|
|
|
@ -228,7 +228,7 @@ class Shisen_RowStack(Mahjongg_RowStack):
|
||||||
game.updateStackMove(game.s.talon, 2|16) # for undo
|
game.updateStackMove(game.s.talon, 2|16) # for undo
|
||||||
if not game.demo:
|
if not game.demo:
|
||||||
if game.app.opt.shisen_show_hint:
|
if game.app.opt.shisen_show_hint:
|
||||||
self.drawArrow(other_stack, game.app.opt.hint_sleep)
|
self.drawArrow(other_stack, game.app.opt.timeouts['hint'])
|
||||||
game.playSample("droppair", priority=200)
|
game.playSample("droppair", priority=200)
|
||||||
#
|
#
|
||||||
game.moveMove(n, self, f, frames=frames, shadow=shadow)
|
game.moveMove(n, self, f, frames=frames, shadow=shadow)
|
||||||
|
@ -275,7 +275,7 @@ class Shisen_RowStack(Mahjongg_RowStack):
|
||||||
arrow = MfxCanvasLine(game.canvas,
|
arrow = MfxCanvasLine(game.canvas,
|
||||||
coords,
|
coords,
|
||||||
{'width': w,
|
{'width': w,
|
||||||
'fill': game.app.opt.hintarrow_color,
|
'fill': game.app.opt.colors['hintarrow'],
|
||||||
##'arrow': 'last',
|
##'arrow': 'last',
|
||||||
##'arrowshape': (s1, s1, s2)
|
##'arrowshape': (s1, s1, s2)
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,7 @@ Please check your %s installation.
|
||||||
# init tiles
|
# init tiles
|
||||||
manager = app.tabletile_manager
|
manager = app.tabletile_manager
|
||||||
tile = Tile()
|
tile = Tile()
|
||||||
tile.color = app.opt.table_color
|
tile.color = app.opt.colors['table']
|
||||||
tile.name = "None"
|
tile.name = "None"
|
||||||
tile.filename = None
|
tile.filename = None
|
||||||
manager.register(tile)
|
manager.register(tile)
|
||||||
|
@ -449,7 +449,7 @@ Sounds and background music will be disabled.'''),
|
||||||
|
|
||||||
# create the progress bar
|
# create the progress bar
|
||||||
title = _("Welcome to ") + PACKAGE
|
title = _("Welcome to ") + PACKAGE
|
||||||
color = app.opt.table_color
|
color = app.opt.colors['table']
|
||||||
if app.tabletile_index > 0:
|
if app.tabletile_index > 0:
|
||||||
color = "#008200"
|
color = "#008200"
|
||||||
app.intro.progress = PysolProgressBar(app, top, title=title, color=color,
|
app.intro.progress = PysolProgressBar(app, top, title=title, color=color,
|
||||||
|
|
|
@ -21,25 +21,115 @@
|
||||||
|
|
||||||
__all__ = ['ColorsDialog']
|
__all__ = ['ColorsDialog']
|
||||||
|
|
||||||
## # imports
|
# imports
|
||||||
## import os, sys
|
## import os, sys
|
||||||
## import Tkinter
|
import gtk, gobject, pango
|
||||||
## from tkColorChooser import askcolor
|
import gtk.glade
|
||||||
|
from gtk import gdk
|
||||||
|
|
||||||
## # PySol imports
|
# PySol imports
|
||||||
## from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct
|
|
||||||
|
|
||||||
## # Toolkit imports
|
# Toolkit imports
|
||||||
## from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
|
||||||
|
|
||||||
from tkwidget import MfxDialog
|
|
||||||
|
gettext = _
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class ColorsDialog(MfxDialog):
|
class ColorsDialog:
|
||||||
pass
|
|
||||||
|
## self.app.opt.table_text_color = d.table_text_color
|
||||||
|
## self.app.opt.table_text_color_value = d.table_text_color_value
|
||||||
|
## ##self.app.opt.table_color = d.table_color
|
||||||
|
## self.app.opt.highlight_piles_colors = d.highlight_piles_colors
|
||||||
|
## self.app.opt.highlight_cards_colors = d.highlight_cards_colors
|
||||||
|
## self.app.opt.highlight_samerank_colors = d.highlight_samerank_colors
|
||||||
|
## self.app.opt.hintarrow_color = d.hintarrow_color
|
||||||
|
## self.app.opt.highlight_not_matching_color = d.highlight_not_matching_color
|
||||||
|
|
||||||
|
def __init__(self, parent, title, app, **kw):
|
||||||
|
|
||||||
|
glade_file = app.dataloader.findFile('pysolfc.glade')
|
||||||
|
self.widgets_tree = gtk.glade.XML(glade_file)
|
||||||
|
|
||||||
|
keys = (
|
||||||
|
'text',
|
||||||
|
'piles',
|
||||||
|
'cards_1',
|
||||||
|
'cards_2',
|
||||||
|
'samerank_1',
|
||||||
|
'samerank_2',
|
||||||
|
'hintarrow',
|
||||||
|
'not_matching',
|
||||||
|
)
|
||||||
|
for n in keys:
|
||||||
|
label = self.widgets_tree.get_widget(n+'_label')
|
||||||
|
self._setColor(label, app.opt.colors[n])
|
||||||
|
button = self.widgets_tree.get_widget(n+'_button')
|
||||||
|
button.connect('clicked', self._changeColor, n, label)
|
||||||
|
checkbutton = self.widgets_tree.get_widget('use_default_checkbutton')
|
||||||
|
checkbutton.set_active(not app.opt.use_default_text_color)
|
||||||
|
|
||||||
|
self._translateLabels()
|
||||||
|
|
||||||
|
dialog = self.widgets_tree.get_widget('colors_dialog')
|
||||||
|
self.dialog = dialog
|
||||||
|
dialog.set_title(title)
|
||||||
|
dialog.set_transient_for(parent)
|
||||||
|
dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
|
||||||
|
self.status = -1
|
||||||
|
self.button = -1
|
||||||
|
response = dialog.run()
|
||||||
|
if response == gtk.RESPONSE_OK:
|
||||||
|
self.status = 0
|
||||||
|
self.button = 0
|
||||||
|
for n in keys:
|
||||||
|
w = self.widgets_tree.get_widget(n+'_label')
|
||||||
|
c = w.get_data('user_data')
|
||||||
|
setattr(self, n+'_color', c)
|
||||||
|
self.use_default_color = not checkbutton.get_active()
|
||||||
|
|
||||||
|
dialog.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def _setColor(self, label, color):
|
||||||
|
c = gdk.color_parse(color)
|
||||||
|
al = pango.AttrList()
|
||||||
|
al.insert(pango.AttrBackground(c.red, c.green, c.blue, 0, 10))
|
||||||
|
label.set_attributes(al)
|
||||||
|
label.set_data('user_data', color)
|
||||||
|
|
||||||
|
|
||||||
|
def _changeColor(self, w, name, label):
|
||||||
|
print '_changeColor', name
|
||||||
|
color = label.get_data('user_data')
|
||||||
|
dialog = gtk.ColorSelectionDialog(_('Select color'))
|
||||||
|
dialog.help_button.destroy()
|
||||||
|
dialog.set_transient_for(self.dialog)
|
||||||
|
dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
dialog.colorsel.set_current_color(gdk.color_parse(color))
|
||||||
|
response = dialog.run()
|
||||||
|
if response == gtk.RESPONSE_OK:
|
||||||
|
c = dialog.colorsel.get_current_color()
|
||||||
|
c = '#%02x%02x%02x' % (c.red/256, c.green/256, c.blue/256)
|
||||||
|
self._setColor(label, c)
|
||||||
|
dialog.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def _translateLabels(self):
|
||||||
|
for n in (
|
||||||
|
'label31',
|
||||||
|
'label32',
|
||||||
|
'label33',
|
||||||
|
'label34',
|
||||||
|
'label35',
|
||||||
|
'label36',
|
||||||
|
'label37',
|
||||||
|
):
|
||||||
|
w = self.widgets_tree.get_widget(n)
|
||||||
|
w.set_text(gettext(w.get_text()))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,28 +21,29 @@
|
||||||
|
|
||||||
__all__ = ['FontsDialog']
|
__all__ = ['FontsDialog']
|
||||||
|
|
||||||
## # imports
|
# imports
|
||||||
## import os, sys
|
## import os, sys
|
||||||
## import types
|
## import types
|
||||||
## import Tkinter
|
## import Tkinter
|
||||||
## import tkFont
|
## import tkFont
|
||||||
|
import gtk, gobject, pango
|
||||||
|
import gtk.glade
|
||||||
|
|
||||||
## # PySol imports
|
# PySol imports
|
||||||
## from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct
|
## from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct
|
||||||
|
|
||||||
## # Toolkit imports
|
# Toolkit imports
|
||||||
## from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
## from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
||||||
## from tkutil import bind
|
## from tkutil import bind
|
||||||
|
|
||||||
from tkwidget import MfxDialog
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class FontsDialog(MfxDialog):
|
class FontsDialog:
|
||||||
pass
|
def __init__(self, parent, title, app, **kw):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,6 @@ from selectgame import SelectGameDialogWithPreview
|
||||||
|
|
||||||
gettext = _
|
gettext = _
|
||||||
|
|
||||||
|
|
||||||
def ltk2gtk(s):
|
def ltk2gtk(s):
|
||||||
# label tk to gtk
|
# label tk to gtk
|
||||||
return gettext(s).replace('&', '_')
|
return gettext(s).replace('&', '_')
|
||||||
|
@ -67,6 +66,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
def __init__(self, app, top, progress=None):
|
def __init__(self, app, top, progress=None):
|
||||||
PysolMenubarActions.__init__(self, app, top)
|
PysolMenubarActions.__init__(self, app, top)
|
||||||
self.progress = progress
|
self.progress = progress
|
||||||
|
self._cb_max = gdk.screen_height()/24
|
||||||
# create menus
|
# create menus
|
||||||
menubar = self.createMenubar()
|
menubar = self.createMenubar()
|
||||||
self.top.table.attach(menubar,
|
self.top.table.attach(menubar,
|
||||||
|
@ -89,10 +89,10 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
entries = (
|
entries = (
|
||||||
|
|
||||||
### toolbar
|
### toolbar
|
||||||
('newgame', gtk.STOCK_NEW,
|
('newgame', gtk.STOCK_NEW, # action name, stock
|
||||||
ltk2gtk('&New game'), 'N',
|
ltk2gtk('&New game'), 'N', # label, accelerator
|
||||||
ltk2gtk('New game'),
|
ltk2gtk('New game'), # tooltip
|
||||||
self.mNewGame),
|
self.mNewGame), # callback
|
||||||
('open', gtk.STOCK_OPEN,
|
('open', gtk.STOCK_OPEN,
|
||||||
ltk2gtk('&Open...'), '<control>O',
|
ltk2gtk('&Open...'), '<control>O',
|
||||||
ltk2gtk('Open a\nsaved game'),
|
ltk2gtk('Open a\nsaved game'),
|
||||||
|
@ -118,11 +118,11 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
ltk2gtk('Auto drop'),
|
ltk2gtk('Auto drop'),
|
||||||
self.mDrop),
|
self.mDrop),
|
||||||
('stats', gtk.STOCK_INDEX,
|
('stats', gtk.STOCK_INDEX,
|
||||||
ltk2gtk('Stats'), None,
|
ltk2gtk('&Statistics'), None,
|
||||||
ltk2gtk('Statistics'),
|
ltk2gtk('Statistics'),
|
||||||
lambda w, self=self: self.mPlayerStats(mode=101)),
|
lambda w, self=self: self.mPlayerStats(mode=101)),
|
||||||
('rules', gtk.STOCK_HELP,
|
('rules', gtk.STOCK_HELP,
|
||||||
ltk2gtk('Rules'), 'F1',
|
ltk2gtk('&Rules'), 'F1',
|
||||||
ltk2gtk('Rules'),
|
ltk2gtk('Rules'),
|
||||||
self.mHelpRules),
|
self.mHelpRules),
|
||||||
('quit', gtk.STOCK_QUIT,
|
('quit', gtk.STOCK_QUIT,
|
||||||
|
@ -131,19 +131,21 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
self.mQuit),
|
self.mQuit),
|
||||||
|
|
||||||
### menus
|
### menus
|
||||||
('file', None, ltk2gtk('&File')),
|
('file', None, ltk2gtk('&File')),
|
||||||
('selectgame', None, ltk2gtk('Select &game')),
|
('recentgames', None, ltk2gtk('R&ecent games')),
|
||||||
('edit', None, ltk2gtk('&Edit')),
|
('favoritegames', None, ltk2gtk('Fa&vorite games')),
|
||||||
('game', None, ltk2gtk('&Game')),
|
('select', None, ltk2gtk('&Select')),
|
||||||
('assist', None, ltk2gtk('&Assist')),
|
('edit', None, ltk2gtk('&Edit')),
|
||||||
('options', None, ltk2gtk('&Options')),
|
('game', None, ltk2gtk('&Game')),
|
||||||
('assistlevel', None, ltk2gtk('Assist &level')),
|
('assist', None, ltk2gtk('&Assist')),
|
||||||
('automaticplay', None, ltk2gtk('&Automatic play')),
|
('options', None, ltk2gtk('&Options')),
|
||||||
('animations', None, ltk2gtk('A&nimations')),
|
('assistlevel', None, ltk2gtk('Assist &level')),
|
||||||
('cardview', None, ltk2gtk('Card &view')),
|
('automaticplay', None, ltk2gtk('&Automatic play')),
|
||||||
('toolbar', None, ltk2gtk('&Toolbar')),
|
('animations', None, ltk2gtk('A&nimations')),
|
||||||
('statusbar', None, ltk2gtk('Stat&usbar')),
|
('cardview', None, ltk2gtk('Card &view')),
|
||||||
('help', None, ltk2gtk('&Help')),
|
('toolbar', None, ltk2gtk('&Toolbar')),
|
||||||
|
('statusbar', None, ltk2gtk('Stat&usbar')),
|
||||||
|
('help', None, ltk2gtk('&Help')),
|
||||||
|
|
||||||
### menuitems
|
### menuitems
|
||||||
('playablepreview', None,
|
('playablepreview', None,
|
||||||
|
@ -152,6 +154,12 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
('selectgamebynumber', None,
|
('selectgamebynumber', None,
|
||||||
ltk2gtk('Select game by nu&mber...'), None,
|
ltk2gtk('Select game by nu&mber...'), None,
|
||||||
None, self.mSelectGameById),
|
None, self.mSelectGameById),
|
||||||
|
('addtofavorites', None,
|
||||||
|
ltk2gtk('A&dd to favorites'), None,
|
||||||
|
None, self.mAddFavor),
|
||||||
|
('removefromfavorites', None,
|
||||||
|
ltk2gtk('R&emove from favorites'), None,
|
||||||
|
None, self.mDelFavor),
|
||||||
('saveas', None,
|
('saveas', None,
|
||||||
ltk2gtk('Save &as...'), None,
|
ltk2gtk('Save &as...'), None,
|
||||||
None, self.mSaveAs),
|
None, self.mSaveAs),
|
||||||
|
@ -188,6 +196,12 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
('cardset', None,
|
('cardset', None,
|
||||||
ltk2gtk('Cards&et...'), '<control>E',
|
ltk2gtk('Cards&et...'), '<control>E',
|
||||||
None, self.mSelectCardsetDialog),
|
None, self.mSelectCardsetDialog),
|
||||||
|
('timeouts', None,
|
||||||
|
ltk2gtk('Time&outs...'), None,
|
||||||
|
None, self.mOptTimeouts),
|
||||||
|
('colors', None,
|
||||||
|
ltk2gtk('&Colors...'), None,
|
||||||
|
None, self.mOptColors),
|
||||||
('contents', None,
|
('contents', None,
|
||||||
ltk2gtk('&Contents'), '<control>F1',
|
ltk2gtk('&Contents'), '<control>F1',
|
||||||
None, self.mHelp),
|
None, self.mHelp),
|
||||||
|
@ -274,8 +288,10 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
<menu action='file'>
|
<menu action='file'>
|
||||||
<menuitem action='newgame'/>
|
<menuitem action='newgame'/>
|
||||||
<menuitem action='selectgamebynumber'/>
|
<menuitem action='selectgamebynumber'/>
|
||||||
<menuitem action='playablepreview'/>
|
<menu action='recentgames'/>
|
||||||
<menu action='selectgame'/>
|
<menu action='favoritegames'/>
|
||||||
|
<menuitem action='addtofavorites'/>
|
||||||
|
<menuitem action='removefromfavorites'/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<menuitem action='open'/>
|
<menuitem action='open'/>
|
||||||
<menuitem action='save'/>
|
<menuitem action='save'/>
|
||||||
|
@ -283,6 +299,12 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
<separator/>
|
<separator/>
|
||||||
<menuitem action='holdandquit'/>
|
<menuitem action='holdandquit'/>
|
||||||
<menuitem action='quit'/>
|
<menuitem action='quit'/>
|
||||||
|
<menuitem action='quit'/>
|
||||||
|
</menu>
|
||||||
|
|
||||||
|
<menu action='select'>
|
||||||
|
<menuitem action='playablepreview'/>
|
||||||
|
<separator/>
|
||||||
</menu>
|
</menu>
|
||||||
|
|
||||||
<menu action='edit'>
|
<menu action='edit'>
|
||||||
|
@ -353,6 +375,9 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
</menu>
|
</menu>
|
||||||
<menuitem action='stickymouse'/>
|
<menuitem action='stickymouse'/>
|
||||||
<separator/>
|
<separator/>
|
||||||
|
<menuitem action='colors'/>
|
||||||
|
<menuitem action='timeouts'/>
|
||||||
|
<separator/>
|
||||||
<menuitem action='demologo'/>
|
<menuitem action='demologo'/>
|
||||||
<menuitem action='startupsplashscreen'/>
|
<menuitem action='startupsplashscreen'/>
|
||||||
<menu action='toolbar'>
|
<menu action='toolbar'>
|
||||||
|
@ -394,19 +419,28 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
ui_manager.insert_action_group(action_group, 0)
|
ui_manager.insert_action_group(action_group, 0)
|
||||||
self.top.add_accel_group(ui_manager.get_accel_group())
|
self.top.add_accel_group(ui_manager.get_accel_group())
|
||||||
self.top.ui_manager = ui_manager
|
self.top.ui_manager = ui_manager
|
||||||
menubar = ui_manager.get_widget('/menubar')
|
|
||||||
|
#ui_manager.get_widget('/menubar/file/recentgames').show()
|
||||||
|
#ui_manager.get_widget('/menubar/file/favoritegames').show()
|
||||||
|
|
||||||
games = map(self.app.gdb.get, self.app.gdb.getGamesIdSortedByName())
|
games = map(self.app.gdb.get, self.app.gdb.getGamesIdSortedByName())
|
||||||
|
menu = ui_manager.get_widget('/menubar/select').get_submenu()
|
||||||
|
self._createSelectMenu(games, menu)
|
||||||
|
|
||||||
menu_item = ui_manager.get_widget('/menubar/file/selectgame')
|
menubar = ui_manager.get_widget('/menubar')
|
||||||
menu_item.show()
|
|
||||||
menu = gtk.Menu()
|
|
||||||
menu_item.set_submenu(menu)
|
|
||||||
self._addSelectAllGameSubMenu(games, menu, self.mSelectGame)
|
|
||||||
|
|
||||||
return menubar
|
return menubar
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Select Game menu creation
|
||||||
|
#
|
||||||
|
|
||||||
|
def _getNumGames(self, games, select_data):
|
||||||
|
ngames = 0
|
||||||
|
for label, select_func in select_data:
|
||||||
|
ngames += len(filter(select_func, games))
|
||||||
|
return ngames
|
||||||
|
|
||||||
def _createSubMenu(self, menu, label):
|
def _createSubMenu(self, menu, label):
|
||||||
menu_item = gtk.MenuItem(label)
|
menu_item = gtk.MenuItem(label)
|
||||||
menu.add(menu_item)
|
menu.add(menu_item)
|
||||||
|
@ -415,21 +449,26 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu_item.set_submenu(submenu)
|
menu_item.set_submenu(submenu)
|
||||||
return submenu
|
return submenu
|
||||||
|
|
||||||
def _addSelectGameSubMenu(self, games, menu, command, group):
|
def _addGamesMenuItem(self, menu, gi, short_name=False):
|
||||||
for g in games:
|
if short_name:
|
||||||
label = g.name
|
label = gi.short_name
|
||||||
label = gettext(label)
|
else:
|
||||||
menu_item = gtk.RadioMenuItem(group, label)
|
label = gi.name
|
||||||
group = menu_item
|
label = gettext(label)
|
||||||
menu.add(menu_item)
|
menu_item = gtk.MenuItem(label)
|
||||||
menu_item.show()
|
menu_item.set_data('user_data', gi.id)
|
||||||
menu_item.connect('toggled', command, g.id)
|
menu_item.connect('activate', self.mSelectGame)
|
||||||
|
menu.add(menu_item)
|
||||||
|
menu_item.show()
|
||||||
|
|
||||||
def _addSelectAllGameSubMenu(self, games, menu, command):
|
def _addGamesSubMenu(self, games, menu, short_name=False):
|
||||||
cb_max = gdk.screen_height()/24
|
for gi in games:
|
||||||
n, d = 0, cb_max
|
self._addGamesMenuItem(menu, gi, short_name=short_name)
|
||||||
|
|
||||||
|
def _addAllGamesMenu(self, games, menu):
|
||||||
|
menu = self._createSubMenu(menu, label=ltk2gtk('&All games by name'))
|
||||||
|
n, d = 0, self._cb_max
|
||||||
i = 0
|
i = 0
|
||||||
group = None
|
|
||||||
while True:
|
while True:
|
||||||
if self.progress: self.progress.update(step=1)
|
if self.progress: self.progress.update(step=1)
|
||||||
i += 1
|
i += 1
|
||||||
|
@ -440,16 +479,88 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
n1, n2 = gettext(n1), gettext(n2)
|
n1, n2 = gettext(n1), gettext(n2)
|
||||||
label = n1[:3]+' - '+n2[:3]
|
label = n1[:3]+' - '+n2[:3]
|
||||||
submenu = self._createSubMenu(menu, label=label)
|
submenu = self._createSubMenu(menu, label=label)
|
||||||
group = self._addSelectGameSubMenu(games[n:n+d], submenu,
|
self._addGamesSubMenu(games[n:n+d], submenu)
|
||||||
command, group)
|
|
||||||
n += d
|
n += d
|
||||||
|
|
||||||
|
def _addSelectedGamesSubMenu(self, games, menu, select_data):
|
||||||
|
for label, select_func in select_data:
|
||||||
|
g = filter(select_func, games)
|
||||||
|
if not g:
|
||||||
|
continue
|
||||||
|
submenu = self._createSubMenu(menu, label=label)
|
||||||
|
self._addGamesSubMenu(g, submenu)
|
||||||
|
|
||||||
|
def _addPopularGamesMenu(self, games, menu):
|
||||||
|
select_func = lambda gi: gi.si.game_flags & GI.GT_POPULAR
|
||||||
|
if len(filter(select_func, games)) == 0:
|
||||||
|
return
|
||||||
|
data = (ltk2gtk('&Popular games'), select_func)
|
||||||
|
self._addSelectedGamesSubMenu(games, menu, (data, ))
|
||||||
|
|
||||||
|
def _addGamesByType(self, games, menu, label, data):
|
||||||
|
if self._getNumGames(games, data) == 0:
|
||||||
|
return
|
||||||
|
submenu = self._createSubMenu(menu, label=label)
|
||||||
|
self._addSelectedGamesSubMenu(games, submenu, data)
|
||||||
|
|
||||||
|
def _addMahjonggGamesMenu(self, games, menu):
|
||||||
|
select_func = lambda gi: gi.si.game_type == GI.GT_MAHJONGG
|
||||||
|
mahjongg_games = filter(select_func, games)
|
||||||
|
if len(mahjongg_games) == 0:
|
||||||
|
return
|
||||||
|
menu = self._createSubMenu(menu, label=ltk2gtk('&Mahjongg games'))
|
||||||
|
#
|
||||||
|
def add_menu(games, c0, c1, menu=menu):
|
||||||
|
if not games:
|
||||||
|
return
|
||||||
|
label = c0 + ' - ' + c1
|
||||||
|
if c0 == c1:
|
||||||
|
label = c0
|
||||||
|
submenu = self._createSubMenu(menu, label=label)
|
||||||
|
self._addGamesSubMenu(games, submenu, short_name=True)
|
||||||
|
#
|
||||||
|
games = {}
|
||||||
|
for gi in mahjongg_games:
|
||||||
|
c = gettext(gi.short_name).strip()[0]
|
||||||
|
if games.has_key(c):
|
||||||
|
games[c].append(gi)
|
||||||
|
else:
|
||||||
|
games[c] = [gi]
|
||||||
|
games = games.items()
|
||||||
|
games.sort()
|
||||||
|
#
|
||||||
|
g0 = []
|
||||||
|
c0 = c1 = games[0][0]
|
||||||
|
for c, g1 in games:
|
||||||
|
if len(g0)+len(g1) >= self._cb_max:
|
||||||
|
add_menu(g0, c0, c1)
|
||||||
|
g0 = g1
|
||||||
|
c0 = c1 = c
|
||||||
|
else:
|
||||||
|
g0 += g1
|
||||||
|
c1 = c
|
||||||
|
add_menu(g0, c0, c1)
|
||||||
|
|
||||||
|
|
||||||
|
def _createSelectMenu(self, games, menu):
|
||||||
|
assert isinstance(menu, gtk.Menu)
|
||||||
|
self._addPopularGamesMenu(games, menu)
|
||||||
|
for l, d in (
|
||||||
|
(ltk2gtk('&French games'), GI.SELECT_GAME_BY_TYPE),
|
||||||
|
(ltk2gtk('&Oriental games'), GI.SELECT_ORIENTAL_GAME_BY_TYPE),
|
||||||
|
(ltk2gtk('&Special games'), GI.SELECT_SPECIAL_GAME_BY_TYPE),
|
||||||
|
):
|
||||||
|
self._addGamesByType(games, menu, l, d)
|
||||||
|
self._addMahjonggGamesMenu(games, menu)
|
||||||
|
sep = gtk.SeparatorMenuItem()
|
||||||
|
menu.add(sep)
|
||||||
|
self._addAllGamesMenu(games, menu)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# menu updates
|
# menu updates
|
||||||
#
|
#
|
||||||
|
|
||||||
## WARNING: setMenuState: not found: /menubar/file/holdandquit
|
|
||||||
## WARNING: setMenuState: not found: /menubar/assist/findcard
|
## WARNING: setMenuState: not found: /menubar/assist/findcard
|
||||||
def setMenuState(self, state, path):
|
def setMenuState(self, state, path):
|
||||||
path_map = {
|
path_map = {
|
||||||
|
@ -467,7 +578,6 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menuitem.set_sensitive(state)
|
menuitem.set_sensitive(state)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def setToolbarState(self, state, path):
|
def setToolbarState(self, state, path):
|
||||||
path = '/toolbar/'+path
|
path = '/toolbar/'+path
|
||||||
button = self.top.ui_manager.get_widget(path)
|
button = self.top.ui_manager.get_widget(path)
|
||||||
|
@ -481,9 +591,59 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
# menu actions
|
# menu actions
|
||||||
#
|
#
|
||||||
|
|
||||||
def _createFileChooser(self, title, action, idir, ifile):
|
def mAddFavor(self, w):
|
||||||
|
gameid = self.app.game.id
|
||||||
|
if gameid not in self.app.opt.favorite_gameid:
|
||||||
|
self.app.opt.favorite_gameid.append(gameid)
|
||||||
|
self.updateFavoriteGamesMenu()
|
||||||
|
|
||||||
|
def mDelFavor(self, w):
|
||||||
|
gameid = self.app.game.id
|
||||||
|
if gameid in self.app.opt.favorite_gameid:
|
||||||
|
self.app.opt.favorite_gameid.remove(gameid)
|
||||||
|
self.updateFavoriteGamesMenu()
|
||||||
|
|
||||||
|
def updateFavoriteGamesMenu(self):
|
||||||
|
games = self.app.opt.favorite_gameid
|
||||||
|
self._updateGamesMenu('/menubar/file/favoritegames', games)
|
||||||
|
in_favor = self.app.game.id in games
|
||||||
|
item = self.top.ui_manager.get_widget('/menubar/file/addtofavorites')
|
||||||
|
item.set_sensitive(not in_favor)
|
||||||
|
item = self.top.ui_manager.get_widget('/menubar/file/removefromfavorites')
|
||||||
|
item.set_sensitive(in_favor)
|
||||||
|
|
||||||
|
def updateRecentGamesMenu(self, games):
|
||||||
|
self._updateGamesMenu('/menubar/file/recentgames', games)
|
||||||
|
|
||||||
|
def _updateGamesMenu(self, path, games):
|
||||||
|
item = self.top.ui_manager.get_widget(path)
|
||||||
|
item.show()
|
||||||
|
menu = item.get_submenu()
|
||||||
|
menu.show()
|
||||||
|
#
|
||||||
|
menu_games = []
|
||||||
|
def checkFavor(item):
|
||||||
|
gameid = item.get_data('user_data')
|
||||||
|
if gameid in games:
|
||||||
|
menu_games.append(gameid)
|
||||||
|
else:
|
||||||
|
menu.remove(item)
|
||||||
|
menu.foreach(checkFavor)
|
||||||
|
#
|
||||||
|
for gameid in games:
|
||||||
|
if gameid not in menu_games:
|
||||||
|
gi = self.app.getGameInfo(gameid)
|
||||||
|
self._addGamesMenuItem(menu, gi)
|
||||||
|
if not games:
|
||||||
|
item = gtk.MenuItem(_('Empty'))
|
||||||
|
item.show()
|
||||||
|
item.set_sensitive(False)
|
||||||
|
menu.add(item)
|
||||||
|
|
||||||
|
|
||||||
|
def _createFileChooser(self, title, action, idir, ifile, stock):
|
||||||
d = gtk.FileChooserDialog(title, self.top, action,
|
d = gtk.FileChooserDialog(title, self.top, action,
|
||||||
(gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT,
|
(stock, gtk.RESPONSE_ACCEPT,
|
||||||
gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
|
gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
|
||||||
d.set_current_folder(idir)
|
d.set_current_folder(idir)
|
||||||
if ifile:
|
if ifile:
|
||||||
|
@ -519,7 +679,8 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
idir = self.app.dn.savegames
|
idir = self.app.dn.savegames
|
||||||
filename = self._createFileChooser(_('Open Game'),
|
filename = self._createFileChooser(_('Open Game'),
|
||||||
gtk.FILE_CHOOSER_ACTION_OPEN,
|
gtk.FILE_CHOOSER_ACTION_OPEN,
|
||||||
idir, '')
|
idir, '',
|
||||||
|
gtk.STOCK_OPEN)
|
||||||
if filename:
|
if filename:
|
||||||
##filename = os.path.normpath(filename)
|
##filename = os.path.normpath(filename)
|
||||||
##filename = os.path.normcase(filename)
|
##filename = os.path.normcase(filename)
|
||||||
|
@ -547,7 +708,8 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
##print self.game.filename, ifile
|
##print self.game.filename, ifile
|
||||||
filename = self._createFileChooser(_('Save Game'),
|
filename = self._createFileChooser(_('Save Game'),
|
||||||
gtk.FILE_CHOOSER_ACTION_SAVE,
|
gtk.FILE_CHOOSER_ACTION_SAVE,
|
||||||
idir, ifile)
|
idir, ifile,
|
||||||
|
gtk.STOCK_SAVE)
|
||||||
if filename:
|
if filename:
|
||||||
##filename = os.path.normpath(filename)
|
##filename = os.path.normpath(filename)
|
||||||
##filename = os.path.normcase(filename)
|
##filename = os.path.normcase(filename)
|
||||||
|
@ -555,14 +717,10 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
self.updateMenus()
|
self.updateMenus()
|
||||||
|
|
||||||
|
|
||||||
|
def mSelectGame(self, menu_item):
|
||||||
|
game_id = menu_item.get_data('user_data')
|
||||||
|
self._mSelectGame(game_id)
|
||||||
|
|
||||||
def updateFavoriteGamesMenu(self, *args):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def mSelectGame(self, menu_item, game_id):
|
|
||||||
if menu_item.get_active():
|
|
||||||
self._mSelectGame(game_id)
|
|
||||||
|
|
||||||
def mSelectGameDialogWithPreview(self, *event):
|
def mSelectGameDialogWithPreview(self, *event):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
@ -593,7 +751,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
key = self.app.tabletile_index
|
key = self.app.tabletile_index
|
||||||
if key <= 0:
|
if key <= 0:
|
||||||
key = self.app.opt.table_color.lower()
|
key = self.app.opt.colors['table']
|
||||||
d = SelectTileDialogWithPreview(self.top, app=self.app,
|
d = SelectTileDialogWithPreview(self.top, app=self.app,
|
||||||
title=_('Select table background'),
|
title=_('Select table background'),
|
||||||
manager=self.app.tabletile_manager,
|
manager=self.app.tabletile_manager,
|
||||||
|
|
|
@ -54,7 +54,7 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.key = key
|
self.key = key
|
||||||
self.preview_key = -1
|
self.preview_key = -1
|
||||||
self.all_keys = []
|
self.all_keys = []
|
||||||
self.table_color = app.opt.table_color
|
self.table_color = app.opt.colors['table']
|
||||||
# paned
|
# paned
|
||||||
hpaned = gtk.HPaned()
|
hpaned = gtk.HPaned()
|
||||||
self.hpaned = hpaned
|
self.hpaned = hpaned
|
||||||
|
@ -150,7 +150,7 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
canvas.setBackgroundImage(None)
|
canvas.setBackgroundImage(None)
|
||||||
canvas.setTextColor(None)
|
canvas.setTextColor(None)
|
||||||
self.preview_key = key
|
self.preview_key = key
|
||||||
self.table_color = key
|
self.colors['table'] = key
|
||||||
else:
|
else:
|
||||||
# image
|
# image
|
||||||
tile = self.manager.get(key)
|
tile = self.manager.get(key)
|
||||||
|
@ -186,7 +186,7 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
if type(self.preview_key) is str:
|
if type(self.preview_key) is str:
|
||||||
color = self.preview_key
|
color = self.preview_key
|
||||||
else:
|
else:
|
||||||
color = self.app.opt.table_color
|
color = self.app.opt.colors['table']
|
||||||
win.colorsel.set_current_color(gdk.color_parse(color))
|
win.colorsel.set_current_color(gdk.color_parse(color))
|
||||||
win.connect('delete_event', lambda w, e: win.destroy())
|
win.connect('delete_event', lambda w, e: win.destroy())
|
||||||
win.ok_button.connect('clicked', self._colorselOkClicked, win)
|
win.ok_button.connect('clicked', self._colorselOkClicked, win)
|
||||||
|
|
|
@ -21,22 +21,87 @@
|
||||||
|
|
||||||
__all__ = ['TimeoutsDialog']
|
__all__ = ['TimeoutsDialog']
|
||||||
|
|
||||||
## # imports
|
# imports
|
||||||
## import os, sys
|
## import os, sys
|
||||||
## import Tkinter
|
import gtk, gobject, pango
|
||||||
|
import gtk.glade
|
||||||
|
|
||||||
## # PySol imports
|
# PySol imports
|
||||||
## from pysollib.mfxutil import destruct, kwdefault, KwStruct, Struct
|
|
||||||
|
|
||||||
## # Toolkit imports
|
# Toolkit imports
|
||||||
## from tkconst import EVENT_HANDLED, EVENT_PROPAGATE
|
|
||||||
|
|
||||||
from tkwidget import MfxDialog
|
|
||||||
|
gettext = _
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# //
|
# //
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class TimeoutsDialog(MfxDialog):
|
class TimeoutsDialog:
|
||||||
pass
|
|
||||||
|
def __init__(self, parent, title, app, **kw):
|
||||||
|
|
||||||
|
glade_file = app.dataloader.findFile('pysolfc.glade')
|
||||||
|
self.widgets_tree = gtk.glade.XML(glade_file)
|
||||||
|
|
||||||
|
keys = (
|
||||||
|
'demo',
|
||||||
|
'hint',
|
||||||
|
'raise_card',
|
||||||
|
'highlight_piles',
|
||||||
|
'highlight_cards',
|
||||||
|
'highlight_samerank',
|
||||||
|
)
|
||||||
|
|
||||||
|
dic = {}
|
||||||
|
for n in keys:
|
||||||
|
def callback(w, n=n):
|
||||||
|
sp = self.widgets_tree.get_widget(n+'_spinbutton')
|
||||||
|
sc = self.widgets_tree.get_widget(n+'_scale')
|
||||||
|
sp.set_value(sc.get_value())
|
||||||
|
dic[n+'_scale_value_changed'] = callback
|
||||||
|
def callback(w, n=n):
|
||||||
|
sp = self.widgets_tree.get_widget(n+'_spinbutton')
|
||||||
|
sc = self.widgets_tree.get_widget(n+'_scale')
|
||||||
|
sc.set_value(sp.get_value())
|
||||||
|
dic[n+'_spinbutton_value_changed'] = callback
|
||||||
|
self.widgets_tree.signal_autoconnect(dic)
|
||||||
|
|
||||||
|
for n in keys:
|
||||||
|
v = app.opt.timeouts[n]
|
||||||
|
w = self.widgets_tree.get_widget(n+'_spinbutton')
|
||||||
|
w.set_value(v)
|
||||||
|
w = self.widgets_tree.get_widget(n+'_scale')
|
||||||
|
w.set_value(v)
|
||||||
|
|
||||||
|
self._translateLabels()
|
||||||
|
|
||||||
|
dialog = self.widgets_tree.get_widget('timeouts_dialog')
|
||||||
|
dialog.set_title(title)
|
||||||
|
dialog.set_transient_for(parent)
|
||||||
|
dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
|
||||||
|
self.status = -1
|
||||||
|
self.button = -1
|
||||||
|
response = dialog.run()
|
||||||
|
if response == gtk.RESPONSE_OK:
|
||||||
|
self.status = 0
|
||||||
|
self.button = 0
|
||||||
|
for n in keys:
|
||||||
|
w = self.widgets_tree.get_widget(n+'_spinbutton')
|
||||||
|
setattr(self, n+'_timeout', w.get_value())
|
||||||
|
|
||||||
|
dialog.destroy()
|
||||||
|
|
||||||
|
def _translateLabels(self):
|
||||||
|
for n in (
|
||||||
|
'label25',
|
||||||
|
'label26',
|
||||||
|
'label27',
|
||||||
|
'label28',
|
||||||
|
'label29',
|
||||||
|
'label30',
|
||||||
|
):
|
||||||
|
w = self.widgets_tree.get_widget(n)
|
||||||
|
w.set_text(gettext(w.get_text()))
|
||||||
|
|
||||||
|
|
|
@ -77,11 +77,16 @@ class _CanvasItem:
|
||||||
self.canvas = canvas
|
self.canvas = canvas
|
||||||
canvas._all_items.append(self)
|
canvas._all_items.append(self)
|
||||||
self._is_hidden = False
|
self._is_hidden = False
|
||||||
|
self._x, self._y = 0, 0
|
||||||
|
self._group = None
|
||||||
|
|
||||||
def addtag(self, group):
|
def addtag(self, group):
|
||||||
##print self, 'addtag'
|
##print self, 'addtag'
|
||||||
##~ assert isinstance(group._item, CanvasGroup)
|
##~ assert isinstance(group._item, CanvasGroup)
|
||||||
self._item.reparent(group._item)
|
self._item.reparent(group._item)
|
||||||
|
if self._group == group:
|
||||||
|
print 'addtag: new_group == old_group'
|
||||||
|
self._group = group
|
||||||
|
|
||||||
def dtag(self, group):
|
def dtag(self, group):
|
||||||
##print self, 'dtag'
|
##print self, 'dtag'
|
||||||
|
@ -102,11 +107,14 @@ class _CanvasItem:
|
||||||
self._item = None
|
self._item = None
|
||||||
|
|
||||||
def lower(self, positions=None):
|
def lower(self, positions=None):
|
||||||
return # used for reordered shadow; don't need?
|
print 'lower', self, positions
|
||||||
|
return # don't need?
|
||||||
## if positions is None:
|
## if positions is None:
|
||||||
## self._item.lower_to_bottom()
|
## pass
|
||||||
## self._item.get_property('parent').raise_to_top()
|
## ##self._item.lower_to_bottom()
|
||||||
|
## ##self._item.get_property('parent').lower_to_bottom()
|
||||||
## else:
|
## else:
|
||||||
|
## print self, positions
|
||||||
## ##~ assert type(positions) is types.IntType and positions > 0
|
## ##~ assert type(positions) is types.IntType and positions > 0
|
||||||
## self._item.lower(positions)
|
## self._item.lower(positions)
|
||||||
|
|
||||||
|
@ -116,13 +124,18 @@ class _CanvasItem:
|
||||||
self._item.raise_to_top()
|
self._item.raise_to_top()
|
||||||
self._item.get_property('parent').raise_to_top()
|
self._item.get_property('parent').raise_to_top()
|
||||||
else:
|
else:
|
||||||
print self, 'tkraise', positions # don't used?
|
#print self, 'tkraise', positions
|
||||||
|
#self._item.raise_to_top()
|
||||||
##~ assert type(positions) is types.IntType and positions > 0
|
##~ assert type(positions) is types.IntType and positions > 0
|
||||||
self._item.raise_(positions)
|
self._item.raise_to_top() #positions)
|
||||||
|
|
||||||
def move(self, x, y):
|
def move(self, x, y):
|
||||||
self._item.move(x, y)
|
self._item.move(x, y)
|
||||||
moveTo = move
|
self._x, self._y = self._x+x, self._y+y
|
||||||
|
|
||||||
|
def moveTo(self, x, y):
|
||||||
|
self._item.move(x-self._x, y-self._y)
|
||||||
|
self._x, self._y = x, y
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
if self._item:
|
if self._item:
|
||||||
|
@ -146,16 +159,22 @@ class MfxCanvasGroup(_CanvasItem):
|
||||||
|
|
||||||
|
|
||||||
class MfxCanvasImage(_CanvasItem):
|
class MfxCanvasImage(_CanvasItem):
|
||||||
def __init__(self, canvas, x, y, image, anchor=gtk.ANCHOR_NW):
|
def __init__(self, canvas, x, y, image, anchor=gtk.ANCHOR_NW, group=None):
|
||||||
_CanvasItem.__init__(self, canvas)
|
_CanvasItem.__init__(self, canvas)
|
||||||
|
self._x, self._y = x, y
|
||||||
if type(anchor) is str:
|
if type(anchor) is str:
|
||||||
anchor = anchor_tk2gtk(anchor)
|
anchor = anchor_tk2gtk(anchor)
|
||||||
self._item = canvas.root().add(gnome.canvas.CanvasPixbuf,
|
if group:
|
||||||
x=x, y=y,
|
self._group = group
|
||||||
pixbuf=image.pixbuf,
|
group = group._item
|
||||||
width=image.width(),
|
else:
|
||||||
height=image.height(),
|
group = canvas.root()
|
||||||
anchor=anchor)
|
self._item = group.add(gnome.canvas.CanvasPixbuf,
|
||||||
|
x=x, y=y,
|
||||||
|
pixbuf=image.pixbuf,
|
||||||
|
width=image.width(),
|
||||||
|
height=image.height(),
|
||||||
|
anchor=anchor)
|
||||||
self._item.show()
|
self._item.show()
|
||||||
|
|
||||||
def config(self, image):
|
def config(self, image):
|
||||||
|
@ -183,35 +202,52 @@ class MfxCanvasLine(_CanvasItem):
|
||||||
kwargs['arrow_shape_a'] = kw['arrowshape'][0]
|
kwargs['arrow_shape_a'] = kw['arrowshape'][0]
|
||||||
kwargs['arrow_shape_b'] = kw['arrowshape'][1]
|
kwargs['arrow_shape_b'] = kw['arrowshape'][1]
|
||||||
kwargs['arrow_shape_c'] = kw['arrowshape'][2]
|
kwargs['arrow_shape_c'] = kw['arrowshape'][2]
|
||||||
self._item = canvas.root().add(gnome.canvas.CanvasLine,
|
if kw.has_key('group'):
|
||||||
points=points, **kwargs)
|
self._group = kw['group']
|
||||||
|
group = kw['group']._item
|
||||||
|
else:
|
||||||
|
group = canvas.root()
|
||||||
|
self._item = group.add(gnome.canvas.CanvasLine,
|
||||||
|
points=points, **kwargs)
|
||||||
self._item.show()
|
self._item.show()
|
||||||
#canvas.show_all()
|
|
||||||
|
|
||||||
|
|
||||||
class MfxCanvasRectangle(_CanvasItem):
|
class MfxCanvasRectangle(_CanvasItem):
|
||||||
def __init__(self, canvas, x1, y1, x2, y2,
|
def __init__(self, canvas, x1, y1, x2, y2,
|
||||||
width=0, fill=None, outline=None):
|
width=0, fill=None, outline=None, group=None):
|
||||||
_CanvasItem.__init__(self, canvas)
|
_CanvasItem.__init__(self, canvas)
|
||||||
|
self._x, self._y = x1, y1
|
||||||
kw = {'x1': x1, 'x2': x2, 'y1': y1, 'y2': y2}
|
kw = {'x1': x1, 'x2': x2, 'y1': y1, 'y2': y2}
|
||||||
if width: kw['width_pixels'] = width
|
if width: kw['width_pixels'] = width
|
||||||
if fill: kw['fill_color'] = fill
|
if fill: kw['fill_color'] = fill
|
||||||
if outline: kw['outline_color'] = outline
|
if outline: kw['outline_color'] = outline
|
||||||
self._item = canvas.root().add(gnome.canvas.CanvasRect, **kw)
|
if group:
|
||||||
|
self._group = group
|
||||||
|
group = group._item
|
||||||
|
else:
|
||||||
|
group = canvas.root()
|
||||||
|
self._item = group.add(gnome.canvas.CanvasRect, **kw)
|
||||||
self._item.show()
|
self._item.show()
|
||||||
|
|
||||||
|
|
||||||
class MfxCanvasText(_CanvasItem):
|
class MfxCanvasText(_CanvasItem):
|
||||||
def __init__(self, canvas, x, y, anchor=gtk.ANCHOR_NW, preview=-1, **kw):
|
def __init__(self, canvas, x, y, anchor=gtk.ANCHOR_NW, preview=-1, **kw):
|
||||||
_CanvasItem.__init__(self, canvas)
|
_CanvasItem.__init__(self, canvas)
|
||||||
|
self._x, self._y = x, y
|
||||||
if preview < 0:
|
if preview < 0:
|
||||||
preview = canvas.preview
|
preview = canvas.preview
|
||||||
if preview > 1:
|
if preview > 1:
|
||||||
self._item = None
|
self._item = None
|
||||||
return
|
return
|
||||||
anchor = anchor_tk2gtk(anchor)
|
anchor = anchor_tk2gtk(anchor)
|
||||||
self._item = canvas.root().add(gnome.canvas.CanvasText,
|
if kw.has_key('group'):
|
||||||
x=x, y=y, anchor=anchor)
|
self._group = kw['group']
|
||||||
|
group = kw['group']._item
|
||||||
|
del kw['group']
|
||||||
|
else:
|
||||||
|
group = canvas.root()
|
||||||
|
self._item = group.add(gnome.canvas.CanvasText,
|
||||||
|
x=x, y=y, anchor=anchor)
|
||||||
if not kw.has_key('fill'):
|
if not kw.has_key('fill'):
|
||||||
kw['fill'] = canvas._text_color
|
kw['fill'] = canvas._text_color
|
||||||
for k, v in kw.items():
|
for k, v in kw.items():
|
||||||
|
@ -236,7 +272,6 @@ class MfxCanvasText(_CanvasItem):
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
if key == 'text':
|
if key == 'text':
|
||||||
# FIXME
|
|
||||||
return self._item.get_property('text')
|
return self._item.get_property('text')
|
||||||
else:
|
else:
|
||||||
raise AttributeError, key
|
raise AttributeError, key
|
||||||
|
@ -295,7 +330,7 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
def bind(self, sequence=None, func=None, add=None):
|
def bind(self, sequence=None, func=None, add=None):
|
||||||
assert add is None
|
assert add is None
|
||||||
# FIXME
|
# FIXME
|
||||||
print "TkCanvas bind:", sequence
|
print 'TkCanvas bind:', sequence
|
||||||
return
|
return
|
||||||
|
|
||||||
def cget(self, attr):
|
def cget(self, attr):
|
||||||
|
@ -307,7 +342,7 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
return self.get_size()[0]
|
return self.get_size()[0]
|
||||||
elif attr == 'height':
|
elif attr == 'height':
|
||||||
return self.get_size()[1]
|
return self.get_size()[1]
|
||||||
print "TkCanvas cget:", attr
|
print 'TkCanvas cget:', attr
|
||||||
raise AttributeError, attr
|
raise AttributeError, attr
|
||||||
|
|
||||||
def xview(self):
|
def xview(self):
|
||||||
|
@ -327,20 +362,20 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
def configure(self, **kw):
|
def configure(self, **kw):
|
||||||
height, width = -1, -1
|
height, width = -1, -1
|
||||||
for k, v in kw.items():
|
for k, v in kw.items():
|
||||||
if k in ("background", "bg"):
|
if k in ('background', 'bg'):
|
||||||
##print 'configure: bg:', v
|
##print 'configure: bg:', v
|
||||||
c = self.get_colormap().alloc_color(v)
|
c = self.get_colormap().alloc_color(v)
|
||||||
self.style.bg[gtk.STATE_NORMAL] = c
|
self.style.bg[gtk.STATE_NORMAL] = c
|
||||||
elif k == "cursor":
|
elif k == 'cursor':
|
||||||
if not self.window:
|
if not self.window:
|
||||||
self.realize()
|
self.realize()
|
||||||
self.window.set_cursor(gdk.Cursor(v))
|
self.window.set_cursor(gdk.Cursor(v))
|
||||||
elif k == "height":
|
elif k == 'height':
|
||||||
height = v
|
height = v
|
||||||
elif k == "width":
|
elif k == 'width':
|
||||||
width = v
|
width = v
|
||||||
else:
|
else:
|
||||||
print "TkCanvas", k, v
|
print 'TkCanvas', k, v
|
||||||
raise AttributeError, k
|
raise AttributeError, k
|
||||||
if height > 0 and width > 0:
|
if height > 0 and width > 0:
|
||||||
self.set_size_request(width, height)
|
self.set_size_request(width, height)
|
||||||
|
@ -386,7 +421,7 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
if self._text_color != color:
|
if self._text_color != color:
|
||||||
self._text_color = color
|
self._text_color = color
|
||||||
for item in self._text_items:
|
for item in self._text_items:
|
||||||
item.set(fill_color=_self.text_color)
|
item._item.set(fill_color=self._text_color)
|
||||||
|
|
||||||
# PySol extension - set a tiled background image
|
# PySol extension - set a tiled background image
|
||||||
def setTile(self, app, i, force=False):
|
def setTile(self, app, i, force=False):
|
||||||
|
@ -402,7 +437,8 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
assert tile.filename
|
assert tile.filename
|
||||||
assert tile.basename
|
assert tile.basename
|
||||||
if not force:
|
if not force:
|
||||||
if i == app.tabletile_index and tile.color == app.opt.table_color:
|
if (i == app.tabletile_index and
|
||||||
|
tile.color == app.opt.colors['table']):
|
||||||
return False
|
return False
|
||||||
if self._tile is tile:
|
if self._tile is tile:
|
||||||
return False
|
return False
|
||||||
|
@ -420,10 +456,10 @@ class MfxCanvas(gnome.canvas.Canvas):
|
||||||
self.configure(bg=self.top_bg)
|
self.configure(bg=self.top_bg)
|
||||||
color = tile.text_color
|
color = tile.text_color
|
||||||
|
|
||||||
if app.opt.table_text_color:
|
if app.opt.use_default_text_color:
|
||||||
self.setTextColor(app.opt.table_text_color_value)
|
|
||||||
else:
|
|
||||||
self.setTextColor(color)
|
self.setTextColor(color)
|
||||||
|
else:
|
||||||
|
self.setTextColor(app.opt.colors['text'])
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,7 @@
|
||||||
## vim:ts=4:et:nowrap
|
|
||||||
##
|
|
||||||
##---------------------------------------------------------------------------##
|
##---------------------------------------------------------------------------##
|
||||||
##
|
##
|
||||||
## PySol -- a Python Solitaire game
|
## 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
|
## 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
|
## it under the terms of the GNU General Public License as published by
|
||||||
## the Free Software Foundation; either version 2 of the License, or
|
## the Free Software Foundation; either version 2 of the License, or
|
||||||
|
@ -23,10 +17,6 @@
|
||||||
## If not, write to the Free Software Foundation, Inc.,
|
## If not, write to the Free Software Foundation, Inc.,
|
||||||
## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
## 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
|
|
||||||
##
|
|
||||||
##---------------------------------------------------------------------------##
|
##---------------------------------------------------------------------------##
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,16 +27,13 @@ import gtk.glade
|
||||||
|
|
||||||
# PySol imports
|
# PySol imports
|
||||||
from pysollib.mfxutil import format_time
|
from pysollib.mfxutil import format_time
|
||||||
from pysollib.settings import TOP_TITLE
|
from pysollib.settings import TOP_TITLE, PACKAGE
|
||||||
from pysollib.stats import PysolStatsFormatter
|
from pysollib.stats import PysolStatsFormatter
|
||||||
|
|
||||||
# Toolkit imports
|
# Toolkit imports
|
||||||
from tkwidget import MfxDialog, MfxMessageDialog
|
from tkwidget import MfxDialog, MfxMessageDialog
|
||||||
|
|
||||||
|
gettext = _
|
||||||
glade_file = os.path.join(sys.path[0], 'data', 'pysolfc.glade')
|
|
||||||
|
|
||||||
open(glade_file)
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
@ -54,6 +41,7 @@ open(glade_file)
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
class StatsWriter(PysolStatsFormatter.StringWriter):
|
class StatsWriter(PysolStatsFormatter.StringWriter):
|
||||||
|
|
||||||
def __init__(self, store):
|
def __init__(self, store):
|
||||||
self.store = store
|
self.store = store
|
||||||
|
|
||||||
|
@ -70,7 +58,7 @@ class StatsWriter(PysolStatsFormatter.StringWriter):
|
||||||
return
|
return
|
||||||
iter = self.store.append(None)
|
iter = self.store.append(None)
|
||||||
self.store.set(iter,
|
self.store.set(iter,
|
||||||
0, args[0],
|
0, gettext(args[0]),
|
||||||
1, args[1],
|
1, args[1],
|
||||||
2, args[2],
|
2, args[2],
|
||||||
3, args[3],
|
3, args[3],
|
||||||
|
@ -80,9 +68,12 @@ class StatsWriter(PysolStatsFormatter.StringWriter):
|
||||||
7, gameid)
|
7, gameid)
|
||||||
|
|
||||||
|
|
||||||
class FullLogWriter(PysolStatsFormatter.StringWriter):
|
class LogWriter(PysolStatsFormatter.StringWriter):
|
||||||
|
MAX_ROWS = 10000
|
||||||
|
|
||||||
def __init__(self, store):
|
def __init__(self, store):
|
||||||
self.store = store
|
self.store = store
|
||||||
|
self._num_rows = 0
|
||||||
|
|
||||||
def p(self, s):
|
def p(self, s):
|
||||||
pass
|
pass
|
||||||
|
@ -94,13 +85,16 @@ class FullLogWriter(PysolStatsFormatter.StringWriter):
|
||||||
if gameid < 0:
|
if gameid < 0:
|
||||||
# header
|
# header
|
||||||
return
|
return
|
||||||
|
if self._num_rows > self.MAX_ROWS:
|
||||||
|
return
|
||||||
iter = self.store.append(None)
|
iter = self.store.append(None)
|
||||||
self.store.set(iter,
|
self.store.set(iter,
|
||||||
0, gamename,
|
0, gettext(gamename),
|
||||||
1, gamenumber,
|
1, gamenumber,
|
||||||
2, date,
|
2, date,
|
||||||
3, status,
|
3, status,
|
||||||
4, gameid)
|
4, gameid)
|
||||||
|
self._num_rows += 1
|
||||||
|
|
||||||
|
|
||||||
class Game_StatsDialog:
|
class Game_StatsDialog:
|
||||||
|
@ -108,49 +102,153 @@ class Game_StatsDialog:
|
||||||
def __init__(self, parent, header, app, player, gameid):
|
def __init__(self, parent, header, app, player, gameid):
|
||||||
#
|
#
|
||||||
self.app = app
|
self.app = app
|
||||||
|
self.player = player
|
||||||
|
self.gameid = gameid
|
||||||
|
self.games = {}
|
||||||
|
self.games_id = [] # sorted by name
|
||||||
|
#
|
||||||
formatter = PysolStatsFormatter(self.app)
|
formatter = PysolStatsFormatter(self.app)
|
||||||
|
glade_file = app.dataloader.findFile('pysolfc.glade')
|
||||||
|
#
|
||||||
|
games = app.gdb.getGamesIdSortedByName()
|
||||||
|
n = 0
|
||||||
|
current = 0
|
||||||
|
for id in games:
|
||||||
|
won, lost = self.app.stats.getStats(self.player, id)
|
||||||
|
if won+lost > 0 or id == gameid:
|
||||||
|
gi = app.gdb.get(id)
|
||||||
|
if id == gameid:
|
||||||
|
current = n
|
||||||
|
self.games[n] = gi
|
||||||
|
self.games_id.append(id)
|
||||||
|
n += 1
|
||||||
#
|
#
|
||||||
self.widgets_tree = gtk.glade.XML(glade_file)
|
self.widgets_tree = gtk.glade.XML(glade_file)
|
||||||
#game_name_combo = self.widgets_tree.get_widget('game_name_combo')
|
|
||||||
#model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT)
|
|
||||||
#game_name_combo.set_model(model)
|
|
||||||
#game_name_combo.set_text_column(0)
|
|
||||||
stats_dialog = self.widgets_tree.get_widget('stats_dialog')
|
|
||||||
stats_dialog.set_title('Game Statistics')
|
|
||||||
stats_dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
|
||||||
# total
|
|
||||||
won, lost = app.stats.getStats(player, gameid)
|
|
||||||
self._createText('total', won, lost)
|
|
||||||
drawing = self.widgets_tree.get_widget('total_drawingarea')
|
|
||||||
drawing.connect('expose_event', self._createChart, won, lost)
|
|
||||||
# current session
|
|
||||||
won, lost = app.stats.getSessionStats(player, gameid)
|
|
||||||
self._createText('current', won, lost)
|
|
||||||
drawing = self.widgets_tree.get_widget('session_drawingarea')
|
|
||||||
drawing.connect('expose_event', self._createChart, won, lost)
|
|
||||||
#
|
#
|
||||||
|
table = self.widgets_tree.get_widget('current_game_table')
|
||||||
|
combo = self._createGameCombo(table, 1, 0, self._currentComboChanged)
|
||||||
|
# total
|
||||||
|
self._createText('total')
|
||||||
|
drawing = self.widgets_tree.get_widget('total_drawingarea')
|
||||||
|
drawing.connect('expose_event', self._drawingExposeEvent, 'total')
|
||||||
|
# current session
|
||||||
|
self._createText('session')
|
||||||
|
drawing = self.widgets_tree.get_widget('session_drawingarea')
|
||||||
|
drawing.connect('expose_event', self._drawingExposeEvent, 'session')
|
||||||
|
# top 10
|
||||||
|
table = self.widgets_tree.get_widget('top_10_table')
|
||||||
|
combo = self._createGameCombo(table, 1, 0, self._top10ComboChanged)
|
||||||
|
self._createTop()
|
||||||
|
self._updateTop(gameid)
|
||||||
|
# all games stat
|
||||||
store = self._createStatsList()
|
store = self._createStatsList()
|
||||||
writer = StatsWriter(store)
|
writer = StatsWriter(store)
|
||||||
formatter.writeStats(writer, player, header, sort_by='name')
|
formatter.writeStats(writer, player, header, sort_by='name')
|
||||||
#
|
# full log
|
||||||
store = self._createLogList('full_log_treeview')
|
store = self._createLogList('full_log_treeview')
|
||||||
writer = FullLogWriter(store)
|
writer = LogWriter(store)
|
||||||
formatter.writeFullLog(writer, player, header)
|
formatter.writeFullLog(writer, player, header)
|
||||||
#
|
# session log
|
||||||
store = self._createLogList('session_log_treeview')
|
store = self._createLogList('session_log_treeview')
|
||||||
writer = FullLogWriter(store)
|
writer = LogWriter(store)
|
||||||
formatter.writeSessionLog(writer, player, header)
|
formatter.writeSessionLog(writer, player, header)
|
||||||
#
|
#
|
||||||
stats_dialog.set_transient_for(parent)
|
self._translateLabels()
|
||||||
stats_dialog.resize(400, 300)
|
dialog = self.widgets_tree.get_widget('stats_dialog')
|
||||||
|
dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
stats_dialog.run()
|
dialog.set_transient_for(parent)
|
||||||
|
dialog.resize(500, 340)
|
||||||
|
dialog.set_title(PACKAGE+' - '+_("Statistics"))
|
||||||
|
#
|
||||||
|
dialog.run()
|
||||||
self.status = -1
|
self.status = -1
|
||||||
stats_dialog.destroy()
|
dialog.destroy()
|
||||||
|
|
||||||
|
|
||||||
def _createText(self, name, won, lost):
|
def _translateLabels(self):
|
||||||
|
# mnemonic
|
||||||
|
for n in (
|
||||||
|
'label1',
|
||||||
|
'label2',
|
||||||
|
'label3',
|
||||||
|
'label4',
|
||||||
|
'label15',
|
||||||
|
'label16',
|
||||||
|
'label17',
|
||||||
|
'label18',
|
||||||
|
):
|
||||||
|
w = self.widgets_tree.get_widget(n)
|
||||||
|
w.set_text_with_mnemonic(gettext(w.get_label()))
|
||||||
|
# simple
|
||||||
|
for n in (
|
||||||
|
'label5',
|
||||||
|
'label6',
|
||||||
|
'label7',
|
||||||
|
'label14'
|
||||||
|
):
|
||||||
|
w = self.widgets_tree.get_widget(n)
|
||||||
|
w.set_text(gettext(w.get_text()))
|
||||||
|
# markup
|
||||||
|
for n in (
|
||||||
|
'label8',
|
||||||
|
'label9',
|
||||||
|
'label10',
|
||||||
|
'label11',
|
||||||
|
'label12',
|
||||||
|
'label13',
|
||||||
|
'label19',
|
||||||
|
'label20',
|
||||||
|
'label21',
|
||||||
|
'label22',
|
||||||
|
'label23',
|
||||||
|
'label24',
|
||||||
|
):
|
||||||
|
w = self.widgets_tree.get_widget(n)
|
||||||
|
s = gettext(w.get_label())
|
||||||
|
w.set_markup('<b>%s</b>' % s)
|
||||||
|
|
||||||
|
|
||||||
|
def _createGameCombo(self, table, x, y, callback):
|
||||||
|
combo = gtk.combo_box_new_text()
|
||||||
|
combo.show()
|
||||||
|
table.attach(combo,
|
||||||
|
x, x+1, y, y+1,
|
||||||
|
gtk.FILL|gtk.EXPAND, 0,
|
||||||
|
4, 4)
|
||||||
|
#
|
||||||
|
n = 0
|
||||||
|
current = 0
|
||||||
|
for id in self.games_id:
|
||||||
|
gi = self.app.gdb.get(id)
|
||||||
|
combo.append_text(gettext(gi.name))
|
||||||
|
if id == self.gameid:
|
||||||
|
current = n
|
||||||
|
n += 1
|
||||||
|
combo.set_active(current)
|
||||||
|
combo.connect('changed', callback) #self._comboChanged)
|
||||||
|
|
||||||
|
|
||||||
|
def _currentComboChanged(self, w):
|
||||||
|
gi = self.games[w.get_active()]
|
||||||
|
self.gameid = gi.id
|
||||||
|
self._createText('total')
|
||||||
|
drawing = self.widgets_tree.get_widget('total_drawingarea')
|
||||||
|
self._createChart(drawing, 'total')
|
||||||
|
self._createText('session')
|
||||||
|
drawing = self.widgets_tree.get_widget('session_drawingarea')
|
||||||
|
self._createChart(drawing, 'session')
|
||||||
|
|
||||||
|
|
||||||
|
def _top10ComboChanged(self, w):
|
||||||
|
gi = self.games[w.get_active()]
|
||||||
|
self._updateTop(gi.id)
|
||||||
|
|
||||||
|
|
||||||
|
def _createText(self, name):
|
||||||
|
if name == 'total':
|
||||||
|
won, lost = self.app.stats.getStats(self.player, self.gameid)
|
||||||
|
else:
|
||||||
|
won, lost = self.app.stats.getSessionStats(self.player, self.gameid)
|
||||||
pwon, plost = self._getPwon(won, lost)
|
pwon, plost = self._getPwon(won, lost)
|
||||||
label = self.widgets_tree.get_widget(name+'_num_won_label')
|
label = self.widgets_tree.get_widget(name+'_num_won_label')
|
||||||
label.set_text(str(won))
|
label.set_text(str(won))
|
||||||
|
@ -164,7 +262,15 @@ class Game_StatsDialog:
|
||||||
label.set_text(str(won+lost))
|
label.set_text(str(won+lost))
|
||||||
|
|
||||||
|
|
||||||
def _createChart(self, drawing, e, won, lost):
|
def _drawingExposeEvent(self, drawing, e, frame):
|
||||||
|
self._createChart(drawing, frame)
|
||||||
|
|
||||||
|
|
||||||
|
def _createChart(self, drawing, frame):
|
||||||
|
if frame == 'total':
|
||||||
|
won, lost = self.app.stats.getStats(self.player, self.gameid)
|
||||||
|
else:
|
||||||
|
won, lost = self.app.stats.getSessionStats(self.player, self.gameid)
|
||||||
pwon, plost = self._getPwon(won, lost)
|
pwon, plost = self._getPwon(won, lost)
|
||||||
s, ewon, elost = 0, int(360.0*pwon), int(360.0*plost)
|
s, ewon, elost = 0, int(360.0*pwon), int(360.0*plost)
|
||||||
|
|
||||||
|
@ -182,34 +288,128 @@ class Game_StatsDialog:
|
||||||
y = y-dy/2
|
y = y-dy/2
|
||||||
|
|
||||||
if won+lost > 0:
|
if won+lost > 0:
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#007f00'))
|
gc.set_foreground(colormap.alloc_color('#008000'))
|
||||||
win.draw_arc(gc, True, x, y+dy, w, h, s*64, ewon*64)
|
win.draw_arc(gc, True, x, y+dy, w, h, s*64, ewon*64)
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#7f0000'))
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
|
win.draw_arc(gc, False, x, y+dy, w, h, s*64, ewon*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('#800000'))
|
||||||
win.draw_arc(gc, True, x, y+dy, w, h, (s+ewon)*64, elost*64)
|
win.draw_arc(gc, True, x, y+dy, w, h, (s+ewon)*64, elost*64)
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#00ff00'))
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
|
win.draw_arc(gc, False, x, y+dy, w, h, (s+ewon)*64, elost*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('#00ff00'))
|
||||||
win.draw_arc(gc, True, x, y, w, h, s*64, ewon*64)
|
win.draw_arc(gc, True, x, y, w, h, s*64, ewon*64)
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#ff0000'))
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
|
win.draw_arc(gc, False, x, y, w, h, s*64, ewon*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('#ff0000'))
|
||||||
win.draw_arc(gc, True, x, y, w, h, (s+ewon)*64, elost*64)
|
win.draw_arc(gc, True, x, y, w, h, (s+ewon)*64, elost*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
|
win.draw_arc(gc, False, x, y, w, h, (s+ewon)*64, elost*64)
|
||||||
else:
|
else:
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#7f7f7f'))
|
gc.set_foreground(colormap.alloc_color('#808080'))
|
||||||
win.draw_arc(gc, True, x, y+dy, w, h, 0, 360*64)
|
win.draw_arc(gc, True, x, y+dy, w, h, 0, 360*64)
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#f0f0f0'))
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
|
win.draw_arc(gc, False, x, y+dy, w, h, 0, 360*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('#f0f0f0'))
|
||||||
win.draw_arc(gc, True, x, y, w, h, 0, 360*64)
|
win.draw_arc(gc, True, x, y, w, h, 0, 360*64)
|
||||||
gc.set_rgb_fg_color(colormap.alloc_color('#bfbfbf'))
|
gc.set_foreground(colormap.alloc_color('black'))
|
||||||
pangolayout = drawing.create_pango_layout('No games')
|
win.draw_arc(gc, False, x, y, w, h, 0, 360*64)
|
||||||
|
gc.set_foreground(colormap.alloc_color('#a0a0a0'))
|
||||||
|
pangolayout = drawing.create_pango_layout(_('No games'))
|
||||||
ext = pangolayout.get_extents()
|
ext = pangolayout.get_extents()
|
||||||
tw, th = ext[1][2]/pango.SCALE, ext[1][3]/pango.SCALE
|
tw, th = ext[1][2]/pango.SCALE, ext[1][3]/pango.SCALE
|
||||||
win.draw_layout(
|
win.draw_layout(gc, x+w/2-tw/2, y+h/2-th/2, pangolayout)
|
||||||
gc,
|
|
||||||
x+w/2-tw/2, y+h/2-th/2,
|
|
||||||
pangolayout)
|
def _createTop(self):
|
||||||
|
for n in ('top_10_time_treeview',
|
||||||
|
'top_10_moves_treeview',
|
||||||
|
'top_10_total_moves_treeview'):
|
||||||
|
self._createTopList(n)
|
||||||
|
|
||||||
|
|
||||||
|
def _updateTop(self, gameid):
|
||||||
|
if (not self.app.stats.games_stats.has_key(self.player) or
|
||||||
|
not self.app.stats.games_stats[self.player].has_key(gameid) or
|
||||||
|
not self.app.stats.games_stats[self.player][gameid].time_result.top):
|
||||||
|
return
|
||||||
|
|
||||||
|
s = self.app.stats.games_stats[self.player][gameid]
|
||||||
|
|
||||||
|
label = self.widgets_tree.get_widget('playing_time_minimum_label')
|
||||||
|
label.set_text(format_time(s.time_result.min))
|
||||||
|
label = self.widgets_tree.get_widget('playing_time_maximum_label')
|
||||||
|
label.set_text(format_time(s.time_result.max))
|
||||||
|
label = self.widgets_tree.get_widget('playing_time_average_label')
|
||||||
|
label.set_text(format_time(s.time_result.average))
|
||||||
|
|
||||||
|
label = self.widgets_tree.get_widget('moves_minimum_label')
|
||||||
|
label.set_text(str(s.moves_result.min))
|
||||||
|
label = self.widgets_tree.get_widget('moves_maximum_label')
|
||||||
|
label.set_text(str(s.moves_result.max))
|
||||||
|
label = self.widgets_tree.get_widget('moves_average_label')
|
||||||
|
label.set_text(str(round(s.moves_result.average, 2)))
|
||||||
|
|
||||||
|
label = self.widgets_tree.get_widget('total_moves_minimum_label')
|
||||||
|
label.set_text(str(s.total_moves_result.min))
|
||||||
|
label = self.widgets_tree.get_widget('total_moves_maximum_label')
|
||||||
|
label.set_text(str(s.total_moves_result.max))
|
||||||
|
label = self.widgets_tree.get_widget('total_moves_average_label')
|
||||||
|
label.set_text(str(round(s.total_moves_result.average, 2)))
|
||||||
|
|
||||||
|
for n, ss in (
|
||||||
|
('top_10_time_treeview', s.time_result.top),
|
||||||
|
('top_10_moves_treeview', s.moves_result.top),
|
||||||
|
('top_10_total_moves_treeview', s.total_moves_result.top)):
|
||||||
|
self._updateTopList(n, ss)
|
||||||
|
|
||||||
|
|
||||||
|
def _createTopList(self, tv_name):
|
||||||
|
treeview = self.widgets_tree.get_widget(tv_name)
|
||||||
|
store = gtk.ListStore(gobject.TYPE_INT, # N
|
||||||
|
gobject.TYPE_STRING, # number
|
||||||
|
gobject.TYPE_STRING, # started at
|
||||||
|
gobject.TYPE_STRING, # result
|
||||||
|
gobject.TYPE_STRING, # result
|
||||||
|
)
|
||||||
|
treeview.set_model(store)
|
||||||
|
n = 0
|
||||||
|
for label in (
|
||||||
|
_('N'),
|
||||||
|
_('Game number'),
|
||||||
|
_('Started at'),
|
||||||
|
_('Result'),
|
||||||
|
):
|
||||||
|
column = gtk.TreeViewColumn(label, gtk.CellRendererText(), text=n)
|
||||||
|
column.set_resizable(True)
|
||||||
|
##column.set_sort_column_id(n)
|
||||||
|
treeview.append_column(column)
|
||||||
|
n += 1
|
||||||
|
|
||||||
|
|
||||||
|
def _updateTopList(self, tv_name, top):
|
||||||
|
treeview = self.widgets_tree.get_widget(tv_name)
|
||||||
|
store = treeview.get_model()
|
||||||
|
store.clear()
|
||||||
|
row = 1
|
||||||
|
for i in top:
|
||||||
|
t = time.strftime('%Y-%m-%d %H:%M',
|
||||||
|
time.localtime(i.game_start_time))
|
||||||
|
if isinstance(i.value, float):
|
||||||
|
# time
|
||||||
|
r = format_time(i.value)
|
||||||
|
else:
|
||||||
|
# moves
|
||||||
|
r = str(i.value)
|
||||||
|
iter = store.append(None)
|
||||||
|
store.set(iter, 0, row, 1, i.game_number, 2, t, 3, r)
|
||||||
|
row += 1
|
||||||
|
|
||||||
|
|
||||||
def _createStatsList(self):
|
def _createStatsList(self):
|
||||||
treeview = self.widgets_tree.get_widget('all_games_treeview')
|
treeview = self.widgets_tree.get_widget('all_games_treeview')
|
||||||
n = 0
|
n = 0
|
||||||
for label in (
|
for label in (
|
||||||
'',
|
_('Game'),
|
||||||
_('Played'),
|
_('Played'),
|
||||||
_('Won'),
|
_('Won'),
|
||||||
_('Lost'),
|
_('Lost'),
|
||||||
|
@ -234,10 +434,11 @@ class Game_StatsDialog:
|
||||||
gobject.TYPE_INT, # gameid
|
gobject.TYPE_INT, # gameid
|
||||||
)
|
)
|
||||||
sortable = gtk.TreeModelSort(store)
|
sortable = gtk.TreeModelSort(store)
|
||||||
treeview.set_model(sortable)
|
|
||||||
sortable.set_sort_func(4, self._cmpPlayingTime)
|
sortable.set_sort_func(4, self._cmpPlayingTime)
|
||||||
sortable.set_sort_func(5, self._cmpMoves)
|
sortable.set_sort_func(5, self._cmpMoves)
|
||||||
sortable.set_sort_func(6, self._cmpPercent)
|
sortable.set_sort_func(6, self._cmpPercent)
|
||||||
|
treeview.set_model(sortable)
|
||||||
|
treeview.set_rules_hint(True)
|
||||||
return store
|
return store
|
||||||
|
|
||||||
|
|
||||||
|
@ -265,6 +466,7 @@ class Game_StatsDialog:
|
||||||
gobject.TYPE_INT, # gameid
|
gobject.TYPE_INT, # gameid
|
||||||
)
|
)
|
||||||
treeview.set_model(store)
|
treeview.set_model(store)
|
||||||
|
treeview.set_rules_hint(True)
|
||||||
return store
|
return store
|
||||||
|
|
||||||
|
|
||||||
|
@ -300,15 +502,10 @@ class Game_StatsDialog:
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
SingleGame_StatsDialog = Game_StatsDialog
|
SingleGame_StatsDialog = Game_StatsDialog
|
||||||
|
AllGames_StatsDialog = Game_StatsDialog
|
||||||
class AllGames_StatsDialog(MfxDialog):
|
FullLog_StatsDialog = Game_StatsDialog
|
||||||
pass
|
SessionLog_StatsDialog = Game_StatsDialog
|
||||||
|
Top_StatsDialog = Game_StatsDialog
|
||||||
class FullLog_StatsDialog(AllGames_StatsDialog):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class SessionLog_StatsDialog(FullLog_StatsDialog):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
@ -334,32 +531,32 @@ class Status_StatsDialog(MfxMessageDialog): #MfxDialog
|
||||||
if game.s.foundations:
|
if game.s.foundations:
|
||||||
w2 = w2 + _('\nCards in Foundations: ') + str(n)
|
w2 = w2 + _('\nCards in Foundations: ') + str(n)
|
||||||
#
|
#
|
||||||
date = time.strftime('%Y-%m-%d %H:%M', time.localtime(game.gstats.start_time))
|
date = time.strftime('%Y-%m-%d %H:%M',
|
||||||
MfxMessageDialog.__init__(self, parent, title=_('Game status'),
|
time.localtime(game.gstats.start_time))
|
||||||
text=game.getTitleName() + '\n' +
|
MfxMessageDialog.__init__(
|
||||||
game.getGameNumber(format=1) + '\n' +
|
self, parent, title=_('Game status'),
|
||||||
_('Playing time: ') + game.getTime() + '\n' +
|
text=game.getTitleName() + '\n' +
|
||||||
_('Started at: ') + date + '\n\n'+
|
game.getGameNumber(format=1) + '\n' +
|
||||||
_('Moves: ') + str(game.moves.index) + '\n' +
|
_('Playing time: ') + game.getTime() + '\n' +
|
||||||
_('Undo moves: ') + str(stats.undo_moves) + '\n' +
|
_('Started at: ') + date + '\n\n'+
|
||||||
_('Bookmark moves: ') + str(gstats.goto_bookmark_moves) + '\n' +
|
_('Moves: ') + str(game.moves.index) + '\n' +
|
||||||
_('Demo moves: ') + str(stats.demo_moves) + '\n' +
|
_('Undo moves: ') + str(stats.undo_moves) + '\n' +
|
||||||
_('Total player moves: ') + str(stats.player_moves) + '\n' +
|
_('Bookmark moves: ') + str(gstats.goto_bookmark_moves) + '\n' +
|
||||||
_('Total moves in this game: ') + str(stats.total_moves) + '\n' +
|
_('Demo moves: ') + str(stats.demo_moves) + '\n' +
|
||||||
_('Hints: ') + str(stats.hints) + '\n' +
|
_('Total player moves: ') + str(stats.player_moves) + '\n' +
|
||||||
'\n' +
|
_('Total moves in this game: ') + str(stats.total_moves) + '\n' +
|
||||||
w1 + w2,
|
_('Hints: ') + str(stats.hints) + '\n' +
|
||||||
strings=(_('&OK'),
|
'\n' +
|
||||||
(_('&Statistics...'), 101),
|
w1 + w2,
|
||||||
(TOP_TITLE+'...', 105), ),
|
strings=(_('&OK'),
|
||||||
image=game.app.gimages.logos[3],
|
(_('&Statistics...'), 101), ),
|
||||||
image_side='left', image_padx=20,
|
image=game.app.gimages.logos[3],
|
||||||
padx=20,
|
image_side='left', image_padx=20,
|
||||||
)
|
padx=20,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Top_StatsDialog(MfxDialog):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,9 @@ def createImage(width, height, fill, outline=None):
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
|
||||||
def _wrap_b1_press(e):
|
def _wrap_b1_press(e):
|
||||||
return e.type == gdk.BUTTON_PRESS and e.button == 1
|
return (e.type == gdk.BUTTON_PRESS and e.button == 1 and
|
||||||
|
not (e.state & gdk.CONTROL_MASK) and
|
||||||
|
not (e.state & gdk.SHIFT_MASK))
|
||||||
|
|
||||||
def _wrap_b1_double(e):
|
def _wrap_b1_double(e):
|
||||||
return e.type == gdk._2BUTTON_PRESS and e.button == 1
|
return e.type == gdk._2BUTTON_PRESS and e.button == 1
|
||||||
|
@ -179,7 +181,9 @@ def _wrap_b2_press(e):
|
||||||
return e.type == gdk.BUTTON_PRESS and e.button == 2
|
return e.type == gdk.BUTTON_PRESS and e.button == 2
|
||||||
|
|
||||||
def _wrap_b3_press(e):
|
def _wrap_b3_press(e):
|
||||||
return e.type == gdk.BUTTON_PRESS and e.button == 3
|
return (e.type == gdk.BUTTON_PRESS and e.button == 3 and
|
||||||
|
not (e.state & gdk.CONTROL_MASK) and
|
||||||
|
not (e.state & gdk.SHIFT_MASK))
|
||||||
|
|
||||||
def _wrap_b3_control(e):
|
def _wrap_b3_control(e):
|
||||||
return e.type == gdk.BUTTON_PRESS and e.button == 3 and (e.state & gdk.CONTROL_MASK)
|
return e.type == gdk.BUTTON_PRESS and e.button == 3 and (e.state & gdk.CONTROL_MASK)
|
||||||
|
|
|
@ -396,9 +396,9 @@ class Stack:
|
||||||
assert self.is_visible and self.images.bottom is None
|
assert self.is_visible and self.images.bottom is None
|
||||||
img = self.getBottomImage()
|
img = self.getBottomImage()
|
||||||
if img is not None:
|
if img is not None:
|
||||||
self.images.bottom = MfxCanvasImage(self.canvas, self.x, self.y,
|
self.images.bottom = MfxCanvasImage(self.canvas,self.x, self.y,
|
||||||
image=img, anchor=ANCHOR_NW)
|
image=img,anchor=ANCHOR_NW,
|
||||||
self.images.bottom.addtag(self.group)
|
group=self.group)
|
||||||
self.top_bottom = self.images.bottom
|
self.top_bottom = self.images.bottom
|
||||||
|
|
||||||
# invisible stack bottom
|
# invisible stack bottom
|
||||||
|
@ -410,8 +410,8 @@ class Stack:
|
||||||
self.items.bottom = MfxCanvasRectangle(self.canvas, self.x, self.y,
|
self.items.bottom = MfxCanvasRectangle(self.canvas, self.x, self.y,
|
||||||
self.x + images.CARDW,
|
self.x + images.CARDW,
|
||||||
self.y + images.CARDH,
|
self.y + images.CARDH,
|
||||||
fill="", outline="", width=0)
|
fill="", outline="", width=0,
|
||||||
self.items.bottom.addtag(self.group)
|
group=self.group)
|
||||||
self.top_bottom = self.items.bottom
|
self.top_bottom = self.items.bottom
|
||||||
|
|
||||||
# sanity checks
|
# sanity checks
|
||||||
|
@ -815,8 +815,9 @@ class Stack:
|
||||||
card = self.cards[i]
|
card = self.cards[i]
|
||||||
if not self.basicShallHighlightSameRank(card):
|
if not self.basicShallHighlightSameRank(card):
|
||||||
return 0
|
return 0
|
||||||
col = self.game.app.opt.highlight_samerank_colors
|
col_1 = self.game.app.opt.colors['samerank_1']
|
||||||
info = [ (self, card, card, col[1]) ]
|
col_2 = self.game.app.opt.colors['samerank_2']
|
||||||
|
info = [ (self, card, card, col_1) ]
|
||||||
for s in self.game.allstacks:
|
for s in self.game.allstacks:
|
||||||
for c in s.cards:
|
for c in s.cards:
|
||||||
if c is card: continue
|
if c is card: continue
|
||||||
|
@ -824,9 +825,9 @@ class Stack:
|
||||||
if c.rank != card.rank: continue
|
if c.rank != card.rank: continue
|
||||||
# ask the target stack
|
# ask the target stack
|
||||||
if s.basicShallHighlightSameRank(c):
|
if s.basicShallHighlightSameRank(c):
|
||||||
info.append((s, c, c, col[3]))
|
info.append((s, c, c, col_2))
|
||||||
self.game.stats.highlight_samerank = self.game.stats.highlight_samerank + 1
|
self.game.stats.highlight_samerank = self.game.stats.highlight_samerank + 1
|
||||||
return self.game._highlightCards(info, self.game.app.opt.highlight_samerank_sleep)
|
return self.game._highlightCards(info, self.game.app.opt.timeouts['highlight_samerank'])
|
||||||
|
|
||||||
def highlightMatchingCards(self, event):
|
def highlightMatchingCards(self, event):
|
||||||
i = self._findCard(event)
|
i = self._findCard(event)
|
||||||
|
@ -835,7 +836,8 @@ class Stack:
|
||||||
card = self.cards[i]
|
card = self.cards[i]
|
||||||
if not self.basicShallHighlightMatch(card):
|
if not self.basicShallHighlightMatch(card):
|
||||||
return 0
|
return 0
|
||||||
col = self.game.app.opt.highlight_cards_colors
|
col_1 = self.game.app.opt.colors['cards_1']
|
||||||
|
col_2 = self.game.app.opt.colors['cards_2']
|
||||||
c1 = c2 = card
|
c1 = c2 = card
|
||||||
info = []
|
info = []
|
||||||
found = 0
|
found = 0
|
||||||
|
@ -857,12 +859,12 @@ class Stack:
|
||||||
j = self.cards.index(c)
|
j = self.cards.index(c)
|
||||||
if i - 1 == j: c1 = c; continue
|
if i - 1 == j: c1 = c; continue
|
||||||
if i + 1 == j: c2 = c; continue
|
if i + 1 == j: c2 = c; continue
|
||||||
info.append((s, c, c, col[3]))
|
info.append((s, c, c, col_1))
|
||||||
if found:
|
if found:
|
||||||
if info:
|
if info:
|
||||||
self.game.stats.highlight_cards = self.game.stats.highlight_cards + 1
|
self.game.stats.highlight_cards = self.game.stats.highlight_cards + 1
|
||||||
info.append((self, c1, c2, col[1]))
|
info.append((self, c1, c2, col_2))
|
||||||
return self.game._highlightCards(info, self.game.app.opt.highlight_cards_sleep)
|
return self.game._highlightCards(info, self.game.app.opt.timeouts['highlight_cards'])
|
||||||
if not self.basicIsBlocked():
|
if not self.basicIsBlocked():
|
||||||
self.game.highlightNotMatching()
|
self.game.highlightNotMatching()
|
||||||
return 0
|
return 0
|
||||||
|
@ -886,7 +888,7 @@ class Stack:
|
||||||
##print self.cards[i]
|
##print self.cards[i]
|
||||||
self.cards[i].item.tkraise()
|
self.cards[i].item.tkraise()
|
||||||
self.game.canvas.update_idletasks()
|
self.game.canvas.update_idletasks()
|
||||||
self.game.sleep(self.game.app.opt.raise_card_sleep)
|
self.game.sleep(self.game.app.opt.timeouts['raise_card'])
|
||||||
if TOOLKIT == 'tk':
|
if TOOLKIT == 'tk':
|
||||||
self.cards[i].item.lower(self.cards[i+1].item)
|
self.cards[i].item.lower(self.cards[i+1].item)
|
||||||
elif TOOLKIT == 'gtk':
|
elif TOOLKIT == 'gtk':
|
||||||
|
@ -1064,8 +1066,8 @@ class Stack:
|
||||||
drag.noshade_stacks = [ self ]
|
drag.noshade_stacks = [ self ]
|
||||||
drag.cards = self.getDragCards(i)
|
drag.cards = self.getDragCards(i)
|
||||||
drag.index = i
|
drag.index = i
|
||||||
if TOOLKIT == 'gtk':
|
##if TOOLKIT == 'gtk':
|
||||||
drag.stack.group.tkraise()
|
## drag.stack.group.tkraise()
|
||||||
images = game.app.images
|
images = game.app.images
|
||||||
drag.shadows = self.createShadows(drag.cards)
|
drag.shadows = self.createShadows(drag.cards)
|
||||||
##sx, sy = 0, 0
|
##sx, sy = 0, 0
|
||||||
|
@ -1227,7 +1229,8 @@ class Stack:
|
||||||
if drag.shade_img:
|
if drag.shade_img:
|
||||||
drag.shade_img.moveTo(sx, sy)
|
drag.shade_img.moveTo(sx, sy)
|
||||||
else:
|
else:
|
||||||
img = MfxCanvasImage(game.canvas, sx, sy, image=img, anchor=ANCHOR_NW)
|
img = MfxCanvasImage(game.canvas, sx, sy,
|
||||||
|
image=img, anchor=ANCHOR_NW)
|
||||||
drag.shade_img = img
|
drag.shade_img = img
|
||||||
# raise/lower the shade image to the correct stacking order
|
# raise/lower the shade image to the correct stacking order
|
||||||
if TOOLKIT == 'tk':
|
if TOOLKIT == 'tk':
|
||||||
|
@ -1258,9 +1261,9 @@ class Stack:
|
||||||
#self.game.canvas.update_idletasks()
|
#self.game.canvas.update_idletasks()
|
||||||
card = self.cards[-1]
|
card = self.cards[-1]
|
||||||
item = MfxCanvasImage(self.game.canvas, card.x, card.y,
|
item = MfxCanvasImage(self.game.canvas, card.x, card.y,
|
||||||
image=img, anchor=ANCHOR_NW)
|
image=img, anchor=ANCHOR_NW,
|
||||||
|
group=self.group)
|
||||||
#item.tkraise()
|
#item.tkraise()
|
||||||
item.addtag(self.group)
|
|
||||||
self.items.shade_item = item
|
self.items.shade_item = item
|
||||||
|
|
||||||
def _unshadeStack(self):
|
def _unshadeStack(self):
|
||||||
|
@ -1566,15 +1569,16 @@ class TalonStack(Stack,
|
||||||
# add a redeal image above the bottom image
|
# add a redeal image above the bottom image
|
||||||
img = (self.getRedealImages())[self.max_rounds != 1]
|
img = (self.getRedealImages())[self.max_rounds != 1]
|
||||||
if img is not None:
|
if img is not None:
|
||||||
self.images.redeal = MfxCanvasImage(self.game.canvas, cx, cy,
|
|
||||||
image=img, anchor="center")
|
|
||||||
self.images.redeal_img = img
|
self.images.redeal_img = img
|
||||||
|
self.images.redeal = MfxCanvasImage(self.game.canvas,
|
||||||
|
cx, cy, image=img,
|
||||||
|
anchor="center",
|
||||||
|
group=self.group)
|
||||||
if TOOLKIT == 'tk':
|
if TOOLKIT == 'tk':
|
||||||
self.images.redeal.tkraise(self.top_bottom)
|
self.images.redeal.tkraise(self.top_bottom)
|
||||||
elif TOOLKIT == 'gtk':
|
elif TOOLKIT == 'gtk':
|
||||||
### FIXME
|
### FIXME
|
||||||
pass
|
pass
|
||||||
self.images.redeal.addtag(self.group)
|
|
||||||
self.top_bottom = self.images.redeal
|
self.top_bottom = self.images.redeal
|
||||||
if images.CARDH >= 90:
|
if images.CARDH >= 90:
|
||||||
cy, ca = self.y + images.CARDH - 4, "s"
|
cy, ca = self.y + images.CARDH - 4, "s"
|
||||||
|
@ -1585,16 +1589,16 @@ class TalonStack(Stack,
|
||||||
if images.CARDW >= text_width+4 and ca:
|
if images.CARDW >= text_width+4 and ca:
|
||||||
# add a redeal text above the bottom image
|
# add a redeal text above the bottom image
|
||||||
if self.max_rounds != 1:
|
if self.max_rounds != 1:
|
||||||
|
self.texts.redeal_str = ""
|
||||||
images = self.game.app.images
|
images = self.game.app.images
|
||||||
self.texts.redeal = MfxCanvasText(self.game.canvas, cx, cy,
|
self.texts.redeal = MfxCanvasText(self.game.canvas, cx, cy,
|
||||||
anchor=ca, font=font)
|
anchor=ca, font=font,
|
||||||
self.texts.redeal_str = ""
|
group=self.group)
|
||||||
if TOOLKIT == 'tk':
|
if TOOLKIT == 'tk':
|
||||||
self.texts.redeal.tkraise(self.top_bottom)
|
self.texts.redeal.tkraise(self.top_bottom)
|
||||||
elif TOOLKIT == 'gtk':
|
elif TOOLKIT == 'gtk':
|
||||||
### FIXME
|
### FIXME
|
||||||
pass
|
pass
|
||||||
self.texts.redeal.addtag(self.group)
|
|
||||||
self.top_bottom = self.texts.redeal
|
self.top_bottom = self.texts.redeal
|
||||||
|
|
||||||
def getBottomImage(self):
|
def getBottomImage(self):
|
||||||
|
|
|
@ -48,47 +48,43 @@ class ColorsDialog(MfxDialog):
|
||||||
frame.pack(expand=True, fill='both', padx=5, pady=10)
|
frame.pack(expand=True, fill='both', padx=5, pady=10)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
self.table_text_color_var = Tkinter.BooleanVar()
|
self.use_default_var = Tkinter.BooleanVar()
|
||||||
self.table_text_color_var.set(app.opt.table_text_color)
|
self.use_default_var.set(not app.opt.use_default_text_color)
|
||||||
self.table_text_color_value_var = Tkinter.StringVar()
|
self.text_var = Tkinter.StringVar()
|
||||||
self.table_text_color_value_var.set(app.opt.table_text_color_value)
|
self.text_var.set(app.opt.colors['text'])
|
||||||
##self.table_color_var = StringVar()
|
self.piles_var = Tkinter.StringVar()
|
||||||
##self.table_color_var.set(app.opt.table_color)
|
self.piles_var.set(app.opt.colors['piles'])
|
||||||
self.highlight_piles_colors_var = Tkinter.StringVar()
|
self.cards_1_var = Tkinter.StringVar()
|
||||||
self.highlight_piles_colors_var.set(app.opt.highlight_piles_colors[1])
|
self.cards_1_var.set(app.opt.colors['cards_1'])
|
||||||
self.highlight_cards_colors_1_var = Tkinter.StringVar()
|
self.cards_2_var = Tkinter.StringVar()
|
||||||
self.highlight_cards_colors_1_var.set(app.opt.highlight_cards_colors[1])
|
self.cards_2_var.set(app.opt.colors['cards_2'])
|
||||||
self.highlight_cards_colors_2_var = Tkinter.StringVar()
|
self.samerank_1_var = Tkinter.StringVar()
|
||||||
self.highlight_cards_colors_2_var.set(app.opt.highlight_cards_colors[3])
|
self.samerank_1_var.set(app.opt.colors['samerank_1'])
|
||||||
self.highlight_samerank_colors_1_var = Tkinter.StringVar()
|
self.samerank_2_var = Tkinter.StringVar()
|
||||||
self.highlight_samerank_colors_1_var.set(app.opt.highlight_samerank_colors[1])
|
self.samerank_2_var.set(app.opt.colors['samerank_2'])
|
||||||
self.highlight_samerank_colors_2_var = Tkinter.StringVar()
|
self.hintarrow_var = Tkinter.StringVar()
|
||||||
self.highlight_samerank_colors_2_var.set(app.opt.highlight_samerank_colors[3])
|
self.hintarrow_var.set(app.opt.colors['hintarrow'])
|
||||||
self.hintarrow_color_var = Tkinter.StringVar()
|
self.not_matching_var = Tkinter.StringVar()
|
||||||
self.hintarrow_color_var.set(app.opt.hintarrow_color)
|
self.not_matching_var.set(app.opt.colors['not_matching'])
|
||||||
self.highlight_not_matching_color_var = Tkinter.StringVar()
|
|
||||||
self.highlight_not_matching_color_var.set(app.opt.highlight_not_matching_color)
|
|
||||||
#
|
#
|
||||||
c = Tkinter.Checkbutton(frame, variable=self.table_text_color_var,
|
c = Tkinter.Checkbutton(frame, variable=self.use_default_var,
|
||||||
text=_("Text foreground:"), anchor='w')
|
text=_("Text foreground:"), anchor='w')
|
||||||
c.grid(row=0, column=0, sticky='we')
|
c.grid(row=0, column=0, sticky='we')
|
||||||
l = Tkinter.Label(frame, width=10, height=2,
|
l = Tkinter.Label(frame, width=10, height=2,
|
||||||
bg=self.table_text_color_value_var.get(),
|
bg=self.text_var.get(), textvariable=self.text_var)
|
||||||
textvariable=self.table_text_color_value_var)
|
|
||||||
l.grid(row=0, column=1, padx=5)
|
l.grid(row=0, column=1, padx=5)
|
||||||
b = Tkinter.Button(frame, text=_('Change...'), width=10,
|
b = Tkinter.Button(frame, text=_('Change...'), width=10,
|
||||||
command=lambda l=l: self.selectColor(l))
|
command=lambda l=l: self.selectColor(l))
|
||||||
b.grid(row=0, column=2)
|
b.grid(row=0, column=2)
|
||||||
row = 1
|
row = 1
|
||||||
for title, var in (
|
for title, var in (
|
||||||
##('Table:', self.table_color_var),
|
(_('Highlight piles:'), self.piles_var),
|
||||||
(_('Highlight piles:'), self.highlight_piles_colors_var),
|
(_('Highlight cards 1:'), self.cards_1_var),
|
||||||
(_('Highlight cards 1:'), self.highlight_cards_colors_1_var),
|
(_('Highlight cards 2:'), self.cards_2_var),
|
||||||
(_('Highlight cards 2:'), self.highlight_cards_colors_2_var),
|
(_('Highlight same rank 1:'), self.samerank_1_var),
|
||||||
(_('Highlight same rank 1:'), self.highlight_samerank_colors_1_var),
|
(_('Highlight same rank 2:'), self.samerank_2_var),
|
||||||
(_('Highlight same rank 2:'), self.highlight_samerank_colors_2_var),
|
(_('Hint arrow:'), self.hintarrow_var),
|
||||||
(_('Hint arrow:'), self.hintarrow_color_var),
|
(_('Highlight not matching:'), self.not_matching_var),
|
||||||
(_('Highlight not matching:'), self.highlight_not_matching_color_var),
|
|
||||||
):
|
):
|
||||||
Tkinter.Label(frame, text=title, anchor='w'
|
Tkinter.Label(frame, text=title, anchor='w'
|
||||||
).grid(row=row, column=0, sticky='we')
|
).grid(row=row, column=0, sticky='we')
|
||||||
|
@ -103,21 +99,15 @@ class ColorsDialog(MfxDialog):
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout)
|
self.mainloop(focus, kw.timeout)
|
||||||
#
|
#
|
||||||
self.table_text_color = self.table_text_color_var.get()
|
self.use_default_color = not self.use_default_var.get()
|
||||||
self.table_text_color_value = self.table_text_color_value_var.get()
|
self.text_color = self.text_var.get()
|
||||||
##self.table_color = self.table_color_var.get()
|
self.piles_color = self.piles_var.get()
|
||||||
self.highlight_piles_colors = (None,
|
self.cards_1_color = self.cards_1_var.get()
|
||||||
self.highlight_piles_colors_var.get())
|
self.cards_2_color = self.cards_2_var.get()
|
||||||
self.highlight_cards_colors = (None,
|
self.samerank_1_color = self.samerank_1_var.get()
|
||||||
self.highlight_cards_colors_1_var.get(),
|
self.samerank_2_color = self.samerank_2_var.get()
|
||||||
None,
|
self.hintarrow_color = self.hintarrow_var.get()
|
||||||
self.highlight_cards_colors_2_var.get())
|
self.not_matching_color = self.not_matching_var.get()
|
||||||
self.highlight_samerank_colors = (None,
|
|
||||||
self.highlight_samerank_colors_1_var.get(),
|
|
||||||
None,
|
|
||||||
self.highlight_samerank_colors_2_var.get())
|
|
||||||
self.hintarrow_color = self.hintarrow_color_var.get()
|
|
||||||
self.highlight_not_matching_color = self.highlight_not_matching_color_var.get()
|
|
||||||
|
|
||||||
def selectColor(self, label):
|
def selectColor(self, label):
|
||||||
c = askcolor(master=self.top, initialcolor=label.cget('bg'),
|
c = askcolor(master=self.top, initialcolor=label.cget('bg'),
|
||||||
|
|
|
@ -72,7 +72,7 @@ class FindCardDialog(Tkinter.Toplevel):
|
||||||
bind(self, "<Escape>", self.destroy)
|
bind(self, "<Escape>", self.destroy)
|
||||||
#
|
#
|
||||||
##self.normal_timeout = 400 # in milliseconds
|
##self.normal_timeout = 400 # in milliseconds
|
||||||
self.normal_timeout = int(1000*game.app.opt.highlight_samerank_sleep)
|
self.normal_timeout = int(1000*game.app.opt.timeouts['highlight_samerank'])
|
||||||
self.hidden_timeout = 200
|
self.hidden_timeout = 200
|
||||||
self.timer = None
|
self.timer = None
|
||||||
|
|
||||||
|
|
|
@ -382,9 +382,9 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
menu.add_checkbutton(label=n_("Stick&y mouse"), variable=self.tkopt.sticky_mouse, command=self.mOptStickyMouse)
|
menu.add_checkbutton(label=n_("Stick&y mouse"), variable=self.tkopt.sticky_mouse, command=self.mOptStickyMouse)
|
||||||
menu.add_checkbutton(label=n_("Use mouse for undo/redo"), variable=self.tkopt.mouse_undo, command=self.mOptMouseUndo)
|
menu.add_checkbutton(label=n_("Use mouse for undo/redo"), variable=self.tkopt.mouse_undo, command=self.mOptMouseUndo)
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
menu.add_command(label=n_("&Fonts..."), command=self.mOptFontsOptions)
|
menu.add_command(label=n_("&Fonts..."), command=self.mOptFonts)
|
||||||
menu.add_command(label=n_("&Colors..."), command=self.mOptColorsOptions)
|
menu.add_command(label=n_("&Colors..."), command=self.mOptColors)
|
||||||
menu.add_command(label=n_("Time&outs..."), command=self.mOptTimeoutsOptions)
|
menu.add_command(label=n_("Time&outs..."), command=self.mOptTimeouts)
|
||||||
menu.add_separator()
|
menu.add_separator()
|
||||||
submenu = MfxMenu(menu, label=n_("&Toolbar"))
|
submenu = MfxMenu(menu, label=n_("&Toolbar"))
|
||||||
createToolbarMenu(self, submenu)
|
createToolbarMenu(self, submenu)
|
||||||
|
@ -637,7 +637,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
self.mSelectGame, self.tkopt.gameid)
|
self.mSelectGame, self.tkopt.gameid)
|
||||||
|
|
||||||
def _addSelectAllGameSubMenu(self, games, menu, command, variable):
|
def _addSelectAllGameSubMenu(self, games, menu, command, variable):
|
||||||
menu = MfxMenu(menu, label=n_("All games by name"))
|
menu = MfxMenu(menu, label=n_("&All games by name"))
|
||||||
n, d = 0, self.__cb_max
|
n, d = 0, self.__cb_max
|
||||||
i = 0
|
i = 0
|
||||||
while True:
|
while True:
|
||||||
|
@ -676,6 +676,12 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
# Select Game menu actions
|
# Select Game menu actions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
def mSelectGame(self, *args):
|
||||||
|
self._mSelectGame(self.tkopt.gameid.get())
|
||||||
|
|
||||||
|
def mSelectGamePopular(self, *args):
|
||||||
|
self._mSelectGame(self.tkopt.gameid_popular.get())
|
||||||
|
|
||||||
def _mSelectGameDialog(self, d):
|
def _mSelectGameDialog(self, d):
|
||||||
if d.status == 0 and d.button == 0 and d.gameid != self.game.id:
|
if d.status == 0 and d.button == 0 and d.gameid != self.game.id:
|
||||||
self.tkopt.gameid.set(d.gameid)
|
self.tkopt.gameid.set(d.gameid)
|
||||||
|
@ -890,6 +896,105 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
self.game.saveGame(filename)
|
self.game.saveGame(filename)
|
||||||
self.updateMenus()
|
self.updateMenus()
|
||||||
|
|
||||||
|
def mOptAutoFaceUp(self, *args):
|
||||||
|
if self._cancelDrag(): return
|
||||||
|
self.app.opt.autofaceup = self.tkopt.autofaceup.get()
|
||||||
|
if self.app.opt.autofaceup:
|
||||||
|
self.game.autoPlay()
|
||||||
|
|
||||||
|
def mOptAutoDrop(self, *args):
|
||||||
|
if self._cancelDrag(): return
|
||||||
|
self.app.opt.autodrop = self.tkopt.autodrop.get()
|
||||||
|
if self.app.opt.autodrop:
|
||||||
|
self.game.autoPlay()
|
||||||
|
|
||||||
|
def mOptAutoDeal(self, *args):
|
||||||
|
if self._cancelDrag(): return
|
||||||
|
self.app.opt.autodeal = self.tkopt.autodeal.get()
|
||||||
|
if self.app.opt.autodeal:
|
||||||
|
self.game.autoPlay()
|
||||||
|
|
||||||
|
def mOptQuickPlay(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.quickplay = self.tkopt.quickplay.get()
|
||||||
|
|
||||||
|
def mOptEnableUndo(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.undo = self.tkopt.undo.get()
|
||||||
|
self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableBookmarks(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.bookmarks = self.tkopt.bookmarks.get()
|
||||||
|
self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableHint(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.hint = self.tkopt.hint.get()
|
||||||
|
self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableHighlightPiles(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.highlight_piles = self.tkopt.highlight_piles.get()
|
||||||
|
self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableHighlightCards(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.highlight_cards = self.tkopt.highlight_cards.get()
|
||||||
|
self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableHighlightSameRank(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.highlight_samerank = self.tkopt.highlight_samerank.get()
|
||||||
|
##self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptEnableHighlightNotMatching(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.highlight_not_matching = self.tkopt.highlight_not_matching.get()
|
||||||
|
##self.game.updateMenus()
|
||||||
|
|
||||||
|
def mOptAnimations(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.animations = self.tkopt.animations.get()
|
||||||
|
|
||||||
|
def mOptShadow(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.shadow = self.tkopt.shadow.get()
|
||||||
|
|
||||||
|
def mOptShade(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.shade = self.tkopt.shade.get()
|
||||||
|
|
||||||
|
def mOptShrinkFaceDown(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.shrink_face_down = self.tkopt.shrink_face_down.get()
|
||||||
|
self.game.endGame(bookmark=1)
|
||||||
|
self.game.quitGame(bookmark=1)
|
||||||
|
|
||||||
|
def mOptShadeFilledStacks(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.shade_filled_stacks = self.tkopt.shade_filled_stacks.get()
|
||||||
|
self.game.endGame(bookmark=1)
|
||||||
|
self.game.quitGame(bookmark=1)
|
||||||
|
|
||||||
|
def mOptMahjonggShowRemoved(self, *args):
|
||||||
|
if self._cancelDrag(): return
|
||||||
|
self.app.opt.mahjongg_show_removed = self.tkopt.mahjongg_show_removed.get()
|
||||||
|
##self.game.updateMenus()
|
||||||
|
self.game.endGame(bookmark=1)
|
||||||
|
self.game.quitGame(bookmark=1)
|
||||||
|
|
||||||
|
def mOptShisenShowHint(self, *args):
|
||||||
|
if self._cancelDrag(break_pause=False): return
|
||||||
|
self.app.opt.shisen_show_hint = self.tkopt.shisen_show_hint.get()
|
||||||
|
##self.game.updateMenus()
|
||||||
|
|
||||||
|
## def mOptSound(self, *args):
|
||||||
|
## if self._cancelDrag(break_pause=False): return
|
||||||
|
## self.app.opt.sound = self.tkopt.sound.get()
|
||||||
|
## if not self.app.opt.sound:
|
||||||
|
## self.app.audio.stopAll()
|
||||||
|
|
||||||
def mSelectCardsetDialog(self, *event):
|
def mSelectCardsetDialog(self, *event):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
##strings, default = ("&OK", "&Load", "&Cancel"), 0
|
##strings, default = ("&OK", "&Load", "&Cancel"), 0
|
||||||
|
@ -957,7 +1062,7 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
if self._cancelDrag(break_pause=False): return
|
if self._cancelDrag(break_pause=False): return
|
||||||
key = self.app.tabletile_index
|
key = self.app.tabletile_index
|
||||||
if key <= 0:
|
if key <= 0:
|
||||||
key = self.app.opt.table_color.lower()
|
key = self.app.opt.colors['table'] ##.lower()
|
||||||
d = SelectTileDialogWithPreview(self.top, app=self.app,
|
d = SelectTileDialogWithPreview(self.top, app=self.app,
|
||||||
title=_("Select table background"),
|
title=_("Select table background"),
|
||||||
manager=self.app.tabletile_manager,
|
manager=self.app.tabletile_manager,
|
||||||
|
@ -968,13 +1073,6 @@ class PysolMenubar(PysolMenubarActions):
|
||||||
elif d.key > 0 and d.key != self.app.tabletile_index:
|
elif d.key > 0 and d.key != self.app.tabletile_index:
|
||||||
self._mOptTableTile(d.key)
|
self._mOptTableTile(d.key)
|
||||||
|
|
||||||
## def mOptTableColor(self, *event):
|
|
||||||
## if self._cancelDrag(break_pause=False): return
|
|
||||||
## c = tkColorChooser.askcolor(initialcolor=self.app.opt.table_color,
|
|
||||||
## title=_("Select table color"))
|
|
||||||
## if c and c[1]:
|
|
||||||
## self._mOptTableColor(c[1])
|
|
||||||
|
|
||||||
def mOptToolbar(self, *event):
|
def mOptToolbar(self, *event):
|
||||||
##if self._cancelDrag(break_pause=False): return
|
##if self._cancelDrag(break_pause=False): return
|
||||||
self.setToolbarSide(self.tkopt.toolbar.get())
|
self.setToolbarSide(self.tkopt.toolbar.get())
|
||||||
|
|
|
@ -121,7 +121,7 @@ class SelectTileDialogWithPreview(MfxDialog):
|
||||||
self.app = app
|
self.app = app
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
self.key = key
|
self.key = key
|
||||||
self.table_color = app.opt.table_color
|
self.table_color = app.opt.colors['table']
|
||||||
if self.TreeDataHolder_Class.data is None:
|
if self.TreeDataHolder_Class.data is None:
|
||||||
self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
|
self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
|
||||||
#
|
#
|
||||||
|
|
|
@ -48,17 +48,17 @@ class TimeoutsDialog(MfxDialog):
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
self.demo_sleep_var = Tkinter.DoubleVar()
|
self.demo_sleep_var = Tkinter.DoubleVar()
|
||||||
self.demo_sleep_var.set(app.opt.demo_sleep)
|
self.demo_sleep_var.set(app.opt.timeouts['demo'])
|
||||||
self.hint_sleep_var = Tkinter.DoubleVar()
|
self.hint_sleep_var = Tkinter.DoubleVar()
|
||||||
self.hint_sleep_var.set(app.opt.hint_sleep)
|
self.hint_sleep_var.set(app.opt.timeouts['hint'])
|
||||||
self.raise_card_sleep_var = Tkinter.DoubleVar()
|
self.raise_card_sleep_var = Tkinter.DoubleVar()
|
||||||
self.raise_card_sleep_var.set(app.opt.raise_card_sleep)
|
self.raise_card_sleep_var.set(app.opt.timeouts['raise_card'])
|
||||||
self.highlight_piles_sleep_var = Tkinter.DoubleVar()
|
self.highlight_piles_sleep_var = Tkinter.DoubleVar()
|
||||||
self.highlight_piles_sleep_var.set(app.opt.highlight_piles_sleep)
|
self.highlight_piles_sleep_var.set(app.opt.timeouts['highlight_piles'])
|
||||||
self.highlight_cards_sleep_var = Tkinter.DoubleVar()
|
self.highlight_cards_sleep_var = Tkinter.DoubleVar()
|
||||||
self.highlight_cards_sleep_var.set(app.opt.highlight_cards_sleep)
|
self.highlight_cards_sleep_var.set(app.opt.timeouts['highlight_cards'])
|
||||||
self.highlight_samerank_sleep_var = Tkinter.DoubleVar()
|
self.highlight_samerank_sleep_var = Tkinter.DoubleVar()
|
||||||
self.highlight_samerank_sleep_var.set(app.opt.highlight_samerank_sleep)
|
self.highlight_samerank_sleep_var.set(app.opt.timeouts['highlight_samerank'])
|
||||||
#
|
#
|
||||||
#Tkinter.Label(frame, text='Set delays in seconds').grid(row=0, column=0, columnspan=2)
|
#Tkinter.Label(frame, text='Set delays in seconds').grid(row=0, column=0, columnspan=2)
|
||||||
row = 0
|
row = 0
|
||||||
|
@ -80,12 +80,12 @@ class TimeoutsDialog(MfxDialog):
|
||||||
focus = self.createButtons(bottom_frame, kw)
|
focus = self.createButtons(bottom_frame, kw)
|
||||||
self.mainloop(focus, kw.timeout)
|
self.mainloop(focus, kw.timeout)
|
||||||
#
|
#
|
||||||
self.demo_sleep = self.demo_sleep_var.get()
|
self.demo_timeout = self.demo_sleep_var.get()
|
||||||
self.hint_sleep = self.hint_sleep_var.get()
|
self.hint_timeout = self.hint_sleep_var.get()
|
||||||
self.raise_card_sleep = self.raise_card_sleep_var.get()
|
self.raise_card_timeout = self.raise_card_sleep_var.get()
|
||||||
self.highlight_piles_sleep = self.highlight_piles_sleep_var.get()
|
self.highlight_piles_timeout = self.highlight_piles_sleep_var.get()
|
||||||
self.highlight_cards_sleep = self.highlight_cards_sleep_var.get()
|
self.highlight_cards_timeout = self.highlight_cards_sleep_var.get()
|
||||||
self.highlight_samerank_sleep = self.highlight_samerank_sleep_var.get()
|
self.highlight_samerank_timeout = self.highlight_samerank_sleep_var.get()
|
||||||
|
|
||||||
def initKw(self, kw):
|
def initKw(self, kw):
|
||||||
kw = KwStruct(kw,
|
kw = KwStruct(kw,
|
||||||
|
|
|
@ -77,6 +77,14 @@ class MfxCanvasGroup(Canvas.Group):
|
||||||
return self.canvas.tk.splitlist(self._do("gettags"))
|
return self.canvas.tk.splitlist(self._do("gettags"))
|
||||||
|
|
||||||
class MfxCanvasImage(Canvas.ImageItem):
|
class MfxCanvasImage(Canvas.ImageItem):
|
||||||
|
def __init__(self, canvas, *args, **kwargs):
|
||||||
|
group = None
|
||||||
|
if kwargs.has_key('group'):
|
||||||
|
group = kwargs['group']
|
||||||
|
del kwargs['group']
|
||||||
|
Canvas.ImageItem.__init__(self, canvas, *args, **kwargs)
|
||||||
|
if group:
|
||||||
|
self.addtag(group)
|
||||||
def moveTo(self, x, y):
|
def moveTo(self, x, y):
|
||||||
c = self.coords()
|
c = self.coords()
|
||||||
self.move(x - int(c[0]), y - int(c[1]))
|
self.move(x - int(c[0]), y - int(c[1]))
|
||||||
|
@ -87,19 +95,33 @@ class MfxCanvasImage(Canvas.ImageItem):
|
||||||
|
|
||||||
MfxCanvasLine = Canvas.Line
|
MfxCanvasLine = Canvas.Line
|
||||||
|
|
||||||
MfxCanvasRectangle = Canvas.Rectangle
|
class MfxCanvasRectangle(Canvas.Rectangle):
|
||||||
|
def __init__(self, canvas, *args, **kwargs):
|
||||||
|
group = None
|
||||||
|
if kwargs.has_key('group'):
|
||||||
|
group = kwargs['group']
|
||||||
|
del kwargs['group']
|
||||||
|
Canvas.Rectangle.__init__(self, canvas, *args, **kwargs)
|
||||||
|
if group:
|
||||||
|
self.addtag(group)
|
||||||
|
|
||||||
class MfxCanvasText(Canvas.CanvasText):
|
class MfxCanvasText(Canvas.CanvasText):
|
||||||
def __init__(self, canvas, x, y, preview=-1, **kw):
|
def __init__(self, canvas, x, y, preview=-1, **kwargs):
|
||||||
if preview < 0:
|
if preview < 0:
|
||||||
preview = canvas.preview
|
preview = canvas.preview
|
||||||
if preview > 1:
|
if preview > 1:
|
||||||
return
|
return
|
||||||
if not kw.has_key("fill"):
|
if not kwargs.has_key("fill"):
|
||||||
kw["fill"] = canvas._text_color
|
kwargs["fill"] = canvas._text_color
|
||||||
apply(Canvas.CanvasText.__init__, (self, canvas, x, y), kw)
|
group = None
|
||||||
|
if kwargs.has_key('group'):
|
||||||
|
group = kwargs['group']
|
||||||
|
del kwargs['group']
|
||||||
|
Canvas.CanvasText.__init__(self, canvas, x, y, **kwargs)
|
||||||
self.text_format = None
|
self.text_format = None
|
||||||
canvas._text_items.append(self)
|
canvas._text_items.append(self)
|
||||||
|
if group:
|
||||||
|
self.addtag(group)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
|
|
|
@ -790,9 +790,9 @@ class Top_StatsDialog(MfxDialog):
|
||||||
frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=5, pady=10)
|
frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=5, pady=10)
|
||||||
frame.columnconfigure(0, weight=1)
|
frame.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
if app.stats.games_stats.has_key(player) \
|
if (app.stats.games_stats.has_key(player) and
|
||||||
and app.stats.games_stats[player].has_key(gameid) \
|
app.stats.games_stats[player].has_key(gameid) and
|
||||||
and app.stats.games_stats[player][gameid].time_result.top:
|
app.stats.games_stats[player][gameid].time_result.top):
|
||||||
|
|
||||||
Tkinter.Label(frame, text=_('Minimum')).grid(row=0, column=1)
|
Tkinter.Label(frame, text=_('Minimum')).grid(row=0, column=1)
|
||||||
Tkinter.Label(frame, text=_('Maximum')).grid(row=0, column=2)
|
Tkinter.Label(frame, text=_('Maximum')).grid(row=0, column=2)
|
||||||
|
|
|
@ -501,7 +501,8 @@ class MfxScrolledCanvas:
|
||||||
assert tile.filename
|
assert tile.filename
|
||||||
assert tile.basename
|
assert tile.basename
|
||||||
if not force:
|
if not force:
|
||||||
if i == app.tabletile_index and tile.color == app.opt.table_color:
|
if (i == app.tabletile_index and
|
||||||
|
tile.color == app.opt.colors['table']):
|
||||||
return False
|
return False
|
||||||
#
|
#
|
||||||
if not self.canvas.setTile(tile.filename, tile.stretch):
|
if not self.canvas.setTile(tile.filename, tile.stretch):
|
||||||
|
@ -517,10 +518,10 @@ class MfxScrolledCanvas:
|
||||||
##app.top.config(bg=app.top_bg)
|
##app.top.config(bg=app.top_bg)
|
||||||
color = tile.text_color
|
color = tile.text_color
|
||||||
|
|
||||||
if app.opt.table_text_color:
|
if app.opt.use_default_text_color:
|
||||||
self.canvas.setTextColor(app.opt.table_text_color_value)
|
|
||||||
else:
|
|
||||||
self.canvas.setTextColor(color)
|
self.canvas.setTextColor(color)
|
||||||
|
else:
|
||||||
|
self.canvas.setTextColor(app.opt.colors['text'])
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue