diff options
author | Andrei Karas <akaras@inbox.ru> | 2018-02-13 01:54:28 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2018-02-13 04:28:32 +0300 |
commit | acba95ebb0119e7b0f9ef01d9bf3577582857253 (patch) | |
tree | b5346c2a5642456e793b28487020cf1c727d8f07 /src/gui | |
parent | 0a47f5c44ddd5fb5157d116ffe0f5ee5f4207eb0 (diff) | |
download | manaplus-acba95ebb0119e7b0f9ef01d9bf3577582857253.tar.gz manaplus-acba95ebb0119e7b0f9ef01d9bf3577582857253.tar.bz2 manaplus-acba95ebb0119e7b0f9ef01d9bf3577582857253.tar.xz manaplus-acba95ebb0119e7b0f9ef01d9bf3577582857253.zip |
Add clan window.
For now can be opened only by chat command /clan.
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/widgets/layoutcell.h | 6 | ||||
-rw-r--r-- | src/gui/widgets/tabs/clanwindowtabs.cpp | 162 | ||||
-rw-r--r-- | src/gui/widgets/tabs/clanwindowtabs.h | 83 | ||||
-rw-r--r-- | src/gui/windows/clanwindow.cpp | 163 | ||||
-rw-r--r-- | src/gui/windows/clanwindow.h | 77 |
5 files changed, 491 insertions, 0 deletions
diff --git a/src/gui/widgets/layoutcell.h b/src/gui/widgets/layoutcell.h index 3067d9677..3a28fd30c 100644 --- a/src/gui/widgets/layoutcell.h +++ b/src/gui/widgets/layoutcell.h @@ -59,6 +59,12 @@ class LayoutCell notfinal LayoutCell &setPadding(int p) { mHPadding = p; mVPadding = p; return *this; } + int getVPadding() const + { return mVPadding; } + + int getHPadding() const + { return mHPadding; } + /** * Sets the vertical padding around the cell content. */ diff --git a/src/gui/widgets/tabs/clanwindowtabs.cpp b/src/gui/widgets/tabs/clanwindowtabs.cpp new file mode 100644 index 000000000..a73e8ce39 --- /dev/null +++ b/src/gui/widgets/tabs/clanwindowtabs.cpp @@ -0,0 +1,162 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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/clanwindowtabs.h" + +#include "being/localclan.h" + +#include "gui/widgets/containerplacer.h" +#include "gui/widgets/label.h" +#include "gui/widgets/layouthelper.h" + +#include "utils/foreach.h" +#include "utils/gettext.h" +#include "utils/stringutils.h" + +#include "debug.h" + +InfoClanTab::InfoClanTab(const Widget2 *const widget) : + Container(widget), + mNameLabel(new Label(this, " ")), + mMasterLabel(new Label(this, " ")), + mMapLabel(new Label(this, " ")) +{ + setSelectable(false); + + LayoutHelper h(this); + ContainerPlacer place = h.getPlacer(0, 0); + + place(0, 0, mNameLabel, 2, 1); + place(0, 1, mMasterLabel, 2, 1); + place(0, 2, mMapLabel, 2, 1); + + place.getCell().matchColWidth(0, 0); + setDimension(Rect(0, 0, 600, 300)); +} + +void InfoClanTab::resetClan() +{ + // TRANSLATORS: not in clan label + mNameLabel->setCaption(strprintf(_("Not in clan"))); + mMasterLabel->setCaption(std::string()); + mMapLabel->setCaption(std::string()); +} + +void InfoClanTab::updateClan() +{ + mNameLabel->setCaption(strprintf("%s: %s", + // TRANSLATORS: clan name label + _("Clan name"), + localClan.name.c_str())); + mMasterLabel->setCaption(strprintf("%s: %s", + // TRANSLATORS: clan master name label + _("Master name"), + localClan.masterName.c_str())); + mMapLabel->setCaption(strprintf("%s: %s", + // TRANSLATORS: clan map name label + _("Map name"), + localClan.mapName.c_str())); +} + +StatsClanTab::StatsClanTab(const Widget2 *const widget) : + Container(widget), + mLabels() +{ + setSelectable(false); +} + +void StatsClanTab::clearLabels() +{ + FOR_EACH (STD_VECTOR<Label*>::iterator, it, mLabels) + { + remove(*it); + delete *it; + } + mLabels.clear(); +} + +void StatsClanTab::resetClan() +{ + clearLabels(); +} + + +void StatsClanTab::updateClan() +{ + clearLabels(); + + LayoutHelper h(this); + + const int hPadding = h.getLayout().getHPadding(); + const int vPadding = h.getLayout().getVPadding(); + int y = vPadding; + FOR_EACH (STD_VECTOR<std::string>::const_iterator, it, localClan.stats) + { + Label *const label = new Label(this, *it); + add(label); + label->setPosition(hPadding, y); + label->adjustSize(); + y += label->getHeight() + vPadding; + mLabels.push_back(label); + } +} + +RelationClanTab::RelationClanTab(const Widget2 *const widget) : + Container(widget), + mLabels() +{ + setSelectable(false); +} + +void RelationClanTab::clearLabels() +{ + FOR_EACH (STD_VECTOR<Label*>::iterator, it, mLabels) + { + remove(*it); + delete *it; + } + mLabels.clear(); +} + +void RelationClanTab::resetClan() +{ + clearLabels(); +} + +void RelationClanTab::updateClan(const STD_VECTOR<std::string> &restrict names) +{ + clearLabels(); + + LayoutHelper h(this); + + const int hPadding = h.getLayout().getHPadding(); + const int vPadding = h.getLayout().getVPadding(); + int y = vPadding; + FOR_EACH (STD_VECTOR<std::string>::const_iterator, it, names) + { + Label *const label = new Label(this, *it); + add(label); + label->setPosition(hPadding, y); + label->adjustSize(); + y += label->getHeight() + vPadding; + mLabels.push_back(label); + } +} + diff --git a/src/gui/widgets/tabs/clanwindowtabs.h b/src/gui/widgets/tabs/clanwindowtabs.h new file mode 100644 index 000000000..752c6d87a --- /dev/null +++ b/src/gui/widgets/tabs/clanwindowtabs.h @@ -0,0 +1,83 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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_DEBUGWINDOWTABS_H +#define GUI_WIDGETS_TABS_DEBUGWINDOWTABS_H + +#include "gui/widgets/container.h" + +#include "utils/vector.h" + +#include <string> + +class Label; + +class InfoClanTab final : public Container +{ + public: + explicit InfoClanTab(const Widget2 *const widget); + + A_DELETE_COPY(InfoClanTab) + + void resetClan(); + + void updateClan(); + + private: + Label *mNameLabel A_NONNULLPOINTER; + Label *mMasterLabel A_NONNULLPOINTER; + Label *mMapLabel A_NONNULLPOINTER; +}; + +class StatsClanTab final : public Container +{ + public: + explicit StatsClanTab(const Widget2 *const widget); + + A_DELETE_COPY(StatsClanTab) + + void clearLabels(); + + void resetClan(); + + void updateClan(); + + private: + STD_VECTOR<Label*> mLabels; +}; + +class RelationClanTab final : public Container +{ + public: + explicit RelationClanTab(const Widget2 *const widget); + + A_DELETE_COPY(RelationClanTab) + + void clearLabels(); + + void resetClan(); + + void updateClan(const STD_VECTOR<std::string> &restrict names); + + private: + STD_VECTOR<Label*> mLabels; +}; + +#endif // GUI_WIDGETS_TABS_DEBUGWINDOWTABS_H diff --git a/src/gui/windows/clanwindow.cpp b/src/gui/windows/clanwindow.cpp new file mode 100644 index 000000000..9d08e5914 --- /dev/null +++ b/src/gui/windows/clanwindow.cpp @@ -0,0 +1,163 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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/windows/clanwindow.h" + +#include "being/localclan.h" +#include "being/localplayer.h" + +#include "gui/windows/setupwindow.h" + +#include "gui/widgets/createwidget.h" +#include "gui/widgets/tabbedarea.h" + +#include "gui/widgets/tabs/clanwindowtabs.h" + +#include "utils/delete2.h" +#include "utils/gettext.h" + +#include "debug.h" + +ClanWindow *clanWindow = nullptr; + +ClanWindow::ClanWindow() : + // TRANSLATORS: clan window name + Window(_("Clan"), Modal_false, nullptr, "clan.xml"), + mTabs(CREATEWIDGETR(TabbedArea, this)), + mInfoWidget(new InfoClanTab(this)), + mStatsWidget(new StatsClanTab(this)), + mAllyWidget(new RelationClanTab(this)), + mAntagonistWidget(new RelationClanTab(this)) +{ + setWindowName("clan"); + if (setupWindow != nullptr) + setupWindow->registerWindowForReset(this); + + setResizable(true); + setCloseButton(true); + setSaveVisible(true); + setStickyButtonLock(true); + + setDefaultSize(400, 300, ImagePosition::CENTER, 0, 0); + + mTabs->setSelectable(false); + mTabs->getWidgetContainer()->setSelectable(false); + mTabs->getTabContainer()->setSelectable(false); + // TRANSLATORS: clan window tab + mTabs->addTab(std::string(_("Info")), mInfoWidget); + // TRANSLATORS: clan window tab + mTabs->addTab(std::string(_("Stats")), mStatsWidget); + // TRANSLATORS: clan window tab + mTabs->addTab(std::string(_("Ally")), mAllyWidget); + // TRANSLATORS: clan window tab + mTabs->addTab(std::string(_("Antagonist")), mAntagonistWidget); + + mTabs->setDimension(Rect(0, 0, 600, 300)); + + const int w = mDimension.width; + const int h = mDimension.height; + mInfoWidget->setDimension(Rect(0, 0, w, h)); + mStatsWidget->setDimension(Rect(0, 0, w, h)); + mAllyWidget->setDimension(Rect(0, 0, w, h)); + mAntagonistWidget->setDimension(Rect(0, 0, w, h)); + loadWindowState(); + enableVisibleSound(true); + resetClan(); +} + +ClanWindow::~ClanWindow() +{ + delete2(mInfoWidget); + delete2(mStatsWidget); + delete2(mAllyWidget); + delete2(mAntagonistWidget); +} + +void ClanWindow::postInit() +{ + Window::postInit(); + add(mTabs); +} + +void ClanWindow::slowLogic() +{ + BLOCK_START("ClanWindow::slowLogic") + if (!isWindowVisible() || (mTabs == nullptr)) + { + BLOCK_END("ClanWindow::slowLogic") + return; + } + + switch (mTabs->getSelectedTabIndex()) + { + default: + case 0: + mInfoWidget->logic(); + break; + case 1: + mStatsWidget->logic(); + break; + case 2: + mAllyWidget->logic(); + break; + case 3: + mAntagonistWidget->logic(); + break; + } + + BLOCK_END("ClanWindow::slowLogic") +} + +void ClanWindow::widgetResized(const Event &event) +{ + Window::widgetResized(event); + + mTabs->setDimension(Rect(0, 0, + mDimension.width, mDimension.height)); +} + +void ClanWindow::updateClan() +{ + mInfoWidget->updateClan(); + mStatsWidget->updateClan(); + mAllyWidget->updateClan(localClan.allyClans); + mAntagonistWidget->updateClan(localClan.antagonistClans); +} + +void ClanWindow::resetClan() +{ + mInfoWidget->resetClan(); + mStatsWidget->resetClan(); + mAllyWidget->resetClan(); + mAntagonistWidget->resetClan(); +} + +void ClanWindow::updateClanMembers() +{ +} + +#ifdef USE_PROFILER +void ClanWindow::logicChildren() +{ + BLOCK_START("ClanWindow::logicChildren") + BasicContainer::logicChildren(); + BLOCK_END("ClanWindow::logicChildren") +} +#endif // USE_PROFILER diff --git a/src/gui/windows/clanwindow.h b/src/gui/windows/clanwindow.h new file mode 100644 index 000000000..5251d9b32 --- /dev/null +++ b/src/gui/windows/clanwindow.h @@ -0,0 +1,77 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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_WINDOWS_CLANWINDOW_H +#define GUI_WINDOWS_CLANWINDOW_H + +#include "gui/widgets/window.h" + +class InfoClanTab; +class RelationClanTab; +class StatsClanTab; +class TabbedArea; + +/** + * The clan window. + * + * \ingroup Interface + */ +class ClanWindow final : public Window +{ + public: + /** + * Constructor. + */ + ClanWindow(); + + A_DELETE_COPY(ClanWindow) + + ~ClanWindow() override final; + + void postInit() override final; + + /** + * Logic (updates components' size and infos) + */ + void slowLogic(); + + void widgetResized(const Event &event) override final; + + void resetClan(); + + void updateClan(); + + void updateClanMembers(); + +#ifdef USE_PROFILER + void logicChildren(); +#endif // USE_PROFILER + + private: + TabbedArea *mTabs A_NONNULLPOINTER; + InfoClanTab *mInfoWidget A_NONNULLPOINTER; + StatsClanTab *mStatsWidget A_NONNULLPOINTER; + RelationClanTab *mAllyWidget A_NONNULLPOINTER; + RelationClanTab *mAntagonistWidget A_NONNULLPOINTER; +}; + +extern ClanWindow *clanWindow; + +#endif // GUI_WINDOWS_CLANWINDOW_H |