#include "bookmouse.hpp" #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{}; 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() { bool my_tool_active{true}; ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar); if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ } if (ImGui::MenuItem("Save", "Ctrl+S")) { /* Do stuff */ } if (ImGui::MenuItem("Close", "Ctrl+W")) { my_tool_active = false; } ImGui::EndMenu(); } ImGui::EndMenuBar(); } // 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::BeginChild("Scrolling"); for (int n = 0; n < 50; n++) ImGui::Text("%04d: Some text", n); ImGui::EndChild(); ImGui::End(); } void Bookmouse::renderFrame() { ImGui::Render(); const auto& imguiIO = m_imgui.getIO(); glViewport(0, 0, static_cast(imguiIO.DisplaySize.x), static_cast(imguiIO.DisplaySize.y)); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); glClearColor( clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); glClear(GL_COLOR_BUFFER_BIT); m_imgui.render(); } } // namespace bookmouse