修复布局系统
This commit is contained in:
parent
43aa8ce56d
commit
db735b94ea
@ -21,10 +21,19 @@ int main(int argc, char* argv[]) {
|
|||||||
auto weak_vbox = widget_manager::get().new_widget<mv_box>(window.get());
|
auto weak_vbox = widget_manager::get().new_widget<mv_box>(window.get());
|
||||||
auto vbox = weak_vbox.lock();
|
auto vbox = weak_vbox.lock();
|
||||||
|
|
||||||
vbox->add_slot<mbutton>().margin({ 5 });
|
vbox->add_child<mbutton>().margin({ 5 });
|
||||||
vbox->add_slot<mbutton>().margin({ 5 }).stretch(1);
|
vbox->add_child<mbutton>().margin({ 5 }).stretch(1);
|
||||||
vbox->add_slot<mbutton>().margin({ 5 });
|
|
||||||
vbox->add_slot<mbutton>().margin({ 5 });
|
auto weak_hbox = vbox->add_child<mh_box>().stretch(2).get();
|
||||||
|
auto hbox = std::static_pointer_cast<mh_box>(weak_hbox.lock());
|
||||||
|
hbox->add_child<mbutton>().margin({ 5 });
|
||||||
|
hbox->add_child<mbutton>().margin({ 5 }).stretch();
|
||||||
|
hbox->add_child<mbutton>().margin({ 5 });
|
||||||
|
|
||||||
|
|
||||||
|
vbox->add_child<mbutton>().margin({ 5 });
|
||||||
|
vbox->add_child<mbutton>().margin({ 5 });
|
||||||
|
|
||||||
|
|
||||||
window->set_content(vbox);
|
window->set_content(vbox);
|
||||||
|
|
||||||
|
@ -39,23 +39,17 @@ hit_test_handle mbutton::on_click(const Eigen::Vector2f& in_position, mouse_butt
|
|||||||
mborder::on_click(in_position, in_button);
|
mborder::on_click(in_position, in_button);
|
||||||
std::cout << this << ": Button clicked!" << in_position.x() << ", " << in_position.y() << std::endl;
|
std::cout << this << ": Button clicked!" << in_position.x() << ", " << in_position.y() << std::endl;
|
||||||
color_ = {0, 0, 1, 1};
|
color_ = {0, 0, 1, 1};
|
||||||
auto parent = get_parent();
|
auto parent = get_parent_widget();
|
||||||
// if (std::shared_ptr<mh_box> hbox = std::dynamic_pointer_cast<mh_box>(parent)) {
|
if (std::shared_ptr<mh_box> hbox = std::dynamic_pointer_cast<mh_box>(parent.lock())) {
|
||||||
// hbox->add_slot()
|
hbox->add_child<mbutton>()
|
||||||
// .stretch()
|
.stretch()
|
||||||
// .margin({ 5 })
|
.margin({ 5 });
|
||||||
// [
|
}
|
||||||
// std::make_shared<mbutton>()
|
if (std::shared_ptr<mv_box> vbox = std::dynamic_pointer_cast<mv_box>(parent.lock())) {
|
||||||
// ];
|
vbox->add_child<mbutton>()
|
||||||
// }
|
.stretch()
|
||||||
// if (std::shared_ptr<mv_box> vbox = std::dynamic_pointer_cast<mv_box>(parent)) {
|
.margin({ 5 });
|
||||||
// vbox->add_slot()
|
}
|
||||||
// .stretch()
|
|
||||||
// .margin({ 5 })
|
|
||||||
// [
|
|
||||||
// std::make_shared<mbutton>()
|
|
||||||
// ];
|
|
||||||
// }
|
|
||||||
return hit_test_handle::handled();
|
return hit_test_handle::handled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@ void arrange_box_children(
|
|||||||
|
|
||||||
pos.y() += info.margin_cross_start;
|
pos.y() += info.margin_cross_start;
|
||||||
size.x() = info.size;
|
size.x() = info.size;
|
||||||
|
size.y() -= info.margin_start + info.margin_end;
|
||||||
} else {
|
} else {
|
||||||
if (is_reversed)
|
if (is_reversed)
|
||||||
pos.y() = container_primary_size - position - info.size;
|
pos.y() = container_primary_size - position - info.size;
|
||||||
@ -155,10 +156,13 @@ void arrange_box_children(
|
|||||||
pos.y() = position;
|
pos.y() = position;
|
||||||
|
|
||||||
pos.x() += info.margin_cross_start;
|
pos.x() += info.margin_cross_start;
|
||||||
|
size.x() -= info.margin_start + info.margin_end;
|
||||||
size.y() = info.size;
|
size.y() = info.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
info.widget->set_geometry(in_allotted_geometry.make_child(pos, size));
|
const auto& child_geometry = in_allotted_geometry.make_child(pos, size);
|
||||||
|
info.widget->set_geometry(child_geometry);
|
||||||
|
info.widget->arrange_children(child_geometry);
|
||||||
|
|
||||||
position += info.size + info.margin_end;
|
position += info.size + info.margin_end;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,10 @@ void mwidget::init_component(mustache::EntityManager& in_entity_manager) {
|
|||||||
in_entity_manager.assign<widget_invalidate>(key_);
|
in_entity_manager.assign<widget_invalidate>(key_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mwidget::set_geometry(const geometry_t& in_geometry) {
|
||||||
|
get_component_ref<widget_layout>().geometry = in_geometry;
|
||||||
|
}
|
||||||
|
|
||||||
void mwidget::cache_desired_size(float in_layout_scale_multiplier, bool in_force) {
|
void mwidget::cache_desired_size(float in_layout_scale_multiplier, bool in_force) {
|
||||||
if (auto* layout = get_component<widget_layout>()) {
|
if (auto* layout = get_component<widget_layout>()) {
|
||||||
if (!in_force && layout->desired_size.has_value())
|
if (!in_force && layout->desired_size.has_value())
|
||||||
|
@ -38,7 +38,8 @@ public:
|
|||||||
virtual void init_component(mustache::EntityManager& in_entity_manager);
|
virtual void init_component(mustache::EntityManager& in_entity_manager);
|
||||||
virtual void on_paint(mirage_paint_context& in_context) = 0;
|
virtual void on_paint(mirage_paint_context& in_context) = 0;
|
||||||
|
|
||||||
void set_geometry(const geometry_t& in_geometry) { get_component_ref<widget_layout>().geometry = in_geometry; }
|
void set_geometry(const geometry_t& in_geometry);
|
||||||
|
|
||||||
const auto& get_geometry() const { return get_component_ref<widget_layout>().geometry; }
|
const auto& get_geometry() const { return get_component_ref<widget_layout>().geometry; }
|
||||||
virtual auto compute_desired_size(float in_layout_scale_multiplier) const -> Eigen::Vector2f = 0;
|
virtual auto compute_desired_size(float in_layout_scale_multiplier) const -> Eigen::Vector2f = 0;
|
||||||
void cache_desired_size(float in_layout_scale_multiplier, bool in_force = false);
|
void cache_desired_size(float in_layout_scale_multiplier, bool in_force = false);
|
||||||
|
@ -74,7 +74,7 @@ public:
|
|||||||
* 创建并添加一个新的子组件插槽到面板中。
|
* 创建并添加一个新的子组件插槽到面板中。
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
auto add_slot() -> SlotType& {
|
auto add_child() -> SlotType& {
|
||||||
auto& manager = widget_manager::get();
|
auto& manager = widget_manager::get();
|
||||||
auto widget_entity = manager.new_widget<T>(get_window());
|
auto widget_entity = manager.new_widget<T>(get_window());
|
||||||
auto w = widget_entity.lock();
|
auto w = widget_entity.lock();
|
||||||
@ -85,7 +85,7 @@ public:
|
|||||||
return slot;
|
return slot;
|
||||||
}
|
}
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
auto add_slot(Args&&... in_args) -> SlotType& {
|
auto add_child(Args&&... in_args) -> SlotType& {
|
||||||
auto& manager = widget_manager::get();
|
auto& manager = widget_manager::get();
|
||||||
auto widget_entity = manager.new_widget<T>(get_window(), std::forward<Args>(in_args)...);
|
auto widget_entity = manager.new_widget<T>(get_window(), std::forward<Args>(in_args)...);
|
||||||
auto w = widget_entity.lock();
|
auto w = widget_entity.lock();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user