[gnome-contacts/nielsdg/fix-unnamed-person-after-contact-save: 3/3] pane: Select the new individual after saving changes




commit e515d79d4f9440534cf64f1b893f96c2022d6502
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Thu Sep 29 18:41:21 2022 +0200

    pane: Select the new individual after saving changes
    
    Fixes: https://gitlab.gnome.org/GNOME/gnome-contacts/-/issues/271

 src/contacts-contact-pane.vala | 16 ++++++++++++++--
 src/core/contacts-contact.vala | 14 +++++++++++++-
 2 files changed, 27 insertions(+), 3 deletions(-)
---
diff --git a/src/contacts-contact-pane.vala b/src/contacts-contact-pane.vala
index ffdcbf33..ee9ee6c3 100644
--- a/src/contacts-contact-pane.vala
+++ b/src/contacts-contact-pane.vala
@@ -176,12 +176,24 @@ public class Contacts.ContactPane : Adw.Bin {
     }
 
     try {
-      yield contact.apply_changes (this.store.aggregator.primary_store);
+      // The new individual. Even when editing an exisiting contact, it might
+      // be a different Individual than before, so make sure to adjust our
+      // selected contact afterwards
+      unowned var individual =
+          yield contact.apply_changes (this.store.aggregator.primary_store);
+      debug ("Applied changes resulted in individual (%s)",
+             (individual != null)? individual.id : "null");
+
+      if (individual != null) {
+        var pos = yield this.store.find_individual_for_id (individual.id);
+        if (pos != Gtk.INVALID_LIST_POSITION)
+          this.store.selection.selected = pos;
+      }
     } catch (Error err) {
       warning ("Couldn't save changes: %s", err.message);
+      show_contact (null);
       // XXX do something better here
     }
-    show_contact_sheet (contact);
   }
 
   public void edit_contact () {
diff --git a/src/core/contacts-contact.vala b/src/core/contacts-contact.vala
index 866ec187..5fcc7425 100644
--- a/src/core/contacts-contact.vala
+++ b/src/core/contacts-contact.vala
@@ -258,14 +258,21 @@ public class Contacts.Contact : GLib.Object, GLib.ListModel {
    * Applies any pending changes to all chunks. This can mean either a new
    * persona is made, or it is saved in the chunk's referenced persona.
    * When a new persona is made, it will be added to @store.
+   *
+   * Returns the Individual that was created from applying the changes
    */
-  public async void apply_changes (PersonaStore store) throws GLib.Error {
+  public async unowned Individual? apply_changes (PersonaStore store) throws GLib.Error {
+    unowned Individual? individual = null;
+
     // For those that were a persona: save the properties using the API
     for (uint i = 0; i < this.chunks.length; i++) {
       unowned var chunk = this.chunks[i];
       if (chunk.persona == null)
         continue;
 
+      if (individual == null)
+        individual = chunk.persona.individual;
+
       if (!(chunk.property_name in chunk.persona.writeable_properties)) {
         warning ("Can't save to unwriteable property '%s' to persona %s",
                  chunk.property_name, chunk.persona.uid);
@@ -303,6 +310,11 @@ public class Contacts.Contact : GLib.Object, GLib.ListModel {
       var persona = yield store.add_persona_from_details (new_details);
       debug ("Successfully created new persona %p", persona);
       // FIXME: should we set the persona for these chunks?
+
+      if (individual == null && persona != null)
+        individual = persona.individual;
     }
+
+    return individual;
   }
 }


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