/* * Copyright (C) 2002,2003,2004,2005,2006 Daniel Heck * * 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 "gui/OptionsMenu.hh" #include "ecl.hh" #include "enigma.hh" #include "lev/ScoreManager.hh" #include "LocalToXML.hh" #include "main.hh" #include "nls.hh" #include "options.hh" #include "oxyd.hh" #include "sound.hh" #include "Utf8ToXML.hh" #include "video.hh" #include "XMLtoLocal.hh" #include "XMLtoUtf8.hh" #include using namespace ecl; using namespace std; namespace enigma { namespace gui { /* -------------------- Buttons for Options -------------------- */ class MouseSpeedButton : public ValueButton { int get_value() const { return ecl::round_nearest(options::GetMouseSpeed()); } void set_value(int value) { options::SetMouseSpeed (value); } string get_text(int value) const { return strf("%d", value); } public: MouseSpeedButton() : ValueButton(options::MIN_MouseSpeed, options::MAX_MouseSpeed) { init(); } }; class SoundVolumeButton : public ValueButton { int get_value() const { return round_nearest(options::GetDouble("SoundVolume")*10.0); } void set_value(int value) { options::SetOption("SoundVolume", value/10.0); options::UpdateVolume(); } string get_text(int value) const { if (value == 0) { return _("muted"); } else { return strf("%d", value); } } public: SoundVolumeButton() : ValueButton(0, 10) { init(); } }; class MusicVolumeButton : public ValueButton { int get_value() const { return round_nearest (options::GetDouble("MusicVolume")*10.0); } void set_value(int value) { options::SetOption("MusicVolume", value/10.0); options::UpdateVolume(); } string get_text(int value) const { if (value == 0) return _("muted"); else return strf("%d", value); } public: MusicVolumeButton() : ValueButton(0, 10) { init(); } }; class InGameMusicButton : public BoolOptionButton { void on_action(Widget *) { if (toggle()) sound::PlayMusic (options::GetString("LevelMusicFile")); else sound::StopMusic (options::GetString("LevelMusicFile")); } public: InGameMusicButton() : BoolOptionButton("InGameMusic", N_("Music in game"), N_("No music in game"), this) { } }; struct SkipSolvedButton : public BoolOptionButton { SkipSolvedButton() : BoolOptionButton("SkipSolvedLevels", N_("Yes"), N_("No"), this) {} }; struct TimeHuntButton : public BoolOptionButton { TimeHuntButton() : BoolOptionButton("TimeHunting", N_("Yes"), N_("No"), this) {} }; struct RatingsUpdateButton : public BoolOptionButton { RatingsUpdateButton() : BoolOptionButton("RatingsAutoUpdate", N_("Auto"), N_("Never"), this) {} }; class VideoModeButton : public TextButton { video::VideoModes get_mode() const { int mode = Clamp(options::GetInt("VideoMode"), 0, int(video::VM_COUNT)); return static_cast(mode); } string get_text() const { return GetInfo(get_mode())->name; } void on_action(Widget *) { int mode = get_mode(); // cycle at most once through all available video modes do { mode += 1; if (mode >= video::VM_COUNT) mode = 0; const video::VMInfo *vminfo = GetInfo (static_cast(mode)); if (vminfo->available) { options::SetOption("VideoMode", mode); invalidate(); break; } } while (mode != get_mode()); } public: VideoModeButton() : TextButton(this) { } }; /* -------------------- SoundSetButton -------------------- */ SoundSetButton::SoundSetButton() : ValueButton(0, 1) { int numAvail = sound::GetOptionSoundSetCount(); setMaxValue(numAvail - 1); init(); } int SoundSetButton::get_value() const { return sound::GetOptionSoundSet(); } void SoundSetButton::set_value(int value) { sound::SetOptionSoundSet(value); } string SoundSetButton::get_text(int value) const { return _(sound::GetOptionSoundSetText(value).c_str()); } /* -------------------- StereoButton -------------------- */ StereoButton::StereoButton() : ValueButton(-1, 1) { init(); } int StereoButton::get_value() const { double separation = options::GetDouble("StereoSeparation"); if (separation == 0) return 0; else return (separation > 0) ? 1 : -1; } void StereoButton::set_value(int value) { if (value == 0) options::SetOption("StereoSeparation", 0.0); else if (value > 0) options::SetOption("StereoSeparation", 10.0); else options::SetOption("StereoSeparation", -10.0); } string StereoButton::get_text(int value) const { switch (value) { case -1: return _("reversed"); case 0: return _("mono"); case 1: return _("normal"); } assert(0); return string(); } /* -------------------- FullscreenButton -------------------- */ FullscreenButton::FullscreenButton() : BoolOptionButton("FullScreen", N_("Yes"), N_("No"), this) { } /* -------------------- LanguageButton -------------------- */ struct Language { const char *name; const char *localename; }; Language languages[] = { { "default", "" }, { "Deutsch", "de_DE" }, { "English", "en_EN" }, { "Español", "es_ES" }, { "Français", "fr_FR" }, { "Italiano", "it_IT" }, { "Nederlands", "nl_NL" }, { "Svenska", "sv_SE" }, { "Русский", "ru_RU" }, { "Magyar", "hu_HU" }, { "Português", "pt_BR" }, { "Suomi", "fi_FI" }, }; int LanguageButton::get_value() const { string localename; // = ecl::DefaultMessageLocale (); options::GetOption ("Language", localename); int lang = 0; // unknown language for (size_t i=0; ion_action(this); } } string LanguageButton::get_text(int value) const { if (value == -1) return _("unknown"); else return languages[value].name; } LanguageButton::LanguageButton (ActionListener *al) : ValueButton(0, NUMENTRIES(languages)-1), myListener(al) { inInit = true; init(); inInit = false; } /* -------------------- GammaButton -------------------- */ GammaButton::GammaButton() : ValueButton(1, 10) { init(); } void GammaButton::set_value(int value) { double gamma = double(value) / 5.0; options::SetOption ("Gamma", gamma); video::UpdateGamma(); } int GammaButton::get_value() const { double gamma = options::GetDouble ("Gamma"); int value = round_down(gamma * 5.0); return value; } string GammaButton::get_text(int value) const { return ecl::strf ("%d", value-5); } /* -------------------- Options Menu -------------------- */ OptionsMenu::OptionsMenu(ecl::Surface *background_) : back(new StaticTextButton(N_("Back"), this)), m_restartinfo (new Label("")), background(background_), previous_caption(video::GetCaption()) { const int spacing = 10; const int label_width = 180; const int but_width = 100; const int but_height = 70; const video::VMInfo *vminfo = video::GetInfo(); int hmargin = vminfo->width < 660 ? 10 : (vminfo->width < 900 ? 20 : 80); int midspacing = vminfo->width - 2*hmargin - 2*but_width - 2*label_width; BuildVList leftlabels (this, Rect(-label_width, 0, label_width, but_height), spacing); // BuildVList left (this, Rect(0, 0, but_width, but_height), spacing); BuildVList rightlabels (this, Rect(but_width+midspacing, 0, label_width, but_height), spacing); // BuildVList right(this, Rect(but_width+midspacing+label_width, 0, but_width, but_height), spacing); leftlabels.add (new Label(N_("Tilt sensitivity: "),HALIGN_CENTER,VALIGN_BOTTOM)); leftlabels.add (new MouseSpeedButton); leftlabels.add (new Label(N_("Ratings update: "),HALIGN_CENTER,VALIGN_BOTTOM)); leftlabels.add (new RatingsUpdateButton); rightlabels.add (new Label(N_("Sound volume: "),HALIGN_CENTER,VALIGN_BOTTOM)); rightlabels.add (new SoundVolumeButton); rightlabels.add (new Label(N_("Music volume: "),HALIGN_CENTER,VALIGN_BOTTOM)); rightlabels.add (new MusicVolumeButton); Rect l = leftlabels.pos(); Rect r = rightlabels.pos(); l.x = (l.x+r.x)/2; l.y = 380; add(back, l); } OptionsMenu::~OptionsMenu() { video::SetCaption(previous_caption.c_str()); } void OptionsMenu::quit() { Menu::quit(); } bool OptionsMenu::on_event (const SDL_Event &e) { bool handled=false; if (e.type == SDL_MOUSEBUTTONDOWN && e.button.button == SDL_BUTTON_RIGHT) { quit(); handled = true; } return handled; } void OptionsMenu::on_action(Widget *w) { if (w == back) quit(); } void OptionsMenu::tick (double) { } void OptionsMenu::draw_background(ecl::GC &gc) { video::SetCaption(("Enigma - Options Menu")); blit(gc, 0,0, background); } /* -------------------- Functions -------------------- */ void ShowOptionsMenu(Surface *background) { if (background == 0) background = enigma::GetImage("menu_bg", ".jpg"); OptionsMenu m(background); m.center(); m.manage(); } }} // namespace enigma::gui