From c85fdbb61fbbd58822b731e63b81a06f7255b78b Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 4 Apr 2026 19:53:45 +0300 Subject: [PATCH] Added text/highlight colors to text edit tool --- .../Tools/EditTools/BrushEditTool.cpp | 2 +- .../Tools/EditTools/EllipseDrawEditTool.cpp | 4 +- .../Tools/EditTools/RectDrawEditTool.cpp | 4 +- .../Tools/EditTools/TextBoxEditTool.cpp | 96 ++++++++----------- .../ColorPickerItemsHelpers.hpp | 14 +-- src/GUIStuff/Elements/ColorPicker.decl.hpp | 12 ++- src/GUIStuff/Elements/ColorPicker.impl.hpp | 27 ++++-- .../Elements/ColorPickerButton.decl.hpp | 2 + .../Elements/ColorPickerButton.impl.hpp | 4 +- src/Toolbar.cpp | 46 ++++++--- src/Toolbar.hpp | 25 +++-- 11 files changed, 136 insertions(+), 100 deletions(-) diff --git a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp index 16ddbc2..940e73a 100644 --- a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp @@ -23,7 +23,7 @@ void BrushEditTool::edit_gui() { gui.new_id("edit tool brush", [&] { text_label_centered(gui, "Edit Brush Stroke"); left_to_right_line_layout(gui, [&]() { - t.color_button_right("Outline Color", &a.d.color, commit_update_func); + t.color_button_right("Outline Color", &a.d.color, { .onChange = commit_update_func }); text_label(gui, "Outline Color"); }); }); diff --git a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp index c9729cf..3e10af7 100644 --- a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp @@ -38,14 +38,14 @@ void EllipseDrawEditTool::edit_gui() { }, commit_update_and_layout_func); if(a.d.fillStrokeMode == 0 || a.d.fillStrokeMode == 2) { left_to_right_line_layout(gui, [&] { - t.color_button_right("Fill color button", &a.d.fillColor, commit_update_func); + t.color_button_right("Fill color button", &a.d.fillColor, { .onChange = commit_update_func }); text_label(gui, "Fill Color"); }); } if(a.d.fillStrokeMode == 1 || a.d.fillStrokeMode == 2) { slider_scalar_field(gui, "relstrokewidth", "Outline Size", &a.d.strokeWidth, 3.0f, 40.0f, {.onEdit = commit_update_func}); left_to_right_line_layout(gui, [&] { - t.color_button_right("Outline color button", &a.d.strokeColor, commit_update_func); + t.color_button_right("Outline color button", &a.d.strokeColor, { .onChange = commit_update_func }); text_label(gui, "Outline Color"); }); } diff --git a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp index bb4b21b..622f13d 100644 --- a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp @@ -36,14 +36,14 @@ void RectDrawEditTool::edit_gui() { }, commit_update_and_layout_func); if(a.d.fillStrokeMode == 0 || a.d.fillStrokeMode == 2) { left_to_right_line_layout(gui, [&] { - t.color_button_right("Fill color button", &a.d.fillColor, commit_update_func); + t.color_button_right("Fill color button", &a.d.fillColor, { .onChange = commit_update_func }); text_label(gui, "Fill Color"); }); } if(a.d.fillStrokeMode == 1 || a.d.fillStrokeMode == 2) { slider_scalar_field(gui, "relstrokewidth", "Outline Size", &a.d.strokeWidth, 3.0f, 40.0f, { .onEdit = commit_update_func }); left_to_right_line_layout(gui, [&] { - t.color_button_right("Outline color button", &a.d.strokeColor, commit_update_func); + t.color_button_right("Outline color button", &a.d.strokeColor, { .onChange = commit_update_func }); text_label(gui, "Outline Color"); }); } diff --git a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp index e92d15a..4618ffb 100644 --- a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp @@ -148,62 +148,50 @@ void TextBoxEditTool::edit_gui() { .onDeselect = [&] { release_undo_data("Font Size"); } }); - //// Text color - //gui.left_to_right_line_layout([&]() { - // if(gui.color_button_big("Text Color", &newTextColor, &newTextColor == t.colorRight)) - // t.color_selector_right(&newTextColor == t.colorRight ? nullptr : &newTextColor); - // gui.text_label("Text Color"); - //}); - - //if(&newTextColor == t.colorRight) - // hold_undo_data("Text Color", a); - //else - // release_undo_data("Text Color"); - - //if((&newTextColor == t.colorRight) && t.isUpdatingColorRight) { - // currentMods[TextStyleModifier::ModifierType::COLOR] = std::make_shared(newTextColor); - // a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::COLOR]); - //} - - //// Highlight color - //gui.left_to_right_line_layout([&]() { - // if(gui.color_button_big("Highlight Color", &newHighlightColor, &newHighlightColor == t.colorRight)) { - // if(newHighlightColor.w() == 0.0f) { // Make highlight appear when the button is pressed - // newHighlightColor.w() = 1.0f; - // currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); - // add_undo_if_selecting_area(a, [&]() {a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]);}); - // } - // t.color_selector_right(&newHighlightColor == t.colorRight ? nullptr : &newHighlightColor); - // } - // if(newHighlightColor.w() != 0.0f) { - // if(gui.svg_icon_button("Remove Highlight Color", "data/icons/close.svg")) { - // newHighlightColor = {0.0f, 0.0f, 0.0f, 0.0f}; - // currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); - // add_undo_if_selecting_area(a, [&]() {a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]);}); - // } - // } - // gui.text_label("Highlight Color"); - //}); - - //if(&newHighlightColor == t.colorRight) - // hold_undo_data("Highlight Color", a); - //else - // release_undo_data("Highlight Color"); - - //if((&newHighlightColor == t.colorRight) && t.isUpdatingColorRight) { - // currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); - // a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]); - //} + left_to_right_line_layout(gui, [&]() { + t.color_button_right("Text Color", &newTextColor, { + .onChange = [&] { + currentMods[TextStyleModifier::ModifierType::COLOR] = std::make_shared(newTextColor); + a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::COLOR]); + commit_update_func(); + }, + .onSelect = [&] { hold_undo_data("Text Color", a); }, + .onDeselect = [&] { release_undo_data("Text Color"); } + }); + text_label(gui, "Text Color"); + }); + left_to_right_line_layout(gui, [&]() { + t.color_button_right("Highlight Color", &newHighlightColor, { + .onSelectorButtonClick = [&] { + if(newHighlightColor.w() == 0.0f) { + newHighlightColor.w() = 1.0f; + currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); + add_undo_if_selecting_area(a, [&]() {a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]);}); + commit_update_and_layout_func(); + } + }, + .onChange = [&] { + currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); + a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]); + commit_update_and_layout_func(); + }, + .onSelect = [&] { hold_undo_data("Highlight Color", a); }, + .onDeselect = [&] { release_undo_data("Highlight Color"); } + }); + if(newHighlightColor.w() != 0.0f) { + svg_icon_button(gui, "Remove Highlight Color", "data/icons/close.svg", { + .onClick = [&] { + newHighlightColor = {0.0f, 0.0f, 0.0f, 0.0f}; + currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR] = std::make_shared(newHighlightColor); + add_undo_if_selecting_area(a, [&]() {a.textBox->set_text_style_modifier_between(a.cursor->selectionBeginPos, a.cursor->selectionEndPos, currentMods[TextStyleModifier::ModifierType::HIGHLIGHT_COLOR]);}); + commit_update_and_layout_func(); + } + }); + } + text_label(gui, "Highlight Color"); + }); }); - - //if(a.textBox->inputChangedTextBox) - // set_styles_at_selection(a); - - //// NOTE: There should be a system that periodically sends updates even if no changes are made, since unreliable channels can drop update data - //bool oldInputChangedTextBox = a.textBox->inputChangedTextBox; - //a.textBox->inputChangedTextBox = false; - //return oldInputChangedTextBox; } void TextBoxEditTool::input_paste_callback(const CustomEvents::PasteEventData& paste) { diff --git a/src/GUIStuff/ElementHelpers/ColorPickerItemsHelpers.hpp b/src/GUIStuff/ElementHelpers/ColorPickerItemsHelpers.hpp index 4350c76..0894778 100644 --- a/src/GUIStuff/ElementHelpers/ColorPickerItemsHelpers.hpp +++ b/src/GUIStuff/ElementHelpers/ColorPickerItemsHelpers.hpp @@ -8,6 +8,8 @@ namespace GUIStuff { namespace ElementHelpers { struct ColorPickerItemsOptions { bool hasAlpha = true; std::function onEdit; + std::function onSelect; + std::function onDeselect; }; template void color_picker_items(GUIManager& gui, const char* id, T* val, const ColorPickerItemsOptions& options = {}) { @@ -16,22 +18,22 @@ template void color_picker_items(GUIManager& gui, const char* id, T if(oE) oE(); gui.set_to_layout(); }; - gui.element>("c", val, options.hasAlpha, fullOnEdit); + gui.element>("c", val, options.hasAlpha, ColorPickerData{ .onChange = fullOnEdit, .onHold = options.onSelect, .onRelease = options.onDeselect }); left_to_right_line_layout(gui, [&]() { text_label(gui, "R"); - input_color_component_255(gui, "r", &(*val)[0], { .onEdit = fullOnEdit }); + input_color_component_255(gui, "r", &(*val)[0], { .onEdit = fullOnEdit, .onSelect = options.onSelect, .onDeselect = options.onDeselect }); text_label(gui, "G"); - input_color_component_255(gui, "g", &(*val)[1], { .onEdit = fullOnEdit }); + input_color_component_255(gui, "g", &(*val)[1], { .onEdit = fullOnEdit, .onSelect = options.onSelect, .onDeselect = options.onDeselect }); text_label(gui, "B"); - input_color_component_255(gui, "b", &(*val)[2], { .onEdit = fullOnEdit }); + input_color_component_255(gui, "b", &(*val)[2], { .onEdit = fullOnEdit, .onSelect = options.onSelect, .onDeselect = options.onDeselect }); if(options.hasAlpha) { text_label(gui, "A"); - input_color_component_255(gui, "a", &(*val)[3], { .onEdit = fullOnEdit }); + input_color_component_255(gui, "a", &(*val)[3], { .onEdit = fullOnEdit, .onSelect = options.onSelect, .onDeselect = options.onDeselect }); } }); left_to_right_line_layout(gui, [&]() { text_label(gui, "Hex"); - input_color_hex(gui, "h", val, { .hasAlpha = options.hasAlpha, .onEdit = fullOnEdit }); + input_color_hex(gui, "h", val, { .hasAlpha = options.hasAlpha, .onEdit = fullOnEdit, .onSelect = options.onSelect, .onDeselect = options.onDeselect }); }); }); } diff --git a/src/GUIStuff/Elements/ColorPicker.decl.hpp b/src/GUIStuff/Elements/ColorPicker.decl.hpp index 4608eba..d6eda39 100644 --- a/src/GUIStuff/Elements/ColorPicker.decl.hpp +++ b/src/GUIStuff/Elements/ColorPicker.decl.hpp @@ -58,15 +58,21 @@ namespace ColorPickerShaders { sk_sp get_alpha_bar_shader(const Vector3f& mainColor, float horizontalResolution); } +struct ColorPickerData { + std::function onChange; + std::function onHold; + std::function onRelease; +}; + template class ColorPicker : public Element { public: ColorPicker(GUIManager& gui); - void layout(const Clay_ElementId& id, T* data, bool selectAlpha, const std::function& 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 class ColorPicker : public Element { T* data; std::optional oldData; Vector3f savedHsv; // We save the HSV so that conversion doesnt ruin the UI - std::function onChange; + ColorPickerData config; bool selectAlpha = false; enum class HeldBar { NONE, diff --git a/src/GUIStuff/Elements/ColorPicker.impl.hpp b/src/GUIStuff/Elements/ColorPicker.impl.hpp index 0709735..e1b2a05 100644 --- a/src/GUIStuff/Elements/ColorPicker.impl.hpp +++ b/src/GUIStuff/Elements/ColorPicker.impl.hpp @@ -6,14 +6,14 @@ namespace GUIStuff { template ColorPicker::ColorPicker(GUIManager& gui): Element(gui) {} -template void ColorPicker::layout(const Clay_ElementId& id, T* data, bool selectAlpha, const std::function& onChange) { +template void ColorPicker::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(*data); oldData = *data; } this->selectAlpha = selectAlpha; - this->onChange = onChange; + this->config = config; CLAY(id, { .layout = { @@ -83,6 +83,7 @@ template void ColorPicker::clay_draw(SkCanvas* canvas, UpdateInp } template void ColorPicker::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 void ColorPicker::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 void ColorPicker::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { - update_color_picker_pos(motion.pos); + update_color_picker_pos(motion.pos, false); } -template void ColorPicker::update_color_picker_pos(const Vector2f& p) { +template void ColorPicker::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 void ColorPicker::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 void ColorPicker::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 void ColorPicker::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; } } diff --git a/src/GUIStuff/Elements/ColorPickerButton.decl.hpp b/src/GUIStuff/Elements/ColorPickerButton.decl.hpp index 036f85a..476efd9 100644 --- a/src/GUIStuff/Elements/ColorPickerButton.decl.hpp +++ b/src/GUIStuff/Elements/ColorPickerButton.decl.hpp @@ -6,6 +6,8 @@ namespace GUIStuff { struct ColorPickerButtonData { bool hasAlpha = true; std::function onEdit; + std::function onSelect; + std::function onDeselect; }; template class ColorPickerButton : public Element { diff --git a/src/GUIStuff/Elements/ColorPickerButton.impl.hpp b/src/GUIStuff/Elements/ColorPickerButton.impl.hpp index bf4a871..610590d 100644 --- a/src/GUIStuff/Elements/ColorPickerButton.impl.hpp +++ b/src/GUIStuff/Elements/ColorPickerButton.impl.hpp @@ -22,7 +22,9 @@ template void ColorPickerButton::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) { diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index ba5eb83..f3884de 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -160,40 +160,50 @@ std::filesystem::path& Toolbar::file_selector_path() { return filePicker.currentSearchPath; } -void Toolbar::color_button_left(const char* id, Vector4f* color, const std::function& onChange) { +void Toolbar::color_button_left(const char* id, Vector4f* color, const ColorSelectorButtonData& colorSelectorData) { auto& gui = main.g.gui; color_button(gui, id, color, { .isSelected = colorLeft == color, - .onClick = [&, onChange, color] { - color_selector_left(color, onChange); + .onClick = [&, colorSelectorData, color] { + if(colorSelectorData.onSelectorButtonClick) colorSelectorData.onSelectorButtonClick(); + color_selector_left(color, { + .onChange = colorSelectorData.onChange, + .onSelect = colorSelectorData.onSelect, + .onDeselect = colorSelectorData.onDeselect, + }); } }); } -void Toolbar::color_button_right(const char* id, Vector4f* color, const std::function& onChange) { +void Toolbar::color_button_right(const char* id, Vector4f* color, const ColorSelectorButtonData& colorSelectorData) { auto& gui = main.g.gui; color_button(gui, id, color, { .isSelected = colorRight == color, - .onClick = [&, onChange, color] { - color_selector_right(color, onChange); + .onClick = [&, colorSelectorData, color] { + if(colorSelectorData.onSelectorButtonClick) colorSelectorData.onSelectorButtonClick(); + color_selector_right(color, { + .onChange = colorSelectorData.onChange, + .onSelect = colorSelectorData.onSelect, + .onDeselect = colorSelectorData.onDeselect, + }); } }); } -void Toolbar::color_selector_left(Vector4f* color, const std::function& onChange) { +void Toolbar::color_selector_left(Vector4f* color, const ColorSelectorData& colorSelectorData) { if(colorLeft != color) { colorLeftJustEnabled = color; - onColorLeftChange = onChange; + colorLeftData = colorSelectorData; } else colorLeftJustDisabled = true; main.g.gui.set_to_layout(); } -void Toolbar::color_selector_right(Vector4f* color, const std::function& onChange) { +void Toolbar::color_selector_right(Vector4f* color, const ColorSelectorData& colorSelectorData) { if(colorRight != color) { colorRightJustEnabled = color; - onColorRightChange = onChange; + colorRightData = colorSelectorData; } else colorRightJustDisabled = true; @@ -1198,21 +1208,21 @@ void Toolbar::drawing_program_gui() { colorRight = nullptr; if(colorLeft) - color_picker_window("Drawing program gui color picker left", &colorLeft, &colorLeftJustDisabled, onColorLeftChange); + color_picker_window("Drawing program gui color picker left", &colorLeft, &colorLeftJustDisabled, colorLeftData); CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)} } }) {} if(colorRight) - color_picker_window("Drawing program gui color picker right", &colorRight, &colorRightJustDisabled, onColorRightChange); + color_picker_window("Drawing program gui color picker right", &colorRight, &colorRightJustDisabled, colorRightData); main.world->drawProg.tool_options_gui(); main.world->drawProg.right_click_popup_gui(); } } -void Toolbar::color_picker_window(const char* id, Vector4f** color, bool* colorJustDisabled, const std::function& onChange) { +void Toolbar::color_picker_window(const char* id, Vector4f** color, bool* colorJustDisabled, const ColorSelectorData& colorSelectorData) { auto& gui = main.g.gui; CLAY_AUTO_ID({ @@ -1233,9 +1243,15 @@ void Toolbar::color_picker_window(const char* id, Vector4f** color, bool* colorJ .cornerRadius = CLAY_CORNER_RADIUS(gui.io.theme->windowCorners1) }) { color_picker_items(gui, "colorpicker", *color, { - .onEdit = onChange + .onEdit = colorSelectorData.onChange, + .onSelect = colorSelectorData.onSelect, + .onDeselect = colorSelectorData.onDeselect, + }); + color_palette("colorpickerpalette", *color, [colorSelectorData] { + if(colorSelectorData.onSelect) colorSelectorData.onSelect(); + if(colorSelectorData.onChange) colorSelectorData.onChange(); + if(colorSelectorData.onDeselect) colorSelectorData.onDeselect(); }); - color_palette("colorpickerpalette", *color, onChange); } }, LayoutElement::Callbacks{ .mouseButton = [&, colorJustDisabled](LayoutElement* l, const InputManager::MouseButtonCallbackArgs& button) { diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index bc01953..f1834a1 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -42,10 +42,21 @@ class Toolbar { Toolbar(MainProgram& initMain); void layout_run(); - void color_selector_left(Vector4f* color, const std::function& onChange = nullptr); - void color_selector_right(Vector4f* color, const std::function& onChange = nullptr); - void color_button_left(const char* id, Vector4f* color, const std::function& onChange = nullptr); - void color_button_right(const char* id, Vector4f* color, const std::function& onChange = nullptr); + struct ColorSelectorData { + std::function onChange; + std::function onSelect; + std::function onDeselect; + }; + struct ColorSelectorButtonData { + std::function onSelectorButtonClick; + std::function onChange; + std::function onSelect; + std::function onDeselect; + }; + void color_selector_left(Vector4f* color, const ColorSelectorData& colorSelectorData = {}); + void color_selector_right(Vector4f* color, const ColorSelectorData& colorSelectorData = {}); + void color_button_left(const char* id, Vector4f* color, const ColorSelectorButtonData& colorSelectorData = {}); + void color_button_right(const char* id, Vector4f* color, const ColorSelectorButtonData& colorSelectorData = {}); void paint_popup(Vector2f popupPos); @@ -62,12 +73,12 @@ class Toolbar { Vector4f* colorLeft = nullptr; bool colorLeftJustDisabled = false; Vector4f* colorLeftJustEnabled = nullptr; - std::function onColorLeftChange; + ColorSelectorData colorLeftData; Vector4f* colorRight = nullptr; bool colorRightJustDisabled = false; Vector4f* colorRightJustEnabled = nullptr; - std::function onColorRightChange; + ColorSelectorData colorRightData; bool app_close_requested(); private: @@ -89,7 +100,7 @@ class Toolbar { void file_picker_gui_done(); void file_picker_gui(); void performance_metrics(); - void color_picker_window(const char* id, Vector4f** color, bool* colorJustDisabled, const std::function& onChange); + void color_picker_window(const char* id, Vector4f** color, bool* colorJustDisabled, const ColorSelectorData& colorSelectorData); void color_palette(const char* id, Vector4f* color, const std::function& onChange); void open_world_file(bool isClient, const std::string& netSource, const std::string& serverLocalID); void load_default_palette();