summaryrefslogtreecommitdiff
path: root/src/gui/setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/setup.cpp')
-rw-r--r--src/gui/setup.cpp343
1 files changed, 26 insertions, 317 deletions
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();