aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/util
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/util')
-rw-r--r--main/src/ui/util/data_forms.vala65
-rw-r--r--main/src/ui/util/preference_group.vala106
2 files changed, 127 insertions, 44 deletions
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