1 /*
2 * The ManaPlus Client
3 * Copyright (C) 2008 The Legend of Mazzeroth Development Team
4 * Copyright (C) 2009 The Mana World Development Team
5 * Copyright (C) 2011-2019 The ManaPlus Developers
6 * Copyright (C) 2009-2021 Andrei Karas
7 *
8 * This file is part of The ManaPlus Client.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "gui/popups/statuspopup.h"
25
26 #include "gamemodifiers.h"
27
28 #include "gui/widgets/label.h"
29
30 #include "input/inputmanager.h"
31
32 #include "utils/stringutils.h"
33
34 #include "gui/fonts/font.h"
35
36 #include "debug.h"
37
38 #define addLabel(num) \
39 { \
40 Label *const label = mLabels[num]; \
41 label->setPosition(0, y); \
42 label->setForegroundColorAll( \
43 getThemeColor(ThemeColorId::POPUP, 255U), \
44 getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U)); \
45 add(label); \
46 y += fontHeight; \
47 }
48
StatusPopup()49 StatusPopup::StatusPopup() :
50 Popup("StatusPopup", "statuspopup.xml"),
51 mLabels()
52 {
53 for (int f = 0; f < STATUSPOPUP_NUM_LABELS; f ++)
54 mLabels[f] = new Label(this);
55 }
56
postInit()57 void StatusPopup::postInit()
58 {
59 Popup::postInit();
60 const int fontHeight = getFont()->getHeight();
61 int y = 0;
62 addLabel(0)
63 addLabel(1)
64 addLabel(2)
65 addLabel(3)
66 y += 4;
67 addLabel(4)
68 addLabel(5)
69 addLabel(9)
70 addLabel(10)
71 y += 4;
72 addLabel(6)
73 addLabel(7)
74 y += 4;
75 addLabel(8)
76 y += 4;
77 addLabel(12)
78 addLabel(13)
79 addLabel(14)
80 addLabel(15)
81 y += 4;
82 addLabel(11)
83 }
84
~StatusPopup()85 StatusPopup::~StatusPopup()
86 {
87 }
88
update()89 void StatusPopup::update()
90 {
91 updateLabels();
92
93 int maxWidth = mLabels[0]->getWidth();
94
95 for (int f = 0; f < STATUSPOPUP_NUM_LABELS; f ++)
96 {
97 const int width = mLabels[f]->getWidth();
98 if (width > maxWidth)
99 maxWidth = width;
100 }
101
102 const int pad2 = 2 * mPadding;
103 maxWidth += pad2;
104 setWidth(maxWidth);
105 setHeight(mLabels[11]->getY()
106 + mLabels[11]->getHeight() + pad2);
107 }
108
view(const int x,const int y)109 void StatusPopup::view(const int x, const int y)
110 {
111 const int distance = 20;
112
113 int posX = std::max(0, x - getWidth() / 2);
114 int posY = y + distance;
115
116 if (posX + getWidth() > mainGraphics->mWidth)
117 posX = mainGraphics->mWidth - getWidth();
118 if (posY + getHeight() > mainGraphics->mHeight)
119 posY = y - getHeight() - distance;
120
121 update();
122
123 setPosition(posX, posY);
124 setVisible(Visible_true);
125 requestMoveToTop();
126 }
127
setLabelText(const int num,const std::string & text,const InputActionT key) const128 void StatusPopup::setLabelText(const int num,
129 const std::string &text,
130 const InputActionT key) const
131 {
132 Label *const label = mLabels[num];
133 label->setCaption(strprintf("%s %s", text.c_str(),
134 inputManager.getKeyValueString(key).c_str()));
135 label->adjustSize();
136 }
137
updateLabels() const138 void StatusPopup::updateLabels() const
139 {
140 setLabelText(0, GameModifiers::getMoveTypeString(),
141 InputAction::INVERT_DIRECTION);
142 setLabelText(1, GameModifiers::getCrazyMoveTypeString(),
143 InputAction::CHANGE_CRAZY_MOVES_TYPE);
144 setLabelText(2, GameModifiers::getMoveToTargetTypeString(),
145 InputAction::CHANGE_MOVE_TO_TARGET);
146 setLabelText(3, GameModifiers::getFollowModeString(),
147 InputAction::CHANGE_FOLLOW_MODE);
148 setLabelText(4, GameModifiers::getAttackWeaponTypeString(),
149 InputAction::CHANGE_ATTACK_WEAPON_TYPE);
150 setLabelText(5, GameModifiers::getAttackTypeString(),
151 InputAction::CHANGE_ATTACK_TYPE);
152 setLabelText(6, GameModifiers::getQuickDropCounterString(),
153 InputAction::SWITCH_QUICK_DROP);
154 setLabelText(7, GameModifiers::getPickUpTypeString(),
155 InputAction::CHANGE_PICKUP_TYPE);
156 setLabelText(8, GameModifiers::getMapDrawTypeString(),
157 InputAction::PATHFIND);
158 setLabelText(9, GameModifiers::getMagicAttackTypeString(),
159 InputAction::SWITCH_MAGIC_ATTACK);
160 setLabelText(10, GameModifiers::getPvpAttackTypeString(),
161 InputAction::SWITCH_PVP_ATTACK);
162 setLabelText(11, GameModifiers::getGameModifiersString(),
163 InputAction::DISABLE_GAME_MODIFIERS);
164 setLabelText(12, GameModifiers::getImitationModeString(),
165 InputAction::CHANGE_IMITATION_MODE);
166 setLabelText(13, GameModifiers::getAwayModeString(),
167 InputAction::AWAY);
168 setLabelText(14, GameModifiers::getCameraModeString(),
169 InputAction::CAMERA);
170 setLabelText(15, GameModifiers::getTargetingTypeString(),
171 InputAction::CHANGE_TARGETING_TYPE);
172 }
173