From 1254a753eb3c85f35e5bc322dbe4a3f177e79c88 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sat, 14 Jun 2025 17:01:15 +0200 Subject: Support media elements in data forms --- libdino/src/service/registration.vala | 1 + main/src/ui/util/data_forms.vala | 6 ++++++ main/src/ui/util/preference_group.vala | 6 ++++++ main/src/view_model/preferences_row.vala | 3 +++ 4 files changed, 16 insertions(+) diff --git a/libdino/src/service/registration.vala b/libdino/src/service/registration.vala index 8a8e75b1..0c17fa2e 100644 --- a/libdino/src/service/registration.vala +++ b/libdino/src/service/registration.vala @@ -141,6 +141,7 @@ public class Register : StreamInteractionModule, Object{ Gee.List list = new ArrayList(); list.add(new Iq.Module()); list.add(new Xep.InBandRegistration.Module()); + list.add(new Xep.BitsOfBinary.Module()); XmppStreamResult stream_result = yield Xmpp.establish_stream(jid.domain_jid, list, Application.print_xmpp, (peer_cert, errors) => { return ConnectionManager.on_invalid_certificate(jid.domainpart, peer_cert, errors); } diff --git a/main/src/ui/util/data_forms.vala b/main/src/ui/util/data_forms.vala index 1b8d3271..dfdef15c 100644 --- a/main/src/ui/util/data_forms.vala +++ b/main/src/ui/util/data_forms.vala @@ -115,6 +115,12 @@ public static ViewModel.PreferencesRow.Any? get_data_form_field_view_model(DataF return null; } + var media_node = field.node.get_subnode("media", "urn:xmpp:media-element"); + if (media_node != null) { + view_model.media_type = media_node.get_attribute("type", "urn:xmpp:media-element"); + view_model.media_uri = media_node.get_deep_string_content("uri"); + } + view_model.title = label; return view_model; } diff --git a/main/src/ui/util/preference_group.vala b/main/src/ui/util/preference_group.vala index fca3d677..0a8e37c7 100644 --- a/main/src/ui/util/preference_group.vala +++ b/main/src/ui/util/preference_group.vala @@ -1,4 +1,5 @@ using Gee; +using Gdk; using Gtk; using Dino.Entities; @@ -24,6 +25,11 @@ namespace Dino.Ui.Util { 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 }; + if (preferences_row.media_uri != null) { + var bytes = BitsOfBinary.get_data_for_uri(preferences_row.media_uri); + Picture picture = new Picture.for_paintable(Texture.from_bytes(bytes)); + view.add_suffix(picture); + } entry_view_model.bind_property("text", view, "text", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL, (_, from, ref to) => { var str = (string) from; to = str ?? ""; diff --git a/main/src/view_model/preferences_row.vala b/main/src/view_model/preferences_row.vala index 624be6e6..fd771cc4 100644 --- a/main/src/view_model/preferences_row.vala +++ b/main/src/view_model/preferences_row.vala @@ -7,6 +7,9 @@ using Gtk; namespace Dino.Ui.ViewModel.PreferencesRow { public abstract class Any : Object { public string title { get; set; } + + public string? media_type { get; set; } + public string? media_uri { get; set; } } public class Text : Any { -- cgit v1.3