From f5bde7fb4ed3b15d9aa39f6dd72fe80b3ad6962a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Teuli=C3=A8re?= Date: Wed, 3 Sep 2008 17:28:27 +0000 Subject: [PATCH] - Compilation fix for Windows - Display the Eliot icon - Improved printing - Allow changing the level of computer players - Generate automatically a default name for players - Translate Qt's own strings (only works on Linux at the moment) --- Makefile.am | 2 + configure.in | 5 +- dic/grammar.cpp | 2 +- po/eliot.pot | 108 ++++++++------- po/fr.po | 110 ++++++++------- qt/Makefile.am | 20 ++- qt/aux_window.cpp | 2 + qt/eliot.qrc | 5 + qt/images/eliot.xpm | 315 +++++++++++++++++++++++++++++++++++++++++++ qt/main.cpp | 24 +++- qt/main_window.cpp | 35 +++-- qt/new_game.cpp | 122 ++++++++++++++--- qt/new_game.h | 34 ++++- qt/qtcommon.h | 12 +- qt/ui/main_window.ui | 14 +- qt/ui/new_game.ui | 26 +++- 16 files changed, 678 insertions(+), 158 deletions(-) create mode 100644 qt/eliot.qrc create mode 100644 qt/images/eliot.xpm diff --git a/Makefile.am b/Makefile.am index a00a4c7..4f67dd4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,6 +26,8 @@ package-win32-zip: mkdir -p $(WIN32_PACKAGE_DIR)/locale/$${lang}/LC_MESSAGES; \ cp $(top_srcdir)/po/$${lang}.gmo $(WIN32_PACKAGE_DIR)/locale/$${lang}/LC_MESSAGES/eliot.mo; \ done + mkdir -p $(WIN32_PACKAGE_DIR)/locale/qt4 + cp $(QT4LOCALEDIR)/*.qm $(WIN32_PACKAGE_DIR)/locale/qt4/ || true # Copy relevant text files for i in AUTHORS COPYING NEWS; do \ diff --git a/configure.in b/configure.in index b5507ae..e0acb14 100644 --- a/configure.in +++ b/configure.in @@ -147,11 +147,14 @@ dnl check for Qt AC_ARG_ENABLE([qt],AC_HELP_STRING([--enable-qt], [Qt interface support (default disabled)])) qt_ok=0 -AS_IF([test "${enable_qt}" = "yes"], +AS_IF([test "${enable_qt}" != "no"], [PKG_CHECK_MODULES(QT, [QtCore QtGui >= 4.2.0], [qt_ok=1 AC_PATH_PROG(MOC, moc, moc,`$PKG_CONFIG --variable=exec_prefix QtCore`/bin) AC_PATH_PROG(UIC, uic, uic,`$PKG_CONFIG --variable=exec_prefix QtCore`/bin) + AC_PATH_PROG(RCC, rcc, rcc,`$PKG_CONFIG --variable=exec_prefix QtCore`/bin) + QT4LOCALEDIR="$($PKG_CONFIG --variable=prefix QtCore)/share/qt4/translations/" + AC_SUBST(QT4LOCALEDIR) ], [AC_MSG_ERROR([Could not find Qt on your system (using pkg-config)])] ) diff --git a/dic/grammar.cpp b/dic/grammar.cpp index 125213e..441ca56 100644 --- a/dic/grammar.cpp +++ b/dic/grammar.cpp @@ -190,7 +190,7 @@ void evaluate(const Header &iHeader, iter_t const& i, stack &evalStack, for (iter = i->children.begin(); iter != i->children.end(); ++iter) evaluate(iHeader, iter, evalStack, iList); // "Concatenate" the created child nodes with AND nodes - for (uint j = 0; j < i->children.size() - 1; ++j) + for (unsigned int j = 0; j < i->children.size() - 1; ++j) { Node *old2 = evalStack.top(); evalStack.pop(); diff --git a/po/eliot.pot b/po/eliot.pot index aeb4fcd..96e754d 100644 --- a/po/eliot.pot +++ b/po/eliot.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-08-31 12:51+0200\n" +"POT-Creation-Date: 2008-09-02 23:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -270,8 +270,8 @@ msgstr "" msgid "Invalid regular expression: " msgstr "" -#: game/training.cpp:49 qt/new_game.cpp:86 qt/new_game.cpp:94 -#: qt/new_game.cpp:126 qt/ui/new_game.ui:46 +#: game/training.cpp:49 qt/new_game.cpp:96 qt/new_game.cpp:104 +#: qt/new_game.cpp:139 qt/ui/new_game.ui:46 msgid "Training" msgstr "" @@ -309,7 +309,7 @@ msgstr "" msgid " N | RACK | SOLUTION | REF | PTS | P | BONUS" msgstr "" -#: utils/ncurses.cpp:411 qt/history_widget.cpp:143 qt/main_window.cpp:435 +#: utils/ncurses.cpp:411 qt/history_widget.cpp:143 qt/main_window.cpp:442 msgid "(PASS)" msgstr "" @@ -415,7 +415,7 @@ msgstr "" msgid " Ctrl-l Refresh the screen" msgstr "" -#: utils/ncurses.cpp:483 wxwin/auxframes.cc:147 qt/main_window.cpp:518 +#: utils/ncurses.cpp:483 wxwin/auxframes.cc:147 qt/main_window.cpp:525 #: qt/ui/main_window.ui:188 msgid "Bag" msgstr "" @@ -817,7 +817,7 @@ msgstr "" msgid "&Save as...\tCtrl+S" msgstr "" -#: wxwin/mainframe.cc:276 qt/ui/main_window.ui:229 +#: wxwin/mainframe.cc:276 qt/ui/main_window.ui:232 msgid "Save the current game" msgstr "" @@ -857,7 +857,7 @@ msgstr "" msgid "&Dictionary...\tCtrl+D" msgstr "" -#: wxwin/mainframe.cc:287 wxwin/mainframe.cc:604 qt/main_window.cpp:485 +#: wxwin/mainframe.cc:287 wxwin/mainframe.cc:604 qt/main_window.cpp:492 msgid "Choose a dictionary" msgstr "" @@ -1065,7 +1065,7 @@ msgstr "" msgid "&About..." msgstr "" -#: wxwin/mainframe.cc:331 wxwin/mainframe.cc:733 qt/main_window.cpp:596 +#: wxwin/mainframe.cc:331 wxwin/mainframe.cc:733 qt/main_window.cpp:603 #: qt/ui/main_window.ui:161 msgid "About Eliot" msgstr "" @@ -1256,12 +1256,11 @@ msgstr "" msgid "Ref" msgstr "" -#: qt/history_widget.cpp:87 qt/new_game.cpp:49 qt/score_widget.cpp:46 -#: qt/ui/new_game.ui:102 +#: qt/history_widget.cpp:87 qt/score_widget.cpp:46 msgid "Player" msgstr "" -#: qt/main_window.cpp:91 qt/main_window.cpp:536 qt/ui/main_window.ui:40 +#: qt/main_window.cpp:91 qt/main_window.cpp:543 qt/ui/main_window.ui:40 msgid "Board" msgstr "" @@ -1277,7 +1276,7 @@ msgstr "" msgid "Duplicate game" msgstr "" -#: qt/main_window.cpp:201 qt/new_game.cpp:88 qt/new_game.cpp:145 +#: qt/main_window.cpp:201 qt/new_game.cpp:98 qt/new_game.cpp:164 #: qt/ui/new_game.ui:41 msgid "Free game" msgstr "" @@ -1298,44 +1297,44 @@ msgstr "" msgid "Game saved" msgstr "" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "N." msgstr "" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "RACK" msgstr "" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "SOLUTION" msgstr "" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "REF" msgstr "" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "PTS" msgstr "" -#: qt/main_window.cpp:476 +#: qt/main_window.cpp:483 msgid "Stop current game?" msgstr "" -#: qt/main_window.cpp:477 +#: qt/main_window.cpp:484 msgid "" "Loading a dictionary will stop the current game. Do you want to continue?" msgstr "" -#: qt/main_window.cpp:554 qt/ui/main_window.ui:53 qt/ui/main_window.ui:251 +#: qt/main_window.cpp:561 qt/ui/main_window.ui:53 qt/ui/main_window.ui:257 msgid "History" msgstr "" -#: qt/main_window.cpp:571 qt/ui/main_window.ui:276 +#: qt/main_window.cpp:578 qt/ui/main_window.ui:282 msgid "Dictionary tools" msgstr "" -#: qt/main_window.cpp:588 +#: qt/main_window.cpp:595 msgid "" "Copyright (C) 1999-2008 - Antoine Fraboulet & Olivier Teuliere\n" "\n" @@ -1345,31 +1344,36 @@ msgid "" "any later version." msgstr "" -#: qt/new_game.cpp:36 qt/ui/new_game.ui:117 +#: qt/new_game.cpp:38 qt/ui/new_game.ui:117 msgid "Human" msgstr "" -#: qt/new_game.cpp:37 qt/ui/new_game.ui:122 +#: qt/new_game.cpp:39 qt/ui/new_game.ui:122 msgid "Computer" msgstr "" -#: qt/new_game.cpp:47 -msgid "Name" -msgstr "" - -#: qt/new_game.cpp:48 -msgid "Type" -msgstr "" - -#: qt/new_game.cpp:51 -msgid "Eliot" -msgstr "" - -#: qt/new_game.cpp:101 +#: qt/new_game.cpp:46 qt/new_game.cpp:53 qt/new_game.cpp:111 +#: qt/new_game.cpp:200 qt/new_game.cpp:203 msgid "Player %1" msgstr "" -#: qt/new_game.cpp:144 qt/ui/new_game.ui:36 +#: qt/new_game.cpp:50 +msgid "Name" +msgstr "" + +#: qt/new_game.cpp:51 +msgid "Type" +msgstr "" + +#: qt/new_game.cpp:52 +msgid "Level" +msgstr "" + +#: qt/new_game.cpp:55 +msgid "Eliot" +msgstr "" + +#: qt/new_game.cpp:163 qt/ui/new_game.ui:36 msgid "Duplicate" msgstr "" @@ -1453,43 +1457,43 @@ msgstr "" msgid "Edit the preferences" msgstr "" -#: qt/ui/main_window.ui:207 +#: qt/ui/main_window.ui:210 msgid "Save" msgstr "" -#: qt/ui/main_window.ui:215 +#: qt/ui/main_window.ui:218 msgid "Load..." msgstr "" -#: qt/ui/main_window.ui:218 +#: qt/ui/main_window.ui:221 msgid "Load an existing game" msgstr "" -#: qt/ui/main_window.ui:226 +#: qt/ui/main_window.ui:229 msgid "Save as..." msgstr "" -#: qt/ui/main_window.ui:240 +#: qt/ui/main_window.ui:243 msgid "External board" msgstr "" -#: qt/ui/main_window.ui:243 +#: qt/ui/main_window.ui:246 msgid "Show/hide the external board" msgstr "" -#: qt/ui/main_window.ui:254 +#: qt/ui/main_window.ui:260 msgid "Show/hide the game history" msgstr "" -#: qt/ui/main_window.ui:262 +#: qt/ui/main_window.ui:268 msgid "Print..." msgstr "" -#: qt/ui/main_window.ui:265 +#: qt/ui/main_window.ui:271 msgid "Print the current game" msgstr "" -#: qt/ui/main_window.ui:279 +#: qt/ui/main_window.ui:285 msgid "Show/hide the dictionary tools" msgstr "" @@ -1513,11 +1517,15 @@ msgstr "" msgid "Type:" msgstr "" -#: qt/ui/new_game.ui:134 +#: qt/ui/new_game.ui:130 +msgid "Level:" +msgstr "" + +#: qt/ui/new_game.ui:154 msgid "Add player" msgstr "" -#: qt/ui/new_game.ui:157 +#: qt/ui/new_game.ui:177 msgid "Remove player" msgstr "" diff --git a/po/fr.po b/po/fr.po index 3db1797..75e5dbd 100644 --- a/po/fr.po +++ b/po/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: eliot 1.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-08-31 12:51+0200\n" +"POT-Creation-Date: 2008-09-02 23:17+0200\n" "PO-Revision-Date: 2008-08-31 10:43+0100\n" "Last-Translator: Olivier Teuliere \n" "Language-Team: French \n" @@ -288,8 +288,8 @@ msgstr "résultat :" msgid "Invalid regular expression: " msgstr "Expression régulière invalide : " -#: game/training.cpp:49 qt/new_game.cpp:86 qt/new_game.cpp:94 -#: qt/new_game.cpp:126 qt/ui/new_game.ui:46 +#: game/training.cpp:49 qt/new_game.cpp:96 qt/new_game.cpp:104 +#: qt/new_game.cpp:139 qt/ui/new_game.ui:46 msgid "Training" msgstr "Entraînement" @@ -327,7 +327,7 @@ msgstr "Historique de la partie" msgid " N | RACK | SOLUTION | REF | PTS | P | BONUS" msgstr " N | TIRAGE | SOLUTION | REF | PTS | J | BONUS" -#: utils/ncurses.cpp:411 qt/history_widget.cpp:143 qt/main_window.cpp:435 +#: utils/ncurses.cpp:411 qt/history_widget.cpp:143 qt/main_window.cpp:442 msgid "(PASS)" msgstr "(PASSE)" @@ -438,7 +438,7 @@ msgstr " , Naviguer dans une boîte page par page" msgid " Ctrl-l Refresh the screen" msgstr " Ctrl-l Rafraîchir l'écran" -#: utils/ncurses.cpp:483 wxwin/auxframes.cc:147 qt/main_window.cpp:518 +#: utils/ncurses.cpp:483 wxwin/auxframes.cc:147 qt/main_window.cpp:525 #: qt/ui/main_window.ui:188 msgid "Bag" msgstr "Sac" @@ -840,7 +840,7 @@ msgstr "&Charger...\tCtrl+O" msgid "&Save as...\tCtrl+S" msgstr "&Enregistrer sous...\tCtrl+S" -#: wxwin/mainframe.cc:276 qt/ui/main_window.ui:229 +#: wxwin/mainframe.cc:276 qt/ui/main_window.ui:232 msgid "Save the current game" msgstr "Sauvegarder la partie en cours" @@ -880,7 +880,7 @@ msgstr "Quitter Eliot" msgid "&Dictionary...\tCtrl+D" msgstr "&Dictionnaire...\tCtrl+D" -#: wxwin/mainframe.cc:287 wxwin/mainframe.cc:604 qt/main_window.cpp:485 +#: wxwin/mainframe.cc:287 wxwin/mainframe.cc:604 qt/main_window.cpp:492 msgid "Choose a dictionary" msgstr "Choisir un dictionnaire" @@ -1088,7 +1088,7 @@ msgstr "Ré&sultats" msgid "&About..." msgstr "À &propos..." -#: wxwin/mainframe.cc:331 wxwin/mainframe.cc:733 qt/main_window.cpp:596 +#: wxwin/mainframe.cc:331 wxwin/mainframe.cc:733 qt/main_window.cpp:603 #: qt/ui/main_window.ui:161 msgid "About Eliot" msgstr "À propos d'Eliot" @@ -1286,12 +1286,11 @@ msgstr "Coup" msgid "Ref" msgstr "Ref" -#: qt/history_widget.cpp:87 qt/new_game.cpp:49 qt/score_widget.cpp:46 -#: qt/ui/new_game.ui:102 +#: qt/history_widget.cpp:87 qt/score_widget.cpp:46 msgid "Player" msgstr "Joueur" -#: qt/main_window.cpp:91 qt/main_window.cpp:536 qt/ui/main_window.ui:40 +#: qt/main_window.cpp:91 qt/main_window.cpp:543 qt/ui/main_window.ui:40 msgid "Board" msgstr "Grille" @@ -1308,7 +1307,7 @@ msgstr "Pas de partie en cours" msgid "Duplicate game" msgstr "Partie duplicate" -#: qt/main_window.cpp:201 qt/new_game.cpp:88 qt/new_game.cpp:145 +#: qt/main_window.cpp:201 qt/new_game.cpp:98 qt/new_game.cpp:164 #: qt/ui/new_game.ui:41 msgid "Free game" msgstr "Partie libre" @@ -1329,45 +1328,45 @@ msgstr "Sauvegarder la partie" msgid "Game saved" msgstr "Partie enregistrée" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "N." msgstr "N." -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "RACK" msgstr "TIRAGE" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "SOLUTION" msgstr "SOLUTION" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "REF" msgstr "REF" -#: qt/main_window.cpp:343 +#: qt/main_window.cpp:350 msgid "PTS" msgstr "PTS" -#: qt/main_window.cpp:476 +#: qt/main_window.cpp:483 msgid "Stop current game?" msgstr "Arrêter la partie en cours ?" -#: qt/main_window.cpp:477 +#: qt/main_window.cpp:484 msgid "" "Loading a dictionary will stop the current game. Do you want to continue?" msgstr "" "Charger un dictionnaire arrêtera la partie en cours. Voulez-vous continuer ?" -#: qt/main_window.cpp:554 qt/ui/main_window.ui:53 qt/ui/main_window.ui:251 +#: qt/main_window.cpp:561 qt/ui/main_window.ui:53 qt/ui/main_window.ui:257 msgid "History" msgstr "Historique" -#: qt/main_window.cpp:571 qt/ui/main_window.ui:276 +#: qt/main_window.cpp:578 qt/ui/main_window.ui:282 msgid "Dictionary tools" -msgstr "Dictionnaire" +msgstr "Outils du dictionnaire" -#: qt/main_window.cpp:588 +#: qt/main_window.cpp:595 msgid "" "Copyright (C) 1999-2008 - Antoine Fraboulet & Olivier Teuliere\n" "\n" @@ -1383,31 +1382,36 @@ msgstr "" "publiée par la Free Software Fundation ; soit la version 2 de la Licence, " "soit (comme vous le préférez), n'importe quelle version ultérieure." -#: qt/new_game.cpp:36 qt/ui/new_game.ui:117 +#: qt/new_game.cpp:38 qt/ui/new_game.ui:117 msgid "Human" msgstr "Humain" -#: qt/new_game.cpp:37 qt/ui/new_game.ui:122 +#: qt/new_game.cpp:39 qt/ui/new_game.ui:122 msgid "Computer" msgstr "Ordinateur" -#: qt/new_game.cpp:47 -msgid "Name" -msgstr "Nom" - -#: qt/new_game.cpp:48 -msgid "Type" -msgstr "Type" - -#: qt/new_game.cpp:51 -msgid "Eliot" -msgstr "Eliot" - -#: qt/new_game.cpp:101 +#: qt/new_game.cpp:46 qt/new_game.cpp:53 qt/new_game.cpp:111 +#: qt/new_game.cpp:200 qt/new_game.cpp:203 msgid "Player %1" msgstr "Joueur %1" -#: qt/new_game.cpp:144 qt/ui/new_game.ui:36 +#: qt/new_game.cpp:50 +msgid "Name" +msgstr "Nom" + +#: qt/new_game.cpp:51 +msgid "Type" +msgstr "Type" + +#: qt/new_game.cpp:52 +msgid "Level" +msgstr "Niveau" + +#: qt/new_game.cpp:55 +msgid "Eliot" +msgstr "Eliot" + +#: qt/new_game.cpp:163 qt/ui/new_game.ui:36 msgid "Duplicate" msgstr "Duplicate" @@ -1491,43 +1495,43 @@ msgstr "&Préférences..." msgid "Edit the preferences" msgstr "Modifier les préférences" -#: qt/ui/main_window.ui:207 +#: qt/ui/main_window.ui:210 msgid "Save" msgstr "Sauver" -#: qt/ui/main_window.ui:215 +#: qt/ui/main_window.ui:218 msgid "Load..." msgstr "&Charger..." -#: qt/ui/main_window.ui:218 +#: qt/ui/main_window.ui:221 msgid "Load an existing game" msgstr "Charger une partie existante" -#: qt/ui/main_window.ui:226 +#: qt/ui/main_window.ui:229 msgid "Save as..." msgstr "&Enregistrer sous..." -#: qt/ui/main_window.ui:240 +#: qt/ui/main_window.ui:243 msgid "External board" msgstr "&Plateau de jeu externe" -#: qt/ui/main_window.ui:243 +#: qt/ui/main_window.ui:246 msgid "Show/hide the external board" msgstr "Afficher/cacher le plateau de jeu externe" -#: qt/ui/main_window.ui:254 +#: qt/ui/main_window.ui:260 msgid "Show/hide the game history" msgstr "Afficher/cacher l'historique de la partie" -#: qt/ui/main_window.ui:262 +#: qt/ui/main_window.ui:268 msgid "Print..." msgstr "&Impression..." -#: qt/ui/main_window.ui:265 +#: qt/ui/main_window.ui:271 msgid "Print the current game" msgstr "Imprimer la partie en cours" -#: qt/ui/main_window.ui:279 +#: qt/ui/main_window.ui:285 msgid "Show/hide the dictionary tools" msgstr "Afficher/cacher les outils de recherche dans le dictionnaire" @@ -1551,11 +1555,15 @@ msgstr "Nom :" msgid "Type:" msgstr "Type :" -#: qt/ui/new_game.ui:134 +#: qt/ui/new_game.ui:130 +msgid "Level:" +msgstr "Niveau :" + +#: qt/ui/new_game.ui:154 msgid "Add player" msgstr "Ajouter un joueur" -#: qt/ui/new_game.ui:157 +#: qt/ui/new_game.ui:177 msgid "Remove player" msgstr "Supprimer un joueur" diff --git a/qt/Makefile.am b/qt/Makefile.am index 3fc5078..22407d0 100644 --- a/qt/Makefile.am +++ b/qt/Makefile.am @@ -20,19 +20,24 @@ localedir = $(datadir)/locale if BUILD_QT -AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" @QT_CFLAGS@ -I$(top_srcdir) -I../intl -I$(top_srcdir)/dic -I$(top_srcdir)/game +AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" @QT_CFLAGS@ -DQT4LOCALEDIR=\"@QT4LOCALEDIR@\" -I$(top_srcdir) -I../intl -I$(top_srcdir)/dic -I$(top_srcdir)/game SUFFIXES=.ui.h .moc.cpp bin_PROGRAMS = qeliot +RESOURCES = \ + images/eliot.xpm + EXTRA_DIST = \ + ui/dic_tools_widget.ui \ ui/main_window.ui \ ui/new_game.ui \ - ui/training_widget.ui \ - ui/prefs_dialog.ui \ ui/player_widget.ui \ - ui/dic_tools_widget.ui + ui/prefs_dialog.ui \ + ui/training_widget.ui \ + eliot.qrc \ + $(RESOURCES) BUILT_SOURCES = \ ui/main_window.ui.h \ @@ -51,7 +56,8 @@ BUILT_SOURCES = \ training_widget.moc.cpp \ prefs_dialog.moc.cpp \ aux_window.moc.cpp \ - main_window.moc.cpp + main_window.moc.cpp \ + resources.cpp qeliot_SOURCES = \ qtcommon.h \ @@ -71,6 +77,10 @@ qeliot_SOURCES += $(BUILT_SOURCES) qeliot_LDADD = @QT_LIBS@ ../game/libgame.a ../dic/libdic.a @LIBINTL@ +# Generate a cpp file from the resources +resources.cpp: eliot.qrc $(RESOURCES) + $(RCC) -o $@ $< + # Generate the implementation file from the header %.moc.cpp: %.h $(MOC) -o $@ $< diff --git a/qt/aux_window.cpp b/qt/aux_window.cpp index 892084d..a1f8f35 100644 --- a/qt/aux_window.cpp +++ b/qt/aux_window.cpp @@ -20,6 +20,7 @@ #include "config.h" +#include #include #include #include @@ -35,6 +36,7 @@ AuxWindow::AuxWindow(QWidget &iWidget, QString iWindowTitle, : m_widget(iWidget), m_windowName(iWindowName), m_action(iAction) { setWindowTitle(iWindowTitle); + setWindowIcon(qApp->windowIcon()); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(&iWidget); setLayout(layout); diff --git a/qt/eliot.qrc b/qt/eliot.qrc new file mode 100644 index 0000000..580163b --- /dev/null +++ b/qt/eliot.qrc @@ -0,0 +1,5 @@ + + + images/eliot.xpm + + diff --git a/qt/images/eliot.xpm b/qt/images/eliot.xpm new file mode 100644 index 0000000..a64cadf --- /dev/null +++ b/qt/images/eliot.xpm @@ -0,0 +1,315 @@ +/* XPM */ +static char * eliot_xpm[] = { +"48 48 264 2", +" c None", +". c #E2E2E2", +"+ c #EFEFEF", +"@ c #EEEFEE", +"# c #EEEEEE", +"$ c #DBDBDB", +"% c #EDEEED", +"& c #D9DAD9", +"* c #FFFFFF", +"= c #CACACA", +"- c #F0F0F0", +"; c #BEBEBE", +"> c #E1E1E1", +", c #C7C7C7", +"' c #BCBCBC", +") c #D3D3D3", +"! c #A3A3A3", +"~ c #F9F9F9", +"{ c #A0A0A0", +"] c #C1C1C1", +"^ c #E0E0E0", +"/ c #B5B5B5", +"( c #D2D2D2", +"_ c #CDCDCD", +": c #B4B4B4", +"< c #B9B9B9", +"[ c #FDFDFD", +"} c #C3C3C3", +"| c #D4D4D4", +"1 c #F5F5F5", +"2 c #969696", +"3 c #EDEDED", +"4 c #A9A9A9", +"5 c #A6A6A6", +"6 c #BFBFBF", +"7 c #A8A8A8", +"8 c #E5E6E5", +"9 c #FBFBFB", +"0 c #E5E2E2", +"a c #E2DFDF", +"b c #E4E3E2", +"c c #E3E3E3", +"d c #DCDCDC", +"e c #E4E5E4", +"f c #E2E3E2", +"g c #E2E4E4", +"h c #CED1D2", +"i c #DEE1E2", +"j c #DEDEDE", +"k c #E5E5E5", +"l c #DFE0DF", +"m c #E4E4E4", +"n c #DFDCDC", +"o c #E4E4E3", +"p c #E0E1E0", +"q c #E0E4E5", +"r c #D5D9D9", +"s c #DFE1E1", +"t c #E4E3E3", +"u c #DEDBDA", +"v c #F6505A", +"w c #DF787D", +"x c #64C0E0", +"y c #1DAEE2", +"z c #20BEF6", +"A c #C3DCE4", +"B c #FAFAFA", +"C c #EAEBEA", +"D c #E3BBBD", +"E c #E19EA2", +"F c #E7E8E7", +"G c #21BDF4", +"H c #51BADF", +"I c #E0868B", +"J c #E3C5C6", +"K c #CC878C", +"L c #E5CFD9", +"M c #CFC6CA", +"N c #7EB9CC", +"O c #52ADCD", +"P c #59BDDF", +"Q c #BACACE", +"R c #AABAD2", +"S c #B5C6E3", +"T c #AAB8CE", +"U c #CEB6B6", +"V c #CDA4A5", +"W c #B2BDCE", +"X c #CECFCF", +"Y c #D1D2D1", +"Z c #59BCDE", +"` c #73B5CC", +" . c #CFC8CB", +".. c #CC8E93", +"+. c #DFCCCD", +"@. c #FF91C5", +"#. c #E5B5CB", +"$. c #EAEAEA", +"%. c #2268E3", +"&. c #1869F6", +"*. c #3171DE", +"=. c #5789DF", +"-. c #DDE0E5", +";. c #E5BED0", +">. c #E5C6D4", +",. c #9A9A9A", +"'. c #CFAABB", +"). c #E5BACE", +"!. c #CFC5CA", +"~. c #D2D3D2", +"{. c #CFD0CF", +"]. c #7B9BD0", +"^. c #7FA3E1", +"/. c #7B9BCC", +"(. c #8DCCE1", +"_. c #9BC1CD", +":. c #AAC5CE", +"<. c #7DA2CC", +"[. c #CCCECF", +"}. c #E3E4E3", +"|. c #CFC9CB", +"1. c #CFC2C8", +"2. c #C9C9C9", +"3. c #E5C9D6", +"4. c #D9E2E5", +"5. c #61BFE0", +"6. c #86CAE1", +"7. c #B4D7E3", +"8. c #E5D3DB", +"9. c #E5B1C9", +"0. c #CFCFCF", +"a. c #CFA4B8", +"b. c #D298B3", +"c. c #E5A6C3", +"d. c #CFC7CA", +"e. c #D4D5D4", +"f. c #CCCFCF", +"g. c #ACD5E3", +"h. c #8EBDCD", +"i. c #82BACC", +"j. c #C3CDCF", +"k. c #E3A5C2", +"l. c #CFA1B7", +"m. c #CFC3C8", +"n. c #89BCCC", +"o. c #C8DADF", +"p. c #ACACAC", +"q. c #D8DBDC", +"r. c #EA85B5", +"s. c #E5D5DC", +"t. c #AFD6E3", +"u. c #8ACBE1", +"v. c #FD90C4", +"w. c #E59DBF", +"x. c #6CC2E0", +"y. c #BBD9E3", +"z. c #D6E1E4", +"A. c #C6CDCF", +"B. c #CFCCCD", +"C. c #D2CCCE", +"D. c #E5DEE1", +"E. c #CF96B0", +"F. c #E591B9", +"G. c #E090B6", +"H. c #C9CECF", +"I. c #CF8DAC", +"J. c #D18BAB", +"K. c #E3DCDF", +"L. c #CFCBCD", +"M. c #C7CECF", +"N. c #DDE0E0", +"O. c #9F9F9F", +"P. c #E59ABD", +"Q. c #FA8FC2", +"R. c #E58EB7", +"S. c #E78AB6", +"T. c #D6D6D6", +"U. c #D9D9D9", +"V. c #D694B3", +"W. c #ED8CB9", +"X. c #E88BB6", +"Y. c #DADBDA", +"Z. c #D689AD", +"`. c #D886AC", +" + c #EBEBEB", +".+ c #F7F8F7", +"++ c #B1C2DD", +"@+ c #1C69EF", +"#+ c #7EA0DB", +"$+ c #DFDFDF", +"%+ c #F2F3F2", +"&+ c #2568DC", +"*+ c #3370D8", +"=+ c #5888D9", +"-+ c #D7DADE", +";+ c #F5F6F5", +">+ c #90ACDC", +",+ c #9FB6DC", +"'+ c #C2C2C2", +")+ c #92B0E2", +"!+ c #A2BAE2", +"~+ c #AEBBCE", +"{+ c #447DDF", +"]+ c #7C9FCC", +"^+ c #C6DDE4", +"/+ c #487ACE", +"(+ c #507ECA", +"_+ c #BDCBCF", +":+ c #C2CCCF", +"<+ c #668ECB", +"[+ c #CACDCF", +"}+ c #CACFCF", +"|+ c #87A7CC", +"1+ c #A1B2CE", +"2+ c #E1E2E1", +"3+ c #BFDAE3", +"4+ c #7BC7E1", +"5+ c #ADADAD", +"6+ c #E2ADB0", +"7+ c #CDADAE", +"8+ c #A3C3CE", +"9+ c #73C4E0", +"0+ c #88BCCC", +"a+ c #90BFCF", +"b+ c #9DD0E2", +"c+ c #C4CDCF", +"d+ c #8CB4C8", +"e+ c #E5C2D2", +"f+ c #9FB4C6", +"g+ c #B6C9CE", +"h+ c #9CCFE0", +"i+ c #8CBDCD", +"j+ c #99C0CD", +"k+ c #CEB1B2", +"l+ c #E0D6D6", +"m+ c #E5CBD7", +"n+ c #E582B1", +"o+ c #E5B9CD", +"p+ c #E7E7E7", +"q+ c #E6E7E6", +"r+ c #CCCCCC", +"s+ c #E8E8E8", +"t+ c #F2F2F2", +"u+ c #989898", +"v+ c #FEFEFE", +"w+ c #E3E4E4", +"x+ c #F1F1F1", +"y+ c #B6B6B6", +"z+ c #DCD9D9", +"A+ c #DADADA", +"B+ c #F7F7F7", +"C+ c #E4D3D4", +"D+ c #E2D8D8", +"E+ c #D5DFE2", +"F+ c #BDCCD1", +"G+ c #CEDFE4", +"H+ c #DFE2E2", +"I+ c #E2DFDE", +"J+ c #E2DCDB", +"K+ c #D3DEE2", +"L+ c #E2D9D9", +"M+ c #F3F0F0", +"N+ c #D7D8D7", +"O+ c #CECFCE", +". + + + @ + + # + @ # + $ @ + # + + # + + % + + # + @ @ + @ # + @ @ + # + @ # + @ @ + # # + + & ", +"+ * * * = * - ; * > , * ' ) * ! ~ * { * * ] * ^ / * ( _ * : < [ } | 1 2 3 = 4 * = 5 * 6 7 * * 8 ", +"+ * 9 0 a b c d e f . g h i e j k k l e 8 f m 0 n o p f e f l e f . q r s f l e f f t a u 1 * 8 ", +"+ + 0 v v w * * 8 * * x y z A * B C * 8 * * D v v E * * 8 * * 8 * F G z H * * 8 * * I v v J * 8 ", +"@ ! 0 v v w * * 8 * * x y z A * B C * 8 * * D v v E * * 8 * * 8 * F G z H * * 8 * * I v v J * 8 ", +"+ * b w w K L L M 8 8 N O P Q 8 p R S T 8 8 U w w V 8 8 W S S X 8 Y Z P ` 8 8 .L L ..w w +.* 8 ", +"+ , 8 * * L @.@.#.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * ;.@.@.>.* * 8 * 8 ", +"+ ,.8 * * L @.@.#.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * ;.@.@.>.* * 8 * 8 ", +"+ * e 8 8 M #.#.'.).).!.~.8 {.8 p ].^./.(.(._.8 8 :.(.(.<.^.^.[.8 Y }.8 |.).).'.#.#.1.8 8 p * 8 ", +"+ 2.f * * 8 * * ).@.@.3.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 8.@.@.9.* * 8 * * 8 * 8 ", +"+ 0.f * * 8 * * ).@.@.3.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 8.@.@.9.* * 8 * * 8 * 8 ", +"+ * g x x N 8 8 !.3.3.a.b.c.d.8 p e.8 f.g.g.h.x x i.g.g.j.8 8 {.8 Y k.c.l.3.3.m.8 8 n.x x o.* 8 ", +"+ p.q.z z P * * 8 * * c.r.@.s.* B C * 8 * * t.z z u.* * 8 * * 8 * F v.@.w.* * 8 * * x.z z y.* 8 ", +"+ 0.q z z P * * 8 * * c.r.@.s.* B C * 8 * * t.z z u.* * 8 * * 8 * F v.@.w.* * 8 * * x.z z y.* 8 ", +"+ 9 e z.z.A.8 8 {.8 8 B.C.D.E.F.G.e.8 {.8 8 f.z.z.H.8 8 {.8 8 I.F.J.K.D.L.8 8 {.8 8 M.z.z.N.* 8 ", +"+ O.8 * * 8 * * 8 * * 8 $.* P.@.Q.C * 8 * * 8 * * 8 * * 8 * * R.@.S.[ * 8 * * 8 * * 8 * * 8 * 8 ", +"+ . k 3 3 T.3 3 T.3 3 T.U.3 V.W.X.Y.3 T.3 3 T.3 3 T.3 3 T.3 3 Z.W.`. +3 T.3 3 T.3 3 T.3 3 . * 8 ", +"+ j k .+.+++@+@+#+.+.+$+c .+$+.+%+&+@+*+.+.+$+.+.+$+.+.+=+@+@+-+.+> ;+.+$+.+.+>+@+@+,+.+.+m * 8 ", +"+ '+8 * * S &.&.^.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * )+&.&.!+* * 8 * 8 ", +"+ * e 8 8 ~+{+{+]+^+^+M.~.8 {.8 p /+{+(+^+^+_+8 8 :+^+^+<+{+{+[+8 Y }.8 }+^+^+|+{+{+1+8 8 p * 8 ", +"@ 0.2+* * 8 * * (.z z g.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 3+z z 4+* * 8 * * 8 * 8 ", +"# 5+Y.* * 8 * * (.z z g.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 3+z z 4+* * 8 * * 8 * 8 ", +"+ * o 6+6+7+8 8 8+9+9+0+a+b+c+8 p e.8 H.9+9+d+e+e+f+9+9+g+8 8 {.8 Y h+b+i+9+9+j+8 8 k+6+6+l+* 8 ", +"+ '+0 v v w * * 8 * * x y z A * B C * 8 * * m+n+n+o+$ ^ 8 p+* 8 6 q+G z H * * 8 * * I v v J * 8 ", +"+ '+0 v v w * * 8 * * x y z A * B C * 8 * * m+v.n+o+$ ^ 8 ) B 8 6 q+G z H * * 8 * * I v v J * 8 ", +"+ * o 6+6+7+8 8 8+9+9+0+a+b+c+8 p e.8 H.9+9+d+e+e+f+9+9+g+8 8 {.8 Y h+b+i+9+9+j+8 8 k+6+6+l+* 8 ", +"+ $+8 * * 8 * * (.z z g.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 3+z z 4+* * 8 * * 8 * 8 ", +"+ # 8 * * 8 * * (.z z g.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 3+z z 4+* * 8 * * 8 * 8 ", +"+ * e 8 8 ~+{+{+]+^+^+M.~.8 {.8 p /+{+(+^+^+_+8 8 :+^+^+<+{+{+[+8 Y }.8 }+^+^+|+{+{+1+8 8 p * 8 ", +"+ r+8 * * S &.&.^.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * )+&.&.!+* * 8 * 8 ", +"+ s+k .+.+++@+@+#+.+.+$+c .+$+.+%+&+@+*+.+.+$+.+.+$+.+.+=+@+@+-+.+> ;+.+$+.+.+>+@+@+,+.+.+m * 8 ", +"+ t+}.3 3 T.3 3 T.3 3 T.U.3 V.W.X.Y.3 T.3 3 T.3 3 T.3 3 T.3 3 Z.W.`. +3 T.3 3 T.3 3 T.3 3 . * 8 ", +"+ u+2+* * 8 * * 8 * * 8 $.* P.@.Q.C * 8 * * 8 * * 8 * * 8 * * R.@.S.[ * 8 * * 8 * * 8 * * 8 * 8 ", +"+ v+w+z.z.A.8 8 {.8 8 B.C.D.E.F.G.e.8 {.8 8 f.z.z.H.8 8 {.8 8 I.F.J.K.D.L.8 8 {.8 8 M.z.z.N.* 8 ", +"+ x+q z z P * * 8 * * c.r.@.s.* B C * 8 * * t.z z u.* * 8 * * 8 * F v.@.w.* * 8 * * x.z z y.* 8 ", +"+ } q z z P * * 8 * * c.r.@.s.* B C * 8 * * t.z z u.* * 8 * * 8 * F v.@.w.* * 8 * * x.z z y.* 8 ", +"+ * g x x N 8 8 !.3.3.a.b.c.d.8 p e.8 f.g.g.h.x x i.g.g.j.8 8 {.8 Y k.c.l.3.3.m.8 8 n.x x o.* 8 ", +"# ( Y * * 8 * * ).@.@.3.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 8.@.@.9.* * 8 * * 8 * 8 ", +"% y+r+* * 8 * * ).@.@.3.$.* 8 * B C * 4.z z 5.* * 6.z z 7.* * 8 * F [ * 8.@.@.9.* * 8 * * 8 * 8 ", +"+ * e 8 8 M #.#.'.).).!.~.8 {.8 p ].^./.(.(._.8 8 :.(.(.<.^.^.[.8 Y }.8 |.).).'.#.#.1.8 8 p * 8 ", +"+ p.8 * * L @.@.#.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * ;.@.@.>.* * 8 * 8 ", +"+ = 8 * * L @.@.#.* * 8 $.* 8 * B %.&.*.* * 8 * * 8 * * =.&.&.-.* F [ * 8 * * ;.@.@.>.* * 8 * 8 ", +"+ * b w w K L L M 8 8 N O P Q 8 p R S T 8 8 U w w V 8 8 W S S X 8 Y Z P ` 8 8 .L L ..w w +.* 8 ", +"# 4 z+v v w * * 8 * * x y z A * B C * 8 * * D v v E * * 8 * * 8 * F G z H * * 8 * * I v v J * 8 ", +"+ A+0 v v w * * 8 * * x y z A * B C * 8 * * D v v E * * 8 * * 8 * F G z H * * 8 * * I v v J * 8 ", +"+ * B+C+C+D+8 8 f 8 8 E+F+G+H+8 e c 8 f 8 8 I+C+C+J+8 8 f 8 8 f 8 c G+G+K+8 8 f 8 8 L+C+C+M+* 8 ", +"+ * * * * * * * * * * * $.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 8 ", +"N+. . . . . . . . . . . 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O+"}; diff --git a/qt/main.cpp b/qt/main.cpp index 43d3f99..4528ea9 100644 --- a/qt/main.cpp +++ b/qt/main.cpp @@ -20,23 +20,39 @@ #include "config.h" -#include +#include +#include +#include #include "main_window.h" int main(int argc, char **argv) { -#if HAVE_SETLOCALE +#ifdef HAVE_SETLOCALE // Set locale via LC_ALL setlocale(LC_ALL, ""); #endif -#if ENABLE_NLS + QApplication app(argc, argv); + app.setWindowIcon(QIcon(":/images/eliot.xpm")); + +#ifdef ENABLE_NLS // Set the message domain bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + + // Translations for Qt's own strings + QTranslator translator; + // Set the path for the translation file +#if !defined( WIN32 ) + QString path = QString(QT4LOCALEDIR); +#else + QString path = QString(LOCALEDIR) + "/qt4/"; +#endif + QString lang = QLocale::system().name(); + translator.load(path + "qt_" + lang); + app.installTranslator(&translator); #endif - QApplication app(argc, argv); MainWindow qmain; qmain.move(200, 200); qmain.show(); diff --git a/qt/main_window.cpp b/qt/main_window.cpp index 0432d83..f06139d 100644 --- a/qt/main_window.cpp +++ b/qt/main_window.cpp @@ -318,30 +318,38 @@ void MainWindow::on_action_GameSaveAs_triggered() } -// Printing parameters -#define TOTAL_WIDTH 500 -#define LINE_HEIGHT 20 -#define FONT_SIZE 12 -#define PEN_WIDTH 2 -#define TEXT_OFFSET 10 -#define SHOULD_ALIGN false - void MainWindow::on_action_GamePrint_triggered() { if (m_game == NULL) return; QPrinter printer(QPrinter::HighResolution); - printer.setOutputFileName("/home/ipkiss/dev/eliot/qt-intf/linux/print.pdf"); QPrintDialog printDialog(&printer, this); if (printDialog.exec() == QDialog::Accepted) { QPainter painter(&printer); const History &history = m_game->getHistory(); - const int colWidths[] = { 30, 150, 150, 70, 70 }; - const char *colTitles[] = { _("N."), _("RACK"), _("SOLUTION"), _("REF"), _("PTS") }; - const unsigned int nbCols = sizeof(colWidths) / sizeof(int); + // Printing parameters (XXX: these could be configurable by the users) + // Number of pixels virtually present on the page width. The bigger + // this number, the smaller the print result + static const int TOTAL_WIDTH = 700; + // Distance between 2 horizontal lines + static const int LINE_HEIGHT = 16; + // Font size, in pixels + static const int FONT_SIZE = 10; + // Width of the pen used to draw the grid lines + static const int PEN_WIDTH = 1; + // Offset of the text from the previous vertical line, in pixels + static const int TEXT_OFFSET = 10; + // Indicate whether the rack and the solution should be aligned + static const bool SHOULD_ALIGN = false; + // Columns widths + static const int colWidths[] = { 30, 120, 120, 35, 35 }; + // Columns titles + static const char *colTitles[] = { _("N."), _("RACK"), _("SOLUTION"), _("REF"), _("PTS") }; + + static const unsigned int nbCols = sizeof(colWidths) / sizeof(int); const unsigned int nbRows = history.getSize() + (SHOULD_ALIGN ? 1 : 2); double scale = printer.pageRect().width() / double(TOTAL_WIDTH); @@ -353,7 +361,6 @@ void MainWindow::on_action_GamePrint_triggered() QFont font; font.setPixelSize(FONT_SIZE); - //QFont font(painter.font(), &painter); painter.setFont(font); int maxRight = 0; @@ -451,7 +458,7 @@ void MainWindow::on_action_GamePrint_triggered() } // Total score - curHeight += LINE_HEIGHT; + nextHeight += LINE_HEIGHT; painter.drawText(curWidth, nextHeight, QString("%1").arg(score)); } } diff --git a/qt/new_game.cpp b/qt/new_game.cpp index 2838df1..acf733d 100644 --- a/qt/new_game.cpp +++ b/qt/new_game.cpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "new_game.h" #include "qtcommon.h" @@ -41,21 +43,30 @@ NewGame::NewGame(QWidget *iParent) : QDialog(iParent) { setupUi(this); + lineEditName->setText(_q("Player %1").arg(2)); // Initialize the model of the default players - m_model = new QStandardItemModel(2, 2, this); + m_model = new QStandardItemModel(2, 3, this); m_model->setHeaderData(0, Qt::Horizontal, _q("Name"), Qt::DisplayRole); m_model->setHeaderData(1, Qt::Horizontal, _q("Type"), Qt::DisplayRole); - m_model->setData(m_model->index(0, 0), _q("Player")); + m_model->setHeaderData(2, Qt::Horizontal, _q("Level"), Qt::DisplayRole); + m_model->setData(m_model->index(0, 0), _q("Player %1").arg(1)); m_model->setData(m_model->index(0, 1), _q(kHUMAN)); m_model->setData(m_model->index(1, 0), _q("Eliot")); m_model->setData(m_model->index(1, 1), _q(kAI)); + m_model->setData(m_model->index(1, 2), 100); // Initialize the QTreeView with the model we just created treeViewPlayers->setModel(m_model); - PlayersDelegate *delegate = new PlayersDelegate(this); - treeViewPlayers->setItemDelegateForColumn(1, delegate); + PlayersTypeDelegate *typeDelegate = new PlayersTypeDelegate(this); + treeViewPlayers->setItemDelegateForColumn(1, typeDelegate); + PlayersLevelDelegate *levelDelegate = new PlayersLevelDelegate(this); + treeViewPlayers->setItemDelegateForColumn(2, levelDelegate); + treeViewPlayers->resizeColumnToContents(2); + // Enable the Level spinbox only when the player is a computer + QObject::connect(comboBoxType, SIGNAL(currentIndexChanged(int)), + this, SLOT(enableLevelSpinBox(int))); // Enable the Remove button only when there is a selection in the tree QObject::connect(treeViewPlayers->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), @@ -116,7 +127,10 @@ Game * NewGame::createGame(const Dictionary &iDic) const if (type == _q(kHUMAN)) player = new HumanPlayer; else - player = new AIPercent(1); + { + double level = m_model->data(m_model->index(num, 2)).toInt(); + player = new AIPercent(level / 100.); + } player->setName(qtw(name)); game->addPlayer(player); } @@ -134,6 +148,12 @@ Game * NewGame::createGame(const Dictionary &iDic) const } +void NewGame::enableLevelSpinBox(int index) +{ + spinBoxLevel->setEnabled(index == 1); +} + + void NewGame::enableOkButton() { // Enable the "Ok" button: @@ -173,6 +193,16 @@ void NewGame::on_pushButtonAdd_clicked() // Change the contents of the row m_model->setData(m_model->index(rowNum, 0), lineEditName->displayText()); m_model->setData(m_model->index(rowNum, 1), comboBoxType->currentText()); + if (spinBoxLevel->isEnabled()) + m_model->setData(m_model->index(rowNum, 2), spinBoxLevel->value()); + + // Increment the player ID + static int currPlayer = 2; + if (lineEditName->displayText() == _q("Player %1").arg(currPlayer)) + { + ++currPlayer; + lineEditName->setText(_q("Player %1").arg(currPlayer)); + } } @@ -186,15 +216,15 @@ void NewGame::on_pushButtonRemove_clicked() -PlayersDelegate::PlayersDelegate(QObject *parent) +PlayersTypeDelegate::PlayersTypeDelegate(QObject *parent) : QItemDelegate(parent) { } -QWidget *PlayersDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &, - const QModelIndex &) const +QWidget *PlayersTypeDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &, + const QModelIndex &) const { QComboBox *editor = new QComboBox(parent); editor->addItem(_q(NewGame::kHUMAN)); @@ -203,8 +233,8 @@ QWidget *PlayersDelegate::createEditor(QWidget *parent, } -void PlayersDelegate::setEditorData(QWidget *editor, - const QModelIndex &index) const +void PlayersTypeDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const { QComboBox *combo = static_cast(editor); QString text = index.model()->data(index, Qt::DisplayRole).toString(); @@ -212,26 +242,80 @@ void PlayersDelegate::setEditorData(QWidget *editor, } -void PlayersDelegate::setModelData(QWidget *editor, - QAbstractItemModel *model, - const QModelIndex &index) const +void PlayersTypeDelegate::setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const { QComboBox *combo = static_cast(editor); model->setData(index, combo->currentText()); + // Adapt the level to the chosen type of player + QModelIndex levelIndex = model->index(index.row(), 2); + if (combo->currentText() == _q(NewGame::kHUMAN)) + model->setData(levelIndex, QVariant()); + else + model->setData(levelIndex, 100); } -void PlayersDelegate::updateEditorGeometry(QWidget *editor, - const QStyleOptionViewItem &option, - const QModelIndex &) const +void PlayersTypeDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &) const { editor->setGeometry(option.rect); } -PlayersEventFilter::PlayersEventFilter(QObject *parent) - : QObject(parent) +PlayersLevelDelegate::PlayersLevelDelegate(QObject *parent) + : QItemDelegate(parent) +{ +} + + +QWidget *PlayersLevelDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &, + const QModelIndex &index) const +{ + // Allow changing the level only for computer players, i.e. + // if there is a level defined + if (index.model()->data(index, Qt::DisplayRole).isNull()) + return NULL; + QSpinBox *editor = new QSpinBox(parent); + editor->setMinimum(0); + editor->setMaximum(100); + return editor; +} + + +void PlayersLevelDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const +{ + QSpinBox *spinBox = static_cast(editor); + int value = index.model()->data(index, Qt::DisplayRole).toInt(); + spinBox->setValue(value); +} + + +void PlayersLevelDelegate::setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const +{ + QSpinBox *spinBox = static_cast(editor); + model->setData(index, spinBox->value()); +} + + +void PlayersLevelDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &) const +{ + editor->setGeometry(option.rect); +} + + + + PlayersEventFilter::PlayersEventFilter(QObject *parent) +: QObject(parent) { } diff --git a/qt/new_game.h b/qt/new_game.h index 279583a..4a29c52 100644 --- a/qt/new_game.h +++ b/qt/new_game.h @@ -49,6 +49,7 @@ public: Game * createGame(const Dictionary& iDic) const; private slots: + void enableLevelSpinBox(int); void enableOkButton(); void enableRemoveButton(const QItemSelection&, const QItemSelection&); @@ -63,14 +64,39 @@ private: }; -/// Delegate used for the edition of the players display -class PlayersDelegate: public QItemDelegate +/// Delegate used for the edition of the players type +class PlayersTypeDelegate: public QItemDelegate { Q_OBJECT; public: - explicit PlayersDelegate(QObject *parent = 0); - virtual ~PlayersDelegate() {} + explicit PlayersTypeDelegate(QObject *parent = 0); + virtual ~PlayersTypeDelegate() {} + + // Implement the needed methods + virtual QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const; + virtual void setEditorData(QWidget *editor, + const QModelIndex &index) const; + virtual void setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const; + + virtual void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &index) const; +}; + + +/// Delegate used for the edition of the players level +class PlayersLevelDelegate: public QItemDelegate +{ + Q_OBJECT; + +public: + explicit PlayersLevelDelegate(QObject *parent = 0); + virtual ~PlayersLevelDelegate() {} // Implement the needed methods virtual QWidget *createEditor(QWidget *parent, diff --git a/qt/qtcommon.h b/qt/qtcommon.h index 58d0f8b..c4f6932 100644 --- a/qt/qtcommon.h +++ b/qt/qtcommon.h @@ -36,12 +36,18 @@ // Convert to/from utf-8 char* #define qfu(s) QString::fromUtf8(s) #define qtu(s) (s).toUtf8().data() -// Convert to/from std::wstring -#define qfw(s) QString::fromStdWString(s) -#define qtw(s) (s).toStdWString().data() // Convert to/from local encoding #define qfl(s) QString::fromLocal8Bit(s) #define qtl(s) (s).toLocal8Bit().data() +// Convert to/from std::wstring +#ifdef WIN32 +#include "encoding.h" +#define qfw(s) qfl(convertToMb(s).c_str()) +#define qtw(s) convertToWc(qtl(s)) +#else +#define qfw(s) QString::fromStdWString(s) +#define qtw(s) (s).toStdWString().data() +#endif // Translation macro to use gettext #define _q(s) qfu(_(s)) diff --git a/qt/ui/main_window.ui b/qt/ui/main_window.ui index 21b0565..a1333d0 100644 --- a/qt/ui/main_window.ui +++ b/qt/ui/main_window.ui @@ -13,8 +13,8 @@ Eliot - - ../../../bzr-cppdic/wxwin/eliot.xpm../../../bzr-cppdic/wxwin/eliot.xpm + + :/images/eliot.xpm:/images/eliot.xpm @@ -201,6 +201,9 @@ _("Edit the preferences") + + Ctrl+F + @@ -242,6 +245,9 @@ _("Show/hide the external board") + + Ctrl+E + @@ -283,7 +289,9 @@ - + + + action_GameQuit diff --git a/qt/ui/new_game.ui b/qt/ui/new_game.ui index 03d01a2..4f6d8dd 100644 --- a/qt/ui/new_game.ui +++ b/qt/ui/new_game.ui @@ -5,8 +5,8 @@ 0 0 - 374 - 327 + 470 + 390 @@ -99,7 +99,7 @@ - _("Player") + Player 2 @@ -124,6 +124,26 @@ + + + + _("Level:") + + + + + + + false + + + 100 + + + 100 + + +