Elaztek Developer Hub
Blamite Game Engine - blam!  00367.02.08.23.1815.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 
68  }
69 
70  if (ImGui::Button("OK"))
71  {
72  if (Blam::UI::GetUIRoot())
73  {
74  BlamUIWidget* new_widget = nullptr;
75 
76  if (selected_widget_type == BlamWidgetType::Basic_Rectangle)
77  {
78  new_widget = new BlamUIWidget_BasicRectangle(ui_root);
79  }
80  else if (selected_widget_type == BlamWidgetType::Group)
81  {
82  new_widget = new BlamUIWidget_Group(ui_root);
83  }
84  else if (selected_widget_type == BlamWidgetType::Text)
85  {
86  new_widget = new BlamUIWidget_Text(ui_root);
87  }
88  else
89  {
90  // unimplemented widget type
91  }
92 
93  if (new_widget)
94  {
95  ui_root->children.push_back(new_widget);
96  }
97  else
98  {
99  // failed to create new ui widget
100  }
101  }
102 
103  show_add_widget_dialog = false;
104  }
105 
106  ImGui::SameLine();
107 
108  if (ImGui::Button("Cancel"))
109  {
110  show_add_widget_dialog = false;
111  }
112 
113  ImGui::EndPopup();
114  }
115  }
116 
117  void Draw()
118  {
119  if (!ui_root)
120  {
122  }
123 
124  if (show)
125  {
126  std::string window_title = "";
127 
128  if (ui_root)
129  {
130  window_title = "Blam UI Editor (context: " + ui_root->display_name + ")";
131  }
132  else
133  {
134  window_title = "Blam UI Editor (no root available, root was nullptr)";
135  }
136 
137  if (ImGui::Begin(window_title.c_str(), &show))
138  {
139  if (ui_root)
140  {
141  if (ImGui::Button("add widget"))
142  {
143  show_add_widget_dialog = true;
144  }
145 
146  if (active_widget_index >= 0 && active_widget_index < ui_root->children.size())
147  {
148  ImGui::SameLine();
149 
150  if (ImGui::Button("remove widget"))
151  {
152  BlamUIWidget* widget_to_remove = ui_root->children.at(active_widget_index);
153  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
154  delete widget_to_remove;
155 
156  active_widget_index = -1;
157  }
158 
159  if ((active_widget_index - 1) >= 0)
160  {
161  ImGui::SameLine();
162 
163  if (ImGui::Button("move widget up"))
164  {
165  int new_pos = active_widget_index - 1;
166 
167  BlamUIWidget* widget_to_move = ui_root->children.at(active_widget_index);
168  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
169 
170  ui_root->children.insert(ui_root->children.begin() + new_pos, widget_to_move);
171 
172  active_widget_index--;
173  }
174  }
175 
176  if ((active_widget_index + 1) < ui_root->children.size())
177  {
178  ImGui::SameLine();
179 
180  if (ImGui::Button("move widget down"))
181  {
182  int new_pos = active_widget_index + 1;
183 
184  BlamUIWidget* widget_to_move = ui_root->children.at(active_widget_index);
185  ui_root->children.erase(ui_root->children.begin() + active_widget_index);
186 
187  ui_root->children.insert(ui_root->children.begin() + new_pos, widget_to_move);
188 
189  active_widget_index++;
190  }
191  }
192  }
193 
195 
196  ImGui::Columns(2);
197 
198  ImGui::SetColumnWidth(0, (200.0f * *Blam::Globals::GetGlobalAsFloat("ui_scale_factor")));
199 
201  {
202  for (int i = 0; i < ui_root->children.size(); i++)
203  {
204  BlamUIWidget* widget = ui_root->children.at(i);
205  std::string selectable_item_name = std::to_string(i) + ": " + widget->display_name;
206  bool is_active_item = false;
207 
208  if (i == active_widget_index)
209  {
210  is_active_item = true;
211  }
212 
213  if (ImGui::Selectable(selectable_item_name.c_str(), is_active_item))
214  {
215  active_widget_index = i;
216  }
217 
218  if (ImGui::IsItemHovered())
219  {
221  ImGui::PushTextWrapPos(450.0f);
222  ImGui::Text("widget information");
224 
225  std::string display_name = "display name: " + widget->display_name;
226  std::string description = "description: " + widget->description;
227  std::string index = "index: " + std::to_string(i);
228 
229  ImGui::Text(display_name.c_str());
230  ImGui::Text(description.c_str());
231  ImGui::Text(index.c_str());
232 
235  }
236  }
237 
239  }
240 
242 
243  if (active_widget_index < 0)
244  {
245  ImGui::Text("select a widget to modify");
246  }
247  else if (active_widget_index > ui_root->children.size())
248  {
249  std::string message = "selected index " + std::to_string(active_widget_index) +
250  " was too high (max is " + std::to_string(ui_root->children.size()) + ")";
251 
252  ImGui::Text(message.c_str());
253  }
254  else
255  {
256  BlamUIWidget* widget = ui_root->children.at(active_widget_index);
257 
258  if (ImGui::BeginTabBar("widget_editor_tabs"))
259  {
260  if (ImGui::BeginTabItem("widget information"))
261  {
262  std::string display_name = "display name: " + widget->display_name;
263  std::string description = "description: " + widget->description;
264  std::string index = "index: " + std::to_string(active_widget_index);
265 
266  ImGui::Text(display_name.c_str());
267  ImGui::Text(description.c_str());
268  ImGui::Text(index.c_str());
269 
271  }
272 
273  if (ImGui::BeginTabItem("widget properties"))
274  {
275  widget->ShowImGuiPropertyEditor();
276 
278  }
279 
280 
282  }
283  }
284  }
285  }
286  ImGui::End();
287 
288  if (show_add_widget_dialog)
289  {
291  }
292 
293  if (ui_root)
294  {
295  for (int i = 0; i < ui_root->children.size(); i++)
296  {
297  BlamUIWidget* widget = ui_root->children.at(i);
298 
299  if (widget->GetType() == BlamWidgetType::Group)
300  {
301  BlamUIWidget_Group* group_widget = (BlamUIWidget_Group*)widget;
302  group_widget->ShowImGuiEditorWindow();
303  }
304  }
305  }
306  }
307  }
308  };
309 }
ui.h
BlamUIWidget_Group
Definition: ui.h:113
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:70
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 rectangle.
ImGui::NextColumn
IMGUI_API void NextColumn()
Definition: imgui_widgets.cpp:7445
BlamUIWidget_Group::ShowImGuiEditorWindow
void ShowImGuiEditorWindow()
Definition: BlamUIWidget_Group.cpp:90
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:147
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:117
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:119
BlamUIWidget::display_name
std::string display_name
Definition: ui.h:82
globals.h
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
ImGui::Columns
IMGUI_API void Columns(int count=1, const char *id=NULL, bool border=true)
Definition: imgui_widgets.cpp:7572
BlamUIWidget_BasicRectangle
Definition: ui.h:131
Blam::DebugUI::Windows::BlamUIEditor
Class for the Blam UI Editor debug utility.
Definition: blam_ui_editor.hpp:13
BlamUIWidget
Definition: ui.h:69
ImGui::EndCombo
IMGUI_API void EndCombo()
Definition: imgui_widgets.cpp:1522
ui_root
BlamUIWidget_Group * ui_root
The UI root widget.
Definition: ui.cpp:10
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:83
ImGui::Separator
IMGUI_API void Separator()
Definition: imgui_widgets.cpp:1284
BlamWidgetType
BlamWidgetType
Enumerator listing possible UI widget types.
Definition: ui.h:53
Blam::DebugUI::Windows
Legacy namespace to contain data for the legacy ImGUI console.
Definition: ui.h:19
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:139