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 +++++------------------------------------------------- 1 file changed, 26 insertions(+), 317 deletions(-) (limited to 'src/gui/setup.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 - -#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(); -- cgit v1.2.3-70-g09d2