3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include "irrlichttypes_extrabloated.h"
29 #include "guiScrollBar.h"
31 class ISimpleTextureSource;
34 A table GUI element for GUIFormSpecMenu.
36 Sends a EGET_TABLE_CHANGED event to the parent when
37 an item is selected or double-clicked.
38 Call checkEvent() to get info.
40 Credits: The interface and implementation of this class are (very)
41 loosely based on the Irrlicht classes CGUITable and CGUIListBox.
42 CGUITable and CGUIListBox are licensed under the Irrlicht license;
43 they are Copyright (C) 2002-2012 Nikolaus Gebhardt
45 class GUITable : public gui::IGUIElement
49 Stores dynamic data that should be preserved
50 when updating a formspec
57 core::stringw keynav_buffer;
58 std::set<s32> opened_trees;
62 An option of the form <name>=<value>
69 Option(const std::string &name_, const std::string &value_) :
70 name(name_), value(value_)
76 A list of options that concern the entire table
78 typedef std::vector<Option> TableOptions;
86 std::vector<Option> options;
88 typedef std::vector<TableColumn> TableColumns;
90 GUITable(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id,
91 core::rect<s32> rectangle, ISimpleTextureSource *tsrc);
95 /* Split a string of the form "name=value" into name and value */
96 static Option splitOption(const std::string &str);
98 /* Set textlist-like options, columns and data */
99 void setTextList(const std::vector<std::string> &content, bool transparent);
101 /* Set generic table options, columns and content */
102 // Adds empty strings to end of content if there is an incomplete row
103 void setTable(const TableOptions &options, const TableColumns &columns,
104 std::vector<std::string> &content);
106 /* Clear the table */
109 /* Get info about last event (string such as "CHG:1:2") */
110 // Call this after EGET_TABLE_CHANGED
111 std::string checkEvent();
113 /* Get index of currently selected row (first=1; 0 if none selected) */
114 s32 getSelected() const;
116 /* Set currently selected row (first=1; 0 if none selected) */
117 // If given index is not visible at the moment, select its parent
118 // Autoscroll to make the selected row fully visible
119 void setSelected(s32 index);
121 /* Get selection, scroll position and opened (sub)trees */
122 DynamicData getDynamicData() const;
124 /* Set selection, scroll position and opened (sub)trees */
125 void setDynamicData(const DynamicData &dyndata);
127 /* Returns "GUITable" */
128 virtual const c8 *getTypeName() const;
130 /* Must be called when position or size changes */
131 virtual void updateAbsolutePosition();
133 /* Irrlicht draw method */
136 /* Irrlicht event handler */
137 virtual bool OnEvent(const SEvent &event);
154 ColumnType content_type;
167 // visible_index >= 0: is index of row in m_visible_rows
168 // visible_index == -1: parent open but other ancestor closed
169 // visible_index == -2: parent closed
174 ISimpleTextureSource *m_tsrc;
176 // Table content (including hidden rows)
177 std::vector<Row> m_rows;
178 // Table content (only visible; indices into m_rows)
179 std::vector<s32> m_visible_rows;
180 bool m_is_textlist = false;
181 bool m_has_tree_column = false;
184 s32 m_selected = -1; // index of row (1...n), or 0 if none selected
185 s32 m_sel_column = 0;
186 bool m_sel_doubleclick = false;
188 // Keyboard navigation stuff
189 u64 m_keynav_time = 0;
190 core::stringw m_keynav_buffer = L"";
192 // Drawing and geometry information
193 bool m_border = true;
194 video::SColor m_color = video::SColor(255, 255, 255, 255);
195 video::SColor m_background = video::SColor(255, 0, 0, 0);
196 video::SColor m_highlight = video::SColor(255, 70, 100, 50);
197 video::SColor m_highlight_text = video::SColor(255, 255, 255, 255);
199 gui::IGUIFont *m_font = nullptr;
200 GUIScrollBar *m_scrollbar = nullptr;
202 // Allocated strings and images
203 std::vector<core::stringw> m_strings;
204 std::vector<video::ITexture *> m_images;
205 std::map<std::string, s32> m_alloc_strings;
206 std::map<std::string, s32> m_alloc_images;
208 s32 allocString(const std::string &text);
209 s32 allocImage(const std::string &imagename);
210 void allocationComplete();
212 // Helper for draw() that draws a single cell
213 void drawCell(const Cell *cell, video::SColor color,
214 const core::rect<s32> &rowrect,
215 const core::rect<s32> &client_clip);
217 // Returns the i-th visible row (NULL if i is invalid)
218 const Row *getRow(s32 i) const;
220 // Key navigation helper
221 bool doesRowStartWith(const Row *row, const core::stringw &str) const;
223 // Returns the row at a given screen Y coordinate
224 // Returns index i such that m_rows[i] is valid (or -1 on error)
225 s32 getRowAt(s32 y, bool &really_hovering) const;
227 // Returns the cell at a given screen X coordinate within m_rows[row_i]
228 // Returns index j such that m_rows[row_i].cells[j] is valid
230 s32 getCellAt(s32 x, s32 row_i) const;
232 // Make the selected row fully visible
235 // Should be called when m_rowcount or m_rowheight changes
236 void updateScrollBar();
238 // Sends EET_GUI_EVENT / EGET_TABLE_CHANGED to parent
239 void sendTableEvent(s32 column, bool doubleclick);
241 // Functions that help deal with hidden rows
242 // The following functions take raw row indices (hidden rows not skipped)
243 void getOpenedTrees(std::set<s32> &opened_trees) const;
244 void setOpenedTrees(const std::set<s32> &opened_trees);
245 void openTree(s32 to_open);
246 void closeTree(s32 to_close);
247 // The following function takes a visible row index (hidden rows skipped)
248 // dir: -1 = left (close), 0 = auto (toggle), 1 = right (open)
249 void toggleVisibleTree(s32 row_i, int dir, bool move_selection);
251 // Aligns cell content in column according to alignment specification
252 // align = 0: left aligned, 1: centered, 2: right aligned, 3: inline
253 static void alignContent(Cell *cell, s32 xmax, s32 content_width, s32 align);