Add ui::spawn helper for creating dropdown lists
This commit is contained in:
parent
e83fef3369
commit
83df1a82ef
2 changed files with 55 additions and 0 deletions
|
|
@ -47,4 +47,6 @@ namespace psemek::ui
|
||||||
std::function<void(std::size_t)> callback_;
|
std::function<void(std::size_t)> callback_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool spawn(element * root, std::shared_ptr<selector> selector, geom::point<int, 2> const & position, std::function<void(std::size_t)> on_selected);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
#include <psemek/ui/selector.hpp>
|
#include <psemek/ui/selector.hpp>
|
||||||
|
#include <psemek/ui/screen.hpp>
|
||||||
|
#include <psemek/ui/positioner.hpp>
|
||||||
|
#include <psemek/ui/event_interceptor.hpp>
|
||||||
|
|
||||||
#include <psemek/geom/contains.hpp>
|
#include <psemek/geom/contains.hpp>
|
||||||
|
|
||||||
|
|
@ -123,5 +126,55 @@ namespace psemek::ui
|
||||||
callback_ = std::move(callback);
|
callback_ = std::move(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool spawn(element * root, std::shared_ptr<selector> selector, geom::point<int, 2> const & position, std::function<void(std::size_t)> on_selected)
|
||||||
|
{
|
||||||
|
ui::screen * screen = find_last_parent_of_type<struct screen>(root);
|
||||||
|
if (!screen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto event_interceptor = std::make_shared<struct event_interceptor>();
|
||||||
|
auto positioner = std::make_shared<struct positioner>();
|
||||||
|
|
||||||
|
event_interceptor->set_child(positioner);
|
||||||
|
positioner->set_child(selector);
|
||||||
|
|
||||||
|
auto close = [event_interceptor = event_interceptor.get(), selector = selector.get()]{
|
||||||
|
auto p = dynamic_cast<struct screen *>(event_interceptor->parent());
|
||||||
|
if (p)
|
||||||
|
p->remove_child(event_interceptor);
|
||||||
|
|
||||||
|
selector->on_selected([](std::size_t){});
|
||||||
|
};
|
||||||
|
|
||||||
|
selector->on_selected([close, cb = std::move(on_selected)](std::size_t index){
|
||||||
|
close();
|
||||||
|
cb(index);
|
||||||
|
});
|
||||||
|
|
||||||
|
event_interceptor->on_mouse_click([close](ui::mouse_click const & e) -> bool {
|
||||||
|
if (e.down && (e.button == ui::mouse_button::right || e.button == ui::mouse_button::left))
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
event_interceptor->on_key_press([close](key_press const & e) -> bool {
|
||||||
|
if (e.down && e.key == SDLK_ESCAPE)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
send_fake_mouse_move_event(event_interceptor.get(), true);
|
||||||
|
positioner->set_position(geom::cast<float>(position), positioner::x_align::left, positioner::y_align::top);
|
||||||
|
screen->add_child(event_interceptor, screen::x_policy::fill, screen::y_policy::fill);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue