summaryrefslogtreecommitdiffstats
path: root/kmines/dialogs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmines/dialogs.cpp')
-rw-r--r--kmines/dialogs.cpp294
1 files changed, 294 insertions, 0 deletions
diff --git a/kmines/dialogs.cpp b/kmines/dialogs.cpp
new file mode 100644
index 00000000..d02b2eea
--- /dev/null
+++ b/kmines/dialogs.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 1996-2003 Nicolas HADACEK (hadacek@kde.org)
+ *
+ * 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; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "dialogs.h"
+#include "dialogs.moc"
+
+#include <qpixmap.h>
+#include <qvgroupbox.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qgrid.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+#include <knuminput.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kdialogbase.h>
+
+#include "settings.h"
+
+#include "bitmaps/smile"
+#include "bitmaps/smile_happy"
+#include "bitmaps/smile_ohno"
+#include "bitmaps/smile_stress"
+#include "bitmaps/smile_sleep"
+
+
+//-----------------------------------------------------------------------------
+const char **Smiley::XPM_NAMES[NbMoods] = {
+ smile_xpm, smile_stress_xpm, smile_happy_xpm, smile_ohno_xpm,
+ smile_sleep_xpm
+};
+
+void Smiley::setMood(Mood mood)
+{
+ QPixmap p(XPM_NAMES[mood]);
+ setPixmap(p);
+}
+
+//-----------------------------------------------------------------------------
+DigitalClock::DigitalClock(QWidget *parent)
+: KGameLCDClock(parent, "digital_clock")
+{
+ setFrameStyle(Panel | Sunken);
+ setDefaultBackgroundColor(black);
+ setDefaultColor(white);
+}
+
+KExtHighscore::Score DigitalClock::score() const
+{
+ KExtHighscore::Score score(KExtHighscore::Won);
+ score.setScore(3600 - seconds());
+ score.setData("nb_actions", _nbActions);
+ return score;
+}
+
+void DigitalClock::timeoutClock()
+{
+ KGameLCDClock::timeoutClock();
+
+ if ( _cheating || _customGame ) setColor(white);
+ else if ( _first<score() ) setColor(red);
+ else if ( _last<score() ) setColor(blue);
+ else setColor(white);
+}
+
+void DigitalClock::start()
+{
+ KGameLCDClock::start();
+ if ( !_cheating && !_customGame ) setColor(red);
+}
+
+void DigitalClock::reset(bool customGame)
+{
+ _nbActions = 0;
+ _customGame = customGame;
+ if ( !customGame ) {
+ _first = KExtHighscore::firstScore();
+ _last = KExtHighscore::lastScore();
+ }
+ _cheating = false;
+ KGameLCDClock::reset();
+ resetColor();
+}
+
+void DigitalClock::setCheating()
+{
+ _cheating = true;
+ setColor(white);
+}
+
+//-----------------------------------------------------------------------------
+
+const uint CustomConfig::maxWidth = 50;
+const uint CustomConfig::minWidth = 5;
+const uint CustomConfig::maxHeight = 50;
+const uint CustomConfig::minHeight = 5;
+
+CustomConfig::CustomConfig()
+ : QWidget(0, "custom_config_widget"), _block(false)
+{
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::spacingHint());
+
+ _width = new KIntNumInput(this, "kcfg_CustomWidth");
+ _width->setLabel(i18n("Width:"));
+ _width->setRange(minWidth, maxWidth);
+ connect(_width, SIGNAL(valueChanged(int)), SLOT(updateNbMines()));
+ top->addWidget(_width);
+
+ _height = new KIntNumInput(this, "kcfg_CustomHeight");
+ _height->setLabel(i18n("Height:"));
+ _height->setRange(minWidth, maxWidth);
+ connect(_height, SIGNAL(valueChanged(int)), SLOT(updateNbMines()));
+ top->addWidget(_height);
+
+ _mines = new KIntNumInput(this, "kcfg_CustomMines");
+ _mines->setLabel(i18n("No. of mines:"));
+ _mines->setRange(1, Level::maxNbMines(maxWidth, maxHeight));
+ connect(_mines, SIGNAL(valueChanged(int)), SLOT(updateNbMines()));
+ top->addWidget(_mines);
+
+ top->addSpacing(2 * KDialog::spacingHint());
+
+ // combo to choose level
+ QHBoxLayout *hbox = new QHBoxLayout(top);
+ QLabel *label = new QLabel(i18n("Choose level:"), this);
+ hbox->addWidget(label);
+ _gameType = new KComboBox(false, this);
+ connect(_gameType, SIGNAL(activated(int)), SLOT(typeChosen(int)));
+ for (uint i=0; i<=Level::NB_TYPES; i++)
+ _gameType->insertItem(i18n(Level::LABELS[i]));
+ hbox->addWidget(_gameType);
+ hbox->addWidget(new QWidget(this), 1);
+
+ top->addStretch(1);
+}
+
+void CustomConfig::updateNbMines()
+{
+ if (_block) return;
+ _block = true;
+ Level l(_width->value(), _height->value(), _mines->value());
+ _mines->setRange(1, Level::maxNbMines(l.width(), l.height()));
+ _mines->setLabel(i18n("Mines (%1%):")
+ .arg( (100*l.nbMines()) / (l.width() * l.height()) ));
+ _gameType->setCurrentItem(l.type());
+ _block = false;
+}
+
+void CustomConfig::typeChosen(int i)
+{
+ if (_block) return;
+ _block = true;
+ Level::Type type = (Level::Type)i;
+ if ( type==Level::Custom ) {
+ Level level = Settings::customLevel();
+ _width->setValue(level.width());
+ _height->setValue(level.height());
+ _mines->setRange(1, Level::maxNbMines(level.width(), level.height()));
+ _mines->setValue(level.nbMines());
+ } else {
+ Level level(type);
+ _width->setValue(level.width());
+ _height->setValue(level.height());
+ _mines->setRange(1, Level::maxNbMines(level.width(), level.height()));
+ _mines->setValue(level.nbMines());
+ }
+ _block = false;
+ updateNbMines();
+}
+
+//-----------------------------------------------------------------------------
+static const char *MOUSE_BUTTON_LABELS[Settings::EnumButton::COUNT] = {
+ I18N_NOOP("Left button:"), I18N_NOOP("Middle button:"),
+ I18N_NOOP("Right button:")
+};
+
+static const char *MOUSE_CONFIG_NAMES[Settings::EnumButton::COUNT] = {
+ "kcfg_leftMouseAction", "kcfg_midMouseAction",
+ "kcfg_rightMouseAction"
+};
+
+static const char *MOUSE_ACTION_LABELS[Settings::EnumMouseAction::COUNT-1] = {
+ I18N_NOOP("Reveal"), I18N_NOOP("Autoreveal"),
+ I18N_NOOP("Toggle Flag"), I18N_NOOP("Toggle ? Flag")
+};
+
+GameConfig::GameConfig()
+ : QWidget(0, "game_config_widget"), _magicDialogEnabled(false)
+{
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::spacingHint());
+
+ QCheckBox *cb = new QCheckBox(i18n("Enable ? mark"), this, "kcfg_UncertainMark");
+ top->addWidget(cb);
+
+ cb = new QCheckBox(i18n("Enable keyboard"), this, "kcfg_KeyboardGame");
+ top->addWidget(cb);
+
+ cb = new QCheckBox(i18n("Pause if window loses focus"), this, "kcfg_PauseFocus");
+ top->addWidget(cb);
+
+ cb = new QCheckBox(i18n("\"Magic\" reveal"), this, "kcfg_MagicReveal");
+ QWhatsThis::add(cb, i18n("Set flags and reveal squares where they are trivial."));
+ connect(cb, SIGNAL(toggled(bool)), SLOT(magicModified(bool)));
+ top->addWidget(cb);
+
+ top->addSpacing(2 * KDialog::spacingHint());
+
+ QHBoxLayout *hbox = new QHBoxLayout(top);
+ QVGroupBox *gb = new QVGroupBox(i18n("Mouse Bindings"), this);
+ hbox->addWidget(gb);
+ QGrid *grid = new QGrid(2, gb);
+ grid->setSpacing(KDialog::spacingHint());
+ for (uint i=0; i< Settings::EnumButton::COUNT; i++) {
+ (void)new QLabel(i18n(MOUSE_BUTTON_LABELS[i]), grid);
+ QComboBox *cb = new QComboBox(false, grid, MOUSE_CONFIG_NAMES[i]);
+ for (uint k=0; k< (Settings::EnumMouseAction::COUNT-1); k++)
+ cb->insertItem(i18n(MOUSE_ACTION_LABELS[k]));
+ cb->setCurrentItem(i);
+ }
+ hbox->addStretch(1);
+
+ top->addStretch(1);
+}
+
+void GameConfig::magicModified(bool on)
+{
+ if ( !_magicDialogEnabled || !on ) return;
+ KMessageBox::information(this, i18n("When the \"magic\" reveal is on, you lose the ability to enter the highscores."), QString::null, "magic_reveal_warning");
+}
+
+//-----------------------------------------------------------------------------
+static const char *COLOR_LABELS[Settings::EnumType::COUNT] = {
+ I18N_NOOP("Flag color:"), I18N_NOOP("Explosion color:"),
+ I18N_NOOP("Error color:")
+};
+
+static const char *COLOR_CONFIG_NAMES[Settings::EnumType::COUNT] = {
+ "kcfg_flagColor", "kcfg_explosionColor", "kcfg_errorColor"
+};
+
+static const char *N_COLOR_CONFIG_NAMES[KMines::NB_N_COLORS] = {
+ "kcfg_MineColor0", "kcfg_MineColor1", "kcfg_MineColor2",
+ "kcfg_MineColor3", "kcfg_MineColor4", "kcfg_MineColor5",
+ "kcfg_MineColor6", "kcfg_MineColor7"
+};
+
+AppearanceConfig::AppearanceConfig()
+ : QWidget(0, "appearance_config_widget")
+{
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::spacingHint());
+
+ QHBoxLayout *hbox = new QHBoxLayout(top);
+ QGrid *grid = new QGrid(2, this);
+ grid->setSpacing(KDialog::spacingHint());
+ hbox->addWidget(grid);
+ for (uint i=0; i<Settings::EnumType::COUNT; i++) {
+ (void)new QLabel(i18n(COLOR_LABELS[i]), grid);
+ KColorButton *cb = new KColorButton(grid, COLOR_CONFIG_NAMES[i]);
+ cb->setFixedWidth(100);
+ }
+ for (uint i=0; i<NB_N_COLORS; i++) {
+ (void)new QLabel(i18n("%n mine color:", "%n mines color:", i+1), grid);
+ KColorButton *cb = new KColorButton(grid, N_COLOR_CONFIG_NAMES[i]);
+ cb->setFixedWidth(100);
+ }
+ hbox->addStretch(1);
+
+ top->addStretch(1);
+}
+