diff options
author | Niels De Graef <nielsdegraef@gmail.com> | 2018-04-22 18:27:00 +0200 |
---|---|---|
committer | Niels De Graef <nielsdegraef@gmail.com> | 2018-05-08 00:21:11 +0200 |
commit | 28f84169c6e275de8cee75da53282ab9a7b1270c (patch) | |
tree | bc2d50eb3a4b1a0d21a3aa0149d3d824fd5a0140 | |
parent | 0919e6233533c5ec15ece6d5217e04ff61024f29 (diff) | |
download | gnome-contacts-28f84169c6e275de8cee75da53282ab9a7b1270c.tar.gz |
ContactEditor: don't reuse for multiple contacts.
This meant we had to take care of much more state than desirable. This
also allows us to take care of some stuff like extracting common code
with that in the ContactSheet.
-rw-r--r-- | src/contacts-contact-editor.vala | 196 | ||||
-rw-r--r-- | src/contacts-contact-pane.vala | 68 |
2 files changed, 126 insertions, 138 deletions
diff --git a/src/contacts-contact-editor.vala b/src/contacts-contact-editor.vala index a311525..8e224e6 100644 --- a/src/contacts-contact-editor.vala +++ b/src/contacts-contact-editor.vala @@ -1,4 +1,3 @@ -/* -*- Mode: vala; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ /* * Copyright (C) 2011 Alexander Larsson <alexl@redhat.com> * @@ -60,6 +59,9 @@ public class Contacts.AddressEditor : Box { } } +/** + * A widget that allows the user to edit a given {@link Contact}. + */ [GtkTemplate (ui = "/org/gnome/Contacts/ui/contacts-contact-editor.ui")] public class Contacts.ContactEditor : Grid { @@ -108,7 +110,7 @@ public class Contacts.ContactEditor : Grid { private int last_row; /* the key of the hash_map is the uid of the persona */ - private HashMap<string, HashMap<string, Field?> > writable_personas; + private HashMap<string, HashMap<string, Field?>> writable_personas; public bool has_birthday_row { get; private set; default = false; @@ -122,6 +124,90 @@ public class Contacts.ContactEditor : Grid { get; private set; default = false; } + construct { + this.writable_personas = new HashMap<string, HashMap<string, Field?>> (); + + this.container_grid.set_focus_vadjustment (this.main_sw.get_vadjustment ()); + + this.main_sw.get_style_context ().add_class ("contacts-main-view"); + this.main_sw.get_style_context ().add_class ("view"); + } + + public ContactEditor (Contact? contact, Store store, GLib.ActionGroup editor_actions) { + this.store = store; + this.contact = contact; + + this.add_detail_button.get_popover ().insert_action_group ("edit", editor_actions); + + if (contact != null) { + this.remove_button.sensitive = contact.can_remove_personas (); + this.linked_button.sensitive = contact.individual.personas.size > 1; + } else { + this.remove_button.hide (); + this.linked_button.hide (); + } + + create_avatar_button (); + create_name_entry (); + + if (contact != null) + fill_in_contact (); + else + fill_in_empty (); + + show_all (); + } + + private void fill_in_contact () { + int i = 3; + int last_store_position = 0; + bool is_first_persona = true; + + var personas = this.contact.get_personas_for_display (); + foreach (var p in personas) { + if (!is_first_persona) { + var store_name = new Label(""); + store_name.set_markup (Markup.printf_escaped ("<span font='16px bold'>%s</span>", + Contact.format_persona_store_name_for_contact (p))); + store_name.set_halign (Align.START); + store_name.xalign = 0.0f; + store_name.margin_start = 6; + container_grid.attach (store_name, 0, i, 2, 1); + last_store_position = ++i; + } + + var rw_props = Contact.sort_persona_properties (p.writeable_properties); + if (rw_props.length != 0) { + this.writable_personas[p.uid] = new HashMap<string, Field?> (); + foreach (var prop in rw_props) + add_edit_row (p, prop, ref i); + } + + if (is_first_persona) + this.last_row = i - 1; + + if (i != 3) + is_first_persona = false; + + if (i == last_store_position) { + i--; + this.container_grid.get_child_at (0, i).destroy (); + } + } + } + + private void fill_in_empty () { + this.last_row = 2; + + this.writable_personas["null-persona.hack"] = new HashMap<string, Field?> (); + foreach (var prop in DEFAULT_PROPS_NEW_CONTACT) { + var tok = prop.split ("."); + add_new_row_for_property (null, tok[0], tok[1].up ()); + } + + this.focus_widget = this.name_entry; + } + Value get_value_from_emails (HashMap<int, RowData?> rows) { var new_details = new HashSet<EmailFieldDetails>(); @@ -763,112 +849,6 @@ public class Contacts.ContactEditor : Grid { } } - public ContactEditor (Store store, SimpleActionGroup editor_actions) { - this.store = store; - - this.container_grid.set_focus_vadjustment (this.main_sw.get_vadjustment ()); - - this.main_sw.get_style_context ().add_class ("contacts-main-view"); - this.main_sw.get_style_context ().add_class ("view"); - - this.add_detail_button.get_popover ().insert_action_group ("edit", editor_actions); - - this.writable_personas = new HashMap<string, HashMap<string, Field?>> (); - } - - /** - * Adjusts the ContactEditor to the given contact. - * Use clear() to make sure nothing is lingering from the previous one. - */ - public void edit (Contact c) { - contact = c; - - remove_button.show (); - remove_button.sensitive = contact.can_remove_personas (); - linked_button.show (); - linked_button.sensitive = contact.individual.personas.size > 1; - - create_avatar_button (); - create_name_entry (); - - int i = 3; - int last_store_position = 0; - bool is_first_persona = true; - - var personas = c.get_personas_for_display (); - foreach (var p in personas) { - if (!is_first_persona) { - var store_name = new Label(""); - store_name.set_markup (Markup.printf_escaped ("<span font='16px bold'>%s</span>", - Contact.format_persona_store_name_for_contact (p))); - store_name.set_halign (Align.START); - store_name.xalign = 0.0f; - store_name.margin_start = 6; - container_grid.attach (store_name, 0, i, 2, 1); - last_store_position = ++i; - } - - var rw_props = Contact.sort_persona_properties (p.writeable_properties); - if (rw_props.length != 0) { - writable_personas.set (p.uid, new HashMap<string, Field?> ()); - foreach (var prop in rw_props) { - add_edit_row (p, prop, ref i); - } - } - - if (is_first_persona) { - last_row = i - 1; - } - - if (i != 3) { - is_first_persona = false; - } - - if (i == last_store_position) { - i--; - container_grid.get_child_at (0, i).destroy (); - } - } - } - - /** - * Adjusts the ContactEditor for a new contact. - * Use clear() to make sure nothing is lingering from the previous one. - */ - public void set_new_contact () { - remove_button.hide (); - linked_button.hide (); - - create_avatar_button (); - create_name_entry (); - this.last_row = 2; - - writable_personas["null-persona.hack"] = new HashMap<string, Field?> (); - foreach (var prop in DEFAULT_PROPS_NEW_CONTACT) { - var tok = prop.split ("."); - add_new_row_for_property (null, tok[0], tok[1].up ()); - } - - this.focus_widget = this.name_entry; - } - - public void clear () { - foreach (var w in container_grid.get_children ()) { - w.destroy (); - } - - remove_button.set_sensitive (false); - linked_button.set_sensitive (false); - - /* clean metadata as well */ - has_birthday_row = false; - has_nickname_row = false; - has_notes_row = false; - - writable_personas.clear (); - contact = null; - } - public HashMap<string, PropertyData?> properties_changed () { var props_set = new HashMap<string, PropertyData?> (); diff --git a/src/contacts-contact-pane.vala b/src/contacts-contact-pane.vala index e2ee36e..ffb5d62 100644 --- a/src/contacts-contact-pane.vala +++ b/src/contacts-contact-pane.vala @@ -46,7 +46,7 @@ public class Contacts.ContactPane : Stack { [GtkChild] private Box contact_editor_page; - private ContactEditor editor; + private ContactEditor? editor = null; private SimpleActionGroup edit_contact_actions = new SimpleActionGroup (); private const GLib.ActionEntry[] action_entries = { @@ -80,25 +80,6 @@ public class Contacts.ContactPane : Stack { this.store = contacts_store; this.edit_contact_actions.add_action_entries (action_entries, this); - - // Contact editor - this.editor = new ContactEditor (this.store, this.edit_contact_actions); - this.editor.linked_button.clicked.connect (linked_accounts); - this.editor.remove_button.clicked.connect (delete_contact); - this.contact_editor_page.add (this.editor); - - /* enable/disable actions*/ - var birthday_action = this.edit_contact_actions.lookup_action ("add.birthday") as SimpleAction; - this.editor.bind_property ("has-birthday-row", birthday_action, "enabled", - BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); - - var nickname_action = this.edit_contact_actions.lookup_action ("add.nickname") as SimpleAction; - this.editor.bind_property ("has-nickname-row", nickname_action, "enabled", - BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); - - var notes_action = this.edit_contact_actions.lookup_action ("add.notes") as SimpleAction; - this.editor.bind_property ("has-notes-row", notes_action, "enabled", - BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); } public void add_suggestion (Contact c) { @@ -169,6 +150,38 @@ public class Contacts.ContactPane : Stack { this.sheet = null; } + private void create_contact_editor () { + if (this.editor != null) + remove_contact_editor (); + + this.editor = new ContactEditor (this.contact, this.store, this.edit_contact_actions); + this.editor.linked_button.clicked.connect (linked_accounts); + this.editor.remove_button.clicked.connect (delete_contact); + + /* enable/disable actions*/ + var birthday_action = this.edit_contact_actions.lookup_action ("add.birthday") as SimpleAction; + this.editor.bind_property ("has-birthday-row", birthday_action, "enabled", + BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + + var nickname_action = this.edit_contact_actions.lookup_action ("add.nickname") as SimpleAction; + this.editor.bind_property ("has-nickname-row", nickname_action, "enabled", + BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + + var notes_action = this.edit_contact_actions.lookup_action ("add.notes") as SimpleAction; + this.editor.bind_property ("has-notes-row", notes_action, "enabled", + BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + + this.contact_editor_page.add (this.editor); + } + + private void remove_contact_editor () { + if (this.editor == null) + return; + + this.contact_editor_page.remove (this.editor); + this.editor = null; + } + void on_add_detail (GLib.SimpleAction action, GLib.Variant? parameter) { var tok = action.name.split ("."); @@ -203,10 +216,7 @@ public class Contacts.ContactPane : Stack { this.on_edit_mode = true; remove_contact_sheet (); - - this.editor.clear (); - this.editor.edit (this.contact); - this.editor.show_all (); + create_contact_editor (); set_visible_child (this.contact_editor_page); } @@ -219,7 +229,7 @@ public class Contacts.ContactPane : Stack { if (!drop_changes) save_editor_changes.begin (); - this.editor.clear (); + remove_contact_editor (); if (this.contact != null) show_contact_sheet (); @@ -257,12 +267,10 @@ public class Contacts.ContactPane : Stack { } public void new_contact () { - on_edit_mode = true; - + this.on_edit_mode = true; + this.contact = null; remove_contact_sheet (); - - editor.set_new_contact (); - + create_contact_editor (); set_visible_child (this.contact_editor_page); } |