summaryrefslogtreecommitdiffhomepage
path: root/main/menu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main/menu.cpp')
-rw-r--r--main/menu.cpp85
1 files changed, 10 insertions, 75 deletions
diff --git a/main/menu.cpp b/main/menu.cpp
index e5f291af..2874ad96 100644
--- a/main/menu.cpp
+++ b/main/menu.cpp
@@ -1,78 +1,11 @@
#include "app.hpp"
+#include "imgui-raii.hpp"
#include <Magnum/GL/Renderer.h>
#include <Magnum/ImGuiIntegration/Integration.h>
-#include <Magnum/Math/Color.h>
namespace floormat {
-struct raii_wrapper final
-{
- using F = void(*)(void);
- raii_wrapper(F fn) : dtor{fn} {}
- raii_wrapper() = default;
- ~raii_wrapper() { if (dtor) dtor(); }
- raii_wrapper(const raii_wrapper&) = delete;
- raii_wrapper& operator=(const raii_wrapper&) = delete;
- raii_wrapper& operator=(raii_wrapper&&) = delete;
- raii_wrapper(raii_wrapper&& other) noexcept : dtor{other.dtor} { other.dtor = nullptr; }
- inline operator bool() const noexcept { return dtor != nullptr; }
-
- F dtor = nullptr;
-};
-
-constexpr inline const auto* imgui_name = "floormat editor";
-
-[[nodiscard]] static raii_wrapper begin_window(int flags = 0) {
- if (ImGui::Begin(imgui_name, nullptr, flags))
- return {&ImGui::End};
- else
- return {};
-}
-
-[[nodiscard]] static raii_wrapper begin_main_menu() {
- if (ImGui::BeginMainMenuBar())
- return {&ImGui::EndMainMenuBar};
- else
- return {};
-}
-[[nodiscard]] static raii_wrapper begin_menu(Containers::StringView name, bool enabled = true) {
- if (ImGui::BeginMenu(name.data(), enabled))
- return {&ImGui::EndMenu};
- else
- return {};
-}
-
-[[nodiscard]] static raii_wrapper begin_list_box(Containers::StringView name, ImVec2 size = {}) {
- if (ImGui::BeginListBox(name.data(), size))
- return {&ImGui::EndListBox};
- else
- return {};
-}
-
-[[nodiscard]] static raii_wrapper tree_node(Containers::StringView name, ImGuiTreeNodeFlags_ flags = {}) {
- if (ImGui::TreeNodeEx(name.data(), flags))
- return {&ImGui::TreePop};
- else
- return {};
-}
-
-[[nodiscard]] static raii_wrapper push_style_var(ImGuiStyleVar_ var, Vector2 value)
-{
- ImGui::PushStyleVar(var, {value[0], value[1]});
- return {[]{ ImGui::PopStyleVar(); }};
-}
-
-[[nodiscard]] static raii_wrapper push_style_var(ImGuiStyleVar_ var, float value)
-{
- ImGui::PushStyleVar(var, value);
- return {[]{ ImGui::PopStyleVar(); }};
-}
-
-[[nodiscard]] static raii_wrapper push_style_color(ImGuiCol_ var, const Color4& value)
-{
- ImGui::PushStyleColor(var, {value[0], value[1], value[2], value[3]});
- return {[]{ ImGui::PopStyleColor(); }};
-}
+using namespace floormat::imgui;
void app::setup_menu()
{
@@ -90,7 +23,7 @@ void app::display_menu()
GL::Renderer::enable(GL::Renderer::Feature::ScissorTest);
}
-void app::draw_menu()
+void app::do_menu()
{
_imgui.newFrame();
float main_menu_height = 0;
@@ -109,13 +42,13 @@ void app::draw_menu()
if (auto b = begin_menu("Mode"))
{
ImGui::MenuItem("Select", "F1", _editor.mode() == editor_mode::select);
- ImGui::MenuItem("Floors", "F2", _editor.mode() == editor_mode::floors);
+ ImGui::MenuItem("Floor", "F2", _editor.mode() == editor_mode::floor);
ImGui::MenuItem("Walls", "F3", _editor.mode() == editor_mode::walls);
}
main_menu_height = ImGui::GetContentRegionMax().y;
}
- draw_menu_(_editor.floors(), main_menu_height);
+ draw_menu_(_editor.floor(), main_menu_height);
}
void app::draw_menu_(tile_type& type, float main_menu_height)
@@ -138,7 +71,8 @@ void app::draw_menu_(tile_type& type, float main_menu_height)
ImGui::SetNextWindowPos({0, main_menu_height+style.WindowPadding.y});
ImGui::SetNextFrameWantCaptureKeyboard(false);
ImGui::SetNextWindowSize({450, windowSize()[1] - main_menu_height - style.WindowPadding.y});
- if (auto b = begin_window(ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings))
+ if (const auto flags = ImGuiWindowFlags_(ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings);
+ auto b = begin_window({}, flags))
{
const float window_width = ImGui::GetWindowWidth() - 32;
@@ -163,7 +97,8 @@ void app::draw_menu_(tile_type& type, float main_menu_height)
ImGui::Text("%s", buf);
};
const std::size_t N = v->num_tiles().product();
- if (auto b = tree_node(k.data(), ImGuiTreeNodeFlags_(ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Framed)))
+ if (const auto flags = ImGuiTreeNodeFlags_(ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Framed);
+ auto b = tree_node(k.data(), flags))
{
click_event();
add_tile_count();
@@ -175,7 +110,7 @@ void app::draw_menu_(tile_type& type, float main_menu_height)
{
if (i > 0 && i % per_row == 0)
ImGui::NewLine();
- sprintf(buf, "##item_%zu", i);
+ snprintf(buf, sizeof(buf), "##item_%zu", i);
const auto uv = v->texcoords_for_id(i);
ImGui::ImageButton(buf, (void*)&v->texture(), {TILE_SIZE[0]/2, TILE_SIZE[1]/2},
{ uv[3][0], uv[3][1] }, { uv[0][0], uv[0][1] });