#include "pch.h" #include "log.h" #include "util.h" #include "canvas.h" #include "node_dialog_picker.h" Node* NodeColorPicker::clone_instantiate() const { return new NodeColorPicker; } void NodeColorPicker::clone_finalize(Node* dest) const { auto n = static_cast(dest); n->init_controls(); } void NodeColorPicker::init() { auto n = (NodeColorPicker*)init_template("color-picker"); n->clone_copy(this); init_controls(); } void NodeColorPicker::draw() { NodeBorder::draw(); // glm::vec3 rgb = glm::vec3(Canvas::I->m_current_brush.m_tip_color); // glm::vec3 hsv = convert_rgb2hsv(rgb); // m_slider_h->m_values = hsv.x; // m_slider_s->m_values = hsv.y; // m_slider_v->m_values = hsv.z; // m_slider_r->m_values = rgb.x; // m_slider_g->m_values = rgb.y; // m_slider_b->m_values = rgb.z; // m_wheel->m_hsv = hsv; } void NodeColorPicker::added(Node* parent) { m_interacted = false; } kEventResult NodeColorPicker::handle_event(Event* e) { switch (e->m_type) { case kEventType::MouseLeave: if (!m_interacted || !m_autohide) break; // else fall through case kEventType::MouseUpL: if (!m_mouse_inside) { if (m_color_cur->m_color != m_color_old->m_color) { m_color_old2->m_color = m_color_old1->m_color; m_color_old1->m_color = m_color_old->m_color; m_color_old->m_color = m_color_cur->m_color; } mouse_release(); m_parent->remove_child(this); if (on_popup_close) on_popup_close(this); } break; default: return kEventResult::Available; break; } return kEventResult::Available; } void NodeColorPicker::init_controls() { m_slider_h = find("hsv-h"); m_slider_s = find("hsv-s"); m_slider_v = find("hsv-v"); m_slider_r = find("rgb-r"); m_slider_g = find("rgb-g"); m_slider_b = find("rgb-b"); m_wheel = find("wheel"); m_color_cur = find("color-cur"); m_color_old = find("color-old"); m_color_old1 = find("color-old1"); m_color_old2 = find("color-old2"); m_wheel->on_value_changed = [this](Node*, glm::vec3 hsv) { m_slider_h->m_value = hsv.x; m_slider_s->m_value = hsv.y; m_slider_v->m_value = hsv.z; glm::vec3 rgb = convert_hsv2rgb(hsv); m_slider_h->set_value(hsv.x); m_slider_s->set_value(hsv.y); m_slider_v->set_value(hsv.z); m_color_cur->m_color = { rgb, 1 }; if (on_color_change) on_color_change(this, rgb); m_interacted = true; }; auto hsv_setter = [this](Node* target, float v) { auto hsv = get_hsv(); m_wheel->m_hsv = hsv; glm::vec3 rgb = convert_hsv2rgb(hsv); m_color_cur->m_color = { rgb, 1 }; m_slider_r->m_value = rgb.x; m_slider_g->m_value = rgb.y; m_slider_b->m_value = rgb.z; if (on_color_change) on_color_change(this, rgb); m_interacted = true; }; m_slider_h->on_value_changed = hsv_setter; m_slider_s->on_value_changed = hsv_setter; m_slider_v->on_value_changed = hsv_setter; auto rgb_setter = [this](Node* target, float v) { glm::vec3 rgb = get_rgb(); glm::vec3 hsv = convert_rgb2hsv(rgb); m_wheel->m_hsv = hsv; m_color_cur->m_color = { rgb, 1 }; m_slider_h->set_value(hsv.x); m_slider_s->set_value(hsv.y); m_slider_v->set_value(hsv.z); if (on_color_change) on_color_change(this, rgb); m_interacted = true; }; m_slider_r->on_value_changed = rgb_setter; m_slider_g->on_value_changed = rgb_setter; m_slider_b->on_value_changed = rgb_setter; } void NodeColorPicker::set_color(glm::vec3 rgb) { auto hsv = convert_rgb2hsv(rgb); m_slider_h->set_value(hsv.x); m_slider_s->set_value(hsv.y); m_slider_v->set_value(hsv.z); m_slider_r->set_value(rgb.x); m_slider_g->set_value(rgb.y); m_slider_b->set_value(rgb.z); m_wheel->m_hsv = hsv; m_color_cur->m_color = { rgb, 1 }; m_color_old->m_color = { rgb, 1 }; } glm::vec3 NodeColorPicker::get_hsv() const { float h = m_slider_h->get_value(); float s = m_slider_s->get_value(); float v = m_slider_v->get_value(); return glm::vec3(h, s, v); } glm::vec3 NodeColorPicker::get_rgb() const { float r = m_slider_r->get_value(); float g = m_slider_g->get_value(); float b = m_slider_b->get_value(); return glm::vec3(r, g, b); }