try to add IDs
This commit is contained in:
parent
65030405d0
commit
6f81fda8d1
@ -1,4 +1,4 @@
|
||||
use std::{cell::RefCell, rc::Rc, sync::OnceLock};
|
||||
use std::{cell::{RefCell}, rc::Rc, sync::OnceLock};
|
||||
|
||||
use adw::{prelude::*, subclass::prelude::*, *};
|
||||
use glib::{clone, subclass::Signal, Properties};
|
||||
@ -25,6 +25,8 @@ pub struct DriveMountRow {
|
||||
sizegroup: RefCell<Option<gtk::SizeGroup>>,
|
||||
#[property(get, set)]
|
||||
langaction: RefCell<Option<gio::SimpleAction>>,
|
||||
#[property(get, set)]
|
||||
id: RefCell<i32>,
|
||||
}
|
||||
// ANCHOR_END: custom_button
|
||||
|
||||
|
@ -5,13 +5,14 @@ use adw::gio;
|
||||
use adw::prelude::*;
|
||||
use glib::{clone, closure_local, ffi::gboolean};
|
||||
use gtk::{glib, prelude::*};
|
||||
use std::{cell::RefCell, rc::Rc};
|
||||
use std::borrow::Borrow;
|
||||
use std::{cell::{RefCell}, rc::Rc};
|
||||
|
||||
const MINIMUM_EFI_BYTE_SIZE: f64 = 500000000.0;
|
||||
const MINIMUM_BOOT_BYTE_SIZE: f64 = 1000000000.0;
|
||||
const MINIMUM_ROOT_BYTE_SIZE: f64 = 39000000000.0;
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, Debug)]
|
||||
struct PartitionRow {
|
||||
widget: adw::ActionRow,
|
||||
swap_fs_error: Rc<std::cell::RefCell<bool>>,
|
||||
@ -50,6 +51,8 @@ pub fn create_efi_row(
|
||||
|
||||
row.set_mountpoint("/boot/efi");
|
||||
|
||||
row.set_id(0);
|
||||
|
||||
let null_checkbutton = gtk::CheckButton::builder().build();
|
||||
|
||||
for partition in partition_array {
|
||||
@ -191,6 +194,7 @@ pub fn create_efi_row(
|
||||
post_check_drive_mount(
|
||||
&row,
|
||||
&partition_row_struct,
|
||||
&null_checkbutton,
|
||||
&partition_button,
|
||||
&partition_changed_action,
|
||||
&partition,
|
||||
@ -213,7 +217,9 @@ pub fn create_efi_row(
|
||||
} else {
|
||||
(*subvol_partition_array_refcell.borrow_mut()).retain(|x| x != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
));
|
||||
|
||||
@ -235,7 +241,9 @@ pub fn create_efi_row(
|
||||
listbox.remove(&row);
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
),
|
||||
);
|
||||
@ -271,8 +279,11 @@ pub fn create_boot_row(
|
||||
|
||||
row.set_mountpoint("/boot");
|
||||
|
||||
row.set_id(1);
|
||||
|
||||
let null_checkbutton = gtk::CheckButton::builder().build();
|
||||
|
||||
|
||||
for partition in partition_array {
|
||||
let part_name = &partition.part_name.to_owned();
|
||||
let partition_button = gtk::CheckButton::builder()
|
||||
@ -412,6 +423,7 @@ pub fn create_boot_row(
|
||||
post_check_drive_mount(
|
||||
&row,
|
||||
&partition_row_struct,
|
||||
&null_checkbutton,
|
||||
&partition_button,
|
||||
&partition_changed_action,
|
||||
&partition,
|
||||
@ -434,7 +446,9 @@ pub fn create_boot_row(
|
||||
} else {
|
||||
(*subvol_partition_array_refcell.borrow_mut()).retain(|x| x != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
));
|
||||
|
||||
@ -456,7 +470,9 @@ pub fn create_boot_row(
|
||||
listbox.remove(&row);
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
),
|
||||
);
|
||||
@ -492,8 +508,11 @@ pub fn create_root_row(
|
||||
|
||||
row.set_mountpoint("/");
|
||||
|
||||
row.set_id(2);
|
||||
|
||||
let null_checkbutton = gtk::CheckButton::builder().build();
|
||||
|
||||
|
||||
for partition in partition_array {
|
||||
let part_name = &partition.part_name.to_owned();
|
||||
let partition_button = gtk::CheckButton::builder()
|
||||
@ -638,6 +657,7 @@ pub fn create_root_row(
|
||||
post_check_drive_mount(
|
||||
&row,
|
||||
&partition_row_struct,
|
||||
&null_checkbutton,
|
||||
&partition_button,
|
||||
&partition_changed_action,
|
||||
&partition,
|
||||
@ -660,7 +680,9 @@ pub fn create_root_row(
|
||||
} else {
|
||||
(*subvol_partition_array_refcell.borrow_mut()).retain(|x| x != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
));
|
||||
|
||||
@ -682,7 +704,9 @@ pub fn create_root_row(
|
||||
listbox.remove(&row);
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
),
|
||||
);
|
||||
@ -696,6 +720,7 @@ pub fn create_mount_row(
|
||||
language_changed_action: &gio::SimpleAction,
|
||||
used_partition_array_refcell: &Rc<RefCell<Vec<FstabEntry>>>,
|
||||
subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
|
||||
extra_mount_id_refcell: &Rc<RefCell<i32>>,
|
||||
) {
|
||||
let partition_scroll_child = gtk::ListBox::builder()
|
||||
.selection_mode(gtk::SelectionMode::None)
|
||||
@ -716,8 +741,11 @@ pub fn create_mount_row(
|
||||
|
||||
row.set_langaction(language_changed_action);
|
||||
|
||||
row.set_id(extra_mount_id_refcell.borrow());
|
||||
|
||||
let null_checkbutton = gtk::CheckButton::builder().build();
|
||||
|
||||
|
||||
for partition in partition_array {
|
||||
let part_name = &partition.part_name.to_owned();
|
||||
let partition_button = gtk::CheckButton::builder()
|
||||
@ -825,6 +853,7 @@ pub fn create_mount_row(
|
||||
post_check_drive_mount(
|
||||
&row,
|
||||
&partition_row_struct,
|
||||
&null_checkbutton,
|
||||
&partition_button,
|
||||
&partition_changed_action,
|
||||
&partition,
|
||||
@ -847,7 +876,9 @@ pub fn create_mount_row(
|
||||
} else {
|
||||
(*subvol_partition_array_refcell.borrow_mut()).retain(|x| x != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
));
|
||||
|
||||
@ -869,7 +900,9 @@ pub fn create_mount_row(
|
||||
listbox.remove(&row);
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
partition_changed_action.activate(None);
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
),
|
||||
);
|
||||
@ -878,6 +911,7 @@ pub fn create_mount_row(
|
||||
fn post_check_drive_mount(
|
||||
row: &DriveMountRow,
|
||||
partition_row_struct: &PartitionRow,
|
||||
null_checkbutton: >k::CheckButton,
|
||||
partition_button: >k::CheckButton,
|
||||
partition_changed_action: &gio::SimpleAction,
|
||||
partition: &Partition,
|
||||
@ -888,6 +922,10 @@ fn post_check_drive_mount(
|
||||
partition_button.connect_toggled(clone!(
|
||||
#[weak]
|
||||
row,
|
||||
#[strong]
|
||||
null_checkbutton,
|
||||
#[strong]
|
||||
partition_row_struct,
|
||||
#[weak]
|
||||
partition_button,
|
||||
#[strong]
|
||||
@ -897,22 +935,57 @@ fn post_check_drive_mount(
|
||||
#[strong]
|
||||
partition,
|
||||
move |_| {
|
||||
if partition_button.is_active() == true {
|
||||
let part_name = &partition.part_name;
|
||||
row.set_partition(part_name.to_string());
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.push(DriveMountRow::get_fstab_entry(&row));
|
||||
} else {
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(None);
|
||||
let (check_delay_sender, check_delay_receiver) = async_channel::unbounded::<bool>();
|
||||
std::thread::spawn(move || {
|
||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||
check_delay_sender
|
||||
.send_blocking(true)
|
||||
.expect("The channel needs to be open.");
|
||||
});
|
||||
|
||||
let check_delay_main_context = glib::MainContext::default();
|
||||
check_delay_main_context.spawn_local(clone!(
|
||||
#[weak]
|
||||
row,
|
||||
#[strong]
|
||||
null_checkbutton,
|
||||
#[strong]
|
||||
partition_row_struct,
|
||||
#[weak]
|
||||
partition_button,
|
||||
#[strong]
|
||||
partition_changed_action,
|
||||
#[strong]
|
||||
used_partition_array_refcell,
|
||||
#[strong]
|
||||
partition,
|
||||
async move {
|
||||
while let Ok(_state) = check_delay_receiver.recv().await {
|
||||
if !null_checkbutton.is_active() {
|
||||
if partition_button.is_active() == true {
|
||||
let part_name = &partition.part_name;
|
||||
row.set_partition(part_name.to_string());
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.push(DriveMountRow::get_fstab_entry(&row));
|
||||
} else {
|
||||
(*used_partition_array_refcell.borrow_mut())
|
||||
.retain(|x| &x.partition.part_name != &row.partition());
|
||||
}
|
||||
partition_changed_action.activate(Some(
|
||||
&glib::variant::Variant::from_data_with_type(row.id().to_string(), glib::VariantTy::STRING)
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
));
|
||||
}
|
||||
));
|
||||
row.connect_mountpoint_notify(clone!(
|
||||
#[strong]
|
||||
partition_row_struct,
|
||||
#[strong]
|
||||
null_checkbutton,
|
||||
#[strong]
|
||||
partition,
|
||||
#[strong]
|
||||
row,
|
||||
@ -928,14 +1001,17 @@ fn post_check_drive_mount(
|
||||
}
|
||||
} else {
|
||||
(*partition_row_struct.swap_fs_error.borrow_mut()) = true;
|
||||
null_checkbutton.set_active(true);
|
||||
partition_row_struct.widget.set_sensitive(false);
|
||||
}
|
||||
} else if *partition_row_struct.used.borrow() != 1
|
||||
&& *partition_row_struct.never.borrow() == false
|
||||
&& *partition_row_struct.hardcode_fs_error.borrow() == false
|
||||
{
|
||||
(*partition_row_struct.swap_fs_error.borrow_mut()) = false;
|
||||
partition_row_struct.widget.set_sensitive(true);
|
||||
} else {
|
||||
if *partition_row_struct.used.borrow() != 1
|
||||
&& *partition_row_struct.never.borrow() == false
|
||||
&& *partition_row_struct.hardcode_fs_error.borrow() == false
|
||||
{
|
||||
(*partition_row_struct.swap_fs_error.borrow_mut()) = false;
|
||||
partition_row_struct.widget.set_sensitive(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
));
|
||||
@ -944,6 +1020,8 @@ fn post_check_drive_mount(
|
||||
#[strong]
|
||||
partition_row_struct,
|
||||
#[strong]
|
||||
null_checkbutton,
|
||||
#[strong]
|
||||
row,
|
||||
#[strong]
|
||||
partition,
|
||||
@ -951,13 +1029,15 @@ fn post_check_drive_mount(
|
||||
used_partition_array_refcell,
|
||||
#[strong]
|
||||
subvol_partition_array_refcell,
|
||||
move |_, _| {
|
||||
move |_, varient| {
|
||||
let part_name = &partition.part_name;
|
||||
let used_partition_array = used_partition_array_refcell.borrow();
|
||||
let subvol_partition_array = subvol_partition_array_refcell.borrow();
|
||||
|
||||
let action_id = String::from_utf8_lossy(varient.unwrap().data()).parse::<i32>().unwrap();
|
||||
|
||||
if used_partition_array.iter().any(|e| {
|
||||
(part_name == &e.partition.part_name && part_name != &row.partition())
|
||||
(part_name == &e.partition.part_name)
|
||||
&& (subvol_partition_array.iter().any(|e| part_name == e))
|
||||
}) {
|
||||
if *partition_row_struct.never.borrow() == false
|
||||
@ -969,9 +1049,12 @@ fn post_check_drive_mount(
|
||||
(*partition_row_struct.used.borrow_mut()) = 2;
|
||||
} else if used_partition_array
|
||||
.iter()
|
||||
.any(|e| part_name == &e.partition.part_name && part_name != &row.partition())
|
||||
.any(|e| part_name == &e.partition.part_name)
|
||||
{
|
||||
partition_row_struct.widget.set_sensitive(false);
|
||||
if action_id != row.id() {
|
||||
null_checkbutton.set_active(true);
|
||||
partition_row_struct.widget.set_sensitive(false);
|
||||
}
|
||||
(*partition_row_struct.used.borrow_mut()) = 1;
|
||||
} else {
|
||||
if *partition_row_struct.never.borrow() == false
|
||||
|
@ -6,6 +6,7 @@ use crate::partitioning_page::{get_partitions, CrypttabEntry, FstabEntry, Partit
|
||||
use adw::gio;
|
||||
use adw::prelude::*;
|
||||
use glib::{clone, closure_local, ffi::gboolean};
|
||||
use gtk::glib::Variant;
|
||||
use gtk::{glib, prelude::*, Orientation};
|
||||
use std::{cell::RefCell, collections::HashSet, rc::Rc};
|
||||
|
||||
@ -34,7 +35,7 @@ pub fn manual_partitioning_page(
|
||||
|
||||
//
|
||||
|
||||
let partition_changed_action = gio::SimpleAction::new("partition-changed", None);
|
||||
let partition_changed_action = gio::SimpleAction::new("partition-changed", Some(glib::VariantTy::STRING));
|
||||
|
||||
//
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user