diff --git a/editor/Editor.cpp b/editor/Editor.cpp index 5cfc6da4c..e635f12d5 100644 --- a/editor/Editor.cpp +++ b/editor/Editor.cpp @@ -47,10 +47,9 @@ using namespace std; namespace { - float font_size = 18.0f; - float font_scale = 1.0f; - MenuBar* widget_menu_bar = nullptr; - Widget* widget_world = nullptr; + float font_size = 18.0f; + float font_scale = 1.0f; + Widget* widget_world = nullptr; void process_event(Spartan::sp_variant data) { @@ -104,8 +103,7 @@ Editor::Editor(const vector& args) m_widgets.emplace_back(make_shared(this)); m_widgets.emplace_back(make_shared(this)); widget_world = m_widgets.back().get(); - m_widgets.emplace_back(make_shared(this)); - widget_menu_bar = static_cast(m_widgets.back().get()); + MenuBar::Initialize(this); // allow imgui to get event's from the engine's event processing loop SP_SUBSCRIBE_TO_EVENT(Spartan::EventType::Sdl, SP_EVENT_HANDLER_VARIANT_STATIC(process_event)); @@ -156,6 +154,7 @@ void Editor::Tick() { widget->Tick(); } + MenuBar::Tick(); ImGui::End(); @@ -198,22 +197,15 @@ void Editor::BeginWindow() ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus; - ImGuiStyle& style = ImGui::GetStyle(); - - // set window position and size + // set window position and size - this keeps the MenuBar in the right place and at the right size const ImGuiViewport* viewport = ImGui::GetMainViewport(); - const float padding_offset = 2.0f * (style.FramePadding.y - MenuBar::GetPadding().y) - 1.0f; - const float offset_y = widget_menu_bar ? widget_menu_bar->GetHeight() + padding_offset : 0; - - ImGui::SetNextWindowPos(ImVec2(viewport->Pos.x, viewport->Pos.y - offset_y)); - ImGui::SetNextWindowSize(ImVec2(viewport->Size.x, viewport->Size.y - offset_y)); - ImGui::SetNextWindowViewport(viewport->ID); - + ImGui::SetNextWindowPos(ImVec2(viewport->Pos.x, viewport->Pos.y)); + ImGui::SetNextWindowSize(ImVec2(viewport->Size.x, viewport->Size.y)); + // set window style ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); - ImGui::SetNextWindowBgAlpha(0.0f); // begin window std::string name = "##main_window"; diff --git a/editor/Widgets/MenuBar.cpp b/editor/Widgets/MenuBar.cpp index 052b454a3..f38652392 100644 --- a/editor/Widgets/MenuBar.cpp +++ b/editor/Widgets/MenuBar.cpp @@ -243,7 +243,7 @@ namespace const ImGuiStyle& style = ImGui::GetStyle(); const float size_avail_y = 2.0f * style.FramePadding.y + button_size; - const float button_size_y = button_size + 2.0f * MenuBar::GetPadding().y; + const float button_size_y = button_size + 2.0f * MenuBar::GetPaddingY(); const float offset_y = (button_size_y - size_avail_y) * 0.5f; ImGui::SetCursorPosY(offset_y); @@ -262,14 +262,14 @@ namespace { const ImGuiViewport* viewport = ImGui::GetMainViewport(); const float size_avail_x = viewport->Size.x; - const float button_size_final = button_size * Spartan::Window::GetDpiScale() + MenuBar::GetPadding().x * 2.0f; + const float button_size_final = button_size * Spartan::Window::GetDpiScale() + MenuBar::GetPaddingX() * 2.0f; float num_buttons = 1.0f; float size_toolbar = num_buttons * button_size_final; float cursor_pos_x = (size_avail_x - size_toolbar) * 0.5f; // play button { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 18.0f, MenuBar::GetPadding().y - 5.0f }); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 18.0f, MenuBar::GetPaddingY() - 5.0f }); toolbar_button( IconType::Button_Play, "Play", @@ -282,7 +282,7 @@ namespace } // all the other buttons - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { MenuBar::GetPadding().x - 1.0f, MenuBar::GetPadding().y - 5.0f }); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { MenuBar::GetPaddingX() - 1.0f, MenuBar::GetPaddingY() - 5.0f }); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 4.0f , 0.0f }); { num_buttons = 6.0f; @@ -360,10 +360,8 @@ namespace } } -MenuBar::MenuBar(Editor* _editor) : Widget(_editor) +void MenuBar::Initialize(Editor* _editor) { - m_title = "menu_bar"; - m_is_window = false; editor = _editor; file_dialog = make_unique(true, FileDialog_Type_FileSelection, FileDialog_Op_Open, FileDialog_Filter_World); @@ -376,17 +374,24 @@ MenuBar::MenuBar(Editor* _editor) : Widget(_editor) Spartan::Engine::SetFlag(Spartan::EngineMode::Playing, false); } -void MenuBar::OnTick() +void MenuBar::Tick() { // menu - if (ImGui::BeginMainMenuBar()) { - buttons_menu::world(); - buttons_menu::view(); - buttons_menu::help(); - buttons_toolbar::tick(); + ImGuiStyle& style = ImGui::GetStyle(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, 8.0f)); - ImGui::EndMainMenuBar(); + if (ImGui::BeginMainMenuBar()) + { + buttons_menu::world(); + buttons_menu::view(); + buttons_menu::help(); + buttons_toolbar::tick(); + + ImGui::EndMainMenuBar(); + } + + ImGui::PopStyleVar(); } // windows diff --git a/editor/Widgets/MenuBar.h b/editor/Widgets/MenuBar.h index 685e3dee3..6438f2477 100644 --- a/editor/Widgets/MenuBar.h +++ b/editor/Widgets/MenuBar.h @@ -21,19 +21,19 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #pragma once -//= INCLUDES ====== -#include "Widget.h" -//================= +// FWD DECLARATIONS = +class Editor; +//=================== -class MenuBar : public Widget +class MenuBar { public: - MenuBar(Editor* editor); + static void Initialize(Editor* editor); + static void Tick(); - void OnTick() override; + static void ShowWorldSaveDialog(); + static void ShowWorldLoadDialog(); - void ShowWorldSaveDialog(); - void ShowWorldLoadDialog(); - - static ImVec2 GetPadding() { return { 14.0f, 8.0f }; } + static float GetPaddingX() { return 14.0f; } + static float GetPaddingY() { return 8.0f; } };