File: CList.h

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (184 lines) | stat: -rw-r--r-- 5,032 bytes parent folder | download
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*
 * CList.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */
#pragma once

#include "../widgets/Scrollable.h"
#include "../../lib/FunctionList.h"

VCMI_LIB_NAMESPACE_BEGIN

class CGHeroInstance;
class CGTownInstance;

VCMI_LIB_NAMESPACE_END

class CListBox;
class CButton;
class CAnimImage;

/// Base UI Element for hero\town lists
class CList : public Scrollable
{
protected:
	class CListItem : public CIntObject, public std::enable_shared_from_this<CListItem>
	{
		std::shared_ptr<CIntObject> selection;
	public:
		CList * parent;

		CListItem(CList * parent);
		~CListItem();

		void showPopupWindow(const Point & cursorPosition) override;
		void clickPressed(const Point & cursorPosition) override;
		void hover(bool on) override;
		void onSelect(bool on);

		/// create object with selection rectangle
		virtual std::shared_ptr<CIntObject> genSelection()=0;
		/// reaction on item selection (e.g. enable selection border)
		/// NOTE: item may be deleted in selected state
		virtual void select(bool on)=0;
		/// open item (town or hero screen)
		virtual void open()=0;
		/// show right-click tooltip
		virtual void showTooltip()=0;
		/// get hover text for status bar
		virtual std::string getHoverText()=0;
	};

private:
	const size_t size;
	void select(std::shared_ptr<CListItem> which);
	friend class CListItem;

	std::shared_ptr<CButton> scrollUp;
	std::shared_ptr<CButton> scrollDown;

	void scrollBy(int distance) override;
	void scrollPrev() override;
	void scrollNext() override;

protected:
	std::shared_ptr<CListBox> listBox;

	CList(int size, Rect widgetDimensions);

	void createList(Point firstItemPosition, Point itemPositionDelta, size_t listAmount);

	virtual std::shared_ptr<CIntObject> createItem(size_t index) = 0;

	/// should be called when list is invalidated
	void update();

public:
	//for selection\deselection
	std::shared_ptr<CListItem> selected;

	/// functions that will be called when selection changes
	CFunctionList<void()> onSelect;

	/// return index of currently selected element
	int getSelectedIndex();

	void setScrollUpButton(std::shared_ptr<CButton> button);
	void setScrollDownButton(std::shared_ptr<CButton> button);


	/// set of methods to switch selection
	void selectIndex(int which);
	void selectNext();
	void selectPrev();

	void showAll(Canvas & to) override;
};

/// List of heroes which is shown at the right of the adventure map screen
class CHeroList	: public CList
{
	/// Empty hero item used as placeholder for unused entries in list
	class CEmptyHeroItem : public CIntObject
	{
		std::shared_ptr<CAnimImage> movement;
		std::shared_ptr<CAnimImage> mana;
		std::shared_ptr<CPicture> portrait;
	public:
		CEmptyHeroItem();
	};

	class CHeroItem : public CListItem
	{
		std::shared_ptr<CAnimImage> movement;
		std::shared_ptr<CAnimImage> mana;
		std::shared_ptr<CAnimImage> portrait;
	public:
		const CGHeroInstance * const hero;

		CHeroItem(CHeroList * parent, const CGHeroInstance * hero);

		std::shared_ptr<CIntObject> genSelection() override;
		void update();
		void select(bool on) override;
		void open() override;
		void showTooltip() override;
		void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override;
		void keyPressed(EShortcut key) override;
		std::string getHoverText() override;
	};

	std::shared_ptr<CIntObject> createItem(size_t index);
public:
	CHeroList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount);

	/// Select specific hero and scroll if needed
	void select(const CGHeroInstance * hero = nullptr);

	/// Update hero. Will add or remove it from the list if needed
	void updateElement(const CGHeroInstance * hero);

	/// Update all heroes
	void updateWidget();
};

/// List of towns which is shown at the right of the adventure map screen or in the town screen
class CTownList	: public CList
{
	class CTownItem : public CListItem
	{
		std::shared_ptr<CAnimImage> picture;
	public:
		const CGTownInstance * const town;

		CTownItem(CTownList *parent, const CGTownInstance * town);

		std::shared_ptr<CIntObject> genSelection() override;
		void update();
		void select(bool on) override;
		void open() override;
		void showTooltip() override;
		void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override;
		void keyPressed(EShortcut key) override;
		std::string getHoverText() override;
	};

	std::shared_ptr<CIntObject> createItem(size_t index) override;
public:
	CTownList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount);

	/// Select specific town and scroll if needed
	void select(const CGTownInstance * town = nullptr);

	/// Update town. Will add or remove it from the list if needed
	void updateElement(const CGTownInstance * town);

	/// Update all towns
	void updateWidget();
};