update list model on item delete

This commit is contained in:
yggverse 2024-11-29 08:48:14 +02:00
parent 29083f50d9
commit 6ed544ca62
3 changed files with 33 additions and 6 deletions

View File

@ -31,11 +31,11 @@ impl Form {
/// Create new `Self` /// Create new `Self`
pub fn new(profile: Rc<Profile>, action: Rc<Action>) -> Self { pub fn new(profile: Rc<Profile>, action: Rc<Action>) -> Self {
// Init components // Init components
let drop = Rc::new(Drop::new(profile.clone(), action.clone()));
let file = Rc::new(File::new(action.clone())); let file = Rc::new(File::new(action.clone()));
let list = Rc::new(List::new()); let list = Rc::new(List::new());
let name = Rc::new(Name::new(action.clone())); let name = Rc::new(Name::new(action.clone()));
let save = Rc::new(Save::new(profile)); let save = Rc::new(Save::new(profile.clone()));
let drop = Rc::new(Drop::new(profile.clone(), action.clone(), list.clone()));
// Init main container // Init main container
let gobject = Box::builder().orientation(Orientation::Vertical).build(); let gobject = Box::builder().orientation(Orientation::Vertical).build();

View File

@ -1,4 +1,5 @@
use super::Action; use super::Action;
use super::List;
use crate::profile::Profile; use crate::profile::Profile;
use adw::{ use adw::{
prelude::{AdwDialogExt, AlertDialogExt, AlertDialogExtManual}, prelude::{AdwDialogExt, AlertDialogExt, AlertDialogExtManual},
@ -30,7 +31,7 @@ impl Drop {
// Constructors // Constructors
/// Create new `Self` /// Create new `Self`
pub fn new(profile: Rc<Profile>, action: Rc<Action>) -> Self { pub fn new(profile: Rc<Profile>, action: Rc<Action>, list: Rc<List>) -> Self {
// Init selected option holder // Init selected option holder
let profile_identity_gemini_id = Rc::new(RefCell::new(None::<i64>)); let profile_identity_gemini_id = Rc::new(RefCell::new(None::<i64>));
@ -76,14 +77,21 @@ impl Drop {
// Connect confirmation event // Connect confirmation event
dialog.connect_response(Some(RESPONSE_CONFIRM.0), { dialog.connect_response(Some(RESPONSE_CONFIRM.0), {
let action = action.clone(); let action = action.clone();
let profile = profile.clone();
let gobject = gobject.clone(); let gobject = gobject.clone();
let list = list.clone();
let profile = profile.clone();
let profile_identity_gemini_id = profile_identity_gemini_id.clone(); let profile_identity_gemini_id = profile_identity_gemini_id.clone();
move |_, _| { move |_, _| {
match profile.identity.gemini.delete(profile_identity_gemini_id) { match profile.identity.gemini.delete(profile_identity_gemini_id) {
Ok(_) => { Ok(_) => {
if list.remove(profile_identity_gemini_id).is_some() {
gobject.set_css_classes(&["success"]); gobject.set_css_classes(&["success"]);
gobject.set_label("Identity successfully deleted") gobject.set_label("Identity successfully deleted")
} else {
gobject.set_css_classes(&["error"]);
gobject.set_label("List item not found")
// @TODO unexpected
}
} }
Err(e) => { Err(e) => {
gobject.set_css_classes(&["error"]); gobject.set_css_classes(&["error"]);

View File

@ -88,6 +88,25 @@ impl List {
self.model.append(&Item::new(value, title, subtitle)); self.model.append(&Item::new(value, title, subtitle));
} }
/// Find list item by `Value`
/// * return list item `position` found
pub fn find(&self, value: i64) -> Option<u32> {
self.model
.find_with_equal_func(|this| value == this.clone().downcast::<Item>().unwrap().value())
}
/// Remove list item by `Value`
/// * return `position` of removed list item
pub fn remove(&self, value: i64) -> Option<u32> {
match self.find(value) {
Some(position) => {
self.model.remove(position);
Some(position)
}
None => None,
}
}
// Events // Events
/// Run callback function on `connect_selected_notify` event /// Run callback function on `connect_selected_notify` event