#include "backends/imgui_impl_sdl.h"
#include "backends/imgui_impl_opengl2.h"
-#include "config.h"
-
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
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
#include "backends/imgui_impl_sdl.h"
#include "backends/imgui_impl_opengl2.h"
-#include "config.h"
#include "logview.h"
#include "stmdsp.hpp"
void codeEditorInit();
void codeRenderMenu();
void codeRenderToolbar();
-void codeRenderWidgets();
+void codeRenderWidgets(const ImVec2& size);
void deviceRenderDraw();
void deviceRenderMenu();
void deviceRenderToolbar();
static ImFont *fontSans = nullptr;
static ImFont *fontMono = nullptr;
+template<bool first = false>
static void renderWindow();
int main(int, char **)
codeEditorInit();
fileInit();
+ renderWindow<true>();
+
while (1) {
constexpr std::chrono::duration<double> fpsDelay (1. / 60.);
const auto endTime = std::chrono::steady_clock::now() + fpsDelay;
logView.AddLog(str);
}
+template<bool first>
void renderWindow()
{
// Start the new window frame and render the menu bar.
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.