216 lines
6.8 KiB
C++
216 lines
6.8 KiB
C++
/* Copyright (c) 2024, Mobica Limited
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 the "License";
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <imgui.h>
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace vkb
|
|
{
|
|
class Drawer;
|
|
|
|
/**
|
|
* @brief Responsible for drawing new elements into the gui
|
|
*/
|
|
class Drawer
|
|
{
|
|
public:
|
|
enum class ColorOp
|
|
{
|
|
Edit,
|
|
Pick
|
|
};
|
|
|
|
Drawer() = default;
|
|
|
|
/**
|
|
* @brief Clears the dirty bit set
|
|
*/
|
|
void clear();
|
|
|
|
/**
|
|
* @brief Returns true if the drawer has been updated
|
|
*/
|
|
bool is_dirty();
|
|
|
|
/**
|
|
* @brief May be used to force drawer update
|
|
*/
|
|
void set_dirty(bool dirty);
|
|
|
|
/**
|
|
* @brief Adds a collapsable header item to the gui
|
|
* @param caption The text to display
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool header(const char *caption);
|
|
|
|
/**
|
|
* @brief Adds a checkbox to the gui
|
|
* @param caption The text to display
|
|
* @param value The boolean value to map the checkbox to
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool checkbox(const char *caption, bool *value);
|
|
|
|
/**
|
|
* @brief Adds a checkbox to the gui
|
|
* @param caption The text to display
|
|
* @param value The integer value to map the checkbox to
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool checkbox(const char *caption, int32_t *value);
|
|
|
|
/**
|
|
* @brief Adds a radio button to the gui
|
|
* @param caption The text to display
|
|
* @param selectedOption The pointer to the variable set using the radio button.
|
|
* @param elementOption Value set to the selectedOption when the button is selected.
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool radio_button(const char *caption, int32_t *selectedOption, const int32_t elementOption);
|
|
|
|
/**
|
|
* @brief Adds a number input field to the gui
|
|
* @param caption The text to display
|
|
* @param value The value to map to
|
|
* @param step The step increment
|
|
* @param precision The precision
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool input_float(const char *caption, float *value, float step, const char* precision);
|
|
|
|
/**
|
|
* @brief Adds a slide bar to the gui for floating points to the gui
|
|
* @param caption The text to display
|
|
* @param value The value to map to
|
|
* @param min The minimum value
|
|
* @param max The maximum value
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool slider_float(const char *caption, float *value, float min, float max);
|
|
|
|
/**
|
|
* @brief Adds a slide bar to the gui for integers to the gui
|
|
* @param caption The text to display
|
|
* @param value The value to map to
|
|
* @param min The minimum value
|
|
* @param max The maximum value
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool slider_int(const char *caption, int32_t *value, int32_t min, int32_t max);
|
|
|
|
/**
|
|
* @brief Adds a multiple choice drop box to the gui
|
|
* @param caption The text to display
|
|
* @param itemindex The item index to display
|
|
* @param items The items to display in the box
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool combo_box(const char *caption, int32_t *itemindex, std::vector<std::string> items);
|
|
|
|
/**
|
|
* @brief Adds a clickable button to the gui
|
|
* @param caption The text to display
|
|
* @returns True if adding item was successful
|
|
*/
|
|
bool button(const char *caption);
|
|
|
|
/**
|
|
* @brief Adds a label to the gui
|
|
* @param formatstr The format string
|
|
*/
|
|
void text(const char *formatstr, ...);
|
|
|
|
/**
|
|
* @brief Adds a color picker to the gui
|
|
* @param caption The text to display
|
|
* @param color Color channel array on which the picker works. It contains values ranging from 0 to 1.
|
|
* @param width Element width. Zero is a special value for the default element width.
|
|
* @param flags Flags to modify the appearance and behavior of the element.
|
|
*/
|
|
bool color_picker(const char *caption, std::array<float, 3> &color, float width = 0.0f, ImGuiColorEditFlags flags = 0);
|
|
|
|
/**
|
|
* @brief Adds a color picker to the gui
|
|
* @param caption The text to display
|
|
* @param color Color channel array on which the picker works. It contains values ranging from 0 to 1.
|
|
* @param width Element width. Zero is a special value for the default element width.
|
|
* @param flags Flags to modify the appearance and behavior of the element.
|
|
*/
|
|
bool color_picker(const char *caption, std::array<float, 4> &color, float width = 0.0f, ImGuiColorEditFlags flags = 0);
|
|
|
|
/**
|
|
* @brief Adds a color edit to the gui
|
|
* @param caption The text to display
|
|
* @param color Color channel array on which the picker works. It contains values ranging from 0 to 1.
|
|
* @param width Element width. Zero is a special value for the default element width.
|
|
* @param flags Flags to modify the appearance and behavior of the element.
|
|
*/
|
|
bool color_edit(const char *caption, std::array<float, 3> &color, float width = 0.0f, ImGuiColorEditFlags flags = 0);
|
|
|
|
/**
|
|
* @brief Adds a color edit to the gui
|
|
* @tparam OP Mode of the color element.
|
|
* @tparam N Color channel count. Must be 3 or 4.
|
|
* @param caption The text to display
|
|
* @param color Color channel array on which the picker works. It contains values ranging from 0 to 1.
|
|
* @param width Element width. Zero is a special value for the default element width.
|
|
* @param flags Flags to modify the appearance and behavior of the element.
|
|
*/
|
|
template <ColorOp OP, size_t N>
|
|
bool color_op(const std::string &caption, std::array<float, N> &color, float width = 0.0f, ImGuiColorEditFlags flags = 0)
|
|
{
|
|
static_assert((N == 3) || (N == 4), "The channel count must be 3 or 4.");
|
|
|
|
ImGui::PushItemWidth(width);
|
|
bool res = color_op_impl<OP, N>(caption.c_str(), color.data(), flags);
|
|
ImGui::PopItemWidth();
|
|
if (res)
|
|
dirty = true;
|
|
return res;
|
|
}
|
|
|
|
private:
|
|
template <ColorOp OP, size_t N>
|
|
inline bool color_op_impl(const char *caption, float *colors, ImGuiColorEditFlags flags)
|
|
{
|
|
assert(false);
|
|
return false;
|
|
}
|
|
|
|
bool dirty{false};
|
|
};
|
|
|
|
template <>
|
|
bool Drawer::color_op_impl<Drawer::ColorOp::Edit, 3>(const char *caption, float *colors, ImGuiColorEditFlags flags);
|
|
|
|
template <>
|
|
bool Drawer::color_op_impl<Drawer::ColorOp::Edit, 4>(const char *caption, float *colors, ImGuiColorEditFlags flags);
|
|
|
|
template <>
|
|
bool Drawer::color_op_impl<Drawer::ColorOp::Pick, 3>(const char *caption, float *colors, ImGuiColorEditFlags flags);
|
|
|
|
template <>
|
|
bool Drawer::color_op_impl<Drawer::ColorOp::Pick, 4>(const char *caption, float *colors, ImGuiColorEditFlags flags);
|
|
|
|
} // namespace vkb
|