diff --git a/data/themes/blue/blue/button-n.gif b/data/themes/blue/blue/button-n.gif index d9845283..8a1eb89e 100644 Binary files a/data/themes/blue/blue/button-n.gif and b/data/themes/blue/blue/button-n.gif differ diff --git a/po/games.pot b/po/games.pot index da7fcfce..d7374fd0 100644 --- a/po/games.pot +++ b/po/games.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Sat May 19 16:39:10 2007\n" +"POT-Creation-Date: Tue Jun 5 04:28:06 2007\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/po/pysol.pot b/po/pysol.pot index 1779c47c..4c1487f2 100644 --- a/po/pysol.pot +++ b/po/pysol.pot @@ -14,7 +14,7 @@ msgid "" msgstr "" "#-#-#-#-# pysol-1.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: Sat May 19 16:40:21 2007\n" +"POT-Creation-Date: Tue Jun 5 04:29:13 2007\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,7 +24,7 @@ msgstr "" "Generated-By: pygettext.py 1.6con\n" "#-#-#-#-# pysol-2.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2007-05-19 16:40+0400\n" +"POT-Creation-Date: 2007-06-05 04:29+0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,56 +32,56 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: pysollib/actions.py:267 pysollib/tile/toolbar.py:186 +#: pysollib/actions.py:268 pysollib/tile/toolbar.py:186 #: pysollib/tk/toolbar.py:189 msgid "New game" msgstr "" -#: pysollib/actions.py:280 pysollib/tile/menubar.py:850 -#: pysollib/tile/menubar.py:864 pysollib/tk/menubar.py:854 -#: pysollib/tk/menubar.py:868 +#: pysollib/actions.py:281 pysollib/tile/menubar.py:848 +#: pysollib/tile/menubar.py:862 pysollib/tk/menubar.py:851 +#: pysollib/tk/menubar.py:865 msgid "Select game" msgstr "" -#: pysollib/actions.py:294 +#: pysollib/actions.py:295 msgid "Invalid game number" msgstr "" -#: pysollib/actions.py:295 +#: pysollib/actions.py:296 msgid "Invalid game number\n" msgstr "" -#: pysollib/actions.py:312 +#: pysollib/actions.py:313 msgid "Select next game number" msgstr "" -#: pysollib/actions.py:321 pysollib/actions.py:331 +#: pysollib/actions.py:322 pysollib/actions.py:332 msgid "Select new game number" msgstr "" -#: pysollib/actions.py:322 +#: pysollib/actions.py:323 msgid "" "\n" "\n" "Enter new game number" msgstr "" -#: pysollib/actions.py:323 +#: pysollib/actions.py:324 msgid "&Next number" msgstr "" -#: pysollib/actions.py:323 pysollib/app.py:906 pysollib/app.py:1193 -#: pysollib/app.py:1205 pysollib/game.py:1031 pysollib/game.py:2299 +#: pysollib/actions.py:324 pysollib/app.py:1151 pysollib/app.py:1438 +#: pysollib/app.py:1450 pysollib/game.py:1019 pysollib/game.py:2289 #: pysollib/tile/colorsdialog.py:112 pysollib/tile/edittextdialog.py:83 #: pysollib/tile/fontsdialog.py:144 pysollib/tile/fontsdialog.py:204 -#: pysollib/tile/gameinfodialog.py:155 pysollib/tile/menubar.py:1351 +#: pysollib/tile/gameinfodialog.py:155 pysollib/tile/menubar.py:1349 #: pysollib/tile/playeroptionsdialog.py:111 pysollib/tile/selectcardset.py:387 #: pysollib/tile/selecttile.py:161 pysollib/tile/soundoptionsdialog.py:168 #: pysollib/tile/soundoptionsdialog.py:206 pysollib/tile/timeoutsdialog.py:94 #: pysollib/tile/tkhtml.py:504 pysollib/tile/tkstats.py:123 -#: pysollib/tile/tkstats.py:544 pysollib/tile/tkstats.py:643 -#: pysollib/tile/tkstats.py:725 pysollib/tile/tkwidget.py:154 -#: pysollib/tile/tkwidget.py:329 pysollib/tile/wizarddialog.py:144 +#: pysollib/tile/tkstats.py:546 pysollib/tile/tkstats.py:645 +#: pysollib/tile/tkstats.py:727 pysollib/tile/tkwidget.py:154 +#: pysollib/tile/tkwidget.py:329 pysollib/tile/wizarddialog.py:146 #: pysollib/tk/colorsdialog.py:111 pysollib/tk/edittextdialog.py:82 #: pysollib/tk/fontsdialog.py:143 pysollib/tk/fontsdialog.py:205 #: pysollib/tk/gameinfodialog.py:155 pysollib/tk/playeroptionsdialog.py:85 @@ -89,158 +89,158 @@ msgstr "" #: pysollib/tk/selectcardset.py:397 pysollib/tk/selecttile.py:159 #: pysollib/tk/soundoptionsdialog.py:170 pysollib/tk/soundoptionsdialog.py:211 #: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:500 -#: pysollib/tk/tkstats.py:289 pysollib/tk/tkstats.py:515 -#: pysollib/tk/tkstats.py:582 pysollib/tk/tkstats.py:597 -#: pysollib/tk/tkstats.py:639 pysollib/tk/tkstats.py:711 -#: pysollib/tk/tkstats.py:795 pysollib/tk/tkstats.py:969 +#: pysollib/tk/tkstats.py:289 pysollib/tk/tkstats.py:511 +#: pysollib/tk/tkstats.py:578 pysollib/tk/tkstats.py:593 +#: pysollib/tk/tkstats.py:635 pysollib/tk/tkstats.py:707 +#: pysollib/tk/tkstats.py:791 pysollib/tk/tkstats.py:965 #: pysollib/tk/tkwidget.py:160 pysollib/tk/tkwidget.py:324 #: pysollib/tk/wizarddialog.py:137 msgid "&OK" msgstr "" -#: pysollib/actions.py:323 pysollib/app.py:907 pysollib/app.py:1205 -#: pysollib/game.py:1031 pysollib/game.py:1700 pysollib/game.py:1716 -#: pysollib/game.py:1723 pysollib/game.py:1729 +#: pysollib/actions.py:324 pysollib/app.py:1152 pysollib/app.py:1450 +#: pysollib/game.py:1019 pysollib/game.py:1690 pysollib/game.py:1706 +#: pysollib/game.py:1713 pysollib/game.py:1719 #: pysollib/tile/colorsdialog.py:112 pysollib/tile/edittextdialog.py:83 #: pysollib/tile/fontsdialog.py:144 pysollib/tile/fontsdialog.py:204 #: pysollib/tile/playeroptionsdialog.py:111 pysollib/tile/selectcardset.py:237 -#: pysollib/tile/selectgame.py:266 pysollib/tile/selectgame.py:397 +#: pysollib/tile/selectgame.py:302 pysollib/tile/selectgame.py:433 #: pysollib/tile/selecttile.py:161 pysollib/tile/soundoptionsdialog.py:168 #: pysollib/tile/timeoutsdialog.py:94 pysollib/tile/tkwidget.py:329 -#: pysollib/tile/wizarddialog.py:144 pysollib/tk/colorsdialog.py:111 +#: pysollib/tile/wizarddialog.py:146 pysollib/tk/colorsdialog.py:111 #: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:143 -#: pysollib/tk/fontsdialog.py:205 pysollib/tk/menubar.py:1158 -#: pysollib/tk/menubar.py:1160 pysollib/tk/playeroptionsdialog.py:85 +#: pysollib/tk/fontsdialog.py:205 pysollib/tk/menubar.py:1155 +#: pysollib/tk/menubar.py:1157 pysollib/tk/playeroptionsdialog.py:85 #: pysollib/tk/playeroptionsdialog.py:160 pysollib/tk/selectcardset.py:241 -#: pysollib/tk/selectgame.py:265 pysollib/tk/selectgame.py:406 +#: pysollib/tk/selectgame.py:303 pysollib/tk/selectgame.py:444 #: pysollib/tk/selecttile.py:159 pysollib/tk/soundoptionsdialog.py:170 #: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:324 #: pysollib/tk/wizarddialog.py:137 msgid "&Cancel" msgstr "" -#: pysollib/actions.py:339 +#: pysollib/actions.py:340 msgid "Select random game" msgstr "" -#: pysollib/actions.py:375 +#: pysollib/actions.py:376 msgid "Select next game" msgstr "" -#: pysollib/actions.py:408 pysollib/tile/toolbar.py:201 +#: pysollib/actions.py:409 pysollib/tile/toolbar.py:201 #: pysollib/tk/toolbar.py:204 msgid "Quit " msgstr "" -#: pysollib/actions.py:459 +#: pysollib/actions.py:460 msgid "Clear bookmarks" msgstr "" -#: pysollib/actions.py:460 +#: pysollib/actions.py:461 msgid "Clear all bookmarks ?" msgstr "" -#: pysollib/actions.py:470 +#: pysollib/actions.py:471 msgid "Restart game" msgstr "" -#: pysollib/actions.py:471 +#: pysollib/actions.py:472 msgid "Restart this game ?" msgstr "" -#: pysollib/actions.py:522 +#: pysollib/actions.py:523 msgid "" "Comments for %s:\n" "\n" msgstr "" -#: pysollib/actions.py:524 +#: pysollib/actions.py:525 msgid "Comments for " msgstr "" -#: pysollib/actions.py:542 pysollib/actions.py:570 +#: pysollib/actions.py:543 pysollib/actions.py:571 msgid "Error while writing to file" msgstr "" -#: pysollib/actions.py:545 pysollib/actions.py:573 +#: pysollib/actions.py:546 pysollib/actions.py:574 msgid " Info" msgstr "" -#: pysollib/actions.py:546 +#: pysollib/actions.py:547 msgid "" "Comments were appended to\n" "\n" msgstr "" -#: pysollib/actions.py:557 +#: pysollib/actions.py:558 msgid "Demo statistics" msgstr "" -#: pysollib/actions.py:560 +#: pysollib/actions.py:561 msgid "Your statistics" msgstr "" -#: pysollib/actions.py:574 +#: pysollib/actions.py:575 msgid "" " were appended to\n" "\n" msgstr "" -#: pysollib/actions.py:589 +#: pysollib/actions.py:590 msgid " Demo" msgstr "" -#: pysollib/actions.py:589 +#: pysollib/actions.py:590 msgid " Demo " msgstr "" -#: pysollib/actions.py:592 pysollib/actions.py:612 +#: pysollib/actions.py:593 pysollib/actions.py:613 msgid " for " msgstr "" -#: pysollib/actions.py:598 pysollib/stats.py:205 +#: pysollib/actions.py:599 pysollib/stats.py:209 msgid "Statistics for " msgstr "" -#: pysollib/actions.py:602 pysollib/tile/selectgame.py:344 +#: pysollib/actions.py:603 pysollib/tile/selectgame.py:380 #: pysollib/tile/tkstats.py:74 pysollib/tile/toolbar.py:198 -#: pysollib/tk/selectgame.py:349 pysollib/tk/toolbar.py:201 +#: pysollib/tk/selectgame.py:387 pysollib/tk/toolbar.py:201 msgid "Statistics" msgstr "" -#: pysollib/actions.py:606 pysollib/tile/tkstats.py:526 +#: pysollib/actions.py:607 pysollib/tile/tkstats.py:528 #: data/glade-translations:31 msgid "Full log" msgstr "" -#: pysollib/actions.py:609 pysollib/tile/tkstats.py:530 +#: pysollib/actions.py:610 pysollib/tile/tkstats.py:532 #: data/glade-translations:32 msgid "Session log" msgstr "" -#: pysollib/actions.py:615 +#: pysollib/actions.py:616 msgid "Game Info" msgstr "" -#: pysollib/actions.py:618 +#: pysollib/actions.py:619 msgid "Statistics progression" msgstr "" -#: pysollib/actions.py:634 +#: pysollib/actions.py:635 msgid "Reset all statistics" msgstr "" -#: pysollib/actions.py:635 +#: pysollib/actions.py:636 msgid "" "Reset ALL statistics and logs for player\n" "%s ?" msgstr "" -#: pysollib/actions.py:641 +#: pysollib/actions.py:642 msgid "Reset game statistics" msgstr "" -#: pysollib/actions.py:642 +#: pysollib/actions.py:643 msgid "" "Reset statistics and logs for player\n" "%s\n" @@ -248,57 +248,57 @@ msgid "" "%s ?" msgstr "" -#: pysollib/actions.py:698 +#: pysollib/actions.py:699 msgid "Play demo" msgstr "" -#: pysollib/actions.py:709 +#: pysollib/actions.py:710 msgid "Set player options" msgstr "" -#: pysollib/actions.py:723 data/glade-translations:40 +#: pysollib/actions.py:724 data/glade-translations:40 msgid "Set colors" msgstr "" -#: pysollib/actions.py:740 +#: pysollib/actions.py:741 msgid "Set fonts" msgstr "" -#: pysollib/actions.py:749 data/glade-translations:33 +#: pysollib/actions.py:750 data/glade-translations:33 msgid "Set timeouts" msgstr "" -#: pysollib/app.py:89 +#: pysollib/app.py:159 msgid "Unknown" msgstr "" -#: pysollib/app.py:667 +#: pysollib/app.py:910 msgid "can't find game: " msgstr "" -#: pysollib/app.py:908 pysollib/game.py:1700 pysollib/game.py:1716 -#: pysollib/game.py:1723 pysollib/game.py:1729 pysollib/tile/menubar.py:356 -#: pysollib/tk/menubar.py:353 +#: pysollib/app.py:1153 pysollib/game.py:1690 pysollib/game.py:1706 +#: pysollib/game.py:1713 pysollib/game.py:1719 pysollib/tile/menubar.py:353 +#: pysollib/tk/menubar.py:349 msgid "&New game" msgstr "" -#: pysollib/app.py:1051 +#: pysollib/app.py:1296 msgid "Loading %s %s..." msgstr "" -#: pysollib/app.py:1090 +#: pysollib/app.py:1335 msgid " load error" msgstr "" -#: pysollib/app.py:1091 +#: pysollib/app.py:1336 msgid "Error while loading " msgstr "" -#: pysollib/app.py:1185 +#: pysollib/app.py:1430 msgid "Incompatible " msgstr "" -#: pysollib/app.py:1187 +#: pysollib/app.py:1432 msgid "" "The currently selected %s %s\n" "is not compatible with the game\n" @@ -307,49 +307,49 @@ msgid "" "Please select a %s type %s.\n" msgstr "" -#: pysollib/app.py:1203 +#: pysollib/app.py:1448 msgid "Please select a %s type %s" msgstr "" -#: pysollib/app.py:1430 +#: pysollib/app.py:1678 msgid "error loading plugin %s: %s" msgstr "" -#: pysollib/game.py:950 pysollib/game.py:956 +#: pysollib/game.py:938 pysollib/game.py:944 msgid "Player\n" msgstr "" -#: pysollib/game.py:1027 +#: pysollib/game.py:1015 msgid "Discard current game ?" msgstr "" -#: pysollib/game.py:1653 +#: pysollib/game.py:1643 msgid "" "\n" "You have reached\n" "#%d in the %s of playing time" msgstr "" -#: pysollib/game.py:1658 +#: pysollib/game.py:1648 msgid "" "\n" "and #%d in the %s of moves" msgstr "" -#: pysollib/game.py:1661 +#: pysollib/game.py:1651 msgid "" "\n" "You have reached\n" "#%d in the %s of moves" msgstr "" -#: pysollib/game.py:1691 pysollib/game.py:1708 +#: pysollib/game.py:1681 pysollib/game.py:1698 #: pysollib/tile/soundoptionsdialog.py:102 #: pysollib/tk/soundoptionsdialog.py:100 msgid "Game won" msgstr "" -#: pysollib/game.py:1692 +#: pysollib/game.py:1682 msgid "" "\n" "Congratulations, this\n" @@ -360,7 +360,7 @@ msgid "" "%s\n" msgstr "" -#: pysollib/game.py:1709 +#: pysollib/game.py:1699 msgid "" "\n" "Congratulations, you did it !\n" @@ -370,101 +370,101 @@ msgid "" "%s\n" msgstr "" -#: pysollib/game.py:1721 pysollib/game.py:1727 +#: pysollib/game.py:1711 pysollib/game.py:1717 #: pysollib/tile/soundoptionsdialog.py:100 #: pysollib/tk/soundoptionsdialog.py:98 msgid "Game finished" msgstr "" -#: pysollib/game.py:1722 pysollib/game.py:2300 +#: pysollib/game.py:1712 pysollib/game.py:2290 msgid "" "\n" "Game finished\n" msgstr "" -#: pysollib/game.py:1728 +#: pysollib/game.py:1718 msgid "" "\n" "Game finished, but not without my help...\n" msgstr "" -#: pysollib/game.py:1729 +#: pysollib/game.py:1719 msgid "&Restart" msgstr "" -#: pysollib/game.py:2189 +#: pysollib/game.py:2179 msgid "Score %6d" msgstr "" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Cool" msgstr "" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Great" msgstr "" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Wow" msgstr "" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Yeah" msgstr "" -#: pysollib/game.py:2292 pysollib/game.py:2303 pysollib/game.py:2315 +#: pysollib/game.py:2282 pysollib/game.py:2293 pysollib/game.py:2305 msgid " Autopilot" msgstr "" -#: pysollib/game.py:2293 +#: pysollib/game.py:2283 msgid "" "\n" "Game solved in %d moves.\n" msgstr "" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&Hmm" msgstr "" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&Oh well" msgstr "" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&That's life" msgstr "" -#: pysollib/game.py:2316 +#: pysollib/game.py:2306 msgid "" "\n" "This won't come out...\n" msgstr "" -#: pysollib/game.py:2756 +#: pysollib/game.py:2746 msgid "Set bookmark" msgstr "" -#: pysollib/game.py:2757 +#: pysollib/game.py:2747 msgid "Replace existing bookmark %d ?" msgstr "" -#: pysollib/game.py:2779 +#: pysollib/game.py:2769 msgid "Goto bookmark" msgstr "" -#: pysollib/game.py:2780 +#: pysollib/game.py:2770 msgid "Goto bookmark %d ?" msgstr "" -#: pysollib/game.py:2811 +#: pysollib/game.py:2801 msgid "Open game" msgstr "" -#: pysollib/game.py:2822 pysollib/game.py:2832 pysollib/game.py:2837 +#: pysollib/game.py:2812 pysollib/game.py:2822 pysollib/game.py:2827 msgid "Load game error" msgstr "" -#: pysollib/game.py:2823 +#: pysollib/game.py:2813 msgid "" "Error while loading game.\n" "\n" @@ -472,37 +472,37 @@ msgid "" "but this could also be a bug you might want to report." msgstr "" -#: pysollib/game.py:2833 +#: pysollib/game.py:2823 msgid "Error while loading game" msgstr "" -#: pysollib/game.py:2838 +#: pysollib/game.py:2828 msgid "" "Internal error while loading game.\n" "\n" "Please report this bug." msgstr "" -#: pysollib/game.py:2867 pysollib/tile/menubar.py:1393 -#: pysollib/tk/menubar.py:1378 +#: pysollib/game.py:2857 pysollib/tile/menubar.py:1391 +#: pysollib/tk/menubar.py:1375 msgid "Save game error" msgstr "" -#: pysollib/game.py:2868 +#: pysollib/game.py:2858 msgid "Error while saving game" msgstr "" -#: pysollib/game.py:2893 +#: pysollib/game.py:2883 msgid "Invalid or damaged %s save file" msgstr "" -#: pysollib/game.py:2907 +#: pysollib/game.py:2897 msgid "" "Cannot load games saved with\n" "%s version %s" msgstr "" -#: pysollib/game.py:2924 +#: pysollib/game.py:2914 msgid "" "Cannot load this game from version %s\n" "as the game rules have changed\n" @@ -718,9 +718,9 @@ msgid "Puzzle type" msgstr "" #: pysollib/games/auldlangsyne.py:160 pysollib/games/calculation.py:104 -#: pysollib/games/camelot.py:590 pysollib/games/numerica.py:94 -#: pysollib/games/numerica.py:276 pysollib/games/numerica.py:666 -#: pysollib/games/numerica.py:781 +#: pysollib/games/camelot.py:590 pysollib/games/numerica.py:93 +#: pysollib/games/numerica.py:275 pysollib/games/numerica.py:665 +#: pysollib/games/numerica.py:780 msgid "Tableau. Build regardless of rank and suit." msgstr "" @@ -750,14 +750,14 @@ msgid "" "4: 8 Q 3 7 J 2 6 T A 5 9 K" msgstr "" -#: pysollib/games/canfield.py:528 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1514 pysollib/util.py:87 pysollib/wizardutil.py:158 -#: pysollib/wizardutil.py:223 +#: pysollib/games/canfield.py:529 pysollib/games/special/tarock.py:224 +#: pysollib/stack.py:1498 pysollib/util.py:86 pysollib/wizardutil.py:158 +#: pysollib/wizardutil.py:216 msgid "King" msgstr "" -#: pysollib/games/canfield.py:531 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1513 pysollib/util.py:87 +#: pysollib/games/canfield.py:532 pysollib/games/special/tarock.py:224 +#: pysollib/stack.py:1497 pysollib/util.py:86 msgid "Queen" msgstr "" @@ -782,12 +782,12 @@ msgid "Waste. Build up or down regardless of suit." msgstr "" #: pysollib/games/golf.py:117 pysollib/games/golf.py:305 -#: pysollib/stack.py:2269 +#: pysollib/stack.py:2253 msgid "Tableau. No building." msgstr "" #: pysollib/games/golf.py:390 pysollib/games/pileon.py:257 -#: pysollib/stack.py:2158 +#: pysollib/stack.py:2142 msgid "Foundation. Build up regardless of suit." msgstr "" @@ -805,28 +805,30 @@ msgstr "" msgid "Reserve. Only Kings are acceptable." msgstr "" -#: pysollib/games/larasgame.py:163 pysollib/stack.py:1726 +#: pysollib/games/larasgame.py:163 pysollib/stack.py:1710 msgid "Round %d" msgstr "" -#: pysollib/games/mahjongg/mahjongg.py:788 +#: pysollib/games/mahjongg/mahjongg.py:789 msgid "Warning" msgstr "" -#: pysollib/games/mahjongg/mahjongg.py:789 +#: pysollib/games/mahjongg/mahjongg.py:790 msgid "" "Sorry, I can't find\n" "a solvable configuration." msgstr "" -#: pysollib/games/mahjongg/mahjongg.py:860 +#: pysollib/games/mahjongg/mahjongg.py:863 +#: pysollib/games/mahjongg/shisensho.py:401 msgid "" "No Free\n" "Matching\n" "Pairs" msgstr "" -#: pysollib/games/mahjongg/mahjongg.py:862 +#: pysollib/games/mahjongg/mahjongg.py:865 +#: pysollib/games/mahjongg/shisensho.py:403 msgid "" "%d Free\n" "Matching\n" @@ -838,7 +840,8 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pysollib/games/mahjongg/mahjongg.py:866 +#: pysollib/games/mahjongg/mahjongg.py:869 +#: pysollib/games/mahjongg/shisensho.py:410 msgid "" "%d\n" "Tile\n" @@ -852,7 +855,8 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pysollib/games/mahjongg/mahjongg.py:869 +#: pysollib/games/mahjongg/mahjongg.py:872 +#: pysollib/games/mahjongg/shisensho.py:413 msgid "" "%d\n" "Tile\n" @@ -874,8 +878,8 @@ msgstr "" msgid "Deal %d" msgstr "" -#: pysollib/games/numerica.py:263 pysollib/games/royalcotillion.py:865 -#: pysollib/stack.py:2201 +#: pysollib/games/numerica.py:262 pysollib/games/royalcotillion.py:865 +#: pysollib/stack.py:2185 msgid "Foundation. Build up by color." msgstr "" @@ -933,8 +937,8 @@ msgstr "" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1515 pysollib/util.py:86 pysollib/wizardutil.py:157 -#: pysollib/wizardutil.py:161 pysollib/wizardutil.py:222 +#: pysollib/stack.py:1499 pysollib/util.py:85 pysollib/wizardutil.py:157 +#: pysollib/wizardutil.py:161 pysollib/wizardutil.py:215 msgid "Ace" msgstr "" @@ -1127,51 +1131,51 @@ msgstr "" msgid "SW" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Cherry" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Pine" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Plum" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Wisteria" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Bush Clover" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Eularia" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Iris" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Peony" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Chrysanthemum" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Maple" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Paulownia" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Willow" msgstr "" @@ -1243,37 +1247,37 @@ msgid "" "regardless of sequence." msgstr "" -#: pysollib/help.py:60 +#: pysollib/help.py:59 msgid "A Python Solitaire Game Collection\n" msgstr "" -#: pysollib/help.py:62 +#: pysollib/help.py:61 msgid "A World Domination Project\n" msgstr "" -#: pysollib/help.py:63 +#: pysollib/help.py:62 msgid "&Credits..." msgstr "" -#: pysollib/help.py:63 +#: pysollib/help.py:62 msgid "&Nice" msgstr "" -#: pysollib/help.py:65 +#: pysollib/help.py:64 msgid "&Enjoy" msgstr "" -#: pysollib/help.py:67 +#: pysollib/help.py:66 msgid "" "Version %s\n" "\n" msgstr "" -#: pysollib/help.py:68 +#: pysollib/help.py:67 msgid "About " msgstr "" -#: pysollib/help.py:69 +#: pysollib/help.py:68 msgid "" "PySol Fan Club edition\n" "%s%s\n" @@ -1290,11 +1294,11 @@ msgid "" "%s" msgstr "" -#: pysollib/help.py:98 +#: pysollib/help.py:97 msgid "Credits" msgstr "" -#: pysollib/help.py:99 +#: pysollib/help.py:98 msgid "" " credits go to:\n" "\n" @@ -1309,15 +1313,15 @@ msgid "" "for making this program possible" msgstr "" -#: pysollib/help.py:134 +#: pysollib/help.py:133 msgid " HTML Problem" msgstr "" -#: pysollib/help.py:135 +#: pysollib/help.py:134 msgid "Cannot find help document\n" msgstr "" -#: pysollib/help.py:148 +#: pysollib/help.py:147 msgid " Help" msgstr "" @@ -1335,8 +1339,8 @@ msgid "" "Please check your %s installation.\n" msgstr "" -#: pysollib/main.py:73 pysollib/main.py:266 pysollib/tile/menubar.py:376 -#: pysollib/tk/menubar.py:373 +#: pysollib/main.py:73 pysollib/main.py:266 pysollib/tile/menubar.py:373 +#: pysollib/tk/menubar.py:369 msgid "&Quit" msgstr "" @@ -1656,252 +1660,252 @@ msgstr "" msgid "USA" msgstr "" -#: pysollib/settings.py:73 data/glade-translations:29 +#: pysollib/settings.py:71 data/glade-translations:29 msgid "Top 10" msgstr "" -#: pysollib/stack.py:1509 +#: pysollib/stack.py:1493 msgid "Base card - %s." msgstr "" -#: pysollib/stack.py:1510 +#: pysollib/stack.py:1494 msgid "Empty row cannot be filled." msgstr "" -#: pysollib/stack.py:1511 +#: pysollib/stack.py:1495 msgid "any card" msgstr "" -#: pysollib/stack.py:1512 pysollib/util.py:87 +#: pysollib/stack.py:1496 pysollib/util.py:86 msgid "Jack" msgstr "" -#: pysollib/stack.py:1522 +#: pysollib/stack.py:1506 msgid "No cards" msgstr "" -#: pysollib/stack.py:1523 +#: pysollib/stack.py:1507 msgid "%d card" msgid_plural "%d cards" msgstr[0] "" msgstr[1] "" -#: pysollib/stack.py:1735 pysollib/stack.py:1737 pysollib/stack.py:1773 +#: pysollib/stack.py:1719 pysollib/stack.py:1721 pysollib/stack.py:1757 msgid "Redeal" msgstr "" -#: pysollib/stack.py:1737 +#: pysollib/stack.py:1721 msgid "Stop" msgstr "" -#: pysollib/stack.py:1799 +#: pysollib/stack.py:1783 msgid "Variable redeals." msgstr "" -#: pysollib/stack.py:1800 +#: pysollib/stack.py:1784 msgid "Unlimited redeals." msgstr "" -#: pysollib/stack.py:1803 +#: pysollib/stack.py:1787 msgid "%d readeal" msgid_plural "%d redeals" msgstr[0] "" msgstr[1] "" -#: pysollib/stack.py:1805 +#: pysollib/stack.py:1789 msgid "Talon." msgstr "" -#: pysollib/stack.py:2071 pysollib/stack.py:2718 +#: pysollib/stack.py:2055 pysollib/stack.py:2702 msgid "Reserve. No building." msgstr "" -#: pysollib/stack.py:2109 +#: pysollib/stack.py:2093 msgid "Foundation." msgstr "" -#: pysollib/stack.py:2147 +#: pysollib/stack.py:2131 msgid "Foundation. Build up by suit." msgstr "" -#: pysollib/stack.py:2148 +#: pysollib/stack.py:2132 msgid "Foundation. Build down by suit." msgstr "" -#: pysollib/stack.py:2149 pysollib/stack.py:2160 pysollib/stack.py:2182 -#: pysollib/stack.py:2203 +#: pysollib/stack.py:2133 pysollib/stack.py:2144 pysollib/stack.py:2166 +#: pysollib/stack.py:2187 msgid "Foundation. Build by same rank." msgstr "" -#: pysollib/stack.py:2159 +#: pysollib/stack.py:2143 msgid "Foundation. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:2180 +#: pysollib/stack.py:2164 msgid "Foundation. Build up by alternate color." msgstr "" -#: pysollib/stack.py:2181 +#: pysollib/stack.py:2165 msgid "Foundation. Build down by alternate color." msgstr "" -#: pysollib/stack.py:2202 +#: pysollib/stack.py:2186 msgid "Foundation. Build down by color." msgstr "" -#: pysollib/stack.py:2311 +#: pysollib/stack.py:2295 msgid "Tableau. Build up by alternate color." msgstr "" -#: pysollib/stack.py:2312 +#: pysollib/stack.py:2296 msgid "Tableau. Build down by alternate color." msgstr "" -#: pysollib/stack.py:2313 pysollib/stack.py:2323 pysollib/stack.py:2332 -#: pysollib/stack.py:2341 pysollib/stack.py:2351 pysollib/stack.py:2380 -#: pysollib/stack.py:2390 +#: pysollib/stack.py:2297 pysollib/stack.py:2307 pysollib/stack.py:2316 +#: pysollib/stack.py:2325 pysollib/stack.py:2335 pysollib/stack.py:2364 +#: pysollib/stack.py:2374 msgid "Tableau. Build by same rank." msgstr "" -#: pysollib/stack.py:2321 +#: pysollib/stack.py:2305 msgid "Tableau. Build up by color." msgstr "" -#: pysollib/stack.py:2322 +#: pysollib/stack.py:2306 msgid "Tableau. Build down by color." msgstr "" -#: pysollib/stack.py:2330 +#: pysollib/stack.py:2314 msgid "Tableau. Build up by suit." msgstr "" -#: pysollib/stack.py:2331 +#: pysollib/stack.py:2315 msgid "Tableau. Build down by suit." msgstr "" -#: pysollib/stack.py:2339 +#: pysollib/stack.py:2323 msgid "Tableau. Build up regardless of suit." msgstr "" -#: pysollib/stack.py:2340 +#: pysollib/stack.py:2324 msgid "Tableau. Build down regardless of suit." msgstr "" -#: pysollib/stack.py:2349 +#: pysollib/stack.py:2333 msgid "Tableau. Build up in any suit but the same." msgstr "" -#: pysollib/stack.py:2350 +#: pysollib/stack.py:2334 msgid "Tableau. Build down in any suit but the same." msgstr "" -#: pysollib/stack.py:2378 +#: pysollib/stack.py:2362 msgid "" "Tableau. Build up regardless of suit. Sequences of cards in alternate color " "can be moved as a unit." msgstr "" -#: pysollib/stack.py:2379 +#: pysollib/stack.py:2363 msgid "" "Tableau. Build down regardless of suit. Sequences of cards in alternate " "color can be moved as a unit." msgstr "" -#: pysollib/stack.py:2388 +#: pysollib/stack.py:2372 msgid "" "Tableau. Build up regardless of suit. Sequences of cards in the same suit " "can be moved as a unit." msgstr "" -#: pysollib/stack.py:2389 +#: pysollib/stack.py:2373 msgid "" "Tableau. Build down regardless of suit. Sequences of cards in the same suit " "can be moved as a unit." msgstr "" -#: pysollib/stack.py:2411 +#: pysollib/stack.py:2395 msgid "" "Tableau. Build up by alternate color, can move any face-up cards regardless " "of sequence." msgstr "" -#: pysollib/stack.py:2412 +#: pysollib/stack.py:2396 msgid "" "Tableau. Build down by alternate color, can move any face-up cards " "regardless of sequence." msgstr "" -#: pysollib/stack.py:2413 pysollib/stack.py:2426 pysollib/stack.py:2436 +#: pysollib/stack.py:2397 pysollib/stack.py:2410 pysollib/stack.py:2420 msgid "" "Tableau. Build by same rank, can move any face-up cards regardless of " "sequence." msgstr "" -#: pysollib/stack.py:2424 +#: pysollib/stack.py:2408 msgid "" "Tableau. Build up by suit, can move any face-up cards regardless of sequence." msgstr "" -#: pysollib/stack.py:2425 +#: pysollib/stack.py:2409 msgid "" "Tableau. Build down by suit, can move any face-up cards regardless of " "sequence." msgstr "" -#: pysollib/stack.py:2434 pysollib/stack.py:2435 +#: pysollib/stack.py:2418 pysollib/stack.py:2419 msgid "" "Tableau. Build up regardless of suit, can move any face-up cards regardless " "of sequence." msgstr "" -#: pysollib/stack.py:2468 +#: pysollib/stack.py:2452 msgid "Tableau. Build up or down by color." msgstr "" -#: pysollib/stack.py:2479 +#: pysollib/stack.py:2463 msgid "Tableau. Build up or down by alternate color." msgstr "" -#: pysollib/stack.py:2490 +#: pysollib/stack.py:2474 msgid "Tableau. Build up or down by suit." msgstr "" -#: pysollib/stack.py:2501 +#: pysollib/stack.py:2485 msgid "Tableau. Build up or down regardless of suit." msgstr "" -#: pysollib/stack.py:2602 +#: pysollib/stack.py:2586 msgid "Waste." msgstr "" -#: pysollib/stack.py:2719 +#: pysollib/stack.py:2703 msgid "Free cell." msgstr "" -#: pysollib/stats.py:52 pysollib/stats.py:118 pysollib/tile/tkstats.py:673 +#: pysollib/stats.py:52 pysollib/stats.py:122 pysollib/tile/tkstats.py:675 msgid "Game" msgstr "" -#: pysollib/stats.py:53 pysollib/tile/tkstats.py:904 -#: pysollib/tile/tkstats.py:977 pysollib/tile/tkstats.py:978 -#: pysollib/tk/tkstats.py:885 pysollib/tk/tkstats.py:886 -#: pysollib/tk/tkstats.py:939 +#: pysollib/stats.py:53 pysollib/tile/tkstats.py:906 +#: pysollib/tile/tkstats.py:979 pysollib/tile/tkstats.py:980 +#: pysollib/tk/tkstats.py:881 pysollib/tk/tkstats.py:882 +#: pysollib/tk/tkstats.py:935 msgid "Played" msgstr "" -#: pysollib/stats.py:54 pysollib/stats.py:157 pysollib/tile/tkstats.py:911 -#: pysollib/tile/tkstats.py:982 pysollib/tile/tkstats.py:983 -#: pysollib/tk/tkstats.py:890 pysollib/tk/tkstats.py:891 -#: pysollib/tk/tkstats.py:947 +#: pysollib/stats.py:54 pysollib/stats.py:161 pysollib/tile/tkstats.py:913 +#: pysollib/tile/tkstats.py:984 pysollib/tile/tkstats.py:985 +#: pysollib/tk/tkstats.py:886 pysollib/tk/tkstats.py:887 +#: pysollib/tk/tkstats.py:943 msgid "Won" msgstr "" -#: pysollib/stats.py:55 pysollib/stats.py:157 +#: pysollib/stats.py:55 pysollib/stats.py:161 msgid "Lost" msgstr "" #: pysollib/stats.py:56 pysollib/tile/statusbar.py:150 -#: pysollib/tk/statusbar.py:161 data/glade-translations:25 +#: pysollib/tk/statusbar.py:159 data/glade-translations:25 msgid "Playing time" msgstr "" @@ -1909,63 +1913,63 @@ msgstr "" msgid "Moves" msgstr "" -#: pysollib/stats.py:58 pysollib/tile/tkstats.py:918 -#: pysollib/tile/tkstats.py:950 pysollib/tile/tkstats.py:969 -#: pysollib/tile/tkstats.py:987 pysollib/tk/tkstats.py:858 -#: pysollib/tk/tkstats.py:877 pysollib/tk/tkstats.py:895 -#: pysollib/tk/tkstats.py:955 +#: pysollib/stats.py:58 pysollib/tile/tkstats.py:920 +#: pysollib/tile/tkstats.py:952 pysollib/tile/tkstats.py:971 +#: pysollib/tile/tkstats.py:989 pysollib/tk/tkstats.py:854 +#: pysollib/tk/tkstats.py:873 pysollib/tk/tkstats.py:891 +#: pysollib/tk/tkstats.py:951 msgid "% won" msgstr "" -#: pysollib/stats.py:118 +#: pysollib/stats.py:122 msgid "Status" msgstr "" -#: pysollib/stats.py:118 pysollib/tile/statusbar.py:152 -#: pysollib/tile/tkstats.py:676 pysollib/tk/statusbar.py:163 -#: pysollib/tk/tkstats.py:669 +#: pysollib/stats.py:122 pysollib/tile/statusbar.py:152 +#: pysollib/tile/tkstats.py:678 pysollib/tk/statusbar.py:161 +#: pysollib/tk/tkstats.py:665 msgid "Game number" msgstr "" -#: pysollib/stats.py:118 pysollib/tile/tkstats.py:679 -#: pysollib/tk/tkstats.py:672 +#: pysollib/stats.py:122 pysollib/tile/tkstats.py:681 +#: pysollib/tk/tkstats.py:668 msgid "Started at" msgstr "" -#: pysollib/stats.py:142 pysollib/tile/tkstats.py:695 +#: pysollib/stats.py:146 pysollib/tile/tkstats.py:697 msgid "** UNKNOWN %d **" msgstr "" -#: pysollib/stats.py:150 +#: pysollib/stats.py:154 msgid "** ERROR **" msgstr "" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Loaded" msgstr "" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Not won" msgstr "" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Perfect" msgstr "" -#: pysollib/stats.py:204 pysollib/stats.py:235 pysollib/stats.py:241 +#: pysollib/stats.py:208 pysollib/stats.py:239 pysollib/stats.py:245 msgid "Demo" msgstr "" -#: pysollib/stats.py:215 pysollib/tile/tkstats.py:384 -#: pysollib/tk/tkstats.py:420 +#: pysollib/stats.py:219 pysollib/tile/tkstats.py:383 +#: pysollib/tk/tkstats.py:419 msgid "Total (%d out of %d games)" msgstr "" -#: pysollib/stats.py:236 +#: pysollib/stats.py:240 msgid "Full log for " msgstr "" -#: pysollib/stats.py:242 +#: pysollib/stats.py:246 msgid "Session log for " msgstr "" @@ -2087,552 +2091,544 @@ msgstr "" msgid "Select font" msgstr "" -#: pysollib/tile/menubar.py:79 pysollib/tk/menubar.py:77 -msgid "Style" -msgstr "" - -#: pysollib/tile/menubar.py:87 pysollib/tk/menubar.py:86 +#: pysollib/tile/menubar.py:86 pysollib/tk/menubar.py:84 msgid "Compound" msgstr "" -#: pysollib/tile/menubar.py:93 pysollib/tk/menubar.py:92 +#: pysollib/tile/menubar.py:92 pysollib/tk/menubar.py:90 msgid "Hide" msgstr "" -#: pysollib/tile/menubar.py:96 pysollib/tk/menubar.py:95 +#: pysollib/tile/menubar.py:95 pysollib/tk/menubar.py:93 msgid "Top" msgstr "" -#: pysollib/tile/menubar.py:99 pysollib/tk/menubar.py:98 +#: pysollib/tile/menubar.py:98 pysollib/tk/menubar.py:96 msgid "Bottom" msgstr "" -#: pysollib/tile/menubar.py:102 pysollib/tk/menubar.py:101 +#: pysollib/tile/menubar.py:101 pysollib/tk/menubar.py:99 msgid "Left" msgstr "" -#: pysollib/tile/menubar.py:105 pysollib/tk/menubar.py:104 +#: pysollib/tile/menubar.py:104 pysollib/tk/menubar.py:102 msgid "Right" msgstr "" -#: pysollib/tile/menubar.py:109 pysollib/tk/menubar.py:108 -msgid "Small icons" -msgstr "" - -#: pysollib/tile/menubar.py:112 pysollib/tk/menubar.py:111 -msgid "Large icons" -msgstr "" - -#: pysollib/tile/menubar.py:118 pysollib/tk/menubar.py:117 +#: pysollib/tile/menubar.py:115 pysollib/tk/menubar.py:113 msgid "Visible buttons" msgstr "" -#: pysollib/tile/menubar.py:353 pysollib/tile/menubar.py:522 -#: pysollib/tk/menubar.py:350 pysollib/tk/menubar.py:526 +#: pysollib/tile/menubar.py:350 pysollib/tile/menubar.py:520 +#: pysollib/tk/menubar.py:346 pysollib/tk/menubar.py:523 msgid "&About " msgstr "" -#: pysollib/tile/menubar.py:355 pysollib/tk/menubar.py:352 +#: pysollib/tile/menubar.py:352 pysollib/tk/menubar.py:348 msgid "&File" msgstr "" -#: pysollib/tile/menubar.py:357 pysollib/tk/menubar.py:354 +#: pysollib/tile/menubar.py:354 pysollib/tk/menubar.py:350 msgid "R&ecent games" msgstr "" -#: pysollib/tile/menubar.py:359 pysollib/tk/menubar.py:356 +#: pysollib/tile/menubar.py:356 pysollib/tk/menubar.py:352 msgid "Select &random game" msgstr "" -#: pysollib/tile/menubar.py:360 pysollib/tk/menubar.py:357 +#: pysollib/tile/menubar.py:357 pysollib/tk/menubar.py:353 msgid "&All games" msgstr "" -#: pysollib/tile/menubar.py:361 pysollib/tk/menubar.py:358 +#: pysollib/tile/menubar.py:358 pysollib/tk/menubar.py:354 msgid "Games played and &won" msgstr "" -#: pysollib/tile/menubar.py:362 pysollib/tk/menubar.py:359 +#: pysollib/tile/menubar.py:359 pysollib/tk/menubar.py:355 msgid "Games played and ¬ won" msgstr "" -#: pysollib/tile/menubar.py:363 pysollib/tk/menubar.py:360 +#: pysollib/tile/menubar.py:360 pysollib/tk/menubar.py:356 msgid "Games not &played" msgstr "" -#: pysollib/tile/menubar.py:364 pysollib/tk/menubar.py:361 +#: pysollib/tile/menubar.py:361 pysollib/tk/menubar.py:357 msgid "Select game by nu&mber..." msgstr "" -#: pysollib/tile/menubar.py:366 pysollib/tk/menubar.py:363 +#: pysollib/tile/menubar.py:363 pysollib/tk/menubar.py:359 msgid "Fa&vorite games" msgstr "" -#: pysollib/tile/menubar.py:367 pysollib/tk/menubar.py:364 +#: pysollib/tile/menubar.py:364 pysollib/tk/menubar.py:360 msgid "A&dd to favorites" msgstr "" -#: pysollib/tile/menubar.py:368 pysollib/tk/menubar.py:365 +#: pysollib/tile/menubar.py:365 pysollib/tk/menubar.py:361 msgid "Remove &from favorites" msgstr "" -#: pysollib/tile/menubar.py:370 pysollib/tk/menubar.py:367 +#: pysollib/tile/menubar.py:367 pysollib/tk/menubar.py:363 msgid "&Open..." msgstr "" -#: pysollib/tile/menubar.py:371 pysollib/tk/menubar.py:368 +#: pysollib/tile/menubar.py:368 pysollib/tk/menubar.py:364 msgid "&Save" msgstr "" -#: pysollib/tile/menubar.py:372 pysollib/tk/menubar.py:369 +#: pysollib/tile/menubar.py:369 pysollib/tk/menubar.py:365 msgid "Save &as..." msgstr "" -#: pysollib/tile/menubar.py:374 pysollib/tk/menubar.py:371 +#: pysollib/tile/menubar.py:371 pysollib/tk/menubar.py:367 msgid "&Hold and quit" msgstr "" -#: pysollib/tile/menubar.py:380 pysollib/tile/selectgame.py:397 -#: pysollib/tk/menubar.py:377 pysollib/tk/selectgame.py:406 +#: pysollib/tile/menubar.py:377 pysollib/tile/selectgame.py:433 +#: pysollib/tk/menubar.py:373 pysollib/tk/selectgame.py:444 msgid "&Select" msgstr "" -#: pysollib/tile/menubar.py:385 pysollib/tk/menubar.py:382 +#: pysollib/tile/menubar.py:382 pysollib/tk/menubar.py:378 msgid "&Edit" msgstr "" -#: pysollib/tile/menubar.py:386 pysollib/tk/menubar.py:383 +#: pysollib/tile/menubar.py:383 pysollib/tk/menubar.py:379 msgid "&Undo" msgstr "" -#: pysollib/tile/menubar.py:387 pysollib/tk/menubar.py:384 +#: pysollib/tile/menubar.py:384 pysollib/tk/menubar.py:380 msgid "&Redo" msgstr "" -#: pysollib/tile/menubar.py:388 pysollib/tk/menubar.py:385 +#: pysollib/tile/menubar.py:385 pysollib/tk/menubar.py:381 msgid "Redo &all" msgstr "" -#: pysollib/tile/menubar.py:391 pysollib/tk/menubar.py:388 +#: pysollib/tile/menubar.py:388 pysollib/tk/menubar.py:384 msgid "&Set bookmark" msgstr "" -#: pysollib/tile/menubar.py:393 pysollib/tile/menubar.py:397 -#: pysollib/tk/menubar.py:390 pysollib/tk/menubar.py:394 +#: pysollib/tile/menubar.py:390 pysollib/tile/menubar.py:394 +#: pysollib/tk/menubar.py:386 pysollib/tk/menubar.py:390 msgid "Bookmark %d" msgstr "" -#: pysollib/tile/menubar.py:395 pysollib/tk/menubar.py:392 +#: pysollib/tile/menubar.py:392 pysollib/tk/menubar.py:388 msgid "Go&to bookmark" msgstr "" -#: pysollib/tile/menubar.py:400 pysollib/tk/menubar.py:397 +#: pysollib/tile/menubar.py:397 pysollib/tk/menubar.py:393 msgid "&Clear bookmarks" msgstr "" -#: pysollib/tile/menubar.py:403 pysollib/tile/toolbar.py:187 -#: pysollib/tk/menubar.py:400 pysollib/tk/toolbar.py:190 +#: pysollib/tile/menubar.py:400 pysollib/tile/toolbar.py:187 +#: pysollib/tk/menubar.py:396 pysollib/tk/toolbar.py:190 msgid "Restart" msgstr "" -#: pysollib/tile/menubar.py:406 pysollib/tk/menubar.py:403 +#: pysollib/tile/menubar.py:403 pysollib/tk/menubar.py:399 msgid "Solitaire &Wizard" msgstr "" -#: pysollib/tile/menubar.py:407 pysollib/tk/menubar.py:404 +#: pysollib/tile/menubar.py:404 pysollib/tk/menubar.py:400 msgid "&Edit current game" msgstr "" -#: pysollib/tile/menubar.py:409 pysollib/tk/menubar.py:406 +#: pysollib/tile/menubar.py:406 pysollib/tk/menubar.py:402 msgid "&Game" msgstr "" -#: pysollib/tile/menubar.py:410 pysollib/tk/menubar.py:407 +#: pysollib/tile/menubar.py:407 pysollib/tk/menubar.py:403 msgid "&Deal cards" msgstr "" -#: pysollib/tile/menubar.py:411 pysollib/tk/menubar.py:408 +#: pysollib/tile/menubar.py:408 pysollib/tk/menubar.py:404 msgid "&Auto drop" msgstr "" -#: pysollib/tile/menubar.py:412 pysollib/tk/menubar.py:409 +#: pysollib/tile/menubar.py:409 pysollib/tk/menubar.py:405 +msgid "Shu&ffle tiles" +msgstr "" + +#: pysollib/tile/menubar.py:410 pysollib/tk/menubar.py:406 msgid "&Pause" msgstr "" -#: pysollib/tile/menubar.py:415 pysollib/tk/menubar.py:412 +#: pysollib/tile/menubar.py:413 pysollib/tk/menubar.py:409 msgid "S&tatus..." msgstr "" -#: pysollib/tile/menubar.py:416 pysollib/tk/menubar.py:413 +#: pysollib/tile/menubar.py:414 pysollib/tk/menubar.py:410 msgid "&Comments..." msgstr "" -#: pysollib/tile/menubar.py:418 pysollib/tile/tkstats.py:644 -#: pysollib/tk/tkstats.py:640 +#: pysollib/tile/menubar.py:416 pysollib/tile/tkstats.py:646 +#: pysollib/tk/tkstats.py:636 msgid "&Statistics..." msgstr "" -#: pysollib/tile/menubar.py:419 +#: pysollib/tile/menubar.py:417 msgid "Log..." msgstr "" -#: pysollib/tile/menubar.py:421 pysollib/tk/menubar.py:424 +#: pysollib/tile/menubar.py:419 pysollib/tk/menubar.py:421 msgid "D&emo statistics" msgstr "" -#: pysollib/tile/menubar.py:423 pysollib/tk/menubar.py:428 +#: pysollib/tile/menubar.py:421 pysollib/tk/menubar.py:425 msgid "&Assist" msgstr "" -#: pysollib/tile/menubar.py:424 pysollib/tk/menubar.py:429 +#: pysollib/tile/menubar.py:422 pysollib/tk/menubar.py:426 msgid "&Hint" msgstr "" -#: pysollib/tile/menubar.py:425 pysollib/tk/menubar.py:430 +#: pysollib/tile/menubar.py:423 pysollib/tk/menubar.py:427 msgid "Highlight p&iles" msgstr "" -#: pysollib/tile/menubar.py:426 pysollib/tk/menubar.py:431 +#: pysollib/tile/menubar.py:424 pysollib/tk/menubar.py:428 msgid "&Find card" msgstr "" -#: pysollib/tile/menubar.py:428 pysollib/tk/menubar.py:433 +#: pysollib/tile/menubar.py:426 pysollib/tk/menubar.py:430 msgid "&Demo" msgstr "" -#: pysollib/tile/menubar.py:429 pysollib/tk/menubar.py:434 +#: pysollib/tile/menubar.py:427 pysollib/tk/menubar.py:431 msgid "Demo (&all games)" msgstr "" -#: pysollib/tile/menubar.py:431 pysollib/tile/menubar.py:433 -#: pysollib/tk/menubar.py:436 pysollib/tk/menubar.py:438 +#: pysollib/tile/menubar.py:429 pysollib/tile/menubar.py:431 +#: pysollib/tk/menubar.py:433 pysollib/tk/menubar.py:435 msgid "&Solver (experimental)" msgstr "" -#: pysollib/tile/menubar.py:435 pysollib/tk/menubar.py:440 +#: pysollib/tile/menubar.py:433 pysollib/tk/menubar.py:437 msgid "&Piles description" msgstr "" -#: pysollib/tile/menubar.py:439 pysollib/tk/menubar.py:444 +#: pysollib/tile/menubar.py:437 pysollib/tk/menubar.py:441 msgid "&Options" msgstr "" -#: pysollib/tile/menubar.py:440 pysollib/tk/menubar.py:445 +#: pysollib/tile/menubar.py:438 pysollib/tk/menubar.py:442 msgid "&Player options..." msgstr "" -#: pysollib/tile/menubar.py:441 pysollib/tk/menubar.py:446 +#: pysollib/tile/menubar.py:439 pysollib/tk/menubar.py:443 msgid "&Automatic play" msgstr "" -#: pysollib/tile/menubar.py:442 pysollib/tk/menubar.py:447 +#: pysollib/tile/menubar.py:440 pysollib/tk/menubar.py:444 msgid "Auto &face up" msgstr "" -#: pysollib/tile/menubar.py:443 pysollib/tk/menubar.py:448 +#: pysollib/tile/menubar.py:441 pysollib/tk/menubar.py:445 msgid "A&uto drop" msgstr "" -#: pysollib/tile/menubar.py:444 pysollib/tk/menubar.py:449 +#: pysollib/tile/menubar.py:442 pysollib/tk/menubar.py:446 msgid "Auto &deal" msgstr "" -#: pysollib/tile/menubar.py:446 pysollib/tk/menubar.py:451 +#: pysollib/tile/menubar.py:444 pysollib/tk/menubar.py:448 msgid "&Quick play" msgstr "" -#: pysollib/tile/menubar.py:447 pysollib/tk/menubar.py:452 +#: pysollib/tile/menubar.py:445 pysollib/tk/menubar.py:449 msgid "Assist &level" msgstr "" -#: pysollib/tile/menubar.py:448 pysollib/tk/menubar.py:453 +#: pysollib/tile/menubar.py:446 pysollib/tk/menubar.py:450 msgid "Enable &undo" msgstr "" -#: pysollib/tile/menubar.py:449 pysollib/tk/menubar.py:454 +#: pysollib/tile/menubar.py:447 pysollib/tk/menubar.py:451 msgid "Enable &bookmarks" msgstr "" -#: pysollib/tile/menubar.py:450 pysollib/tk/menubar.py:455 +#: pysollib/tile/menubar.py:448 pysollib/tk/menubar.py:452 msgid "Enable &hint" msgstr "" -#: pysollib/tile/menubar.py:451 pysollib/tk/menubar.py:456 +#: pysollib/tile/menubar.py:449 pysollib/tk/menubar.py:453 msgid "Enable highlight p&iles" msgstr "" -#: pysollib/tile/menubar.py:452 pysollib/tk/menubar.py:457 +#: pysollib/tile/menubar.py:450 pysollib/tk/menubar.py:454 msgid "Enable highlight &cards" msgstr "" -#: pysollib/tile/menubar.py:453 pysollib/tk/menubar.py:458 +#: pysollib/tile/menubar.py:451 pysollib/tk/menubar.py:455 msgid "Enable highlight same &rank" msgstr "" -#: pysollib/tile/menubar.py:454 pysollib/tk/menubar.py:459 +#: pysollib/tile/menubar.py:452 pysollib/tk/menubar.py:456 msgid "Highlight &no matching" msgstr "" -#: pysollib/tile/menubar.py:456 pysollib/tk/menubar.py:461 +#: pysollib/tile/menubar.py:454 pysollib/tk/menubar.py:458 msgid "&Show removed tiles (in Mahjongg games)" msgstr "" -#: pysollib/tile/menubar.py:457 pysollib/tk/menubar.py:462 +#: pysollib/tile/menubar.py:455 pysollib/tk/menubar.py:459 msgid "Show hint &arrow (in Shisen-Sho games)" msgstr "" -#: pysollib/tile/menubar.py:459 pysollib/tk/menubar.py:464 +#: pysollib/tile/menubar.py:457 pysollib/tk/menubar.py:461 msgid "&Sound..." msgstr "" -#: pysollib/tile/menubar.py:467 pysollib/tk/menubar.py:472 +#: pysollib/tile/menubar.py:465 pysollib/tk/menubar.py:469 msgid "Cards&et..." msgstr "" -#: pysollib/tile/menubar.py:468 pysollib/tk/menubar.py:473 +#: pysollib/tile/menubar.py:466 pysollib/tk/menubar.py:470 msgid "Table t&ile..." msgstr "" -#: pysollib/tile/menubar.py:470 pysollib/tk/menubar.py:475 +#: pysollib/tile/menubar.py:468 pysollib/tk/menubar.py:472 msgid "Card &background" msgstr "" -#: pysollib/tile/menubar.py:471 pysollib/tk/menubar.py:476 +#: pysollib/tile/menubar.py:469 pysollib/tk/menubar.py:473 msgid "Card &view" msgstr "" -#: pysollib/tile/menubar.py:472 pysollib/tk/menubar.py:477 +#: pysollib/tile/menubar.py:470 pysollib/tk/menubar.py:474 msgid "Card shado&w" msgstr "" -#: pysollib/tile/menubar.py:473 pysollib/tk/menubar.py:478 +#: pysollib/tile/menubar.py:471 pysollib/tk/menubar.py:475 msgid "Shade &legal moves" msgstr "" -#: pysollib/tile/menubar.py:474 pysollib/tk/menubar.py:479 +#: pysollib/tile/menubar.py:472 pysollib/tk/menubar.py:476 msgid "&Negative cards bottom" msgstr "" -#: pysollib/tile/menubar.py:475 pysollib/tk/menubar.py:480 +#: pysollib/tile/menubar.py:473 pysollib/tk/menubar.py:477 msgid "Shrink face-down cards" msgstr "" -#: pysollib/tile/menubar.py:476 pysollib/tk/menubar.py:481 +#: pysollib/tile/menubar.py:474 pysollib/tk/menubar.py:478 msgid "Shade &filled stacks" msgstr "" -#: pysollib/tile/menubar.py:477 pysollib/tk/menubar.py:482 +#: pysollib/tile/menubar.py:475 pysollib/tk/menubar.py:479 msgid "A&nimations" msgstr "" -#: pysollib/tile/menubar.py:478 pysollib/tk/menubar.py:483 +#: pysollib/tile/menubar.py:476 pysollib/tk/menubar.py:480 msgid "&None" msgstr "" -#: pysollib/tile/menubar.py:479 pysollib/tk/menubar.py:484 +#: pysollib/tile/menubar.py:477 pysollib/tk/menubar.py:481 msgid "&Very fast" msgstr "" -#: pysollib/tile/menubar.py:480 pysollib/tk/menubar.py:485 +#: pysollib/tile/menubar.py:478 pysollib/tk/menubar.py:482 msgid "&Fast" msgstr "" -#: pysollib/tile/menubar.py:481 pysollib/tk/menubar.py:486 +#: pysollib/tile/menubar.py:479 pysollib/tk/menubar.py:483 msgid "&Medium" msgstr "" -#: pysollib/tile/menubar.py:482 pysollib/tk/menubar.py:487 +#: pysollib/tile/menubar.py:480 pysollib/tk/menubar.py:484 msgid "&Slow" msgstr "" -#: pysollib/tile/menubar.py:483 pysollib/tk/menubar.py:488 +#: pysollib/tile/menubar.py:481 pysollib/tk/menubar.py:485 msgid "V&ery slow" msgstr "" -#: pysollib/tile/menubar.py:485 pysollib/tk/menubar.py:490 +#: pysollib/tile/menubar.py:483 pysollib/tk/menubar.py:487 msgid "&Redeal animation" msgstr "" -#: pysollib/tile/menubar.py:487 pysollib/tk/menubar.py:492 +#: pysollib/tile/menubar.py:485 pysollib/tk/menubar.py:489 msgid "&Winning animation" msgstr "" -#: pysollib/tile/menubar.py:488 pysollib/tk/menubar.py:493 +#: pysollib/tile/menubar.py:486 pysollib/tk/menubar.py:490 msgid "&Mouse" msgstr "" -#: pysollib/tile/menubar.py:489 pysollib/tk/menubar.py:494 +#: pysollib/tile/menubar.py:487 pysollib/tk/menubar.py:491 msgid "&Drag-and-Drop" msgstr "" -#: pysollib/tile/menubar.py:490 pysollib/tk/menubar.py:495 +#: pysollib/tile/menubar.py:488 pysollib/tk/menubar.py:492 msgid "&Point-and-Click" msgstr "" -#: pysollib/tile/menubar.py:491 pysollib/tk/menubar.py:496 +#: pysollib/tile/menubar.py:489 pysollib/tk/menubar.py:493 msgid "&Sticky mouse" msgstr "" -#: pysollib/tile/menubar.py:493 pysollib/tk/menubar.py:498 +#: pysollib/tile/menubar.py:491 pysollib/tk/menubar.py:495 msgid "Use mouse for undo/redo" msgstr "" -#: pysollib/tile/menubar.py:495 pysollib/tk/menubar.py:500 +#: pysollib/tile/menubar.py:493 pysollib/tk/menubar.py:497 msgid "&Fonts..." msgstr "" -#: pysollib/tile/menubar.py:496 pysollib/tk/menubar.py:501 +#: pysollib/tile/menubar.py:494 pysollib/tk/menubar.py:498 msgid "&Colors..." msgstr "" -#: pysollib/tile/menubar.py:497 pysollib/tk/menubar.py:502 +#: pysollib/tile/menubar.py:495 pysollib/tk/menubar.py:499 msgid "Time&outs..." msgstr "" -#: pysollib/tile/menubar.py:500 pysollib/tk/menubar.py:504 +#: pysollib/tile/menubar.py:498 pysollib/tk/menubar.py:501 msgid "&Toolbar" msgstr "" -#: pysollib/tile/menubar.py:502 pysollib/tk/menubar.py:506 +#: pysollib/tile/menubar.py:500 pysollib/tk/menubar.py:503 msgid "Stat&usbar" msgstr "" -#: pysollib/tile/menubar.py:503 pysollib/tk/menubar.py:507 +#: pysollib/tile/menubar.py:501 pysollib/tk/menubar.py:504 msgid "Show &statusbar" msgstr "" -#: pysollib/tile/menubar.py:504 pysollib/tk/menubar.py:508 +#: pysollib/tile/menubar.py:502 pysollib/tk/menubar.py:505 msgid "Show &number of cards" msgstr "" -#: pysollib/tile/menubar.py:505 pysollib/tk/menubar.py:509 +#: pysollib/tile/menubar.py:503 pysollib/tk/menubar.py:506 msgid "Show &help bar" msgstr "" -#: pysollib/tile/menubar.py:506 pysollib/tk/menubar.py:510 +#: pysollib/tile/menubar.py:504 pysollib/tk/menubar.py:507 msgid "Save games &geometry" msgstr "" -#: pysollib/tile/menubar.py:507 pysollib/tk/menubar.py:511 +#: pysollib/tile/menubar.py:505 pysollib/tk/menubar.py:508 msgid "&Demo logo" msgstr "" -#: pysollib/tile/menubar.py:508 pysollib/tk/menubar.py:512 +#: pysollib/tile/menubar.py:506 pysollib/tk/menubar.py:509 msgid "Startup splash sc&reen" msgstr "" -#: pysollib/tile/menubar.py:514 pysollib/tk/menubar.py:518 +#: pysollib/tile/menubar.py:512 pysollib/tk/menubar.py:515 msgid "&Help" msgstr "" -#: pysollib/tile/menubar.py:515 pysollib/tk/menubar.py:519 +#: pysollib/tile/menubar.py:513 pysollib/tk/menubar.py:516 msgid "&Contents" msgstr "" -#: pysollib/tile/menubar.py:516 pysollib/tk/menubar.py:520 +#: pysollib/tile/menubar.py:514 pysollib/tk/menubar.py:517 msgid "&How to play" msgstr "" -#: pysollib/tile/menubar.py:517 pysollib/tk/menubar.py:521 +#: pysollib/tile/menubar.py:515 pysollib/tk/menubar.py:518 msgid "&Rules for this game" msgstr "" -#: pysollib/tile/menubar.py:518 pysollib/tk/menubar.py:522 +#: pysollib/tile/menubar.py:516 pysollib/tk/menubar.py:519 msgid "&License terms" msgstr "" -#: pysollib/tile/menubar.py:637 pysollib/tk/menubar.py:641 +#: pysollib/tile/menubar.py:635 pysollib/tk/menubar.py:638 msgid "All &games..." msgstr "" -#: pysollib/tile/menubar.py:639 pysollib/tk/menubar.py:643 +#: pysollib/tile/menubar.py:637 pysollib/tk/menubar.py:640 msgid "Playable pre&view..." msgstr "" -#: pysollib/tile/menubar.py:692 pysollib/tk/menubar.py:696 +#: pysollib/tile/menubar.py:690 pysollib/tk/menubar.py:693 msgid "&Mahjongg games" msgstr "" -#: pysollib/tile/menubar.py:730 pysollib/tk/menubar.py:734 +#: pysollib/tile/menubar.py:728 pysollib/tk/menubar.py:731 msgid "&Popular games" msgstr "" -#: pysollib/tile/menubar.py:738 pysollib/tk/menubar.py:742 +#: pysollib/tile/menubar.py:736 pysollib/tk/menubar.py:739 msgid "&French games" msgstr "" -#: pysollib/tile/menubar.py:745 pysollib/tk/menubar.py:749 +#: pysollib/tile/menubar.py:743 pysollib/tk/menubar.py:746 msgid "&Oriental games" msgstr "" -#: pysollib/tile/menubar.py:753 pysollib/tk/menubar.py:757 +#: pysollib/tile/menubar.py:751 pysollib/tk/menubar.py:754 msgid "&Special games" msgstr "" -#: pysollib/tile/menubar.py:759 pysollib/tk/menubar.py:763 +#: pysollib/tile/menubar.py:757 pysollib/tk/menubar.py:760 msgid "&Cusom games" msgstr "" -#: pysollib/tile/menubar.py:765 pysollib/tk/menubar.py:769 +#: pysollib/tile/menubar.py:763 pysollib/tk/menubar.py:766 msgid "&All games by name" msgstr "" -#: pysollib/tile/menubar.py:1047 pysollib/tk/menubar.py:1051 +#: pysollib/tile/menubar.py:1045 pysollib/tk/menubar.py:1048 #: data/glade-translations:72 msgid "Sound settings" msgstr "" -#: pysollib/tile/menubar.py:1155 pysollib/tk/menubar.py:1163 +#: pysollib/tile/menubar.py:1153 pysollib/tk/menubar.py:1160 msgid "Select " msgstr "" -#: pysollib/tile/menubar.py:1201 pysollib/tk/menubar.py:1210 +#: pysollib/tile/menubar.py:1199 pysollib/tk/menubar.py:1207 msgid "Select table background" msgstr "" -#: pysollib/tile/menubar.py:1346 +#: pysollib/tile/menubar.py:1344 msgid "Change theme" msgstr "" -#: pysollib/tile/menubar.py:1347 +#: pysollib/tile/menubar.py:1345 msgid "" "This settings will take effect\n" "the next time you restart " msgstr "" -#: pysollib/tile/menubar.py:1354 +#: pysollib/tile/menubar.py:1352 msgid "Set t&heme" msgstr "" -#: pysollib/tile/menubar.py:1360 +#: pysollib/tile/menubar.py:1358 msgid "Default" msgstr "" -#: pysollib/tile/menubar.py:1361 +#: pysollib/tile/menubar.py:1359 msgid "Classic" msgstr "" -#: pysollib/tile/menubar.py:1362 +#: pysollib/tile/menubar.py:1360 msgid "Revitalized" msgstr "" -#: pysollib/tile/menubar.py:1363 +#: pysollib/tile/menubar.py:1361 msgid "Windows native" msgstr "" -#: pysollib/tile/menubar.py:1364 +#: pysollib/tile/menubar.py:1362 msgid "XP Native" msgstr "" -#: pysollib/tile/menubar.py:1365 +#: pysollib/tile/menubar.py:1363 msgid "Aqua" msgstr "" -#: pysollib/tile/menubar.py:1383 pysollib/tk/menubar.py:1368 +#: pysollib/tile/menubar.py:1381 pysollib/tk/menubar.py:1365 msgid "Solitaire Wizard" msgstr "" -#: pysollib/tile/menubar.py:1394 pysollib/tk/menubar.py:1379 +#: pysollib/tile/menubar.py:1392 pysollib/tk/menubar.py:1376 msgid "" "\n" "Error while saving game.\n" @@ -2713,12 +2709,12 @@ msgstr "" msgid "XLarge cardsets" msgstr "" -#: pysollib/tile/selectcardset.py:236 pysollib/tk/menubar.py:1160 +#: pysollib/tile/selectcardset.py:236 pysollib/tk/menubar.py:1157 msgid "&Info..." msgstr "" -#: pysollib/tile/selectcardset.py:237 pysollib/tk/menubar.py:1158 -#: pysollib/tk/menubar.py:1160 pysollib/tk/selectcardset.py:241 +#: pysollib/tile/selectcardset.py:237 pysollib/tk/menubar.py:1155 +#: pysollib/tk/menubar.py:1157 pysollib/tk/selectcardset.py:241 msgid "&Load" msgstr "" @@ -2726,10 +2722,10 @@ msgstr "" msgid "About cardset" msgstr "" -#: pysollib/tile/selectcardset.py:327 pysollib/tile/selectgame.py:354 -#: pysollib/tk/selectcardset.py:336 pysollib/tk/selectgame.py:364 +#: pysollib/tile/selectcardset.py:327 pysollib/tile/selectgame.py:390 +#: pysollib/tk/selectcardset.py:336 pysollib/tk/selectgame.py:402 #: pysollib/wizardutil.py:116 pysollib/wizardutil.py:153 -#: pysollib/wizardutil.py:218 pysollib/wizardutil.py:276 +#: pysollib/wizardutil.py:211 pysollib/wizardutil.py:269 msgid "Type:" msgstr "" @@ -2753,270 +2749,274 @@ msgstr "" msgid "Mahjongg Games" msgstr "" -#: pysollib/tile/selectgame.py:124 pysollib/tk/selectgame.py:123 +#: pysollib/tile/selectgame.py:125 pysollib/tk/selectgame.py:124 msgid "French games" msgstr "" -#: pysollib/tile/selectgame.py:126 pysollib/tk/selectgame.py:125 +#: pysollib/tile/selectgame.py:128 pysollib/tk/selectgame.py:127 msgid "Oriental Games" msgstr "" -#: pysollib/tile/selectgame.py:128 pysollib/tk/selectgame.py:127 +#: pysollib/tile/selectgame.py:131 pysollib/tk/selectgame.py:130 msgid "Special Games" msgstr "" -#: pysollib/tile/selectgame.py:130 pysollib/tk/selectgame.py:129 +#: pysollib/tile/selectgame.py:134 pysollib/tk/selectgame.py:133 msgid "Original Games" msgstr "" -#: pysollib/tile/selectgame.py:144 pysollib/tk/selectgame.py:143 +#: pysollib/tile/selectgame.py:149 pysollib/tk/selectgame.py:148 msgid "by Compatibility" msgstr "" -#: pysollib/tile/selectgame.py:152 pysollib/tk/selectgame.py:151 +#: pysollib/tile/selectgame.py:157 pysollib/tk/selectgame.py:157 msgid "New games in v. " msgstr "" -#: pysollib/tile/selectgame.py:155 pysollib/tk/selectgame.py:154 +#: pysollib/tile/selectgame.py:160 pysollib/tk/selectgame.py:160 msgid "by PySol version" msgstr "" -#: pysollib/tile/selectgame.py:162 pysollib/tk/selectgame.py:161 +#: pysollib/tile/selectgame.py:166 pysollib/tk/selectgame.py:167 msgid "All Games" msgstr "" -#: pysollib/tile/selectgame.py:163 pysollib/tk/selectgame.py:162 +#: pysollib/tile/selectgame.py:167 pysollib/tk/selectgame.py:168 msgid "Alternate Names" msgstr "" -#: pysollib/tile/selectgame.py:164 pysollib/tk/selectgame.py:163 +#: pysollib/tile/selectgame.py:168 pysollib/tk/selectgame.py:169 msgid "Popular Games" msgstr "" -#: pysollib/tile/selectgame.py:169 pysollib/tk/selectgame.py:168 +#: pysollib/tile/selectgame.py:174 pysollib/tk/selectgame.py:174 +msgid "Custom Games" +msgstr "" + +#: pysollib/tile/selectgame.py:176 pysollib/tk/selectgame.py:177 msgid "by Skill Level" msgstr "" -#: pysollib/tile/selectgame.py:170 pysollib/tile/selectgame.py:523 -#: pysollib/tk/selectgame.py:169 pysollib/tk/selectgame.py:532 +#: pysollib/tile/selectgame.py:177 pysollib/tile/selectgame.py:559 +#: pysollib/tk/selectgame.py:178 pysollib/tk/selectgame.py:570 #: pysollib/wizardutil.py:78 msgid "Luck only" msgstr "" -#: pysollib/tile/selectgame.py:171 pysollib/tile/selectgame.py:524 -#: pysollib/tk/selectgame.py:170 pysollib/tk/selectgame.py:533 +#: pysollib/tile/selectgame.py:179 pysollib/tile/selectgame.py:560 +#: pysollib/tk/selectgame.py:180 pysollib/tk/selectgame.py:571 #: pysollib/wizardutil.py:79 msgid "Mostly luck" msgstr "" -#: pysollib/tile/selectgame.py:172 pysollib/tile/selectgame.py:525 -#: pysollib/tk/selectgame.py:171 pysollib/tk/selectgame.py:534 +#: pysollib/tile/selectgame.py:181 pysollib/tile/selectgame.py:561 +#: pysollib/tk/selectgame.py:182 pysollib/tk/selectgame.py:572 #: pysollib/wizardutil.py:80 pysollib/wizardutil.py:84 msgid "Balanced" msgstr "" -#: pysollib/tile/selectgame.py:173 pysollib/tile/selectgame.py:526 -#: pysollib/tk/selectgame.py:172 pysollib/tk/selectgame.py:535 +#: pysollib/tile/selectgame.py:183 pysollib/tile/selectgame.py:562 +#: pysollib/tk/selectgame.py:184 pysollib/tk/selectgame.py:573 #: pysollib/wizardutil.py:81 msgid "Mostly skill" msgstr "" -#: pysollib/tile/selectgame.py:174 pysollib/tile/selectgame.py:527 -#: pysollib/tk/selectgame.py:173 pysollib/tk/selectgame.py:536 +#: pysollib/tile/selectgame.py:185 pysollib/tile/selectgame.py:563 +#: pysollib/tk/selectgame.py:186 pysollib/tk/selectgame.py:574 #: pysollib/wizardutil.py:82 msgid "Skill only" msgstr "" -#: pysollib/tile/selectgame.py:176 pysollib/tk/selectgame.py:175 +#: pysollib/tile/selectgame.py:188 pysollib/tk/selectgame.py:189 msgid "by Game Feature" msgstr "" -#: pysollib/tile/selectgame.py:177 pysollib/tk/selectgame.py:176 +#: pysollib/tile/selectgame.py:189 pysollib/tk/selectgame.py:190 msgid "by Number of Cards" msgstr "" -#: pysollib/tile/selectgame.py:178 pysollib/tk/selectgame.py:177 +#: pysollib/tile/selectgame.py:190 pysollib/tk/selectgame.py:191 msgid "32 cards" msgstr "" -#: pysollib/tile/selectgame.py:179 pysollib/tk/selectgame.py:178 +#: pysollib/tile/selectgame.py:192 pysollib/tk/selectgame.py:193 msgid "48 cards" msgstr "" -#: pysollib/tile/selectgame.py:180 pysollib/tk/selectgame.py:179 +#: pysollib/tile/selectgame.py:194 pysollib/tk/selectgame.py:195 msgid "52 cards" msgstr "" -#: pysollib/tile/selectgame.py:181 pysollib/tk/selectgame.py:180 +#: pysollib/tile/selectgame.py:196 pysollib/tk/selectgame.py:197 msgid "64 cards" msgstr "" -#: pysollib/tile/selectgame.py:182 pysollib/tk/selectgame.py:181 +#: pysollib/tile/selectgame.py:198 pysollib/tk/selectgame.py:199 msgid "78 cards" msgstr "" -#: pysollib/tile/selectgame.py:183 pysollib/tk/selectgame.py:182 +#: pysollib/tile/selectgame.py:200 pysollib/tk/selectgame.py:201 msgid "104 cards" msgstr "" -#: pysollib/tile/selectgame.py:184 pysollib/tk/selectgame.py:183 +#: pysollib/tile/selectgame.py:202 pysollib/tk/selectgame.py:203 msgid "144 cards" msgstr "" -#: pysollib/tile/selectgame.py:185 pysollib/tk/selectgame.py:184 +#: pysollib/tile/selectgame.py:204 pysollib/tk/selectgame.py:205 msgid "Other number" msgstr "" -#: pysollib/tile/selectgame.py:187 pysollib/tk/selectgame.py:186 +#: pysollib/tile/selectgame.py:207 pysollib/tk/selectgame.py:208 msgid "by Number of Decks" msgstr "" -#: pysollib/tile/selectgame.py:188 pysollib/tk/selectgame.py:187 +#: pysollib/tile/selectgame.py:208 pysollib/tk/selectgame.py:209 msgid "1 deck games" msgstr "" -#: pysollib/tile/selectgame.py:189 pysollib/tk/selectgame.py:188 +#: pysollib/tile/selectgame.py:210 pysollib/tk/selectgame.py:211 msgid "2 deck games" msgstr "" -#: pysollib/tile/selectgame.py:190 pysollib/tk/selectgame.py:189 +#: pysollib/tile/selectgame.py:212 pysollib/tk/selectgame.py:213 msgid "3 deck games" msgstr "" -#: pysollib/tile/selectgame.py:191 pysollib/tk/selectgame.py:190 +#: pysollib/tile/selectgame.py:214 pysollib/tk/selectgame.py:215 msgid "4 deck games" msgstr "" -#: pysollib/tile/selectgame.py:193 pysollib/tk/selectgame.py:192 +#: pysollib/tile/selectgame.py:217 pysollib/tk/selectgame.py:218 msgid "by Number of Redeals" msgstr "" -#: pysollib/tile/selectgame.py:194 pysollib/tk/selectgame.py:193 +#: pysollib/tile/selectgame.py:218 pysollib/tk/selectgame.py:219 msgid "No redeal" msgstr "" -#: pysollib/tile/selectgame.py:195 pysollib/tk/selectgame.py:194 +#: pysollib/tile/selectgame.py:220 pysollib/tk/selectgame.py:221 msgid "1 redeal" msgstr "" -#: pysollib/tile/selectgame.py:196 pysollib/tk/selectgame.py:195 +#: pysollib/tile/selectgame.py:222 pysollib/tk/selectgame.py:223 msgid "2 redeals" msgstr "" -#: pysollib/tile/selectgame.py:197 pysollib/tk/selectgame.py:196 +#: pysollib/tile/selectgame.py:224 pysollib/tk/selectgame.py:225 msgid "3 redeals" msgstr "" -#: pysollib/tile/selectgame.py:198 pysollib/tk/selectgame.py:197 +#: pysollib/tile/selectgame.py:226 pysollib/tk/selectgame.py:227 #: pysollib/wizardutil.py:124 msgid "Unlimited redeals" msgstr "" -#: pysollib/tile/selectgame.py:200 pysollib/tk/selectgame.py:199 +#: pysollib/tile/selectgame.py:230 pysollib/tk/selectgame.py:231 msgid "Other number of redeals" msgstr "" -#: pysollib/tile/selectgame.py:205 pysollib/tk/selectgame.py:204 +#: pysollib/tile/selectgame.py:236 pysollib/tk/selectgame.py:237 msgid "Other Categories" msgstr "" -#: pysollib/tile/selectgame.py:206 pysollib/tk/selectgame.py:205 +#: pysollib/tile/selectgame.py:237 pysollib/tk/selectgame.py:238 msgid "Games for Children (very easy)" msgstr "" -#: pysollib/tile/selectgame.py:207 pysollib/tk/selectgame.py:206 +#: pysollib/tile/selectgame.py:239 pysollib/tk/selectgame.py:240 msgid "Games with Scoring" msgstr "" -#: pysollib/tile/selectgame.py:208 pysollib/tk/selectgame.py:207 +#: pysollib/tile/selectgame.py:241 pysollib/tk/selectgame.py:242 msgid "Games with Separate Decks" msgstr "" -#: pysollib/tile/selectgame.py:209 pysollib/tk/selectgame.py:208 +#: pysollib/tile/selectgame.py:243 pysollib/tk/selectgame.py:244 msgid "Open Games (all cards visible)" msgstr "" -#: pysollib/tile/selectgame.py:210 pysollib/tk/selectgame.py:209 +#: pysollib/tile/selectgame.py:245 pysollib/tk/selectgame.py:246 msgid "Relaxed Variants" msgstr "" -#: pysollib/tile/selectgame.py:341 pysollib/tk/selectgame.py:348 +#: pysollib/tile/selectgame.py:377 pysollib/tk/selectgame.py:386 msgid "About game" msgstr "" -#: pysollib/tile/selectgame.py:351 pysollib/tk/selectgame.py:361 +#: pysollib/tile/selectgame.py:387 pysollib/tk/selectgame.py:399 #: pysollib/wizardutil.py:74 msgid "Name:" msgstr "" -#: pysollib/tile/selectgame.py:352 pysollib/tk/selectgame.py:362 +#: pysollib/tile/selectgame.py:388 pysollib/tk/selectgame.py:400 msgid "Alternate names:" msgstr "" -#: pysollib/tile/selectgame.py:353 pysollib/tk/selectgame.py:363 +#: pysollib/tile/selectgame.py:389 pysollib/tk/selectgame.py:401 msgid "Category:" msgstr "" -#: pysollib/tile/selectgame.py:355 pysollib/tk/selectgame.py:365 +#: pysollib/tile/selectgame.py:391 pysollib/tk/selectgame.py:403 #: pysollib/wizardutil.py:85 msgid "Skill level:" msgstr "" -#: pysollib/tile/selectgame.py:356 pysollib/tk/selectgame.py:366 +#: pysollib/tile/selectgame.py:392 pysollib/tk/selectgame.py:404 msgid "Decks:" msgstr "" -#: pysollib/tile/selectgame.py:357 pysollib/tk/selectgame.py:367 +#: pysollib/tile/selectgame.py:393 pysollib/tk/selectgame.py:405 msgid "Redeals:" msgstr "" -#: pysollib/tile/selectgame.py:359 pysollib/tk/selectgame.py:369 +#: pysollib/tile/selectgame.py:395 pysollib/tk/selectgame.py:407 msgid "Played:" msgstr "" -#: pysollib/tile/selectgame.py:360 pysollib/tile/tkstats.py:203 -#: pysollib/tile/tkstats.py:255 pysollib/tk/selectgame.py:370 +#: pysollib/tile/selectgame.py:396 pysollib/tile/tkstats.py:203 +#: pysollib/tile/tkstats.py:255 pysollib/tk/selectgame.py:408 #: pysollib/tk/tkstats.py:112 pysollib/tk/tkstats.py:164 #: data/glade-translations:9 data/glade-translations:13 msgid "Won:" msgstr "" -#: pysollib/tile/selectgame.py:361 pysollib/tile/tkstats.py:204 -#: pysollib/tile/tkstats.py:257 pysollib/tk/selectgame.py:371 +#: pysollib/tile/selectgame.py:397 pysollib/tile/tkstats.py:204 +#: pysollib/tile/tkstats.py:257 pysollib/tk/selectgame.py:409 #: pysollib/tk/tkstats.py:113 pysollib/tk/tkstats.py:165 #: data/glade-translations:11 data/glade-translations:14 msgid "Lost:" msgstr "" -#: pysollib/tile/selectgame.py:362 pysollib/tile/tkstats.py:775 -#: pysollib/tk/selectgame.py:372 pysollib/tk/tkstats.py:739 +#: pysollib/tile/selectgame.py:398 pysollib/tile/tkstats.py:777 +#: pysollib/tk/selectgame.py:410 pysollib/tk/tkstats.py:735 #: data/glade-translations:18 msgid "Playing time:" msgstr "" -#: pysollib/tile/selectgame.py:363 pysollib/tile/tkstats.py:782 -#: pysollib/tk/selectgame.py:373 pysollib/tk/tkstats.py:746 +#: pysollib/tile/selectgame.py:399 pysollib/tile/tkstats.py:784 +#: pysollib/tk/selectgame.py:411 pysollib/tk/tkstats.py:742 #: data/glade-translations:19 msgid "Moves:" msgstr "" -#: pysollib/tile/selectgame.py:364 pysollib/tk/selectgame.py:374 +#: pysollib/tile/selectgame.py:400 pysollib/tk/selectgame.py:412 msgid "% won:" msgstr "" -#: pysollib/tile/selectgame.py:396 pysollib/tk/selectgame.py:406 +#: pysollib/tile/selectgame.py:432 pysollib/tk/selectgame.py:444 msgid "&Rules" msgstr "" -#: pysollib/tile/selectgame.py:476 pysollib/tk/selectgame.py:485 +#: pysollib/tile/selectgame.py:512 pysollib/tk/selectgame.py:523 msgid "Playable Preview - " msgstr "" -#: pysollib/tile/selectgame.py:530 pysollib/tk/selectgame.py:539 +#: pysollib/tile/selectgame.py:566 pysollib/tk/selectgame.py:577 msgid "variable" msgstr "" -#: pysollib/tile/selectgame.py:531 pysollib/tk/selectgame.py:540 +#: pysollib/tile/selectgame.py:567 pysollib/tk/selectgame.py:578 msgid "unlimited" msgstr "" @@ -3109,11 +3109,13 @@ msgstr "" msgid "&Start" msgstr "" -#: pysollib/tile/solverdialog.py:274 pysollib/tk/solverdialog.py:277 -msgid "This game is solveable in %s moves." -msgstr "" +#: pysollib/tile/solverdialog.py:276 pysollib/tk/solverdialog.py:279 +msgid "This game is solveable in %d move." +msgid_plural "This game is solveable in %d moves." +msgstr[0] "" +msgstr[1] "" -#: pysollib/tile/solverdialog.py:277 pysollib/tk/solverdialog.py:280 +#: pysollib/tile/solverdialog.py:282 pysollib/tk/solverdialog.py:285 msgid "I could not solve this game." msgstr "" @@ -3234,11 +3236,11 @@ msgid "" "the next time you restart " msgstr "" -#: pysollib/tile/statusbar.py:151 pysollib/tk/statusbar.py:162 +#: pysollib/tile/statusbar.py:151 pysollib/tk/statusbar.py:160 msgid "Moves/Total moves" msgstr "" -#: pysollib/tile/statusbar.py:153 pysollib/tk/statusbar.py:164 +#: pysollib/tile/statusbar.py:153 pysollib/tk/statusbar.py:162 msgid "Games played: won/lost" msgstr "" @@ -3267,19 +3269,19 @@ msgstr "" msgid "Highlight same rank:" msgstr "" -#: pysollib/tile/tkconst.py:106 pysollib/tk/tkconst.py:104 +#: pysollib/tile/tkconst.py:84 pysollib/tk/tkconst.py:83 msgid "Icons only" msgstr "" -#: pysollib/tile/tkconst.py:107 pysollib/tk/tkconst.py:105 +#: pysollib/tile/tkconst.py:85 pysollib/tk/tkconst.py:84 msgid "Text below icons" msgstr "" -#: pysollib/tile/tkconst.py:108 pysollib/tk/tkconst.py:106 +#: pysollib/tile/tkconst.py:86 pysollib/tk/tkconst.py:85 msgid "Text beside icons" msgstr "" -#: pysollib/tile/tkconst.py:109 pysollib/tk/tkconst.py:107 +#: pysollib/tile/tkconst.py:87 pysollib/tk/tkconst.py:86 msgid "Text only" msgstr "" @@ -3314,14 +3316,14 @@ msgstr "" msgid "Unable to service request:\n" msgstr "" -#: pysollib/tile/tkstats.py:93 pysollib/tile/tkstats.py:739 -#: pysollib/tile/tkstats.py:881 pysollib/tk/tkstats.py:908 +#: pysollib/tile/tkstats.py:93 pysollib/tile/tkstats.py:741 +#: pysollib/tile/tkstats.py:883 pysollib/tk/tkstats.py:904 #: data/glade-translations:17 msgid "Current game" msgstr "" -#: pysollib/tile/tkstats.py:97 pysollib/tile/tkstats.py:747 -#: pysollib/tile/tkstats.py:876 pysollib/tk/tkstats.py:902 +#: pysollib/tile/tkstats.py:97 pysollib/tile/tkstats.py:749 +#: pysollib/tile/tkstats.py:878 pysollib/tk/tkstats.py:898 #: data/glade-translations:30 msgid "All games" msgstr "" @@ -3362,159 +3364,159 @@ msgstr "" msgid "No games" msgstr "" -#: pysollib/tile/tkstats.py:514 +#: pysollib/tile/tkstats.py:516 msgid "Log" msgstr "" -#: pysollib/tile/tkstats.py:545 pysollib/tk/tkstats.py:516 -#: pysollib/tk/tkstats.py:582 pysollib/tk/tkstats.py:597 +#: pysollib/tile/tkstats.py:547 pysollib/tk/tkstats.py:512 +#: pysollib/tk/tkstats.py:578 pysollib/tk/tkstats.py:593 msgid "&Save to file" msgstr "" -#: pysollib/tile/tkstats.py:615 pysollib/tk/tkstats.py:612 +#: pysollib/tile/tkstats.py:617 pysollib/tk/tkstats.py:608 msgid "Highlight piles: " msgstr "" -#: pysollib/tile/tkstats.py:616 pysollib/tk/tkstats.py:613 +#: pysollib/tile/tkstats.py:618 pysollib/tk/tkstats.py:609 msgid "Highlight cards: " msgstr "" -#: pysollib/tile/tkstats.py:617 pysollib/tk/tkstats.py:614 +#: pysollib/tile/tkstats.py:619 pysollib/tk/tkstats.py:610 msgid "Highlight same rank: " msgstr "" -#: pysollib/tile/tkstats.py:620 pysollib/tk/tkstats.py:617 +#: pysollib/tile/tkstats.py:622 pysollib/tk/tkstats.py:613 msgid "" "\n" "Redeals: " msgstr "" -#: pysollib/tile/tkstats.py:621 pysollib/tk/tkstats.py:618 +#: pysollib/tile/tkstats.py:623 pysollib/tk/tkstats.py:614 msgid "" "\n" "Cards in Talon: " msgstr "" -#: pysollib/tile/tkstats.py:623 pysollib/tk/tkstats.py:620 +#: pysollib/tile/tkstats.py:625 pysollib/tk/tkstats.py:616 msgid "" "\n" "Cards in Waste: " msgstr "" -#: pysollib/tile/tkstats.py:625 pysollib/tk/tkstats.py:622 +#: pysollib/tile/tkstats.py:627 pysollib/tk/tkstats.py:618 msgid "" "\n" "Cards in Foundations: " msgstr "" -#: pysollib/tile/tkstats.py:629 pysollib/tk/tkstats.py:625 +#: pysollib/tile/tkstats.py:631 pysollib/tk/tkstats.py:621 msgid "Game status" msgstr "" -#: pysollib/tile/tkstats.py:632 pysollib/tk/tkstats.py:628 +#: pysollib/tile/tkstats.py:634 pysollib/tk/tkstats.py:624 msgid "Playing time: " msgstr "" -#: pysollib/tile/tkstats.py:633 pysollib/tk/tkstats.py:629 +#: pysollib/tile/tkstats.py:635 pysollib/tk/tkstats.py:625 msgid "Started at: " msgstr "" -#: pysollib/tile/tkstats.py:634 pysollib/tk/tkstats.py:630 +#: pysollib/tile/tkstats.py:636 pysollib/tk/tkstats.py:626 msgid "Moves: " msgstr "" -#: pysollib/tile/tkstats.py:635 pysollib/tk/tkstats.py:631 +#: pysollib/tile/tkstats.py:637 pysollib/tk/tkstats.py:627 msgid "Undo moves: " msgstr "" -#: pysollib/tile/tkstats.py:636 pysollib/tk/tkstats.py:632 +#: pysollib/tile/tkstats.py:638 pysollib/tk/tkstats.py:628 msgid "Bookmark moves: " msgstr "" -#: pysollib/tile/tkstats.py:637 pysollib/tk/tkstats.py:633 +#: pysollib/tile/tkstats.py:639 pysollib/tk/tkstats.py:629 msgid "Demo moves: " msgstr "" -#: pysollib/tile/tkstats.py:638 pysollib/tk/tkstats.py:634 +#: pysollib/tile/tkstats.py:640 pysollib/tk/tkstats.py:630 msgid "Total player moves: " msgstr "" -#: pysollib/tile/tkstats.py:639 pysollib/tk/tkstats.py:635 +#: pysollib/tile/tkstats.py:641 pysollib/tk/tkstats.py:631 msgid "Total moves in this game: " msgstr "" -#: pysollib/tile/tkstats.py:640 pysollib/tk/tkstats.py:636 +#: pysollib/tile/tkstats.py:642 pysollib/tk/tkstats.py:632 msgid "Hints: " msgstr "" -#: pysollib/tile/tkstats.py:669 pysollib/tk/tkstats.py:666 +#: pysollib/tile/tkstats.py:671 pysollib/tk/tkstats.py:662 msgid "N" msgstr "" -#: pysollib/tile/tkstats.py:682 pysollib/tk/tkstats.py:675 +#: pysollib/tile/tkstats.py:684 pysollib/tk/tkstats.py:671 msgid "Result" msgstr "" -#: pysollib/tile/tkstats.py:744 pysollib/tk/tkstats.py:784 +#: pysollib/tile/tkstats.py:746 pysollib/tk/tkstats.py:780 msgid "No TOP for this game" msgstr "" -#: pysollib/tile/tkstats.py:752 +#: pysollib/tile/tkstats.py:754 msgid "No TOP for all games" msgstr "" -#: pysollib/tile/tkstats.py:763 pysollib/tk/tkstats.py:731 +#: pysollib/tile/tkstats.py:765 pysollib/tk/tkstats.py:727 #: data/glade-translations:21 msgid "Minimum" msgstr "" -#: pysollib/tile/tkstats.py:765 pysollib/tk/tkstats.py:732 +#: pysollib/tile/tkstats.py:767 pysollib/tk/tkstats.py:728 #: data/glade-translations:22 msgid "Maximum" msgstr "" -#: pysollib/tile/tkstats.py:767 pysollib/tk/tkstats.py:733 +#: pysollib/tile/tkstats.py:769 pysollib/tk/tkstats.py:729 #: data/glade-translations:23 msgid "Average" msgstr "" -#: pysollib/tile/tkstats.py:789 pysollib/tk/tkstats.py:753 +#: pysollib/tile/tkstats.py:791 pysollib/tk/tkstats.py:749 #: data/glade-translations:20 msgid "Total moves:" msgstr "" -#: pysollib/tile/tkstats.py:886 pysollib/tk/tkstats.py:915 +#: pysollib/tile/tkstats.py:888 pysollib/tk/tkstats.py:911 msgid "Statistics for" msgstr "" -#: pysollib/tile/tkstats.py:891 pysollib/tk/tkstats.py:922 +#: pysollib/tile/tkstats.py:893 pysollib/tk/tkstats.py:918 msgid "Last 7 days" msgstr "" -#: pysollib/tile/tkstats.py:892 pysollib/tk/tkstats.py:923 +#: pysollib/tile/tkstats.py:894 pysollib/tk/tkstats.py:919 msgid "Last month" msgstr "" -#: pysollib/tile/tkstats.py:893 pysollib/tk/tkstats.py:924 +#: pysollib/tile/tkstats.py:895 pysollib/tk/tkstats.py:920 msgid "Last year" msgstr "" -#: pysollib/tile/tkstats.py:894 pysollib/tk/tkstats.py:925 +#: pysollib/tile/tkstats.py:896 pysollib/tk/tkstats.py:921 msgid "All time" msgstr "" -#: pysollib/tile/tkstats.py:900 pysollib/tk/tkstats.py:933 +#: pysollib/tile/tkstats.py:902 pysollib/tk/tkstats.py:929 msgid "Show graphs" msgstr "" -#: pysollib/tile/tkstats.py:948 pysollib/tile/tkstats.py:964 -#: pysollib/tile/tkstats.py:1003 pysollib/tk/tkstats.py:856 -#: pysollib/tk/tkstats.py:872 pysollib/tk/tkstats.py:984 +#: pysollib/tile/tkstats.py:950 pysollib/tile/tkstats.py:966 +#: pysollib/tile/tkstats.py:1005 pysollib/tk/tkstats.py:852 +#: pysollib/tk/tkstats.py:868 pysollib/tk/tkstats.py:980 msgid "Games/day" msgstr "" -#: pysollib/tile/tkstats.py:949 pysollib/tile/tkstats.py:1005 -#: pysollib/tk/tkstats.py:857 pysollib/tk/tkstats.py:986 +#: pysollib/tile/tkstats.py:951 pysollib/tile/tkstats.py:1007 +#: pysollib/tk/tkstats.py:853 pysollib/tk/tkstats.py:982 msgid "Games/week" msgstr "" @@ -3606,27 +3608,27 @@ msgstr "" msgid "Toolbar" msgstr "" -#: pysollib/tk/menubar.py:415 +#: pysollib/tk/menubar.py:412 msgid "&Statistics" msgstr "" -#: pysollib/tk/menubar.py:416 pysollib/tk/menubar.py:425 +#: pysollib/tk/menubar.py:413 pysollib/tk/menubar.py:422 msgid "Current game..." msgstr "" -#: pysollib/tk/menubar.py:417 pysollib/tk/menubar.py:426 +#: pysollib/tk/menubar.py:414 pysollib/tk/menubar.py:423 msgid "All games..." msgstr "" -#: pysollib/tk/menubar.py:419 +#: pysollib/tk/menubar.py:416 msgid "Session log..." msgstr "" -#: pysollib/tk/menubar.py:420 +#: pysollib/tk/menubar.py:417 msgid "Full log..." msgstr "" -#: pysollib/tk/menubar.py:423 +#: pysollib/tk/menubar.py:420 msgid "Progression..." msgstr "" @@ -3646,43 +3648,43 @@ msgstr "" msgid "&All games..." msgstr "" -#: pysollib/tk/tkstats.py:517 +#: pysollib/tk/tkstats.py:513 msgid "&Reset all..." msgstr "" -#: pysollib/tk/tkstats.py:582 +#: pysollib/tk/tkstats.py:578 msgid "Session &log..." msgstr "" -#: pysollib/tk/tkstats.py:597 +#: pysollib/tk/tkstats.py:593 msgid "&Full log..." msgstr "" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Club" msgstr "" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Diamond" msgstr "" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Heart" msgstr "" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Spade" msgstr "" -#: pysollib/util.py:83 +#: pysollib/util.py:82 msgid "black" msgstr "" -#: pysollib/util.py:83 +#: pysollib/util.py:82 msgid "red" msgstr "" -#: pysollib/util.py:108 +#: pysollib/util.py:107 msgid "cardset" msgstr "" @@ -3747,7 +3749,7 @@ msgid "Layout:" msgstr "" #: pysollib/wizardutil.py:108 pysollib/wizardutil.py:115 -#: pysollib/wizardutil.py:345 +#: pysollib/wizardutil.py:337 msgid "Initial dealing" msgstr "" @@ -3796,172 +3798,172 @@ msgid "Shuffle during redeal:" msgstr "" #: pysollib/wizardutil.py:145 pysollib/wizardutil.py:152 -#: pysollib/wizardutil.py:199 +#: pysollib/wizardutil.py:192 msgid "Same suit" msgstr "" -#: pysollib/wizardutil.py:146 pysollib/wizardutil.py:200 -#: pysollib/wizardutil.py:217 +#: pysollib/wizardutil.py:146 pysollib/wizardutil.py:193 +#: pysollib/wizardutil.py:210 msgid "Alternate color" msgstr "" -#: pysollib/wizardutil.py:147 pysollib/wizardutil.py:201 +#: pysollib/wizardutil.py:147 pysollib/wizardutil.py:194 msgid "Same color" msgstr "" -#: pysollib/wizardutil.py:148 pysollib/wizardutil.py:202 +#: pysollib/wizardutil.py:148 pysollib/wizardutil.py:195 msgid "Rank" msgstr "" -#: pysollib/wizardutil.py:149 pysollib/wizardutil.py:210 +#: pysollib/wizardutil.py:149 pysollib/wizardutil.py:203 msgid "Spider same suit" msgstr "" -#: pysollib/wizardutil.py:150 pysollib/wizardutil.py:211 +#: pysollib/wizardutil.py:150 pysollib/wizardutil.py:204 msgid "Spider alternate color" msgstr "" -#: pysollib/wizardutil.py:159 pysollib/wizardutil.py:224 -#: pysollib/wizardutil.py:227 +#: pysollib/wizardutil.py:159 pysollib/wizardutil.py:217 +#: pysollib/wizardutil.py:220 msgid "Any" msgstr "" -#: pysollib/wizardutil.py:162 pysollib/wizardutil.py:228 +#: pysollib/wizardutil.py:162 pysollib/wizardutil.py:221 msgid "Base card:" msgstr "" #: pysollib/wizardutil.py:166 pysollib/wizardutil.py:167 -#: pysollib/wizardutil.py:232 +#: pysollib/wizardutil.py:225 msgid "Up" msgstr "" -#: pysollib/wizardutil.py:166 pysollib/wizardutil.py:232 -#: pysollib/wizardutil.py:233 +#: pysollib/wizardutil.py:166 pysollib/wizardutil.py:225 +#: pysollib/wizardutil.py:226 msgid "Down" msgstr "" -#: pysollib/wizardutil.py:168 pysollib/wizardutil.py:234 +#: pysollib/wizardutil.py:168 pysollib/wizardutil.py:227 msgid "Direction:" msgstr "" -#: pysollib/wizardutil.py:174 pysollib/wizardutil.py:246 -msgid "Wrapping:" -msgstr "" - -#: pysollib/wizardutil.py:179 pysollib/wizardutil.py:180 -#: pysollib/wizardutil.py:238 +#: pysollib/wizardutil.py:172 pysollib/wizardutil.py:173 +#: pysollib/wizardutil.py:231 msgid "Top card" msgstr "" -#: pysollib/wizardutil.py:179 pysollib/wizardutil.py:225 +#: pysollib/wizardutil.py:172 pysollib/wizardutil.py:218 msgid "None" msgstr "" -#: pysollib/wizardutil.py:181 pysollib/wizardutil.py:240 +#: pysollib/wizardutil.py:174 pysollib/wizardutil.py:233 msgid "Move:" msgstr "" -#: pysollib/wizardutil.py:187 +#: pysollib/wizardutil.py:180 msgid "First card sets base cards:" msgstr "" -#: pysollib/wizardutil.py:195 +#: pysollib/wizardutil.py:188 msgid "Number of tableau piles:" msgstr "" -#: pysollib/wizardutil.py:203 +#: pysollib/wizardutil.py:196 msgid "Any suit but the same" msgstr "" -#: pysollib/wizardutil.py:205 +#: pysollib/wizardutil.py:198 msgid "Up or down by same suit" msgstr "" -#: pysollib/wizardutil.py:206 +#: pysollib/wizardutil.py:199 msgid "Up or down by alternate color" msgstr "" -#: pysollib/wizardutil.py:207 +#: pysollib/wizardutil.py:200 msgid "Up or down by rank" msgstr "" -#: pysollib/wizardutil.py:208 +#: pysollib/wizardutil.py:201 msgid "Up or down by same color" msgstr "" -#: pysollib/wizardutil.py:213 +#: pysollib/wizardutil.py:206 msgid "Yukon same suit" msgstr "" -#: pysollib/wizardutil.py:214 +#: pysollib/wizardutil.py:207 msgid "Yukon alternate color" msgstr "" -#: pysollib/wizardutil.py:215 +#: pysollib/wizardutil.py:208 msgid "Yukon rank" msgstr "" -#: pysollib/wizardutil.py:238 pysollib/wizardutil.py:239 +#: pysollib/wizardutil.py:231 pysollib/wizardutil.py:232 msgid "Sequence" msgstr "" -#: pysollib/wizardutil.py:253 +#: pysollib/wizardutil.py:239 +msgid "Wrapping:" +msgstr "" + +#: pysollib/wizardutil.py:246 msgid "Use \"Super Move\" feature:" msgstr "" -#: pysollib/wizardutil.py:261 +#: pysollib/wizardutil.py:254 msgid "Number of reserves:" msgstr "" -#: pysollib/wizardutil.py:268 +#: pysollib/wizardutil.py:261 msgid "Max # of accepted cards:" msgstr "" -#: pysollib/wizardutil.py:272 +#: pysollib/wizardutil.py:265 msgid "Triangle" msgstr "" -#: pysollib/wizardutil.py:273 pysollib/wizardutil.py:275 +#: pysollib/wizardutil.py:266 pysollib/wizardutil.py:268 msgid "Rectangle" msgstr "" -#: pysollib/wizardutil.py:283 +#: pysollib/wizardutil.py:276 msgid "# of face-down cards dealt to the tableau pile:" msgstr "" -#: pysollib/wizardutil.py:290 +#: pysollib/wizardutil.py:283 msgid "# of face-up cards dealt to the tableau pile:" msgstr "" -#: pysollib/wizardutil.py:297 +#: pysollib/wizardutil.py:290 msgid "# of cards dealt to the reserve:" msgstr "" -#: pysollib/wizardutil.py:304 +#: pysollib/wizardutil.py:297 msgid "Max # of dealt cards:" msgstr "" -#: pysollib/wizardutil.py:310 +#: pysollib/wizardutil.py:303 msgid "Deal first cards to the foundations:" msgstr "" -#: pysollib/wizardutil.py:316 +#: pysollib/wizardutil.py:309 msgid "General" msgstr "" -#: pysollib/wizardutil.py:322 +#: pysollib/wizardutil.py:315 msgid "Talon" msgstr "" -#: pysollib/wizardutil.py:327 +#: pysollib/wizardutil.py:320 msgid "Foundations" msgstr "" -#: pysollib/wizardutil.py:334 +#: pysollib/wizardutil.py:326 msgid "Tableau" msgstr "" -#: pysollib/wizardutil.py:342 +#: pysollib/wizardutil.py:334 msgid "Reserves" msgstr "" diff --git a/po/ru_games.po b/po/ru_games.po index edae415e..bcd8ff84 100644 --- a/po/ru_games.po +++ b/po/ru_games.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PySol 0.0.1\n" -"POT-Creation-Date: Sat May 19 16:39:10 2007\n" +"POT-Creation-Date: Tue Jun 5 04:28:06 2007\n" "PO-Revision-Date: 2007-05-11 17:25+0400\n" "Last-Translator: Скоморох \n" "Language-Team: Russian \n" diff --git a/po/ru_pysol.po b/po/ru_pysol.po index 5ae4b34f..3fe81e6c 100644 --- a/po/ru_pysol.po +++ b/po/ru_pysol.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: Sat May 19 16:40:21 2007\n" -"PO-Revision-Date: 2007-05-19 16:50+0400\n" +"POT-Creation-Date: Tue Jun 5 04:29:13 2007\n" +"PO-Revision-Date: 2007-06-05 04:31+0400\n" "Last-Translator: Skomoroh \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -16,34 +16,34 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: pysollib/actions.py:267 pysollib/tile/toolbar.py:186 +#: pysollib/actions.py:268 pysollib/tile/toolbar.py:186 #: pysollib/tk/toolbar.py:189 msgid "New game" msgstr "Новая игра" -#: pysollib/actions.py:280 pysollib/tile/menubar.py:850 -#: pysollib/tile/menubar.py:864 pysollib/tk/menubar.py:854 -#: pysollib/tk/menubar.py:868 +#: pysollib/actions.py:281 pysollib/tile/menubar.py:848 +#: pysollib/tile/menubar.py:862 pysollib/tk/menubar.py:851 +#: pysollib/tk/menubar.py:865 msgid "Select game" msgstr "Выбрать игру" -#: pysollib/actions.py:294 +#: pysollib/actions.py:295 msgid "Invalid game number" msgstr "Неправильный номер игры" -#: pysollib/actions.py:295 +#: pysollib/actions.py:296 msgid "Invalid game number\n" msgstr "Неправильный номер игры\n" -#: pysollib/actions.py:312 +#: pysollib/actions.py:313 msgid "Select next game number" msgstr "Выберите номер следующей игры" -#: pysollib/actions.py:321 pysollib/actions.py:331 +#: pysollib/actions.py:322 pysollib/actions.py:332 msgid "Select new game number" msgstr "Выберите номер новой игры" -#: pysollib/actions.py:322 +#: pysollib/actions.py:323 msgid "" "\n" "\n" @@ -53,22 +53,22 @@ msgstr "" "\n" "Введите номер новой игры" -#: pysollib/actions.py:323 +#: pysollib/actions.py:324 msgid "&Next number" msgstr "&Следующий номер" -#: pysollib/actions.py:323 pysollib/app.py:906 pysollib/app.py:1193 -#: pysollib/app.py:1205 pysollib/game.py:1031 pysollib/game.py:2299 +#: pysollib/actions.py:324 pysollib/app.py:1151 pysollib/app.py:1438 +#: pysollib/app.py:1450 pysollib/game.py:1019 pysollib/game.py:2289 #: pysollib/tile/colorsdialog.py:112 pysollib/tile/edittextdialog.py:83 #: pysollib/tile/fontsdialog.py:144 pysollib/tile/fontsdialog.py:204 -#: pysollib/tile/gameinfodialog.py:155 pysollib/tile/menubar.py:1351 +#: pysollib/tile/gameinfodialog.py:155 pysollib/tile/menubar.py:1349 #: pysollib/tile/playeroptionsdialog.py:111 pysollib/tile/selectcardset.py:387 #: pysollib/tile/selecttile.py:161 pysollib/tile/soundoptionsdialog.py:168 #: pysollib/tile/soundoptionsdialog.py:206 pysollib/tile/timeoutsdialog.py:94 #: pysollib/tile/tkhtml.py:504 pysollib/tile/tkstats.py:123 -#: pysollib/tile/tkstats.py:544 pysollib/tile/tkstats.py:643 -#: pysollib/tile/tkstats.py:725 pysollib/tile/tkwidget.py:154 -#: pysollib/tile/tkwidget.py:329 pysollib/tile/wizarddialog.py:144 +#: pysollib/tile/tkstats.py:546 pysollib/tile/tkstats.py:645 +#: pysollib/tile/tkstats.py:727 pysollib/tile/tkwidget.py:154 +#: pysollib/tile/tkwidget.py:329 pysollib/tile/wizarddialog.py:146 #: pysollib/tk/colorsdialog.py:111 pysollib/tk/edittextdialog.py:82 #: pysollib/tk/fontsdialog.py:143 pysollib/tk/fontsdialog.py:205 #: pysollib/tk/gameinfodialog.py:155 pysollib/tk/playeroptionsdialog.py:85 @@ -76,66 +76,66 @@ msgstr "&Следующий номер" #: pysollib/tk/selectcardset.py:397 pysollib/tk/selecttile.py:159 #: pysollib/tk/soundoptionsdialog.py:170 pysollib/tk/soundoptionsdialog.py:211 #: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkhtml.py:500 -#: pysollib/tk/tkstats.py:289 pysollib/tk/tkstats.py:515 -#: pysollib/tk/tkstats.py:582 pysollib/tk/tkstats.py:597 -#: pysollib/tk/tkstats.py:639 pysollib/tk/tkstats.py:711 -#: pysollib/tk/tkstats.py:795 pysollib/tk/tkstats.py:969 +#: pysollib/tk/tkstats.py:289 pysollib/tk/tkstats.py:511 +#: pysollib/tk/tkstats.py:578 pysollib/tk/tkstats.py:593 +#: pysollib/tk/tkstats.py:635 pysollib/tk/tkstats.py:707 +#: pysollib/tk/tkstats.py:791 pysollib/tk/tkstats.py:965 #: pysollib/tk/tkwidget.py:160 pysollib/tk/tkwidget.py:324 #: pysollib/tk/wizarddialog.py:137 msgid "&OK" msgstr "&ОК" -#: pysollib/actions.py:323 pysollib/app.py:907 pysollib/app.py:1205 -#: pysollib/game.py:1031 pysollib/game.py:1700 pysollib/game.py:1716 -#: pysollib/game.py:1723 pysollib/game.py:1729 +#: pysollib/actions.py:324 pysollib/app.py:1152 pysollib/app.py:1450 +#: pysollib/game.py:1019 pysollib/game.py:1690 pysollib/game.py:1706 +#: pysollib/game.py:1713 pysollib/game.py:1719 #: pysollib/tile/colorsdialog.py:112 pysollib/tile/edittextdialog.py:83 #: pysollib/tile/fontsdialog.py:144 pysollib/tile/fontsdialog.py:204 #: pysollib/tile/playeroptionsdialog.py:111 pysollib/tile/selectcardset.py:237 -#: pysollib/tile/selectgame.py:266 pysollib/tile/selectgame.py:397 +#: pysollib/tile/selectgame.py:302 pysollib/tile/selectgame.py:433 #: pysollib/tile/selecttile.py:161 pysollib/tile/soundoptionsdialog.py:168 #: pysollib/tile/timeoutsdialog.py:94 pysollib/tile/tkwidget.py:329 -#: pysollib/tile/wizarddialog.py:144 pysollib/tk/colorsdialog.py:111 +#: pysollib/tile/wizarddialog.py:146 pysollib/tk/colorsdialog.py:111 #: pysollib/tk/edittextdialog.py:82 pysollib/tk/fontsdialog.py:143 -#: pysollib/tk/fontsdialog.py:205 pysollib/tk/menubar.py:1158 -#: pysollib/tk/menubar.py:1160 pysollib/tk/playeroptionsdialog.py:85 +#: pysollib/tk/fontsdialog.py:205 pysollib/tk/menubar.py:1155 +#: pysollib/tk/menubar.py:1157 pysollib/tk/playeroptionsdialog.py:85 #: pysollib/tk/playeroptionsdialog.py:160 pysollib/tk/selectcardset.py:241 -#: pysollib/tk/selectgame.py:265 pysollib/tk/selectgame.py:406 +#: pysollib/tk/selectgame.py:303 pysollib/tk/selectgame.py:444 #: pysollib/tk/selecttile.py:159 pysollib/tk/soundoptionsdialog.py:170 #: pysollib/tk/timeoutsdialog.py:92 pysollib/tk/tkwidget.py:324 #: pysollib/tk/wizarddialog.py:137 msgid "&Cancel" msgstr "От&мена" -#: pysollib/actions.py:339 +#: pysollib/actions.py:340 msgid "Select random game" msgstr "Выбор случайной игры" -#: pysollib/actions.py:375 +#: pysollib/actions.py:376 msgid "Select next game" msgstr "Выбрать следующую игру" -#: pysollib/actions.py:408 pysollib/tile/toolbar.py:201 +#: pysollib/actions.py:409 pysollib/tile/toolbar.py:201 #: pysollib/tk/toolbar.py:204 msgid "Quit " msgstr "Выйти из " -#: pysollib/actions.py:459 +#: pysollib/actions.py:460 msgid "Clear bookmarks" msgstr "Удалить закладки" -#: pysollib/actions.py:460 +#: pysollib/actions.py:461 msgid "Clear all bookmarks ?" msgstr "Удалить все закладки?" -#: pysollib/actions.py:470 +#: pysollib/actions.py:471 msgid "Restart game" msgstr "Начать игру с начала" -#: pysollib/actions.py:471 +#: pysollib/actions.py:472 msgid "Restart this game ?" msgstr "Начать игру с начала?" -#: pysollib/actions.py:522 +#: pysollib/actions.py:523 msgid "" "Comments for %s:\n" "\n" @@ -143,19 +143,19 @@ msgstr "" "Комментарий для %s:\n" "\n" -#: pysollib/actions.py:524 +#: pysollib/actions.py:525 msgid "Comments for " msgstr "Комментарий для " -#: pysollib/actions.py:542 pysollib/actions.py:570 +#: pysollib/actions.py:543 pysollib/actions.py:571 msgid "Error while writing to file" msgstr "Ошибка при записи в файл" -#: pysollib/actions.py:545 pysollib/actions.py:573 +#: pysollib/actions.py:546 pysollib/actions.py:574 msgid " Info" msgstr " Информация" -#: pysollib/actions.py:546 +#: pysollib/actions.py:547 msgid "" "Comments were appended to\n" "\n" @@ -163,15 +163,15 @@ msgstr "" "Комментарий добавлен в файл\n" "\n" -#: pysollib/actions.py:557 +#: pysollib/actions.py:558 msgid "Demo statistics" msgstr "Статистика демо" -#: pysollib/actions.py:560 +#: pysollib/actions.py:561 msgid "Your statistics" msgstr "Ваша статистика" -#: pysollib/actions.py:574 +#: pysollib/actions.py:575 msgid "" " were appended to\n" "\n" @@ -179,51 +179,51 @@ msgstr "" " добавлена в файл\n" "\n" -#: pysollib/actions.py:589 +#: pysollib/actions.py:590 msgid " Demo" msgstr " Демо" -#: pysollib/actions.py:589 +#: pysollib/actions.py:590 msgid " Demo " msgstr " Демо " -#: pysollib/actions.py:592 pysollib/actions.py:612 +#: pysollib/actions.py:593 pysollib/actions.py:613 msgid " for " msgstr " для " -#: pysollib/actions.py:598 pysollib/stats.py:205 +#: pysollib/actions.py:599 pysollib/stats.py:209 msgid "Statistics for " msgstr "Статистика игры " -#: pysollib/actions.py:602 pysollib/tile/selectgame.py:344 +#: pysollib/actions.py:603 pysollib/tile/selectgame.py:380 #: pysollib/tile/tkstats.py:74 pysollib/tile/toolbar.py:198 -#: pysollib/tk/selectgame.py:349 pysollib/tk/toolbar.py:201 +#: pysollib/tk/selectgame.py:387 pysollib/tk/toolbar.py:201 msgid "Statistics" msgstr "Статистика" -#: pysollib/actions.py:606 pysollib/tile/tkstats.py:526 +#: pysollib/actions.py:607 pysollib/tile/tkstats.py:528 #: data/glade-translations:31 msgid "Full log" msgstr "Полный лог" -#: pysollib/actions.py:609 pysollib/tile/tkstats.py:530 +#: pysollib/actions.py:610 pysollib/tile/tkstats.py:532 #: data/glade-translations:32 msgid "Session log" msgstr "Лог сессии" -#: pysollib/actions.py:615 +#: pysollib/actions.py:616 msgid "Game Info" msgstr "Информация об игре" -#: pysollib/actions.py:618 +#: pysollib/actions.py:619 msgid "Statistics progression" msgstr "Прогресс статистики" -#: pysollib/actions.py:634 +#: pysollib/actions.py:635 msgid "Reset all statistics" msgstr "Очистить всю статистику" -#: pysollib/actions.py:635 +#: pysollib/actions.py:636 msgid "" "Reset ALL statistics and logs for player\n" "%s ?" @@ -231,11 +231,11 @@ msgstr "" "Очистить всю статистику и лог для игрока\n" "%s?" -#: pysollib/actions.py:641 +#: pysollib/actions.py:642 msgid "Reset game statistics" msgstr "Очистить статистику игры" -#: pysollib/actions.py:642 +#: pysollib/actions.py:643 msgid "" "Reset statistics and logs for player\n" "%s\n" @@ -247,57 +247,57 @@ msgstr "" "и игры\n" "%s?" -#: pysollib/actions.py:698 +#: pysollib/actions.py:699 msgid "Play demo" msgstr "Показать демо" -#: pysollib/actions.py:709 +#: pysollib/actions.py:710 msgid "Set player options" msgstr "Установить настройки игрока" -#: pysollib/actions.py:723 data/glade-translations:40 +#: pysollib/actions.py:724 data/glade-translations:40 msgid "Set colors" msgstr "Настроить цвета" -#: pysollib/actions.py:740 +#: pysollib/actions.py:741 msgid "Set fonts" msgstr "Настроить шрифт" -#: pysollib/actions.py:749 data/glade-translations:33 +#: pysollib/actions.py:750 data/glade-translations:33 msgid "Set timeouts" msgstr "Настроить таймауты" -#: pysollib/app.py:89 +#: pysollib/app.py:159 msgid "Unknown" msgstr "Неизвестный" -#: pysollib/app.py:667 +#: pysollib/app.py:910 msgid "can't find game: " msgstr "" -#: pysollib/app.py:908 pysollib/game.py:1700 pysollib/game.py:1716 -#: pysollib/game.py:1723 pysollib/game.py:1729 pysollib/tile/menubar.py:356 -#: pysollib/tk/menubar.py:353 +#: pysollib/app.py:1153 pysollib/game.py:1690 pysollib/game.py:1706 +#: pysollib/game.py:1713 pysollib/game.py:1719 pysollib/tile/menubar.py:353 +#: pysollib/tk/menubar.py:349 msgid "&New game" msgstr "&Новая игра" -#: pysollib/app.py:1051 +#: pysollib/app.py:1296 msgid "Loading %s %s..." msgstr "Загружается %s %s..." -#: pysollib/app.py:1090 +#: pysollib/app.py:1335 msgid " load error" msgstr " ошибка при загрузке" -#: pysollib/app.py:1091 +#: pysollib/app.py:1336 msgid "Error while loading " msgstr "Ошибка при загрузке" -#: pysollib/app.py:1185 +#: pysollib/app.py:1430 msgid "Incompatible " msgstr "Несовместимый " -#: pysollib/app.py:1187 +#: pysollib/app.py:1432 msgid "" "The currently selected %s %s\n" "is not compatible with the game\n" @@ -311,23 +311,23 @@ msgstr "" "\n" "Необходимо выбрать %s типа %s.\n" -#: pysollib/app.py:1203 +#: pysollib/app.py:1448 msgid "Please select a %s type %s" msgstr "Выберите %s типа %s" -#: pysollib/app.py:1430 +#: pysollib/app.py:1678 msgid "error loading plugin %s: %s" msgstr "" -#: pysollib/game.py:950 pysollib/game.py:956 +#: pysollib/game.py:938 pysollib/game.py:944 msgid "Player\n" msgstr "Игрок\n" -#: pysollib/game.py:1027 +#: pysollib/game.py:1015 msgid "Discard current game ?" msgstr "Завершить текущую игру?" -#: pysollib/game.py:1653 +#: pysollib/game.py:1643 msgid "" "\n" "You have reached\n" @@ -337,7 +337,7 @@ msgstr "" "Вы достигли\n" "#%d в %s игрового времени" -#: pysollib/game.py:1658 +#: pysollib/game.py:1648 msgid "" "\n" "and #%d in the %s of moves" @@ -345,7 +345,7 @@ msgstr "" "\n" "и #%d в %s количества ходов" -#: pysollib/game.py:1661 +#: pysollib/game.py:1651 msgid "" "\n" "You have reached\n" @@ -355,13 +355,13 @@ msgstr "" "Вы достигли\n" "#%d в %s количества ходов" -#: pysollib/game.py:1691 pysollib/game.py:1708 +#: pysollib/game.py:1681 pysollib/game.py:1698 #: pysollib/tile/soundoptionsdialog.py:102 #: pysollib/tk/soundoptionsdialog.py:100 msgid "Game won" msgstr "Игра выиграна" -#: pysollib/game.py:1692 +#: pysollib/game.py:1682 msgid "" "\n" "Congratulations, this\n" @@ -380,7 +380,7 @@ msgstr "" "Количество ходов: %s\n" "%s\n" -#: pysollib/game.py:1709 +#: pysollib/game.py:1699 msgid "" "\n" "Congratulations, you did it !\n" @@ -397,13 +397,13 @@ msgstr "" "Количество ходов: %s\n" "%s\n" -#: pysollib/game.py:1721 pysollib/game.py:1727 +#: pysollib/game.py:1711 pysollib/game.py:1717 #: pysollib/tile/soundoptionsdialog.py:100 #: pysollib/tk/soundoptionsdialog.py:98 msgid "Game finished" msgstr "Игра закончена" -#: pysollib/game.py:1722 pysollib/game.py:2300 +#: pysollib/game.py:1712 pysollib/game.py:2290 msgid "" "\n" "Game finished\n" @@ -411,7 +411,7 @@ msgstr "" "\n" "Игра закончена\n" -#: pysollib/game.py:1728 +#: pysollib/game.py:1718 msgid "" "\n" "Game finished, but not without my help...\n" @@ -419,35 +419,35 @@ msgstr "" "\n" "Игра закончена, но не без моей помощи...\n" -#: pysollib/game.py:1729 +#: pysollib/game.py:1719 msgid "&Restart" msgstr "&Начало" -#: pysollib/game.py:2189 +#: pysollib/game.py:2179 msgid "Score %6d" msgstr "Счёт %6d" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Cool" msgstr "&Отлично" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Great" msgstr "&Здорово" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Wow" msgstr "&Ура" -#: pysollib/game.py:2291 +#: pysollib/game.py:2281 msgid "&Yeah" msgstr "&Ага" -#: pysollib/game.py:2292 pysollib/game.py:2303 pysollib/game.py:2315 +#: pysollib/game.py:2282 pysollib/game.py:2293 pysollib/game.py:2305 msgid " Autopilot" msgstr " Автопилот" -#: pysollib/game.py:2293 +#: pysollib/game.py:2283 msgid "" "\n" "Game solved in %d moves.\n" @@ -455,19 +455,19 @@ msgstr "" "\n" "Игра решена за %d ходов\n" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&Hmm" msgstr "&Хмм" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&Oh well" msgstr "&Ох" -#: pysollib/game.py:2314 +#: pysollib/game.py:2304 msgid "&That's life" msgstr "&Такова жизнь" -#: pysollib/game.py:2316 +#: pysollib/game.py:2306 msgid "" "\n" "This won't come out...\n" @@ -475,31 +475,31 @@ msgstr "" "\n" "Не удалось...\n" -#: pysollib/game.py:2756 +#: pysollib/game.py:2746 msgid "Set bookmark" msgstr "Установить закладку" -#: pysollib/game.py:2757 +#: pysollib/game.py:2747 msgid "Replace existing bookmark %d ?" msgstr "Заменить существующую закладку %d ?" -#: pysollib/game.py:2779 +#: pysollib/game.py:2769 msgid "Goto bookmark" msgstr "Перейти к закладке" -#: pysollib/game.py:2780 +#: pysollib/game.py:2770 msgid "Goto bookmark %d ?" msgstr "Перейти к закладке %d ?" -#: pysollib/game.py:2811 +#: pysollib/game.py:2801 msgid "Open game" msgstr "Открыть игру" -#: pysollib/game.py:2822 pysollib/game.py:2832 pysollib/game.py:2837 +#: pysollib/game.py:2812 pysollib/game.py:2822 pysollib/game.py:2827 msgid "Load game error" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2823 +#: pysollib/game.py:2813 msgid "" "Error while loading game.\n" "\n" @@ -511,11 +511,11 @@ msgstr "" "Возможно повреждён файл,\n" "или ошибка в программе." -#: pysollib/game.py:2833 +#: pysollib/game.py:2823 msgid "Error while loading game" msgstr "Ошибка при загрузке игры" -#: pysollib/game.py:2838 +#: pysollib/game.py:2828 msgid "" "Internal error while loading game.\n" "\n" @@ -525,26 +525,26 @@ msgstr "" "\n" "Пожалуйста сообщите об этой ошибке." -#: pysollib/game.py:2867 pysollib/tile/menubar.py:1393 -#: pysollib/tk/menubar.py:1378 +#: pysollib/game.py:2857 pysollib/tile/menubar.py:1391 +#: pysollib/tk/menubar.py:1375 msgid "Save game error" msgstr "Ошибка при сохранении игры" -#: pysollib/game.py:2868 +#: pysollib/game.py:2858 msgid "Error while saving game" msgstr "Ошибка при сохранении игры" -#: pysollib/game.py:2893 +#: pysollib/game.py:2883 msgid "Invalid or damaged %s save file" msgstr "" -#: pysollib/game.py:2907 +#: pysollib/game.py:2897 msgid "" "Cannot load games saved with\n" "%s version %s" msgstr "" -#: pysollib/game.py:2924 +#: pysollib/game.py:2914 msgid "" "Cannot load this game from version %s\n" "as the game rules have changed\n" @@ -760,9 +760,9 @@ msgid "Puzzle type" msgstr "Пазлы" #: pysollib/games/auldlangsyne.py:160 pysollib/games/calculation.py:104 -#: pysollib/games/camelot.py:590 pysollib/games/numerica.py:94 -#: pysollib/games/numerica.py:276 pysollib/games/numerica.py:666 -#: pysollib/games/numerica.py:781 +#: pysollib/games/camelot.py:590 pysollib/games/numerica.py:93 +#: pysollib/games/numerica.py:275 pysollib/games/numerica.py:665 +#: pysollib/games/numerica.py:780 msgid "Tableau. Build regardless of rank and suit." msgstr "Игровой стол. Складывать не считаясь с мастью и достоинством." @@ -797,14 +797,14 @@ msgstr "" "3: 6 9 Д 2 5 8 В Т 4 7 10 К\n" "4: 8 Д 3 7 В 2 6 10 Т 5 9 К" -#: pysollib/games/canfield.py:528 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1514 pysollib/util.py:87 pysollib/wizardutil.py:158 -#: pysollib/wizardutil.py:223 +#: pysollib/games/canfield.py:529 pysollib/games/special/tarock.py:224 +#: pysollib/stack.py:1498 pysollib/util.py:86 pysollib/wizardutil.py:158 +#: pysollib/wizardutil.py:216 msgid "King" msgstr "Король" -#: pysollib/games/canfield.py:531 pysollib/games/special/tarock.py:224 -#: pysollib/stack.py:1513 pysollib/util.py:87 +#: pysollib/games/canfield.py:532 pysollib/games/special/tarock.py:224 +#: pysollib/stack.py:1497 pysollib/util.py:86 msgid "Queen" msgstr "Королева" @@ -830,12 +830,12 @@ msgid "Waste. Build up or down regardless of suit." msgstr "Сброс. Складывать по возрастанию или убыванию не считаясь с мастью." #: pysollib/games/golf.py:117 pysollib/games/golf.py:305 -#: pysollib/stack.py:2269 +#: pysollib/stack.py:2253 msgid "Tableau. No building." msgstr "Игровой стол. Без выкладывания." #: pysollib/games/golf.py:390 pysollib/games/pileon.py:257 -#: pysollib/stack.py:2158 +#: pysollib/stack.py:2142 msgid "Foundation. Build up regardless of suit." msgstr "Базовая ячейка. Складывать по возрастанию не считаясь с мастью." @@ -855,15 +855,15 @@ msgstr "" msgid "Reserve. Only Kings are acceptable." msgstr "Резерв. Только для королей." -#: pysollib/games/larasgame.py:163 pysollib/stack.py:1726 +#: pysollib/games/larasgame.py:163 pysollib/stack.py:1710 msgid "Round %d" msgstr "Раунд %d" -#: pysollib/games/mahjongg/mahjongg.py:788 -msgid "Warning" -msgstr "Предупреждение:" - #: pysollib/games/mahjongg/mahjongg.py:789 +msgid "Warning" +msgstr "Предупреждение" + +#: pysollib/games/mahjongg/mahjongg.py:790 msgid "" "Sorry, I can't find\n" "a solvable configuration." @@ -871,7 +871,8 @@ msgstr "" "Извините, не удалось создать\n" "решаемую конфигурацию." -#: pysollib/games/mahjongg/mahjongg.py:860 +#: pysollib/games/mahjongg/mahjongg.py:863 +#: pysollib/games/mahjongg/shisensho.py:401 msgid "" "No Free\n" "Matching\n" @@ -881,7 +882,8 @@ msgstr "" "свободных\n" "пар" -#: pysollib/games/mahjongg/mahjongg.py:862 +#: pysollib/games/mahjongg/mahjongg.py:865 +#: pysollib/games/mahjongg/shisensho.py:403 msgid "" "%d Free\n" "Matching\n" @@ -903,7 +905,8 @@ msgstr[2] "" "свободных\n" "пар" -#: pysollib/games/mahjongg/mahjongg.py:866 +#: pysollib/games/mahjongg/mahjongg.py:869 +#: pysollib/games/mahjongg/shisensho.py:410 msgid "" "%d\n" "Tile\n" @@ -930,7 +933,8 @@ msgstr[2] "" "удалено\n" "\n" -#: pysollib/games/mahjongg/mahjongg.py:869 +#: pysollib/games/mahjongg/mahjongg.py:872 +#: pysollib/games/mahjongg/shisensho.py:413 msgid "" "%d\n" "Tile\n" @@ -965,8 +969,8 @@ msgstr "Раунд %d/%d" msgid "Deal %d" msgstr "Сдача %d" -#: pysollib/games/numerica.py:263 pysollib/games/royalcotillion.py:865 -#: pysollib/stack.py:2201 +#: pysollib/games/numerica.py:262 pysollib/games/royalcotillion.py:865 +#: pysollib/stack.py:2185 msgid "Foundation. Build up by color." msgstr "Базовая ячейка. Складывать по возрастанию в соответствии с цветом." @@ -1037,8 +1041,8 @@ msgstr "Жезлы" #: pysollib/games/special/tarock.py:223 #: pysollib/games/ultra/dashavatara.py:351 #: pysollib/games/ultra/hexadeck.py:273 pysollib/games/ultra/mughal.py:254 -#: pysollib/stack.py:1515 pysollib/util.py:86 pysollib/wizardutil.py:157 -#: pysollib/wizardutil.py:161 pysollib/wizardutil.py:222 +#: pysollib/stack.py:1499 pysollib/util.py:85 pysollib/wizardutil.py:157 +#: pysollib/wizardutil.py:161 pysollib/wizardutil.py:215 msgid "Ace" msgstr "Туз" @@ -1233,51 +1237,51 @@ msgstr "ЮВ" msgid "SW" msgstr "ЮЗ" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Cherry" msgstr "Вишня" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Pine" msgstr "Сосна" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Plum" msgstr "Слива" -#: pysollib/games/ultra/hanafuda_common.py:67 +#: pysollib/games/ultra/hanafuda_common.py:66 msgid "Wisteria" msgstr "Глициния" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Bush Clover" msgstr "Клевер" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Eularia" msgstr "" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Iris" msgstr "Ирис" -#: pysollib/games/ultra/hanafuda_common.py:68 +#: pysollib/games/ultra/hanafuda_common.py:67 msgid "Peony" msgstr "Пион" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Chrysanthemum" msgstr "Хризантема" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Maple" msgstr "Клён" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Paulownia" msgstr "Павловния" -#: pysollib/games/ultra/hanafuda_common.py:69 +#: pysollib/games/ultra/hanafuda_common.py:68 msgid "Willow" msgstr "Ива" @@ -1361,27 +1365,27 @@ msgstr "" "Игровой стол. Складывать по убыванию не считаясь с мастью, можно перемещать " "любую серию открытых карт." -#: pysollib/help.py:60 +#: pysollib/help.py:59 msgid "A Python Solitaire Game Collection\n" msgstr "Коллекция питоновских пасьянсов\n" -#: pysollib/help.py:62 +#: pysollib/help.py:61 msgid "A World Domination Project\n" msgstr "Всемирный непревзойдённый проект\n" -#: pysollib/help.py:63 +#: pysollib/help.py:62 msgid "&Credits..." msgstr "&Благодарности..." -#: pysollib/help.py:63 +#: pysollib/help.py:62 msgid "&Nice" msgstr "&Отлично" -#: pysollib/help.py:65 +#: pysollib/help.py:64 msgid "&Enjoy" msgstr "&Наслаждайтесь" -#: pysollib/help.py:67 +#: pysollib/help.py:66 msgid "" "Version %s\n" "\n" @@ -1389,11 +1393,11 @@ msgstr "" "Версия %s\n" "\n" -#: pysollib/help.py:68 +#: pysollib/help.py:67 msgid "About " msgstr "О программе " -#: pysollib/help.py:69 +#: pysollib/help.py:68 msgid "" "PySol Fan Club edition\n" "%s%s\n" @@ -1424,11 +1428,11 @@ msgstr "" "об этом приложении посетите сайт\n" "%s" -#: pysollib/help.py:98 +#: pysollib/help.py:97 msgid "Credits" msgstr "Благодарности" -#: pysollib/help.py:99 +#: pysollib/help.py:98 msgid "" " credits go to:\n" "\n" @@ -1443,15 +1447,15 @@ msgid "" "for making this program possible" msgstr "" -#: pysollib/help.py:134 +#: pysollib/help.py:133 msgid " HTML Problem" msgstr " проблема с HTML" -#: pysollib/help.py:135 +#: pysollib/help.py:134 msgid "Cannot find help document\n" msgstr "Не найден файл помощи\n" -#: pysollib/help.py:148 +#: pysollib/help.py:147 msgid " Help" msgstr " Помощь" @@ -1475,8 +1479,8 @@ msgstr "" "\n" "Пожалуйста проверьте установку %s.\n" -#: pysollib/main.py:73 pysollib/main.py:266 pysollib/tile/menubar.py:376 -#: pysollib/tk/menubar.py:373 +#: pysollib/main.py:73 pysollib/main.py:266 pysollib/tile/menubar.py:373 +#: pysollib/tk/menubar.py:369 msgid "&Quit" msgstr "В&ыход" @@ -1820,148 +1824,148 @@ msgstr "Швейцария" msgid "USA" msgstr "США" -#: pysollib/settings.py:73 data/glade-translations:29 +#: pysollib/settings.py:71 data/glade-translations:29 msgid "Top 10" msgstr "Top 10" -#: pysollib/stack.py:1509 +#: pysollib/stack.py:1493 msgid "Base card - %s." msgstr "Базовая карта - %s." -#: pysollib/stack.py:1510 +#: pysollib/stack.py:1494 msgid "Empty row cannot be filled." msgstr "Пустой ряд не заполняется." -#: pysollib/stack.py:1511 +#: pysollib/stack.py:1495 msgid "any card" msgstr "любая карта" -#: pysollib/stack.py:1512 pysollib/util.py:87 +#: pysollib/stack.py:1496 pysollib/util.py:86 msgid "Jack" msgstr "Валет" -#: pysollib/stack.py:1522 +#: pysollib/stack.py:1506 msgid "No cards" msgstr "Нет карт" -#: pysollib/stack.py:1523 +#: pysollib/stack.py:1507 msgid "%d card" msgid_plural "%d cards" msgstr[0] "%d карта" msgstr[1] "%d карты" msgstr[2] "%d карт" -#: pysollib/stack.py:1735 pysollib/stack.py:1737 pysollib/stack.py:1773 +#: pysollib/stack.py:1719 pysollib/stack.py:1721 pysollib/stack.py:1757 msgid "Redeal" msgstr "Сдать" -#: pysollib/stack.py:1737 +#: pysollib/stack.py:1721 msgid "Stop" msgstr "Стоп" -#: pysollib/stack.py:1799 +#: pysollib/stack.py:1783 msgid "Variable redeals." msgstr "Переменное количество пересдач." -#: pysollib/stack.py:1800 +#: pysollib/stack.py:1784 msgid "Unlimited redeals." msgstr "Неограниченное количество пересдач." -#: pysollib/stack.py:1803 +#: pysollib/stack.py:1787 msgid "%d readeal" msgid_plural "%d redeals" msgstr[0] "%d пересдача" msgstr[1] "%d пересдачи" msgstr[2] "%d пересдач" -#: pysollib/stack.py:1805 +#: pysollib/stack.py:1789 msgid "Talon." msgstr "Колода." -#: pysollib/stack.py:2071 pysollib/stack.py:2718 +#: pysollib/stack.py:2055 pysollib/stack.py:2702 msgid "Reserve. No building." msgstr "Резерв. Без выкладывания." -#: pysollib/stack.py:2109 +#: pysollib/stack.py:2093 msgid "Foundation." msgstr "Базовая ячейка" -#: pysollib/stack.py:2147 +#: pysollib/stack.py:2131 msgid "Foundation. Build up by suit." msgstr "Базовая ячейка. Складывать по возрастанию в соответствии с мастью." -#: pysollib/stack.py:2148 +#: pysollib/stack.py:2132 msgid "Foundation. Build down by suit." msgstr "Базовая ячейка. Складывать по убыванию в соответствии с мастью." -#: pysollib/stack.py:2149 pysollib/stack.py:2160 pysollib/stack.py:2182 -#: pysollib/stack.py:2203 +#: pysollib/stack.py:2133 pysollib/stack.py:2144 pysollib/stack.py:2166 +#: pysollib/stack.py:2187 msgid "Foundation. Build by same rank." msgstr "Базовая ячейка. Складывать в соответствии с достоинством." -#: pysollib/stack.py:2159 +#: pysollib/stack.py:2143 msgid "Foundation. Build down regardless of suit." msgstr "Базовая ячейка. Складывать не считаясь с мастью." -#: pysollib/stack.py:2180 +#: pysollib/stack.py:2164 msgid "Foundation. Build up by alternate color." msgstr "Базовая ячейка. Складывать по возрастанию чередуя цвет." -#: pysollib/stack.py:2181 +#: pysollib/stack.py:2165 msgid "Foundation. Build down by alternate color." msgstr "Базовая ячейка. Складывать по убыванию чередуя цвет." -#: pysollib/stack.py:2202 +#: pysollib/stack.py:2186 msgid "Foundation. Build down by color." msgstr "Базовая ячейка. Складывать по убыванию в соответствии с цветом." -#: pysollib/stack.py:2311 +#: pysollib/stack.py:2295 msgid "Tableau. Build up by alternate color." msgstr "Игровой стол. Складывать по возрастанию чередуя цвет." -#: pysollib/stack.py:2312 +#: pysollib/stack.py:2296 msgid "Tableau. Build down by alternate color." msgstr "Игровой стол. Складывать по убыванию чередуя цвет." -#: pysollib/stack.py:2313 pysollib/stack.py:2323 pysollib/stack.py:2332 -#: pysollib/stack.py:2341 pysollib/stack.py:2351 pysollib/stack.py:2380 -#: pysollib/stack.py:2390 +#: pysollib/stack.py:2297 pysollib/stack.py:2307 pysollib/stack.py:2316 +#: pysollib/stack.py:2325 pysollib/stack.py:2335 pysollib/stack.py:2364 +#: pysollib/stack.py:2374 msgid "Tableau. Build by same rank." msgstr "Игровой стол. Складывать в соответствии с достоинством." -#: pysollib/stack.py:2321 +#: pysollib/stack.py:2305 msgid "Tableau. Build up by color." msgstr "Игровой стол. Складывать по возрастанию в соответствии с цветом." -#: pysollib/stack.py:2322 +#: pysollib/stack.py:2306 msgid "Tableau. Build down by color." msgstr "Игровой стол. Складывать по убыванию в соответствии с цветом." -#: pysollib/stack.py:2330 +#: pysollib/stack.py:2314 msgid "Tableau. Build up by suit." msgstr "Игровой стол. Складывать по возрастанию в соответствии с мастью." -#: pysollib/stack.py:2331 +#: pysollib/stack.py:2315 msgid "Tableau. Build down by suit." msgstr "Игровой стол. Складывать по убыванию в соответствии с мастью." -#: pysollib/stack.py:2339 +#: pysollib/stack.py:2323 msgid "Tableau. Build up regardless of suit." msgstr "Игровой стол. Складывать по возрастанию не считаясь с мастью." -#: pysollib/stack.py:2340 +#: pysollib/stack.py:2324 msgid "Tableau. Build down regardless of suit." msgstr "Игровой стол. Складывать по убыванию не считаясь с мастью." -#: pysollib/stack.py:2349 +#: pysollib/stack.py:2333 msgid "Tableau. Build up in any suit but the same." msgstr "Игровой стол. Складывать по возрастанию в любую масть кроме такой же." -#: pysollib/stack.py:2350 +#: pysollib/stack.py:2334 msgid "Tableau. Build down in any suit but the same." msgstr "Игровой стол. Складывать по убыванию в любую масть кроме такой же." -#: pysollib/stack.py:2378 +#: pysollib/stack.py:2362 msgid "" "Tableau. Build up regardless of suit. Sequences of cards in alternate color " "can be moved as a unit." @@ -1969,7 +1973,7 @@ msgstr "" "Игровой стол. Складывать по возрастанию не считаясь с мастью. Можно " "перемещать серии карт чередующихся цветом." -#: pysollib/stack.py:2379 +#: pysollib/stack.py:2363 msgid "" "Tableau. Build down regardless of suit. Sequences of cards in alternate " "color can be moved as a unit." @@ -1977,7 +1981,7 @@ msgstr "" "Игровой стол. Складывать по убыванию не считаясь с мастью. Можно перемещать " "серии карт чередующихся цветом." -#: pysollib/stack.py:2388 +#: pysollib/stack.py:2372 msgid "" "Tableau. Build up regardless of suit. Sequences of cards in the same suit " "can be moved as a unit." @@ -1985,7 +1989,7 @@ msgstr "" "Игровой стол. Складывать по возрастанию не считаясь с мастью. Можно " "перемещать серии карт одинаковой масти." -#: pysollib/stack.py:2389 +#: pysollib/stack.py:2373 msgid "" "Tableau. Build down regardless of suit. Sequences of cards in the same suit " "can be moved as a unit." @@ -1993,7 +1997,7 @@ msgstr "" "Игровой стол. Складывать по убыванию не считаясь с мастью. Можно перемещать " "серии карт одинаковой масти." -#: pysollib/stack.py:2411 +#: pysollib/stack.py:2395 msgid "" "Tableau. Build up by alternate color, can move any face-up cards regardless " "of sequence." @@ -2001,7 +2005,7 @@ msgstr "" "Игровой стол. Складывать по возрастанию чередуя цвет, можно перемещать любую " "серию открытых карт." -#: pysollib/stack.py:2412 +#: pysollib/stack.py:2396 msgid "" "Tableau. Build down by alternate color, can move any face-up cards " "regardless of sequence." @@ -2009,7 +2013,7 @@ msgstr "" "Игровой стол. Складывать по убыванию чередуя цвет, можно перемещать любую " "серию открытых карт." -#: pysollib/stack.py:2413 pysollib/stack.py:2426 pysollib/stack.py:2436 +#: pysollib/stack.py:2397 pysollib/stack.py:2410 pysollib/stack.py:2420 msgid "" "Tableau. Build by same rank, can move any face-up cards regardless of " "sequence." @@ -2017,14 +2021,14 @@ msgstr "" "Игровой стол. Складывать в соответствии с достоинством, можно перемещать " "любую серию открытых карт." -#: pysollib/stack.py:2424 +#: pysollib/stack.py:2408 msgid "" "Tableau. Build up by suit, can move any face-up cards regardless of sequence." msgstr "" "Игровой стол. Складывать по возрастанию в соответствии с мастью, можно " "перемещать любую серию открытых карт." -#: pysollib/stack.py:2425 +#: pysollib/stack.py:2409 msgid "" "Tableau. Build down by suit, can move any face-up cards regardless of " "sequence." @@ -2032,7 +2036,7 @@ msgstr "" "Игровой стол. Складывать по убыванию в соответствии с мастью, можно " "перемещать любую серию открытых карт." -#: pysollib/stack.py:2434 pysollib/stack.py:2435 +#: pysollib/stack.py:2418 pysollib/stack.py:2419 msgid "" "Tableau. Build up regardless of suit, can move any face-up cards regardless " "of sequence." @@ -2040,57 +2044,57 @@ msgstr "" "Игровой стол. Складывать по возрастанию не считаясь с мастью, можно " "перемещать любую серию открытых карт." -#: pysollib/stack.py:2468 +#: pysollib/stack.py:2452 msgid "Tableau. Build up or down by color." msgstr "" "Игровой стол. Складывать по возрастанию или убыванию в соответствии с цветом." -#: pysollib/stack.py:2479 +#: pysollib/stack.py:2463 msgid "Tableau. Build up or down by alternate color." msgstr "Игровой стол. Складывать по возрастанию или убыванию чередуя цвет." -#: pysollib/stack.py:2490 +#: pysollib/stack.py:2474 msgid "Tableau. Build up or down by suit." msgstr "" "Игровой стол. Складывать по возрастанию или убыванию в соответствии с мастью." -#: pysollib/stack.py:2501 +#: pysollib/stack.py:2485 msgid "Tableau. Build up or down regardless of suit." msgstr "" "Игровой стол. Складывать по возрастанию или убыванию не считаясь с мастью." -#: pysollib/stack.py:2602 +#: pysollib/stack.py:2586 msgid "Waste." msgstr "Сброс." -#: pysollib/stack.py:2719 +#: pysollib/stack.py:2703 msgid "Free cell." msgstr "Свободная ячейка." -#: pysollib/stats.py:52 pysollib/stats.py:118 pysollib/tile/tkstats.py:673 +#: pysollib/stats.py:52 pysollib/stats.py:122 pysollib/tile/tkstats.py:675 msgid "Game" msgstr "Игра" -#: pysollib/stats.py:53 pysollib/tile/tkstats.py:904 -#: pysollib/tile/tkstats.py:977 pysollib/tile/tkstats.py:978 -#: pysollib/tk/tkstats.py:885 pysollib/tk/tkstats.py:886 -#: pysollib/tk/tkstats.py:939 +#: pysollib/stats.py:53 pysollib/tile/tkstats.py:906 +#: pysollib/tile/tkstats.py:979 pysollib/tile/tkstats.py:980 +#: pysollib/tk/tkstats.py:881 pysollib/tk/tkstats.py:882 +#: pysollib/tk/tkstats.py:935 msgid "Played" msgstr "Играл" -#: pysollib/stats.py:54 pysollib/stats.py:157 pysollib/tile/tkstats.py:911 -#: pysollib/tile/tkstats.py:982 pysollib/tile/tkstats.py:983 -#: pysollib/tk/tkstats.py:890 pysollib/tk/tkstats.py:891 -#: pysollib/tk/tkstats.py:947 +#: pysollib/stats.py:54 pysollib/stats.py:161 pysollib/tile/tkstats.py:913 +#: pysollib/tile/tkstats.py:984 pysollib/tile/tkstats.py:985 +#: pysollib/tk/tkstats.py:886 pysollib/tk/tkstats.py:887 +#: pysollib/tk/tkstats.py:943 msgid "Won" msgstr "Выиграл" -#: pysollib/stats.py:55 pysollib/stats.py:157 +#: pysollib/stats.py:55 pysollib/stats.py:161 msgid "Lost" msgstr "Проиграл" #: pysollib/stats.py:56 pysollib/tile/statusbar.py:150 -#: pysollib/tk/statusbar.py:161 data/glade-translations:25 +#: pysollib/tk/statusbar.py:159 data/glade-translations:25 msgid "Playing time" msgstr "Время игры" @@ -2098,63 +2102,63 @@ msgstr "Время игры" msgid "Moves" msgstr "Ходов" -#: pysollib/stats.py:58 pysollib/tile/tkstats.py:918 -#: pysollib/tile/tkstats.py:950 pysollib/tile/tkstats.py:969 -#: pysollib/tile/tkstats.py:987 pysollib/tk/tkstats.py:858 -#: pysollib/tk/tkstats.py:877 pysollib/tk/tkstats.py:895 -#: pysollib/tk/tkstats.py:955 +#: pysollib/stats.py:58 pysollib/tile/tkstats.py:920 +#: pysollib/tile/tkstats.py:952 pysollib/tile/tkstats.py:971 +#: pysollib/tile/tkstats.py:989 pysollib/tk/tkstats.py:854 +#: pysollib/tk/tkstats.py:873 pysollib/tk/tkstats.py:891 +#: pysollib/tk/tkstats.py:951 msgid "% won" msgstr "% побед" -#: pysollib/stats.py:118 +#: pysollib/stats.py:122 msgid "Status" msgstr "Статус" -#: pysollib/stats.py:118 pysollib/tile/statusbar.py:152 -#: pysollib/tile/tkstats.py:676 pysollib/tk/statusbar.py:163 -#: pysollib/tk/tkstats.py:669 +#: pysollib/stats.py:122 pysollib/tile/statusbar.py:152 +#: pysollib/tile/tkstats.py:678 pysollib/tk/statusbar.py:161 +#: pysollib/tk/tkstats.py:665 msgid "Game number" msgstr "Номер игры" -#: pysollib/stats.py:118 pysollib/tile/tkstats.py:679 -#: pysollib/tk/tkstats.py:672 +#: pysollib/stats.py:122 pysollib/tile/tkstats.py:681 +#: pysollib/tk/tkstats.py:668 msgid "Started at" msgstr "Игра начата" -#: pysollib/stats.py:142 pysollib/tile/tkstats.py:695 +#: pysollib/stats.py:146 pysollib/tile/tkstats.py:697 msgid "** UNKNOWN %d **" msgstr "" -#: pysollib/stats.py:150 +#: pysollib/stats.py:154 msgid "** ERROR **" msgstr "" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Loaded" msgstr "Загружал" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Not won" msgstr "Не выиграл" -#: pysollib/stats.py:157 +#: pysollib/stats.py:161 msgid "Perfect" msgstr "Великолепная" -#: pysollib/stats.py:204 pysollib/stats.py:235 pysollib/stats.py:241 +#: pysollib/stats.py:208 pysollib/stats.py:239 pysollib/stats.py:245 msgid "Demo" msgstr "Демо" -#: pysollib/stats.py:215 pysollib/tile/tkstats.py:384 -#: pysollib/tk/tkstats.py:420 +#: pysollib/stats.py:219 pysollib/tile/tkstats.py:383 +#: pysollib/tk/tkstats.py:419 msgid "Total (%d out of %d games)" msgstr "Всего (%d из %d игр)" -#: pysollib/stats.py:236 +#: pysollib/stats.py:240 msgid "Full log for " msgstr "Полный лог для " -#: pysollib/stats.py:242 +#: pysollib/stats.py:246 msgid "Session log for " msgstr "Лог сессии для " @@ -2276,514 +2280,506 @@ msgstr "Игровой стол маленький: " msgid "Select font" msgstr "Выбрать шрифт" -#: pysollib/tile/menubar.py:79 pysollib/tk/menubar.py:77 -msgid "Style" -msgstr "Стиль" - -#: pysollib/tile/menubar.py:87 pysollib/tk/menubar.py:86 +#: pysollib/tile/menubar.py:86 pysollib/tk/menubar.py:84 msgid "Compound" msgstr "Компоновка" -#: pysollib/tile/menubar.py:93 pysollib/tk/menubar.py:92 +#: pysollib/tile/menubar.py:92 pysollib/tk/menubar.py:90 msgid "Hide" msgstr "Спрятать" -#: pysollib/tile/menubar.py:96 pysollib/tk/menubar.py:95 +#: pysollib/tile/menubar.py:95 pysollib/tk/menubar.py:93 msgid "Top" msgstr "Сверху" -#: pysollib/tile/menubar.py:99 pysollib/tk/menubar.py:98 +#: pysollib/tile/menubar.py:98 pysollib/tk/menubar.py:96 msgid "Bottom" msgstr "Внизу" -#: pysollib/tile/menubar.py:102 pysollib/tk/menubar.py:101 +#: pysollib/tile/menubar.py:101 pysollib/tk/menubar.py:99 msgid "Left" msgstr "Слева" -#: pysollib/tile/menubar.py:105 pysollib/tk/menubar.py:104 +#: pysollib/tile/menubar.py:104 pysollib/tk/menubar.py:102 msgid "Right" msgstr "Справа" -#: pysollib/tile/menubar.py:109 pysollib/tk/menubar.py:108 -msgid "Small icons" -msgstr "Маленькие пиктограммы" - -#: pysollib/tile/menubar.py:112 pysollib/tk/menubar.py:111 -msgid "Large icons" -msgstr "Большие пиктограммы" - -#: pysollib/tile/menubar.py:118 pysollib/tk/menubar.py:117 +#: pysollib/tile/menubar.py:115 pysollib/tk/menubar.py:113 msgid "Visible buttons" msgstr "Показывать кнопки" -#: pysollib/tile/menubar.py:353 pysollib/tile/menubar.py:522 -#: pysollib/tk/menubar.py:350 pysollib/tk/menubar.py:526 +#: pysollib/tile/menubar.py:350 pysollib/tile/menubar.py:520 +#: pysollib/tk/menubar.py:346 pysollib/tk/menubar.py:523 msgid "&About " msgstr "&О программе " -#: pysollib/tile/menubar.py:355 pysollib/tk/menubar.py:352 +#: pysollib/tile/menubar.py:352 pysollib/tk/menubar.py:348 msgid "&File" msgstr "&Файл" -#: pysollib/tile/menubar.py:357 pysollib/tk/menubar.py:354 +#: pysollib/tile/menubar.py:354 pysollib/tk/menubar.py:350 msgid "R&ecent games" msgstr "Выбрать н&едавнюю игру" -#: pysollib/tile/menubar.py:359 pysollib/tk/menubar.py:356 +#: pysollib/tile/menubar.py:356 pysollib/tk/menubar.py:352 msgid "Select &random game" msgstr "С&лучайная игра" -#: pysollib/tile/menubar.py:360 pysollib/tk/menubar.py:357 +#: pysollib/tile/menubar.py:357 pysollib/tk/menubar.py:353 msgid "&All games" msgstr "&Все игры" -#: pysollib/tile/menubar.py:361 pysollib/tk/menubar.py:358 +#: pysollib/tile/menubar.py:358 pysollib/tk/menubar.py:354 msgid "Games played and &won" msgstr "&Выигранные игры" -#: pysollib/tile/menubar.py:362 pysollib/tk/menubar.py:359 +#: pysollib/tile/menubar.py:359 pysollib/tk/menubar.py:355 msgid "Games played and ¬ won" msgstr "&Невыигранные игры" -#: pysollib/tile/menubar.py:363 pysollib/tk/menubar.py:360 +#: pysollib/tile/menubar.py:360 pysollib/tk/menubar.py:356 msgid "Games not &played" msgstr "Не&сыгранные игры" -#: pysollib/tile/menubar.py:364 pysollib/tk/menubar.py:361 +#: pysollib/tile/menubar.py:361 pysollib/tk/menubar.py:357 msgid "Select game by nu&mber..." msgstr "Выбрать игру по &номеру..." -#: pysollib/tile/menubar.py:366 pysollib/tk/menubar.py:363 +#: pysollib/tile/menubar.py:363 pysollib/tk/menubar.py:359 msgid "Fa&vorite games" msgstr "&Избранные игры" -#: pysollib/tile/menubar.py:367 pysollib/tk/menubar.py:364 +#: pysollib/tile/menubar.py:364 pysollib/tk/menubar.py:360 msgid "A&dd to favorites" msgstr "&Добавить в избранное" -#: pysollib/tile/menubar.py:368 pysollib/tk/menubar.py:365 +#: pysollib/tile/menubar.py:365 pysollib/tk/menubar.py:361 msgid "Remove &from favorites" msgstr "&Удалить из избранных" -#: pysollib/tile/menubar.py:370 pysollib/tk/menubar.py:367 +#: pysollib/tile/menubar.py:367 pysollib/tk/menubar.py:363 msgid "&Open..." msgstr "&Открыть..." -#: pysollib/tile/menubar.py:371 pysollib/tk/menubar.py:368 +#: pysollib/tile/menubar.py:368 pysollib/tk/menubar.py:364 msgid "&Save" msgstr "&Сохранить" -#: pysollib/tile/menubar.py:372 pysollib/tk/menubar.py:369 +#: pysollib/tile/menubar.py:369 pysollib/tk/menubar.py:365 msgid "Save &as..." msgstr "Сохранить &как..." -#: pysollib/tile/menubar.py:374 pysollib/tk/menubar.py:371 +#: pysollib/tile/menubar.py:371 pysollib/tk/menubar.py:367 msgid "&Hold and quit" msgstr "Со&храниться и выйти" -#: pysollib/tile/menubar.py:380 pysollib/tile/selectgame.py:397 -#: pysollib/tk/menubar.py:377 pysollib/tk/selectgame.py:406 +#: pysollib/tile/menubar.py:377 pysollib/tile/selectgame.py:433 +#: pysollib/tk/menubar.py:373 pysollib/tk/selectgame.py:444 msgid "&Select" msgstr "&Выбрать" -#: pysollib/tile/menubar.py:385 pysollib/tk/menubar.py:382 +#: pysollib/tile/menubar.py:382 pysollib/tk/menubar.py:378 msgid "&Edit" msgstr "Р&едактировать" -#: pysollib/tile/menubar.py:386 pysollib/tk/menubar.py:383 +#: pysollib/tile/menubar.py:383 pysollib/tk/menubar.py:379 msgid "&Undo" msgstr "&Отмена" -#: pysollib/tile/menubar.py:387 pysollib/tk/menubar.py:384 +#: pysollib/tile/menubar.py:384 pysollib/tk/menubar.py:380 msgid "&Redo" msgstr "&Повтор" -#: pysollib/tile/menubar.py:388 pysollib/tk/menubar.py:385 +#: pysollib/tile/menubar.py:385 pysollib/tk/menubar.py:381 msgid "Redo &all" msgstr "Вернуть все" -#: pysollib/tile/menubar.py:391 pysollib/tk/menubar.py:388 +#: pysollib/tile/menubar.py:388 pysollib/tk/menubar.py:384 msgid "&Set bookmark" msgstr "Установить &закладку" -#: pysollib/tile/menubar.py:393 pysollib/tile/menubar.py:397 -#: pysollib/tk/menubar.py:390 pysollib/tk/menubar.py:394 +#: pysollib/tile/menubar.py:390 pysollib/tile/menubar.py:394 +#: pysollib/tk/menubar.py:386 pysollib/tk/menubar.py:390 msgid "Bookmark %d" msgstr "Закладка %d" -#: pysollib/tile/menubar.py:395 pysollib/tk/menubar.py:392 +#: pysollib/tile/menubar.py:392 pysollib/tk/menubar.py:388 msgid "Go&to bookmark" msgstr "&Перейти к закладке" -#: pysollib/tile/menubar.py:400 pysollib/tk/menubar.py:397 +#: pysollib/tile/menubar.py:397 pysollib/tk/menubar.py:393 msgid "&Clear bookmarks" msgstr "О&чистить закладки" -#: pysollib/tile/menubar.py:403 pysollib/tile/toolbar.py:187 -#: pysollib/tk/menubar.py:400 pysollib/tk/toolbar.py:190 +#: pysollib/tile/menubar.py:400 pysollib/tile/toolbar.py:187 +#: pysollib/tk/menubar.py:396 pysollib/tk/toolbar.py:190 msgid "Restart" msgstr "Начало" -#: pysollib/tile/menubar.py:406 pysollib/tk/menubar.py:403 +#: pysollib/tile/menubar.py:403 pysollib/tk/menubar.py:399 msgid "Solitaire &Wizard" msgstr "Конструктор пасьянсов" -#: pysollib/tile/menubar.py:407 pysollib/tk/menubar.py:404 +#: pysollib/tile/menubar.py:404 pysollib/tk/menubar.py:400 msgid "&Edit current game" msgstr "Редактировать текущую игру" -#: pysollib/tile/menubar.py:409 pysollib/tk/menubar.py:406 +#: pysollib/tile/menubar.py:406 pysollib/tk/menubar.py:402 msgid "&Game" msgstr "&Игра" -#: pysollib/tile/menubar.py:410 pysollib/tk/menubar.py:407 +#: pysollib/tile/menubar.py:407 pysollib/tk/menubar.py:403 msgid "&Deal cards" msgstr "&Сдать карты" -#: pysollib/tile/menubar.py:411 pysollib/tk/menubar.py:408 +#: pysollib/tile/menubar.py:408 pysollib/tk/menubar.py:404 msgid "&Auto drop" msgstr "С&бросить карты" -#: pysollib/tile/menubar.py:412 pysollib/tk/menubar.py:409 +#: pysollib/tile/menubar.py:409 pysollib/tk/menubar.py:405 +msgid "Shu&ffle tiles" +msgstr "Переме&шать фишки" + +#: pysollib/tile/menubar.py:410 pysollib/tk/menubar.py:406 msgid "&Pause" msgstr "&Пауза" -#: pysollib/tile/menubar.py:415 pysollib/tk/menubar.py:412 +#: pysollib/tile/menubar.py:413 pysollib/tk/menubar.py:409 msgid "S&tatus..." msgstr "С&татус" -#: pysollib/tile/menubar.py:416 pysollib/tk/menubar.py:413 +#: pysollib/tile/menubar.py:414 pysollib/tk/menubar.py:410 msgid "&Comments..." msgstr "&Комментарии..." -#: pysollib/tile/menubar.py:418 pysollib/tile/tkstats.py:644 -#: pysollib/tk/tkstats.py:640 +#: pysollib/tile/menubar.py:416 pysollib/tile/tkstats.py:646 +#: pysollib/tk/tkstats.py:636 msgid "&Statistics..." msgstr "&Статистика..." -#: pysollib/tile/menubar.py:419 +#: pysollib/tile/menubar.py:417 msgid "Log..." msgstr "Лог..." -#: pysollib/tile/menubar.py:421 pysollib/tk/menubar.py:424 +#: pysollib/tile/menubar.py:419 pysollib/tk/menubar.py:421 msgid "D&emo statistics" msgstr "Статистика демо" -#: pysollib/tile/menubar.py:423 pysollib/tk/menubar.py:428 +#: pysollib/tile/menubar.py:421 pysollib/tk/menubar.py:425 msgid "&Assist" msgstr "&Подсказка" -#: pysollib/tile/menubar.py:424 pysollib/tk/menubar.py:429 +#: pysollib/tile/menubar.py:422 pysollib/tk/menubar.py:426 msgid "&Hint" msgstr "Подсказать &ход" -#: pysollib/tile/menubar.py:425 pysollib/tk/menubar.py:430 +#: pysollib/tile/menubar.py:423 pysollib/tk/menubar.py:427 msgid "Highlight p&iles" msgstr "П&оказать группы" -#: pysollib/tile/menubar.py:426 pysollib/tk/menubar.py:431 +#: pysollib/tile/menubar.py:424 pysollib/tk/menubar.py:428 msgid "&Find card" msgstr "&Найти карту" -#: pysollib/tile/menubar.py:428 pysollib/tk/menubar.py:433 +#: pysollib/tile/menubar.py:426 pysollib/tk/menubar.py:430 msgid "&Demo" msgstr "&Демо" -#: pysollib/tile/menubar.py:429 pysollib/tk/menubar.py:434 +#: pysollib/tile/menubar.py:427 pysollib/tk/menubar.py:431 msgid "Demo (&all games)" msgstr "Демо (&все игры)" -#: pysollib/tile/menubar.py:431 pysollib/tile/menubar.py:433 -#: pysollib/tk/menubar.py:436 pysollib/tk/menubar.py:438 +#: pysollib/tile/menubar.py:429 pysollib/tile/menubar.py:431 +#: pysollib/tk/menubar.py:433 pysollib/tk/menubar.py:435 msgid "&Solver (experimental)" msgstr "" -#: pysollib/tile/menubar.py:435 pysollib/tk/menubar.py:440 +#: pysollib/tile/menubar.py:433 pysollib/tk/menubar.py:437 msgid "&Piles description" msgstr "Описания &ячеек" -#: pysollib/tile/menubar.py:439 pysollib/tk/menubar.py:444 +#: pysollib/tile/menubar.py:437 pysollib/tk/menubar.py:441 msgid "&Options" msgstr "&Настройка" -#: pysollib/tile/menubar.py:440 pysollib/tk/menubar.py:445 +#: pysollib/tile/menubar.py:438 pysollib/tk/menubar.py:442 msgid "&Player options..." msgstr "Настройки &игрока..." -#: pysollib/tile/menubar.py:441 pysollib/tk/menubar.py:446 +#: pysollib/tile/menubar.py:439 pysollib/tk/menubar.py:443 msgid "&Automatic play" msgstr "Настройки &автоматической игры" -#: pysollib/tile/menubar.py:442 pysollib/tk/menubar.py:447 +#: pysollib/tile/menubar.py:440 pysollib/tk/menubar.py:444 msgid "Auto &face up" msgstr "Автоматически &переворачивать" -#: pysollib/tile/menubar.py:443 pysollib/tk/menubar.py:448 +#: pysollib/tile/menubar.py:441 pysollib/tk/menubar.py:445 msgid "A&uto drop" msgstr "А&втоматически сбрасывать карты" -#: pysollib/tile/menubar.py:444 pysollib/tk/menubar.py:449 +#: pysollib/tile/menubar.py:442 pysollib/tk/menubar.py:446 msgid "Auto &deal" msgstr "Автоматически &сдавать карты" -#: pysollib/tile/menubar.py:446 pysollib/tk/menubar.py:451 +#: pysollib/tile/menubar.py:444 pysollib/tk/menubar.py:448 msgid "&Quick play" msgstr "&Быстрая игра" -#: pysollib/tile/menubar.py:447 pysollib/tk/menubar.py:452 +#: pysollib/tile/menubar.py:445 pysollib/tk/menubar.py:449 msgid "Assist &level" msgstr "&Уровень подсказки" -#: pysollib/tile/menubar.py:448 pysollib/tk/menubar.py:453 +#: pysollib/tile/menubar.py:446 pysollib/tk/menubar.py:450 msgid "Enable &undo" msgstr "Разрешить &возврат хода" -#: pysollib/tile/menubar.py:449 pysollib/tk/menubar.py:454 +#: pysollib/tile/menubar.py:447 pysollib/tk/menubar.py:451 msgid "Enable &bookmarks" msgstr "Разрешить &закладки" -#: pysollib/tile/menubar.py:450 pysollib/tk/menubar.py:455 +#: pysollib/tile/menubar.py:448 pysollib/tk/menubar.py:452 msgid "Enable &hint" msgstr "Разрешить &подсказки" -#: pysollib/tile/menubar.py:451 pysollib/tk/menubar.py:456 +#: pysollib/tile/menubar.py:449 pysollib/tk/menubar.py:453 msgid "Enable highlight p&iles" msgstr "Разрешить показывать к&учи" -#: pysollib/tile/menubar.py:452 pysollib/tk/menubar.py:457 +#: pysollib/tile/menubar.py:450 pysollib/tk/menubar.py:454 msgid "Enable highlight &cards" msgstr "Разрешить показывать &карты" -#: pysollib/tile/menubar.py:453 pysollib/tk/menubar.py:458 +#: pysollib/tile/menubar.py:451 pysollib/tk/menubar.py:455 msgid "Enable highlight same &rank" msgstr "Разрешить показывать карты &одного достоинства" -#: pysollib/tile/menubar.py:454 pysollib/tk/menubar.py:459 +#: pysollib/tile/menubar.py:452 pysollib/tk/menubar.py:456 msgid "Highlight &no matching" msgstr "Подсветка отсутствия &совпадения" -#: pysollib/tile/menubar.py:456 pysollib/tk/menubar.py:461 +#: pysollib/tile/menubar.py:454 pysollib/tk/menubar.py:458 msgid "&Show removed tiles (in Mahjongg games)" msgstr "Показывать удалённые (в Маджонг)" -#: pysollib/tile/menubar.py:457 pysollib/tk/menubar.py:462 +#: pysollib/tile/menubar.py:455 pysollib/tk/menubar.py:459 msgid "Show hint &arrow (in Shisen-Sho games)" msgstr "Показывать стрелку (в Шисен-Сё)" -#: pysollib/tile/menubar.py:459 pysollib/tk/menubar.py:464 +#: pysollib/tile/menubar.py:457 pysollib/tk/menubar.py:461 msgid "&Sound..." msgstr "&Звук..." -#: pysollib/tile/menubar.py:467 pysollib/tk/menubar.py:472 +#: pysollib/tile/menubar.py:465 pysollib/tk/menubar.py:469 msgid "Cards&et..." msgstr "Коло&да..." -#: pysollib/tile/menubar.py:468 pysollib/tk/menubar.py:473 +#: pysollib/tile/menubar.py:466 pysollib/tk/menubar.py:470 msgid "Table t&ile..." msgstr "Игровой &стол..." -#: pysollib/tile/menubar.py:470 pysollib/tk/menubar.py:475 +#: pysollib/tile/menubar.py:468 pysollib/tk/menubar.py:472 msgid "Card &background" msgstr "&Рубашка карты" -#: pysollib/tile/menubar.py:471 pysollib/tk/menubar.py:476 +#: pysollib/tile/menubar.py:469 pysollib/tk/menubar.py:473 msgid "Card &view" msgstr "&Вид карты" -#: pysollib/tile/menubar.py:472 pysollib/tk/menubar.py:477 +#: pysollib/tile/menubar.py:470 pysollib/tk/menubar.py:474 msgid "Card shado&w" msgstr "Тень карты" -#: pysollib/tile/menubar.py:473 pysollib/tk/menubar.py:478 +#: pysollib/tile/menubar.py:471 pysollib/tk/menubar.py:475 msgid "Shade &legal moves" msgstr "Подсвечивать &разрешённые ходы" -#: pysollib/tile/menubar.py:474 pysollib/tk/menubar.py:479 +#: pysollib/tile/menubar.py:472 pysollib/tk/menubar.py:476 msgid "&Negative cards bottom" msgstr "&Негативные контуры карты" -#: pysollib/tile/menubar.py:475 pysollib/tk/menubar.py:480 +#: pysollib/tile/menubar.py:473 pysollib/tk/menubar.py:477 msgid "Shrink face-down cards" msgstr "Сжимать закрытые карты" -#: pysollib/tile/menubar.py:476 pysollib/tk/menubar.py:481 +#: pysollib/tile/menubar.py:474 pysollib/tk/menubar.py:478 msgid "Shade &filled stacks" msgstr "Затемнять заполненные ячейки" -#: pysollib/tile/menubar.py:477 pysollib/tk/menubar.py:482 +#: pysollib/tile/menubar.py:475 pysollib/tk/menubar.py:479 msgid "A&nimations" msgstr "Анимаци&я" -#: pysollib/tile/menubar.py:478 pysollib/tk/menubar.py:483 +#: pysollib/tile/menubar.py:476 pysollib/tk/menubar.py:480 msgid "&None" msgstr "&Нет" -#: pysollib/tile/menubar.py:479 pysollib/tk/menubar.py:484 +#: pysollib/tile/menubar.py:477 pysollib/tk/menubar.py:481 msgid "&Very fast" msgstr "&Очень быстрая" -#: pysollib/tile/menubar.py:480 pysollib/tk/menubar.py:485 +#: pysollib/tile/menubar.py:478 pysollib/tk/menubar.py:482 msgid "&Fast" msgstr "&Быстрая" -#: pysollib/tile/menubar.py:481 pysollib/tk/menubar.py:486 +#: pysollib/tile/menubar.py:479 pysollib/tk/menubar.py:483 msgid "&Medium" msgstr "С&редняя" -#: pysollib/tile/menubar.py:482 pysollib/tk/menubar.py:487 +#: pysollib/tile/menubar.py:480 pysollib/tk/menubar.py:484 msgid "&Slow" msgstr "&Медленная" -#: pysollib/tile/menubar.py:483 pysollib/tk/menubar.py:488 +#: pysollib/tile/menubar.py:481 pysollib/tk/menubar.py:485 msgid "V&ery slow" msgstr "&Очень медленная" -#: pysollib/tile/menubar.py:485 pysollib/tk/menubar.py:490 +#: pysollib/tile/menubar.py:483 pysollib/tk/menubar.py:487 msgid "&Redeal animation" msgstr "Анимация пере&сдачи" -#: pysollib/tile/menubar.py:487 pysollib/tk/menubar.py:492 +#: pysollib/tile/menubar.py:485 pysollib/tk/menubar.py:489 msgid "&Winning animation" msgstr "Анимация &победы" -#: pysollib/tile/menubar.py:488 pysollib/tk/menubar.py:493 +#: pysollib/tile/menubar.py:486 pysollib/tk/menubar.py:490 msgid "&Mouse" msgstr "&Мышь" -#: pysollib/tile/menubar.py:489 pysollib/tk/menubar.py:494 +#: pysollib/tile/menubar.py:487 pysollib/tk/menubar.py:491 msgid "&Drag-and-Drop" msgstr "" -#: pysollib/tile/menubar.py:490 pysollib/tk/menubar.py:495 +#: pysollib/tile/menubar.py:488 pysollib/tk/menubar.py:492 msgid "&Point-and-Click" msgstr "" -#: pysollib/tile/menubar.py:491 pysollib/tk/menubar.py:496 +#: pysollib/tile/menubar.py:489 pysollib/tk/menubar.py:493 msgid "&Sticky mouse" msgstr "&Липкая мышь" -#: pysollib/tile/menubar.py:493 pysollib/tk/menubar.py:498 +#: pysollib/tile/menubar.py:491 pysollib/tk/menubar.py:495 msgid "Use mouse for undo/redo" msgstr "Использовать мышь для отмены/повтора" -#: pysollib/tile/menubar.py:495 pysollib/tk/menubar.py:500 +#: pysollib/tile/menubar.py:493 pysollib/tk/menubar.py:497 msgid "&Fonts..." msgstr "&Шрифты..." -#: pysollib/tile/menubar.py:496 pysollib/tk/menubar.py:501 +#: pysollib/tile/menubar.py:494 pysollib/tk/menubar.py:498 msgid "&Colors..." msgstr "&Цвета..." -#: pysollib/tile/menubar.py:497 pysollib/tk/menubar.py:502 +#: pysollib/tile/menubar.py:495 pysollib/tk/menubar.py:499 msgid "Time&outs..." msgstr "Тайма&уты..." -#: pysollib/tile/menubar.py:500 pysollib/tk/menubar.py:504 +#: pysollib/tile/menubar.py:498 pysollib/tk/menubar.py:501 msgid "&Toolbar" msgstr "Панель и&нструментов" -#: pysollib/tile/menubar.py:502 pysollib/tk/menubar.py:506 +#: pysollib/tile/menubar.py:500 pysollib/tk/menubar.py:503 msgid "Stat&usbar" msgstr "Панель с&остояния" -#: pysollib/tile/menubar.py:503 pysollib/tk/menubar.py:507 +#: pysollib/tile/menubar.py:501 pysollib/tk/menubar.py:504 msgid "Show &statusbar" msgstr "Показывать панель состояния" -#: pysollib/tile/menubar.py:504 pysollib/tk/menubar.py:508 +#: pysollib/tile/menubar.py:502 pysollib/tk/menubar.py:505 msgid "Show &number of cards" msgstr "Показывать количество карт" -#: pysollib/tile/menubar.py:505 pysollib/tk/menubar.py:509 +#: pysollib/tile/menubar.py:503 pysollib/tk/menubar.py:506 msgid "Show &help bar" msgstr "Показывать панель помощи" -#: pysollib/tile/menubar.py:506 pysollib/tk/menubar.py:510 +#: pysollib/tile/menubar.py:504 pysollib/tk/menubar.py:507 msgid "Save games &geometry" msgstr "Сохранение &геометрии игры" -#: pysollib/tile/menubar.py:507 pysollib/tk/menubar.py:511 +#: pysollib/tile/menubar.py:505 pysollib/tk/menubar.py:508 msgid "&Demo logo" msgstr "Д&емо лого" -#: pysollib/tile/menubar.py:508 pysollib/tk/menubar.py:512 +#: pysollib/tile/menubar.py:506 pysollib/tk/menubar.py:509 msgid "Startup splash sc&reen" msgstr "О&кно запуска" -#: pysollib/tile/menubar.py:514 pysollib/tk/menubar.py:518 +#: pysollib/tile/menubar.py:512 pysollib/tk/menubar.py:515 msgid "&Help" msgstr "&Помощь" -#: pysollib/tile/menubar.py:515 pysollib/tk/menubar.py:519 +#: pysollib/tile/menubar.py:513 pysollib/tk/menubar.py:516 msgid "&Contents" msgstr "&Содержание" -#: pysollib/tile/menubar.py:516 pysollib/tk/menubar.py:520 +#: pysollib/tile/menubar.py:514 pysollib/tk/menubar.py:517 msgid "&How to play" msgstr "Как &играть" -#: pysollib/tile/menubar.py:517 pysollib/tk/menubar.py:521 +#: pysollib/tile/menubar.py:515 pysollib/tk/menubar.py:518 msgid "&Rules for this game" msgstr "&Правила текущей игры" -#: pysollib/tile/menubar.py:518 pysollib/tk/menubar.py:522 +#: pysollib/tile/menubar.py:516 pysollib/tk/menubar.py:519 msgid "&License terms" msgstr "&Лицензия" -#: pysollib/tile/menubar.py:637 pysollib/tk/menubar.py:641 +#: pysollib/tile/menubar.py:635 pysollib/tk/menubar.py:638 msgid "All &games..." msgstr "&Все игры..." -#: pysollib/tile/menubar.py:639 pysollib/tk/menubar.py:643 +#: pysollib/tile/menubar.py:637 pysollib/tk/menubar.py:640 msgid "Playable pre&view..." msgstr "Играемый &предпросмотр..." -#: pysollib/tile/menubar.py:692 pysollib/tk/menubar.py:696 +#: pysollib/tile/menubar.py:690 pysollib/tk/menubar.py:693 msgid "&Mahjongg games" msgstr "Игры маджонг" -#: pysollib/tile/menubar.py:730 pysollib/tk/menubar.py:734 +#: pysollib/tile/menubar.py:728 pysollib/tk/menubar.py:731 msgid "&Popular games" msgstr "&Популярные игры" -#: pysollib/tile/menubar.py:738 pysollib/tk/menubar.py:742 +#: pysollib/tile/menubar.py:736 pysollib/tk/menubar.py:739 msgid "&French games" msgstr "&Классические игры" -#: pysollib/tile/menubar.py:745 pysollib/tk/menubar.py:749 +#: pysollib/tile/menubar.py:743 pysollib/tk/menubar.py:746 msgid "&Oriental games" msgstr "&Восточные игры" -#: pysollib/tile/menubar.py:753 pysollib/tk/menubar.py:757 +#: pysollib/tile/menubar.py:751 pysollib/tk/menubar.py:754 msgid "&Special games" msgstr "&Особые игры" -#: pysollib/tile/menubar.py:759 pysollib/tk/menubar.py:763 +#: pysollib/tile/menubar.py:757 pysollib/tk/menubar.py:760 msgid "&Cusom games" msgstr "Самодельные игры" -#: pysollib/tile/menubar.py:765 pysollib/tk/menubar.py:769 +#: pysollib/tile/menubar.py:763 pysollib/tk/menubar.py:766 msgid "&All games by name" msgstr "&Все игры по имени" -#: pysollib/tile/menubar.py:1047 pysollib/tk/menubar.py:1051 +#: pysollib/tile/menubar.py:1045 pysollib/tk/menubar.py:1048 #: data/glade-translations:72 msgid "Sound settings" msgstr "Настройка звука" -#: pysollib/tile/menubar.py:1155 pysollib/tk/menubar.py:1163 +#: pysollib/tile/menubar.py:1153 pysollib/tk/menubar.py:1160 msgid "Select " msgstr "Выбрать " -#: pysollib/tile/menubar.py:1201 pysollib/tk/menubar.py:1210 +#: pysollib/tile/menubar.py:1199 pysollib/tk/menubar.py:1207 msgid "Select table background" msgstr "Выбрать фоновое изображение" -#: pysollib/tile/menubar.py:1346 +#: pysollib/tile/menubar.py:1344 msgid "Change theme" msgstr "Изменение темы" -#: pysollib/tile/menubar.py:1347 +#: pysollib/tile/menubar.py:1345 msgid "" "This settings will take effect\n" "the next time you restart " @@ -2791,41 +2787,41 @@ msgstr "" "Эта установка вступит в силу\n" "при следующем запуске " -#: pysollib/tile/menubar.py:1354 +#: pysollib/tile/menubar.py:1352 msgid "Set t&heme" msgstr "Установить &тему" -#: pysollib/tile/menubar.py:1360 +#: pysollib/tile/menubar.py:1358 #, fuzzy msgid "Default" msgstr "Сдача" -#: pysollib/tile/menubar.py:1361 +#: pysollib/tile/menubar.py:1359 #, fuzzy msgid "Classic" msgstr "Классический вид" -#: pysollib/tile/menubar.py:1362 +#: pysollib/tile/menubar.py:1360 msgid "Revitalized" msgstr "" -#: pysollib/tile/menubar.py:1363 +#: pysollib/tile/menubar.py:1361 msgid "Windows native" msgstr "" -#: pysollib/tile/menubar.py:1364 +#: pysollib/tile/menubar.py:1362 msgid "XP Native" msgstr "" -#: pysollib/tile/menubar.py:1365 +#: pysollib/tile/menubar.py:1363 msgid "Aqua" msgstr "" -#: pysollib/tile/menubar.py:1383 pysollib/tk/menubar.py:1368 +#: pysollib/tile/menubar.py:1381 pysollib/tk/menubar.py:1365 msgid "Solitaire Wizard" msgstr "Конструктор пасьянсов" -#: pysollib/tile/menubar.py:1394 pysollib/tk/menubar.py:1379 +#: pysollib/tile/menubar.py:1392 pysollib/tk/menubar.py:1376 msgid "" "\n" "Error while saving game.\n" @@ -2912,12 +2908,12 @@ msgstr "Большие колоды" msgid "XLarge cardsets" msgstr "Очень большие колоды" -#: pysollib/tile/selectcardset.py:236 pysollib/tk/menubar.py:1160 +#: pysollib/tile/selectcardset.py:236 pysollib/tk/menubar.py:1157 msgid "&Info..." msgstr "&Информация..." -#: pysollib/tile/selectcardset.py:237 pysollib/tk/menubar.py:1158 -#: pysollib/tk/menubar.py:1160 pysollib/tk/selectcardset.py:241 +#: pysollib/tile/selectcardset.py:237 pysollib/tk/menubar.py:1155 +#: pysollib/tk/menubar.py:1157 pysollib/tk/selectcardset.py:241 msgid "&Load" msgstr "&Загрузить" @@ -2925,10 +2921,10 @@ msgstr "&Загрузить" msgid "About cardset" msgstr "О наборе карт" -#: pysollib/tile/selectcardset.py:327 pysollib/tile/selectgame.py:354 -#: pysollib/tk/selectcardset.py:336 pysollib/tk/selectgame.py:364 +#: pysollib/tile/selectcardset.py:327 pysollib/tile/selectgame.py:390 +#: pysollib/tk/selectcardset.py:336 pysollib/tk/selectgame.py:402 #: pysollib/wizardutil.py:116 pysollib/wizardutil.py:153 -#: pysollib/wizardutil.py:218 pysollib/wizardutil.py:276 +#: pysollib/wizardutil.py:211 pysollib/wizardutil.py:269 msgid "Type:" msgstr "Тип:" @@ -2952,270 +2948,274 @@ msgstr "(нет игр)" msgid "Mahjongg Games" msgstr "Игры маджонг" -#: pysollib/tile/selectgame.py:124 pysollib/tk/selectgame.py:123 +#: pysollib/tile/selectgame.py:125 pysollib/tk/selectgame.py:124 msgid "French games" msgstr "Классические игры" -#: pysollib/tile/selectgame.py:126 pysollib/tk/selectgame.py:125 +#: pysollib/tile/selectgame.py:128 pysollib/tk/selectgame.py:127 msgid "Oriental Games" msgstr "Восточные игры" -#: pysollib/tile/selectgame.py:128 pysollib/tk/selectgame.py:127 +#: pysollib/tile/selectgame.py:131 pysollib/tk/selectgame.py:130 msgid "Special Games" msgstr "Особые игры" -#: pysollib/tile/selectgame.py:130 pysollib/tk/selectgame.py:129 +#: pysollib/tile/selectgame.py:134 pysollib/tk/selectgame.py:133 msgid "Original Games" msgstr "Оригинальные игры" -#: pysollib/tile/selectgame.py:144 pysollib/tk/selectgame.py:143 +#: pysollib/tile/selectgame.py:149 pysollib/tk/selectgame.py:148 msgid "by Compatibility" msgstr "По совместимости с другими программами" -#: pysollib/tile/selectgame.py:152 pysollib/tk/selectgame.py:151 +#: pysollib/tile/selectgame.py:157 pysollib/tk/selectgame.py:157 msgid "New games in v. " msgstr "Новые игры в версии " -#: pysollib/tile/selectgame.py:155 pysollib/tk/selectgame.py:154 +#: pysollib/tile/selectgame.py:160 pysollib/tk/selectgame.py:160 msgid "by PySol version" msgstr "По версии PySol" -#: pysollib/tile/selectgame.py:162 pysollib/tk/selectgame.py:161 +#: pysollib/tile/selectgame.py:166 pysollib/tk/selectgame.py:167 msgid "All Games" msgstr "Все игры" -#: pysollib/tile/selectgame.py:163 pysollib/tk/selectgame.py:162 +#: pysollib/tile/selectgame.py:167 pysollib/tk/selectgame.py:168 msgid "Alternate Names" msgstr "Другие имена" -#: pysollib/tile/selectgame.py:164 pysollib/tk/selectgame.py:163 +#: pysollib/tile/selectgame.py:168 pysollib/tk/selectgame.py:169 msgid "Popular Games" msgstr "Популярные игры" -#: pysollib/tile/selectgame.py:169 pysollib/tk/selectgame.py:168 +#: pysollib/tile/selectgame.py:174 pysollib/tk/selectgame.py:174 +msgid "Custom Games" +msgstr "Самодельные игры" + +#: pysollib/tile/selectgame.py:176 pysollib/tk/selectgame.py:177 msgid "by Skill Level" msgstr "По уровню мастерства" -#: pysollib/tile/selectgame.py:170 pysollib/tile/selectgame.py:523 -#: pysollib/tk/selectgame.py:169 pysollib/tk/selectgame.py:532 +#: pysollib/tile/selectgame.py:177 pysollib/tile/selectgame.py:559 +#: pysollib/tk/selectgame.py:178 pysollib/tk/selectgame.py:570 #: pysollib/wizardutil.py:78 msgid "Luck only" msgstr "Только на везение" -#: pysollib/tile/selectgame.py:171 pysollib/tile/selectgame.py:524 -#: pysollib/tk/selectgame.py:170 pysollib/tk/selectgame.py:533 +#: pysollib/tile/selectgame.py:179 pysollib/tile/selectgame.py:560 +#: pysollib/tk/selectgame.py:180 pysollib/tk/selectgame.py:571 #: pysollib/wizardutil.py:79 msgid "Mostly luck" msgstr "В основном на везение" -#: pysollib/tile/selectgame.py:172 pysollib/tile/selectgame.py:525 -#: pysollib/tk/selectgame.py:171 pysollib/tk/selectgame.py:534 +#: pysollib/tile/selectgame.py:181 pysollib/tile/selectgame.py:561 +#: pysollib/tk/selectgame.py:182 pysollib/tk/selectgame.py:572 #: pysollib/wizardutil.py:80 pysollib/wizardutil.py:84 msgid "Balanced" msgstr "Сбалансированные" -#: pysollib/tile/selectgame.py:173 pysollib/tile/selectgame.py:526 -#: pysollib/tk/selectgame.py:172 pysollib/tk/selectgame.py:535 +#: pysollib/tile/selectgame.py:183 pysollib/tile/selectgame.py:562 +#: pysollib/tk/selectgame.py:184 pysollib/tk/selectgame.py:573 #: pysollib/wizardutil.py:81 msgid "Mostly skill" msgstr "В основном на мастерство" -#: pysollib/tile/selectgame.py:174 pysollib/tile/selectgame.py:527 -#: pysollib/tk/selectgame.py:173 pysollib/tk/selectgame.py:536 +#: pysollib/tile/selectgame.py:185 pysollib/tile/selectgame.py:563 +#: pysollib/tk/selectgame.py:186 pysollib/tk/selectgame.py:574 #: pysollib/wizardutil.py:82 msgid "Skill only" msgstr "Только на мастерство" -#: pysollib/tile/selectgame.py:176 pysollib/tk/selectgame.py:175 +#: pysollib/tile/selectgame.py:188 pysollib/tk/selectgame.py:189 msgid "by Game Feature" msgstr "По особенностям игры" -#: pysollib/tile/selectgame.py:177 pysollib/tk/selectgame.py:176 +#: pysollib/tile/selectgame.py:189 pysollib/tk/selectgame.py:190 msgid "by Number of Cards" msgstr "По количеству карт" -#: pysollib/tile/selectgame.py:178 pysollib/tk/selectgame.py:177 +#: pysollib/tile/selectgame.py:190 pysollib/tk/selectgame.py:191 msgid "32 cards" msgstr "32 карты" -#: pysollib/tile/selectgame.py:179 pysollib/tk/selectgame.py:178 +#: pysollib/tile/selectgame.py:192 pysollib/tk/selectgame.py:193 msgid "48 cards" msgstr "48 карт" -#: pysollib/tile/selectgame.py:180 pysollib/tk/selectgame.py:179 +#: pysollib/tile/selectgame.py:194 pysollib/tk/selectgame.py:195 msgid "52 cards" msgstr "52 карты" -#: pysollib/tile/selectgame.py:181 pysollib/tk/selectgame.py:180 +#: pysollib/tile/selectgame.py:196 pysollib/tk/selectgame.py:197 msgid "64 cards" msgstr "64 карты" -#: pysollib/tile/selectgame.py:182 pysollib/tk/selectgame.py:181 +#: pysollib/tile/selectgame.py:198 pysollib/tk/selectgame.py:199 msgid "78 cards" msgstr "78 карт" -#: pysollib/tile/selectgame.py:183 pysollib/tk/selectgame.py:182 +#: pysollib/tile/selectgame.py:200 pysollib/tk/selectgame.py:201 msgid "104 cards" msgstr "104 карты" -#: pysollib/tile/selectgame.py:184 pysollib/tk/selectgame.py:183 +#: pysollib/tile/selectgame.py:202 pysollib/tk/selectgame.py:203 msgid "144 cards" msgstr "144 карты" -#: pysollib/tile/selectgame.py:185 pysollib/tk/selectgame.py:184 +#: pysollib/tile/selectgame.py:204 pysollib/tk/selectgame.py:205 msgid "Other number" msgstr "Другое количество" -#: pysollib/tile/selectgame.py:187 pysollib/tk/selectgame.py:186 +#: pysollib/tile/selectgame.py:207 pysollib/tk/selectgame.py:208 msgid "by Number of Decks" msgstr "По количеству колод" -#: pysollib/tile/selectgame.py:188 pysollib/tk/selectgame.py:187 +#: pysollib/tile/selectgame.py:208 pysollib/tk/selectgame.py:209 msgid "1 deck games" msgstr "Игры с 1 колодой" -#: pysollib/tile/selectgame.py:189 pysollib/tk/selectgame.py:188 +#: pysollib/tile/selectgame.py:210 pysollib/tk/selectgame.py:211 msgid "2 deck games" msgstr "Игры с 2 колодами" -#: pysollib/tile/selectgame.py:190 pysollib/tk/selectgame.py:189 +#: pysollib/tile/selectgame.py:212 pysollib/tk/selectgame.py:213 msgid "3 deck games" msgstr "Игры с 3 колодами" -#: pysollib/tile/selectgame.py:191 pysollib/tk/selectgame.py:190 +#: pysollib/tile/selectgame.py:214 pysollib/tk/selectgame.py:215 msgid "4 deck games" msgstr "Игры с 4 колодами" -#: pysollib/tile/selectgame.py:193 pysollib/tk/selectgame.py:192 +#: pysollib/tile/selectgame.py:217 pysollib/tk/selectgame.py:218 msgid "by Number of Redeals" msgstr "По количеству пересдач" -#: pysollib/tile/selectgame.py:194 pysollib/tk/selectgame.py:193 +#: pysollib/tile/selectgame.py:218 pysollib/tk/selectgame.py:219 msgid "No redeal" msgstr "Без пересдачи" -#: pysollib/tile/selectgame.py:195 pysollib/tk/selectgame.py:194 +#: pysollib/tile/selectgame.py:220 pysollib/tk/selectgame.py:221 msgid "1 redeal" msgstr "1 пересдача" -#: pysollib/tile/selectgame.py:196 pysollib/tk/selectgame.py:195 +#: pysollib/tile/selectgame.py:222 pysollib/tk/selectgame.py:223 msgid "2 redeals" msgstr "2 пересдачи" -#: pysollib/tile/selectgame.py:197 pysollib/tk/selectgame.py:196 +#: pysollib/tile/selectgame.py:224 pysollib/tk/selectgame.py:225 msgid "3 redeals" msgstr "3 пересдачи" -#: pysollib/tile/selectgame.py:198 pysollib/tk/selectgame.py:197 +#: pysollib/tile/selectgame.py:226 pysollib/tk/selectgame.py:227 #: pysollib/wizardutil.py:124 msgid "Unlimited redeals" msgstr "Неограниченное количество пересдач" -#: pysollib/tile/selectgame.py:200 pysollib/tk/selectgame.py:199 +#: pysollib/tile/selectgame.py:230 pysollib/tk/selectgame.py:231 msgid "Other number of redeals" msgstr "Другое количество пересдач" -#: pysollib/tile/selectgame.py:205 pysollib/tk/selectgame.py:204 +#: pysollib/tile/selectgame.py:236 pysollib/tk/selectgame.py:237 msgid "Other Categories" msgstr "Другие категории" -#: pysollib/tile/selectgame.py:206 pysollib/tk/selectgame.py:205 +#: pysollib/tile/selectgame.py:237 pysollib/tk/selectgame.py:238 msgid "Games for Children (very easy)" msgstr "Игры для детей (очень лёгкие)" -#: pysollib/tile/selectgame.py:207 pysollib/tk/selectgame.py:206 +#: pysollib/tile/selectgame.py:239 pysollib/tk/selectgame.py:240 msgid "Games with Scoring" msgstr "Игры со счётом" -#: pysollib/tile/selectgame.py:208 pysollib/tk/selectgame.py:207 +#: pysollib/tile/selectgame.py:241 pysollib/tk/selectgame.py:242 msgid "Games with Separate Decks" msgstr "Игры с раздельными колодами" -#: pysollib/tile/selectgame.py:209 pysollib/tk/selectgame.py:208 +#: pysollib/tile/selectgame.py:243 pysollib/tk/selectgame.py:244 msgid "Open Games (all cards visible)" msgstr "Открытые игры (все карты видны)" -#: pysollib/tile/selectgame.py:210 pysollib/tk/selectgame.py:209 +#: pysollib/tile/selectgame.py:245 pysollib/tk/selectgame.py:246 msgid "Relaxed Variants" msgstr "Облегчённые варианты" -#: pysollib/tile/selectgame.py:341 pysollib/tk/selectgame.py:348 +#: pysollib/tile/selectgame.py:377 pysollib/tk/selectgame.py:386 msgid "About game" msgstr "Об игре " -#: pysollib/tile/selectgame.py:351 pysollib/tk/selectgame.py:361 +#: pysollib/tile/selectgame.py:387 pysollib/tk/selectgame.py:399 #: pysollib/wizardutil.py:74 msgid "Name:" msgstr "Имя:" -#: pysollib/tile/selectgame.py:352 pysollib/tk/selectgame.py:362 +#: pysollib/tile/selectgame.py:388 pysollib/tk/selectgame.py:400 msgid "Alternate names:" msgstr "Другие имена:" -#: pysollib/tile/selectgame.py:353 pysollib/tk/selectgame.py:363 +#: pysollib/tile/selectgame.py:389 pysollib/tk/selectgame.py:401 msgid "Category:" msgstr "Категория:" -#: pysollib/tile/selectgame.py:355 pysollib/tk/selectgame.py:365 +#: pysollib/tile/selectgame.py:391 pysollib/tk/selectgame.py:403 #: pysollib/wizardutil.py:85 msgid "Skill level:" msgstr "Уровень мастерства:" -#: pysollib/tile/selectgame.py:356 pysollib/tk/selectgame.py:366 +#: pysollib/tile/selectgame.py:392 pysollib/tk/selectgame.py:404 msgid "Decks:" msgstr "Колод:" -#: pysollib/tile/selectgame.py:357 pysollib/tk/selectgame.py:367 +#: pysollib/tile/selectgame.py:393 pysollib/tk/selectgame.py:405 msgid "Redeals:" msgstr "Пересдач:" -#: pysollib/tile/selectgame.py:359 pysollib/tk/selectgame.py:369 +#: pysollib/tile/selectgame.py:395 pysollib/tk/selectgame.py:407 msgid "Played:" msgstr "Играл:" -#: pysollib/tile/selectgame.py:360 pysollib/tile/tkstats.py:203 -#: pysollib/tile/tkstats.py:255 pysollib/tk/selectgame.py:370 +#: pysollib/tile/selectgame.py:396 pysollib/tile/tkstats.py:203 +#: pysollib/tile/tkstats.py:255 pysollib/tk/selectgame.py:408 #: pysollib/tk/tkstats.py:112 pysollib/tk/tkstats.py:164 #: data/glade-translations:9 data/glade-translations:13 msgid "Won:" msgstr "Выиграл:" -#: pysollib/tile/selectgame.py:361 pysollib/tile/tkstats.py:204 -#: pysollib/tile/tkstats.py:257 pysollib/tk/selectgame.py:371 +#: pysollib/tile/selectgame.py:397 pysollib/tile/tkstats.py:204 +#: pysollib/tile/tkstats.py:257 pysollib/tk/selectgame.py:409 #: pysollib/tk/tkstats.py:113 pysollib/tk/tkstats.py:165 #: data/glade-translations:11 data/glade-translations:14 msgid "Lost:" msgstr "Проиграл:" -#: pysollib/tile/selectgame.py:362 pysollib/tile/tkstats.py:775 -#: pysollib/tk/selectgame.py:372 pysollib/tk/tkstats.py:739 +#: pysollib/tile/selectgame.py:398 pysollib/tile/tkstats.py:777 +#: pysollib/tk/selectgame.py:410 pysollib/tk/tkstats.py:735 #: data/glade-translations:18 msgid "Playing time:" msgstr "Игровое время:" -#: pysollib/tile/selectgame.py:363 pysollib/tile/tkstats.py:782 -#: pysollib/tk/selectgame.py:373 pysollib/tk/tkstats.py:746 +#: pysollib/tile/selectgame.py:399 pysollib/tile/tkstats.py:784 +#: pysollib/tk/selectgame.py:411 pysollib/tk/tkstats.py:742 #: data/glade-translations:19 msgid "Moves:" msgstr "Ходов:" -#: pysollib/tile/selectgame.py:364 pysollib/tk/selectgame.py:374 +#: pysollib/tile/selectgame.py:400 pysollib/tk/selectgame.py:412 msgid "% won:" msgstr "% побед:" -#: pysollib/tile/selectgame.py:396 pysollib/tk/selectgame.py:406 +#: pysollib/tile/selectgame.py:432 pysollib/tk/selectgame.py:444 msgid "&Rules" msgstr "&Правила" -#: pysollib/tile/selectgame.py:476 pysollib/tk/selectgame.py:485 +#: pysollib/tile/selectgame.py:512 pysollib/tk/selectgame.py:523 msgid "Playable Preview - " msgstr "Играемый предпросмотр - " -#: pysollib/tile/selectgame.py:530 pysollib/tk/selectgame.py:539 +#: pysollib/tile/selectgame.py:566 pysollib/tk/selectgame.py:577 msgid "variable" msgstr "переменное кол-во" -#: pysollib/tile/selectgame.py:531 pysollib/tk/selectgame.py:540 +#: pysollib/tile/selectgame.py:567 pysollib/tk/selectgame.py:578 msgid "unlimited" msgstr "неограниченное кол-во" @@ -3308,11 +3308,14 @@ msgstr "&Играть" msgid "&Start" msgstr "Н&ачать" -#: pysollib/tile/solverdialog.py:274 pysollib/tk/solverdialog.py:277 -msgid "This game is solveable in %s moves." -msgstr "Игра может быть решена за %s ходов." +#: pysollib/tile/solverdialog.py:276 pysollib/tk/solverdialog.py:279 +msgid "This game is solveable in %d move." +msgid_plural "This game is solveable in %d moves." +msgstr[0] "Игра может быть решена за %d ход." +msgstr[1] "Игра может быть решена за %d хода." +msgstr[2] "Игра может быть решена за %d ходов." -#: pysollib/tile/solverdialog.py:277 pysollib/tk/solverdialog.py:280 +#: pysollib/tile/solverdialog.py:282 pysollib/tk/solverdialog.py:285 msgid "I could not solve this game." msgstr "Не смог решить игру." @@ -3435,11 +3438,11 @@ msgstr "" "Изменения установок DirectX вступят в силу\n" "при следующем запуске " -#: pysollib/tile/statusbar.py:151 pysollib/tk/statusbar.py:162 +#: pysollib/tile/statusbar.py:151 pysollib/tk/statusbar.py:160 msgid "Moves/Total moves" msgstr "Ходов/Всего ходов" -#: pysollib/tile/statusbar.py:153 pysollib/tk/statusbar.py:164 +#: pysollib/tile/statusbar.py:153 pysollib/tk/statusbar.py:162 msgid "Games played: won/lost" msgstr "Игр: выиграно/проиграно" @@ -3468,19 +3471,19 @@ msgstr "Подсветка карты:" msgid "Highlight same rank:" msgstr "Подсветка одинаковых карт:" -#: pysollib/tile/tkconst.py:106 pysollib/tk/tkconst.py:104 +#: pysollib/tile/tkconst.py:84 pysollib/tk/tkconst.py:83 msgid "Icons only" msgstr "Только пиктограммы" -#: pysollib/tile/tkconst.py:107 pysollib/tk/tkconst.py:105 +#: pysollib/tile/tkconst.py:85 pysollib/tk/tkconst.py:84 msgid "Text below icons" msgstr "Текст под пиктограммами" -#: pysollib/tile/tkconst.py:108 pysollib/tk/tkconst.py:106 +#: pysollib/tile/tkconst.py:86 pysollib/tk/tkconst.py:85 msgid "Text beside icons" msgstr "Текст рядом с пиктограммами" -#: pysollib/tile/tkconst.py:109 pysollib/tk/tkconst.py:107 +#: pysollib/tile/tkconst.py:87 pysollib/tk/tkconst.py:86 msgid "Text only" msgstr "Только текст" @@ -3521,14 +3524,14 @@ msgstr "" msgid "Unable to service request:\n" msgstr "Невозможно выполнить запрос:\n" -#: pysollib/tile/tkstats.py:93 pysollib/tile/tkstats.py:739 -#: pysollib/tile/tkstats.py:881 pysollib/tk/tkstats.py:908 +#: pysollib/tile/tkstats.py:93 pysollib/tile/tkstats.py:741 +#: pysollib/tile/tkstats.py:883 pysollib/tk/tkstats.py:904 #: data/glade-translations:17 msgid "Current game" msgstr "Текущая игра" -#: pysollib/tile/tkstats.py:97 pysollib/tile/tkstats.py:747 -#: pysollib/tile/tkstats.py:876 pysollib/tk/tkstats.py:902 +#: pysollib/tile/tkstats.py:97 pysollib/tile/tkstats.py:749 +#: pysollib/tile/tkstats.py:878 pysollib/tk/tkstats.py:898 #: data/glade-translations:30 msgid "All games" msgstr "Все игры" @@ -3569,28 +3572,28 @@ msgstr "Всего:" msgid "No games" msgstr "Нет игр" -#: pysollib/tile/tkstats.py:514 +#: pysollib/tile/tkstats.py:516 msgid "Log" msgstr "Лог" -#: pysollib/tile/tkstats.py:545 pysollib/tk/tkstats.py:516 -#: pysollib/tk/tkstats.py:582 pysollib/tk/tkstats.py:597 +#: pysollib/tile/tkstats.py:547 pysollib/tk/tkstats.py:512 +#: pysollib/tk/tkstats.py:578 pysollib/tk/tkstats.py:593 msgid "&Save to file" msgstr "&Сохранить в файл" -#: pysollib/tile/tkstats.py:615 pysollib/tk/tkstats.py:612 +#: pysollib/tile/tkstats.py:617 pysollib/tk/tkstats.py:608 msgid "Highlight piles: " msgstr "Подсветка групп: " -#: pysollib/tile/tkstats.py:616 pysollib/tk/tkstats.py:613 +#: pysollib/tile/tkstats.py:618 pysollib/tk/tkstats.py:609 msgid "Highlight cards: " msgstr "Подсветка карт: " -#: pysollib/tile/tkstats.py:617 pysollib/tk/tkstats.py:614 +#: pysollib/tile/tkstats.py:619 pysollib/tk/tkstats.py:610 msgid "Highlight same rank: " msgstr "Подсветка карт одного достоинства: " -#: pysollib/tile/tkstats.py:620 pysollib/tk/tkstats.py:617 +#: pysollib/tile/tkstats.py:622 pysollib/tk/tkstats.py:613 msgid "" "\n" "Redeals: " @@ -3598,7 +3601,7 @@ msgstr "" "\n" "Раздач: " -#: pysollib/tile/tkstats.py:621 pysollib/tk/tkstats.py:618 +#: pysollib/tile/tkstats.py:623 pysollib/tk/tkstats.py:614 msgid "" "\n" "Cards in Talon: " @@ -3606,7 +3609,7 @@ msgstr "" "\n" "Карт в колоде: " -#: pysollib/tile/tkstats.py:623 pysollib/tk/tkstats.py:620 +#: pysollib/tile/tkstats.py:625 pysollib/tk/tkstats.py:616 msgid "" "\n" "Cards in Waste: " @@ -3614,7 +3617,7 @@ msgstr "" "\n" "Карт в сбросе: " -#: pysollib/tile/tkstats.py:625 pysollib/tk/tkstats.py:622 +#: pysollib/tile/tkstats.py:627 pysollib/tk/tkstats.py:618 msgid "" "\n" "Cards in Foundations: " @@ -3622,114 +3625,114 @@ msgstr "" "\n" "Карт на базовых ячейках: " -#: pysollib/tile/tkstats.py:629 pysollib/tk/tkstats.py:625 +#: pysollib/tile/tkstats.py:631 pysollib/tk/tkstats.py:621 msgid "Game status" msgstr "Статус игры" -#: pysollib/tile/tkstats.py:632 pysollib/tk/tkstats.py:628 +#: pysollib/tile/tkstats.py:634 pysollib/tk/tkstats.py:624 msgid "Playing time: " msgstr "Игровое время: " -#: pysollib/tile/tkstats.py:633 pysollib/tk/tkstats.py:629 +#: pysollib/tile/tkstats.py:635 pysollib/tk/tkstats.py:625 msgid "Started at: " msgstr "Игра начата: " -#: pysollib/tile/tkstats.py:634 pysollib/tk/tkstats.py:630 +#: pysollib/tile/tkstats.py:636 pysollib/tk/tkstats.py:626 msgid "Moves: " msgstr "Ходов: " -#: pysollib/tile/tkstats.py:635 pysollib/tk/tkstats.py:631 +#: pysollib/tile/tkstats.py:637 pysollib/tk/tkstats.py:627 msgid "Undo moves: " msgstr "Отменено ходов: " -#: pysollib/tile/tkstats.py:636 pysollib/tk/tkstats.py:632 +#: pysollib/tile/tkstats.py:638 pysollib/tk/tkstats.py:628 msgid "Bookmark moves: " msgstr "Ходов по закладкам: " -#: pysollib/tile/tkstats.py:637 pysollib/tk/tkstats.py:633 +#: pysollib/tile/tkstats.py:639 pysollib/tk/tkstats.py:629 msgid "Demo moves: " msgstr "Демо ходов: " -#: pysollib/tile/tkstats.py:638 pysollib/tk/tkstats.py:634 +#: pysollib/tile/tkstats.py:640 pysollib/tk/tkstats.py:630 msgid "Total player moves: " msgstr "Всего ходов игрока:" -#: pysollib/tile/tkstats.py:639 pysollib/tk/tkstats.py:635 +#: pysollib/tile/tkstats.py:641 pysollib/tk/tkstats.py:631 msgid "Total moves in this game: " msgstr "Всего ходов в этой игре: " -#: pysollib/tile/tkstats.py:640 pysollib/tk/tkstats.py:636 +#: pysollib/tile/tkstats.py:642 pysollib/tk/tkstats.py:632 msgid "Hints: " msgstr "Подсказок: " -#: pysollib/tile/tkstats.py:669 pysollib/tk/tkstats.py:666 +#: pysollib/tile/tkstats.py:671 pysollib/tk/tkstats.py:662 msgid "N" msgstr "N" -#: pysollib/tile/tkstats.py:682 pysollib/tk/tkstats.py:675 +#: pysollib/tile/tkstats.py:684 pysollib/tk/tkstats.py:671 msgid "Result" msgstr "Результат" -#: pysollib/tile/tkstats.py:744 pysollib/tk/tkstats.py:784 +#: pysollib/tile/tkstats.py:746 pysollib/tk/tkstats.py:780 msgid "No TOP for this game" msgstr "TOP для текущей игры отсутствует" -#: pysollib/tile/tkstats.py:752 +#: pysollib/tile/tkstats.py:754 msgid "No TOP for all games" msgstr "TOP для всех игр отсутствует" -#: pysollib/tile/tkstats.py:763 pysollib/tk/tkstats.py:731 +#: pysollib/tile/tkstats.py:765 pysollib/tk/tkstats.py:727 #: data/glade-translations:21 msgid "Minimum" msgstr "Минимум" -#: pysollib/tile/tkstats.py:765 pysollib/tk/tkstats.py:732 +#: pysollib/tile/tkstats.py:767 pysollib/tk/tkstats.py:728 #: data/glade-translations:22 msgid "Maximum" msgstr "Максимум" -#: pysollib/tile/tkstats.py:767 pysollib/tk/tkstats.py:733 +#: pysollib/tile/tkstats.py:769 pysollib/tk/tkstats.py:729 #: data/glade-translations:23 msgid "Average" msgstr "Среднее" -#: pysollib/tile/tkstats.py:789 pysollib/tk/tkstats.py:753 +#: pysollib/tile/tkstats.py:791 pysollib/tk/tkstats.py:749 #: data/glade-translations:20 msgid "Total moves:" msgstr "Всего ходов:" -#: pysollib/tile/tkstats.py:886 pysollib/tk/tkstats.py:915 +#: pysollib/tile/tkstats.py:888 pysollib/tk/tkstats.py:911 msgid "Statistics for" msgstr "Статистика за" -#: pysollib/tile/tkstats.py:891 pysollib/tk/tkstats.py:922 +#: pysollib/tile/tkstats.py:893 pysollib/tk/tkstats.py:918 msgid "Last 7 days" msgstr "Последние 7 дней" -#: pysollib/tile/tkstats.py:892 pysollib/tk/tkstats.py:923 +#: pysollib/tile/tkstats.py:894 pysollib/tk/tkstats.py:919 msgid "Last month" msgstr "Последний месяц" -#: pysollib/tile/tkstats.py:893 pysollib/tk/tkstats.py:924 +#: pysollib/tile/tkstats.py:895 pysollib/tk/tkstats.py:920 msgid "Last year" msgstr "Последний год" -#: pysollib/tile/tkstats.py:894 pysollib/tk/tkstats.py:925 +#: pysollib/tile/tkstats.py:896 pysollib/tk/tkstats.py:921 msgid "All time" msgstr "Всё время" -#: pysollib/tile/tkstats.py:900 pysollib/tk/tkstats.py:933 +#: pysollib/tile/tkstats.py:902 pysollib/tk/tkstats.py:929 msgid "Show graphs" msgstr "Показывать графики" -#: pysollib/tile/tkstats.py:948 pysollib/tile/tkstats.py:964 -#: pysollib/tile/tkstats.py:1003 pysollib/tk/tkstats.py:856 -#: pysollib/tk/tkstats.py:872 pysollib/tk/tkstats.py:984 +#: pysollib/tile/tkstats.py:950 pysollib/tile/tkstats.py:966 +#: pysollib/tile/tkstats.py:1005 pysollib/tk/tkstats.py:852 +#: pysollib/tk/tkstats.py:868 pysollib/tk/tkstats.py:980 msgid "Games/day" msgstr "Игр за день" -#: pysollib/tile/tkstats.py:949 pysollib/tile/tkstats.py:1005 -#: pysollib/tk/tkstats.py:857 pysollib/tk/tkstats.py:986 +#: pysollib/tile/tkstats.py:951 pysollib/tile/tkstats.py:1007 +#: pysollib/tk/tkstats.py:853 pysollib/tk/tkstats.py:982 msgid "Games/week" msgstr "Игр за неделю" @@ -3825,27 +3828,27 @@ msgstr "Установки игрока" msgid "Toolbar" msgstr "Панель инструментов" -#: pysollib/tk/menubar.py:415 +#: pysollib/tk/menubar.py:412 msgid "&Statistics" msgstr "Ст&атистика" -#: pysollib/tk/menubar.py:416 pysollib/tk/menubar.py:425 +#: pysollib/tk/menubar.py:413 pysollib/tk/menubar.py:422 msgid "Current game..." msgstr "Текущая игра..." -#: pysollib/tk/menubar.py:417 pysollib/tk/menubar.py:426 +#: pysollib/tk/menubar.py:414 pysollib/tk/menubar.py:423 msgid "All games..." msgstr "Все игры..." -#: pysollib/tk/menubar.py:419 +#: pysollib/tk/menubar.py:416 msgid "Session log..." msgstr "Лог сессии..." -#: pysollib/tk/menubar.py:420 +#: pysollib/tk/menubar.py:417 msgid "Full log..." msgstr "Полный лог..." -#: pysollib/tk/menubar.py:423 +#: pysollib/tk/menubar.py:420 msgid "Progression..." msgstr "Прогресс..." @@ -3865,43 +3868,43 @@ msgstr "Включить звуки" msgid "&All games..." msgstr "&Все игры..." -#: pysollib/tk/tkstats.py:517 +#: pysollib/tk/tkstats.py:513 msgid "&Reset all..." msgstr "О&чистить все..." -#: pysollib/tk/tkstats.py:582 +#: pysollib/tk/tkstats.py:578 msgid "Session &log..." msgstr "&Лог сессии..." -#: pysollib/tk/tkstats.py:597 +#: pysollib/tk/tkstats.py:593 msgid "&Full log..." msgstr "&Полный лог..." -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Club" msgstr "Треф" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Diamond" msgstr "Буби" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Heart" msgstr "Черви" -#: pysollib/util.py:82 +#: pysollib/util.py:81 msgid "Spade" msgstr "Пики" -#: pysollib/util.py:83 +#: pysollib/util.py:82 msgid "black" msgstr "чёрный" -#: pysollib/util.py:83 +#: pysollib/util.py:82 msgid "red" msgstr "красный" -#: pysollib/util.py:108 +#: pysollib/util.py:107 msgid "cardset" msgstr "набор карт" @@ -3966,7 +3969,7 @@ msgid "Layout:" msgstr "Раскладка:" #: pysollib/wizardutil.py:108 pysollib/wizardutil.py:115 -#: pysollib/wizardutil.py:345 +#: pysollib/wizardutil.py:337 msgid "Initial dealing" msgstr "Начальная раздача" @@ -4012,175 +4015,175 @@ msgstr "Кол-во карт сдающихся на сброс:" #: pysollib/wizardutil.py:140 msgid "Shuffle during redeal:" -msgstr "Тасовать при пересдачи:" +msgstr "Тасовать при пересдаче:" #: pysollib/wizardutil.py:145 pysollib/wizardutil.py:152 -#: pysollib/wizardutil.py:199 +#: pysollib/wizardutil.py:192 msgid "Same suit" msgstr "В соответствии с мастью" -#: pysollib/wizardutil.py:146 pysollib/wizardutil.py:200 -#: pysollib/wizardutil.py:217 +#: pysollib/wizardutil.py:146 pysollib/wizardutil.py:193 +#: pysollib/wizardutil.py:210 msgid "Alternate color" msgstr "Чередуя цвет" -#: pysollib/wizardutil.py:147 pysollib/wizardutil.py:201 +#: pysollib/wizardutil.py:147 pysollib/wizardutil.py:194 msgid "Same color" msgstr "В соответствии с цветом" -#: pysollib/wizardutil.py:148 pysollib/wizardutil.py:202 +#: pysollib/wizardutil.py:148 pysollib/wizardutil.py:195 msgid "Rank" msgstr "В соответствии с достоинством" -#: pysollib/wizardutil.py:149 pysollib/wizardutil.py:210 +#: pysollib/wizardutil.py:149 pysollib/wizardutil.py:203 msgid "Spider same suit" msgstr "Паук в соответствии с мастью" -#: pysollib/wizardutil.py:150 pysollib/wizardutil.py:211 +#: pysollib/wizardutil.py:150 pysollib/wizardutil.py:204 msgid "Spider alternate color" msgstr "Паук чередуя цвет" -#: pysollib/wizardutil.py:159 pysollib/wizardutil.py:224 -#: pysollib/wizardutil.py:227 +#: pysollib/wizardutil.py:159 pysollib/wizardutil.py:217 +#: pysollib/wizardutil.py:220 msgid "Any" msgstr "Любая" -#: pysollib/wizardutil.py:162 pysollib/wizardutil.py:228 +#: pysollib/wizardutil.py:162 pysollib/wizardutil.py:221 msgid "Base card:" msgstr "Базовая карта:" #: pysollib/wizardutil.py:166 pysollib/wizardutil.py:167 -#: pysollib/wizardutil.py:232 +#: pysollib/wizardutil.py:225 msgid "Up" msgstr "Вверх" -#: pysollib/wizardutil.py:166 pysollib/wizardutil.py:232 -#: pysollib/wizardutil.py:233 +#: pysollib/wizardutil.py:166 pysollib/wizardutil.py:225 +#: pysollib/wizardutil.py:226 msgid "Down" msgstr "Вниз" -#: pysollib/wizardutil.py:168 pysollib/wizardutil.py:234 +#: pysollib/wizardutil.py:168 pysollib/wizardutil.py:227 msgid "Direction:" msgstr "Направление:" -#: pysollib/wizardutil.py:174 pysollib/wizardutil.py:246 -msgid "Wrapping:" -msgstr "Оборачивание:" - -#: pysollib/wizardutil.py:179 pysollib/wizardutil.py:180 -#: pysollib/wizardutil.py:238 +#: pysollib/wizardutil.py:172 pysollib/wizardutil.py:173 +#: pysollib/wizardutil.py:231 msgid "Top card" msgstr "Верхнюю карту" -#: pysollib/wizardutil.py:179 pysollib/wizardutil.py:225 +#: pysollib/wizardutil.py:172 pysollib/wizardutil.py:218 msgid "None" msgstr "Нет" -#: pysollib/wizardutil.py:181 pysollib/wizardutil.py:240 +#: pysollib/wizardutil.py:174 pysollib/wizardutil.py:233 msgid "Move:" msgstr "Перемещать:" -#: pysollib/wizardutil.py:187 +#: pysollib/wizardutil.py:180 msgid "First card sets base cards:" msgstr "Первая карта устанавливает базовые карты:" -#: pysollib/wizardutil.py:195 +#: pysollib/wizardutil.py:188 msgid "Number of tableau piles:" msgstr "Количество ячеек на игровом столе:" -#: pysollib/wizardutil.py:203 +#: pysollib/wizardutil.py:196 msgid "Any suit but the same" msgstr "Любая масть кроме такой же" -#: pysollib/wizardutil.py:205 +#: pysollib/wizardutil.py:198 msgid "Up or down by same suit" msgstr "По возрастанию или убыванию в соответствии с мастью" -#: pysollib/wizardutil.py:206 +#: pysollib/wizardutil.py:199 msgid "Up or down by alternate color" msgstr "По возрастанию или убыванию чередуя цвет" -#: pysollib/wizardutil.py:207 +#: pysollib/wizardutil.py:200 msgid "Up or down by rank" msgstr "По возрастанию или убыванию в соответствии с достоинством" -#: pysollib/wizardutil.py:208 +#: pysollib/wizardutil.py:201 msgid "Up or down by same color" msgstr "По возрастанию или убыванию в соответствии с цветом" -#: pysollib/wizardutil.py:213 +#: pysollib/wizardutil.py:206 msgid "Yukon same suit" msgstr "Юкон в соответствии с мастью" -#: pysollib/wizardutil.py:214 +#: pysollib/wizardutil.py:207 msgid "Yukon alternate color" msgstr "Юкон чередуя цвет" -#: pysollib/wizardutil.py:215 +#: pysollib/wizardutil.py:208 msgid "Yukon rank" msgstr "Юкон в соответствии с достоинством" -#: pysollib/wizardutil.py:238 pysollib/wizardutil.py:239 +#: pysollib/wizardutil.py:231 pysollib/wizardutil.py:232 msgid "Sequence" msgstr "Последовательность" -#: pysollib/wizardutil.py:253 +#: pysollib/wizardutil.py:239 +msgid "Wrapping:" +msgstr "Оборачивание:" + +#: pysollib/wizardutil.py:246 msgid "Use \"Super Move\" feature:" msgstr "Использовать \"Super Move\"" -#: pysollib/wizardutil.py:261 +#: pysollib/wizardutil.py:254 msgid "Number of reserves:" msgstr "Количество резервных ячеек" -#: pysollib/wizardutil.py:268 +#: pysollib/wizardutil.py:261 msgid "Max # of accepted cards:" msgstr "Максимальное кол-во принимаемых карт:" -#: pysollib/wizardutil.py:272 +#: pysollib/wizardutil.py:265 msgid "Triangle" msgstr "Треугольник" -#: pysollib/wizardutil.py:273 pysollib/wizardutil.py:275 +#: pysollib/wizardutil.py:266 pysollib/wizardutil.py:268 msgid "Rectangle" msgstr "" -#: pysollib/wizardutil.py:283 +#: pysollib/wizardutil.py:276 msgid "# of face-down cards dealt to the tableau pile:" msgstr "Кол-во закрытых карт сдающихся на ячейку игрового стола:" -#: pysollib/wizardutil.py:290 +#: pysollib/wizardutil.py:283 msgid "# of face-up cards dealt to the tableau pile:" msgstr "Кол-во открытых карт сдающихся на ячейку игрового стола:" -#: pysollib/wizardutil.py:297 +#: pysollib/wizardutil.py:290 msgid "# of cards dealt to the reserve:" msgstr "Кол-во карт сдающихся на резервную ячейку:" -#: pysollib/wizardutil.py:304 +#: pysollib/wizardutil.py:297 msgid "Max # of dealt cards:" msgstr "Максимальное кол-во сдающихся карт:" -#: pysollib/wizardutil.py:310 +#: pysollib/wizardutil.py:303 msgid "Deal first cards to the foundations:" msgstr "Сдавать первую карту на базовые ячейки:" -#: pysollib/wizardutil.py:316 +#: pysollib/wizardutil.py:309 msgid "General" msgstr "Общие установки" -#: pysollib/wizardutil.py:322 +#: pysollib/wizardutil.py:315 msgid "Talon" msgstr "Талон" -#: pysollib/wizardutil.py:327 +#: pysollib/wizardutil.py:320 msgid "Foundations" msgstr "Базовые ячейки" -#: pysollib/wizardutil.py:334 +#: pysollib/wizardutil.py:326 msgid "Tableau" msgstr "Игровой стол" -#: pysollib/wizardutil.py:342 +#: pysollib/wizardutil.py:334 msgid "Reserves" msgstr "Резервные ячейки" @@ -4200,79 +4203,11 @@ msgstr "Всего ходов" msgid "Set font" msgstr "Настроить шрифт" -#~ msgid "" -#~ " Free\n" -#~ "Matching\n" -#~ "Pairs" -#~ msgstr "" -#~ " \n" -#~ "свободных\n" -#~ "пар" +#~ msgid "Style" +#~ msgstr "Стиль" -#~ msgid " cards" -#~ msgstr " карт" +#~ msgid "Small icons" +#~ msgstr "Маленькие пиктограммы" -#~ msgid "No redeals." -#~ msgstr "Без пересдачи." - -#~ msgid "One redeal." -#~ msgstr "1 пересдача." - -#~ msgid " redeals." -#~ msgstr " пересдачи." - -#, fuzzy -#~ msgid "apple" -#~ msgstr "Клён" - -#~ msgid "Customize toolbar" -#~ msgstr "Настроить панель инструментов" - -#~ msgid "&Timer based" -#~ msgstr "Базирующаяся на &таймере" - -#~ msgid "Relief" -#~ msgstr "Рельеф" - -#~ msgid "Flat" -#~ msgstr "Плоский" - -#~ msgid "Raised" -#~ msgstr "Выпуклый" - -#~ msgid "" -#~ "\n" -#~ "and #%d in the %s of total moves" -#~ msgstr "" -#~ "\n" -#~ "и #%d в %s общего количества ходов" - -#~ msgid "" -#~ "\n" -#~ "You have reached\n" -#~ "#%d in the %s of total moves" -#~ msgstr "" -#~ "\n" -#~ "Вы достигли\n" -#~ "#%d в %s общего количества ходов" - -#~ msgid "%s installation problem" -#~ msgstr "%s проблема с установкой" - -#~ msgid "" -#~ "Your Python installation is compiled without thread support.\n" -#~ "\n" -#~ "Sounds and background music will be disabled." -#~ msgstr "" -#~ "Ваш дистрибутив Python собран без поддержки нитей.\n" -#~ "\n" -#~ "Звук и фоновая музыка будут недоступны." - -#~ msgid "" -#~ "The pysolsoundserver module was not found.\n" -#~ "\n" -#~ "Sounds and background music will be disabled." -#~ msgstr "" -#~ "Модуль pysolsoundserver не найден.\n" -#~ "\n" -#~ "Звук и фоновая музыка будут недоступны." +#~ msgid "Large icons" +#~ msgstr "Большие пиктограммы" diff --git a/pysollib/actions.py b/pysollib/actions.py index a60532c6..3ea9f165 100644 --- a/pysollib/actions.py +++ b/pysollib/actions.py @@ -212,13 +212,13 @@ class PysolMenubarActions: self.setMenuState(ms.undo, "edit.undo") self.setMenuState(ms.redo, "edit.redo") self.setMenuState(ms.redo, "edit.redoall") - self.setMenuState(ms.shuffle, "edit.shuffletiles") self.updateBookmarkMenuState() self.setMenuState(ms.restart, "edit.restart") self.setMenuState(ms.custom_game, "edit.editcurrentgame") # Game menu self.setMenuState(ms.deal, "game.dealcards") self.setMenuState(ms.autodrop, "game.autodrop") + self.setMenuState(ms.shuffle, "game.shuffletiles") self.setMenuState(ms.pause, "game.pause") # Assist menu self.setMenuState(ms.hint, "assist.hint") diff --git a/pysollib/app.py b/pysollib/app.py index d42b0062..b3c40982 100644 --- a/pysollib/app.py +++ b/pysollib/app.py @@ -929,7 +929,7 @@ class Application: self.helpbar = HelpStatusbar(self.top) self.helpbar.show(self.opt.helpbar) # create the canvas - self.scrolled_canvas = MfxScrolledCanvas(self.top) + self.scrolled_canvas = MfxScrolledCanvas(self.top, propagate=True) self.canvas = self.scrolled_canvas.canvas padx, pady = TkSettings.canvas_padding self.scrolled_canvas.grid(row=1, column=1, sticky='nsew', @@ -1045,7 +1045,9 @@ class Application: self.menubar.updateRecentGamesMenu(self.opt.recent_gameid) self.menubar.updateFavoriteGamesMenu() # hide/show "Shuffle" button - ##self.toolbar.config('shuffle', self.game.canShuffle() and self.opt.toolbar_vars['shuffle']) + self.toolbar.config( + 'shuffle', + self.opt.toolbar_vars['shuffle'] and self.game.canShuffle()) # delete intro progress bar if self.intro.progress: self.intro.progress.destroy() diff --git a/pysollib/customgame.py b/pysollib/customgame.py index c9417789..d50b8131 100644 --- a/pysollib/customgame.py +++ b/pysollib/customgame.py @@ -25,7 +25,6 @@ from stack import * from game import Game from layout import Layout from hint import AbstractHint, DefaultHint, CautiousDefaultHint, Yukon_Hint -#from pysoltk import MfxCanvasText from wizardutil import WizardWidgets @@ -238,7 +237,7 @@ class CustomGame(Game): def startGame(self): - min_cards = max(len(self.s.rows), 8) + s = get_settings(self.SETTINGS) anim_frames = -1 def deal(rows, flip, frames, max_cards): @@ -253,14 +252,17 @@ class CustomGame(Game): frames=frames) return frames, max_cards - frames = 0 - s = get_settings(self.SETTINGS) if isinstance(self.s.talon, InitialDealTalonStack): max_cards = 52 * s['decks'] else: max_cards = s['deal_max_cards'] + min_cards = max(len(self.s.rows), 8) + max_rows = s['deal_face_down'] + s['deal_face_up'] + s['deal_to_reserves'] + if max_rows <= 1: + min_cards = max_cards + # deal to foundations if s['deal_found']: frames, max_cards = deal(self.s.foundations, diff --git a/pysollib/games/beleagueredcastle.py b/pysollib/games/beleagueredcastle.py index aaf0ff05..92096693 100644 --- a/pysollib/games/beleagueredcastle.py +++ b/pysollib/games/beleagueredcastle.py @@ -101,7 +101,8 @@ class StreetsAndAlleys(Game): tx, ty, ta, tf = l.getTextAttr(None, "ss") tx, ty = x+tx, y-l.YS+ty font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText(self.canvas, tx, ty, + anchor=ta, font=font) for x in (x0, x2): y = l.YM+l.YS*int(reserves!=0) for i in range(4): diff --git a/pysollib/games/bristol.py b/pysollib/games/bristol.py index 1199c02d..7d716ab9 100644 --- a/pysollib/games/bristol.py +++ b/pysollib/games/bristol.py @@ -213,7 +213,8 @@ class Dover(Bristol): tx, ty, ta, tf = l.getTextAttr(None, "ss") tx, ty = x+tx+l.XM, y+ty font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText(self.canvas, tx, ty, + anchor=ta, font=font) x, y = 2*l.XM+(max_rows-rows)*l.XS, l.YM+l.YS if text: diff --git a/pysollib/games/canfield.py b/pysollib/games/canfield.py index fb43ffff..ef1ef0e9 100644 --- a/pysollib/games/canfield.py +++ b/pysollib/games/canfield.py @@ -145,7 +145,8 @@ class Canfield(Game): tx, ty, ta, tf = l.getTextAttr(None, "ss") tx, ty = x + tx, y + ty font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText(self.canvas, tx, ty, + anchor=ta, font=font) x, y = l.XM, l.YM + l.YS + l.TEXT_HEIGHT s.reserves.append(self.ReserveStack_Class(x, y, self)) s.reserves[0].CARD_YOFFSET = yoffset diff --git a/pysollib/games/freecell.py b/pysollib/games/freecell.py index e6772f64..146027b8 100644 --- a/pysollib/games/freecell.py +++ b/pysollib/games/freecell.py @@ -526,14 +526,9 @@ class OceanTowers(TripleFreecell): # // KingCell # ************************************************************************/ -class KingCell_RowStack(RK_RowStack): - def canMoveCards(self, cards): - max_move = getNumberOfFreeStacks(self.game.s.reserves) + 1 - return len(cards) <= max_move and RK_RowStack.canMoveCards(self, cards) - class KingCell(FreeCell): - Solver_Class = FreeCellSolverWrapper(esf='kings') - RowStack_Class = StackWrapper(KingCell_RowStack, base_rank=KING) + Solver_Class = FreeCellSolverWrapper(sbb='rank', esf='kings') + RowStack_Class = StackWrapper(SuperMoveRK_RowStack, base_rank=KING) shallHighlightMatch = Game._shallHighlightMatch_RK diff --git a/pysollib/games/glenwood.py b/pysollib/games/glenwood.py index ea28e824..65463a17 100644 --- a/pysollib/games/glenwood.py +++ b/pysollib/games/glenwood.py @@ -122,7 +122,8 @@ class Glenwood(Game): tx, ty, ta, tf = l.getTextAttr(None, "ss") tx, ty = x - l.XS + tx, y + ty font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText(self.canvas, tx, ty, + anchor=ta, font=font) for i in range(4): x = 2*l.XM + (i+2)*l.XS diff --git a/pysollib/games/headsandtails.py b/pysollib/games/headsandtails.py index e99c51fa..18912d13 100644 --- a/pysollib/games/headsandtails.py +++ b/pysollib/games/headsandtails.py @@ -32,7 +32,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText # /*********************************************************************** diff --git a/pysollib/games/labyrinth.py b/pysollib/games/labyrinth.py index 5fab2fc2..d1c203ba 100644 --- a/pysollib/games/labyrinth.py +++ b/pysollib/games/labyrinth.py @@ -32,7 +32,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText # /*********************************************************************** diff --git a/pysollib/games/mahjongg/mahjongg.py b/pysollib/games/mahjongg/mahjongg.py index daf04412..d9925625 100644 --- a/pysollib/games/mahjongg/mahjongg.py +++ b/pysollib/games/mahjongg/mahjongg.py @@ -39,10 +39,10 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint +from pysollib.settings import TOOLKIT, DEBUG from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage from pysollib.pysoltk import bind, EVENT_HANDLED, ANCHOR_NW from pysollib.pysoltk import MfxMessageDialog -from pysollib.settings import TOOLKIT, DEBUG def factorial(x): diff --git a/pysollib/games/napoleon.py b/pysollib/games/napoleon.py index 82f3e6d4..795c1a46 100644 --- a/pysollib/games/napoleon.py +++ b/pysollib/games/napoleon.py @@ -236,7 +236,8 @@ class DerFreieNapoleon(DerKleineNapoleon): if texts: tx, ty, ta, tf = l.getTextAttr(s.foundations[-1], "se") font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, + font=font) # talon x, y = l.XM, self.height - l.YS s.talon = InitialDealTalonStack(x, y, self) diff --git a/pysollib/games/numerica.py b/pysollib/games/numerica.py index b503a90d..819b8146 100644 --- a/pysollib/games/numerica.py +++ b/pysollib/games/numerica.py @@ -42,7 +42,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText from pysollib.mfxutil import kwdefault diff --git a/pysollib/games/pushpin.py b/pysollib/games/pushpin.py index 2f9d521e..5d5f233e 100644 --- a/pysollib/games/pushpin.py +++ b/pysollib/games/pushpin.py @@ -30,7 +30,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText # /*********************************************************************** # // diff --git a/pysollib/games/threepeaks.py b/pysollib/games/threepeaks.py index 322b9b63..b8d78283 100644 --- a/pysollib/games/threepeaks.py +++ b/pysollib/games/threepeaks.py @@ -37,7 +37,7 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage, bind, ANCHOR_NW +from pysollib.pysoltk import MfxCanvasText from golf import Golf_Waste, Golf_Hint diff --git a/pysollib/games/ultra/hanafuda_common.py b/pysollib/games/ultra/hanafuda_common.py index c6433c04..7eefe6db 100644 --- a/pysollib/games/ultra/hanafuda_common.py +++ b/pysollib/games/ultra/hanafuda_common.py @@ -56,7 +56,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText # /*********************************************************************** diff --git a/pysollib/games/ultra/larasgame.py b/pysollib/games/ultra/larasgame.py index 7d058f7a..df55f21b 100644 --- a/pysollib/games/ultra/larasgame.py +++ b/pysollib/games/ultra/larasgame.py @@ -35,7 +35,6 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText from pysollib.games.larasgame import LarasGame_Talon, LarasGame, LarasGame_Reserve diff --git a/pysollib/games/ultra/matrix.py b/pysollib/games/ultra/matrix.py index 1a8554d2..6831e727 100644 --- a/pysollib/games/ultra/matrix.py +++ b/pysollib/games/ultra/matrix.py @@ -38,7 +38,7 @@ from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint -from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage, bind, ANCHOR_NW +from pysollib.pysoltk import bind # /*********************************************************************** diff --git a/pysollib/games/ultra/tarock.py b/pysollib/games/ultra/tarock.py index e60aa8b0..b846beb2 100644 --- a/pysollib/games/ultra/tarock.py +++ b/pysollib/games/ultra/tarock.py @@ -36,7 +36,6 @@ from pysollib.mfxutil import kwdefault from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout -#from pysollib.pysoltk import MfxCanvasText from pysollib.games.special.tarock import AbstractTarockGame, Grasshopper from pysollib.games.threepeaks import ThreePeaksNoScore diff --git a/pysollib/help.py b/pysollib/help.py index 90ff07a6..a1c2e089 100644 --- a/pysollib/help.py +++ b/pysollib/help.py @@ -40,6 +40,7 @@ from settings import PACKAGE, PACKAGE_URL, TOOLKIT, FC_VERSION from pysoltk import make_help_toplevel from pysoltk import MfxMessageDialog +from pysoltk import PysolAboutDialog from pysoltk import HTMLViewer @@ -47,12 +48,6 @@ from pysoltk import HTMLViewer # // # ************************************************************************/ -class AboutDialog(MfxMessageDialog): - def createFrames(self, kw): - top_frame, bottom_frame = MfxMessageDialog.createFrames(self, kw) - return top_frame, bottom_frame - - def help_about(app, timeout=0, sound=1): if sound: app.audio.playSample("about") @@ -62,25 +57,26 @@ def help_about(app, timeout=0, sound=1): strings=(_("&Nice"), _("&Credits...")) if timeout: strings=(_("&Enjoy"),) - ##version = _("Version %s (%s)\n\n") % (FC_VERSION, VERSION) - version = _("Version %s\n\n") % FC_VERSION - d = AboutDialog(app.top, title=_("About ") + PACKAGE, timeout=timeout, - text=_('''PySol Fan Club edition + version = _("Version %s") % FC_VERSION + d = PysolAboutDialog(app, app.top, title=_("About ") + PACKAGE, + timeout=timeout, + text=_('''PySol Fan Club edition %s%s + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Markus F.X.J. Oberhumer Copyright (C) 2003 Mt. Hood Playing Card Co. -Copyright (C) 2005 Skomoroh (Fan Club edition) +Copyright (C) 2005 Skomoroh All Rights Reserved. PySol is free software distributed under the terms of the GNU General Public License. -For more information about this application visit -%s''') % (t, version, PACKAGE_URL), - image=app.gimages.logos[2], - strings=strings, default=0, - separatorwidth=2) +For more information about this application visit''') % (t, version), + url=PACKAGE_URL, + image=app.gimages.logos[2], + strings=strings, default=0, + separatorwidth=2) if d.status == 0 and d.button == 1: help_credits(app, sound=sound) return d.status diff --git a/pysollib/pysolgtk/demooptionsdialog.py b/pysollib/pysolgtk/demooptionsdialog.py deleted file mode 100644 index 4af6b269..00000000 --- a/pysollib/pysolgtk/demooptionsdialog.py +++ /dev/null @@ -1,56 +0,0 @@ -## vim:ts=4:et:nowrap -## -##---------------------------------------------------------------------------## -## -## PySol -- a Python Solitaire game -## -## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. -## If not, write to the Free Software Foundation, Inc., -## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -## -## Markus F.X.J. Oberhumer -## -## http://wildsau.idv.uni-linz.ac.at/mfx/pysol.html -## -##---------------------------------------------------------------------------## - - -# imports -import os, sys -from gtk import * - -# PySol imports -from mfxutil import destruct, kwdefault, KwStruct, Struct - -# Toolkit imports -from tkwidget import MfxDialog - - -# /*********************************************************************** -# // -# ************************************************************************/ - -class DemoOptionsDialog(MfxDialog): - def __init__(self, parent, title, app, **kw): - pass - - -class HintOptionsDialog(MfxDialog): - def __init__(self, parent, title, app, **kw): - pass - diff --git a/pysollib/pysolgtk/tkconst.py b/pysollib/pysolgtk/tkconst.py index a70a7880..49192e31 100644 --- a/pysollib/pysolgtk/tkconst.py +++ b/pysollib/pysolgtk/tkconst.py @@ -57,6 +57,7 @@ TOOLBAR_BUTTONS = ( "undo", "redo", "autodrop", + "shuffle", "pause", "statistics", "rules", diff --git a/pysollib/pysolgtk/tkhtml.py b/pysollib/pysolgtk/tkhtml.py index 5627674f..82e1aa29 100644 --- a/pysollib/pysolgtk/tkhtml.py +++ b/pysollib/pysolgtk/tkhtml.py @@ -285,6 +285,7 @@ class HTMLViewer: parent.set_default_size(600, 440) parent.show_all() + gobject.idle_add(gtk.main) def motion_notify_event(self, widget, event): diff --git a/pysollib/pysolgtk/tkstats.py b/pysollib/pysolgtk/tkstats.py index 24e98d42..285a058c 100644 --- a/pysollib/pysolgtk/tkstats.py +++ b/pysollib/pysolgtk/tkstats.py @@ -48,7 +48,7 @@ class StatsFormatter(PysolStatsFormatter): for result in self.getStatResults(player, sort_by): iter = self.store.append(None) self.store.set(iter, - 0, _(result[0]), + 0, result[0], 1, result[1], 2, result[2], 3, result[3], diff --git a/pysollib/pysolgtk/tkwidget.py b/pysollib/pysolgtk/tkwidget.py index 06bed877..cf0f5552 100644 --- a/pysollib/pysolgtk/tkwidget.py +++ b/pysollib/pysolgtk/tkwidget.py @@ -34,14 +34,14 @@ import os, sys import gtk -from gtk import gdk +gdk = gtk.gdk # PySol imports # Toolkit imports from tkutil import makeToplevel, setTransient, wm_withdraw -from pysollib.mfxutil import kwdefault, KwStruct +from pysollib.mfxutil import kwdefault, KwStruct, openURL # /*********************************************************************** @@ -78,7 +78,8 @@ class MfxDialog(_MyDialog): bitmap=None, bitmap_side='left', bitmap_padx=20, bitmap_pady=20, image=None, image_side='left', - image_padx=10, image_pady=20): + image_padx=10, image_pady=20, + **kw): _MyDialog.__init__(self) self.status = 1 self.button = -1 @@ -215,6 +216,55 @@ class MfxMessageDialog(MfxDialog): return MfxDialog.initKw(self, kw) +# /*********************************************************************** +# // +# ************************************************************************/ + +class PysolAboutDialog(MfxDialog): + def __init__(self, app, parent, title, **kw): + self._url = kw['url'] + kw = self.initKw(kw) + MfxDialog.__init__(self, parent, title, **kw) + + top_box, bottom_box = self.createBox() + self.createBitmaps(top_box, kw) + + box = gtk.VBox() + box.set_property('border-width', 20) + top_box.pack_start(box) + + label = gtk.Label(kw['text']) + label.set_justify(gtk.JUSTIFY_CENTER) + box.pack_start(label) + + url_label = gtk.Label() + url_label.set_justify(gtk.JUSTIFY_CENTER) + url_label.set_markup( + '%s' % kw['url']) + + event_box = gtk.EventBox() + box.pack_start(event_box) + event_box.connect('button-press-event', self._urlClicked) + event_box.add(url_label) + + self.createButtons(bottom_box, kw) + + self.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + ##self.set_position(gtk.WIN_POS_CENTER) + + self.show_all() + event_box.window.set_cursor(gdk.Cursor(gdk.HAND2)) + gtk.main() + + def initKw(self, kw): + #if kw.has_key('bitmap'): + # kwdefault(kw, width=250, height=150) + return MfxDialog.initKw(self, kw) + + def _urlClicked(self, *args): + openURL(self._url) + + # /*********************************************************************** # // # ************************************************************************/ @@ -234,19 +284,6 @@ class MfxExceptionDialog(MfxDialog): MfxDialog.__init__(self, parent, title, **kw.__dict__) -# /*********************************************************************** -# // -# ************************************************************************/ - -class MfxSimpleSlider(_MyDialog): - def __init__(self, parent, title, - label, value, from_, to, resolution, - resizable=0): - self.button = 0 - self.status = 1 - self.value = value - - # /*********************************************************************** # // # ************************************************************************/ diff --git a/pysollib/stats.py b/pysollib/stats.py index 9337df9f..b93715bf 100644 --- a/pysollib/stats.py +++ b/pysollib/stats.py @@ -73,18 +73,21 @@ class PysolStatsFormatter: g = sort_func(player=player) twon, tlost, tgames, ttime, tmoves = 0, 0, 0, 0, 0 for id in g: - name = app.getGameTitleName(id) - #won, lost = app.stats.getStats(player, id) won, lost, time, moves = app.stats.getFullStats(player, id) - twon, tlost = twon + won, tlost + lost - ttime, tmoves = ttime+time, tmoves+moves - if won + lost > 0: perc = "%.1f" % (100.0 * won / (won + lost)) - else: perc = "0.0" if won > 0 or lost > 0 or id == app.game.id: + # yield only played games + name = app.getGameTitleName(id) + twon, tlost = twon + won, tlost + lost + ttime, tmoves = ttime+time, tmoves+moves + if won + lost > 0: + perc = "%.1f" % (100.0 * won / (won + lost)) + else: + perc = "0.0" t = format_time(time) m = str(round(moves, 1)) yield [name, won+lost, won, lost, t, m, perc, id] - tgames = tgames + 1 + tgames += 1 + # summary won, lost = twon, tlost if won + lost > 0: if won > 0: @@ -94,7 +97,8 @@ class PysolStatsFormatter: time = format_time(0) moves = 0 perc = "%.1f" % (100.0*won/(won+lost)) - else: perc = "0.0" + else: + perc = "0.0" self.total_games = len(g) self.played_games = tgames self.won_games = won diff --git a/pysollib/tile/edittextdialog.py b/pysollib/tile/edittextdialog.py index 4752487b..ec64fb6d 100644 --- a/pysollib/tile/edittextdialog.py +++ b/pysollib/tile/edittextdialog.py @@ -59,8 +59,8 @@ class EditTextDialog(MfxDialog): # self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken", wrap="word", width=64, height=16) - self.text_w.pack(side='left', fill="both", expand=1) - ###self.text_w.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) + self.text_w.pack(side='left', fill="both", expand=True) + ###self.text_w.pack(side='top', padx=kw.padx, pady=kw.pady) vbar = Tkinter.Scrollbar(top_frame) vbar.pack(side='right', fill='y') self.text_w["yscrollcommand"] = vbar.set diff --git a/pysollib/tile/findcarddialog.py b/pysollib/tile/findcarddialog.py index ca41191b..6cb931fa 100644 --- a/pysollib/tile/findcarddialog.py +++ b/pysollib/tile/findcarddialog.py @@ -139,6 +139,7 @@ class FindCardDialog(Tkinter.Toplevel): def enterEvent(self, suit, rank, rect, group): ##print 'enterEvent', suit, rank, self.busy if self.busy: return + if self.game.demo: return self.busy = True self.highlight_items = self.game.highlightCard(suit, rank) if not self.highlight_items: diff --git a/pysollib/tile/menubar.py b/pysollib/tile/menubar.py index fa966f39..b00cd125 100644 --- a/pysollib/tile/menubar.py +++ b/pysollib/tile/menubar.py @@ -62,7 +62,6 @@ from selectcardset import SelectCardsetDialogWithPreview from selecttile import SelectTileDialogWithPreview from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog from solverdialog import connect_game_solver_dialog -from tkwrap import MfxRadioMenuItem, MfxCheckMenuItem, StringVar from tkwidget import MfxMessageDialog #from toolbar import TOOLBAR_BUTTONS @@ -74,16 +73,16 @@ from tkconst import TOOLBAR_BUTTONS # ************************************************************************/ def createToolbarMenu(menubar, menu): - data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar') tearoff = menu.cget('tearoff') - submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff) - for f in os.listdir(data_dir): - d = os.path.join(data_dir, f) - if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')): - name = f.replace('_', ' ').capitalize() - submenu.add_radiobutton(label=name, - variable=menubar.tkopt.toolbar_style, - value=f, command=menubar.mOptToolbarStyle) +## data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar') +## submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff) +## for f in os.listdir(data_dir): +## d = os.path.join(data_dir, f) +## if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')): +## name = f.replace('_', ' ').capitalize() +## submenu.add_radiobutton(label=name, +## variable=menubar.tkopt.toolbar_style, +## value=f, command=menubar.mOptToolbarStyle) submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff) for comp, label in COMPOUNDS: submenu.add_radiobutton( @@ -105,15 +104,13 @@ def createToolbarMenu(menubar, menu): menu.add_radiobutton(label=n_("Right"), variable=menubar.tkopt.toolbar, value=4, command=menubar.mOptToolbar) - menu.add_separator() - menu.add_radiobutton(label=n_("Small icons"), - variable=menubar.tkopt.toolbar_size, value=0, - command=menubar.mOptToolbarSize) - menu.add_radiobutton(label=n_("Large icons"), - variable=menubar.tkopt.toolbar_size, value=1, - command=menubar.mOptToolbarSize) - # - #return +## menu.add_separator() +## menu.add_radiobutton(label=n_("Small icons"), +## variable=menubar.tkopt.toolbar_size, value=0, +## command=menubar.mOptToolbarSize) +## menu.add_radiobutton(label=n_("Large icons"), +## variable=menubar.tkopt.toolbar_size, value=1, +## command=menubar.mOptToolbarSize) menu.add_separator() submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff) for w in TOOLBAR_BUTTONS: @@ -210,52 +207,52 @@ class PysolMenubar(PysolMenubarActions): def _createTkOpt(self): # structure to convert menu-options to Toolkit variables self.tkopt = Struct( - gameid = MfxRadioMenuItem(self), - gameid_popular = MfxRadioMenuItem(self), - comment = MfxCheckMenuItem(self), - autofaceup = MfxCheckMenuItem(self), - autodrop = MfxCheckMenuItem(self), - autodeal = MfxCheckMenuItem(self), - quickplay = MfxCheckMenuItem(self), - undo = MfxCheckMenuItem(self), - bookmarks = MfxCheckMenuItem(self), - hint = MfxCheckMenuItem(self), - highlight_piles = MfxCheckMenuItem(self), - highlight_cards = MfxCheckMenuItem(self), - highlight_samerank = MfxCheckMenuItem(self), - highlight_not_matching = MfxCheckMenuItem(self), - mahjongg_show_removed = MfxCheckMenuItem(self), - shisen_show_hint = MfxCheckMenuItem(self), - sound = MfxCheckMenuItem(self), - cardback = MfxRadioMenuItem(self), - tabletile = MfxRadioMenuItem(self), - animations = MfxRadioMenuItem(self), - redeal_animation = MfxCheckMenuItem(self), - win_animation = MfxCheckMenuItem(self), - shadow = MfxCheckMenuItem(self), - shade = MfxCheckMenuItem(self), - shade_filled_stacks = MfxCheckMenuItem(self), - shrink_face_down = MfxCheckMenuItem(self), - toolbar = MfxRadioMenuItem(self), - toolbar_style = StringVar(), - toolbar_relief = StringVar(), - toolbar_compound = StringVar(), - toolbar_size = MfxRadioMenuItem(self), - statusbar = MfxCheckMenuItem(self), - num_cards = MfxCheckMenuItem(self), - helpbar = MfxCheckMenuItem(self), - save_games_geometry = MfxCheckMenuItem(self), - splashscreen = MfxCheckMenuItem(self), - demo_logo = MfxCheckMenuItem(self), - mouse_type = StringVar(), - mouse_undo = MfxCheckMenuItem(self), - negative_bottom = MfxCheckMenuItem(self), - pause = MfxCheckMenuItem(self), - theme = StringVar(), + gameid = Tkinter.IntVar(), + gameid_popular = Tkinter.IntVar(), + comment = Tkinter.BooleanVar(), + autofaceup = Tkinter.BooleanVar(), + autodrop = Tkinter.BooleanVar(), + autodeal = Tkinter.BooleanVar(), + quickplay = Tkinter.BooleanVar(), + undo = Tkinter.BooleanVar(), + bookmarks = Tkinter.BooleanVar(), + hint = Tkinter.BooleanVar(), + highlight_piles = Tkinter.BooleanVar(), + highlight_cards = Tkinter.BooleanVar(), + highlight_samerank = Tkinter.BooleanVar(), + highlight_not_matching = Tkinter.BooleanVar(), + mahjongg_show_removed = Tkinter.BooleanVar(), + shisen_show_hint = Tkinter.BooleanVar(), + sound = Tkinter.BooleanVar(), + cardback = Tkinter.IntVar(), + tabletile = Tkinter.IntVar(), + animations = Tkinter.IntVar(), + redeal_animation = Tkinter.BooleanVar(), + win_animation = Tkinter.BooleanVar(), + shadow = Tkinter.BooleanVar(), + shade = Tkinter.BooleanVar(), + shade_filled_stacks = Tkinter.BooleanVar(), + shrink_face_down = Tkinter.BooleanVar(), + toolbar = Tkinter.IntVar(), + toolbar_style = Tkinter.StringVar(), + toolbar_relief = Tkinter.StringVar(), + toolbar_compound = Tkinter.StringVar(), + toolbar_size = Tkinter.IntVar(), + statusbar = Tkinter.BooleanVar(), + num_cards = Tkinter.BooleanVar(), + helpbar = Tkinter.BooleanVar(), + save_games_geometry = Tkinter.BooleanVar(), + splashscreen = Tkinter.BooleanVar(), + demo_logo = Tkinter.BooleanVar(), + mouse_type = Tkinter.StringVar(), + mouse_undo = Tkinter.BooleanVar(), + negative_bottom = Tkinter.BooleanVar(), + pause = Tkinter.BooleanVar(), + theme = Tkinter.StringVar(), toolbar_vars = {}, ) for w in TOOLBAR_BUTTONS: - self.tkopt.toolbar_vars[w] = MfxCheckMenuItem(self) + self.tkopt.toolbar_vars[w] = Tkinter.BooleanVar() def _setOptions(self): tkopt, opt = self.tkopt, self.app.opt @@ -300,7 +297,7 @@ class PysolMenubar(PysolMenubarActions): tkopt.negative_bottom.set(opt.negative_bottom) tkopt.theme.set(opt.tile_theme) for w in TOOLBAR_BUTTONS: - tkopt.toolbar_vars[w].set(opt.toolbar_vars[w]) + tkopt.toolbar_vars[w].set(opt.toolbar_vars.get(w, False)) def connectGame(self, game): self.game = game @@ -386,7 +383,6 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z") menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R") menu.add_command(label=n_("Redo &all"), command=self.mRedoAll) - menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F") menu.add_separator() submenu = MfxMenu(menu, label=n_("&Set bookmark")) @@ -410,6 +406,7 @@ class PysolMenubar(PysolMenubarActions): menu = MfxMenu(self.__menubar, label=n_("&Game")) menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D") menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A") + menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F") menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P") #menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P") menu.add_separator() @@ -431,7 +428,7 @@ class PysolMenubar(PysolMenubarActions): if USE_FREECELL_SOLVER: menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver) else: - menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state=Tkinter.DISABLED) + menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state='disabled') menu.add_separator() menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2") @@ -459,7 +456,7 @@ class PysolMenubar(PysolMenubarActions): menu.add_separator() label = n_("&Sound...") if not self.app.audio.CAN_PLAY_SOUND: - menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state=Tkinter.DISABLED) + menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state='disabled') else: menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog) # cardsets diff --git a/pysollib/tile/playeroptionsdialog.py b/pysollib/tile/playeroptionsdialog.py index 69ca93f9..553f23da 100644 --- a/pysollib/tile/playeroptionsdialog.py +++ b/pysollib/tile/playeroptionsdialog.py @@ -68,7 +68,7 @@ class PlayerOptionsDialog(MfxDialog): self.win_animation_var.set(app.opt.win_animation != 0) # frame = Tkinter.Frame(top_frame) - frame.pack(expand=1, fill='both', padx=5, pady=10) + frame.pack(expand=True, fill='both', padx=5, pady=10) widget = Tkinter.Label(frame, text=_("\nPlease enter your name"), takefocus=0) widget.grid(row=0, column=0, columnspan=2, sticky='ew', padx=0, pady=5) @@ -87,7 +87,7 @@ class PlayerOptionsDialog(MfxDialog): widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5) ### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var, ### text="Win animation") -### widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) +### widget.pack(side='top', padx=kw.padx, pady=kw.pady) frame.columnconfigure(0, weight=1) # self.player = self.player_var.get() diff --git a/pysollib/tile/progressbar.py b/pysollib/tile/progressbar.py index 91bb05de..2da923c8 100644 --- a/pysollib/tile/progressbar.py +++ b/pysollib/tile/progressbar.py @@ -66,12 +66,12 @@ class PysolProgressBar: if images: self.f1 = Tkinter.Label(self.frame, image=images[0]) self.f1.pack(side='left', ipadx=8, ipady=4) - self.progress.pack(side='left', expand='yes', fill='x') + self.progress.pack(side='left', expand=True, fill='x') self.f2 = Tkinter.Label(self.frame, image=images[1]) self.f2.pack(side='left', ipadx=8, ipady=4) else: - self.progress.pack(expand='yes', fill='x') - self.frame.pack(expand='yes', fill='both') + self.progress.pack(expand=True, fill='x') + self.frame.pack(expand=True, fill='both') if 1: setTransient(self.top, None, relx=0.5, rely=0.5) else: diff --git a/pysollib/tile/selectcardset.py b/pysollib/tile/selectcardset.py index ee5fda31..4a5b5e5f 100644 --- a/pysollib/tile/selectcardset.py +++ b/pysollib/tile/selectcardset.py @@ -201,7 +201,7 @@ class SelectCardsetDialogWithPreview(MfxDialog): else: w1, w2 = 200, 300 paned_window = Tkinter.PanedWindow(top_frame) - paned_window.pack(expand=1, fill='both') + paned_window.pack(expand=True, fill='both') left_frame = Tkinter.Frame(paned_window) right_frame = Tkinter.Frame(paned_window) paned_window.add(left_frame) @@ -210,10 +210,10 @@ class SelectCardsetDialogWithPreview(MfxDialog): self.tree = self.Tree_Class(self, left_frame, key=key, default=kw.default, font=font, width=w1) - self.tree.frame.pack(fill='both', expand=1, padx=padx, pady=pady) + self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady) self.preview = MfxScrolledCanvas(right_frame, width=w2) self.preview.setTile(app, app.tabletile_index, force=True) - self.preview.pack(fill='both', expand=1, padx=padx, pady=pady) + self.preview.pack(fill='both', expand=True, padx=padx, pady=pady) self.preview.canvas.preview = 1 # create a preview of the current state self.preview_key = -1 @@ -283,11 +283,12 @@ class SelectCardsetDialogWithPreview(MfxDialog): x, y = 10, y + dy else: x = x + dx - canvas.config(scrollregion=(0, 0, sx+dx, sy+dy)) - canvas.config(width=sx+dx, height=sy+dy) +## canvas.config(scrollregion=(0, 0, sx+dx, sy+dy)) +## canvas.config(width=sx+dx, height=sy+dy) + canvas.config(scrollregion=(0, 0, sx+dx, sy+dy), + width=sx+dx, height=sy+dy) #canvas.config(xscrollincrement=dx, yscrollincrement=dy) -## self.preview.showHbar() -## self.preview.showVbar() + canvas.event_generate('') # update bg image self.preview_key = key diff --git a/pysollib/tile/selectgame.py b/pysollib/tile/selectgame.py index db0f5b7f..cb76ca83 100644 --- a/pysollib/tile/selectgame.py +++ b/pysollib/tile/selectgame.py @@ -288,9 +288,8 @@ class SelectGameDialog(MfxDialog): self.top.wm_minsize(200, 200) font = app.getFont("default") self.tree = self.Tree_Class(self, top_frame, key=gameid, - font=font, - default=kw.default) - self.tree.frame.pack(fill=Tkinter.BOTH, expand=1, + font=font, default=kw.default) + self.tree.frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) @@ -363,7 +362,7 @@ class SelectGameDialogWithPreview(SelectGameDialog): padx, pady = 4, 4 # PanedWindow paned_window = Tkinter.PanedWindow(top_frame) - paned_window.pack(expand=1, fill='both', padx=8, pady=8) + paned_window.pack(expand=True, fill='both', padx=8, pady=8) left_frame = Tkinter.Frame(paned_window) right_frame = Tkinter.Frame(paned_window) paned_window.add(left_frame) @@ -372,7 +371,7 @@ class SelectGameDialogWithPreview(SelectGameDialog): font = app.getFont("default") self.tree = self.Tree_Class(self, left_frame, key=gameid, default=kw.default, font=font, width=w1) - self.tree.frame.pack(padx=padx, pady=pady, expand=1, fill='both') + self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both') # LabelFrame info_frame = Tkinter.LabelFrame(right_frame, text=_('About game')) info_frame.grid(row=0, column=0, padx=padx, pady=pady, diff --git a/pysollib/tile/selecttile.py b/pysollib/tile/selecttile.py index caf7cc4d..4d5639d0 100644 --- a/pysollib/tile/selecttile.py +++ b/pysollib/tile/selecttile.py @@ -134,11 +134,10 @@ class SelectTileDialogWithPreview(MfxDialog): font = app.getFont("default") self.tree = self.Tree_Class(self, top_frame, key=key, default=kw.default, - font=font, - width=w1) - self.tree.frame.pack(side="left", fill=Tkinter.BOTH, expand=0, padx=kw.padx, pady=kw.pady) + font=font, width=w1) + self.tree.frame.pack(side="left", fill='both', expand=False, padx=kw.padx, pady=kw.pady) self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0) - self.preview.pack(side="right", fill=Tkinter.BOTH, expand=1, + self.preview.pack(side="right", fill='both', expand=True, padx=kw.padx, pady=kw.pady) self.preview.canvas.preview = 1 # create a preview of the current state @@ -173,15 +172,19 @@ class SelectTileDialogWithPreview(MfxDialog): self.key = self.tree.selection_key self.tree.n_expansions = 1 # save xyview in any case if button == 10: # "Solid color..." - c = tkColorChooser.askcolor(master=self.top, - initialcolor=self.table_color, - title=_("Select table color")) - if c and c[1]: - color = str(c[1]) - self.key = color.lower() - self.table_color = self.key - self.tree.updateSelection(self.key) - self.updatePreview(self.key) + try: + c = tkColorChooser.askcolor(master=self.top, + initialcolor=self.table_color, + title=_("Select table color")) + except Tkinter.TclError: + pass + else: + if c and c[1]: + color = str(c[1]) + self.key = color.lower() + self.table_color = self.key + self.tree.updateSelection(self.key) + self.updatePreview(self.key) return MfxDialog.mDone(self, button) diff --git a/pysollib/tile/solverdialog.py b/pysollib/tile/solverdialog.py index 1cc44fc8..dc32fa43 100644 --- a/pysollib/tile/solverdialog.py +++ b/pysollib/tile/solverdialog.py @@ -39,7 +39,7 @@ from pysollib.settings import PACKAGE # Toolkit imports from tkconst import EVENT_HANDLED, EVENT_PROPAGATE from tkwidget import MfxDialog -from tkwidget import PysolScale +from tkwidget import PysolScale, PysolCombo from tkutil import bind, unbind_destroy @@ -85,10 +85,10 @@ class SolverDialog(MfxDialog): self.games[name] = id gamenames.sort() self.gamenames = gamenames - cb = Tkinter.Combobox(frame, values=tuple(gamenames), - state='readonly', width=40) + cb = PysolCombo(frame, values=tuple(gamenames), + selectcommand=self.gameSelected, + state='readonly', width=40) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) - bind(cb, '<>', self.gameSelected) self.games_var = cb # @@ -103,7 +103,7 @@ class SolverDialog(MfxDialog): 'A randomized DFS', ##'"Soft" DFS' ] - cb = Tkinter.Combobox(frame, values=tuple(sm), state='readonly') + cb = PysolCombo(frame, values=tuple(sm), state='readonly') cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) cb.current(sm.index('Depth-First Search')) self.solving_method_var = cb @@ -125,7 +125,7 @@ class SolverDialog(MfxDialog): 'yellow-brick-road', ] self.presets = presets - cb = Tkinter.Combobox(frame, values=tuple(presets), state='readonly') + cb = PysolCombo(frame, values=tuple(presets), state='readonly') cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) cb.current(0) self.preset_var = cb @@ -191,14 +191,11 @@ class SolverDialog(MfxDialog): # focus = self.createButtons(bottom_frame, kw) - self.mainloop(focus, kw.timeout, transient=False) - self.start_button = self.buttons[0] self.play_button = self.buttons[1] - - # self._reset() self.connectGame(self.app.game) + self.mainloop(focus, kw.timeout, transient=False) def initKw(self, kw): strings=[_('&Start'), _('&Play'), _('&New'), 'sep', _('&Close'),] @@ -256,6 +253,8 @@ class SolverDialog(MfxDialog): self.play_button.config(state='disabled') def startSolving(self): + from gettext import ungettext + self._reset() game = self.app.game solver = game.Solver_Class(game, self) # create solver instance @@ -271,7 +270,10 @@ class SolverDialog(MfxDialog): solver.computeHints() hints_len = len(solver.hints)-1 if hints_len > 0: - self.result_label['text'] = _('This game is solveable in %s moves.') % hints_len + t = ungettext('This game is solveable in %d move.', + 'This game is solveable in %d moves.', + hints_len) % hints_len + self.result_label['text'] = t self.play_button.config(state='normal') else: self.result_label['text'] = _('I could not solve this game.') @@ -279,9 +281,13 @@ class SolverDialog(MfxDialog): def startPlay(self): self.play_button.config(state='disabled') + self.start_button.focus() + if self.app.game.pause: + self.app.menubar.mPause() self.app.top.tkraise() self.app.top.update_idletasks() self.app.top.update() + self.app.top.after(200) self.app.game.startDemo(level=3) def setText(self, **kw): diff --git a/pysollib/tile/soundoptionsdialog.py b/pysollib/tile/soundoptionsdialog.py index 808de4ac..9f8628ce 100644 --- a/pysollib/tile/soundoptionsdialog.py +++ b/pysollib/tile/soundoptionsdialog.py @@ -143,7 +143,7 @@ class SoundOptionsDialog(MfxDialog): kw.strings[1] = None # frame = Tkinter.LabelFrame(top_frame, text=_('Enable samples')) - frame.pack(expand=1, fill='both', padx=5, pady=5) + frame.pack(expand=True, fill='both', padx=5, pady=5) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) # diff --git a/pysollib/tile/statusbar.py b/pysollib/tile/statusbar.py index 7ce4a16a..770c82f8 100644 --- a/pysollib/tile/statusbar.py +++ b/pysollib/tile/statusbar.py @@ -75,9 +75,8 @@ class MfxStatusbar: self.frame.pack(side='left', expand=True, fill='both', padx=0, pady=1) # util - def _createLabel(self, name, side='left', - fill='none', expand=0, width=0, - tooltip=None): + def _createLabel(self, name, side='left', fill='none', + expand=False, width=0, tooltip=None): frame = Tkinter.Frame(self.frame, borderwidth=1, relief=self.label_relief) frame.pack(side=side, fill=fill, padx=self.padx, expand=expand) label = Tkinter.Label(frame, width=width) @@ -154,7 +153,7 @@ class PysolStatusbar(MfxStatusbar): ): self._createLabel(n, tooltip=t, width=w) # - l = self._createLabel("info", fill='both', expand=1) + l = self._createLabel("info", fill='both', expand=True) ##l.config(text="", justify="left", anchor='w') l.config(padding=(8, 0)) self._createSizegrip() @@ -163,14 +162,14 @@ class PysolStatusbar(MfxStatusbar): class HelpStatusbar(MfxStatusbar): def __init__(self, top): MfxStatusbar.__init__(self, top, row=3, column=0, columnspan=3) - l = self._createLabel("info", fill='both', expand=1) + l = self._createLabel("info", fill='both', expand=True) l.config(justify="left", anchor='w', padding=(8, 0)) class HtmlStatusbar(MfxStatusbar): def __init__(self, top, row, column, columnspan): MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan) - l = self._createLabel("url", fill='both', expand=1) + l = self._createLabel("url", fill='both', expand=True) l.config(justify="left", anchor='w', padding=(8, 0)) self._createSizegrip() diff --git a/pysollib/tile/tkcanvas.py b/pysollib/tile/tkcanvas.py index 12cfeec2..3da04cee 100644 --- a/pysollib/tile/tkcanvas.py +++ b/pysollib/tile/tkcanvas.py @@ -142,10 +142,10 @@ class MfxCanvas(Tkinter.Canvas): # self.xmargin, self.ymargin = 10, 10 # resize bg image - self.bind('', lambda e: self.set_bg_image()) + self.bind('', self.setBackgroundImage) - def set_bg_image(self): - ##print 'set_bg_image', self._bg_img + def setBackgroundImage(self, event=None): + ##print 'setBackgroundImage', self._bg_img if not hasattr(self, '_bg_img'): return if not self._bg_img: # solid color @@ -306,7 +306,7 @@ class MfxCanvas(Tkinter.Canvas): except: return 0 self._stretch_bg_image = stretch - self.set_bg_image() + self.setBackgroundImage() else: for id in self.__tiles: self.delete(id) diff --git a/pysollib/tile/tkhtml.py b/pysollib/tile/tkhtml.py index 632ba02d..7438eb80 100644 --- a/pysollib/tile/tkhtml.py +++ b/pysollib/tile/tkhtml.py @@ -247,8 +247,9 @@ class HTMLViewer: ##self.defcursor = 'xterm' self.handcursor = "hand2" - frame = Tkinter.Frame(parent) + frame = Tkinter.Frame(parent, width=640, height=440) frame.pack(expand=True, fill='both') + frame.grid_propagate(False) # create buttons button_width = 8 @@ -274,13 +275,13 @@ class HTMLViewer: text_frame.grid(row=1, column=0, columnspan=4, sticky='nsew', padx=1, pady=1) vbar = Tkinter.Scrollbar(text_frame) - vbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y) + vbar.pack(side='right', fill='y') self.text = Tkinter.Text(text_frame, fg='black', bg='white', bd=1, relief='sunken', cursor=self.defcursor, wrap='word', padx=10) - self.text.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1) + self.text.pack(side='left', fill='both', expand=True) self.text["yscrollcommand"] = vbar.set vbar["command"] = self.text.yview diff --git a/pysollib/tile/tkstats.py b/pysollib/tile/tkstats.py index 9cd51e47..48c32ebc 100644 --- a/pysollib/tile/tkstats.py +++ b/pysollib/tile/tkstats.py @@ -374,7 +374,6 @@ class TreeFormatter(PysolStatsFormatter): for result in self.getStatResults(player, sort_by): # result == [name, won+lost, won, lost, time, moves, perc, id] t1, t2, t3, t4, t5, t6, t7, t8 = result - t1 = _(t1) # game name id = self.tree.insert(None, "end", text=t1, values=(t2, t3, t4, t5, t6, t7)) self.parent_window.tree_items.append(id) @@ -486,7 +485,6 @@ class AllGamesFrame(Tkinter.Frame): def fillTreeview(self, player): if self.tree_items: - #return self.tree.delete(tuple(self.tree_items)) self.tree_items = [] self.formatter.writeStats(player, sort_by=self.sort_by) @@ -667,7 +665,7 @@ class _TopDialog(MfxDialog): 'padding': (4, 1), } frame = Tkinter.Frame(**cnf) - frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10) + frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) cnf['master'] = frame cnf['text'] = _('N') diff --git a/pysollib/tile/tktree.py b/pysollib/tile/tktree.py index 316d3277..01862b01 100644 --- a/pysollib/tile/tktree.py +++ b/pysollib/tile/tktree.py @@ -258,7 +258,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas): bind(self.canvas, "", self.singleClick) bind(self.canvas, "", self.doubleClick) ##bind(self.canvas, "", xxx) - self.pack(fill=Tkinter.BOTH, expand=1) + self.pack(fill='both', expand=True) def destroy(self): for node in self.keys.get(self.selection_key, []): @@ -266,7 +266,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas): MfxScrolledCanvas.destroy(self) def findNode(self, event=None): - id = self.canvas.find_withtag(Tkinter.CURRENT) + id = self.canvas.find_withtag('current') if id: return self.nodes.get(id[0]) return None diff --git a/pysollib/tile/tkwidget.py b/pysollib/tile/tkwidget.py index 887ab1a7..62f6bda1 100644 --- a/pysollib/tile/tkwidget.py +++ b/pysollib/tile/tkwidget.py @@ -37,6 +37,7 @@ __all__ = ['MfxDialog', 'MfxMessageDialog', 'MfxExceptionDialog', 'MfxSimpleEntry', + 'PysolAboutDialog', 'MfxTooltip', 'MfxScrolledCanvas', 'StackDesc', @@ -46,10 +47,11 @@ __all__ = ['MfxDialog', import os, sys, time, locale import Tkinter as Tk import Tile as Tkinter +import tkFont import traceback # PySol imports -from pysollib.mfxutil import destruct, kwdefault, KwStruct +from pysollib.mfxutil import destruct, kwdefault, KwStruct, openURL from pysollib.settings import WIN_SYSTEM # Toolkit imports @@ -167,7 +169,7 @@ class MfxDialog: # ex. _ToplevelDialog def createFrames(self, kw): bottom_frame = Tkinter.Frame(self._frame, relief='flat', borderwidth=4) - bottom_frame.pack(side='bottom', fill='both', expand=0) + bottom_frame.pack(side='bottom', fill='both', expand=False) if kw.separatorwidth > 0: separator = Tkinter.Separator(self._frame) separator.pack(side='bottom', fill='x') @@ -275,7 +277,7 @@ class MfxMessageDialog(MfxDialog): self.button = kw.default msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify, width=kw.width) - msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) + msg.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout) @@ -300,6 +302,39 @@ class MfxExceptionDialog(MfxMessageDialog): MfxMessageDialog.__init__(self, parent, title, **kw.getKw()) +# /*********************************************************************** +# // +# ************************************************************************/ + +class PysolAboutDialog(MfxMessageDialog): + def __init__(self, app, parent, title, **kw): + self._url = kw['url'] + kw = self.initKw(kw) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) + top_frame, bottom_frame = self.createFrames(kw) + self.createBitmaps(top_frame, kw) + # + self.button = kw.default + frame = Tkinter.Frame(top_frame) + frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) + msg = Tkinter.Label(frame, text=kw.text, justify=kw.justify, + width=kw.width) + msg.pack(fill='both', expand=True) + + font = tkFont.Font(parent, app.getFont('default')) + font.configure(underline=True) + url_label = Tkinter.Label(frame, text=kw.url, font=font, + foreground='blue', cursor='hand2') + url_label.pack() + url_label.bind('<1>', self._urlClicked) + # + focus = self.createButtons(bottom_frame, kw) + self.mainloop(focus, kw.timeout) + + def _urlClicked(self, event): + openURL(self._url) + + # /*********************************************************************** # // # ************************************************************************/ @@ -318,7 +353,7 @@ class MfxSimpleEntry(MfxDialog): w = kw.get("e_width", 0) # width in characters self.var = Tkinter.Entry(top_frame, exportselection=1, width=w) self.var.insert(0, value) - self.var.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) + self.var.pack(side='top', padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) focus = self.var @@ -408,7 +443,7 @@ class MfxTooltip: if self.tooltip or not self.text: return ## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)): -## if self.widget["state"] == Tkinter.DISABLED: +## if self.widget["state"] == 'disabled': ## return import Tkinter # not Tile ##x = self.widget.winfo_rootx() @@ -435,30 +470,24 @@ class MfxTooltip: # ************************************************************************/ class MfxScrolledCanvas: - def __init__(self, parent, hbar=2, vbar=2, **kw): + def __init__(self, parent, hbar=True, vbar=True, propagate=0, **kw): kwdefault(kw, highlightthickness=0, bd=1, relief='sunken') self.parent = parent self.createFrame(kw) self.canvas = None self.hbar = None - self.hbar_mode = hbar self.vbar = None - self.vbar_mode = vbar - self.hbar_show = 0 - self.vbar_show = 0 - self.resize_pending = 0 - self.timer = None + self.hbar_show = False + self.vbar_show = False self.createCanvas(kw) self.frame.grid_rowconfigure(0, weight=1) self.frame.grid_columnconfigure(0, weight=1) + self.frame.grid_propagate(propagate) if hbar: self.createHbar() - if not vbar: - bind(self.hbar, "", self._mapBar) self.bindHbar() if vbar: self.createVbar() - bind(self.vbar, "", self._mapBar) self.bindVbar() ###self.canvas.focus_set() @@ -467,8 +496,6 @@ class MfxScrolledCanvas: # def destroy(self): - after_cancel(self.timer) - self.timer = None self.unbind_all() self.canvas.destroy() self.frame.destroy() @@ -534,14 +561,18 @@ class MfxScrolledCanvas: self.canvas = MfxCanvas(self.frame, **kw) self.canvas.grid(row=0, column=0, sticky="news") def createHbar(self): - self.hbar = Tkinter.Scrollbar(self.frame, name="hbar", - takefocus=0, orient="horizontal") + self.hbar = Tkinter.Scrollbar(self.frame, takefocus=0, + orient="horizontal") self.canvas["xscrollcommand"] = self._setHbar self.hbar["command"] = self.canvas.xview + self.hbar.grid(row=1, column=0, sticky="we") + self.hbar.grid_remove() def createVbar(self): - self.vbar = Tkinter.Scrollbar(self.frame, name="vbar", takefocus=0) + self.vbar = Tkinter.Scrollbar(self.frame, takefocus=0) self.canvas["yscrollcommand"] = self._setVbar self.vbar["command"] = self.canvas.yview + self.vbar.grid(row=0, column=1, sticky="ns") + self.vbar.grid_remove() def bindHbar(self, w=None): if w is None: w = self.canvas @@ -567,66 +598,30 @@ class MfxScrolledCanvas: def mouse_wheel(self, *args): print 'MfxScrolledCanvas.mouse_wheel', args - def _mapBar(self, event): - # see: autoscroll.tcl, http://mini.net/cgi-bin/wikit/950.html - top = event.widget.winfo_toplevel() - g = top.wm_geometry() - if self.resize_pending: - self.resize_pending = 0 - self.canvas.update() - self.canvas.update_idletasks() - top.wm_geometry(g) - - def _setHbar(self, *args): - self.canvas.update() - self.hbar.set(*self.canvas.xview()) - self.showHbar() - ##self.hbar.update_idletasks() - def _setVbar(self, *args): - self.canvas.update() - self.vbar.set(*self.canvas.yview()) - self.showVbar() - ##self.vbar.update_idletasks() - - def showHbar(self, show=-1): - if not self.hbar: - return 0 - if show < 0: - show = self.hbar_mode - if show > 1: - if not self.canvas.winfo_ismapped(): - return 0 - ##self.canvas.update() - view = self.canvas.xview() - show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001 - if show == self.hbar_show: - return 0 - if show: - self.hbar.grid(row=1, column=0, sticky="we") + def _setHbar(self, first, last): + sb = self.hbar + if not self.canvas.winfo_ismapped(): + sb.set(first, last) + return + if float(first) <= 0 and float(last) >= 1: + sb.grid_remove() + self.hbar_show = False else: - self.hbar.grid_forget() - self.hbar_show = show - return 1 - - def showVbar(self, show=-1): - if not self.vbar: - return 0 - if show < 0: - show = self.vbar_mode - if show > 1: - if not self.canvas.winfo_ismapped(): - return 0 - ##self.canvas.update() - view = self.canvas.yview() - show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001 - if show == self.vbar_show: - return 0 - if show: - self.vbar.grid(row=0, column=1, sticky="ns") + sb.grid() + self.hbar_show = True + sb.set(first, last) + def _setVbar(self, first, last): + sb = self.vbar + if not self.canvas.winfo_ismapped(): + sb.set(first, last) + return + if float(first) <= 0and float(last) >= 1: + sb.grid_remove() + self.vbar_show = False else: - self.vbar.grid_forget() - self.vbar_show = show - return 1 + sb.grid() + self.vbar_show = True + sb.set(first, last) def _xview(self, *args): if self.hbar_show: self.canvas.xview(*args) @@ -805,3 +800,30 @@ class TkinterScale(Tk.Scale): PysolScale = MyPysolScale #PysolScale = TkinterScale + + +# /*********************************************************************** +# // Tile.Combobox workaround (clear selection) +# ************************************************************************/ + +class PysolCombo(Tkinter.Combobox): + def __init__(self, master=None, **kw): + self._command = None + if 'selectcommand' in kw: + self._command = kw['selectcommand'] + del kw['selectcommand'] + Tkinter.Combobox.__init__(self, master, **kw) + self.bind('<>', self._callback) + + def _callback(self, *args): + ##self.selection_clear() + self.selection_range(0,0) + if self._command is not None: + return self._command(*args) + return None + + + + + + diff --git a/pysollib/tile/tkwrap.py b/pysollib/tile/tkwrap.py index eff80d00..a92860be 100644 --- a/pysollib/tile/tkwrap.py +++ b/pysollib/tile/tkwrap.py @@ -34,9 +34,6 @@ ##---------------------------------------------------------------------------## __all__ = ['TclError', - 'MfxCheckMenuItem', - 'MfxRadioMenuItem', - 'StringVar', 'MfxRoot'] # imports @@ -52,31 +49,6 @@ from pysollib.macosx.appSupport import setupApp from tkutil import after_idle from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -# /*********************************************************************** -# // menubar -# ************************************************************************/ - -class MfxCheckMenuItem(Tkinter.BooleanVar): - def __init__(self, menubar, path=None): - Tkinter.BooleanVar.__init__(self) - def set(self, value): - if not value or value == "false": value = 0 - ##print value, type(value) - Tkinter.BooleanVar.set(self, value) - - -class MfxRadioMenuItem(Tkinter.IntVar): - def __init__(self, menubar, path=None): - Tkinter.IntVar.__init__(self) - def set(self, value): - Tkinter.IntVar.set(self, value) - - -## BooleanVar = Tkinter.BooleanVar -## IntVar = Tkinter.IntVar - -StringVar = Tkinter.StringVar - # /*********************************************************************** # // Wrapper class for Tk. diff --git a/pysollib/tile/toolbar.py b/pysollib/tile/toolbar.py index 00fdc02c..4677edfb 100644 --- a/pysollib/tile/toolbar.py +++ b/pysollib/tile/toolbar.py @@ -164,8 +164,7 @@ class ToolbarLabel(Tkinter.Message): class PysolToolbar(PysolToolbarActions): - def __init__(self, top, dir, size=0, relief=Tkinter.FLAT, - compound=Tkinter.NONE): + def __init__(self, top, dir, size=0, relief='flat', compound='none'): PysolToolbarActions.__init__(self) @@ -364,7 +363,7 @@ class PysolToolbar(PysolToolbarActions): padx, pady = TkSettings.vertical_toolbar_padding pack_func(row=1, column=2, sticky='ns', padx=padx, pady=pady) # set orient - orient = side in (1, 2) and Tkinter.HORIZONTAL or Tkinter.VERTICAL + orient = side in (1, 2) and 'horizontal' or 'vertical' self._setOrient(orient) self.side = side return 1 @@ -467,6 +466,6 @@ class PysolToolbar(PysolToolbarActions): if self.compound == 'text': return 0 size = self.size - comp = int(self.compound in (Tkinter.TOP, Tkinter.BOTTOM)) + comp = int(self.compound in ('top', 'bottom')) return int((size+comp) != 0) diff --git a/pysollib/tile/wizarddialog.py b/pysollib/tile/wizarddialog.py index abf0aee3..3e174fe0 100644 --- a/pysollib/tile/wizarddialog.py +++ b/pysollib/tile/wizarddialog.py @@ -32,7 +32,7 @@ from pysollib.wizardpresets import presets # Toolkit imports from tkwidget import MfxDialog -from tkwidget import PysolScale +from tkwidget import PysolScale, PysolCombo # /*********************************************************************** @@ -71,12 +71,13 @@ class WizardDialog(MfxDialog): values.remove(default) values.sort() values.insert(0, default) - cb = Combobox(frame, values=tuple(values), - textvariable=w.variable, - state='readonly', width=32) - cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) callback = lambda e, w=w: self.presetSelected(e, w) - cb.bind('<>', callback) + cb = PysolCombo(frame, values=tuple(values), + textvariable=w.variable, + exportselection=False, + selectcommand=callback, + state='readonly', width=32) + cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'entry': if w.variable is None: w.variable = StringVar() @@ -86,9 +87,10 @@ class WizardDialog(MfxDialog): if w.variable is None: w.variable = StringVar() values = [_(v) for v in w.values] - cb = Combobox(frame, values=tuple(values), - textvariable=w.variable, - state='readonly', width=32) + cb = PysolCombo(frame, values=tuple(values), + textvariable=w.variable, + exportselection=False, + state='readonly', width=32) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'spin': if w.variable is None: diff --git a/pysollib/tk/edittextdialog.py b/pysollib/tk/edittextdialog.py index f18969b3..d13511fb 100644 --- a/pysollib/tk/edittextdialog.py +++ b/pysollib/tk/edittextdialog.py @@ -58,8 +58,8 @@ class EditTextDialog(MfxDialog): # self.text_w = Tkinter.Text(top_frame, bd=1, relief="sunken", wrap="word", width=64, height=16) - self.text_w.pack(side='left', fill="both", expand=1) - ###self.text_w.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) + self.text_w.pack(side='left', fill="both", expand=True) + ###self.text_w.pack(side='top', padx=kw.padx, pady=kw.pady) vbar = Tkinter.Scrollbar(top_frame) vbar.pack(side='right', fill='y') self.text_w["yscrollcommand"] = vbar.set diff --git a/pysollib/tk/findcarddialog.py b/pysollib/tk/findcarddialog.py index ca41191b..6cb931fa 100644 --- a/pysollib/tk/findcarddialog.py +++ b/pysollib/tk/findcarddialog.py @@ -139,6 +139,7 @@ class FindCardDialog(Tkinter.Toplevel): def enterEvent(self, suit, rank, rect, group): ##print 'enterEvent', suit, rank, self.busy if self.busy: return + if self.game.demo: return self.busy = True self.highlight_items = self.game.highlightCard(suit, rank) if not self.highlight_items: diff --git a/pysollib/tk/menubar.py b/pysollib/tk/menubar.py index fa45d063..30db3dee 100644 --- a/pysollib/tk/menubar.py +++ b/pysollib/tk/menubar.py @@ -61,9 +61,7 @@ from selectcardset import SelectCardsetDialogWithPreview from selecttile import SelectTileDialogWithPreview from findcarddialog import connect_game_find_card_dialog, destroy_find_card_dialog from solverdialog import connect_game_solver_dialog -from tkwrap import MfxRadioMenuItem, MfxCheckMenuItem, StringVar -#from toolbar import TOOLBAR_BUTTONS from tkconst import TOOLBAR_BUTTONS @@ -72,16 +70,16 @@ from tkconst import TOOLBAR_BUTTONS # ************************************************************************/ def createToolbarMenu(menubar, menu): - data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar') tearoff = menu.cget('tearoff') - submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff) - for f in os.listdir(data_dir): - d = os.path.join(data_dir, f) - if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')): - name = f.replace('_', ' ').capitalize() - submenu.add_radiobutton(label=name, - variable=menubar.tkopt.toolbar_style, - value=f, command=menubar.mOptToolbarStyle) +## data_dir = os.path.join(menubar.app.dataloader.dir, 'images', 'toolbar') +## submenu = MfxMenu(menu, label=n_('Style'), tearoff=tearoff) +## for f in os.listdir(data_dir): +## d = os.path.join(data_dir, f) +## if os.path.isdir(d) and os.path.exists(os.path.join(d, 'small')): +## name = f.replace('_', ' ').capitalize() +## submenu.add_radiobutton(label=name, +## variable=menubar.tkopt.toolbar_style, +## value=f, command=menubar.mOptToolbarStyle) if Tkinter.TkVersion >= 8.4: submenu = MfxMenu(menu, label=n_('Compound'), tearoff=tearoff) for comp, label in COMPOUNDS: @@ -104,15 +102,13 @@ def createToolbarMenu(menubar, menu): menu.add_radiobutton(label=n_("Right"), variable=menubar.tkopt.toolbar, value=4, command=menubar.mOptToolbar) - menu.add_separator() - menu.add_radiobutton(label=n_("Small icons"), - variable=menubar.tkopt.toolbar_size, value=0, - command=menubar.mOptToolbarSize) - menu.add_radiobutton(label=n_("Large icons"), - variable=menubar.tkopt.toolbar_size, value=1, - command=menubar.mOptToolbarSize) - # - #return +## menu.add_separator() +## menu.add_radiobutton(label=n_("Small icons"), +## variable=menubar.tkopt.toolbar_size, value=0, +## command=menubar.mOptToolbarSize) +## menu.add_radiobutton(label=n_("Large icons"), +## variable=menubar.tkopt.toolbar_size, value=1, +## command=menubar.mOptToolbarSize) menu.add_separator() submenu = MfxMenu(menu, label=n_('Visible buttons'), tearoff=tearoff) for w in TOOLBAR_BUTTONS: @@ -209,51 +205,51 @@ class PysolMenubar(PysolMenubarActions): def _createTkOpt(self): # structure to convert menu-options to Toolkit variables self.tkopt = Struct( - gameid = MfxRadioMenuItem(self), - gameid_popular = MfxRadioMenuItem(self), - comment = MfxCheckMenuItem(self), - autofaceup = MfxCheckMenuItem(self), - autodrop = MfxCheckMenuItem(self), - autodeal = MfxCheckMenuItem(self), - quickplay = MfxCheckMenuItem(self), - undo = MfxCheckMenuItem(self), - bookmarks = MfxCheckMenuItem(self), - hint = MfxCheckMenuItem(self), - highlight_piles = MfxCheckMenuItem(self), - highlight_cards = MfxCheckMenuItem(self), - highlight_samerank = MfxCheckMenuItem(self), - highlight_not_matching = MfxCheckMenuItem(self), - mahjongg_show_removed = MfxCheckMenuItem(self), - shisen_show_hint = MfxCheckMenuItem(self), - sound = MfxCheckMenuItem(self), - cardback = MfxRadioMenuItem(self), - tabletile = MfxRadioMenuItem(self), - animations = MfxRadioMenuItem(self), - redeal_animation = MfxCheckMenuItem(self), - win_animation = MfxCheckMenuItem(self), - shadow = MfxCheckMenuItem(self), - shade = MfxCheckMenuItem(self), - shade_filled_stacks = MfxCheckMenuItem(self), - shrink_face_down = MfxCheckMenuItem(self), - toolbar = MfxRadioMenuItem(self), - toolbar_style = StringVar(), - toolbar_relief = StringVar(), - toolbar_compound = StringVar(), - toolbar_size = MfxRadioMenuItem(self), - statusbar = MfxCheckMenuItem(self), - num_cards = MfxCheckMenuItem(self), - helpbar = MfxCheckMenuItem(self), - save_games_geometry = MfxCheckMenuItem(self), - splashscreen = MfxCheckMenuItem(self), - demo_logo = MfxCheckMenuItem(self), - mouse_type = StringVar(), - mouse_undo = MfxCheckMenuItem(self), - negative_bottom = MfxCheckMenuItem(self), - pause = MfxCheckMenuItem(self), + gameid = Tkinter.IntVar(), + gameid_popular = Tkinter.IntVar(), + comment = Tkinter.BooleanVar(), + autofaceup = Tkinter.BooleanVar(), + autodrop = Tkinter.BooleanVar(), + autodeal = Tkinter.BooleanVar(), + quickplay = Tkinter.BooleanVar(), + undo = Tkinter.BooleanVar(), + bookmarks = Tkinter.BooleanVar(), + hint = Tkinter.BooleanVar(), + highlight_piles = Tkinter.BooleanVar(), + highlight_cards = Tkinter.BooleanVar(), + highlight_samerank = Tkinter.BooleanVar(), + highlight_not_matching = Tkinter.BooleanVar(), + mahjongg_show_removed = Tkinter.BooleanVar(), + shisen_show_hint = Tkinter.BooleanVar(), + sound = Tkinter.BooleanVar(), + cardback = Tkinter.IntVar(), + tabletile = Tkinter.IntVar(), + animations = Tkinter.IntVar(), + redeal_animation = Tkinter.BooleanVar(), + win_animation = Tkinter.BooleanVar(), + shadow = Tkinter.BooleanVar(), + shade = Tkinter.BooleanVar(), + shade_filled_stacks = Tkinter.BooleanVar(), + shrink_face_down = Tkinter.BooleanVar(), + toolbar = Tkinter.IntVar(), + toolbar_style = Tkinter.StringVar(), + toolbar_relief = Tkinter.StringVar(), + toolbar_compound = Tkinter.StringVar(), + toolbar_size = Tkinter.IntVar(), + statusbar = Tkinter.BooleanVar(), + num_cards = Tkinter.BooleanVar(), + helpbar = Tkinter.BooleanVar(), + save_games_geometry = Tkinter.BooleanVar(), + splashscreen = Tkinter.BooleanVar(), + demo_logo = Tkinter.BooleanVar(), + mouse_type = Tkinter.StringVar(), + mouse_undo = Tkinter.BooleanVar(), + negative_bottom = Tkinter.BooleanVar(), + pause = Tkinter.BooleanVar(), toolbar_vars = {}, ) for w in TOOLBAR_BUTTONS: - self.tkopt.toolbar_vars[w] = MfxCheckMenuItem(self) + self.tkopt.toolbar_vars[w] = Tkinter.BooleanVar() def _setOptions(self): tkopt, opt = self.tkopt, self.app.opt @@ -297,7 +293,7 @@ class PysolMenubar(PysolMenubarActions): tkopt.mouse_undo.set(opt.mouse_undo) tkopt.negative_bottom.set(opt.negative_bottom) for w in TOOLBAR_BUTTONS: - tkopt.toolbar_vars[w].set(opt.toolbar_vars[w]) + tkopt.toolbar_vars[w].set(opt.toolbar_vars.get(w, False)) def connectGame(self, game): self.game = game @@ -383,7 +379,6 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("&Undo"), command=self.mUndo, accelerator="Z") menu.add_command(label=n_("&Redo"), command=self.mRedo, accelerator="R") menu.add_command(label=n_("Redo &all"), command=self.mRedoAll) - menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F") menu.add_separator() submenu = MfxMenu(menu, label=n_("&Set bookmark")) @@ -407,6 +402,7 @@ class PysolMenubar(PysolMenubarActions): menu = MfxMenu(self.__menubar, label=n_("&Game")) menu.add_command(label=n_("&Deal cards"), command=self.mDeal, accelerator="D") menu.add_command(label=n_("&Auto drop"), command=self.mDrop, accelerator="A") + menu.add_command(label=n_("Shu&ffle tiles"), command=self.mShuffle, accelerator="F") menu.add_checkbutton(label=n_("&Pause"), variable=self.tkopt.pause, command=self.mPause, accelerator="P") #menu.add_command(label=n_("&Pause"), command=self.mPause, accelerator="P") menu.add_separator() @@ -436,7 +432,7 @@ class PysolMenubar(PysolMenubarActions): if USE_FREECELL_SOLVER: menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver) else: - menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state=Tkinter.DISABLED) + menu.add_command(label=n_("&Solver (experimental)"), command=self.mSolver, state='disabled') menu.add_separator() menu.add_command(label=n_("&Piles description"), command=self.mStackDesk, accelerator="F2") @@ -464,7 +460,7 @@ class PysolMenubar(PysolMenubarActions): menu.add_separator() label = n_("&Sound...") if not self.app.audio.CAN_PLAY_SOUND: - menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state=Tkinter.DISABLED) + menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog, state='disabled') else: menu.add_checkbutton(label=label, variable=self.tkopt.sound, command=self.mOptSoundDialog) # cardsets diff --git a/pysollib/tk/playeroptionsdialog.py b/pysollib/tk/playeroptionsdialog.py index 2d043cba..d6e05208 100644 --- a/pysollib/tk/playeroptionsdialog.py +++ b/pysollib/tk/playeroptionsdialog.py @@ -59,7 +59,7 @@ class SelectUserNameDialog(MfxDialog): self.createBitmaps(top_frame, kw) # listbox = Tkinter.Listbox(top_frame) - listbox.pack(side='left', fill='both', expand=1) + listbox.pack(side='left', fill='both', expand=True) scrollbar = Tkinter.Scrollbar(top_frame) scrollbar.pack(side='right', fill='y') listbox.configure(yscrollcommand=scrollbar.set) @@ -108,7 +108,7 @@ class PlayerOptionsDialog(MfxDialog): self.win_animation_var.set(app.opt.win_animation != 0) # frame = Tkinter.Frame(top_frame) - frame.pack(expand=1, fill='both', padx=5, pady=10) + frame.pack(expand=True, fill='both', padx=5, pady=10) widget = Tkinter.Label(frame, text=_("\nPlease enter your name"), #justify='left', anchor='w', takefocus=0) @@ -129,7 +129,7 @@ class PlayerOptionsDialog(MfxDialog): widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5) ### widget = Tkinter.Checkbutton(frame, variable=self.win_animation_var, ### text="Win animation") -### widget.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) +### widget.pack(side='top', padx=kw.padx, pady=kw.pady) frame.columnconfigure(0, weight=1) # self.player = self.player_var.get() diff --git a/pysollib/tk/progressbar.py b/pysollib/tk/progressbar.py index 171b81ca..3d277df5 100644 --- a/pysollib/tk/progressbar.py +++ b/pysollib/tk/progressbar.py @@ -56,9 +56,9 @@ class PysolProgressBar: self.top.wm_protocol("WM_DELETE_WINDOW", self.wmDeleteWindow) self.top.wm_group(parent) self.top.wm_resizable(0, 0) - self.frame = Tkinter.Frame(self.top, relief=Tkinter.FLAT, bd=0, + self.frame = Tkinter.Frame(self.top, relief='flat', bd=0, takefocus=0) - self.cframe = Tkinter.Frame(self.frame, relief=Tkinter.SUNKEN, bd=1, + self.cframe = Tkinter.Frame(self.frame, relief='sunken', bd=1, takefocus=0) self.canvas = Tkinter.Canvas(self.cframe, width=width, height=height, takefocus=0, bd=0, highlightthickness=0) @@ -95,7 +95,7 @@ class PysolProgressBar: self.top = None def pack(self, **kw): - self.canvas.pack(fill=Tkinter.X, expand=0) + self.canvas.pack(fill=Tkinter.X, expand=False) self.frame.pack(**kw) def reset(self, percent=0): diff --git a/pysollib/tk/selectcardset.py b/pysollib/tk/selectcardset.py index 235d1809..abe55882 100644 --- a/pysollib/tk/selectcardset.py +++ b/pysollib/tk/selectcardset.py @@ -201,7 +201,7 @@ class SelectCardsetDialogWithPreview(MfxDialog): w1, w2 = 200, 300 if Tkinter.TkVersion >= 8.4: paned_window = Tkinter.PanedWindow(top_frame) - paned_window.pack(expand=1, fill='both') + paned_window.pack(expand=True, fill='both') left_frame = Tkinter.Frame(paned_window) right_frame = Tkinter.Frame(paned_window) paned_window.add(left_frame) @@ -209,16 +209,16 @@ class SelectCardsetDialogWithPreview(MfxDialog): else: left_frame = Tkinter.Frame(top_frame) right_frame = Tkinter.Frame(top_frame) - left_frame.pack(side='left', expand=0, fill='both') - right_frame.pack(side='right', expand=1, fill='both') + left_frame.pack(side='left', expand=False, fill='both') + right_frame.pack(side='right', expand=True, fill='both') font = app.getFont("default") self.tree = self.Tree_Class(self, left_frame, key=key, default=kw.default, font=font, width=w1) - self.tree.frame.pack(fill='both', expand=1, padx=padx, pady=pady) + self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady) self.preview = MfxScrolledCanvas(right_frame, width=w2) self.preview.setTile(app, app.tabletile_index, force=True) - self.preview.pack(fill='both', expand=1, padx=padx, pady=pady) + self.preview.pack(fill='both', expand=True, padx=padx, pady=pady) self.preview.canvas.preview = 1 # create a preview of the current state self.preview_key = -1 @@ -289,11 +289,10 @@ class SelectCardsetDialogWithPreview(MfxDialog): x, y = 10, y + dy else: x = x + dx - canvas.config(scrollregion=(0, 0, sx+dx, sy+dy)) - canvas.config(width=sx+dx, height=sy+dy) + canvas.config(scrollregion=(0, 0, sx+dx, sy+dy), + width=sx+dx, height=sy+dy) + canvas.event_generate('') # update bg image #canvas.config(xscrollincrement=dx, yscrollincrement=dy) -## self.preview.showHbar() -## self.preview.showVbar() self.preview_key = key diff --git a/pysollib/tk/selectgame.py b/pysollib/tk/selectgame.py index 178f420a..bd01708b 100644 --- a/pysollib/tk/selectgame.py +++ b/pysollib/tk/selectgame.py @@ -289,9 +289,8 @@ class SelectGameDialog(MfxDialog): self.top.wm_minsize(200, 200) font = app.getFont("default") self.tree = self.Tree_Class(self, top_frame, key=gameid, - font=font, - default=kw.default) - self.tree.frame.pack(fill=Tkinter.BOTH, expand=1, + font=font, default=kw.default) + self.tree.frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) @@ -366,7 +365,7 @@ class SelectGameDialogWithPreview(SelectGameDialog): # PanedWindow if Tkinter.TkVersion >= 8.4: paned_window = Tkinter.PanedWindow(top_frame) - paned_window.pack(expand=1, fill='both') + paned_window.pack(expand=True, fill='both') left_frame = Tkinter.Frame(paned_window) right_frame = Tkinter.Frame(paned_window) paned_window.add(left_frame) @@ -374,13 +373,13 @@ class SelectGameDialogWithPreview(SelectGameDialog): else: left_frame = Tkinter.Frame(top_frame) right_frame = Tkinter.Frame(top_frame) - left_frame.pack(side='left', expand=1, fill='both') - right_frame.pack(side='right', expand=1, fill='both') + left_frame.pack(side='left', expand=True, fill='both') + right_frame.pack(side='right', expand=True, fill='both') # Tree font = app.getFont("default") self.tree = self.Tree_Class(self, left_frame, key=gameid, default=kw.default, font=font, width=w1) - self.tree.frame.pack(padx=padx, pady=pady, expand=1, fill='both') + self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both') # LabelFrame if Tkinter.TkVersion >= 8.4: info_frame = Tkinter.LabelFrame(right_frame, text=_('About game')) diff --git a/pysollib/tk/selecttile.py b/pysollib/tk/selecttile.py index 3ad5cccd..703026af 100644 --- a/pysollib/tk/selecttile.py +++ b/pysollib/tk/selecttile.py @@ -133,11 +133,11 @@ class SelectTileDialogWithPreview(MfxDialog): font = app.getFont("default") self.tree = self.Tree_Class(self, top_frame, key=key, default=kw.default, - font=font, - width=w1) - self.tree.frame.pack(side="left", fill=Tkinter.BOTH, expand=0, padx=kw.padx, pady=kw.pady) + font=font, width=w1) + self.tree.frame.pack(side="left", fill='both', expand=False, + padx=kw.padx, pady=kw.pady) self.preview = MfxScrolledCanvas(top_frame, width=w2, hbar=0, vbar=0) - self.preview.pack(side="right", fill=Tkinter.BOTH, expand=1, + self.preview.pack(side="right", fill='both', expand=True, padx=kw.padx, pady=kw.pady) self.preview.canvas.preview = 1 # create a preview of the current state @@ -173,15 +173,19 @@ class SelectTileDialogWithPreview(MfxDialog): self.key = self.tree.selection_key self.tree.n_expansions = 1 # save xyview in any case if button == 1: # "Solid color..." - c = tkColorChooser.askcolor(master=self.top, - initialcolor=self.table_color, - title=_("Select table color")) - if c and c[1]: - color = str(c[1]) - self.key = color.lower() - self.table_color = self.key - self.tree.updateSelection(self.key) - self.updatePreview(self.key) + try: + c = tkColorChooser.askcolor(master=self.top, + initialcolor=self.table_color, + title=_("Select table color")) + except Tkinter.TclError: + pass + else: + if c and c[1]: + color = str(c[1]) + self.key = color.lower() + self.table_color = self.key + self.tree.updateSelection(self.key) + self.updatePreview(self.key) return MfxDialog.mDone(self, button) diff --git a/pysollib/tk/solverdialog.py b/pysollib/tk/solverdialog.py index f7cb22e1..e5626ff4 100644 --- a/pysollib/tk/solverdialog.py +++ b/pysollib/tk/solverdialog.py @@ -194,14 +194,11 @@ class SolverDialog(MfxDialog): # focus = self.createButtons(bottom_frame, kw) - self.mainloop(focus, kw.timeout, transient=False) - self.start_button = self.buttons[0] self.play_button = self.buttons[1] - - # self._reset() self.connectGame(self.app.game) + self.mainloop(focus, kw.timeout, transient=False) def initKw(self, kw): strings=[_('&Start'), _('&Play'), _('&New'), _('&Close'),] @@ -259,6 +256,8 @@ class SolverDialog(MfxDialog): self.play_button.config(state='disabled') def startSolving(self): + from gettext import ungettext + self._reset() game = self.app.game solver = game.Solver_Class(game, self) # create solver instance @@ -274,7 +273,10 @@ class SolverDialog(MfxDialog): solver.computeHints() hints_len = len(solver.hints)-1 if hints_len > 0: - self.result_label['text'] = _('This game is solveable in %s moves.') % hints_len + t = ungettext('This game is solveable in %d move.', + 'This game is solveable in %d moves.', + hints_len) % hints_len + self.result_label['text'] = t self.play_button.config(state='normal') else: self.result_label['text'] = _('I could not solve this game.') @@ -282,9 +284,13 @@ class SolverDialog(MfxDialog): def startPlay(self): self.play_button.config(state='disabled') + self.start_button.focus() + if self.app.game.pause: + self.app.menubar.mPause() self.app.top.tkraise() self.app.top.update_idletasks() self.app.top.update() + self.app.top.after(200) self.app.game.startDemo(level=3) def setText(self, **kw): diff --git a/pysollib/tk/soundoptionsdialog.py b/pysollib/tk/soundoptionsdialog.py index 1209acbd..fe235c4d 100644 --- a/pysollib/tk/soundoptionsdialog.py +++ b/pysollib/tk/soundoptionsdialog.py @@ -145,7 +145,7 @@ class SoundOptionsDialog(MfxDialog): padx=5, pady=5) else: frame = Tkinter.Frame(top_frame, bd=2, relief='groove') - frame.pack(expand=1, fill='both', padx=5, pady=5) + frame.pack(expand=True, fill='both', padx=5, pady=5) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) # diff --git a/pysollib/tk/statusbar.py b/pysollib/tk/statusbar.py index bb6b96cd..758c493e 100644 --- a/pysollib/tk/statusbar.py +++ b/pysollib/tk/statusbar.py @@ -82,9 +82,8 @@ class MfxStatusbar: self.padx = 0 # util - def _createLabel(self, name, side='left', - fill='none', expand=0, width=0, - tooltip=None): + def _createLabel(self, name, side='left', fill='none', + expand=False, width=0, tooltip=None): if 0: frame = Tkinter.Frame(self.frame, bd=1, relief=self.label_relief, highlightbackground='#9e9a9e', @@ -163,7 +162,7 @@ class PysolStatusbar(MfxStatusbar): ): self._createLabel(n, tooltip=t, width=w) # - l = self._createLabel("info", fill='both', expand=1) + l = self._createLabel("info", fill='both', expand=True) ##l.config(text="", justify="left", anchor='w') l.config(padx=8) @@ -171,14 +170,14 @@ class PysolStatusbar(MfxStatusbar): class HelpStatusbar(MfxStatusbar): def __init__(self, top): MfxStatusbar.__init__(self, top, row=4, column=0, columnspan=3) - l = self._createLabel("info", fill='both', expand=1) + l = self._createLabel("info", fill='both', expand=True) l.config(justify="left", anchor='w', padx=8) class HtmlStatusbar(MfxStatusbar): def __init__(self, top, row, column, columnspan): MfxStatusbar.__init__(self, top, row=row, column=column, columnspan=columnspan) - l = self._createLabel("url", fill='both', expand=1) + l = self._createLabel("url", fill='both', expand=True) l.config(justify="left", anchor='w', padx=8) diff --git a/pysollib/tk/tabpage.py b/pysollib/tk/tabpage.py index 028bba84..56a1e643 100644 --- a/pysollib/tk/tabpage.py +++ b/pysollib/tk/tabpage.py @@ -19,7 +19,7 @@ class PageTab(Frame): """ def __init__(self,parent): Frame.__init__(self, parent, borderwidth=2, relief=MYRIDGE) - self.button=Radiobutton(self, padx=5, pady=5, takefocus=FALSE, + self.button=Radiobutton(self, padx=5, pady=5, takefocus=0, indicatoron=FALSE, highlightthickness=0, borderwidth=0, selectcolor=self.cget('bg')) self.button.pack() diff --git a/pysollib/tk/tkcanvas.py b/pysollib/tk/tkcanvas.py index 1e33f44a..a7449836 100644 --- a/pysollib/tk/tkcanvas.py +++ b/pysollib/tk/tkcanvas.py @@ -141,10 +141,10 @@ class MfxCanvas(Tkinter.Canvas): # self.xmargin, self.ymargin = 10, 10 # resize bg image - self.bind('', lambda e: self.set_bg_image()) + self.bind('', self.setBackgroundImage) - def set_bg_image(self): - ##print 'set_bg_image', self._bg_img + def setBackgroundImage(self, event=None): + ##print 'setBackgroundImage', self._bg_img if not hasattr(self, '_bg_img'): return if not self._bg_img: # solid color @@ -305,7 +305,7 @@ class MfxCanvas(Tkinter.Canvas): except: return 0 self._stretch_bg_image = stretch - self.set_bg_image() + self.setBackgroundImage() else: for id in self.__tiles: self.delete(id) diff --git a/pysollib/tk/tkhtml.py b/pysollib/tk/tkhtml.py index 8989db7d..7a1110a1 100644 --- a/pysollib/tk/tkhtml.py +++ b/pysollib/tk/tkhtml.py @@ -269,14 +269,15 @@ class HTMLViewer: # create text widget text_frame = Tkinter.Frame(parent) text_frame.grid(row=1, column=0, columnspan=4, sticky='nsew') + text_frame.grid_propagate(False) vbar = Tkinter.Scrollbar(text_frame) - vbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y) + vbar.pack(side='right', fill='y') self.text = Tkinter.Text(text_frame, fg='black', bg='white', bd=1, relief='sunken', cursor=self.defcursor, wrap='word', padx=10) - self.text.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1) + self.text.pack(side='left', fill='both', expand=True) self.text["yscrollcommand"] = vbar.set vbar["command"] = self.text.yview diff --git a/pysollib/tk/tkstats.py b/pysollib/tk/tkstats.py index fed9ef31..6fbd0f9c 100644 --- a/pysollib/tk/tkstats.py +++ b/pysollib/tk/tkstats.py @@ -143,7 +143,7 @@ class SingleGame_StatsDialog(MfxDialog): def _createChartInit(self, text): w, h = self.tab_x[-1]+20, self.tab_y[-1]+20 c = Tkinter.Canvas(self.top_frame, width=w, height=h) - c.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=0, padx=20, pady=10) + c.pack(side='top', fill='both', expand=False, padx=20, pady=10) self.canvas = c ##self.fg = c.cget("insertbackground") self.fg = c.option_get('foreground', '') or c.cget("insertbackground") @@ -411,7 +411,6 @@ class CanvasFormatter(PysolStatsFormatter): y += 2*self.h for result in self.getStatResults(player, sort_by): gameid = result.pop() - result[0] = _(result[0]) # game name self.pstats(y, result, gameid) y += self.h # @@ -489,7 +488,7 @@ class AllGames_StatsDialog(MfxDialog): # self.sc = AllGames_StatsDialogScrolledCanvas(top_frame, width=kw.width, height=kw.height) - self.sc.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) + self.sc.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) # self.nodes = {} self.canvas = self.sc.canvas @@ -532,7 +531,7 @@ class AllGames_StatsDialog(MfxDialog): self.fillCanvas(self.player, self.title) def singleClick(self, event=None): - id = self.canvas.find_withtag(Tkinter.CURRENT) + id = self.canvas.find_withtag('current') if not id: return ##print 'singleClick:', id, self.nodes.get(id[0]) @@ -657,7 +656,7 @@ class _TopDialog(MfxDialog): 'highlightbackground': 'black', } frame = Tkinter.Frame(**cnf) - frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10) + frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) cnf['master'] = frame cnf['text'] = _('N') @@ -718,7 +717,7 @@ class Top_StatsDialog(MfxDialog): self.createBitmaps(top_frame, kw) frame = Tkinter.Frame(top_frame) - frame.pack(expand=Tkinter.YES, fill=Tkinter.BOTH, padx=10, pady=10) + frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) if (player in app.stats.games_stats and diff --git a/pysollib/tk/tktree.py b/pysollib/tk/tktree.py index c7eeff8e..f3fbcc14 100644 --- a/pysollib/tk/tktree.py +++ b/pysollib/tk/tktree.py @@ -258,7 +258,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas): bind(self.canvas, "", self.singleClick) bind(self.canvas, "", self.doubleClick) ##bind(self.canvas, "", xxx) - self.pack(fill=Tkinter.BOTH, expand=1) + self.pack(fill='both', expand=True) def destroy(self): for node in self.keys.get(self.selection_key, []): @@ -266,7 +266,7 @@ class MfxTreeInCanvas(MfxScrolledCanvas): MfxScrolledCanvas.destroy(self) def findNode(self, event=None): - id = self.canvas.find_withtag(Tkinter.CURRENT) + id = self.canvas.find_withtag('current') if id: return self.nodes.get(id[0]) return None diff --git a/pysollib/tk/tkwidget.py b/pysollib/tk/tkwidget.py index dfc116ad..9f696daa 100644 --- a/pysollib/tk/tkwidget.py +++ b/pysollib/tk/tkwidget.py @@ -37,6 +37,7 @@ __all__ = ['MfxDialog', 'MfxMessageDialog', 'MfxExceptionDialog', 'MfxSimpleEntry', + 'PysolAboutDialog', 'MfxTooltip', 'MfxScrolledCanvas', 'StackDesc', @@ -45,10 +46,11 @@ __all__ = ['MfxDialog', # imports import os, sys, time, types import Tkinter +import tkFont import traceback # PySol imports -from pysollib.mfxutil import destruct, kwdefault, KwStruct +from pysollib.mfxutil import destruct, kwdefault, KwStruct, openURL from pysollib.settings import WIN_SYSTEM # Toolkit imports @@ -173,14 +175,15 @@ class MfxDialog: # ex. _ToplevelDialog def createFrames(self, kw): bottom_frame = Tkinter.Frame(self.top) - bottom_frame.pack(side='bottom', fill='both', expand=0, ipadx=3, ipady=3) + bottom_frame.pack(side='bottom', fill='both', expand=False, + ipadx=3, ipady=3) if kw.separatorwidth > 0: separator = Tkinter.Frame(self.top, relief="sunken", height=kw.separatorwidth, width=kw.separatorwidth, borderwidth=kw.separatorwidth / 2) separator.pack(side='bottom', fill='x') top_frame = Tkinter.Frame(self.top) - top_frame.pack(side='top', fill='both', expand=1) + top_frame.pack(side='top', fill='both', expand=True) return top_frame, bottom_frame def createBitmaps(self, frame, kw): @@ -270,7 +273,7 @@ class MfxMessageDialog(MfxDialog): self.button = kw.default msg = Tkinter.Label(top_frame, text=kw.text, justify=kw.justify, width=kw.width) - msg.pack(fill=Tkinter.BOTH, expand=1, padx=kw.padx, pady=kw.pady) + msg.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout) @@ -295,6 +298,39 @@ class MfxExceptionDialog(MfxMessageDialog): MfxMessageDialog.__init__(self, parent, title, **kw.getKw()) +# /*********************************************************************** +# // +# ************************************************************************/ + +class PysolAboutDialog(MfxMessageDialog): + def __init__(self, app, parent, title, **kw): + self._url = kw['url'] + kw = self.initKw(kw) + MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) + top_frame, bottom_frame = self.createFrames(kw) + self.createBitmaps(top_frame, kw) + # + self.button = kw.default + frame = Tkinter.Frame(top_frame) + frame.pack(fill='both', expand=True, padx=kw.padx, pady=kw.pady) + msg = Tkinter.Label(frame, text=kw.text, justify=kw.justify, + width=kw.width) + msg.pack(fill='both', expand=True) + + font = tkFont.Font(parent, app.getFont('default')) + font.configure(underline=True) + url_label = Tkinter.Label(frame, text=kw.url, font=font, + foreground='blue', cursor='hand2') + url_label.pack() + url_label.bind('<1>', self._urlClicked) + # + focus = self.createButtons(bottom_frame, kw) + self.mainloop(focus, kw.timeout) + + def _urlClicked(self, event): + openURL(self._url) + + # /*********************************************************************** # // # ************************************************************************/ @@ -313,7 +349,7 @@ class MfxSimpleEntry(MfxDialog): w = kw.get("e_width", 0) # width in characters self.var = Tkinter.Entry(top_frame, exportselection=1, width=w) self.var.insert(0, value) - self.var.pack(side=Tkinter.TOP, padx=kw.padx, pady=kw.pady) + self.var.pack(side='top', padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) focus = self.var @@ -355,8 +391,8 @@ class MfxTooltip: self.timeout = 800 # milliseconds self.cancel_timeout = 5000 self.leave_timeout = 400 - self.relief = Tkinter.SOLID - self.justify = Tkinter.LEFT + self.relief = 'solid' + self.justify = 'left' self.fg = "#000000" self.bg = "#ffffe0" self.xoffset = 0 @@ -403,7 +439,7 @@ class MfxTooltip: if self.tooltip or not self.text: return ## if isinstance(self.widget, (Tkinter.Button, Tkinter.Checkbutton)): -## if self.widget["state"] == Tkinter.DISABLED: +## if self.widget["state"] == 'disabled': ## return ##x = self.widget.winfo_rootx() x = self.widget.winfo_pointerx() @@ -429,36 +465,24 @@ class MfxTooltip: # ************************************************************************/ class MfxScrolledCanvas: - def __init__(self, parent, hbar=2, vbar=2, **kw): + def __init__(self, parent, hbar=True, vbar=True, propagate=False, **kw): kwdefault(kw, highlightthickness=0, bd=1, relief='sunken') self.parent = parent self.createFrame(kw) self.canvas = None self.hbar = None - self.hbar_mode = hbar self.vbar = None - self.vbar_mode = vbar - self.hbar_show = 0 - self.vbar_show = 0 - self.resize_pending = 0 - self.timer = None + self.hbar_show = False + self.vbar_show = False self.createCanvas(kw) self.frame.grid_rowconfigure(0, weight=1) self.frame.grid_columnconfigure(0, weight=1) + self.frame.grid_propagate(propagate) if hbar: - if hbar == 3: - w = 21 - self.frame.grid_rowconfigure(1, minsize=w) self.createHbar() - if not vbar: - bind(self.hbar, "", self._mapBar) self.bindHbar() if vbar: - if vbar == 3: - w = 21 - self.frame.grid_columnconfigure(1, minsize=w) self.createVbar() - bind(self.vbar, "", self._mapBar) self.bindVbar() ###self.canvas.focus_set() @@ -467,8 +491,6 @@ class MfxScrolledCanvas: # def destroy(self): - after_cancel(self.timer) - self.timer = None self.unbind_all() self.canvas.destroy() self.frame.destroy() @@ -534,14 +556,18 @@ class MfxScrolledCanvas: self.canvas = MfxCanvas(self.frame, **kw) self.canvas.grid(row=0, column=0, sticky="news") def createHbar(self): - self.hbar = Tkinter.Scrollbar(self.frame, name="hbar", - takefocus=0, orient="horizontal") + self.hbar = Tkinter.Scrollbar(self.frame, takefocus=0, + orient="horizontal") self.canvas["xscrollcommand"] = self._setHbar self.hbar["command"] = self.canvas.xview + self.hbar.grid(row=1, column=0, sticky="we") + self.hbar.grid_remove() def createVbar(self): - self.vbar = Tkinter.Scrollbar(self.frame, name="vbar", takefocus=0) + self.vbar = Tkinter.Scrollbar(self.frame, takefocus=0) self.canvas["yscrollcommand"] = self._setVbar self.vbar["command"] = self.canvas.yview + self.vbar.grid(row=0, column=1, sticky="ns") + self.vbar.grid_remove() def bindHbar(self, w=None): if w is None: w = self.canvas @@ -564,70 +590,33 @@ class MfxScrolledCanvas: # don't work on Linux #bind(w, '', self.mouse_wheel) - def mouse_wheel(self, *args): print 'MfxScrolledCanvas.mouse_wheel', args - def _mapBar(self, event): - # see: autoscroll.tcl, http://mini.net/cgi-bin/wikit/950.html - top = event.widget.winfo_toplevel() - g = top.wm_geometry() - if self.resize_pending: - self.resize_pending = 0 - self.canvas.update() - self.canvas.update_idletasks() - top.wm_geometry(g) - - def _setHbar(self, *args): - self.canvas.update() - self.hbar.set(*self.canvas.xview()) - self.showHbar() - ##self.hbar.update_idletasks() - def _setVbar(self, *args): - self.canvas.update() - self.vbar.set(*self.canvas.yview()) - self.showVbar() - ##self.vbar.update_idletasks() - - def showHbar(self, show=-1): - if not self.hbar: - return 0 - if show < 0: - show = self.hbar_mode - if show > 1: - if not self.canvas.winfo_ismapped(): - return 0 - ##self.canvas.update() - view = self.canvas.xview() - show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001 - if show == self.hbar_show: - return 0 - if show: - self.hbar.grid(row=1, column=0, sticky="we") + def _setHbar(self, first, last): + sb = self.hbar + if not self.canvas.winfo_ismapped(): + sb.set(first, last) + return + if float(first) <= 0 and float(last) >= 1: + sb.grid_remove() + self.hbar_show = False else: - self.hbar.grid_forget() - self.hbar_show = show - return 1 - - def showVbar(self, show=-1): - if not self.vbar: - return 0 - if show < 0: - show = self.vbar_mode - if show > 1: - if not self.canvas.winfo_ismapped(): - return 0 - ##self.canvas.update() - view = self.canvas.yview() - show = abs(view[0]) > 0.0001 or abs(view[1] - 1.0) > 0.0001 - if show == self.vbar_show: - return 0 - if show: - self.vbar.grid(row=0, column=1, sticky="ns") + sb.grid() + self.hbar_show = True + sb.set(first, last) + def _setVbar(self, first, last): + sb = self.vbar + if not self.canvas.winfo_ismapped(): + sb.set(first, last) + return + if float(first) <= 0 and float(last) >= 1: + sb.grid_remove() + self.vbar_show = False else: - self.vbar.grid_forget() - self.vbar_show = show - return 1 + sb.grid() + self.vbar_show = True + sb.set(first, last) def _xview(self, *args): if self.hbar_show: self.canvas.xview(*args) diff --git a/pysollib/tk/tkwrap.py b/pysollib/tk/tkwrap.py index 2224cf87..6f6b85b8 100644 --- a/pysollib/tk/tkwrap.py +++ b/pysollib/tk/tkwrap.py @@ -34,9 +34,6 @@ ##---------------------------------------------------------------------------## __all__ = ['TclError', - 'MfxCheckMenuItem', - 'MfxRadioMenuItem', - 'StringVar', 'MfxRoot'] # imports @@ -53,32 +50,6 @@ from tkutil import after_idle from tkconst import EVENT_HANDLED, EVENT_PROPAGATE -# /*********************************************************************** -# // menubar -# ************************************************************************/ - -class MfxCheckMenuItem(Tkinter.BooleanVar): - def __init__(self, menubar, path=None): - Tkinter.BooleanVar.__init__(self) - def set(self, value): - if not value or value == "false": value = 0 - ##print value, type(value) - Tkinter.BooleanVar.set(self, value) - - -class MfxRadioMenuItem(Tkinter.IntVar): - def __init__(self, menubar, path=None): - Tkinter.IntVar.__init__(self) - def set(self, value): - Tkinter.IntVar.set(self, value) - - -## BooleanVar = Tkinter.BooleanVar -## IntVar = Tkinter.IntVar - -StringVar = Tkinter.StringVar - - # /*********************************************************************** # // Wrapper class for Tk. # // Required so that a Game will get properly destroyed. diff --git a/pysollib/tk/toolbar.py b/pysollib/tk/toolbar.py index b4f59b80..ea85b6cf 100644 --- a/pysollib/tk/toolbar.py +++ b/pysollib/tk/toolbar.py @@ -69,7 +69,7 @@ class AbstractToolbarButton: return self.visible = True padx, pady = 2, 2 - if orient == Tkinter.HORIZONTAL: + if orient == 'horizontal': self.grid(row=0, column=self.position, ipadx=padx, ipady=pady, @@ -112,7 +112,7 @@ class ToolbarSeparator(Tkinter.Frame): height = 4 padx = 6 pady = 6 - if orient == Tkinter.HORIZONTAL: + if orient == 'horizontal': self.config(width=width, height=height) self.grid(row=0, column=self.position, @@ -144,7 +144,7 @@ class ToolbarLabel(Tkinter.Message): return self.visible = True padx, pady = TkSettings.toolbar_label_padding - if orient == Tkinter.HORIZONTAL: + if orient == 'horizontal': self.grid(row=0, column=self.position, padx=padx, pady=pady, @@ -166,8 +166,7 @@ class ToolbarLabel(Tkinter.Message): class PysolToolbar(PysolToolbarActions): - def __init__(self, top, dir, size=0, relief=Tkinter.FLAT, - compound=Tkinter.NONE): + def __init__(self, top, dir, size=0, relief='flat', compound='none'): PysolToolbarActions.__init__(self) @@ -179,7 +178,7 @@ class PysolToolbar(PysolToolbarActions): self.dir = dir self.size = size self.compound = compound - self.orient=Tkinter.HORIZONTAL + self.orient = 'horizontal' self.button_pad = 2 # self.frame = Tkinter.Frame(top, relief=TkSettings.toolbar_relief, @@ -401,7 +400,7 @@ class PysolToolbar(PysolToolbarActions): # right pack_func(row=1, column=2, sticky='ns') # set orient - orient = side in (1, 2) and Tkinter.HORIZONTAL or Tkinter.VERTICAL + orient = side in (1, 2) and 'horizontal' or 'vertical' self._setOrient(orient) self.side = side return 1 @@ -516,6 +515,6 @@ class PysolToolbar(PysolToolbarActions): if self.compound == 'text': return 0 size = self.size - comp = int(self.compound in (Tkinter.TOP, Tkinter.BOTTOM)) + comp = int(self.compound in ('top', 'bottom')) return int((size+comp) != 0) diff --git a/pysollib/winsystems/x11.py b/pysollib/winsystems/x11.py index d1118c77..9952f07d 100644 --- a/pysollib/winsystems/x11.py +++ b/pysollib/winsystems/x11.py @@ -53,9 +53,16 @@ class initRootWindow(baseInitRootWindow): color = style.lookup('.', 'background') if color: root.tk_setPalette(color) + + root.option_add('*Menu.borderWidth', 1, 60) + root.option_add('*Menu.activeBorderWidth', 1, 60) color = style.lookup('.', 'background', 'active') if color: - root.option_add('*Menu.activeBackground', color) + root.option_add('*Menu.activeBackground', color, 60) + + root.option_add('*Listbox.background', 'white', 60) + root.option_add('*Listbox.foreground', 'black', 60) + font = root.option_get('font', PACKAGE) if font: # use font from xrdb @@ -75,10 +82,10 @@ class initRootWindow(baseInitRootWindow): if fn: root.option_add('*font', font) app.opt.fonts['default'] = fn - root.option_add('*Menu.borderWidth', 1, 60) - root.option_add('*Menu.activeBorderWidth', 1, 60) - if app.opt.tile_theme == 'clam': + if app.opt.tile_theme in ('clam', 'clearlooks'): root.wm_minsize(550, 360) + style.configure('TLabelframe', labeloutside=False, + labelmargins=(8, 0, 8, 0)) # else: root.option_add('*Entry.background', 'white', 60) diff --git a/pysollib/wizardutil.py b/pysollib/wizardutil.py index 61701644..52d4b0f1 100644 --- a/pysollib/wizardutil.py +++ b/pysollib/wizardutil.py @@ -168,13 +168,6 @@ FoundDir = WizSetting( label = _('Direction:'), var_name = 'found_dir', ) -FoundWrap = WizSetting( - values_map = (0, 1), - default = 0, - label = _('Wrapping:'), - var_name = 'found_wrap', - widget = 'check', - ) FoundMaxMove = WizSetting( values_map = ((n_('None'), 0,), (n_('Top card'), 1)), default = n_('Top card'), @@ -328,7 +321,6 @@ WizardWidgets = ( FoundType, FoundBaseCard, FoundDir, - ##FoundWrap, FoundMaxMove, FoundEqual, _('Tableau'), diff --git a/setup.py b/setup.py index 266a7a6b..815fcae2 100644 --- a/setup.py +++ b/setup.py @@ -44,8 +44,10 @@ if os.name == 'posix': for l in ('ru', 'ru_RU'): data_files.append(('share/locale/%s/LC_MESSAGES' % l, ['locale/%s/LC_MESSAGES/pysol.mo' % l])) + data_files.append((data_dir, ['data/pysolfc.glade'])) ##from pprint import pprint; pprint(data_files) +##import sys; sys.exit() long_description = '''\ PySol is a solitaire card game. Its features include support for many