Support alpha-channel in ui::color_picker

This commit is contained in:
Nikita Lisitsa 2022-12-20 18:19:14 +03:00
parent 17bb412140
commit d692256580
2 changed files with 24 additions and 6 deletions

View file

@ -23,6 +23,6 @@ namespace psemek::ui
on_value_changed_callback on_value_changed_callback_;
};
std::shared_ptr<color_picker> make_color_picker(element_factory & factory);
std::shared_ptr<color_picker> make_color_picker(element_factory & factory, bool alpha = false);
}

View file

@ -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<ui::frame>();
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<int>(value[0]), "[/color]"));
green_label_->set_tagged_text(util::to_string("[color:0f0]", static_cast<int>(value[1]), "[/color]"));
blue_label_ ->set_tagged_text(util::to_string("[color:00f]", static_cast<int>(value[2]), "[/color]"));
alpha_label_ ->set_tagged_text(util::to_string("[color:fff]", static_cast<int>(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<label> red_label_;
std::shared_ptr<label> green_label_;
std::shared_ptr<label> blue_label_;
std::shared_ptr<label> alpha_label_;
std::shared_ptr<slider> red_slider_;
std::shared_ptr<slider> green_slider_;
std::shared_ptr<slider> blue_slider_;
std::shared_ptr<slider> alpha_slider_;
};
}
std::shared_ptr<color_picker> make_color_picker(element_factory & factory)
std::shared_ptr<color_picker> make_color_picker(element_factory & factory, bool alpha)
{
return std::make_shared<color_picker_impl>(factory);
return std::make_shared<color_picker_impl>(factory, alpha);
}
}