ManaPlus
skillpopup.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2008 The Legend of Mazzeroth Development Team
4  * Copyright (C) 2008-2009 The Mana World Development Team
5  * Copyright (C) 2009-2010 The Mana Developers
6  * Copyright (C) 2011-2019 The ManaPlus Developers
7  * Copyright (C) 2019-2021 Andrei Karas
8  *
9  * This file is part of The ManaPlus Client.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program. If not, see <http://www.gnu.org/licenses/>.
23  */
24 
25 #include "gui/popups/skillpopup.h"
26 
27 #include "gui/gui.h"
28 
29 #include "gui/fonts/font.h"
30 
31 #include "gui/widgets/label.h"
32 #include "gui/widgets/textbox.h"
33 
34 #include "utils/gettext.h"
35 #include "utils/stringutils.h"
36 
39 
40 #include "debug.h"
41 
43 
45  Popup("SkillPopup", "skillpopup.xml"),
46  mSkillName(new Label(this)),
47  mSkillDesc(new TextBox(this)),
48  mSkillEffect(new TextBox(this)),
49  mSkillLevel(new TextBox(this)),
50  mSkillCastType(new TextBox(this)),
51  mCastType(CastType::Default),
52  mLastId(0U),
53  mLastLevel(-1),
54  mOffsetX(0),
55  mOffsetY(0)
56 {
58  mSkillName->setPosition(0, 0);
60  getThemeColor(ThemeColorId::POPUP, 255U),
61  getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U));
62 
63  const int fontHeight = getFont()->getHeight();
64 
65  mSkillDesc->setEditable(false);
66  mSkillDesc->setPosition(0, fontHeight);
68  getThemeColor(ThemeColorId::POPUP, 255U),
69  getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U));
70 
71  mSkillEffect->setEditable(false);
72  mSkillEffect->setPosition(0, 2 * fontHeight);
74  getThemeColor(ThemeColorId::POPUP, 255U),
75  getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U));
76 
77  mSkillLevel->setEditable(false);
78  mSkillLevel->setPosition(0, 3 * fontHeight);
80  getThemeColor(ThemeColorId::POPUP, 255U),
81  getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U));
82 
84  mSkillCastType->setPosition(0, 4 * fontHeight);
86  getThemeColor(ThemeColorId::POPUP, 255U),
87  getThemeColor(ThemeColorId::POPUP_OUTLINE, 255U));
88 }
89 
91 {
93  add(mSkillName);
94  add(mSkillDesc);
98 
99  addMouseListener(this);
100 }
101 
103 {
104 }
105 
106 void SkillPopup::show(const SkillInfo *const skill,
107  const int level,
108  const CastTypeT castType,
109  const int offsetX,
110  const int offsetY)
111 {
112  if ((skill == nullptr) ||
113  (skill->data == nullptr) ||
114  (skill->id == mLastId &&
115  level == mLastLevel &&
116  castType == mCastType &&
117  offsetX == mOffsetX &&
118  offsetY == mOffsetY))
119  {
120  return;
121  }
122 
123  mLastId = skill->id;
124  mLastLevel = level;
125  mCastType = castType;
126  mOffsetX = offsetX;
127  mOffsetY = offsetY;
128 
129  mSkillName->setCaption(skill->data->dispName);
131  mSkillName->setPosition(0, 0);
132 
133  std::string description = skill->data->description;
134  std::string effect = skill->skillEffect;
135  if (description.empty())
136  {
137  description = effect;
138  effect.clear();
139  }
140  mSkillDesc->setTextWrapped(description, 196);
141  mSkillEffect->setTextWrapped(effect, 196);
142  if (level != 0)
143  {
145  // TRANSLATORS: skill level
146  _("Level: %d / %d"), level, skill->level),
147  196);
148  }
149  else
150  {
151  if (skill->level != 0)
152  {
154  // TRANSLATORS: skill level
155  _("Level: %d"), skill->level),
156  196);
157  }
158  else
159  {
161  // TRANSLATORS: skill level for tmw fake skills
162  _("Level: Unknown"),
163  196);
164  }
165  }
166  std::string castStr;
167  switch (castType)
168  {
169  case CastType::Default:
170  default:
171  // TRANSLATORS: skill cast type
172  castStr = _("Default");
173  break;
174  case CastType::Target:
175  // TRANSLATORS: skill cast type
176  castStr = _("Target");
177  break;
178  case CastType::Position:
179  // TRANSLATORS: skill cast type
180  castStr = _("Mouse position");
181  break;
182  case CastType::Self:
183  // TRANSLATORS: skill cast type
184  castStr = _("Self position");
185  break;
186  }
187  if (offsetX != 0 ||
188  offsetY != 0)
189  {
190  castStr.append(strprintf(" (%+d,%+d)",
191  offsetX,
192  offsetY));
193  }
195  // TRANSLATORS: skill cast type
196  _("Cast type: %s"),
197  castStr.c_str()), 196);
198 
199  int minWidth = mSkillName->getWidth();
200 
201  if (mSkillName->getWidth() > minWidth)
202  minWidth = mSkillName->getWidth();
203  if (mSkillDesc->getMinWidth() > minWidth)
204  minWidth = mSkillDesc->getMinWidth();
205  if (mSkillEffect->getMinWidth() > minWidth)
206  minWidth = mSkillEffect->getMinWidth();
207  if (mSkillLevel->getMinWidth() > minWidth)
208  minWidth = mSkillLevel->getMinWidth();
209  if (mSkillCastType->getMinWidth() > minWidth)
210  minWidth = mSkillCastType->getMinWidth();
211 
212  const int numRowsDesc = mSkillDesc->getNumberOfRows();
213  const int numRowsLevel = mSkillLevel->getNumberOfRows();
214  const int numRowsCast = mSkillCastType->getNumberOfRows();
215  const int height = getFont()->getHeight();
216 
217  if (skill->skillEffect.empty())
218  {
219  setContentSize(minWidth,
220  (numRowsDesc + numRowsLevel + numRowsCast + 1) * height);
221  mSkillLevel->setPosition(0, (numRowsDesc + 1) * height);
222  mSkillCastType->setPosition(0, (numRowsDesc + 2) * height);
223  }
224  else
225  {
226  const int numRowsEffect = mSkillEffect->getNumberOfRows();
227  setContentSize(minWidth,
228  (numRowsDesc + numRowsLevel + numRowsEffect + numRowsCast + 1) *
229  height);
230  mSkillEffect->setPosition(0, (numRowsDesc + 1) * height);
232  (numRowsDesc + numRowsEffect + 1) * height);
234  (numRowsDesc + numRowsEffect + 2) * height);
235  }
236 
237  mSkillDesc->setPosition(0, 1 * height);
238 }
239 
241 {
242  Popup::mouseMoved(event);
243 
244  // When the mouse moved on top of the popup, hide it
246  mLastId = 0;
247 }
248 
250 {
251  mLastId = 0;
252  mLastLevel = 0;
254  mOffsetX = 0;
255  mOffsetY = 0;
256 }
CastType ::T CastTypeT
Definition: casttype.h:34
virtual void add(Widget *const widget)
int getHeight() const
Definition: font.cpp:362
Definition: label.h:91
void adjustSize()
Definition: label.cpp:200
void setForegroundColorAll(const Color &color1, const Color &color2)
Definition: label.cpp:217
void setCaption(const std::string &caption)
Definition: label.cpp:264
Definition: popup.h:52
void setContentSize(int width, int height)
Definition: popup.cpp:155
void mouseMoved(MouseEvent &event)
Definition: popup.cpp:255
void postInit()
Definition: popup.h:177
Label * mSkillName
Definition: skillpopup.h:71
TextBox * mSkillLevel
Definition: skillpopup.h:74
TextBox * mSkillDesc
Definition: skillpopup.h:72
TextBox * mSkillCastType
Definition: skillpopup.h:75
CastTypeT mCastType
Definition: skillpopup.h:76
int mOffsetX
Definition: skillpopup.h:79
void postInit()
Definition: skillpopup.cpp:90
unsigned int mLastId
Definition: skillpopup.h:77
int mLastLevel
Definition: skillpopup.h:78
TextBox * mSkillEffect
Definition: skillpopup.h:73
int mOffsetY
Definition: skillpopup.h:80
void mouseMoved(MouseEvent &event)
Definition: skillpopup.cpp:240
void reset()
Definition: skillpopup.cpp:249
void show(const SkillInfo *const skill, const int level, const CastTypeT type, const int offsetX, const int offsetY)
Definition: skillpopup.cpp:106
void setEditable(const bool editable)
Definition: textbox.cpp:650
unsigned int getNumberOfRows() const
Definition: textbox.h:162
void setForegroundColorAll(const Color &color1, const Color &color2)
Definition: textbox.cpp:488
int getMinWidth() const
Definition: textbox.h:108
void setTextWrapped(const std::string &text, const int minDimension)
Definition: textbox.cpp:109
const Color & getThemeColor(const ThemeColorIdT type, const unsigned int alpha) const A_INLINE
Definition: widget2.h:45
void setVisible(Visible visible)
Definition: widget.cpp:225
void addMouseListener(MouseListener *const mouseListener)
Definition: widget.cpp:292
void setFont(Font *const font)
Definition: widget.cpp:349
Font * getFont() const
Definition: widget.cpp:331
void setPosition(const int x, const int y)
Definition: widget.cpp:161
int getWidth() const
Definition: widget.h:221
#define new
Definition: debug_new.h:147
#define _(s)
Definition: gettext.h:35
Font * boldFont
Definition: gui.cpp:112
bool skill(InputEvent &event)
Definition: commands.cpp:97
@ Position
Definition: casttype.h:31
@ Default
Definition: casttype.h:29
@ Target
Definition: casttype.h:30
@ Self
Definition: casttype.h:32
SkillPopup * skillPopup
Definition: skillpopup.cpp:42
std::string strprintf(const char *const format,...)
const bool Visible_false
Definition: visible.h:30