Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarItemGridWidget.hpp
blob: 11a78b3fef6a86091e37dd63a9d4586feb9086c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#pragma once

#include "StarItemBag.hpp"
#include "StarWidget.hpp"
#include "StarItemSlotWidget.hpp"
#include "StarItem.hpp"

namespace Star {

STAR_CLASS(ItemGridWidget);

class ItemGridWidget : public Widget {
public:
  ItemGridWidget(ItemBagConstPtr bag, Vec2I const& dimensions, Vec2I const& spacing, String const& backingImage, unsigned bagOffset);
  ItemGridWidget(ItemBagConstPtr bag, Vec2I const& dimensions, Vec2I const& rowSpacing, Vec2I const& columnSpacing, String const& backingImage, unsigned bagOffset);

  ItemBagConstPtr bag() const;

  ItemPtr itemAt(Vec2I const& position) const;
  ItemPtr itemAt(size_t index) const;
  ItemPtr selectedItem() const;

  ItemSlotWidgetPtr itemWidgetAt(Vec2I const& position) const;
  ItemSlotWidgetPtr itemWidgetAt(size_t index) const;

  // Returns the dimensions of the item grid
  Vec2I dimensions() const;

  // Returns the number of item slots in the grid (dimensions.x() * dimensions.y())
  size_t itemSlots() const;

  // Returns the size of the underlying bag.
  size_t bagSize() const;

  // Returns the min of bagSize() and itemSlots()
  size_t effectiveSize() const;

  size_t bagLocationAt(Vec2I const& position) const;
  Vec2I positionOfSlot(size_t slotNumber);

  bool sendEvent(InputEvent const& event) override;
  void setCallback(WidgetCallbackFunc callback);
  void setRightClickCallback(WidgetCallbackFunc callback);
  void setMiddleClickCallback(WidgetCallbackFunc callback);
  void setItemBag(ItemBagConstPtr bag);
  void setProgress(float progress);

  size_t selectedIndex() const;

  void updateAllItemSlots();

  // Item states, keeping track of new items
  void updateItemState();
  void clearChangedSlots();
  bool slotsChanged();
  void indicateChangedSlots();

  void setHighlightEmpty(bool highlight);

  void setBackingImageAffinity(bool full, bool empty);
  void showDurability(bool show);

  virtual RectI getScissorRect() const override;

protected:
  void renderImpl() override;
  HashSet<ItemDescriptor> uniqueItemState();
  List<String> slotItemNames();

private:
  Vec2I locOfItemSlot(unsigned slot) const;

  ItemBagConstPtr m_bag;
  List<ItemSlotWidgetPtr> m_slots;
  unsigned m_bagOffset;
  Vec2I m_dimensions;
  Vec2I m_rowSpacing;
  Vec2I m_columnSpacing;

  List<String> m_itemNames;
  Set<size_t> m_changedSlots;

  RectI m_itemDraggableArea;

  String m_backingImage;
  bool m_drawBackingImageWhenFull;
  bool m_drawBackingImageWhenEmpty;
  bool m_showDurability;

  float m_progress;

  bool m_highlightEmpty;

  unsigned m_selectedIndex;
  WidgetCallbackFunc m_callback;
  WidgetCallbackFunc m_rightClickCallback;
  WidgetCallbackFunc m_middleClickCallback;
};

}