#include "bookmouse.hpp" #include #include #include #include namespace bookmouse { Bookmouse::Bookmouse() : m_sdlContext{}, m_mainWindow{m_sdlContext}, m_glContext{m_mainWindow}, m_imgui{m_glContext, m_sdlContext, m_mainWindow} { /* * Load Fonts * * - If no fonts are loaded, dear imgui will use the default * font. You can also load multiple fonts and use * ImGui::PushFont()/PopFont() to select them. * - AddFontFromFileTTF() will return the ImFont* so you can store * it if you need to select the font among multiple. * - If the file cannot be loaded, the function will return a * nullptr. Please handle those errors in your application * (e.g. use an assertion, or display an error and quit). * - The fonts will be rasterized at a given size (w/ * oversampling) and stored into a texture when calling * ImFontAtlas::Build()/GetTexDataAsXXXX(), which * ImGui_ImplXXXX_NewFrame below will call. * - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to * - use Freetype for higher quality font rendering. * - Read 'docs/FONTS.md' for more instructions and details. * - Remember that in C/C++ if you want to include a backslash \ * in a string literal you need to write a double backslash \\ ! * - Our Emscripten build process allows embedding fonts to be * - accessible at runtime from the "fonts/" folder. See * Makefile.emscripten for details. * auto imguiIO = m_imgui.getIO(); * imguiIO.Fonts->AddFontDefault(); * imguiIO.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); * imguiIO.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); * imguiIO.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); * imguiIO.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); * ImFont* font = imguiIO.Fonts->AddFontFromFileTTF( * "c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, * io.Fonts->GetGlyphRangesJapanese()); IM_ASSERT(font != nullptr); */ } int Bookmouse::run() { while (m_running) { auto event = pollEvent(); static_cast(event); constexpr uint32_t delayMillis = 10; if (SDL_GetWindowFlags(m_mainWindow.window()) & SDL_WINDOW_MINIMIZED) { SDL_Delay(delayMillis); continue; } m_imgui.startFrame(); updateState(); renderFrame(); } return 0; } SDL_Event Bookmouse::pollEvent() { /* * Poll and handle events (inputs, window resize, etc.) * You can read the io.WantCaptureMouse, io.WantCaptureKeyboard * flags to tell if dear imgui wants to use your inputs. * - When io.WantCaptureMouse is true, do not dispatch mouse input * data to your main application, or clear/overwrite your copy of * the mouse data. * - When io.WantCaptureKeyboard is true, do not dispatch keyboard * input data to your main application, or clear/overwrite your * copy of the keyboard data. * Generally you may always pass all inputs to dear imgui, and * hide them from your application based on those two flags. */ SDL_Event event{}; ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); while (SDL_PollEvent(&event)) { static_cast(m_imgui.processEvent(event)); if (event.type == SDL_QUIT) { m_running = false; } if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(m_mainWindow.window())) { m_running = false; } } return event; } void Bookmouse::updateState() { ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); auto stateResult = ImGui::Begin( "My First Tool", &m_running, // Is this right? ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_MenuBar); IM_ASSERT(stateResult); if (ImGui::BeginMenuBar()) { menuBar(); } // Edit a color stored as 4 floats fud::Array my_color{}; ImGui::ColorEdit4("Color", my_color.data()); // Generate samples and plot them float samples[100]; for (int idx = 0; idx < 100; idx++) { auto num = static_cast(idx); auto time = static_cast(ImGui::GetTime()); samples[idx] = sinf(num * 0.2f + time * 1.5f); } ImGui::PlotLines("Samples", samples, 100); // Display contents in a scrolling region ImGui::TextColored(ImVec4(1, 1, 0, 1), "Important Stuff"); ImGui::Text("%04d: Some text", 42); ImGui::End(); } constexpr const char* OpenDialogHandle = "Open File"; void Bookmouse::menuBar() { bool clickOpen = false; if (ImguiMenu menu{"File"}) { IM_ASSERT(menu); spdlog::debug("HERE {}", menu); if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ spdlog::debug("Open - m_openDialog was {}", m_openDialog); clickOpen = true; } if (ImGui::MenuItem("Close", "Ctrl+Q")) { m_running = false; } spdlog::debug("THERE"); } if (ImguiMenu menu{"Help"}) { IM_ASSERT(menu); if (ImGui::MenuItem("About")) { spdlog::debug("About"); } ImGui::EndMenu(); } ImGui::EndMenuBar(); if (clickOpen) { clickOpen = false; ImGui::OpenPopup(OpenDialogHandle); } openDialog(); } void Bookmouse::openDialog() { // if (ImGui::Begin("Another Window", &m_openDialog, 0)) { if (ImGui::BeginPopupModal(OpenDialogHandle)) { ImGui::Text("Hello from another window!"); if (ImGui::Button("Close Me")) { m_openDialog = false; ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); // ImGui::End(); } } void Bookmouse::renderFrame() { m_imgui.render(); } } // namespace bookmouse