summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--src/Makefile.am7
-rw-r--r--src/gui/setup.cpp343
-rw-r--r--src/gui/setup.h26
-rw-r--r--src/gui/setup_audio.cpp124
-rw-r--r--src/gui/setup_audio.h51
-rw-r--r--src/gui/setup_joystick.cpp62
-rw-r--r--src/gui/setup_joystick.h48
-rw-r--r--src/gui/setup_video.cpp226
-rw-r--r--src/gui/setup_video.h59
-rw-r--r--src/gui/setuptab.h36
11 files changed, 651 insertions, 340 deletions
diff --git a/ChangeLog b/ChangeLog
index 0528fdc9..6ec488d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-03-19 Björn Steinbrink <B.Steinbrink@gmx.de>
+
+ * src/gui/setup_audio.h, src/gui/setup.cpp, src/gui/setup_audio.cpp,
+ src/gui/setup_joystick.h, src/gui/setup_video.cpp, src/gui/setuptab.h,
+ src/gui/setup.h, src/gui/setup_joystick.cpp, src/gui/setup_video.h,
+ src/Makefile.am: Splitted setup window into manageable pieces
+ according to their tabs in the window. Fixed some memory leaks along
+ the way. Also fixed two settings not being stored on "apply".
+
2006-03-18 Björn Steinbrink <B.Steinbrink@gmx.de>
* src/gui/chat.cpp, src/gui/menuwindow.cpp, src/gui/skill.cpp,
diff --git a/src/Makefile.am b/src/Makefile.am
index cee6a95a..e4fef745 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -81,8 +81,15 @@ tmw_SOURCES = graphic/spriteset.cpp \
gui/scrollarea.h \
gui/sell.cpp \
gui/sell.h \
+ gui/setup_audio.cpp \
+ gui/setup_audio.h \
gui/setup.cpp \
gui/setup.h \
+ gui/setup_joystick.cpp \
+ gui/setup_joystick.h \
+ gui/setuptab.h \
+ gui/setup_video.cpp \
+ gui/setup_video.h \
gui/shop.cpp \
gui/shop.h \
gui/skill.cpp \
diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp
index 2fd99e1c..82b77284 100644
--- a/src/gui/setup.cpp
+++ b/src/gui/setup.cpp
@@ -23,29 +23,13 @@
#include "setup.h"
-#include <sstream>
-
-#include <guichan/widgets/container.hpp>
-#include <guichan/widgets/label.hpp>
-
#include "button.h"
-#include "checkbox.h"
-#include "listbox.h"
-#include "ok_dialog.h"
-#include "scrollarea.h"
-#include "slider.h"
+#include "setup_audio.h"
+#include "setup_joystick.h"
+#include "setup_video.h"
#include "tabbedcontainer.h"
-#include "../configuration.h"
-#include "../graphics.h"
-#include "../joystick.h"
-#include "../log.h"
-#include "../main.h"
-#include "../sound.h"
-
-extern Graphics *graphics;
-
-extern Joystick *joystick;
+#include "../utils/dtor.h"
extern Window *statusWindow;
extern Window *minimap;
@@ -55,120 +39,18 @@ extern Window *equipmentWindow;
extern Window *helpWindow;
extern Window *skillDialog;
-/**
- * The list model for mode list.
- *
- * \ingroup Interface
- */
-class ModeListModel : public gcn::ListModel
-{
- public:
- /**
- * Constructor.
- */
- ModeListModel();
-
- /**
- * Destructor.
- */
- virtual ~ModeListModel() { }
-
- /**
- * Returns the number of elements in container.
- */
- int getNumberOfElements() { return mVideoModes.size(); }
-
- /**
- * Returns element from container.
- */
- std::string getElementAt(int i) { return mVideoModes[i]; }
-
- private:
- std::vector<std::string> mVideoModes;
-};
-
-ModeListModel::ModeListModel()
-{
- SDL_Rect **modes;
-
- /* Get available fullscreen/hardware modes */
- modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
-
- /* Check is there are any modes available */
- if (modes == (SDL_Rect **)0) {
- logger->log("No modes available");
- }
-
- /* Check if our resolution is restricted */
- if (modes == (SDL_Rect **)-1) {
- logger->log("All resolutions available");
- }
- else{
- /* Print valid modes */
- //logger->log("Available Modes");
- for (int i = 0; modes[i]; ++i) {
- //logger->log(" %dx%d", modes[i]->w, modes[i]->h);
- std::stringstream mode;
- mode << (int)modes[i]->w << "x" << (int)modes[i]->h;
- mVideoModes.push_back(mode.str());
- }
- }
-}
-
Setup::Setup():
Window("Setup")
{
- mModeListModel = new ModeListModel();
- mModeList = new ListBox(mModeListModel);
- mModeList->setEnabled(false);
- ScrollArea *scrollArea = new ScrollArea(mModeList);
- mFsCheckBox = new CheckBox("Full screen", false);
- mOpenGLCheckBox = new CheckBox("OpenGL", false);
-#ifndef USE_OPENGL
- mOpenGLCheckBox->setEnabled(false);
-#endif
- mCustomCursorCheckBox = new CheckBox("Custom cursor");
- gcn::Label *alphaLabel = new gcn::Label("Gui opacity");
- mAlphaSlider = new Slider(0.2, 1.0);
- mSoundCheckBox = new CheckBox("Sound", false);
- mSfxSlider = new Slider(0, 128);
- mMusicSlider = new Slider(0, 128);
- gcn::Label *sfxLabel = new gcn::Label("Sfx volume");
- gcn::Label *musicLabel = new gcn::Label("Music volume");
- mCalibrateLabel = new gcn::Label("Press the button to start calibration");
- mCalibrateButton = new Button("Calibrate", "calibrate", this);
Button *applyButton = new Button("Apply", "apply", this);
Button *cancelButton = new Button("Cancel", "cancel", this);
Button *resetWinsToDefault = new Button("Reset Windows", "winsToDefault", this);
- // Set events
- mAlphaSlider->setEventId("guialpha");
- mSfxSlider->setEventId("sfx");
- mMusicSlider->setEventId("music");
- mCustomCursorCheckBox->setEventId("customcursor");
-
// Set dimensions/positions
int width = 230;
int height = 185;
setContentSize(width, height);
- scrollArea->setDimension(gcn::Rectangle(10, 10, 90, 50));
- mModeList->setDimension(gcn::Rectangle(0, 0, 60, 50));
- mFsCheckBox->setPosition(110, 10);
- mOpenGLCheckBox->setPosition(110, 30);
- mCustomCursorCheckBox->setPosition(110, 50);
- mAlphaSlider->setDimension(gcn::Rectangle(10, 80, 100, 10));
- alphaLabel->setPosition(20 + mAlphaSlider->getWidth(), mAlphaSlider->getY());
-
- mSoundCheckBox->setPosition(10, 10);
- mSfxSlider->setDimension(gcn::Rectangle(10, 30, 100, 10));
- mMusicSlider->setDimension(gcn::Rectangle(10, 50, 100, 10));
- sfxLabel->setPosition(20 + mSfxSlider->getWidth(), 27);
- musicLabel->setPosition(20 + mMusicSlider->getWidth(), 47);
-
- mCalibrateLabel->setPosition(5, 10);
- mCalibrateButton->setPosition(10, 20 + mCalibrateLabel->getHeight());
-
cancelButton->setPosition(
width - cancelButton->getWidth() - 5,
height - cancelButton->getHeight() - 5);
@@ -178,224 +60,51 @@ Setup::Setup():
resetWinsToDefault->setPosition(
applyButton->getX() - resetWinsToDefault->getWidth() - 5,
applyButton->getY());
-
- // Listen for actions
- mAlphaSlider->addActionListener(this);
- mSfxSlider->addActionListener(this);
- mMusicSlider->addActionListener(this);
- mCustomCursorCheckBox->addActionListener(this);
-
- // Assemble dialog
- gcn::Container *video = new gcn::Container();
- video->setOpaque(false);
- video->add(scrollArea);
- video->add(mFsCheckBox);
- video->add(mOpenGLCheckBox);
- video->add(mCustomCursorCheckBox);
- video->add(mAlphaSlider);
- video->add(alphaLabel);
- gcn::Container *audio = new gcn::Container();
- audio->setOpaque(false);
- audio->add(mSoundCheckBox);
- audio->add(mSfxSlider);
- audio->add(mMusicSlider);
- audio->add(sfxLabel);
- audio->add(musicLabel);
-
- gcn::Container *input = new gcn::Container();
- input->setOpaque(false);
- input->add(mCalibrateLabel);
- input->add(mCalibrateButton);
-
TabbedContainer *panel = new TabbedContainer();
panel->setDimension(gcn::Rectangle(5, 5, 220, 130));
panel->setOpaque(false);
- panel->addTab(video, "Video");
- panel->addTab(audio, "Audio");
- panel->addTab(input, "Input");
- add(panel);
- add(resetWinsToDefault);
- add(applyButton);
- add(cancelButton);
-
- setLocationRelativeTo(getParent());
-
- // Load default settings
- mModeList->setSelected(-1);
- // Full Screen
- mFullScreenEnabled = config.getValue("screen", 0);
- mFsCheckBox->setMarked(mFullScreenEnabled);
+ SetupTab *tab;
- // Sound
- mSoundEnabled = config.getValue("sound", 0);
- mSoundCheckBox->setMarked(mSoundEnabled);
+ tab = new Setup_Video();
+ panel->addTab(tab, "Video");
+ mTabs.push_back(tab);
- mSfxVolume = (int)config.getValue("sfxVolume", 100);
- mSfxSlider->setValue(mSfxVolume);
+ tab = new Setup_Audio();
+ panel->addTab(tab, "Audio");
+ mTabs.push_back(tab);
- mMusicVolume = (int)config.getValue("musicVolume", 60);
- mMusicSlider->setValue(mMusicVolume);
+ tab = new Setup_Joystick();
+ panel->addTab(tab, "Joystick");
+ mTabs.push_back(tab);
- // Graphics
- mCustomCursorEnabled = config.getValue("customcursor", 1);
- mCustomCursorCheckBox->setMarked(mCustomCursorEnabled);
-
- mOpacity = config.getValue("guialpha", 0.8);
- mAlphaSlider->setValue(mOpacity);
+ add(panel);
+ add(resetWinsToDefault);
+ add(applyButton);
+ add(cancelButton);
- mOpenGLEnabled = config.getValue("opengl", 0);
- mOpenGLCheckBox->setMarked(mOpenGLEnabled);
+ setLocationRelativeTo(getParent());
}
Setup::~Setup()
{
- delete mModeListModel;
+ for_each(mTabs.begin(), mTabs.end(), make_dtor(mTabs));
}
-void Setup::action(const std::string &eventId)
+void Setup::action(const std::string &event)
{
- if (eventId == "sfx")
- {
- config.setValue("sfxVolume", (int)mSfxSlider->getValue());
- sound.setSfxVolume((int)mSfxSlider->getValue());
- }
- else if (eventId == "music")
- {
- config.setValue("musicVolume", (int)mMusicSlider->getValue());
- sound.setMusicVolume((int)mMusicSlider->getValue());
- }
- else if (eventId == "guialpha")
- {
- config.setValue("guialpha", mAlphaSlider->getValue());
- }
- else if (eventId == "customcursor")
- {
- config.setValue("customcursor",
- mCustomCursorCheckBox->isMarked() ? 1 : 0);
- }
- else if (eventId == "calibrate" && joystick != NULL)
- {
- if (joystick->isCalibrating())
- {
- mCalibrateButton->setCaption("Calibrate");
- mCalibrateLabel->setCaption("Press the button to start calibration");
- joystick->finishCalibration();
- }
- else
- {
- mCalibrateButton->setCaption("Stop");
- mCalibrateLabel->setCaption("Rotate the stick");
- joystick->startCalibration();
- }
- }
- else if (eventId == "apply")
+ if (event == "apply")
{
setVisible(false);
-
- // Full screen changes
- bool fullscreen = mFsCheckBox->isMarked();
- if (fullscreen != (config.getValue("screen", 0) == 1))
- {
- // checks for opengl usage
- if (!(config.getValue("opengl", 0) == 1))
- {
- if (!graphics->setFullscreen(fullscreen))
- {
- fullscreen = !fullscreen;
- if (!graphics->setFullscreen(fullscreen))
- {
- std::stringstream error;
- error << "Failed to switch to " <<
- (fullscreen ? "windowed" : "fullscreen") <<
- "mode and restoration of old mode also failed!" <<
- std::endl;
- logger->error(error.str());
- }
- }
- } else {
- new OkDialog("Switching to FullScreen",
- "Restart needed for changes to take effect.", this);
- }
- config.setValue("screen", fullscreen ? 1 : 0);
- }
-
- // Sound settings changes
- if (mSoundCheckBox->isMarked())
- {
- config.setValue("sound", 1);
- try {
- sound.init();
- }
- catch (const char *err)
- {
- new OkDialog("Sound Engine", err, this);
- logger->log("Warning: %s", err);
- }
- }
- else
- {
- config.setValue("sound", 0);
- sound.close();
- }
-
- // OpenGL change
- if (mOpenGLCheckBox->isMarked() != mOpenGLEnabled)
- {
- config.setValue("opengl", mOpenGLCheckBox->isMarked() ? 1 : 0);
-
- // OpenGL can currently only be changed by restarting, notify user.
- new OkDialog("Changing OpenGL",
- "Applying change to OpenGL requires restart.", this);
- }
-
- // We sync old and new values at apply time
- // Screen
- mFullScreenEnabled = config.getValue("screen", 0);
-
- // Sound
- mSoundEnabled = config.getValue("sound", 0);
- mSfxVolume = (int)config.getValue("sfxVolume", 100);
- mMusicVolume = (int)config.getValue("musicVolume", 60);
-
- // Graphics
- mCustomCursorEnabled = config.getValue("customcursor", 1);
- mOpacity = config.getValue("guialpha", 0.8);
- mOpenGLEnabled = config.getValue("opengl", 0);
+ for_each(mTabs.begin(), mTabs.end(), std::mem_fun(&SetupTab::apply));
}
- else if (eventId == "cancel")
+ else if (event == "cancel")
{
setVisible(false);
-
- // Restoring old values when cancelling
- // Screen
- config.setValue("screen", mFullScreenEnabled ? 1 : 0);
- mFsCheckBox->setMarked(mFullScreenEnabled);
-
- // Sound
- config.getValue("sound", mSoundEnabled ? 1 : 0);
- mSoundCheckBox->setMarked(mSoundEnabled);
-
- config.getValue("sfxVolume", mSfxVolume ? 1 : 0);
- sound.setSfxVolume(mSfxVolume);
- mSfxSlider->setValue(mSfxVolume);
-
- config.setValue("musicVolume", mMusicVolume);
- sound.setMusicVolume(mMusicVolume);
- mMusicSlider->setValue(mMusicVolume);
-
- // Graphics
- config.setValue("customcursor", mCustomCursorEnabled ? 1 : 0);
- mCustomCursorCheckBox->setMarked(mCustomCursorEnabled);
-
- config.setValue("guialpha", mOpacity);
- mAlphaSlider->setValue(mOpacity);
-
- config.setValue("opengl", mOpenGLEnabled ? 1 : 0);
- mOpenGLCheckBox->setMarked(mOpenGLEnabled);
+ for_each(mTabs.begin(), mTabs.end(), std::mem_fun(&SetupTab::cancel));
}
- else if (eventId == "winsToDefault")
+ else if (event == "winsToDefault")
{
statusWindow->resetToDefaultSize();
minimap->resetToDefaultSize();
diff --git a/src/gui/setup.h b/src/gui/setup.h
index fa870489..611633c5 100644
--- a/src/gui/setup.h
+++ b/src/gui/setup.h
@@ -24,14 +24,13 @@
#ifndef _TMW_SETUP_H
#define _TMW_SETUP_H
-#include <vector>
+#include <list>
#include <guichan/actionlistener.hpp>
-#include <guichan/listmodel.hpp>
#include "window.h"
-#include "../guichanfwd.h"
+class SetupTab;
/**
* The setup dialog.
@@ -58,26 +57,7 @@ class Setup : public Window, public gcn::ActionListener
action(const std::string& eventId);
private:
- class ModeListModel *mModeListModel;
-
- // Dialog widgets
- gcn::ListBox *mModeList;
- gcn::CheckBox *mFsCheckBox;
- gcn::CheckBox *mOpenGLCheckBox;
- gcn::CheckBox *mSoundCheckBox;
- gcn::CheckBox *mCustomCursorCheckBox;
- gcn::Slider *mAlphaSlider;
- gcn::Slider *mSfxSlider, *mMusicSlider;
- gcn::Label *mCalibrateLabel;
- gcn::Button *mCalibrateButton;
-
- // Variables that keeps old settings until the user "apply" them...
- int mMusicVolume, mSfxVolume;
- double mOpacity;
- bool mFullScreenEnabled;
- bool mOpenGLEnabled;
- bool mCustomCursorEnabled;
- bool mSoundEnabled;
+ std::list<SetupTab*> mTabs;
};
#endif
diff --git a/src/gui/setup_audio.cpp b/src/gui/setup_audio.cpp
new file mode 100644
index 00000000..a640887b
--- /dev/null
+++ b/src/gui/setup_audio.cpp
@@ -0,0 +1,124 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#include "setup_audio.h"
+
+#include <guichan/widgets/label.hpp>
+
+#include "checkbox.h"
+#include "ok_dialog.h"
+#include "slider.h"
+
+#include "../configuration.h"
+#include "../log.h"
+#include "../sound.h"
+
+Setup_Audio::Setup_Audio():
+ mSoundCheckBox(new CheckBox("Sound", false)),
+ mSfxSlider(new Slider(0, 128)),
+ mMusicSlider(new Slider(0, 128)),
+ mMusicVolume((int)config.getValue("musicVolume", 60)),
+ mSfxVolume((int)config.getValue("sfxVolume", 100)),
+ mSoundEnabled(config.getValue("sound", 0))
+{
+ setOpaque(false);
+
+ gcn::Label *sfxLabel = new gcn::Label("Sfx volume");
+ gcn::Label *musicLabel = new gcn::Label("Music volume");
+
+ mSfxSlider->setEventId("sfx");
+ mMusicSlider->setEventId("music");
+
+ mSfxSlider->addActionListener(this);
+ mMusicSlider->addActionListener(this);
+
+ mSoundCheckBox->setPosition(10, 10);
+ mSfxSlider->setDimension(gcn::Rectangle(10, 30, 100, 10));
+ mMusicSlider->setDimension(gcn::Rectangle(10, 50, 100, 10));
+ sfxLabel->setPosition(20 + mSfxSlider->getWidth(), 27);
+ musicLabel->setPosition(20 + mMusicSlider->getWidth(), 47);
+
+ mSoundCheckBox->setMarked(mSoundEnabled);
+ mSfxSlider->setValue(mSfxVolume);
+ mMusicSlider->setValue(mMusicVolume);
+
+ add(mSoundCheckBox);
+ add(mSfxSlider);
+ add(mMusicSlider);
+ add(sfxLabel);
+ add(musicLabel);
+}
+
+void Setup_Audio::apply()
+{
+ if (mSoundCheckBox->isMarked())
+ {
+ config.setValue("sound", 1);
+ try {
+ sound.init();
+ }
+ catch (const char *err)
+ {
+ new OkDialog("Sound Engine", err);
+ logger->log("Warning: %s", err);
+ }
+ }
+ else
+ {
+ config.setValue("sound", 0);
+ sound.close();
+ }
+
+ mSoundEnabled = config.getValue("sound", 0);
+ mSfxVolume = (int)config.getValue("sfxVolume", 100);
+ mMusicVolume = (int)config.getValue("musicVolume", 60);
+}
+
+void Setup_Audio::cancel()
+{
+ mSoundCheckBox->setMarked(mSoundEnabled);
+
+ sound.setSfxVolume(mSfxVolume);
+ mSfxSlider->setValue(mSfxVolume);
+
+ sound.setMusicVolume(mMusicVolume);
+ mMusicSlider->setValue(mMusicVolume);
+
+ config.setValue("sound", mSoundEnabled ? 1 : 0);
+ config.setValue("sfxVolume", mSfxVolume ? 1 : 0);
+ config.setValue("musicVolume", mMusicVolume);
+}
+
+void Setup_Audio::action(const std::string &event)
+{
+ if (event == "sfx")
+ {
+ config.setValue("sfxVolume", (int)mSfxSlider->getValue());
+ sound.setSfxVolume((int)mSfxSlider->getValue());
+ }
+ else if (event == "music")
+ {
+ config.setValue("musicVolume", (int)mMusicSlider->getValue());
+ sound.setMusicVolume((int)mMusicSlider->getValue());
+ }
+}
diff --git a/src/gui/setup_audio.h b/src/gui/setup_audio.h
new file mode 100644
index 00000000..e89ab093
--- /dev/null
+++ b/src/gui/setup_audio.h
@@ -0,0 +1,51 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_GUI_SETUP_AUDIO_H
+#define _TMW_GUI_SETUP_AUDIO_H
+
+#include "setuptab.h"
+
+#include <guichan/actionlistener.hpp>
+
+#include "../guichanfwd.h"
+
+class Setup_Audio : public SetupTab, public gcn::ActionListener
+{
+ public:
+ Setup_Audio();
+
+ void apply();
+ void cancel();
+
+ void action(const std::string&);
+
+ private:
+ gcn::CheckBox *mSoundCheckBox;
+ gcn::Slider *mSfxSlider, *mMusicSlider;
+
+ int mMusicVolume, mSfxVolume;
+ bool mSoundEnabled;
+};
+
+#endif
diff --git a/src/gui/setup_joystick.cpp b/src/gui/setup_joystick.cpp
new file mode 100644
index 00000000..fdf50980
--- /dev/null
+++ b/src/gui/setup_joystick.cpp
@@ -0,0 +1,62 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#include "setup_joystick.h"
+
+#include <guichan/widgets/label.hpp>
+
+#include "button.h"
+
+#include "../joystick.h"
+
+extern Joystick *joystick;
+
+Setup_Joystick::Setup_Joystick():
+ mCalibrateLabel(new gcn::Label("Press the button to start calibration")),
+ mCalibrateButton(new Button("Calibrate", "calibrate", this))
+{
+ setOpaque(false);
+
+ mCalibrateLabel->setPosition(5, 10);
+ mCalibrateButton->setPosition(10, 20 + mCalibrateLabel->getHeight());
+
+ add(mCalibrateLabel);
+ add(mCalibrateButton);
+}
+
+void Setup_Joystick::action(const std::string &event)
+{
+ if (!joystick) {
+ return;
+ }
+
+ if (joystick->isCalibrating()) {
+ mCalibrateButton->setCaption("Calibrate");
+ mCalibrateLabel->setCaption("Press the button to start calibration");
+ joystick->finishCalibration();
+ } else {
+ mCalibrateButton->setCaption("Stop");
+ mCalibrateLabel->setCaption("Rotate the stick");
+ joystick->startCalibration();
+ }
+}
diff --git a/src/gui/setup_joystick.h b/src/gui/setup_joystick.h
new file mode 100644
index 00000000..2abe9678
--- /dev/null
+++ b/src/gui/setup_joystick.h
@@ -0,0 +1,48 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_GUI_SETUP_JOYSTICK_H
+#define _TMW_GUI_SETUP_JOYSTICK_H
+
+#include "setuptab.h"
+
+#include <guichan/actionlistener.hpp>
+
+#include "../guichanfwd.h"
+
+class Setup_Joystick : public SetupTab, public gcn::ActionListener
+{
+ public:
+ Setup_Joystick();
+
+ void apply() {}
+ void cancel() {}
+
+ void action(const std::string&);
+
+ private:
+ gcn::Label *mCalibrateLabel;
+ gcn::Button *mCalibrateButton;
+};
+
+#endif
diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp
new file mode 100644
index 00000000..2c314342
--- /dev/null
+++ b/src/gui/setup_video.cpp
@@ -0,0 +1,226 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#include "setup_video.h"
+
+#include <string>
+#include <vector>
+#include <SDL.h>
+
+#include <guichan/listmodel.hpp>
+
+#include <guichan/widgets/label.hpp>
+
+#include "checkbox.h"
+#include "listbox.h"
+#include "ok_dialog.h"
+#include "scrollarea.h"
+#include "slider.h"
+
+#include "../configuration.h"
+#include "../graphics.h"
+#include "../log.h"
+
+#include "../utils/tostring.h"
+
+extern Graphics *graphics;
+
+/**
+ * The list model for mode list.
+ *
+ * \ingroup Interface
+ */
+class ModeListModel : public gcn::ListModel
+{
+ public:
+ /**
+ * Constructor.
+ */
+ ModeListModel();
+
+ /**
+ * Destructor.
+ */
+ virtual ~ModeListModel() { }
+
+ /**
+ * Returns the number of elements in container.
+ */
+ int getNumberOfElements() { return mVideoModes.size(); }
+
+ /**
+ * Returns element from container.
+ */
+ std::string getElementAt(int i) { return mVideoModes[i]; }
+
+ private:
+ std::vector<std::string> mVideoModes;
+};
+
+ModeListModel::ModeListModel()
+{
+ /* Get available fullscreen/hardware modes */
+ SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
+
+ /* Check which modes are available */
+ if (modes == (SDL_Rect **)0) {
+ logger->log("No modes available");
+ } else if (modes == (SDL_Rect **)-1) {
+ logger->log("All resolutions available");
+ } else {
+ //logger->log("Available Modes");
+ for (int i = 0; modes[i]; ++i) {
+ const std::string modeString =
+ toString((int)modes[i]->w) + "x" + toString((int)modes[i]->h);
+ //logger->log(modeString.c_str());
+ mVideoModes.push_back(modeString);
+ }
+ }
+}
+
+Setup_Video::Setup_Video():
+ mModeListModel(new ModeListModel()),
+ mModeList(new ListBox(mModeListModel)),
+ mFsCheckBox(new CheckBox("Full screen", false)),
+ mOpenGLCheckBox(new CheckBox("OpenGL", false)),
+ mCustomCursorCheckBox(new CheckBox("Custom cursor")),
+ mAlphaSlider(new Slider(0.2, 1.0)),
+ mFullScreenEnabled(config.getValue("screen", 0)),
+ mOpenGLEnabled(config.getValue("opengl", 0)),
+ mCustomCursorEnabled(config.getValue("customcursor", 1)),
+ mOpacity(config.getValue("guialpha", 0.8))
+{
+ setOpaque(false);
+
+ ScrollArea *scrollArea = new ScrollArea(mModeList);
+ gcn::Label *alphaLabel = new gcn::Label("Gui opacity");
+
+ mModeList->setEnabled(false);
+#ifndef USE_OPENGL
+ mOpenGLCheckBox->setEnabled(false);
+#endif
+
+ mModeList->setDimension(gcn::Rectangle(0, 0, 60, 50));
+ scrollArea->setDimension(gcn::Rectangle(10, 10, 90, 50));
+ mFsCheckBox->setPosition(110, 10);
+ mOpenGLCheckBox->setPosition(110, 30);
+ mCustomCursorCheckBox->setPosition(110, 50);
+ mAlphaSlider->setDimension(gcn::Rectangle(10, 80, 100, 10));
+ alphaLabel->setPosition(20 + mAlphaSlider->getWidth(), mAlphaSlider->getY());
+
+ mModeList->setSelected(-1);
+ mFsCheckBox->setMarked(mFullScreenEnabled);
+ mOpenGLCheckBox->setMarked(mOpenGLEnabled);
+ mCustomCursorCheckBox->setMarked(mCustomCursorEnabled);
+ mAlphaSlider->setValue(mOpacity);
+
+ mCustomCursorCheckBox->setEventId("customcursor");
+ mAlphaSlider->setEventId("guialpha");
+
+ mCustomCursorCheckBox->addActionListener(this);
+ mAlphaSlider->addActionListener(this);
+
+ add(scrollArea);
+ add(mFsCheckBox);
+ add(mOpenGLCheckBox);
+ add(mCustomCursorCheckBox);
+ add(mAlphaSlider);
+ add(alphaLabel);
+}
+
+Setup_Video::~Setup_Video()
+{
+ delete mModeListModel;
+}
+
+void Setup_Video::apply()
+{
+ // Full screen changes
+ bool fullscreen = mFsCheckBox->isMarked();
+ if (fullscreen != (config.getValue("screen", 0) == 1))
+ {
+ // checks for opengl usage
+ if (!(config.getValue("opengl", 0) == 1))
+ {
+ if (!graphics->setFullscreen(fullscreen))
+ {
+ fullscreen = !fullscreen;
+ if (!graphics->setFullscreen(fullscreen))
+ {
+ std::stringstream error;
+ error << "Failed to switch to " <<
+ (fullscreen ? "windowed" : "fullscreen") <<
+ "mode and restoration of old mode also failed!" <<
+ std::endl;
+ logger->error(error.str());
+ }
+ }
+ } else {
+ new OkDialog("Switching to FullScreen",
+ "Restart needed for changes to take effect.");
+ }
+ config.setValue("screen", fullscreen ? 1 : 0);
+ }
+
+ // OpenGL change
+ if (mOpenGLCheckBox->isMarked() != mOpenGLEnabled)
+ {
+ config.setValue("opengl", mOpenGLCheckBox->isMarked() ? 1 : 0);
+
+ // OpenGL can currently only be changed by restarting, notify user.
+ new OkDialog("Changing OpenGL",
+ "Applying change to OpenGL requires restart.");
+ }
+
+ // We sync old and new values at apply time
+ mFullScreenEnabled = config.getValue("screen", 0);
+ mCustomCursorEnabled = config.getValue("customcursor", 1);
+ mOpacity = config.getValue("guialpha", 0.8);
+ mOpenGLEnabled = config.getValue("opengl", 0);
+}
+
+void Setup_Video::cancel()
+{
+ mFsCheckBox->setMarked(mFullScreenEnabled);
+ mOpenGLCheckBox->setMarked(mOpenGLEnabled);
+ mCustomCursorCheckBox->setMarked(mCustomCursorEnabled);
+ mAlphaSlider->setValue(mOpacity);
+
+ config.setValue("screen", mFullScreenEnabled ? 1 : 0);
+ config.setValue("customcursor", mCustomCursorEnabled ? 1 : 0);
+ config.setValue("guialpha", mOpacity);
+ config.setValue("opengl", mOpenGLEnabled ? 1 : 0);
+}
+
+void Setup_Video::action(const std::string &event)
+{
+ if (event == "guialpha")
+ {
+ config.setValue("guialpha", mAlphaSlider->getValue());
+ }
+ else if (event == "customcursor")
+ {
+ config.setValue("customcursor",
+ mCustomCursorCheckBox->isMarked() ? 1 : 0);
+ }
+}
diff --git a/src/gui/setup_video.h b/src/gui/setup_video.h
new file mode 100644
index 00000000..4aa13fd3
--- /dev/null
+++ b/src/gui/setup_video.h
@@ -0,0 +1,59 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_GUI_SETUP_VIDEO_H
+#define _TMW_GUI_SETUP_VIDEO_H
+
+#include "setuptab.h"
+
+#include <guichan/actionlistener.hpp>
+
+#include "../guichanfwd.h"
+
+class Setup_Video : public SetupTab, public gcn::ActionListener
+{
+ public:
+ Setup_Video();
+ ~Setup_Video();
+
+ void apply();
+ void cancel();
+
+ void action(const std::string&);
+
+ private:
+ class ModeListModel *mModeListModel;
+
+ gcn::ListBox *mModeList;
+ gcn::CheckBox *mFsCheckBox;
+ gcn::CheckBox *mOpenGLCheckBox;
+ gcn::CheckBox *mCustomCursorCheckBox;
+ gcn::Slider *mAlphaSlider;
+
+ bool mFullScreenEnabled;
+ bool mOpenGLEnabled;
+ bool mCustomCursorEnabled;
+ double mOpacity;
+};
+
+#endif
diff --git a/src/gui/setuptab.h b/src/gui/setuptab.h
new file mode 100644
index 00000000..a7d45b9a
--- /dev/null
+++ b/src/gui/setuptab.h
@@ -0,0 +1,36 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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
+ * any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_GUI_SETUPTAB_H
+#define _TMW_GUI_SETUPTAB_H
+
+#include "gccontainer.h"
+
+class SetupTab : public GCContainer
+{
+ public:
+ virtual void apply() =0;
+ virtual void cancel() =0;
+};
+
+#endif