From b3ad7da111d1a21f14de39d84be97104a9666017 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 9 Jan 2014 13:12:18 +0300 Subject: add mods tab in settings. --- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/gui/widgets/container.cpp | 4 ++ src/gui/widgets/container.h | 2 + src/gui/widgets/setupitem.cpp | 6 ++ src/gui/widgets/setupitem.h | 9 +++ src/gui/widgets/tabs/setup_mods.cpp | 116 ++++++++++++++++++++++++++++++++ src/gui/widgets/tabs/setup_mods.h | 48 +++++++++++++ src/gui/widgets/tabs/setuptabscroll.cpp | 14 ++++ src/gui/widgets/tabs/setuptabscroll.h | 7 ++ src/gui/windows/setup.cpp | 6 +- src/resources/db/moddb.cpp | 7 +- src/resources/db/moddb.h | 4 ++ src/resources/modinfo.h | 1 + 14 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 src/gui/widgets/tabs/setup_mods.cpp create mode 100644 src/gui/widgets/tabs/setup_mods.h 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 . + */ + +#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 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 &modsList = getAllItems(); + FOR_EACH (std::set::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 . + */ + +#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::iterator it = mAllItems.begin(); const std::set::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 &getAllItems() const + { return mAllItems; } + protected: + void removeItems(); + VertContainer *mContainer; ScrollArea *mScroll; std::map 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::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 #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 ModInfos; typedef ModInfos::iterator ModInfoIterator; +typedef ModInfos::const_iterator ModInfoCIterator; #endif // RESOURCES_MODINFO_H -- cgit v1.2.3-70-g09d2