From 59399a274c694e9dc467149828b57f47794eeaeb Mon Sep 17 00:00:00 2001 From: Björn Steinbrink Date: Sun, 19 Mar 2006 00:48:10 +0000 Subject: 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". --- src/gui/setup.cpp | 343 ++++----------------------------------------- src/gui/setup.h | 26 +--- src/gui/setup_audio.cpp | 124 ++++++++++++++++ src/gui/setup_audio.h | 51 +++++++ src/gui/setup_joystick.cpp | 62 ++++++++ src/gui/setup_joystick.h | 48 +++++++ src/gui/setup_video.cpp | 226 +++++++++++++++++++++++++++++ src/gui/setup_video.h | 59 ++++++++ src/gui/setuptab.h | 36 +++++ 9 files changed, 635 insertions(+), 340 deletions(-) create mode 100644 src/gui/setup_audio.cpp create mode 100644 src/gui/setup_audio.h create mode 100644 src/gui/setup_joystick.cpp create mode 100644 src/gui/setup_joystick.h create mode 100644 src/gui/setup_video.cpp create mode 100644 src/gui/setup_video.h create mode 100644 src/gui/setuptab.h (limited to 'src/gui') 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 - -#include -#include - #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 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 +#include #include -#include #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 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 + +#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 + +#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 + +#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 + +#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 +#include +#include + +#include + +#include + +#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 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 + +#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 -- cgit v1.2.3-70-g09d2