/impop

ImPop: Useful utils for Dear ImGui. Includes compile-time palette generation, ConfigMenu, DatePicker, OutlineText, PerfFooter

Primary LanguageC++MIT LicenseMIT

ImPop

This repository contains useful utilities for Dear ImGui and ImPlot.

ImPop should work in the same environments as ImGui. Care has been taken to use only basic C++11 facilities like constexpr. It avoids the use of the C++ standard library, except for the standalone header impop_ostream.h. Please report any build issues or incompatibilities.

Usage

ImPop consists of various (mostly-)independent header files. You can use just the files you need. Use it as a git submodule or copy individual files into your project.

  • ImPop::DatePicker
  • Lightweight config management
  • Color conversion and palette generation
  • ImPop::OutlineText
  • ImPop::PerfFooter: displays performance metrics

ImPop::DatePicker

The DatePicker from ImPlot, with a simplified interface that maintains the currently browsed (not yet selected) date within ImGui::Storage.

#include "impop_datepicker.h"

// ...

ImPlotTime t; // current value
ImPlotTime default_time = ImPlot::MakeTime(2024, 1, 1);
ImPlotTime min_time = ImPlot::MakeTime(2023, 1, 1);
ImPlotTime max_time = ImPop::LocTimeNow();

if (ImPop::DatePicker("date", &t, &default_time, &min_time, &max_time)) {
    // `t` has been updated
}

Lightweight config management

Uses ImGui's ini file for application state. Provides a dropdown menu to edit config variables.

app_config.h

Your custom config must be a POD struct containing only a sequence of ImPop::ConfigItem.

The given string will be used as a config key in the ini file, and also as the text for the menu.

#include "impop_config.h"

struct Config {
    ImPop::ConfigItem use_foo_bar{"Use Foo and Bar", true};
    ImPop::ConfigItem baz_coeff{"BazCoefficient (tm)", 3.14f};
    ImPop::ConfigItem count_quux{"Number of Quux", 7};
} config;

main.cpp

Initialize the config manager, and read any stored config values. Note that you must call ImPop::InitializeConfig(config) during a Frame, as it needs to access storage via the current window in the ImGui::Context. As you usually only want to load the ini file once on application startup, setup a frame before entering your main application loop.

#include "impop_config.h"
#include "myconfig.h"

// ...

    //ImGui_Impl*_NewFrame(); // Set the frame dimensions
    ImGui::NewFrame();        // Create a window for GetID()
    ImPop::InitializeConfig(config);
    ImGui::Render();

app.cpp

In your application code, read and write your config values directly from your struct Config:

#include "app_config.h"

if (config.use_foo_bar.bool_value) {
    // Do stuff with foo and bar
}

int cakes = config.count_quux.int_value * 3; // 3 cakes each

// Update the current estimate
config.baz_coeff.float_value = 3.1417;

app_gui.cpp

Display a menu for setting the config values:

#include "impop_config.h"

if (ImGui::BeginMenu("My Application")) {
    ImPop::ConfigMenu();
    ImGui::EndMenu();
}

Color conversion and palette generation

These are declared constexpr, so they can be used in constructor initializers, or defined statically and evaluated at compile-time.

#include "impop_color.h"

// ...


// Color 
static constexpr ImU32 red = IM_COL32(246, 70, 93, 255);
static constexpr ImU32 orange = IM_COL32(163, 129, 17, 255);
static constexpr ImU32 green = IM_COL32(46, 189, 133, 255);

// Compile-time color conversions
static constexpr ImVec4 red_vec4 = ImPop::ColorConvertU32ToFloat4(red);
static constexpr ImVec4 orange_vec4 = ImPop::ColorConvertU32ToFloat4(orange);
static constexpr ImVec4 green_vec4 = ImPop::ColorConvertU32ToFloat4(green);

// Compile-time palette generation
static constexpr size_t palette_size = 16;
static constexpr ImVec4 color_0 = red_vec4;
static constexpr ImVec4 color_1 = ImPop::AdjustBrightness(orange_vec4, 0.6);
static constexpr ImVec4 color_2 = ImPop::AdjustBrightness(ImPop::AdjustSaturation(green_vec4, 0.8), 0.8);
static constexpr std::array<ImU32, palette_size> traffic_lights =
        ImPop::GeneratePalette<palette_size>(color_0, color_1, color_2);

ImPop::OutlineText

White text with a black outline.

#include "impop_text.h"

//...

ImPop::OutlineText(draw_list, ImVec2(pos.x, pos.y), "Welcome %s", name);

ImPop::PerfFooter

This provides a handy footer displaying performance metrics:

  • Memory Usage: Arena, Free Space, Allocated Space
  • Memory Fragmentation
  • Current Framerate (FPS)
#include "impop_footer.h"

//...

ImPop::PerfFooter();

License

ImPop is licensed under the MIT License, see LICENSE.txt for more information.