From b6e20e04b519e50909331f537df2ea6114a137ee Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 23 Jul 2016 19:16:28 +0200 Subject: General ui code improvements, moved layout related variables to ui::UI, added ColorPicker widget. --- src/ui/colorpicker.cc | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/ui/colorpicker.cc (limited to 'src/ui/colorpicker.cc') diff --git a/src/ui/colorpicker.cc b/src/ui/colorpicker.cc new file mode 100644 index 0000000..4180334 --- /dev/null +++ b/src/ui/colorpicker.cc @@ -0,0 +1,131 @@ +/* + 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; +} + +} -- cgit v1.2.3