summaryrefslogtreecommitdiffstats
path: root/kgoldrunner/src/kgrdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kgoldrunner/src/kgrdialog.cpp')
-rw-r--r--kgoldrunner/src/kgrdialog.cpp974
1 files changed, 974 insertions, 0 deletions
diff --git a/kgoldrunner/src/kgrdialog.cpp b/kgoldrunner/src/kgrdialog.cpp
new file mode 100644
index 00000000..61ca2f29
--- /dev/null
+++ b/kgoldrunner/src/kgrdialog.cpp
@@ -0,0 +1,974 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Ian Wadham and Marco Krger *
+ * ianw2@optusnet.com.au *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+#ifdef KGR_PORTABLE
+// If compiling for portability, redefine KDE's i18n.
+#define i18n tr
+#endif
+
+#include "kgrconsts.h"
+#include "kgrcanvas.h"
+#include "kgrgame.h"
+#include "kgrdialog.h"
+
+#ifndef KGR_PORTABLE
+#include <kglobalsettings.h>
+#endif
+
+/******************************************************************************/
+/***************** DIALOG BOX TO SELECT A GAME AND LEVEL *****************/
+/******************************************************************************/
+
+#ifdef KGR_PORTABLE
+KGrSLDialog::KGrSLDialog (int action, int requestedLevel, int collnIndex,
+ QPtrList<KGrCollection> & gamesList, KGrGame * theGame,
+ QWidget * parent, const char * name)
+ : QDialog (parent, name, TRUE,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title)
+#else
+KGrSLDialog::KGrSLDialog (int action, int requestedLevel, int collnIndex,
+ QPtrList<KGrCollection> & gamesList, KGrGame * theGame,
+ QWidget * parent, const char * name)
+ : KDialogBase (KDialogBase::Plain, i18n("Select Game"),
+ KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help,
+ KDialogBase::Ok, parent, name)
+#endif
+{
+ slAction = action;
+ defaultLevel = requestedLevel;
+ defaultGame = collnIndex;
+ collections = gamesList;
+ game = theGame;
+ collection = collections.at(defaultGame);
+ slParent = parent;
+
+#ifdef KGR_PORTABLE
+ int margin = 10;
+ int spacing = 10;
+ QWidget * dad = this;
+#else
+ int margin = marginHint();
+ int spacing = spacingHint();
+ QWidget * dad = plainPage();
+#endif
+
+ QVBoxLayout * mainLayout = new QVBoxLayout (dad, margin, spacing);
+
+ collnL = new QLabel (i18n("List of games:"), dad);
+ mainLayout->addWidget (collnL);
+ colln = new QListBox (dad);
+ mainLayout->addWidget (colln);
+
+ QHBox * gameInfo = new QHBox (dad);
+ mainLayout->addWidget (gameInfo);
+ gameInfo->setSpacing (spacing);
+ collnN = new QLabel ("", gameInfo); // Name of selected collection.
+ QFont f = collnN->font();
+ f.setBold (TRUE);
+ collnN->setFont (f);
+ collnA = new QPushButton (i18n("More Info"), gameInfo);
+
+ collnD = new QLabel ("", dad); // Description of collection.
+ mainLayout->addWidget (collnD);
+
+ QFrame * separator = new QFrame (dad);
+ separator->setFrameStyle (QFrame::HLine + QFrame::Sunken);
+ mainLayout->addWidget (separator);
+
+ if ((action == SL_START) || (action == SL_UPD_GAME)) {
+ dad-> setCaption (i18n("Select Game"));
+ QLabel * startMsg = new QLabel
+ ("<b>" + i18n("Level 1 of the selected game is:") + "</b>", dad);
+ mainLayout->addWidget (startMsg);
+ }
+ else {
+ dad-> setCaption (i18n("Select Game/Level"));
+ QLabel * selectLev = new QLabel (i18n("Select level:"), dad);
+ mainLayout->addWidget (selectLev);
+ }
+
+ QGridLayout * grid = new QGridLayout (3, 2, -1);
+ mainLayout->addLayout (grid);
+
+ // Initial range 1->150, small step 1, big step 10 and default value 1.
+ number = new QScrollBar (1, 150, 1, 10, 1,
+ QScrollBar::Horizontal, dad);
+ grid->addWidget (number, 1, 1);
+
+ QHBox * numberPair = new QHBox (dad);
+ grid->addWidget (numberPair, 2, 1);
+ numberPair->setSpacing (spacing);
+ numberL = new QLabel (i18n("Level number:"), numberPair);
+ display = new QLineEdit (numberPair);
+
+ levelNH = new QPushButton (i18n("Edit Level Name && Hint"), dad);
+ mainLayout->addWidget (levelNH);
+
+ slName = new QLabel ("", dad);
+ grid->addWidget (slName, 3, 1);
+ thumbNail = new KGrThumbNail (dad);
+ grid->addMultiCellWidget (thumbNail, 1, 3, 2, 2);
+
+ // Set thumbnail cell size to about 1/5 of game cell size.
+ int cellSize = parent->width() / (5 * (FIELDWIDTH + 4));
+ thumbNail-> setFixedWidth ((FIELDWIDTH * cellSize) + 2);
+ thumbNail-> setFixedHeight ((FIELDHEIGHT * cellSize) + 2);
+
+#ifdef KGR_PORTABLE
+ QHBox * buttons = new QHBox (this);
+ mainLayout->addWidget (buttons);
+ buttons->setSpacing (spacing);
+ // Buttons are for Qt-only portability. NOT COMPILED in KDE environment.
+ HELP = new QPushButton (i18n("Help"), buttons);
+ OK = new QPushButton (i18n("&OK"), buttons);
+ CANCEL = new QPushButton (i18n("&Cancel"), buttons);
+
+ QPoint p = parent->mapToGlobal (QPoint (0,0));
+
+ // Base the geometry of the dialog box on the playing area.
+ int cell = parent->width() / (FIELDWIDTH + 4);
+ dad-> move (p.x()+2*cell, p.y()+2*cell);
+ dad-> setMinimumSize ((FIELDWIDTH*cell/2), (FIELDHEIGHT-1)*cell);
+
+ OK-> setAccel (Key_Return);
+ HELP-> setAccel (Key_F1);
+ CANCEL-> setAccel (Key_Escape);
+#endif
+
+ // Set the default for the level-number in the scrollbar.
+ number-> setTracking (TRUE);
+ number->setValue (requestedLevel);
+
+ slSetCollections (defaultGame);
+
+ // Vary the dialog according to the action.
+ QString OKText = "";
+ switch (slAction) {
+ case SL_START: // Must start at level 1, but can choose a collection.
+ OKText = i18n("Start Game");
+ number->setValue (1);
+ number->setEnabled(FALSE);
+ display->setEnabled(FALSE);
+ number->hide();
+ numberL->hide();
+ display->hide();
+ break;
+ case SL_ANY: // Can start playing at any level in any collection.
+ OKText = i18n("Play Level");
+ break;
+ case SL_UPDATE: // Can use any level in any collection as edit input.
+ OKText = i18n("Edit Level");
+ break;
+ case SL_CREATE: // Can save a new level only in a USER collection.
+ OKText = i18n("Save New");
+ break;
+ case SL_SAVE: // Can save an edited level only in a USER collection.
+ OKText = i18n("Save Change");
+ break;
+ case SL_DELETE: // Can delete a level only in a USER collection.
+ OKText = i18n("Delete Level");
+ break;
+ case SL_MOVE: // Can move a level only into a USER collection.
+ OKText = i18n("Move To...");
+ break;
+ case SL_UPD_GAME: // Can only edit USER collection details.
+ OKText = i18n("Edit Game Info");
+ number->setValue (1);
+ number->setEnabled(FALSE);
+ display->setEnabled(FALSE);
+ number->hide();
+ numberL->hide();
+ display->hide();
+ break;
+
+ default: break; // Keep the default settings.
+ }
+ if (!OKText.isEmpty()) {
+#ifdef KGR_PORTABLE
+ OK->setText (OKText);
+#else
+ setButtonOK (OKText);
+#endif
+ }
+
+ // Set value in the line-edit box.
+ slShowLevel (number->value());
+
+ if (display->isEnabled()) {
+ display->setFocus(); // Set the keyboard input on.
+ display->selectAll();
+ display->setCursorPosition (0);
+ }
+
+ // Paint a thumbnail sketch of the level.
+ thumbNail->setFrameStyle (QFrame::Box | QFrame::Plain);
+ thumbNail->setLineWidth (1);
+ slPaintLevel();
+ thumbNail->show();
+
+ connect (colln, SIGNAL (highlighted (int)), this, SLOT (slColln (int)));
+ connect (collnA, SIGNAL (clicked ()), this, SLOT (slAboutColln ()));
+
+ connect (display, SIGNAL (textChanged (const QString &)),
+ this, SLOT (slUpdate (const QString &)));
+
+ connect (number, SIGNAL (valueChanged(int)), this, SLOT(slShowLevel(int)));
+
+ // Only enable name and hint dialog here if saving a new or edited level.
+ // At other times the name and hint have not been loaded or initialised yet.
+ if ((slAction == SL_CREATE) || (slAction == SL_SAVE)) {
+ connect (levelNH, SIGNAL (clicked()), game, SLOT (editNameAndHint()));
+ }
+ else {
+ levelNH->setEnabled (FALSE);
+ levelNH->hide();
+ }
+
+ connect (colln, SIGNAL (highlighted (int)), this, SLOT (slPaintLevel ()));
+ connect (number, SIGNAL (sliderReleased()), this, SLOT (slPaintLevel()));
+ connect (number, SIGNAL (nextLine()), this, SLOT (slPaintLevel()));
+ connect (number, SIGNAL (prevLine()), this, SLOT (slPaintLevel()));
+ connect (number, SIGNAL (nextPage()), this, SLOT (slPaintLevel()));
+ connect (number, SIGNAL (prevPage()), this, SLOT (slPaintLevel()));
+
+#ifdef KGR_PORTABLE
+ // Set the exits from this dialog box.
+ connect (OK, SIGNAL (clicked ()), this, SLOT (accept ()));
+ connect (CANCEL, SIGNAL (clicked ()), this, SLOT (reject ()));
+ connect (HELP, SIGNAL (clicked ()), this, SLOT (slotHelp ()));
+#endif
+}
+
+KGrSLDialog::~KGrSLDialog()
+{
+}
+
+/******************************************************************************/
+/***************** LOAD THE LIST OF GAMES (COLLECTIONS) *****************/
+/******************************************************************************/
+
+void KGrSLDialog::slSetCollections (int cIndex)
+{
+ int i;
+ int imax = collections.count();
+
+ // Set values in the combo box that holds collection names.
+ colln->clear();
+ slCollnIndex = -1;
+
+ for (i = 0; i < imax; i++) {
+ colln->insertItem (collections.at(i)->name, -1);
+ if (slCollnIndex < 0) {
+ slCollnIndex = i; // There is at least one collection.
+ }
+ }
+
+ if (slCollnIndex < 0) {
+ return; // There are no collections (unlikely).
+ }
+ // Mark the currently selected collection (or default 0).
+ colln->setCurrentItem (cIndex);
+ colln->setSelected (cIndex, TRUE);
+
+ // Fetch and display information on the selected collection.
+ slColln (cIndex);
+}
+
+/******************************************************************************/
+/***************** SLOTS USED BY LEVEL SELECTION DIALOG *****************/
+/******************************************************************************/
+
+void KGrSLDialog::slColln (int i)
+{
+ if (slCollnIndex < 0) {
+ // Ignore the "highlighted" signal caused by inserting in an empty box.
+ return;
+ }
+
+ // User "highlighted" a new collection (with one click) ...
+ colln->setSelected (i, TRUE); // One click = selected.
+ slCollnIndex = i;
+ int n = slCollnIndex; // Collection selected.
+ int N = defaultGame; // Current collection.
+ if (collections.at(n)->nLevels > 0)
+ number->setMaxValue (collections.at(n)->nLevels);
+ else
+ number->setMaxValue (1); // Avoid range errors.
+
+ // Set a default level number for the selected collection.
+ switch (slAction) {
+ case SL_ANY:
+ case SL_UPDATE:
+ case SL_DELETE:
+ case SL_UPD_GAME:
+ // If selecting the current collection, use the current level number.
+ if (n == N)
+ number->setValue (defaultLevel);
+ else
+ number->setValue (1); // Else use level 1.
+ break;
+ case SL_CREATE:
+ case SL_SAVE:
+ case SL_MOVE:
+ if ((n == N) && (slAction != SL_CREATE)) {
+ // Saving/moving level in current collection: use current number.
+ number->setValue (defaultLevel);
+ }
+ else {
+ // Saving new/edited level or relocating a level: use "nLevels + 1".
+ number->setMaxValue (collections.at(n)->nLevels + 1);
+ number->setValue (number->maxValue());
+ }
+ break;
+ default:
+ number->setValue (1); // Default is level 1.
+ break;
+ }
+
+ slShowLevel (number->value());
+
+#ifndef KGR_PORTABLE
+ int levCnt = collections.at(n)->nLevels;
+ if (collections.at(n)->settings == 'K')
+ collnD->setText (i18n("1 level, uses KGoldrunner rules.",
+ "%n levels, uses KGoldrunner rules.", levCnt));
+ else
+ collnD->setText (i18n("1 level, uses Traditional rules.",
+ "%n levels, uses Traditional rules.", levCnt));
+#else
+ QString levCnt;
+ levCnt = levCnt.setNum (collections.at(n)->nLevels);
+ if (collections.at(n)->settings == 'K')
+ collnD->setText (levCnt + i18n(" levels, uses KGoldrunner rules."));
+ else
+ collnD->setText (levCnt + i18n(" levels, uses Traditional rules."));
+#endif
+ collnN->setText (collections.at(n)->name);
+}
+
+void KGrSLDialog::slAboutColln ()
+{
+ // User clicked the "About" button ...
+ int n = slCollnIndex;
+ QString title = i18n("About \"%1\"").arg(collections.at(n)->name);
+
+ if (collections.at(n)->about.length() > 0) {
+ // Convert game description to ASCII and UTF-8 codes, then translate it.
+ KGrMessage::wrapped (slParent, title,
+ i18n((const char *) collections.at(n)->about.utf8()));
+ }
+ else {
+ KGrMessage::wrapped (slParent, title,
+ i18n("Sorry, there is no further information about this game."));
+ }
+}
+
+void KGrSLDialog::slShowLevel (int i)
+{
+ // Display the level number as the slider is moved.
+ QString tmp;
+ tmp.setNum(i);
+ tmp = tmp.rightJustify(3,'0');
+ display->setText(tmp);
+}
+
+void KGrSLDialog::slUpdate (const QString & text)
+{
+ // Move the slider when a valid level number is entered.
+ QString s = text;
+ bool ok = FALSE;
+ int n = s.toInt (&ok);
+ if (ok) {
+ number->setValue (n);
+ slPaintLevel();
+ }
+ else
+ KGrMessage::information (this, i18n("Select Level"),
+ i18n("This level number is not valid. It can not be used."));
+}
+
+void KGrSLDialog::slPaintLevel ()
+{
+ // Repaint the thumbnail sketch of the level whenever the level changes.
+ int n = slCollnIndex;
+ if (n < 0) {
+ return; // Owner has no collections.
+ }
+ QString filePath = game->getFilePath
+ (collections.at(n)->owner, collections.at(n), number->value());
+ thumbNail->setFilePath (filePath, slName);
+ thumbNail->repaint(); // Will call "drawContents (p)".
+}
+
+void KGrSLDialog::slotHelp ()
+{
+ // Help for "Select Game and Level" dialog box.
+ QString s =
+ i18n("The main button at the bottom echoes the "
+ "menu action you selected. Click it after choosing "
+ "a game and level - or use \"Cancel\".");
+
+ if (slAction == SL_START) {
+ s += i18n("\n\nIf this is your first time in KGoldrunner, select the "
+ "tutorial game or click \"Cancel\" and click that item in "
+ "the Game or Help menu. The tutorial game gives you hints "
+ "as you go.\n\n"
+ "Otherwise, just click on the name of a game (in the list box), "
+ "then, to start at level 001, click on the main button at the "
+ "bottom. Play begins when you move the mouse or press a key.");
+ }
+ else {
+ switch (slAction) {
+ case SL_UPDATE:
+ s += i18n("\n\nYou can select System levels for editing (or "
+ "copying), but you must save the result in a game you have "
+ "created. Use the mouse as a paintbrush and the editor "
+ "toolbar buttons as a palette. Use the 'Empty Space' button "
+ "to erase.");
+ break;
+ case SL_CREATE:
+ s += i18n("\n\nYou can add a name and hint to your new level here, "
+ "but you must save the level you have created into one of "
+ "your own games. By default your new level will go at the "
+ "end of your game, but you can also select a level number and "
+ "save into the middle of your game.");
+ break;
+ case SL_SAVE:
+ s += i18n("\n\nYou can create or edit a name and hint here, before "
+ "saving. If you change the game or level, you can do a copy "
+ "or \"Save As\", but you must always save into one of your "
+ "own games. If you save a level into the middle of a series, "
+ "the other levels are automatically re-numbered.");
+ break;
+ case SL_DELETE:
+ s += i18n("\n\nYou can only delete levels from one of your own "
+ "games. If you delete a level from the middle of a series, "
+ "the other levels are automatically re-numbered.");
+ break;
+ case SL_MOVE:
+ s += i18n("\n\nTo move (re-number) a level, you must first select "
+ "it by using \"Edit Any Level...\", then you can use "
+ "\"Move Level...\" to assign it a new number or even a different "
+ "game. Other levels are automatically re-numbered as "
+ "required. You can only move levels within your own games.");
+ break;
+ case SL_UPD_GAME:
+ s += i18n("\n\nWhen editing game info you only need to choose a "
+ "game, then you can go to a dialog where you edit the "
+ "details of the game.");
+ break;
+ default:
+ break;
+ }
+ s += i18n("\n\nClick on the list box to choose a game. "
+ "Below the list box you can see \"More Info\" about the "
+ "selected game, how many levels there are and what "
+ "rules the enemies follow (see the Settings menu).\n\n"
+ "You select "
+ "a level number by typing it or using the scroll bar. As "
+ "you vary the game or level, the thumbnail area shows a "
+ "preview of your choice.");
+ }
+
+ KGrMessage::wrapped (slParent, i18n("Help: Select Game & Level"), s);
+}
+
+/*******************************************************************************
+*************** DIALOG BOX TO CREATE/EDIT A LEVEL NAME AND HINT ****************
+*******************************************************************************/
+
+#ifdef KGR_PORTABLE
+KGrNHDialog::KGrNHDialog(const QString & levelName, const QString & levelHint,
+ QWidget * parent, const char * name)
+ : QDialog (parent, name, TRUE,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title)
+#else
+KGrNHDialog::KGrNHDialog(const QString & levelName, const QString & levelHint,
+ QWidget * parent, const char * name)
+ : KDialogBase (KDialogBase::Plain, i18n("Edit Name & Hint"),
+ KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, parent, name)
+#endif
+{
+#ifdef KGR_PORTABLE
+ int margin = 10;
+ int spacing = 10;
+ QWidget * dad = this;
+#else
+ int margin = marginHint();
+ int spacing = spacingHint();
+ QWidget * dad = plainPage();
+#endif
+
+ QVBoxLayout * mainLayout = new QVBoxLayout (dad, margin, spacing);
+
+ QLabel * nameL = new QLabel (i18n("Name of level:"), dad);
+ mainLayout->addWidget (nameL);
+ nhName = new QLineEdit (dad);
+ mainLayout->addWidget (nhName);
+
+ QLabel * mleL = new QLabel (i18n("Hint for level:"), dad);
+ mainLayout->addWidget (mleL);
+
+ // Set up a widget to hold the wrapped text, using \n for paragraph breaks.
+#ifdef QT3
+ mle = new QTextEdit (dad);
+ mle-> setTextFormat (PlainText);
+#else
+ mle = new QMultiLineEdit (dad);
+#endif
+ mainLayout->addWidget (mle);
+
+#ifdef KGR_PORTABLE
+ QHBox * buttons = new QHBox (dad);
+ mainLayout->addWidget (buttons);
+ buttons->setSpacing (spacing);
+ // Buttons are for Qt-only portability. NOT COMPILED in KDE environment.
+ QPushButton * OK = new QPushButton (i18n("&OK"), buttons);
+ QPushButton * CANCEL = new QPushButton (i18n("&Cancel"), buttons);
+
+ dad-> setCaption (i18n("Edit Name & Hint"));
+#endif
+
+ // Base the geometry of the text box on the playing area.
+ QPoint p = parent->mapToGlobal (QPoint (0,0));
+ int c = parent->width() / (FIELDWIDTH + 4);
+ dad-> move (p.x()+4*c, p.y()+4*c);
+ mle-> setMinimumSize ((FIELDWIDTH*c/2), (FIELDHEIGHT/2)*c);
+
+ // Configure the text box.
+ mle-> setAlignment (AlignLeft);
+#ifndef QT3
+ mle-> setWordWrap (QMultiLineEdit::WidgetWidth);
+ mle-> setFixedVisibleLines (9);
+#endif
+
+ nhName-> setText (levelName);
+ mle-> setText (levelHint);
+
+#ifdef KGR_PORTABLE
+ // OK-> setAccel (Key_Return); // No! We need it in "mle" box.
+ CANCEL-> setAccel (Key_Escape);
+
+ connect (OK, SIGNAL (clicked ()), dad, SLOT (accept ()));
+ connect (CANCEL, SIGNAL (clicked ()), dad, SLOT (reject ()));
+#endif
+}
+
+KGrNHDialog::~KGrNHDialog()
+{
+}
+
+/*******************************************************************************
+*************** DIALOG BOX TO CREATE OR EDIT A GAME (COLLECTION) ***************
+*******************************************************************************/
+
+#ifdef KGR_PORTABLE
+KGrECDialog::KGrECDialog (int action, int collnIndex,
+ QPtrList<KGrCollection> & gamesList,
+ QWidget * parent, const char * name)
+ : QDialog (parent, name, TRUE,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title)
+#else
+KGrECDialog::KGrECDialog (int action, int collnIndex,
+ QPtrList<KGrCollection> & gamesList,
+ QWidget * parent, const char * name)
+ : KDialogBase (KDialogBase::Plain, i18n("Edit Game Info"),
+ KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, parent, name)
+#endif
+{
+ collections = gamesList;
+ defaultGame = collnIndex;
+
+#ifdef KGR_PORTABLE
+ int margin = 10;
+ int spacing = 10;
+ QWidget * dad = this;
+#else
+ int margin = marginHint();
+ int spacing = spacingHint();
+ QWidget * dad = plainPage();
+#endif
+
+ QVBoxLayout * mainLayout = new QVBoxLayout (dad, margin, spacing);
+
+ QHBox * nameBox = new QHBox (dad);
+ mainLayout->addWidget (nameBox);
+ nameBox->setSpacing (spacing);
+ nameL = new QLabel (i18n("Name of game:"), nameBox);
+ ecName = new QLineEdit (nameBox);
+
+ QHBox * prefixBox = new QHBox (dad);
+ mainLayout->addWidget (prefixBox);
+ prefixBox->setSpacing (spacing);
+ prefixL = new QLabel (i18n("File name prefix:"), prefixBox);
+ ecPrefix = new QLineEdit (prefixBox);
+
+ ecGrp = new QButtonGroup (1, QButtonGroup::Horizontal, 0, dad);
+ mainLayout->addWidget (ecGrp);
+ ecTradB = new QRadioButton (i18n("Traditional rules"), ecGrp);
+ ecKGrB = new QRadioButton (i18n("KGoldrunner rules"), ecGrp);
+
+ nLevL = new QLabel (i18n( "0 levels" ), dad);
+ mainLayout->addWidget (nLevL);
+
+ mleL = new QLabel (i18n("About this game:"), dad);
+ mainLayout->addWidget (mleL);
+
+ // Set up a widget to hold the wrapped text, using \n for paragraph breaks.
+#ifdef QT3
+ mle = new QTextEdit (dad);
+ mle-> setTextFormat (PlainText);
+#else
+ mle = new QMultiLineEdit (dad);
+#endif
+ mainLayout->addWidget (mle);
+
+#ifdef KGR_PORTABLE
+ QHBox * buttons = new QHBox (dad);
+ mainLayout->addWidget (buttons);
+ buttons->setSpacing (spacing);
+ // Buttons are for Qt-only portability. NOT COMPILED in KDE environment.
+ OK = new QPushButton (i18n("&OK"), buttons);
+ CANCEL = new QPushButton (i18n("&Cancel"), buttons);
+
+ QPoint p = parent->mapToGlobal (QPoint (0,0));
+
+ // Base the geometry of the dialog box on the playing area.
+ int cell = parent->width() / (FIELDWIDTH + 4);
+ dad-> move (p.x()+2*cell, p.y()+2*cell);
+ dad-> setMinimumSize ((FIELDWIDTH*cell/2), (FIELDHEIGHT-1)*cell);
+#endif
+
+ if (action == SL_CR_GAME) {
+ setCaption (i18n("Create Game"));
+ }
+ else {
+ setCaption (i18n("Edit Game Info"));
+ }
+
+ QString OKText = "";
+ if (action == SL_UPD_GAME) { // Edit existing collection.
+ ecName-> setText (collections.at(defaultGame)->name);
+ ecPrefix-> setText (collections.at(defaultGame)->prefix);
+ if (collections.at(defaultGame)->nLevels > 0) {
+ // Collection already has some levels, so cannot change the prefix.
+ ecPrefix-> setEnabled (FALSE);
+ }
+ QString s;
+#ifndef KGR_PORTABLE
+ nLevL-> setText (i18n("1 level", "%n levels",
+ collections.at(defaultGame)->nLevels));
+#else
+ nLevL-> setText (i18n("%1 levels")
+ .arg(collections.at(defaultGame)->nLevels));
+#endif
+ OKText = i18n("Save Changes");
+ }
+ else { // Create a collection.
+ ecName-> setText ("");
+ ecPrefix-> setText ("");
+ nLevL-> setText (i18n("0 levels"));
+ OKText = i18n("Save New");
+ }
+#ifdef KGR_PORTABLE
+ OK->setText (OKText);
+#else
+ setButtonOK (OKText);
+#endif
+
+ if ((action == SL_CR_GAME) ||
+ (collections.at(defaultGame)->settings == 'T')) {
+ ecSetRules ('T'); // Traditional settings.
+ }
+ else {
+ ecSetRules ('K'); // KGoldrunner settings.
+ }
+
+ // Configure the edit box.
+ mle-> setAlignment (AlignLeft);
+#ifndef QT3
+ mle-> setWordWrap (QMultiLineEdit::WidgetWidth);
+ mle-> setFixedVisibleLines (8);
+#endif
+
+ if ((action == SL_UPD_GAME) &&
+ (collections.at(defaultGame)->about.length() > 0)) {
+ // Display and edit the game description in its original language.
+ mle-> setText (collections.at(defaultGame)->about);
+ }
+ else {
+ mle-> setText ("");
+ }
+
+ connect (ecKGrB, SIGNAL (clicked ()), this, SLOT (ecSetKGr ()));
+ connect (ecTradB, SIGNAL (clicked ()), this, SLOT (ecSetTrad ()));
+
+#ifdef KGR_PORTABLE
+ OK-> setGeometry (10, 145 + mle->height(), 100, 25);
+ // OK-> setAccel (Key_Return); // No! We need it in "mle" box.
+
+ CANCEL-> setGeometry (190, 145 + mle->height(), 100, 25);
+ CANCEL-> setAccel (Key_Escape);
+
+ dad-> resize (300, 175 + mle->height());
+
+ connect (OK, SIGNAL (clicked ()), this, SLOT (accept()));
+ connect (CANCEL, SIGNAL (clicked ()), this, SLOT (reject()));
+#endif
+}
+
+KGrECDialog::~KGrECDialog()
+{
+}
+
+void KGrECDialog::ecSetRules (const char settings)
+{
+ ecKGrB-> setChecked (FALSE);
+ ecTradB-> setChecked (FALSE);
+ if (settings == 'K')
+ ecKGrB-> setChecked (TRUE);
+ else
+ ecTradB-> setChecked (TRUE);
+}
+
+void KGrECDialog::ecSetKGr () {ecSetRules ('K');} // Radio button slots.
+void KGrECDialog::ecSetTrad () {ecSetRules ('T');}
+
+/*******************************************************************************
+*************** DIALOG TO SELECT A SAVED GAME TO BE RE-LOADED ****************
+*******************************************************************************/
+
+#ifdef KGR_PORTABLE
+KGrLGDialog::KGrLGDialog (QFile * savedGames,
+ QPtrList<KGrCollection> & collections,
+ QWidget * parent, const char * name)
+ : QDialog (parent, name, TRUE,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title)
+#else
+KGrLGDialog::KGrLGDialog (QFile * savedGames,
+ QPtrList<KGrCollection> & collections,
+ QWidget * parent, const char * name)
+ : KDialogBase (KDialogBase::Plain, i18n("Select Saved Game"),
+ KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, parent, name)
+#endif
+{
+#ifdef KGR_PORTABLE
+ int margin = 10;
+ int spacing = 10;
+ QWidget * dad = this;
+#else
+ int margin = marginHint();
+ int spacing = spacingHint();
+ QWidget * dad = plainPage();
+#endif
+
+ QVBoxLayout * mainLayout = new QVBoxLayout (dad, margin, spacing);
+
+ QLabel * lgHeader = new QLabel (
+ i18n("Game Level/Lives/Score "
+ "Day Date Time "), dad);
+
+ lgList = new QListBox (dad);
+#ifdef KGR_PORTABLE
+ QFont f ("courier", 12);
+#else
+ QFont f = KGlobalSettings::fixedFont(); // KDE version.
+#endif
+ f.setFixedPitch (TRUE);
+ lgList-> setFont (f);
+ f.setBold (TRUE);
+ lgHeader-> setFont (f);
+
+ mainLayout-> addWidget (lgHeader);
+ mainLayout-> addWidget (lgList);
+
+#ifdef KGR_PORTABLE
+ QHBox * buttons = new QHBox (dad);
+ buttons-> setSpacing (spacing);
+ // Buttons are for Qt-only portability. NOT COMPILED in KDE environment.
+ QPushButton * OK = new QPushButton (i18n("&OK"), buttons);
+ QPushButton * CANCEL = new QPushButton (i18n("&Cancel"), buttons);
+ mainLayout-> addWidget (buttons);
+
+ dad-> setCaption (i18n("Select Saved Game"));
+
+ // Base the geometry of the list box on the playing area.
+ QPoint p = parent->mapToGlobal (QPoint (0,0));
+ int c = parent->width() / (FIELDWIDTH + 4);
+ dad-> move (p.x()+2*c, p.y()+2*c);
+ lgList-> setMinimumHeight ((FIELDHEIGHT/2)*c);
+ OK-> setMaximumWidth (4*c);
+ CANCEL-> setMaximumWidth (4*c);
+
+ OK-> setAccel (Key_Return);
+ CANCEL-> setAccel (Key_Escape);
+#endif
+
+ lgHighlight = -1;
+
+ QTextStream gameText (savedGames);
+ QString s = "";
+ QString pr = "";
+ int i;
+ int imax = collections.count();
+
+ // Read the saved games into the list box.
+ while (! gameText.endData()) {
+ s = gameText.readLine(); // Read in one saved game.
+ pr = s.left (s.find (" ", 0, FALSE)); // Get the collection prefix.
+ for (i = 0; i < imax; i++) { // Get the collection name.
+ if (collections.at(i)->prefix == pr) {
+ s = s.insert (0,
+ collections.at(i)->name.leftJustify (20, ' ', TRUE) + " ");
+ break;
+ }
+ }
+ lgList-> insertItem (s);
+ }
+ savedGames->close();
+
+ // Mark row 0 (the most recently saved game) as the default selection.
+ lgList-> setCurrentItem (0);
+ lgList-> setSelected (0, TRUE);
+ lgHighlight = 0;
+
+ connect (lgList, SIGNAL (highlighted (int)), this, SLOT (lgSelect (int)));
+#ifdef KGR_PORTABLE
+ connect (OK, SIGNAL (clicked ()), this, SLOT (accept ()));
+ connect (CANCEL, SIGNAL (clicked ()), this, SLOT (reject ()));
+#endif
+}
+
+void KGrLGDialog::lgSelect (int n)
+{
+ lgHighlight = n;
+}
+
+/*******************************************************************************
+*********************** CENTRALISED MESSAGE FUNCTIONS ************************
+*******************************************************************************/
+
+void KGrMessage::information (QWidget * parent, const QString &caption, const QString &text)
+{
+#ifdef KGR_PORTABLE
+ // Force Qt to do word-wrapping (but it ignores "\n" line-breaks).
+ QMessageBox::information (parent, caption,
+ "<qt>" + text + "</qt>");
+#else
+ // KDE does word-wrapping and will observe "\n" line-breaks.
+ KMessageBox::information (parent, text, caption);
+#endif
+}
+
+int KGrMessage::warning (QWidget * parent, QString caption, QString text,
+ QString label0, QString label1, QString label2)
+{
+ int ans = 0;
+#ifdef KGR_PORTABLE
+ // Display a box with 2 or 3 buttons, depending on if label2 is empty or not.
+ // Force Qt to do word-wrapping (but it ignores "\n" line-breaks).
+ ans = QMessageBox::warning (parent, caption,
+ "<qt>" + text + "</qt>",
+ label0, label1, label2,
+ 0, (label2.isEmpty()) ? 1 : 2);
+#else
+ // KDE does word-wrapping and will observe "\n" line-breaks.
+ if (label2.isEmpty()) {
+ // Display a box with 2 buttons.
+ ans = KMessageBox::questionYesNo (parent, text, caption,
+ label0, label1);
+ ans = (ans == KMessageBox::Yes) ? 0 : 1;
+ }
+ else {
+ // Display a box with 3 buttons.
+ ans = KMessageBox::questionYesNoCancel (parent, text, caption,
+ label0, label1);
+ if (ans == KMessageBox::Cancel)
+ ans = 2;
+ else
+ ans = (ans == KMessageBox::Yes) ? 0 : 1;
+ }
+#endif
+ return (ans);
+}
+
+/******************************************************************************/
+/********************** WORD-WRAPPED MESSAGE BOX ************************/
+/******************************************************************************/
+
+void KGrMessage::wrapped (QWidget * parent, QString title, QString contents)
+{
+#ifndef KGR_PORTABLE
+ KMessageBox::information (parent, contents, title);
+#else
+ QDialog * mm = new QDialog (parent, "wrappedMessage", TRUE,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title);
+
+ int margin = 10;
+ int spacing = 10;
+ QVBoxLayout * mainLayout = new QVBoxLayout (mm, margin, spacing);
+
+ // Make text background grey not white (i.e. same as widget background).
+ QPalette pl = mm->palette();
+#ifdef QT3
+ pl.setColor (QColorGroup::Base, mm->paletteBackgroundColor());
+#else
+ pl.setColor (QColorGroup::Base, mm->backgroundColor());
+#endif
+ mm-> setPalette (pl);
+
+ // Set up a widget to hold the wrapped text, using \n for paragraph breaks.
+#ifdef QT3
+ QTextEdit * mle = new QTextEdit (mm);
+ mle-> setTextFormat (PlainText);
+#else
+ QMultiLineEdit * mle = new QMultiLineEdit (mm);
+#endif
+ mainLayout->addWidget (mle);
+
+ // Button is for Qt-only portability. NOT COMPILED in KDE environment.
+ QPushButton * OK = new QPushButton (i18n("&OK"), mm);
+ mainLayout->addWidget (OK, Qt::AlignHCenter);
+
+ mm-> setCaption (title);
+
+ // Base the geometry of the text box on the playing area.
+ QPoint p = parent->mapToGlobal (QPoint (0,0));
+ int c = parent->width() / (FIELDWIDTH + 4);
+ mm-> move (p.x()+4*c, p.y()+4*c);
+ mle-> setMinimumSize ((FIELDWIDTH*c/2), (FIELDHEIGHT/2)*c);
+ OK-> setMaximumWidth (3*c);
+
+ mle-> setFrameStyle (QFrame::NoFrame);
+ mle-> setAlignment (AlignLeft);
+ mle-> setReadOnly (TRUE);
+ mle-> setText (contents);
+
+#ifndef QT3
+ mle-> setWordWrap (QMultiLineEdit::WidgetWidth);
+ mle-> setFixedVisibleLines (10);
+ if (mle-> numLines() < 10) {
+ mle-> setFixedVisibleLines (mle->numLines());
+ }
+#endif
+
+ OK-> setAccel (Key_Return);
+ connect (OK, SIGNAL (clicked ()), mm, SLOT (accept ()));
+
+ mm-> exec ();
+
+ delete mm;
+#endif // KGR_PORTABLE
+}
+
+#include "kgrdialog.moc"