diff --git a/src/custom_button/imp.rs b/src/custom_button/imp.rs deleted file mode 100644 index 891d366..0000000 --- a/src/custom_button/imp.rs +++ /dev/null @@ -1,75 +0,0 @@ -use gtk::glib; -use gtk::*; -use gtk::prelude::*; -use gtk::subclass::prelude::*; -use adw::subclass::prelude::*; -use adw::prelude::ActionRowExt; -use std::cell::{Cell, RefCell}; -use glib::ObjectExt; -use gtk::Orientation::Horizontal; -use glib::GString; - -// Object holding the state -#[derive(glib::Properties, Default)] -#[properties(wrapper_type = super::CustomButton)] -pub struct CustomButton { - #[property(get, set)] - filesystem: RefCell, - partition: RefCell, - mountpoint: RefCell, - partition_scroll: gtk::ScrolledWindow -} - -// The central trait for subclassing a GObject -#[glib::object_subclass] -impl ObjectSubclass for CustomButton { - const NAME: &'static str = "MyGtkAppCustomButton"; - type Type = super::CustomButton; - type ParentType = adw::ActionRow; -} - -// Trait shared by all GObjects -// Trait shared by all GObjects -#[glib::derived_properties] -impl ObjectImpl for CustomButton { - fn constructed(&self) { - self.parent_constructed(); - - // Bind label to number - // `SYNC_CREATE` ensures that the label will be immediately set - let obj = self.obj(); - let action_row_content_box = gtk::Box::builder() - .orientation(Horizontal) - .spacing(0) - .build(); - - let partition_row_expander = adw::ExpanderRow::builder() - .title("Partition") - .build(); - - action_row_content_box.append(&partition_row_expander); - - obj.add_prefix(&action_row_content_box) - - //obj.bind_property("number", obj.as_ref(), "label") - // .sync_create() - // .build(); - } -} - -// Trait shared by all widgets -impl WidgetImpl for CustomButton {} - -// Trait shared by all buttons -// Trait shared by all buttons - -impl ListBoxRowImpl for CustomButton {} - -impl PreferencesRowImpl for CustomButton {} - -impl ActionRowImpl for CustomButton { - //fn clicked(&self) { - // let incremented_number = self.obj().number() + 1; - // self.obj().set_number(incremented_number); - //} -} \ No newline at end of file diff --git a/src/drive_mount_row/imp.rs b/src/drive_mount_row/imp.rs new file mode 100644 index 0000000..5f91d87 --- /dev/null +++ b/src/drive_mount_row/imp.rs @@ -0,0 +1,179 @@ +use std::{ + cell::{ + Cell, + RefCell, + }, + sync::{ + OnceLock, + }, + rc::{ + Rc, + }, +}; + +use glib::{ + Properties, + subclass::Signal, + clone, +}; +use gtk::{ + glib, + prelude::*, + subclass::prelude::*, + *, + Orientation::Horizontal, +}; +use adw::{ + prelude::*, + subclass::prelude::*, + *, +}; + + +// ANCHOR: custom_button +// Object holding the state +#[derive(Properties, Default)] +#[properties(wrapper_type = super::DriveMountRow)] +pub struct DriveMountRow { + #[property(get, set)] + mountopt: RefCell, + #[property(get, set)] + partition: RefCell, + #[property(get, set)] + mountpoint: RefCell, + #[property(get, set)] + partition_scroll: Rc>, +} +// ANCHOR_END: custom_button + +// The central trait for subclassing a GObject +#[glib::object_subclass] +impl ObjectSubclass for DriveMountRow { + const NAME: &'static str = "DriveMountRow"; + type Type = super::DriveMountRow; + type ParentType = adw::ActionRow; +} + +// ANCHOR: object_impl +// Trait shared by all GObjects +#[glib::derived_properties] +impl ObjectImpl for DriveMountRow { + fn signals() -> &'static [Signal] { + static SIGNALS: OnceLock> = OnceLock::new(); + SIGNALS.get_or_init(|| { + vec![Signal::builder("row-deleted") + .build()] + }) + } + fn constructed(&self) { + self.parent_constructed(); + + // Bind label to number + // `SYNC_CREATE` ensures that the label will be immediately set + let obj = self.obj(); + let action_row_content_box = gtk::Box::builder() + .orientation(Horizontal) + .spacing(0) + .build(); + + let partition_row_expander_adw_listbox = gtk::ListBox::builder() + .margin_end(5) + .margin_start(5) + .margin_top(5) + .margin_bottom(5) + .build(); + partition_row_expander_adw_listbox.add_css_class("boxed-list"); + + let partition_row_expander = adw::ExpanderRow::builder() + .subtitle("Partition") + .build(); + + let mountpoint_entry_adw_listbox = gtk::ListBox::builder() + .halign(gtk::Align::Center) + .margin_top(5) + .margin_bottom(5) + .build(); + mountpoint_entry_adw_listbox.add_css_class("boxed-list"); + + let mountpoint_entry_row = adw::EntryRow::builder() + .title("Mountpoint") + .build(); + + let mountopt_entry_adw_listbox = gtk::ListBox::builder() + .margin_top(5) + .margin_bottom(5) + .margin_start(5) + .halign(gtk::Align::Center) + .build(); + mountopt_entry_adw_listbox.add_css_class("boxed-list"); + + let mountopt_entry_row = adw::EntryRow::builder() + .title("Additional Mount Options") + .build(); + + let partition_row_delete_button = gtk::Button::builder() + .margin_end(5) + .margin_start(5) + .margin_top(5) + .margin_bottom(5) + .height_request(60) + .width_request(60) + .icon_name("edit-delete") + .halign(gtk::Align::End) + .build(); + + partition_row_delete_button.connect_clicked(clone!( @weak obj => move |_| { + obj.emit_by_name::<()>("row-deleted", &[]); + })); + + partition_row_expander_adw_listbox.append(&partition_row_expander); + action_row_content_box.append(&partition_row_expander_adw_listbox); + + mountpoint_entry_adw_listbox.append(&mountpoint_entry_row); + action_row_content_box.append(&mountpoint_entry_adw_listbox); + + mountopt_entry_adw_listbox.append(&mountopt_entry_row); + action_row_content_box.append(&mountopt_entry_adw_listbox); + + action_row_content_box.append(&partition_row_delete_button); + + + obj.add_prefix(&action_row_content_box); + + // Bind label to number + // `SYNC_CREATE` ensures that the label will be immediately set + let obj = self.obj(); + obj.bind_property("partition", &partition_row_expander, "title") + .sync_create() + .bidirectional() + .build(); + + obj.bind_property("mountpoint", &mountpoint_entry_row, "text") + .sync_create() + .bidirectional() + .build(); + + obj.bind_property("mountopt", &mountopt_entry_row, "text") + .sync_create() + .bidirectional() + .build(); + + partition_row_expander.add_row(&obj.property::("partition_scroll")); + } +} +// Trait shared by all widgets +impl WidgetImpl for DriveMountRow {} + +// Trait shared by all buttons +// Trait shared by all buttons + +impl ListBoxRowImpl for DriveMountRow {} + +impl PreferencesRowImpl for DriveMountRow {} + +impl ActionRowImpl for DriveMountRow { + //fn clicked(&self) { + // let incremented_number = self.obj().number() + 1; + // self.obj().set_number(incremented_number); + //} +} \ No newline at end of file diff --git a/src/custom_button/mod.rs b/src/drive_mount_row/mod.rs similarity index 63% rename from src/custom_button/mod.rs rename to src/drive_mount_row/mod.rs index 94275d0..ab787e2 100644 --- a/src/custom_button/mod.rs +++ b/src/drive_mount_row/mod.rs @@ -2,16 +2,21 @@ mod imp; use glib::Object; use gtk::glib; -use gtk::ListBoxRow; glib::wrapper! { - pub struct CustomButton(ObjectSubclass) + pub struct DriveMountRow(ObjectSubclass) @extends adw::ActionRow, gtk::Widget, gtk::ListBoxRow, adw::PreferencesRow, @implements gtk::Accessible, gtk::Actionable, gtk::Buildable, gtk::ConstraintTarget; } -impl CustomButton { +impl DriveMountRow { pub fn new() -> Self { Object::builder().build() } +} + +impl Default for DriveMountRow { + fn default() -> Self { + Self::new() + } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index a0b5442..cc5bb10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,7 @@ mod install_page; mod done_page; mod automatic_partitioning; mod manual_partitioning; -mod custom_button; +mod drive_mount_row; /// main function fn main() { diff --git a/src/manual_partitioning/main.rs b/src/manual_partitioning/main.rs index 6bfcbfd..9d4026b 100644 --- a/src/manual_partitioning/main.rs +++ b/src/manual_partitioning/main.rs @@ -22,7 +22,7 @@ use std::time::*; use std::fs; use std::path::Path; -use crate::custom_button::CustomButton; +use crate::drive_mount_row::DriveMountRow; fn create_mount_row_list_box(device: &str) -> ActionRow { // Create check button @@ -223,13 +223,26 @@ pub fn manual_partitioning(window: &adw::ApplicationWindow, partitioning_stack: partition_method_manual_main_box.append(&partition_method_manual_efi_error_label); partition_method_manual_main_box.append(&partition_method_manual_gparted_button); - let shit_button = CustomButton::new(); + let shit_button = DriveMountRow::new(); - shit_button.set_title("haggar"); + shit_button.set_property("partition", "KAM"); + shit_button.set_property("mountpoint", "KAM"); + shit_button.set_property("mountopt", "KAM"); + shit_button.set_property("partition_scroll", >k::ScrolledWindow::new()); let create_mount_row_list_box = gtk::ListBox::builder() .build(); + let partition_method_manual_main_box_clone = partition_method_manual_main_box.clone(); + + shit_button.connect_closure( + "row-deleted", + false, + closure_local!(move |_shit_button: DriveMountRow| { + partition_method_manual_main_box_clone.remove(&_shit_button) + }), + ); + //shit_button.connect_clicked(clone!(@weak create_mount_row_list_box => move |_|{ // create_mount_row_list_box.append(&create_mount_row("col")) //}));