Added text/highlight colors to text edit tool

This commit is contained in:
Yousef Khadadeh 2026-04-04 19:53:45 +03:00
parent 0087048a02
commit c85fdbb61f
11 changed files with 136 additions and 100 deletions

View file

@ -58,15 +58,21 @@ namespace ColorPickerShaders {
sk_sp<SkShader> get_alpha_bar_shader(const Vector3f& mainColor, float horizontalResolution);
}
struct ColorPickerData {
std::function<void()> onChange;
std::function<void()> onHold;
std::function<void()> onRelease;
};
template <typename T> class ColorPicker : public Element {
public:
ColorPicker(GUIManager& gui);
void layout(const Clay_ElementId& id, T* data, bool selectAlpha, const std::function<void()>& onChange);
void layout(const Clay_ElementId& id, T* data, bool selectAlpha, const ColorPickerData& config);
virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command, bool skiaAA);
void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) override;
void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) override;
private:
void update_color_picker_pos(const Vector2f& p);
void update_color_picker_pos(const Vector2f& p, bool justHeld);
float get_sv_selection_area_size();
Vector2f get_hue_bar_pos();
Vector2f get_hue_bar_dim();
@ -80,7 +86,7 @@ template <typename T> class ColorPicker : public Element {
T* data;
std::optional<T> oldData;
Vector3f savedHsv; // We save the HSV so that conversion doesnt ruin the UI
std::function<void()> onChange;
ColorPickerData config;
bool selectAlpha = false;
enum class HeldBar {
NONE,

View file

@ -6,14 +6,14 @@ namespace GUIStuff {
template <typename T> ColorPicker<T>::ColorPicker(GUIManager& gui): Element(gui) {}
template <typename T> void ColorPicker<T>::layout(const Clay_ElementId& id, T* data, bool selectAlpha, const std::function<void()>& onChange) {
template <typename T> void ColorPicker<T>::layout(const Clay_ElementId& id, T* data, bool selectAlpha, const ColorPickerData& config) {
this->data = data;
if(!oldData.has_value() || oldData.value() != *data) {
savedHsv = rgb_to_hsv<Vector3f, T>(*data);
oldData = *data;
}
this->selectAlpha = selectAlpha;
this->onChange = onChange;
this->config = config;
CLAY(id, {
.layout = {
@ -83,6 +83,7 @@ template <typename T> void ColorPicker<T>::clay_draw(SkCanvas* canvas, UpdateInp
}
template <typename T> void ColorPicker<T>::input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) {
HeldBar oldHeld = held;
held = HeldBar::NONE;
if(mouseHovering && button.button == InputManager::MouseButton::LEFT && button.down && boundingBox.has_value()) {
auto& bb = boundingBox.value();
@ -102,16 +103,21 @@ template <typename T> void ColorPicker<T>::input_mouse_button_callback(const Inp
}
}
}
update_color_picker_pos(button.pos);
if(oldHeld != HeldBar::NONE && held == HeldBar::NONE) {
gui.set_post_callback_func([&] {
if(config.onRelease) config.onRelease();
});
}
update_color_picker_pos(button.pos, true);
}
template <typename T> void ColorPicker<T>::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) {
update_color_picker_pos(motion.pos);
update_color_picker_pos(motion.pos, false);
}
template <typename T> void ColorPicker<T>::update_color_picker_pos(const Vector2f& p) {
template <typename T> void ColorPicker<T>::update_color_picker_pos(const Vector2f& p, bool justHeld) {
if(held != HeldBar::NONE && boundingBox.has_value()) {
gui.set_post_callback_func([&, p]() {
gui.set_post_callback_func([&, p, justHeld]() {
auto& bb = boundingBox.value();
switch(held) {
case HeldBar::NONE:
@ -122,7 +128,8 @@ template <typename T> void ColorPicker<T>::update_color_picker_pos(const Vector2
savedHsv.y() = newSv.x();
savedHsv.z() = 1.0f - newSv.y();
set_hsv(savedHsv);
if(onChange) onChange();
if(justHeld && config.onHold) config.onHold();
if(config.onChange) config.onChange();
break;
}
case HeldBar::HUE_HELD: {
@ -130,7 +137,8 @@ template <typename T> void ColorPicker<T>::update_color_picker_pos(const Vector2
Vector2f hueDim = get_hue_bar_dim();
savedHsv.x() = (1.0f - std::clamp((p.y() - huePos.y()) / hueDim.y(), 0.0f, 1.0f)) * 360.0f;
set_hsv(savedHsv);
if(onChange) onChange();
if(justHeld && config.onHold) config.onHold();
if(config.onChange) config.onChange();
break;
}
case HeldBar::ALPHA_HELD: {
@ -138,7 +146,8 @@ template <typename T> void ColorPicker<T>::update_color_picker_pos(const Vector2
Vector2f alphaDim = get_alpha_bar_dim();
(*data)[3] = std::clamp((p.x() - alphaPos.x()) / alphaDim.x(), 0.0f, 1.0f);
oldData = *data;
if(onChange) onChange();
if(justHeld && config.onHold) config.onHold();
if(config.onChange) config.onChange();
break;
}
}

View file

@ -6,6 +6,8 @@ namespace GUIStuff {
struct ColorPickerButtonData {
bool hasAlpha = true;
std::function<void()> onEdit;
std::function<void()> onSelect;
std::function<void()> onDeselect;
};
template <typename T> class ColorPickerButton : public Element {

View file

@ -22,7 +22,9 @@ template <typename T> void ColorPickerButton<T>::layout(const Clay_ElementId& id
ElementHelpers::top_to_bottom_window_popup_layout(gui, "Color Picker", CLAY_SIZING_FIT(300), CLAY_SIZING_FIT(0), [&, val, data = data](LayoutElement*) {
ElementHelpers::color_picker_items(gui, "c", val, {
.hasAlpha = data.hasAlpha,
.onEdit = data.onEdit
.onEdit = data.onEdit,
.onSelect = data.onSelect,
.onDeselect = data.onDeselect
});
}, {
.mouseButton = [&](LayoutElement* l, const InputManager::MouseButtonCallbackArgs& button) {