From 074c596605a9b64ad99f39d6edc37d31bbfb6536 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sun, 22 May 2022 15:40:12 -0400 Subject: [PATCH] window and panel resizing --- source/config.h | 8 ------ source/gui.cpp | 8 +++--- source/gui_code.cpp | 6 ++--- source/main.cpp | 59 ++++++++++++++++++++++++++------------------- 4 files changed, 40 insertions(+), 41 deletions(-) delete mode 100644 source/config.h diff --git a/source/config.h b/source/config.h deleted file mode 100644 index 879a0ea..0000000 --- a/source/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef STMDSP_CONFIG_H -#define STMDSP_CONFIG_H - -constexpr unsigned int WINDOW_WIDTH = 640; -constexpr unsigned int WINDOW_HEIGHT = 720; - -#endif - diff --git a/source/gui.cpp b/source/gui.cpp index 80120c4..0e67446 100644 --- a/source/gui.cpp +++ b/source/gui.cpp @@ -14,8 +14,6 @@ #include "backends/imgui_impl_sdl.h" #include "backends/imgui_impl_opengl2.h" -#include "config.h" - #include #include @@ -42,14 +40,16 @@ bool guiInitialize() SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); window = SDL_CreateWindow("stmdsp gui", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - WINDOW_WIDTH, WINDOW_HEIGHT, - SDL_WINDOW_OPENGL /*| SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI*/); + 550, 700, + SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE /*| SDL_WINDOW_ALLOW_HIGHDPI*/); if (window == nullptr) { puts("Error: Could not create the window!"); return false; } + SDL_SetWindowMinimumSize(window, 320, 320); + gl_context = SDL_GL_CreateContext(window); SDL_GL_MakeCurrent(window, gl_context); SDL_GL_SetSwapInterval(1); // Enable vsync diff --git a/source/gui_code.cpp b/source/gui_code.cpp index 19fa572..50fd0c8 100644 --- a/source/gui_code.cpp +++ b/source/gui_code.cpp @@ -14,8 +14,6 @@ #include "backends/imgui_impl_opengl2.h" #include "TextEditor.h" -#include "config.h" - #include extern void compileEditorCode(const std::string& code); @@ -52,9 +50,9 @@ void codeRenderToolbar() codeCompile(); } -void codeRenderWidgets() +void codeRenderWidgets(const ImVec2& size) { - editor.Render("code", {WINDOW_WIDTH - 15, 450}, true); + editor.Render("code", size, true); } static void codeCompile() diff --git a/source/main.cpp b/source/main.cpp index e8641bc..f913cf1 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -13,7 +13,6 @@ #include "backends/imgui_impl_sdl.h" #include "backends/imgui_impl_opengl2.h" -#include "config.h" #include "logview.h" #include "stmdsp.hpp" @@ -26,7 +25,7 @@ void codeEditorInit(); void codeRenderMenu(); void codeRenderToolbar(); -void codeRenderWidgets(); +void codeRenderWidgets(const ImVec2& size); void deviceRenderDraw(); void deviceRenderMenu(); void deviceRenderToolbar(); @@ -45,6 +44,7 @@ static LogView logView; static ImFont *fontSans = nullptr; static ImFont *fontMono = nullptr; +template static void renderWindow(); int main(int, char **) @@ -63,6 +63,8 @@ int main(int, char **) codeEditorInit(); fileInit(); + renderWindow(); + while (1) { constexpr std::chrono::duration fpsDelay (1. / 60.); const auto endTime = std::chrono::steady_clock::now() + fpsDelay; @@ -85,6 +87,7 @@ void log(const std::string& str) logView.AddLog(str); } +template void renderWindow() { // Start the new window frame and render the menu bar. @@ -99,35 +102,41 @@ void renderWindow() ImGui::EndMainMenuBar(); } - // Begin the main view which the controls will be drawn onto. - constexpr float LOGVIEW_HEIGHT = 200; - constexpr ImVec2 WINDOW_POS (0, 22); - constexpr ImVec2 WINDOW_SIZE (WINDOW_WIDTH, WINDOW_HEIGHT - 22 - LOGVIEW_HEIGHT); - ImGui::SetNextWindowPos(WINDOW_POS); - ImGui::SetNextWindowSize(WINDOW_SIZE); + if constexpr (first) { + ImGui::SetNextWindowSize({550, 440}); + } + + constexpr int MainTopMargin = 22; + const auto& displaySize = ImGui::GetIO().DisplaySize; + + ImGui::SetNextWindowPos({0, MainTopMargin}); + ImGui::SetNextWindowSizeConstraints({displaySize.x, 150}, {displaySize.x, displaySize.y - 150}); ImGui::Begin("main", nullptr, - ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoDecoration | + ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBringToFrontOnFocus); - // Render main controls (order is important). - { - ImGui::PushFont(fontSans); - codeRenderToolbar(); - deviceRenderToolbar(); - fileRenderDialog(); - deviceRenderWidgets(); - ImGui::PopFont(); - - ImGui::PushFont(fontMono); - codeRenderWidgets(); - ImGui::SetNextWindowPos({0, WINDOW_HEIGHT - LOGVIEW_HEIGHT}); - ImGui::SetNextWindowSize({WINDOW_WIDTH, LOGVIEW_HEIGHT}); - logView.Draw("log", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus); - ImGui::PopFont(); - } + const float mainWindowHeight = ImGui::GetWindowHeight(); + + ImGui::PushFont(fontSans); + codeRenderToolbar(); + deviceRenderToolbar(); + fileRenderDialog(); + deviceRenderWidgets(); + ImGui::PopFont(); + + ImGui::PushFont(fontMono); + codeRenderWidgets({displaySize.x - 16, mainWindowHeight - MainTopMargin - 24}); + ImGui::PopFont(); ImGui::End(); + // The log window is kept separate from "main" to support panel resizing. + ImGui::PushFont(fontMono); + ImGui::SetNextWindowPos({0, mainWindowHeight + MainTopMargin}); + ImGui::SetNextWindowSize({displaySize.x, displaySize.y - mainWindowHeight - MainTopMargin}); + logView.Draw("log", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGui::PopFont(); + deviceRenderDraw(); // Draw everything to the screen.