Elaztek Developer Hub
Blamite Game Engine - blam!  00398.09.22.23.2015.blamite
The core library for the Blamite Game Engine.
blam_ui_editor.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../../debug_ui.h"
4 
7 
9 {
14  {
15  private:
16  int active_widget_index = -1;
17 
18  bool show_add_widget_dialog = false;
19  bool add_widget_to_group = false;
20  BlamWidgetType selected_widget_type = BlamWidgetType::Basic_Rectangle;
21  std::string widget_type_name = "rectangle";
22 
23  BlamUIWidget_Group* ui_root = nullptr;
24 
25  public:
27  {
29  }
30 
32  {
33  ui_root = _ui_root;
34  }
35 
37  {
38  ImGui::OpenPopup("Add Widget");
39  if (ImGui::BeginPopupModal("Add Widget", &show_add_widget_dialog))
40  {
41  if (ImGui::BeginCombo("widget type", widget_type_name.c_str()))
42  {
43  if (ImGui::Selectable("basic_rectangle"))
44  {
45  selected_widget_type = BlamWidgetType::Basic_Rectangle;
46  widget_type_name = "basic_rectangle";
47  }
48 
49  //if (ImGui::Selectable("basic_ellipse"))
50  //{
51  // selected_widget_type = BlamWidgetType::Basic_Ellipse;
52  // widget_type_name = "basic_ellipse";
53  //}
54 
55  if (ImGui::Selectable("group"))
56  {
57  selected_widget_type = BlamWidgetType::Group;
58  widget_type_name = "group";
59  }
60 
61  if (ImGui::Selectable("text"))
62  {
63  selected_widget_type = BlamWidgetType::Text;
64  widget_type_name = "text";
65  }
66 
67  if (ImGui::Selectable("ellipse"))
68  {
69  selected_widget_type = BlamWidgetType::Basic_Ellipse;
70  widget_type_name = "ellipse";
71  }
72 
73  if (ImGui::Selectable("triangle"))
74  {
75  selected_widget_type = BlamWidgetType::Basic_Triangle;
76  widget_type_name = "triangle";
77  }
78 
79  if (ImGui::Selectable("line"))
80  {
81  selected_widget_type = BlamWidgetType::Basic_Line;
82  widget_type_name = "line";
83  }
84 
85  if (ImGui::Selectable("vlayout"))
86  {
87  selected_widget_type = BlamWidgetType::Group_VLayout;
88  widget_type_name = "vlayout";
89  }
90 
91  if (ImGui::Selectable("hlayout"))
92  {
93  selected_widget_type = BlamWidgetType::Group_HLayout;
94  widget_type_name = "hlayout";
95  }
96 
98  }
99 
100  if (ImGui::Button("OK"))
101  {
102  if (Blam::UI::GetUIRoot())
103  {
104  BlamUIWidget* new_widget = nullptr;
105 
106  if (selected_widget_type == BlamWidgetType::Basic_Rectangle)
107  {
108  new_widget = new BlamUIWidget_BasicRectangle(ui_root);
109  }
110  else if (selected_widget_type == BlamWidgetType::Group)
111  {
112  new_widget = new BlamUIWidget_Group(ui_root);
113  }
114  else if (selected_widget_type == BlamWidgetType::Text)
115  {
116  new_widget = new BlamUIWidget_Text(ui_root);
117  }
118  else if (selected_widget_type == BlamWidgetType::Basic_Ellipse)
119  {
120  new_widget = new BlamUIWidget_BasicEllipse(ui_root);
121  }
122  else if (selected_widget_type == BlamWidgetType::Basic_Triangle)
123  {
124  new_widget = new BlamUIWidget_BasicTriangle(ui_root);
125  }
126  else if (selected_widget_type == BlamWidgetType::Basic_Line)
127  {
128  new_widget = new BlamUIWidget_BasicLine(ui_root);
129  }
130  else if (selected_widget_type == BlamWidgetType::Group_VLayout)
131  {
132  new_widget = new BlamUIWidget_VLayoutGroup(ui_root);
133  }
134  else if (selected_widget_type == BlamWidgetType::Group_HLayout)
135  {
136 
137  }
138  else
139  {
140  // unimplemented widget type
141  }
142 
143  if (new_widget)
144  {
145  ui_root->children.push_back(new_widget);
146  }
147  else
148  {
149  // failed to create new ui widget
150  }
151  }
152 
153  show_add_widget_dialog = false;
154  }
155 
156  ImGui::SameLine();
157 
158  if (ImGui::Button("Cancel"))
159  {
160  show_add_widget_dialog = false;
161  }
162 
163  ImGui::EndPopup();
164  }
165  }
166 
167  void Draw()
168  {
169  if (!ui_root)
170  {
172  }
173 
174  if (show)
175  {
176  std::string window_title = "";
177 
178  if (ui_root)
179  {
180  window_title = "Blam UI Editor (context: " + ui_root->display_name + ")";
181  }
182  else
183  {
184  window_title = "Blam UI Editor (no root available, root was nullptr)";
185  }
186 
187  if (ImGui::Begin(window_title.c_str(), &show))
188  {
189  if (ui_root)
190  {
191  if (ImGui::Button("add widget"))
192  {
193  show_add_widget_dialog = true;
194  }
195 
196  if (active_widget_index >= 0 && active_widget_index < ui_root->children.size())
197  {
198  ImGui::SameLine();
199 
200  if (ImGui::Button("remove widget"))
201  {
202  BlamUIWidget* widget_to_remove = ui_root->children.at(active_widget_index);
203  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
204  delete widget_to_remove;
205 
206  active_widget_index = -1;
207  }
208 
209  if ((active_widget_index - 1) >= 0)
210  {
211  ImGui::SameLine();
212 
213  if (ImGui::Button("move widget up"))
214  {
215  int new_pos = active_widget_index - 1;
216 
217  BlamUIWidget* widget_to_move = ui_root->children.at(active_widget_index);
218  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
219 
220  ui_root->children.insert(ui_root->children.begin() + new_pos, widget_to_move);
221 
222  active_widget_index--;
223  }
224  }
225 
226  if ((active_widget_index + 1) < ui_root->children.size())
227  {
228  ImGui::SameLine();
229 
230  if (ImGui::Button("move widget down"))
231  {
232  int new_pos = active_widget_index + 1;
233 
234  BlamUIWidget* widget_to_move = ui_root->children.at(active_widget_index);
235  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
236 
237  ui_root->children.insert(ui_root->children.begin() + new_pos, widget_to_move);
238 
239  active_widget_index++;
240  }
241  }
242  }
243 
245 
246  ImGui::Columns(2);
247 
248  ImGui::SetColumnWidth(0, (200.0f * *Blam::Globals::GetGlobalAsFloat("ui_scale_factor")));
249 
251  {
252  for (int i = 0; i < ui_root->children.size(); i++)
253  {
254  BlamUIWidget* widget = ui_root->children.at(i);
255  std::string selectable_item_name = std::to_string(i) + ": " + widget->display_name;
256  bool is_active_item = false;
257 
258  if (i == active_widget_index)
259  {
260  is_active_item = true;
261  }
262 
263  if (ImGui::Selectable(selectable_item_name.c_str(), is_active_item))
264  {
265  active_widget_index = i;
266  }
267 
268  if (ImGui::IsItemHovered())
269  {
271  ImGui::PushTextWrapPos(450.0f);
272  ImGui::Text("widget information");
274 
275  std::string display_name = "display name: " + widget->display_name;
276  std::string description = "description: " + widget->description;
277  std::string index = "index: " + std::to_string(i);
278 
279  ImGui::Text(display_name.c_str());
280  ImGui::Text(description.c_str());
281  ImGui::Text(index.c_str());
282 
285  }
286  }
287 
289  }
290 
292 
293  if (active_widget_index < 0)
294  {
295  ImGui::Text("select a widget to modify");
296  }
297  else if (active_widget_index > ui_root->children.size())
298  {
299  std::string message = "selected index " + std::to_string(active_widget_index) +
300  " was too high (max is " + std::to_string(ui_root->children.size()) + ")";
301 
302  ImGui::Text(message.c_str());
303  }
304  else
305  {
306  BlamUIWidget* widget = ui_root->children.at(active_widget_index);
307 
308  if (ImGui::BeginTabBar("widget_editor_tabs"))
309  {
310  if (ImGui::BeginTabItem("widget information"))
311  {
312  std::string display_name = "display name: " + widget->display_name;
313  std::string description = "description: " + widget->description;
314  std::string index = "index: " + std::to_string(active_widget_index);
315 
316  ImGui::Text(display_name.c_str());
317  ImGui::Text(description.c_str());
318  ImGui::Text(index.c_str());
319 
321  }
322 
323  if (ImGui::BeginTabItem("widget properties"))
324  {
325  widget->ShowImGuiPropertyEditor();
326 
328  }
329 
330 
332  }
333  }
334  }
335  }
336  ImGui::End();
337 
338  if (show_add_widget_dialog)
339  {
341  }
342 
343  if (ui_root)
344  {
345  for (int i = 0; i < ui_root->children.size(); i++)
346  {
347  BlamUIWidget* widget = ui_root->children.at(i);
348 
349  if (widget->GetType() == BlamWidgetType::Group || widget->GetType() == BlamWidgetType::Group_VLayout
350  || widget->GetType() == BlamWidgetType::Group_HLayout)
351  {
352  BlamUIWidget_Group* group_widget = (BlamUIWidget_Group*)widget;
353  group_widget->ShowImGuiEditorWindow();
354  }
355  }
356  }
357  }
358  }
359  };
360 }
ui.h
BlamUIWidget_BasicTriangle
Definition: ui.h:263
BlamUIWidget_Group
Definition: ui.h:141
ImGui::BeginTooltip
IMGUI_API void BeginTooltip()
Definition: imgui.cpp:7362
ImGui::EndPopup
IMGUI_API void EndPopup()
Definition: imgui.cpp:7675
Blam::DebugUI::Windows::BlamUIEditor::ShowAddPrimitivePopup
void ShowAddPrimitivePopup()
Definition: blam_ui_editor.hpp:36
Blam::UI::GetUIRoot
BLAM BlamUIWidget_Group * GetUIRoot()
Definition: ui.cpp:74
ImGui::BeginPopupModal
IMGUI_API bool BeginPopupModal(const char *name, bool *p_open=NULL, ImGuiWindowFlags flags=0)
Definition: imgui.cpp:7647
ImGui::ListBoxFooter
IMGUI_API void ListBoxFooter()
Definition: imgui_widgets.cpp:5668
BlamWidgetType::Text
@ Text
A text object, used to show text on-screen.
BlamWidgetType::Basic_Rectangle
@ Basic_Rectangle
A basic filled or outline rectangle.
BlamWidgetType::Basic_Ellipse
@ Basic_Ellipse
A basic filled or outline ellipse.
ImGui::NextColumn
IMGUI_API void NextColumn()
Definition: imgui_widgets.cpp:7445
BlamUIWidget_Group::ShowImGuiEditorWindow
void ShowImGuiEditorWindow()
Definition: group.cpp:185
BlamWidgetType::Group_VLayout
@ Group_VLayout
A group widget which displays all items in a vertical list.
Blam::Globals::GetGlobalAsFloat
BLAM float * GetGlobalAsFloat(std::string name)
Retrieves a global's value as a float.
Definition: globals.cpp:407
ImGui::End
IMGUI_API void End()
Definition: imgui.cpp:6016
ImGui::SetColumnWidth
IMGUI_API void SetColumnWidth(int column_index, float width)
Definition: imgui_widgets.cpp:7297
BlamUIWidget::GetType
BlamWidgetType GetType()
Definition: BlamUIWidget.cpp:180
ImGui::EndTabItem
IMGUI_API void EndTabItem()
Definition: imgui_widgets.cpp:6851
ImGui::SameLine
IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f)
Definition: imgui.cpp:7147
Blam::DebugUI::Windows::BlamUIEditor::BlamUIEditor
BlamUIEditor()
Definition: blam_ui_editor.hpp:26
Blam::DebugUI::Windows::BlamUIEditor::BlamUIEditor
BlamUIEditor(BlamUIWidget_Group *_ui_root)
Definition: blam_ui_editor.hpp:31
ImVec2
Definition: imgui.h:179
Blam::DebugUI::Windows::BlamUIEditor::Draw
void Draw()
Draws the contents of the group.
Definition: blam_ui_editor.hpp:167
ImGui::IsItemHovered
IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags=0)
Definition: imgui.cpp:3061
BlamUIWidget::ShowImGuiPropertyEditor
virtual void ShowImGuiPropertyEditor()
Definition: BlamUIWidget.cpp:57
ImGui::Begin
IMGUI_API bool Begin(const char *name, bool *p_open=NULL, ImGuiWindowFlags flags=0)
Definition: imgui.cpp:5397
BlamUIWidget_Group::children
std::vector< BlamUIWidget * > children
Definition: ui.h:148
BlamUIWidget::display_name
std::string display_name
Definition: ui.h:99
ImGui::OpenPopup
IMGUI_API void OpenPopup(const char *str_id)
Definition: imgui.cpp:7453
ImGui::GetColumnWidth
IMGUI_API float GetColumnWidth(int column_index=-1)
Definition: imgui_widgets.cpp:7262
ImGui::BeginTabBar
IMGUI_API bool BeginTabBar(const char *str_id, ImGuiTabBarFlags flags=0)
Definition: imgui_widgets.cpp:6366
ImGui::Text
IMGUI_API void Text(const char *fmt,...) IM_FMTARGS(1)
Definition: imgui_widgets.cpp:238
ImGui::PopTextWrapPos
IMGUI_API void PopTextWrapPos()
Definition: imgui.cpp:6313
ImGui::EndTooltip
IMGUI_API void EndTooltip()
Definition: imgui.cpp:7402
ImGui::BeginCombo
IMGUI_API bool BeginCombo(const char *label, const char *preview_value, ImGuiComboFlags flags=0)
Definition: imgui_widgets.cpp:1416
ImGui::Selectable
IMGUI_API bool Selectable(const char *label, bool selected=false, ImGuiSelectableFlags flags=0, const ImVec2 &size=ImVec2(0, 0))
Definition: imgui_widgets.cpp:5469
Blam::DebugUI::ImGUIDrawingGroup::show
bool show
Controls whether or not the group should be shown. May not be used in all groups.
Definition: debug_ui.h:362
Blam::DebugUI::ImGUIDrawingGroup
Class representing an ImGUI drawing group/draw list item.
Definition: debug_ui.h:359
globals.h
ImGui::Columns
IMGUI_API void Columns(int count=1, const char *id=NULL, bool border=true)
Definition: imgui_widgets.cpp:7572
BlamWidgetType::Basic_Triangle
@ Basic_Triangle
A basic filled or outline triangle.
BlamUIWidget_BasicRectangle
Definition: ui.h:184
Blam::DebugUI::Windows::BlamUIEditor
Class for the Blam UI Editor debug utility.
Definition: blam_ui_editor.hpp:13
BlamWidgetType::Group_HLayout
@ Group_HLayout
A group widget which displays all items in a horizontal list.
BlamUIWidget
Definition: ui.h:82
ImGui::EndCombo
IMGUI_API void EndCombo()
Definition: imgui_widgets.cpp:1522
ui_root
BlamUIWidget_Group * ui_root
The UI root widget.
Definition: ui.cpp:12
ImGui::EndTabBar
IMGUI_API void EndTabBar()
Definition: imgui_widgets.cpp:6432
BlamWidgetType::Group
@ Group
A group widget, which can be used to contain any number of other widgets.
BlamUIWidget::description
std::string description
Definition: ui.h:100
BlamUIWidget_VLayoutGroup
Definition: ui.h:166
BlamWidgetType::Basic_Line
@ Basic_Line
A basic line.
BlamUIWidget_BasicEllipse
Definition: ui.h:209
BlamUIWidget_BasicLine
Definition: ui.h:236
ImGui::Separator
IMGUI_API void Separator()
Definition: imgui_widgets.cpp:1284
BlamWidgetType
BlamWidgetType
Enumerator listing possible UI widget types.
Definition: ui.h:60
Blam::DebugUI::Windows
Legacy namespace to contain data for the legacy ImGUI console.
Definition: ui.h:26
ImGui::PushTextWrapPos
IMGUI_API void PushTextWrapPos(float wrap_local_pos_x=0.0f)
Definition: imgui.cpp:6306
ImGui::BeginTabItem
IMGUI_API bool BeginTabItem(const char *label, bool *p_open=NULL, ImGuiTabItemFlags flags=0)
Definition: imgui_widgets.cpp:6829
ImGui::ListBoxHeader
IMGUI_API bool ListBoxHeader(const char *label, const ImVec2 &size=ImVec2(0, 0))
Definition: imgui_widgets.cpp:5614
ImGui::Button
IMGUI_API bool Button(const char *label, const ImVec2 &size=ImVec2(0, 0))
Definition: imgui_widgets.cpp:644
BlamUIWidget_Text
Definition: ui.h:293