/* ui/colorpicker.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "ui/bitmap.h" #include "ui/colorpicker.h" #include "ui/slider.h" #include "ui/label.h" #include "ui/ui.h" #include "math/functions.h" namespace ui { ColorPicker::ColorPicker(Widget *parent) : Widget(parent) { set_label("colorpicker"); _label_red = new Label(this, "R"); _label_red->set_alignment(AlignLeft | AlignVCenter); _label_red->set_border(false); _label_red->set_background(false); _slider_red = new Slider(this, 0.0f, 255.0f); _label_green = new Label(this, "G"); _label_green->set_alignment(AlignLeft | AlignVCenter); _label_green->set_border(false); _label_green->set_background(false); _slider_green = new Slider(this, 0.0f, 255.0f); _label_blue = new Label(this, "B"); _label_blue->set_alignment(AlignLeft | AlignVCenter); _label_blue->set_border(false); _label_blue->set_background(false); _slider_blue = new Slider(this, 0.0f, 255.0f); _color_preview = new Bitmap(this); _color_preview->set_label("preview"); _color_preview->set_border(true); color_changed(); } ColorPicker::~ColorPicker() { } void ColorPicker::set_color(const math::Color & color) { _color.assign(color); color_changed(); } void ColorPicker::set_color(const float r, const float g, const float b) { _color.assign(r, g, b); color_changed(); } void ColorPicker::color_changed() { _slider_red->set_value(_color.red() * 255.0f); _slider_green->set_value(_color.green() * 255.0f); _slider_blue->set_value(_color.blue() * 255.0f); _color_preview->set_color(_color); } void ColorPicker::resize() { const float margin = UI::margin; const float w = font()->width() * 3.0f; const float h = (height() - margin * 4.0f) / 3.0f; const float r = math::min(width(), height()) - 2.0f * margin; // resize color preview _color_preview->set_size(r,r); _color_preview->set_location(width() - r - margin, height() - r - margin); // resize red channel label _label_red->set_size(w, h); _label_red->set_location(margin, margin); // resize red channel slider _slider_red->set_location(_label_red->right(), _label_red->top()); _slider_red->set_size(_color_preview->left() - _label_red->right() - 2.0f * margin, h); _label_green->set_size(w, h); _label_green->set_location(margin, 2.0f * margin + h); // resize green channel slider _slider_green->set_location(_label_green->right(), _label_green->top()); _slider_green->set_size(_color_preview->left() - _label_green->right() - 2.0f * margin, h); _label_blue->set_size(w, h); _label_blue->set_location(margin, 3.0f * margin + 2.0f * h); // resize blue channel slider _slider_blue->set_location(_label_blue->right(), _label_blue->top()); _slider_blue->set_size(_color_preview->left() - _label_blue->right() - 2.0f * margin, h); } bool ColorPicker::on_emit(Widget *sender, const Event event, void *data) { if (event == ui::Widget::EventSliderChanged) { if (sender == _slider_red) { _color[0] = _slider_red->value() / 255.0f; _color_preview->set_color(_color); return true; } else if (sender == _slider_green) { _color[1] = _slider_green->value() / 255.0f; _color_preview->set_color(_color); return true; } else if (sender == _slider_blue) { _color[2] = _slider_blue->value() / 255.0f; _color_preview->set_color(_color); return true; } } // unhandled event return false; } }