From 6da81dd1798fdff6b9d1a85f0ebcef6c89df140d Mon Sep 17 00:00:00 2001 From: JoeZane Date: Fri, 18 Apr 2025 03:31:28 +0800 Subject: [PATCH] upd: function `remove_children` of split pane widget. --- examples/remove_demo/main.rs | 1 + examples/remove_demo/remove_widget.rs | 58 +++++++++++- examples/remove_demo/split_pane_layout.rs | 107 ++++++++++++++++++++++ macros/src/split_pane.rs | 89 ++++++------------ tmui/src/split_pane.rs | 12 ++- 5 files changed, 201 insertions(+), 66 deletions(-) create mode 100644 examples/remove_demo/split_pane_layout.rs diff --git a/examples/remove_demo/main.rs b/examples/remove_demo/main.rs index 0111dc5..552c416 100644 --- a/examples/remove_demo/main.rs +++ b/examples/remove_demo/main.rs @@ -1,5 +1,6 @@ pub mod child_widget; pub mod remove_widget; +pub mod split_pane_layout; pub mod stack_widget; use remove_widget::RemoveWidget; diff --git a/examples/remove_demo/remove_widget.rs b/examples/remove_demo/remove_widget.rs index 0380129..53a7d54 100644 --- a/examples/remove_demo/remove_widget.rs +++ b/examples/remove_demo/remove_widget.rs @@ -6,7 +6,9 @@ use tmui::{ widget::WidgetImpl, }; -use crate::{child_widget::ChildWidget, stack_widget::StackWidget}; +use crate::{ + child_widget::ChildWidget, split_pane_layout::SplitPaneLayout, stack_widget::StackWidget, +}; #[extends(Widget, Layout(VBox))] #[derive(Childrenable)] @@ -17,6 +19,8 @@ pub struct RemoveWidget { bottom: Box, #[children] stack: Box, + #[children] + split_pane: Box, to_remove: ObjectId, widget_id: ObjectId, @@ -37,9 +41,17 @@ impl ObjectImpl for RemoveWidget { let mut button_1 = Button::new(Some("Remove Left")); let mut button_2 = Button::new(Some("Remove Right")); let mut button_3 = Button::new(Some("Remove Stack")); + let mut button_4 = Button::new(Some("Remove SplitPane Left")); + let mut button_5 = Button::new(Some("Remove SplitPane RightTop")); + let mut button_6 = Button::new(Some("Remove SplitPane RightBottomLeft")); + let mut button_7 = Button::new(Some("Remove SplitPane RightBottomRight")); button_1.width_request(100); button_2.width_request(100); button_3.width_request(100); + button_4.width_request(200); + button_5.width_request(200); + button_6.width_request(200); + button_7.width_request(200); connect!( button_1, mouse_pressed(), @@ -58,9 +70,37 @@ impl ObjectImpl for RemoveWidget { self, remove_stack_widget(MouseEvent) ); + connect!( + button_4, + mouse_pressed(), + self, + remove_split_pane_left(MouseEvent) + ); + connect!( + button_5, + mouse_pressed(), + self, + remove_split_pane_right_top(MouseEvent) + ); + connect!( + button_6, + mouse_pressed(), + self, + remove_split_pane_right_bottom_left(MouseEvent) + ); + connect!( + button_7, + mouse_pressed(), + self, + remove_split_pane_right_bottom_right(MouseEvent) + ); self.top.add_child(button_1); self.top.add_child(button_2); self.top.add_child(button_3); + self.top.add_child(button_4); + self.top.add_child(button_5); + self.top.add_child(button_6); + self.top.add_child(button_7); self.bottom.add_child(Label::new(Some("Label 1"))); let label2 = Label::new(Some("Label 2")); @@ -99,4 +139,20 @@ impl RemoveWidget { pub fn remove_stack_widget(&mut self, _: MouseEvent) { self.stack.remove_index(1); } + + pub fn remove_split_pane_left(&mut self, _: MouseEvent) { + self.split_pane.remove_left(); + } + + pub fn remove_split_pane_right_top(&mut self, _: MouseEvent) { + self.split_pane.remove_right_top(); + } + + pub fn remove_split_pane_right_bottom_left(&mut self, _: MouseEvent) { + self.split_pane.remove_right_bottom_left(); + } + + pub fn remove_split_pane_right_bottom_right(&mut self, _: MouseEvent) { + self.split_pane.remove_right_bottom_right(); + } } diff --git a/examples/remove_demo/split_pane_layout.rs b/examples/remove_demo/split_pane_layout.rs new file mode 100644 index 0000000..e7a5cbb --- /dev/null +++ b/examples/remove_demo/split_pane_layout.rs @@ -0,0 +1,107 @@ +use std::ptr::NonNull; +use tlib::{connect, events::MouseEvent}; +use tmui::{ + label::Label, + prelude::*, + tlib::object::{ObjectImpl, ObjectSubclass}, + widget::WidgetImpl, +}; + +#[extends(Widget, Layout(SplitPane))] +pub struct SplitPaneLayout { + left: ObjectId, + right_top: ObjectId, + right_bottom_left: ObjectId, + right_bottom_right: ObjectId, + cnt: i32, + label: Option>, +} + +impl ObjectSubclass for SplitPaneLayout { + const NAME: &'static str = "SplitPaneLayout"; +} + +impl ObjectImpl for SplitPaneLayout { + fn construct(&mut self) { + self.parent_construct(); + + let mut label = Label::new(Some("Click to split.")); + label.set_size(20); + label.set_background(Color::RED); + label.set_content_halign(Align::Center); + label.set_content_valign(Align::Center); + label.set_mouse_tracking(true); + self.left = label.id(); + + connect!(label, mouse_pressed(), self, split_off(MouseEvent)); + self.add_child(label); + + let mut children_mut = self.children_mut(); + let label = children_mut[0].downcast_mut::