ManaPlus
virtshortcutcontainer.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2009 The Mana World Development Team
4  * Copyright (C) 2011-2019 The ManaPlus Developers
5  * Copyright (C) 2009-2021 Andrei Karas
6  *
7  * This file is part of The ManaPlus Client.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
24 
25 #include "dragdrop.h"
26 #include "settings.h"
27 
28 #include "being/playerinfo.h"
29 
30 #include "gui/viewport.h"
31 
32 #include "gui/fonts/font.h"
33 
35 
36 #include "gui/popups/itempopup.h"
37 #include "gui/popups/popupmenu.h"
38 
40 
41 #include "utils/stringutils.h"
42 
43 #include "debug.h"
44 
46  ShortcutBase *const shortcut) :
47  ShortcutContainer(widget),
48  mItemClicked(false),
49  mEquipedColor(getThemeColor(ThemeColorId::ITEM_EQUIPPED, 255U)),
50  mEquipedColor2(getThemeColor(ThemeColorId::ITEM_EQUIPPED_OUTLINE, 255U)),
51  mUnEquipedColor(getThemeColor(ThemeColorId::ITEM_NOT_EQUIPPED, 255U)),
52  mUnEquipedColor2(getThemeColor(ThemeColorId::ITEM_NOT_EQUIPPED_OUTLINE,
53  255U)),
54  mShortcut(shortcut)
55 {
56  if (mShortcut != nullptr)
58  else
59  mMaxItems = 0;
60 }
61 
63 {
64 }
65 
66 void VirtShortcutContainer::setSkin(const Widget2 *const widget,
67  Skin *const skin)
68 {
69  ShortcutContainer::setSkin(widget, skin);
70  mEquipedColor = getThemeColor(ThemeColorId::ITEM_EQUIPPED, 255U);
71  mEquipedColor2 = getThemeColor(ThemeColorId::ITEM_EQUIPPED_OUTLINE, 255U);
72  mUnEquipedColor = getThemeColor(ThemeColorId::ITEM_NOT_EQUIPPED, 255U);
73  mUnEquipedColor2 = getThemeColor(ThemeColorId::ITEM_NOT_EQUIPPED_OUTLINE,
74  255U);
75 }
76 
78 {
79  if (mShortcut == nullptr)
80  return;
81 
82  BLOCK_START("VirtShortcutContainer::draw")
83  if (settings.guiAlpha != mAlpha)
84  {
86  if (mBackgroundImg != nullptr)
87  mBackgroundImg->setAlpha(mAlpha);
88  }
89 
90  drawBackground(graphics);
91 
92  const Inventory *const inv = PlayerInfo::getInventory();
93  if (inv == nullptr)
94  {
95  BLOCK_END("VirtShortcutContainer::draw")
96  return;
97  }
98 
99  Font *const font = getFont();
100 
101  for (unsigned i = 0; i < mMaxItems; i++)
102  {
103  const int itemId = mShortcut->getItem(i);
104  if (itemId < 0)
105  continue;
106 
107  const Item *const item = inv->findItem(itemId,
108  mShortcut->getItemColor(i));
109 
110  if (item != nullptr)
111  {
112  const int itemX = (i % mGridWidth) * mBoxWidth;
113  const int itemY = (i / mGridWidth) * mBoxHeight;
114 
115  // Draw item icon.
116  Image *const image = item->getImage();
117 
118  if (image != nullptr)
119  {
120  std::string caption;
121  if (item->getQuantity() > 1)
122  caption = toString(item->getQuantity());
123  else if (item->isEquipped() == Equipped_true)
124  caption = "Eq.";
125 
126  image->setAlpha(1.0F);
127  graphics->drawImage(image,
128  itemX + mImageOffsetX,
129  itemY + mImageOffsetY);
130  if (item->isEquipped() == Equipped_true)
131  {
132  font->drawString(graphics,
135  caption,
136  itemX + (mBoxWidth - font->getWidth(caption)) / 2,
137  itemY + mBoxHeight - 14);
138  }
139  else
140  {
141  font->drawString(graphics,
144  caption,
145  itemX + (mBoxWidth - font->getWidth(caption)) / 2,
146  itemY + mBoxHeight - 14);
147  }
148  }
149  }
150  }
151  BLOCK_END("VirtShortcutContainer::draw")
152 }
153 
155 {
156  if (mShortcut == nullptr)
157  return;
158 
159  BLOCK_START("VirtShortcutContainer::safeDraw")
160  if (settings.guiAlpha != mAlpha)
161  {
163  if (mBackgroundImg != nullptr)
164  mBackgroundImg->setAlpha(mAlpha);
165  }
166 
167  safeDrawBackground(graphics);
168 
169  const Inventory *const inv = PlayerInfo::getInventory();
170  if (inv == nullptr)
171  {
172  BLOCK_END("VirtShortcutContainer::safeDraw")
173  return;
174  }
175 
176  Font *const font = getFont();
177 
178  for (unsigned i = 0; i < mMaxItems; i++)
179  {
180  const int itemId = mShortcut->getItem(i);
181  if (itemId < 0)
182  continue;
183 
184  if (itemId < 0)
185  continue;
186 
187  const Item *const item = inv->findItem(itemId,
188  mShortcut->getItemColor(i));
189 
190  if (item != nullptr)
191  {
192  // Draw item icon.
193  Image *const image = item->getImage();
194 
195  if (image != nullptr)
196  {
197  const int itemX = (i % mGridWidth) * mBoxWidth;
198  const int itemY = (i / mGridWidth) * mBoxHeight;
199 
200  std::string caption;
201  if (item->getQuantity() > 1)
202  caption = toString(item->getQuantity());
203  else if (item->isEquipped() == Equipped_true)
204  caption = "Eq.";
205 
206  image->setAlpha(1.0F);
207  graphics->drawImage(image,
208  itemX + mImageOffsetX,
209  itemY + mImageOffsetY);
210  if (item->isEquipped() == Equipped_true)
211  {
212  font->drawString(graphics,
215  caption,
216  itemX + (mBoxWidth - font->getWidth(caption)) / 2,
217  itemY + mBoxHeight - 14);
218  }
219  else
220  {
221  font->drawString(graphics,
224  caption,
225  itemX + (mBoxWidth - font->getWidth(caption)) / 2,
226  itemY + mBoxHeight - 14);
227  }
228  }
229  }
230  }
231  BLOCK_END("VirtShortcutContainer::safeDraw")
232 }
233 
235 {
236  if (mShortcut == nullptr)
237  return;
238 
239  if (event.getButton() == MouseButton::LEFT)
240  {
241  if (dragDrop.isEmpty() && mItemClicked)
242  {
243  const int index = getIndexFromGrid(event.getX(), event.getY());
244 
245  if (index == -1)
246  return;
247 
248  const int itemId = mShortcut->getItem(index);
249  const ItemColor itemColor = mShortcut->getItemColor(index);
250 
251  if (itemId < 0)
252  return;
253 
254  const Inventory *const inv = PlayerInfo::getInventory();
255  if (inv == nullptr)
256  return;
257 
258  Item *const item = inv->findItem(itemId, itemColor);
259 
260  if (item != nullptr)
261  {
263  mShortcut->removeItem(index);
264  }
265  else
266  {
267  dragDrop.clear();
268  }
269  }
270  }
271 }
272 
274 {
275  if ((mShortcut == nullptr) || (inventoryWindow == nullptr))
276  return;
277 
278  const int index = getIndexFromGrid(event.getX(), event.getY());
279 
280  if (index == -1)
281  return;
282 
283  event.consume();
284 
285  const MouseButtonT eventButton = event.getButton();
286  if (eventButton == MouseButton::LEFT)
287  {
288  if (mShortcut->getItem(index) > 0)
289  {
290  mItemClicked = true;
291  }
292  else
293  {
294  if (dragDrop.isSelected())
295  {
298  dragDrop.deselect();
299  }
300  }
301  }
302  else if (eventButton == MouseButton::RIGHT)
303  {
304  const Inventory *const inv = PlayerInfo::getInventory();
305  if (inv == nullptr)
306  return;
307 
308  Item *const item = inv->findItem(mShortcut->getItem(index),
309  mShortcut->getItemColor(index));
310 
311  if (popupMenu != nullptr)
312  {
314  viewport->mMouseY,
315  item);
316  }
317  }
318 }
319 
321 {
322  if (mShortcut == nullptr)
323  return;
324 
325  if (event.getButton() == MouseButton::LEFT)
326  {
327  if (mShortcut->isItemSelected())
329 
330  const int index = getIndexFromGrid(event.getX(), event.getY());
331  if (index == -1)
332  {
333  dragDrop.clear();
334  return;
335  }
336  if (!dragDrop.isEmpty())
337  {
339  {
342  dragDrop.clear();
343  dragDrop.deselect();
344  }
345  }
346 
347  mItemClicked = false;
348  }
349 }
350 
351 // Show ItemTooltip
353 {
354  if (mShortcut == nullptr)
355  return;
356 
357  const int index = getIndexFromGrid(event.getX(), event.getY());
358 
359  if (index == -1)
360  return;
361 
362  const int itemId = mShortcut->getItem(index);
363  const ItemColor itemColor = mShortcut->getItemColor(index);
364 
365  if (itemId < 0)
366  return;
367 
368  const Inventory *const inv = PlayerInfo::getInventory();
369  if (inv == nullptr)
370  return;
371 
372  const Item *const item = inv->findItem(itemId, itemColor);
373 
374  if ((item != nullptr) && (viewport != nullptr))
375  {
376  itemPopup->setItem(item, false);
378  }
379  else
380  {
382  }
383 }
384 
386 {
387  if (itemPopup != nullptr)
389 }
390 
392 {
393  if (itemPopup != nullptr)
395 }
void dragItem(const Item *const item, const DragDropSourceT source, const int tag)
Definition: dragdrop.h:87
ItemColor getSelectedColor() const
Definition: dragdrop.h:222
bool isSelected() const
Definition: dragdrop.h:225
void deselect()
Definition: dragdrop.h:213
int getSelected() const
Definition: dragdrop.h:219
bool isEmpty() const
Definition: dragdrop.h:196
bool isSourceItemContainer() const
Definition: dragdrop.h:241
void clear()
Definition: dragdrop.h:183
int getItem() const
Definition: dragdrop.h:66
ItemColor getItemColor() const
Definition: dragdrop.h:69
Definition: event.h:79
Definition: font.h:90
int getWidth(const std::string &text) const
Definition: font.cpp:334
void drawString(Graphics *const graphics, Color col, const Color &col2, const std::string &text, const int x, const int y)
Definition: font.cpp:254
virtual void drawImage(const Image *const image, int dstX, int dstY)=0
Item * findItem(const int itemId, const ItemColor color) const
Definition: inventory.cpp:94
void setItem(const ItemInfo &item, const ItemColor color, const bool showImage, int id, const int *const cards, const ItemOptionsList *const options)
Definition: itempopup.cpp:189
Definition: item.h:50
int getQuantity() const
Definition: item.h:105
Equipped isEquipped() const
Definition: item.h:129
Image * getImage() const
Definition: item.h:87
MouseButtonT getButton() const
Definition: mouseevent.h:116
int getX() const
Definition: mouseevent.h:127
int getY() const
Definition: mouseevent.h:138
void showDropPopup(const int x, const int y, const Item *const item)
Definition: popupmenu.cpp:1849
void position(const int x, const int y)
Definition: popup.cpp:235
float guiAlpha
Definition: settings.h:131
void setItemSelected(const int itemId)
Definition: shortcutbase.h:112
bool isItemSelected() const
Definition: shortcutbase.h:120
int getItem(const size_t index) const
Definition: shortcutbase.h:71
int getItemCount() const
Definition: shortcutbase.h:80
ItemColor getItemColor(const size_t index) const
Definition: shortcutbase.h:74
void setItems(const size_t index, const int itemId, const ItemColor color)
Definition: shortcutbase.h:102
void removeItem(const size_t index)
Definition: shortcutbase.h:126
virtual void setSkin(const Widget2 *const widget, Skin *const skin)
void drawBackground(Graphics *const g)
void safeDrawBackground(Graphics *const g)
int getIndexFromGrid(const int pointX, const int pointY) const
Definition: skin.h:37
int mMouseX
Definition: viewport.h:154
int mMouseY
Definition: viewport.h:155
void mousePressed(MouseEvent &event)
void setSkin(const Widget2 *const widget, Skin *const skin)
VirtShortcutContainer(Widget2 *const widget, ShortcutBase *const shortcut)
void widgetHidden(const Event &event)
void draw(Graphics *const graphics)
void mouseDragged(MouseEvent &event)
void mouseMoved(MouseEvent &event)
void mouseExited(MouseEvent &event)
void safeDraw(Graphics *const graphics)
void mouseReleased(MouseEvent &event)
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
Font * getFont() const
Definition: widget.cpp:331
DragDrop dragDrop
Viewport * viewport
Definition: viewport.cpp:36
const bool Equipped_true
Definition: equipped.h:30
InventoryWindow * inventoryWindow
uint16_t ItemColor
Definition: itemcolor.h:30
ItemPopup * itemPopup
Definition: itempopup.cpp:64
#define A_UNUSED
Definition: localconsts.h:160
MouseButton ::T MouseButtonT
Definition: mousebutton.h:78
bool shortcut(InputEvent &event)
Definition: actions.cpp:35
std::string toString(T const &value)
converts any type to a string
Definition: catch.hpp:1774
Inventory * getInventory()
Definition: playerinfo.cpp:195
#define BLOCK_END(name)
Definition: perfomance.h:80
#define BLOCK_START(name)
Definition: perfomance.h:79
PopupMenu * popupMenu
Definition: popupmenu.cpp:103
Settings settings
Definition: settings.cpp:32
const bool Visible_false
Definition: visible.h:30