summaryrefslogtreecommitdiff
path: root/scene/gui/item_list.h
blob: 59fa1d8270cd4ab98ea6a7f4059e3a8e7e62c4a6 (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
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
#ifndef ITEMLIST_H
#define ITEMLIST_H

#include "scene/gui/control.h"
#include "scene/gui/scroll_bar.h"

class ItemList : public Control {

	OBJ_TYPE( ItemList, Control );
public:

	enum IconMode {
		ICON_MODE_TOP,
		ICON_MODE_LEFT
	};

	enum SelectMode {
		SELECT_SINGLE,
		SELECT_MULTI
	};
private:
	struct Item {

		Ref<Texture> icon;
		Rect2i icon_region;
		Ref<Texture> tag_icon;
		String text;
		bool selectable;
		bool selected;
		bool disabled;
		Variant metadata;
		String tooltip;
		Color custom_bg;

		Rect2 rect_cache;

		Size2 get_icon_size() const;

		bool operator<(const Item& p_another) const { return text<p_another.text; }
	};

	int current;

	bool shape_changed;

	bool ensure_selected_visible;

	Vector<Item> items;
	Vector<int> separators;

	SelectMode select_mode;
	IconMode icon_mode;
	VScrollBar *scroll_bar;

	uint64_t search_time_msec;
	String search_string;

	int current_columns;
	int fixed_column_width;
	int max_text_lines;
	int max_columns;
	Size2 min_icon_size;
	Size2 max_icon_size;
	int defer_select_single;

	bool allow_rmb_select;

	void _scroll_changed(double);
	void _input_event(const InputEvent& p_event);
protected:

	void _notification(int p_what);
	static void _bind_methods();
public:


	void add_item(const String& p_item,const Ref<Texture>& p_texture=Ref<Texture>(),bool p_selectable=true);
	void add_icon_item(const Ref<Texture>& p_item,bool p_selectable=true);

	void set_item_text(int p_idx,const String& p_text);
	String get_item_text(int p_idx) const;

	void set_item_icon(int p_idx,const Ref<Texture>& p_icon);
	Ref<Texture> get_item_icon(int p_idx) const;

	void set_item_icon_region(int p_idx,const Rect2& p_region);
	Rect2 get_item_icon_region(int p_idx) const;

	void set_item_selectable(int p_idx,bool p_selectable);
	bool is_item_selectable(int p_idx) const;

	void set_item_disabled(int p_idx,bool p_disabled);
	bool is_item_disabled(int p_idx) const;

	void set_item_metadata(int p_idx,const Variant& p_metadata);
	Variant get_item_metadata(int p_idx) const;

	void set_item_tag_icon(int p_idx,const Ref<Texture>& p_tag_icon);
	Ref<Texture> get_item_tag_icon(int p_idx) const;

	void set_item_tooltip(int p_idx,const String& p_tooltip);
	String get_item_tooltip(int p_idx) const;

	void set_item_custom_bg_color(int p_idx,const Color& p_custom_bg_color);
	Color get_item_custom_bg_color(int p_idx) const;

	void select(int p_idx,bool p_single=true);
	void unselect(int p_idx);
	bool is_selected(int p_idx) const;

	void set_current(int p_current);
	int get_current() const;

	void move_item(int p_item,int p_to_pos);

	int get_item_count() const;
	void remove_item(int p_idx);

	void clear();

	void set_fixed_column_width(int p_size);
	int get_fixed_column_width() const;

	void set_max_text_lines(int p_amount);
	int get_max_text_lines() const;

	void set_max_columns(int p_amount);
	int get_max_columns() const;

	void set_select_mode(SelectMode p_mode);
	SelectMode get_select_mode() const;

	void set_icon_mode(IconMode p_mode);
	IconMode get_icon_mode() const;

	void set_min_icon_size(const Size2& p_size);
	Size2 get_min_icon_size() const;

	void set_max_icon_size(const Size2& p_size);
	Size2 get_max_icon_size() const;

	void set_allow_rmb_select(bool p_allow);
	bool get_allow_rmb_select() const;

	void ensure_current_is_visible();

	void sort_items_by_text();
	int find_metadata(const Variant& p_metadata) const;

	virtual String get_tooltip(const Point2& p_pos) const;
	int get_item_at_pos(const Point2& p_pos,bool p_exact=false) const;

	ItemList();
	~ItemList();
};

VARIANT_ENUM_CAST(ItemList::SelectMode);
VARIANT_ENUM_CAST(ItemList::IconMode);


#endif // ITEMLIST_H