From 21ae42762d8a57da5cb1ec40b46e7510fc3121ad Mon Sep 17 00:00:00 2001 From: fiaxh Date: Thu, 20 Jun 2024 12:05:20 +0200 Subject: Redesign and rewrite accounts and settings dialog into a combined one --- .../encryption_preferences_page.vala | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 main/src/windows/preferences_window/encryption_preferences_page.vala (limited to 'main/src/windows/preferences_window/encryption_preferences_page.vala') diff --git a/main/src/windows/preferences_window/encryption_preferences_page.vala b/main/src/windows/preferences_window/encryption_preferences_page.vala new file mode 100644 index 00000000..2222584d --- /dev/null +++ b/main/src/windows/preferences_window/encryption_preferences_page.vala @@ -0,0 +1,59 @@ +using Dino.Entities; +using Xmpp; +using Xmpp.Xep; +using Gee; +using Gtk; + +//[GtkTemplate (ui = "/im/dino/Dino/preferences_window_encryption.ui")] +public class Dino.Ui.PreferencesWindowEncryption : Adw.PreferencesPage { + + private DropDown drop_down = null; + private Adw.PreferencesGroup accounts_group = new Adw.PreferencesGroup(); + private ArrayList added_widgets = new ArrayList(); + + public ViewModel.PreferencesWindow model { get; set; } + + construct { + this.add(accounts_group); + + this.notify["model"].connect(() => { + this.model.update.connect(() => { + if (drop_down != null) { + accounts_group.remove(drop_down); + drop_down = null; + } + + if (model.active_accounts_selection.get_n_items() > 0) { + drop_down = new DropDown(model.active_accounts_selection, null) { halign=Align.CENTER }; + drop_down.factory = new BuilderListItemFactory.from_resource(null, "/im/dino/Dino/account_picker_row.ui"); + + drop_down.notify["selected-item"].connect(() => { + var account_details = (ViewModel.AccountDetails) drop_down.selected_item; + if (account_details == null) return; + set_account(account_details.account); + }); + + drop_down.selected = 0; + set_account(((ViewModel.AccountDetails)model.active_accounts_selection.get_item(0)).account); + } else { + drop_down = new DropDown.from_strings(new string[] { _("No active accounts")}) { halign=Align.CENTER }; + } + accounts_group.add(drop_down); + }); + }); + } + + public void set_account(Account account) { + foreach (var widget in added_widgets) { + this.remove(widget); + } + added_widgets.clear(); + + Application app = GLib.Application.get_default() as Application; + foreach (Plugins.EncryptionPreferencesEntry e in app.plugin_registry.encryption_preferences_entries) { + var widget = (Adw.PreferencesGroup) e.get_widget(account, Plugins.WidgetType.GTK4); + this.add(widget); + this.added_widgets.add(widget); + } + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 90ea9c4da4aa885faf7a74ce85c5ec9b1841db2e Mon Sep 17 00:00:00 2001 From: fiaxh Date: Fri, 21 Jun 2024 17:58:00 +0200 Subject: Preferences dialog: Various improvements - Only show avatar remove button if one is set, fixes #1589 - Only show account picker if user has more than one account --- .../account_preferences_subpage.vala | 8 ++- .../encryption_preferences_page.vala | 58 ++++++++++++++-------- 2 files changed, 43 insertions(+), 23 deletions(-) (limited to 'main/src/windows/preferences_window/encryption_preferences_page.vala') diff --git a/main/src/windows/preferences_window/account_preferences_subpage.vala b/main/src/windows/preferences_window/account_preferences_subpage.vala index 01cf5584..a1966e34 100644 --- a/main/src/windows/preferences_window/account_preferences_subpage.vala +++ b/main/src/windows/preferences_window/account_preferences_subpage.vala @@ -123,8 +123,14 @@ public class Dino.Ui.AccountPreferencesSubpage : Gtk.Box { return true; }); + // Only show avatar removal button if an avatar is set + var avatar_model = model.selected_account.avatar_model.tiles.get_item(0) as ViewModel.AvatarPictureTileModel; + avatar_model.notify["image-file"].connect(() => { + remove_avatar_button.visible = avatar_model.image_file != null; + }); + remove_avatar_button.visible = avatar_model.image_file != null; + model.selected_account.notify["connection-error"].connect(() => { - // TODO doesn't work if (model.selected_account.connection_error != null) { connection_status.add_css_class("error"); } else { diff --git a/main/src/windows/preferences_window/encryption_preferences_page.vala b/main/src/windows/preferences_window/encryption_preferences_page.vala index 2222584d..7477e6cd 100644 --- a/main/src/windows/preferences_window/encryption_preferences_page.vala +++ b/main/src/windows/preferences_window/encryption_preferences_page.vala @@ -18,36 +18,50 @@ public class Dino.Ui.PreferencesWindowEncryption : Adw.PreferencesPage { this.notify["model"].connect(() => { this.model.update.connect(() => { - if (drop_down != null) { - accounts_group.remove(drop_down); - drop_down = null; - } - - if (model.active_accounts_selection.get_n_items() > 0) { - drop_down = new DropDown(model.active_accounts_selection, null) { halign=Align.CENTER }; - drop_down.factory = new BuilderListItemFactory.from_resource(null, "/im/dino/Dino/account_picker_row.ui"); - - drop_down.notify["selected-item"].connect(() => { - var account_details = (ViewModel.AccountDetails) drop_down.selected_item; - if (account_details == null) return; - set_account(account_details.account); - }); - - drop_down.selected = 0; - set_account(((ViewModel.AccountDetails)model.active_accounts_selection.get_item(0)).account); - } else { - drop_down = new DropDown.from_strings(new string[] { _("No active accounts")}) { halign=Align.CENTER }; - } - accounts_group.add(drop_down); + repopulate_account_selector(); }); }); } - public void set_account(Account account) { + private void repopulate_account_selector() { + // Remove current selector + if (drop_down != null) { + accounts_group.remove(drop_down); + drop_down = null; + } + + // Don't show selector if the user has only one account (active + inactive) + accounts_group.visible = model.account_details.size != 1; + + // Populate selector + if (model.active_accounts_selection.get_n_items() > 0) { + drop_down = new DropDown(model.active_accounts_selection, null) { halign=Align.CENTER }; + drop_down.factory = new BuilderListItemFactory.from_resource(null, "/im/dino/Dino/account_picker_row.ui"); + + drop_down.notify["selected-item"].connect(() => { + var account_details = (ViewModel.AccountDetails) drop_down.selected_item; + if (account_details == null) return; + set_account(account_details.account); + }); + + drop_down.selected = 0; + set_account(((ViewModel.AccountDetails)model.active_accounts_selection.get_item(0)).account); + } else { + drop_down = new DropDown.from_strings(new string[] { _("No active accounts")}) { halign=Align.CENTER }; + unset_account(); + } + accounts_group.add(drop_down); + } + + private void unset_account() { foreach (var widget in added_widgets) { this.remove(widget); } added_widgets.clear(); + } + + private void set_account(Account account) { + unset_account(); Application app = GLib.Application.get_default() as Application; foreach (Plugins.EncryptionPreferencesEntry e in app.plugin_registry.encryption_preferences_entries) { -- cgit v1.2.3-70-g09d2