[niepce/gtk4] gtk4: don't crash on create folder



commit 035e1749781c765299e4b44b97418d91a7370859
Author: Hubert Figuière <hub figuiere net>
Date:   Sat May 7 22:14:57 2022 -0400

    gtk4: don't crash on create folder

 .../src/niepce/ui/dialogs/requestnewfolder.rs      | 34 +++++++++++++---------
 1 file changed, 20 insertions(+), 14 deletions(-)
---
diff --git a/niepce-main/src/niepce/ui/dialogs/requestnewfolder.rs 
b/niepce-main/src/niepce/ui/dialogs/requestnewfolder.rs
index 1b9db1d..078a5f5 100644
--- a/niepce-main/src/niepce/ui/dialogs/requestnewfolder.rs
+++ b/niepce-main/src/niepce/ui/dialogs/requestnewfolder.rs
@@ -23,6 +23,7 @@ use gtk4::prelude::*;
 use gtk4::{Dialog, Entry, Label};
 
 use crate::libraryclient::{ClientInterface, LibraryClientWrapper};
+use npc_fwk::err_out;
 
 /// # Safety
 /// Use raw pointers.
@@ -42,26 +43,31 @@ pub unsafe extern "C" fn dialog_request_new_folder(
         ],
     );
     let label = Label::with_mnemonic(gettext("Folder _name:").as_str());
-    dialog.content_area().append(&label);
+    let content_area = dialog.content_area();
+    content_area.append(&label);
     let entry = Entry::new();
     entry.set_text("foobar");
     entry.add_mnemonic_label(&label);
-    dialog.content_area().append(&entry);
+    content_area.append(&entry);
 
     dialog.set_modal(true);
 
     let client = client.client();
-    dialog.connect_response(
-        glib::clone!(@strong entry, @strong client => move |_, response| {
-            let mut client = client.clone();
-            let folder_name = entry.text();
-            let cancel = response != gtk4::ResponseType::Ok;
-            if !cancel {
-                std::sync::Arc::get_mut(&mut client)
-                    .unwrap()
-                    .create_folder(folder_name.to_string(), None);
-            }
-        }),
-    );
+    dialog.connect_response(glib::clone!(@strong entry => move |dialog, response| {
+        let mut client = client.clone();
+        let folder_name = entry.text();
+        let cancel = response != gtk4::ResponseType::Ok;
+        if !cancel {
+            std::sync::Arc::get_mut(&mut client)
+                .map(|client| {
+                    client.create_folder(folder_name.to_string(), None);
+                })
+                .or_else(|| {
+                    err_out!("Can't get libclient, create_folder() failed");
+                    None
+                });
+        }
+        dialog.close();
+    }));
     dialog.show();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]