#pragma once #include "ColorPicker.decl.hpp" #include "../GUIManager.hpp" #include "Helpers/ConvertVec.hpp" #include "SaturationValueSquare.hpp" #include "HueVerticalSlider.hpp" #include "AlphaSlider.hpp" namespace GUIStuff { template ColorPicker::ColorPicker(GUIManager& gui): Element(gui) {} template void ColorPicker::layout(const Clay_ElementId& id, T* data, bool selectAlpha, const ColorPickerData& conf) { this->data = data; if(!oldData.has_value() || oldData.value() != *data) { savedHsv = rgb_to_hsv(*data); oldData = *data; } config = conf; auto onChange = [&] { set_rgb_from_hsv(savedHsv); if(config.onChange) config.onChange(); }; if(selectAlpha) { CLAY(id, { .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0) }, .childGap = BAR_GAP, .layoutDirection = CLAY_TOP_TO_BOTTOM } }) { CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}, .childGap = BAR_GAP, .layoutDirection = CLAY_LEFT_TO_RIGHT }, }) { gui.element("sv square", SaturationValueSquareData{ .saturation = &savedHsv.y(), .value = &savedHsv.z(), .hue = &savedHsv.x(), .onChange = onChange, .onHold = config.onHold, .onRelease = config.onRelease }); CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIT(BAR_WIDTH), .height = CLAY_SIZING_GROW(0)} }, }) { gui.element("hue slider", HueVerticalSliderData{ .hue = &savedHsv.x(), .onChange = onChange, .onHold = config.onHold, .onRelease = config.onRelease }); } } CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIT(BAR_WIDTH)} }, }) { gui.element("alpha slider", AlphaSliderData{ .alpha = &(*data)[3], .r = &(*data)[0], .g = &(*data)[1], .b = &(*data)[2], .onChange = onChange, .onHold = config.onHold, .onRelease = config.onRelease }); } } } else { CLAY(id, { .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}, .childGap = BAR_GAP, .layoutDirection = CLAY_LEFT_TO_RIGHT }, }) { gui.element("sv square", SaturationValueSquareData{ .saturation = &savedHsv.y(), .value = &savedHsv.z(), .hue = &savedHsv.x(), .onChange = onChange, .onHold = config.onHold, .onRelease = config.onRelease }); CLAY_AUTO_ID({ .layout = { .sizing = {.width = CLAY_SIZING_FIT(BAR_WIDTH), .height = CLAY_SIZING_GROW(0)}, .layoutDirection = CLAY_LEFT_TO_RIGHT }, }) { gui.element("hue slider", HueVerticalSliderData{ .hue = &savedHsv.x(), .onChange = onChange, .onHold = config.onHold, .onRelease = config.onRelease }); } } } } template void ColorPicker::set_rgb_from_hsv(const Vector3f& hsv) { Vector3f a = hsv_to_rgb(hsv); (*data)[0] = a.x(); (*data)[1] = a.y(); (*data)[2] = a.z(); oldData = *data; } }