summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gui/widgets/container.cpp4
-rw-r--r--src/gui/widgets/container.h2
-rw-r--r--src/gui/widgets/setupitem.cpp6
-rw-r--r--src/gui/widgets/setupitem.h9
-rw-r--r--src/gui/widgets/tabs/setup_mods.cpp116
-rw-r--r--src/gui/widgets/tabs/setup_mods.h48
-rw-r--r--src/gui/widgets/tabs/setuptabscroll.cpp14
-rw-r--r--src/gui/widgets/tabs/setuptabscroll.h7
-rw-r--r--src/gui/windows/setup.cpp6
-rw-r--r--src/resources/db/moddb.cpp7
-rw-r--r--src/resources/db/moddb.h4
-rw-r--r--src/resources/modinfo.h1
14 files changed, 224 insertions, 4 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ba264569b..67943d365 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -343,6 +343,8 @@ SET(SRCS
gui/widgets/tabs/setup_colors.h
gui/widgets/tabs/setup_joystick.cpp
gui/widgets/tabs/setup_joystick.h
+ gui/widgets/tabs/setup_mods.cpp
+ gui/widgets/tabs/setup_mods.h
gui/widgets/tabs/setup_other.cpp
gui/widgets/tabs/setup_other.h
gui/widgets/tabs/setup_theme.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 6705fc94d..7d6abb875 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -478,6 +478,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
gui/widgets/tabs/setup_colors.h \
gui/widgets/tabs/setup_joystick.cpp \
gui/widgets/tabs/setup_joystick.h \
+ gui/widgets/tabs/setup_mods.cpp \
+ gui/widgets/tabs/setup_mods.h \
gui/widgets/tabs/setup_other.cpp \
gui/widgets/tabs/setup_other.h \
gui/widgets/tabs/setup_theme.cpp \
diff --git a/src/gui/widgets/container.cpp b/src/gui/widgets/container.cpp
index 4b0fc60f7..e37bd5103 100644
--- a/src/gui/widgets/container.cpp
+++ b/src/gui/widgets/container.cpp
@@ -35,7 +35,11 @@ Container::~Container()
{
if (gui)
gui->removeDragged(this);
+ removeControls();
+}
+void Container::removeControls()
+{
while (!mWidgets.empty())
delete mWidgets.front();
}
diff --git a/src/gui/widgets/container.h b/src/gui/widgets/container.h
index efcdb70a7..2983a7433 100644
--- a/src/gui/widgets/container.h
+++ b/src/gui/widgets/container.h
@@ -49,6 +49,8 @@ class Container : public gcn::Container,
virtual ~Container();
bool safeRemove(gcn::Widget *const widget);
+
+ void removeControls();
};
#endif // GUI_WIDGETS_CONTAINER_H
diff --git a/src/gui/widgets/setupitem.cpp b/src/gui/widgets/setupitem.cpp
index 09717bc8b..2cf35c144 100644
--- a/src/gui/widgets/setupitem.cpp
+++ b/src/gui/widgets/setupitem.cpp
@@ -105,6 +105,9 @@ Configuration *SetupItem::getConfig() const
void SetupItem::load()
{
+ if (mKeyName.empty())
+ return;
+
const Configuration *const cfg = getConfig();
if (mUseDefault)
{
@@ -135,6 +138,9 @@ void SetupItem::load()
void SetupItem::save() const
{
+ if (mKeyName.empty())
+ return;
+
Configuration *const cfg = getConfig();
cfg->setValue(mKeyName, mValue);
}
diff --git a/src/gui/widgets/setupitem.h b/src/gui/widgets/setupitem.h
index 561265729..d56efca8e 100644
--- a/src/gui/widgets/setupitem.h
+++ b/src/gui/widgets/setupitem.h
@@ -96,6 +96,15 @@ class SetupItem : public gcn::ActionListener,
void rereadValue();
+ void setValue(const std::string str)
+ { mValue = str; }
+
+ std::string getValue() const
+ { return mValue; }
+
+ std::string getEventName() const
+ { return mEventName; }
+
protected:
SetupItem(const std::string &restrict text,
const std::string &restrict description,
diff --git a/src/gui/widgets/tabs/setup_mods.cpp b/src/gui/widgets/tabs/setup_mods.cpp
new file mode 100644
index 000000000..6857b6700
--- /dev/null
+++ b/src/gui/widgets/tabs/setup_mods.cpp
@@ -0,0 +1,116 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 Andrei Karas
+ * Copyright (C) 2011-2014 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "gui/widgets/tabs/setup_mods.h"
+
+#include "configuration.h"
+#include "map.h"
+
+#include "gui/widgets/layouthelper.h"
+#include "gui/widgets/setupitem.h"
+#include "gui/widgets/scrollarea.h"
+
+#include "resources/db/moddb.h"
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+Setup_Mods::Setup_Mods(const Widget2 *const widget) :
+ SetupTabScroll(widget)
+{
+ // TRANSLATORS: mods tab in settings
+ setName(_("Mods"));
+
+ LayoutHelper h(this);
+ ContainerPlacer place = h.getPlacer(0, 0);
+ place(0, 0, mScroll, 10, 10);
+
+
+ setDimension(gcn::Rectangle(0, 0, 550, 350));
+}
+
+Setup_Mods::~Setup_Mods()
+{
+}
+
+void Setup_Mods::apply()
+{
+ SetupTabScroll::apply();
+ saveMods();
+}
+
+void Setup_Mods::externalUpdated()
+{
+ clear();
+ loadMods();
+}
+
+void Setup_Mods::loadMods()
+{
+ std::string modsString = serverConfig.getValue("mods", "");
+ std::set<std::string> modsList;
+ splitToStringSet(modsList, modsString, '|');
+
+ const ModInfos &mods = ModDB::getAll();
+ FOR_EACH (ModInfoCIterator, it, mods)
+ {
+ const ModInfo *const info = (*it).second;
+ if (!info)
+ continue;
+
+ std::string name = info->getName();
+ replaceAll(name, "|", "");
+ SetupItem *const item = new SetupItemCheckBox(
+ info->getDescription(), "", "", this, name);
+ if (modsList.find(name) != modsList.end())
+ item->setValue("1");
+ else
+ item->setValue("0");
+ item->toWidget();
+ }
+}
+
+void Setup_Mods::saveMods()
+{
+ const ModInfos &mods = ModDB::getAll();
+ if (mods.empty())
+ return;
+
+ std::string modsString;
+ const std::set<SetupItem*> &modsList = getAllItems();
+ FOR_EACH (std::set<SetupItem*>::const_iterator, it, modsList)
+ {
+ const SetupItem *const item = *it;
+ if (!item)
+ continue;
+ const std::string val = item->getValue();
+ if (val == "1")
+ {
+ const std::string key = item->getEventName();
+ if (!modsString.empty())
+ modsString.append("|");
+ modsString.append(key);
+ }
+ }
+ serverConfig.setValue("mods", modsString);
+}
diff --git a/src/gui/widgets/tabs/setup_mods.h b/src/gui/widgets/tabs/setup_mods.h
new file mode 100644
index 000000000..5c837811a
--- /dev/null
+++ b/src/gui/widgets/tabs/setup_mods.h
@@ -0,0 +1,48 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 Andrei Karas
+ * Copyright (C) 2011-2014 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GUI_WIDGETS_TABS_SETUP_MODS_H
+#define GUI_WIDGETS_TABS_SETUP_MODS_H
+
+#include "gui/widgets/tabs/setuptabscroll.h"
+
+class Setup_Mods final : public SetupTabScroll
+{
+ public:
+ explicit Setup_Mods(const Widget2 *const widget);
+
+ A_DELETE_COPY(Setup_Mods)
+
+ ~Setup_Mods();
+
+ void apply() override final;
+
+ void externalUpdated() override final;
+
+ void loadMods();
+
+ void saveMods();
+
+ protected:
+};
+
+#endif // GUI_WIDGETS_TABS_SETUP_MODS_H
diff --git a/src/gui/widgets/tabs/setuptabscroll.cpp b/src/gui/widgets/tabs/setuptabscroll.cpp
index f01d691b6..81c191dd6 100644
--- a/src/gui/widgets/tabs/setuptabscroll.cpp
+++ b/src/gui/widgets/tabs/setuptabscroll.cpp
@@ -45,6 +45,11 @@ SetupTabScroll::~SetupTabScroll()
delete mContainer;
mContainer = nullptr;
+ removeItems();
+}
+
+void SetupTabScroll::removeItems()
+{
std::set<SetupItem*>::iterator it = mAllItems.begin();
const std::set<SetupItem*>::iterator it_end = mAllItems.end();
while (it != it_end)
@@ -53,6 +58,15 @@ SetupTabScroll::~SetupTabScroll()
++ it;
}
mAllItems.clear();
+
+ mItems.clear();
+}
+
+void SetupTabScroll::clear()
+{
+ removeItems();
+ mContainer->removeControls();
+ mContainer->clear();
}
void SetupTabScroll::addControl(SetupItem *const widget)
diff --git a/src/gui/widgets/tabs/setuptabscroll.h b/src/gui/widgets/tabs/setuptabscroll.h
index 578fba861..15b493d88 100644
--- a/src/gui/widgets/tabs/setuptabscroll.h
+++ b/src/gui/widgets/tabs/setuptabscroll.h
@@ -65,7 +65,14 @@ class SetupTabScroll : public SetupTab
void reread(const std::string &name);
+ void clear();
+
+ const std::set<SetupItem*> &getAllItems() const
+ { return mAllItems; }
+
protected:
+ void removeItems();
+
VertContainer *mContainer;
ScrollArea *mScroll;
std::map<std::string, SetupItem*> mItems;
diff --git a/src/gui/windows/setup.cpp b/src/gui/windows/setup.cpp
index 995e6beac..cd6e62882 100644
--- a/src/gui/windows/setup.cpp
+++ b/src/gui/windows/setup.cpp
@@ -32,13 +32,14 @@
#include "gui/widgets/tabs/setup_audio.h"
#include "gui/widgets/tabs/setup_chat.h"
#include "gui/widgets/tabs/setup_colors.h"
+#include "gui/widgets/tabs/setup_input.h"
#include "gui/widgets/tabs/setup_joystick.h"
+#include "gui/widgets/tabs/setup_mods.h"
#include "gui/widgets/tabs/setup_other.h"
-#include "gui/widgets/tabs/setup_theme.h"
-#include "gui/widgets/tabs/setup_input.h"
#include "gui/widgets/tabs/setup_perfomance.h"
#include "gui/widgets/tabs/setup_players.h"
#include "gui/widgets/tabs/setup_relations.h"
+#include "gui/widgets/tabs/setup_theme.h"
#include "gui/widgets/tabs/setup_touch.h"
#include "gui/widgets/tabs/setup_video.h"
#include "gui/widgets/tabs/setup_visual.h"
@@ -124,6 +125,7 @@ void Setup::postInit()
mTabs.push_back(new Setup_Players(this));
mTabs.push_back(new Setup_Relations(this));
mTabs.push_back(new Setup_Theme(this));
+ mTabs.push_back(new Setup_Mods(this));
mTabs.push_back(new Setup_Other(this));
FOR_EACH (std::list<SetupTab*>::const_iterator, i, mTabs)
diff --git a/src/resources/db/moddb.cpp b/src/resources/db/moddb.cpp
index f66a6dc48..aa785afdb 100644
--- a/src/resources/db/moddb.cpp
+++ b/src/resources/db/moddb.cpp
@@ -26,7 +26,6 @@
#include "logger.h"
#include "resources/beingcommon.h"
-#include "resources/modinfo.h"
#include "utils/dtor.h"
#include "utils/gettext.h"
@@ -58,7 +57,6 @@ void ModDB::loadXmlFile(const std::string &fileName)
{
logger->log("Mods Database: Error while loading %s!",
fileName.c_str());
- mLoaded = true;
return;
}
@@ -109,3 +107,8 @@ ModInfo *ModDB::get(const std::string &name)
else
return i->second;
}
+
+const ModInfos &ModDB::getAll()
+{
+ return mModInfos;
+}
diff --git a/src/resources/db/moddb.h b/src/resources/db/moddb.h
index b0944e574..b09c47747 100644
--- a/src/resources/db/moddb.h
+++ b/src/resources/db/moddb.h
@@ -23,6 +23,8 @@
#ifndef RESOURCES_DB_MODDB_H
#define RESOURCES_DB_MODDB_H
+#include "resources/modinfo.h"
+
#include <string>
#include "localconsts.h"
@@ -38,6 +40,8 @@ namespace ModDB
ModInfo *get(const std::string &name) A_WARN_UNUSED;
void loadXmlFile(const std::string &fileName);
+
+ const ModInfos &getAll();
}
#endif // RESOURCES_DB_MODDB_H
diff --git a/src/resources/modinfo.h b/src/resources/modinfo.h
index b8e52f027..e2acf31cd 100644
--- a/src/resources/modinfo.h
+++ b/src/resources/modinfo.h
@@ -59,5 +59,6 @@ class ModInfo final
typedef std::map<std::string, ModInfo*> ModInfos;
typedef ModInfos::iterator ModInfoIterator;
+typedef ModInfos::const_iterator ModInfoCIterator;
#endif // RESOURCES_MODINFO_H