From d692256580125a9b83a7f4757d032a3fabee01d2 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 20 Dec 2022 18:19:14 +0300 Subject: [PATCH] Support alpha-channel in ui::color_picker --- libs/ui/include/psemek/ui/color_picker.hpp | 2 +- libs/ui/source/color_picker.cpp | 28 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libs/ui/include/psemek/ui/color_picker.hpp b/libs/ui/include/psemek/ui/color_picker.hpp index c29e4978..d6821b6c 100644 --- a/libs/ui/include/psemek/ui/color_picker.hpp +++ b/libs/ui/include/psemek/ui/color_picker.hpp @@ -23,6 +23,6 @@ namespace psemek::ui on_value_changed_callback on_value_changed_callback_; }; - std::shared_ptr make_color_picker(element_factory & factory); + std::shared_ptr make_color_picker(element_factory & factory, bool alpha = false); } diff --git a/libs/ui/source/color_picker.cpp b/libs/ui/source/color_picker.cpp index df2ea843..390b37b4 100644 --- a/libs/ui/source/color_picker.cpp +++ b/libs/ui/source/color_picker.cpp @@ -18,7 +18,7 @@ namespace psemek::ui struct color_picker_impl : color_picker { - color_picker_impl(element_factory & factory) + color_picker_impl(element_factory & factory, bool alpha) { auto frame = std::make_shared(); frame->set_min_size(geom::vector{250.f, 0.f}); @@ -33,7 +33,7 @@ namespace psemek::ui color_view_->set_square(true); auto sliders_layout = factory.make_grid_layout(); - sliders_layout->set_size(3, 2); + sliders_layout->set_size(alpha ? 4 : 3, 2); sliders_layout->set_column_weight(0, 0.f); sliders_layout->set_outer_margin(false); @@ -55,6 +55,10 @@ namespace psemek::ui blue_label_->set_halign(label::halignment::right); blue_label_->set_valign(label::valignment::center); + alpha_label_ = factory.make_label(""); + alpha_label_->set_halign(label::halignment::right); + alpha_label_->set_valign(label::valignment::center); + auto slider_callback = [this](int){ set_color(color(), true); }; @@ -71,6 +75,10 @@ namespace psemek::ui blue_slider_->set_value_range({0, 255}, false); blue_slider_->on_value_changed(slider_callback, false); + alpha_slider_ = factory.make_slider(); + alpha_slider_->set_value_range({0, 255}, false); + alpha_slider_->on_value_changed(slider_callback, false); + hidden_screen->add_child(red_label_, screen::x_policy::fill, screen::y_policy::fill); sliders_layout->set(0, 0, hidden_screen); @@ -80,6 +88,12 @@ namespace psemek::ui sliders_layout->set(1, 1, green_slider_); sliders_layout->set(2, 1, blue_slider_); + if (alpha) + { + sliders_layout->set(3, 0, alpha_label_); + sliders_layout->set(3, 1, alpha_slider_); + } + main_layout->set(0, 0, color_view_); main_layout->set(0, 1, sliders_layout); @@ -122,7 +136,7 @@ namespace psemek::ui red_slider_->value(), green_slider_->value(), blue_slider_->value(), - 255 + alpha_slider_->value() }; } @@ -133,10 +147,12 @@ namespace psemek::ui red_label_ ->set_tagged_text(util::to_string("[color:f00]", static_cast(value[0]), "[/color]")); green_label_->set_tagged_text(util::to_string("[color:0f0]", static_cast(value[1]), "[/color]")); blue_label_ ->set_tagged_text(util::to_string("[color:00f]", static_cast(value[2]), "[/color]")); + alpha_label_ ->set_tagged_text(util::to_string("[color:fff]", static_cast(value[3]), "[/color]")); red_slider_->set_value(value[0], false); green_slider_->set_value(value[1], false); blue_slider_->set_value(value[2], false); + alpha_slider_->set_value(value[3], false); if (notify && on_value_changed_callback_) post([cb = on_value_changed_callback_, value]{ cb(value); }); @@ -166,16 +182,18 @@ namespace psemek::ui std::shared_ptr