/* * The Mana Client * Copyright (C) 2004-2009 The Mana World Development Team * Copyright (C) 2009-2012 The Mana Developers * * This file is part of The Mana Client. * * 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 * 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, see . */ #include "gui/setup_interface.h" #include "configuration.h" #include "gui/okdialog.h" #include "gui/widgets/checkbox.h" #include "gui/widgets/dropdown.h" #include "gui/widgets/label.h" #include "gui/widgets/layout.h" #include "gui/widgets/slider.h" #include "gui/widgets/spacer.h" #include "resources/theme.h" #include "utils/gettext.h" #include #include #include #include #include class ThemesListModel : public gcn::ListModel { public: int getNumberOfElements() override { return gui->getAvailableThemes().size(); } std::string getElementAt(int i) override { return gui->getAvailableThemes().at(i).getName(); } static int getThemeIndex(const std::string &path) { auto &themes = gui->getAvailableThemes(); auto themeIt = std::find_if(themes.begin(), themes.end(), [&](const ThemeInfo &theme) { return theme.getPath() == path; }); return themeIt != themes.end() ? std::distance(themes.begin(), themeIt) : 0; } }; const char *SIZE_NAME[4] = { N_("Tiny"), N_("Small"), N_("Medium"), N_("Large"), }; class FontSizeChoiceListModel : public gcn::ListModel { public: int getNumberOfElements() override { return 4; } std::string getElementAt(int i) override { if (i >= getNumberOfElements()) return _("???"); return SIZE_NAME[i]; } }; static const char *speechModeToString(Being::Speech mode) { switch (mode) { case Being::NO_SPEECH: return _("No text"); case Being::TEXT_OVERHEAD: return _("Text"); case Being::NO_NAME_IN_BUBBLE: return _("Bubbles, no names"); case Being::NAME_IN_BUBBLE: return _("Bubbles with names"); } return ""; } Setup_Interface::Setup_Interface(): mShowMonsterDamageEnabled(config.showMonstersTakedDamage), mVisibleNamesEnabled(config.visibleNames), mNameEnabled(config.showOwnName), mNPCLogEnabled(config.logNpcInGui), mPickupChatEnabled(config.showPickupChat), mPickupParticleEnabled(config.showPickupParticle), mOpacity(config.guiAlpha), mSpeechMode(config.speech), mVisibleNamesCheckBox(new CheckBox(_("Visible names"), mVisibleNamesEnabled)), mNameCheckBox(new CheckBox(_("Show own name"), mNameEnabled)), mNPCLogCheckBox(new CheckBox(_("Log NPC dialogue"), mNPCLogEnabled)), mPickupNotifyLabel(new Label(_("Show pickup notification:"))), // TRANSLATORS: Refers to "Show pickup notification" mPickupChatCheckBox(new CheckBox(_("in chat"), mPickupChatEnabled)), // TRANSLATORS: Refers to "Show pickup notification" mPickupParticleCheckBox(new CheckBox(_("as particle"), mPickupParticleEnabled)), mSpeechSlider(new Slider(0, 3)), mSpeechLabel(new Label(std::string())), mAlphaSlider(new Slider(0.2, 1.0)) { setName(_("Interface")); // Create widgets auto *space = new Spacer(0,10); mShowMonsterDamageCheckBox = new CheckBox(_("Show damage"), mShowMonsterDamageEnabled); gcn::Label *speechLabel = new Label(_("Overhead text:")); gcn::Label *alphaLabel = new Label(_("GUI opacity")); gcn::Label *themeLabel = new Label(_("Theme:")); gcn::Label *fontSizeLabel = new Label(_("Font size:")); mThemesListModel = std::make_unique(); mThemeDropDown = new DropDown(mThemesListModel.get()); mFontSizeListModel = std::make_unique(); mFontSizeDropDown = new DropDown(mFontSizeListModel.get()); mAlphaSlider->setValue(mOpacity); mAlphaSlider->setWidth(90); mAlphaSlider->setEnabled(!config.disableTransparency); // Set actions mShowMonsterDamageCheckBox->setActionEventId("monsterdamage"); mVisibleNamesCheckBox->setActionEventId("visiblenames"); mPickupChatCheckBox->setActionEventId("pickupchat"); mPickupParticleCheckBox->setActionEventId("pickupparticle"); mNameCheckBox->setActionEventId("showownname"); mNPCLogCheckBox->setActionEventId("lognpc"); mThemeDropDown->setActionEventId("theme"); mAlphaSlider->setActionEventId("guialpha"); mSpeechSlider->setActionEventId("speech"); // Set Listeners mShowMonsterDamageCheckBox->addActionListener(this); mVisibleNamesCheckBox->addActionListener(this); mPickupChatCheckBox->addActionListener(this); mPickupParticleCheckBox->addActionListener(this); mNameCheckBox->addActionListener(this); mNPCLogCheckBox->addActionListener(this); mThemeDropDown->addActionListener(this); mAlphaSlider->addActionListener(this); mSpeechSlider->addActionListener(this); mSpeechLabel->setCaption(speechModeToString(mSpeechMode)); mSpeechSlider->setValue(mSpeechMode); mThemeDropDown->setSelected(ThemesListModel::getThemeIndex(config.theme)); mFontSizeDropDown->setSelected(config.fontSize - 10); mFontSizeDropDown->adjustHeight(); // Do the layout place(0, 0, mVisibleNamesCheckBox, 3); place(3, 0, mNameCheckBox, 3); place(0, 1, mShowMonsterDamageCheckBox, 3); place(3, 1, mNPCLogCheckBox, 3); place(0, 2, space, 1, 1); place(0, 3, mPickupNotifyLabel, 6); place(0, 4, mPickupChatCheckBox, 3); place(3, 4, mPickupParticleCheckBox, 3); place(0, 5, space, 1, 1); place(0, 6, themeLabel, 2); place(2, 6, mThemeDropDown, 2).setPadding(2); place(0, 7, fontSizeLabel, 2); place(2, 7, mFontSizeDropDown, 2).setPadding(2); place(0, 8, space, 1, 1); place(0, 9, mAlphaSlider, 2); place(2, 9, alphaLabel, 2); place(0, 10, mSpeechSlider, 2); place(2, 10, speechLabel, 2); place(4, 10, mSpeechLabel, 2).setPadding(2); } Setup_Interface::~Setup_Interface() = default; void Setup_Interface::apply() { auto &theme = gui->getAvailableThemes().at(mThemeDropDown->getSelected()); auto fontSize = mFontSizeDropDown->getSelected() + 10; if (config.theme != theme.getPath() || config.fontSize != fontSize) { new OkDialog(_("Changing Theme or Font Size"), _("Theme and font size changes will apply after restart.")); } config.theme = theme.getPath(); config.fontSize = fontSize; mShowMonsterDamageEnabled = config.showMonstersTakedDamage; mVisibleNamesEnabled = config.visibleNames; mNameEnabled = config.showOwnName; mNPCLogEnabled = config.logNpcInGui; mSpeechMode = config.speech; mOpacity = config.guiAlpha; mPickupChatEnabled = config.showPickupChat; mPickupParticleEnabled = config.showPickupParticle; } void Setup_Interface::cancel() { mShowMonsterDamageCheckBox->setSelected(mShowMonsterDamageEnabled); mVisibleNamesCheckBox->setSelected(mVisibleNamesEnabled); mSpeechSlider->setValue(mSpeechMode); mNameCheckBox->setSelected(mNameEnabled); mNPCLogCheckBox->setSelected(mNPCLogEnabled); mThemeDropDown->setSelected(ThemesListModel::getThemeIndex(config.theme)); mFontSizeDropDown->setSelected(config.fontSize - 10); mAlphaSlider->setValue(mOpacity); //mAlphaSlider->setEnabled(!mSDLTransparencyDisabled); config.showMonstersTakedDamage = mShowMonsterDamageEnabled; setConfigValue(&Config::visibleNames, mVisibleNamesEnabled); config.speech = mSpeechMode; setConfigValue(&Config::showOwnName, mNameEnabled); config.logNpcInGui = mNPCLogEnabled; setConfigValue(&Config::guiAlpha, mOpacity); config.showPickupChat = mPickupChatEnabled; config.showPickupParticle = mPickupParticleEnabled; } void Setup_Interface::action(const gcn::ActionEvent &event) { const std::string &id = event.getId(); if (id == "guialpha") { setConfigValue(&Config::guiAlpha, mAlphaSlider->getValue()); } else if (id == "monsterdamage") { config.showMonstersTakedDamage = mShowMonsterDamageCheckBox->isSelected(); } else if (id == "visiblenames") { setConfigValue(&Config::visibleNames, mVisibleNamesCheckBox->isSelected()); } else if (id == "pickupchat") { config.showPickupChat = mPickupChatCheckBox->isSelected(); } else if (id == "pickupparticle") { config.showPickupParticle = mPickupParticleCheckBox->isSelected(); } else if (id == "speech") { auto val = (Being::Speech)mSpeechSlider->getValue(); mSpeechLabel->setCaption(speechModeToString(val)); mSpeechSlider->setValue(val); config.speech = val; } else if (id == "showownname") { setConfigValue(&Config::showOwnName, mNameCheckBox->isSelected()); } else if (id == "lognpc") { config.logNpcInGui = mNPCLogCheckBox->isSelected(); } }