summaryrefslogtreecommitdiff
path: root/src/gui/setup_interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/setup_interface.cpp')
-rw-r--r--src/gui/setup_interface.cpp92
1 files changed, 69 insertions, 23 deletions
diff --git a/src/gui/setup_interface.cpp b/src/gui/setup_interface.cpp
index 7eef974c..ce77d3e6 100644
--- a/src/gui/setup_interface.cpp
+++ b/src/gui/setup_interface.cpp
@@ -23,12 +23,15 @@
#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 "gui/widgets/dropdown.h"
+
+#include "resources/theme.h"
#include "utils/gettext.h"
@@ -37,8 +40,35 @@
#include <SDL.h>
+#include <algorithm>
#include <string>
+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"),
@@ -97,8 +127,7 @@ Setup_Interface::Setup_Interface():
mPickupParticleEnabled)),
mSpeechSlider(new Slider(0, 3)),
mSpeechLabel(new Label(std::string())),
- mAlphaSlider(new Slider(0.2, 1.0)),
- mFontSize(config.fontSize)
+ mAlphaSlider(new Slider(0.2, 1.0))
{
setName(_("Interface"));
@@ -108,18 +137,21 @@ Setup_Interface::Setup_Interface():
mShowMonsterDamageCheckBox = new CheckBox(_("Show damage"),
mShowMonsterDamageEnabled);
- speechLabel = new Label(_("Overhead text:"));
- alphaLabel = new Label(_("GUI opacity"));
- fontSizeLabel = new Label(_("Font size:"));
+ 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<ThemesListModel>();
+ mThemeDropDown = new DropDown(mThemesListModel.get());
- mFontSizeListModel = new FontSizeChoiceListModel;
- mFontSizeDropDown = new DropDown(mFontSizeListModel);
+ mFontSizeListModel = std::make_unique<FontSizeChoiceListModel>();
+ mFontSizeDropDown = new DropDown(mFontSizeListModel.get());
mAlphaSlider->setValue(mOpacity);
mAlphaSlider->setWidth(90);
mAlphaSlider->setEnabled(!config.disableTransparency);
-
// Set actions
mShowMonsterDamageCheckBox->setActionEventId("monsterdamage");
mVisibleNamesCheckBox->setActionEventId("visiblenames");
@@ -127,6 +159,7 @@ Setup_Interface::Setup_Interface():
mPickupParticleCheckBox->setActionEventId("pickupparticle");
mNameCheckBox->setActionEventId("showownname");
mNPCLogCheckBox->setActionEventId("lognpc");
+ mThemeDropDown->setActionEventId("theme");
mAlphaSlider->setActionEventId("guialpha");
mSpeechSlider->setActionEventId("speech");
@@ -137,13 +170,16 @@ Setup_Interface::Setup_Interface():
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);
- mFontSizeDropDown->setSelected(mFontSize - 10);
+ mThemeDropDown->setSelected(ThemesListModel::getThemeIndex(config.theme));
+
+ mFontSizeDropDown->setSelected(config.fontSize - 10);
mFontSizeDropDown->adjustHeight();
// Do the layout
@@ -162,27 +198,35 @@ Setup_Interface::Setup_Interface():
place(0, 5, space, 1, 1);
- place(0, 6, fontSizeLabel, 2);
- place(2, 6, mFontSizeDropDown, 2);
+ place(0, 6, themeLabel, 2);
+ place(2, 6, mThemeDropDown, 2).setPadding(2);
- place(0, 7, space, 1, 1);
+ place(0, 7, fontSizeLabel, 2);
+ place(2, 7, mFontSizeDropDown, 2).setPadding(2);
- place(0, 8, mAlphaSlider, 2);
- place(2, 8, alphaLabel, 2);
+ place(0, 8, space, 1, 1);
- place(0, 9, mSpeechSlider, 2);
- place(2, 9, speechLabel, 2);
- place(4, 9, mSpeechLabel, 2).setPadding(2);
-}
+ place(0, 9, mAlphaSlider, 2);
+ place(2, 9, alphaLabel, 2);
-Setup_Interface::~Setup_Interface()
-{
- delete mFontSizeListModel;
+ 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()
{
- config.fontSize = mFontSizeDropDown->getSelected() + 10;
+ 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;
@@ -201,6 +245,8 @@ void Setup_Interface::cancel()
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);