From 63ba0bc93636de557ced29c19b2b61eeeab57bf8 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 15 Sep 2024 19:20:41 +0200 Subject: Refresh "Add account" UI --- main/src/ui/util/data_forms.vala | 65 +++++++------------- main/src/ui/util/preference_group.vala | 106 +++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 44 deletions(-) create mode 100644 main/src/ui/util/preference_group.vala (limited to 'main/src/ui/util') diff --git a/main/src/ui/util/data_forms.vala b/main/src/ui/util/data_forms.vala index 39dce3ee..1b8d3271 100644 --- a/main/src/ui/util/data_forms.vala +++ b/main/src/ui/util/data_forms.vala @@ -5,6 +5,17 @@ using Dino.Entities; using Xmpp.Xep; namespace Dino.Ui.Util { + public static GLib.ListStore get_data_form_view_model(DataForms.DataForm data_form) { + var list_store = new GLib.ListStore(typeof(ViewModel.PreferencesRow.Any)); + + foreach (var field in data_form.fields) { + var field_view_model = Util.get_data_form_field_view_model(field); + if (field_view_model != null) { + list_store.append(field_view_model); + } + } + return list_store; + } public static ViewModel.PreferencesRow.Any? get_data_form_field_view_model(DataForms.DataForm.Field field) { if (field.type_ == null) return null; @@ -58,6 +69,11 @@ public static ViewModel.PreferencesRow.Any? get_data_form_field_view_model(DataF if (label == null) label = field.label; switch (field.type_) { + case DataForms.DataForm.Type.FIXED: + var fixed_field = field as DataForms.DataForm.FixedField; + var fixed_model = new ViewModel.PreferencesRow.Text() { text=fixed_field.value }; + view_model = fixed_model; + break; case DataForms.DataForm.Type.BOOLEAN: DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField; var toggle_model = new ViewModel.PreferencesRow.Toggle() { subtitle = desc, state = boolean_field.value }; @@ -84,7 +100,11 @@ public static ViewModel.PreferencesRow.Any? get_data_form_field_view_model(DataF case DataForms.DataForm.Type.LIST_MULTI: return null; case DataForms.DataForm.Type.TEXT_PRIVATE: - return null; + DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField; + var private_entry_model = new ViewModel.PreferencesRow.PrivateText() { text = text_private_field.value }; + text_private_field.bind_property("value", private_entry_model, "text", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); + view_model = private_entry_model; + break; case DataForms.DataForm.Type.TEXT_SINGLE: DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField; var entry_model = new ViewModel.PreferencesRow.Entry() { text = text_single_field.value }; @@ -98,47 +118,4 @@ public static ViewModel.PreferencesRow.Any? get_data_form_field_view_model(DataF view_model.title = label; return view_model; } - -public static Widget? get_data_form_field_widget(DataForms.DataForm.Field field) { - if (field.type_ == null) return null; - switch (field.type_) { - case DataForms.DataForm.Type.BOOLEAN: - DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField; - Switch sw = new Switch() { active=boolean_field.value, halign=Align.START, valign=Align.CENTER }; - sw.state_set.connect((state) => { - boolean_field.value = state; - return false; - }); - return sw; - case DataForms.DataForm.Type.JID_MULTI: - return null; - case DataForms.DataForm.Type.LIST_SINGLE: - DataForms.DataForm.ListSingleField list_single_field = field as DataForms.DataForm.ListSingleField; - ComboBoxText combobox = new ComboBoxText() { valign=Align.CENTER }; - for (int i = 0; i < list_single_field.options.size; i++) { - DataForms.DataForm.Option option = list_single_field.options[i]; - combobox.append(option.value, option.label); - if (option.value == list_single_field.value) combobox.active = i; - } - combobox.changed.connect(() => { - list_single_field.value = combobox.get_active_id(); - }); - return combobox; - case DataForms.DataForm.Type.LIST_MULTI: - return null; - case DataForms.DataForm.Type.TEXT_PRIVATE: - DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField; - PasswordEntry entry = new PasswordEntry() { text=text_private_field.value ?? "", valign=Align.CENTER }; - entry.changed.connect(() => { text_private_field.value = entry.text; }); - return entry; - case DataForms.DataForm.Type.TEXT_SINGLE: - DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField; - Entry entry = new Entry() { text=text_single_field.value ?? "", valign=Align.CENTER }; - entry.changed.connect(() => { text_single_field.value = entry.text; }); - return entry; - default: - return null; - } -} - } diff --git a/main/src/ui/util/preference_group.vala b/main/src/ui/util/preference_group.vala new file mode 100644 index 00000000..8f3a34f3 --- /dev/null +++ b/main/src/ui/util/preference_group.vala @@ -0,0 +1,106 @@ +using Gee; +using Gtk; + +using Dino.Entities; +using Xmpp.Xep; + +namespace Dino.Ui.Util { + public Adw.PreferencesGroup rows_to_preference_group(GLib.ListStore row_view_models, string title) { + var preference_group = new Adw.PreferencesGroup() { title=title }; + + for (int preference_group_i = 0; preference_group_i < row_view_models.get_n_items(); preference_group_i++) { + var preferences_row = (ViewModel.PreferencesRow.Any) row_view_models.get_item(preference_group_i); + + Widget? w = null; + + var entry_view_model = preferences_row as ViewModel.PreferencesRow.Entry; + if (entry_view_model != null) { + Adw.EntryRow view = new Adw.EntryRow() { title = entry_view_model.title, show_apply_button=true }; + entry_view_model.bind_property("text", view, "text", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL, (_, from, ref to) => { + var str = (string) from; + to = str ?? ""; + return true; + }); + view.apply.connect(() => { + entry_view_model.changed(); + }); + w = view; + } + + var password_view_model = preferences_row as ViewModel.PreferencesRow.PrivateText; + if (password_view_model != null) { + Adw.PasswordEntryRow view = new Adw.PasswordEntryRow() { title = password_view_model.title, show_apply_button=true }; + password_view_model.bind_property("text", view, "text", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL, (_, from, ref to) => { + var str = (string) from; + to = str ?? ""; + return true; + }); + view.apply.connect(() => { + password_view_model.changed(); + }); + + w = view; + } + + var row_text = preferences_row as ViewModel.PreferencesRow.Text; + if (row_text != null) { + w = new Adw.ActionRow() { + title = row_text.title, + subtitle = row_text.text, +#if Adw_1_3 + subtitle_selectable = true, +#endif + }; + w.add_css_class("property"); + + Util.force_css(w, "row.property > box.header > box.title > .title { font-weight: 400; font-size: 9pt; opacity: 0.55; }"); + Util.force_css(w, "row.property > box.header > box.title > .subtitle { font-size: inherit; opacity: 1; }"); + } + + var toggle_view_model = preferences_row as ViewModel.PreferencesRow.Toggle; + if (toggle_view_model != null) { + var view = new Adw.ActionRow() { title = toggle_view_model.title, subtitle = toggle_view_model.subtitle }; + var toggle = new Switch() { valign = Align.CENTER }; + view.activatable_widget = toggle; + view.add_suffix(toggle); + toggle_view_model.bind_property("state", toggle, "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); + w = view; + } + + var combobox_view_model = preferences_row as ViewModel.PreferencesRow.ComboBox; + if (combobox_view_model != null) { + var string_list = new StringList(null); + foreach (string text in combobox_view_model.items) { + string_list.append(text); + } +#if Adw_1_4 + var view = new Adw.ComboRow() { title = combobox_view_model.title }; + view.model = string_list; + combobox_view_model.bind_property("active-item", view, "selected", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); +#else + var view = new Adw.ActionRow() { title = combobox_view_model.title }; + var drop_down = new DropDown(string_list, null) { valign = Align.CENTER }; + combobox_view_model.bind_property("active-item", drop_down, "selected", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); + view.activatable_widget = drop_down; + view.add_suffix(drop_down); +#endif + w = view; + } + + var widget_view_model = preferences_row as ViewModel.PreferencesRow.WidgetDeprecated; + if (widget_view_model != null) { + var view = new Adw.ActionRow() { title = widget_view_model.title }; + view.add_suffix(widget_view_model.widget); + w = view; + } + + if (w == null) { + continue; + } + + preference_group.add(w); + } + + return preference_group; + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2