diff --git a/po/POTFILES.in b/po/POTFILES.in index 94d5d463..4d9ed498 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -117,38 +117,38 @@ src/session/view/content/invite.blp src/session/view/content/invite_request.rs src/session/view/content/invite_request.blp src/session/view/content/mod.blp -src/session/view/content/room_details/addresses_subpage/completion_popover.ui +src/session/view/content/room_details/addresses_subpage/completion_popover.blp src/session/view/content/room_details/addresses_subpage/mod.rs -src/session/view/content/room_details/addresses_subpage/mod.ui +src/session/view/content/room_details/addresses_subpage/mod.blp src/session/view/content/room_details/edit_details_subpage.rs -src/session/view/content/room_details/edit_details_subpage.ui +src/session/view/content/room_details/edit_details_subpage.blp src/session/view/content/room_details/general_page.rs -src/session/view/content/room_details/general_page.ui +src/session/view/content/room_details/general_page.blp src/session/view/content/room_details/history_viewer/audio_row.rs -src/session/view/content/room_details/history_viewer/audio_row.ui -src/session/view/content/room_details/history_viewer/audio.ui +src/session/view/content/room_details/history_viewer/audio_row.blp +src/session/view/content/room_details/history_viewer/audio.blp src/session/view/content/room_details/history_viewer/file_row.rs -src/session/view/content/room_details/history_viewer/file_row.ui -src/session/view/content/room_details/history_viewer/file.ui -src/session/view/content/room_details/history_viewer/visual_media.ui +src/session/view/content/room_details/history_viewer/file_row.blp +src/session/view/content/room_details/history_viewer/file.blp +src/session/view/content/room_details/history_viewer/visual_media.blp src/session/view/content/room_details/invite_subpage/list.rs src/session/view/content/room_details/invite_subpage/mod.rs -src/session/view/content/room_details/invite_subpage/mod.ui +src/session/view/content/room_details/invite_subpage/mod.blp src/session/view/content/room_details/join_rule_subpage.rs -src/session/view/content/room_details/join_rule_subpage.ui -src/session/view/content/room_details/member_row.ui +src/session/view/content/room_details/join_rule_subpage.blp +src/session/view/content/room_details/member_row.blp src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.rs src/session/view/content/room_details/members_page/members_list_view/mod.rs -src/session/view/content/room_details/members_page/members_list_view/mod.ui +src/session/view/content/room_details/members_page/members_list_view/mod.blp src/session/view/content/room_details/mod.rs -src/session/view/content/room_details/mod.ui -src/session/view/content/room_details/permissions/add_members_subpage.ui +src/session/view/content/room_details/mod.blp +src/session/view/content/room_details/permissions/add_members_subpage.blp src/session/view/content/room_details/permissions/members_subpage.rs -src/session/view/content/room_details/permissions/members_subpage.ui +src/session/view/content/room_details/permissions/members_subpage.blp src/session/view/content/room_details/permissions/permissions_subpage.rs -src/session/view/content/room_details/permissions/permissions_subpage.ui +src/session/view/content/room_details/permissions/permissions_subpage.blp src/session/view/content/room_details/upgrade_dialog/mod.rs -src/session/view/content/room_details/upgrade_dialog/mod.ui +src/session/view/content/room_details/upgrade_dialog/mod.blp src/session/view/content/room_history/divider_row.rs src/session/view/content/room_history/event_actions/context_menu.rs src/session/view/content/room_history/event_actions/context_menu.ui diff --git a/src/blp-resources.in b/src/blp-resources.in index f9ea7ea2..ac3c7916 100644 --- a/src/blp-resources.in +++ b/src/blp-resources.in @@ -83,4 +83,28 @@ session/view/content/explore/servers_popover.blp session/view/content/invite.blp session/view/content/invite_request.blp session/view/content/mod.blp +session/view/content/room_details/addresses_subpage/completion_popover.blp +session/view/content/room_details/addresses_subpage/mod.blp +session/view/content/room_details/edit_details_subpage.blp +session/view/content/room_details/general_page.blp +session/view/content/room_details/history_viewer/audio.blp +session/view/content/room_details/history_viewer/audio_row.blp +session/view/content/room_details/history_viewer/file.blp +session/view/content/room_details/history_viewer/file_row.blp +session/view/content/room_details/history_viewer/visual_media.blp +session/view/content/room_details/history_viewer/visual_media_item.blp +session/view/content/room_details/invite_subpage/mod.blp +session/view/content/room_details/invite_subpage/row.blp +session/view/content/room_details/join_rule_subpage.blp +session/view/content/room_details/member_row.blp +session/view/content/room_details/members_page/members_list_view/membership_subpage_row.blp +session/view/content/room_details/members_page/members_list_view/mod.blp +session/view/content/room_details/members_page/mod.blp +session/view/content/room_details/mod.blp +session/view/content/room_details/permissions/add_members_subpage.blp +session/view/content/room_details/permissions/member_row.blp +session/view/content/room_details/permissions/members_subpage.blp +session/view/content/room_details/permissions/permissions_subpage.blp +session/view/content/room_details/permissions/select_member_row.blp +session/view/content/room_details/upgrade_dialog/mod.blp window.blp diff --git a/src/components/user_page.blp b/src/components/user_page.blp index fbc13412..5b4cb088 100644 --- a/src/components/user_page.blp +++ b/src/components/user_page.blp @@ -119,7 +119,7 @@ template $UserPage: Adw.NavigationPage { } $PowerLevelSelectionRow power_level_row { - /* Translators: value used to assign room member roles */ + // Translators: value used to assign room member roles. title: _("Power Level"); selected-power-level-changed => $set_power_level() swapped; } diff --git a/src/session/view/content/room_details/addresses_subpage/completion_popover.blp b/src/session/view/content/room_details/addresses_subpage/completion_popover.blp new file mode 100644 index 00000000..9dc056ea --- /dev/null +++ b/src/session/view/content/room_details/addresses_subpage/completion_popover.blp @@ -0,0 +1,28 @@ +using Gtk 4.0; + +template $RoomDetailsAddressesSubpageCompletionPopover: Gtk.Popover { + autohide: false; + has-arrow: false; + position: bottom; + halign: start; + valign: center; + width-request: 260; + + styles [ + "string-row-list", + ] + + accessibility { + label: _("Address auto-completion"); + } + + child: Gtk.ScrolledWindow scrolled_window { + propagate-natural-height: true; + hscrollbar-policy: never; + max-content-height: 280; + + child: Gtk.ListBox list { + row-activated => $row_activated() swapped; + }; + }; +} diff --git a/src/session/view/content/room_details/addresses_subpage/completion_popover.ui b/src/session/view/content/room_details/addresses_subpage/completion_popover.ui deleted file mode 100644 index 989906a1..00000000 --- a/src/session/view/content/room_details/addresses_subpage/completion_popover.ui +++ /dev/null @@ -1,29 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/addresses_subpage/mod.blp b/src/session/view/content/room_details/addresses_subpage/mod.blp new file mode 100644 index 00000000..d252ed0c --- /dev/null +++ b/src/session/view/content/room_details/addresses_subpage/mod.blp @@ -0,0 +1,88 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsAddressesSubpage: Adw.NavigationPage { + title: _("Edit Room Addresses"); + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + content: Adw.PreferencesPage { + Adw.PreferencesGroup public_addresses_group { + title: _("Public Addresses"); + description: _("Public addresses are advertised for all users in the room and the main address is used to identify a room publicly. Before adding an address to this list, it must be registered as a local address."); + + Gtk.ListBox public_addresses_list { + styles [ + "boxed-list", + ] + } + + Gtk.Revealer public_addresses_error_revealer { + styles [ + "entry-row-error-revealer", + ] + + child: Gtk.Label public_addresses_error { + accessible-role: status; + wrap: true; + wrap-mode: word_char; + xalign: 0.0; + + styles [ + "caption", + "error", + ] + }; + } + } + + Adw.PreferencesGroup local_addresses_group { + description: _("Local addresses can only be registered with your own homeserver. If they are not made public, only people on your homeserver can discover them."); + + Gtk.ListBox local_addresses_list { + styles [ + "boxed-list", + ] + } + + Gtk.Revealer local_addresses_error_revealer { + styles [ + "entry-row-error-revealer", + ] + + child: Gtk.Label local_addresses_error { + accessible-role: status; + wrap: true; + wrap-mode: word_char; + xalign: 0.0; + + styles [ + "caption", + "error", + ] + }; + } + } + }; + }; +} + +$EntryAddRow public_addresses_add_row { + title: _("Add Public Address"); + add-button-tooltip-text: _("Add Public Address"); + add => $add_public_address() swapped; + entry-activated => $handle_public_addresses_add_row_activated() swapped; +} + +$SubstringEntryRow local_addresses_add_row { + title: _("Register Local Address"); + // Translators: This is the placeholder for the first part of a room address, + // as in '@my-room:example.org'. + placeholder-text: _("my-room"); + accessible-description: _("First part of the address, for example “my-room”"); + prefix-text: "#"; + add-button-tooltip-text: _("Register Local Address"); + add => $register_local_address() swapped; +} diff --git a/src/session/view/content/room_details/addresses_subpage/mod.ui b/src/session/view/content/room_details/addresses_subpage/mod.ui deleted file mode 100644 index e761b7bd..00000000 --- a/src/session/view/content/room_details/addresses_subpage/mod.ui +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Add Public Address - Add Public Address - - - - - Register Local Address - - my-room - First part of the address, for example “my-room” - # - Register Local Address - - - diff --git a/src/session/view/content/room_details/edit_details_subpage.blp b/src/session/view/content/room_details/edit_details_subpage.blp new file mode 100644 index 00000000..64cec512 --- /dev/null +++ b/src/session/view/content/room_details/edit_details_subpage.blp @@ -0,0 +1,114 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsEditDetailsSubpage: Adw.NavigationPage { + title: _("Edit Room Details"); + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar { + show-back-button: false; + + [start] + Gtk.Button back_button { + icon-name: "go-previous-symbolic"; + tooltip-text: _("Back"); + clicked => $go_back() swapped; + + styles [ + "back", + ] + } + } + + content: Adw.PreferencesPage { + Adw.PreferencesGroup { + $EditableAvatar avatar { + editable: bind template.room as <$Room>.permissions as <$RoomPermissions>.can-change-avatar; + data: bind template.room as <$Room>.avatar-data; + inhibit-remove: bind $invert_boolean(template.room as <$Room>.has-avatar) as ; + edit-avatar => $change_avatar() swapped; + remove-avatar => $remove_avatar() swapped; + + accessibility { + label: _("Room Avatar"); + } + } + } + + Adw.PreferencesGroup { + title: _("Name"); + + Adw.EntryRow name_entry_row { + sensitive: bind template.room as <$Room>.permissions as <$RoomPermissions>.can-change-name; + title: _("Name"); + selectable: false; + text: bind $unwrap_string_or_empty(template.room as <$Room>.name) as ; + changed => $name_edited() swapped; + entry-activated => $change_name() swapped; + + [suffix] + $ActionButton name_button { + visible: false; + state: confirm; + clicked => $change_name() swapped; + } + } + } + + Adw.PreferencesGroup topic_group { + title: _("Description"); + + Gtk.Box { + orientation: vertical; + spacing: 6; + + Gtk.ScrolledWindow { + height-request: 180; + + styles [ + "card", + ] + + Gtk.TextView topic_text_view { + sensitive: bind template.room as <$Room>.permissions as <$RoomPermissions>.can-change-topic; + hexpand: true; + wrap-mode: word_char; + + styles [ + "inline", + ] + + accessibility { + labelled-by: [ + topic_group, + ]; + } + + buffer: Gtk.TextBuffer topic_buffer { + text: bind $unwrap_string_or_empty(template.room as <$Room>.topic) as ; + changed => $topic_edited() swapped; + }; + } + } + + $LoadingButton save_topic_button { + sensitive: false; + halign: end; + content-label: _("Save"); + clicked => $change_topic() swapped; + + styles [ + "pill", + "suggested-action", + ] + + accessibility { + label: _("Save Description"); + } + } + } + } + }; + }; +} diff --git a/src/session/view/content/room_details/edit_details_subpage.ui b/src/session/view/content/room_details/edit_details_subpage.ui deleted file mode 100644 index 1d1dce6a..00000000 --- a/src/session/view/content/room_details/edit_details_subpage.ui +++ /dev/null @@ -1,160 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/general_page.blp b/src/session/view/content/room_details/general_page.blp new file mode 100644 index 00000000..0e4ff950 --- /dev/null +++ b/src/session/view/content/room_details/general_page.blp @@ -0,0 +1,282 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsGeneralPage: Adw.PreferencesPage { + title: _("Room Details"); + + Adw.PreferencesGroup { + Gtk.Box { + spacing: 12; + orientation: vertical; + + $Avatar avatar { + size: 128; + accessible-role: presentation; + data: bind template.room as <$Room>.avatar-data; + watched-room: bind template.room; + watched-safety-setting: "invite-avatars"; + } + + Gtk.Label { + wrap: true; + wrap-mode: word_char; + justify: center; + label: bind template.room as <$Room>.display-name; + + styles [ + "title-1", + ] + } + + Gtk.Label room_topic { + wrap: true; + wrap-mode: word_char; + justify: center; + use-markup: true; + selectable: true; + label: bind template.room as <$Room>.topic-linkified; + visible: bind $string_not_empty(template.room as <$Room>.topic-linkified) as ; + + styles [ + "body", + ] + } + + Gtk.Button edit_details_btn { + can-shrink: true; + halign: center; + label: _("Edit Details"); + action-name: "details.show-subpage"; + action-target: "'edit-details'"; + + styles [ + "pill", + ] + } + } + } + + Adw.PreferencesGroup direct_members_group { + Gtk.ListBox direct_members_list { + selection-mode: none; + + styles [ + "boxed-list", + ] + } + + Gtk.Label no_direct_members_label { + wrap: true; + wrap-mode: word_char; + xalign: 0.0; + label: _("There are no members in this room"); + + styles [ + "dimmed", + "body", + ] + } + } + + Adw.PreferencesGroup members_row_group { + $ButtonCountRow members_row { + icon-name: "users-symbolic"; + action-name: "details.show-subpage"; + action-target: "'members'"; + } + } + + Adw.PreferencesGroup { + $ButtonCountRow { + title: _("Media"); + action-name: "details.show-subpage"; + action-target: "'visual-media-history'"; + } + + $ButtonCountRow { + title: _("Files"); + action-name: "details.show-subpage"; + action-target: "'file-history'"; + } + + $ButtonCountRow { + // Translators: As in 'Audio file'. + title: _("Audio"); + action-name: "details.show-subpage"; + action-target: "'audio-history'"; + } + } + + Adw.PreferencesGroup notifications { + title: _("Notifications"); + description: _("Which messages trigger notifications in this room"); + + $CheckLoadingRow notifications_global_row { + title: _("Use Global Setting"); + action-name: "room.set-notifications-setting"; + action-target: "'global'"; + } + + $CheckLoadingRow notifications_all_row { + title: _("All Messages"); + action-name: "room.set-notifications-setting"; + action-target: "'all'"; + } + + $CheckLoadingRow notifications_mentions_row { + title: _("Only Mentions and Keywords"); + action-name: "room.set-notifications-setting"; + action-target: "'mentions-only'"; + } + + $CheckLoadingRow notifications_mute_row { + title: _("Disable Notifications"); + action-name: "room.set-notifications-setting"; + action-target: "'mute'"; + } + } + + Adw.PreferencesGroup addresses_group { + title: _("Public Addresses"); + visible: bind $invert_boolean(template.room as <$Room>.is-direct) as ; + + [header-suffix] + Gtk.Button edit_addresses_button { + action-name: "details.show-subpage"; + action-target: "'addresses'"; + + styles [ + "flat", + ] + + accessibility { + description: _("Edit Public Addresses"); + } + + Adw.ButtonContent { + icon-name: "edit-symbolic"; + use-underline: true; + // Translators: In this string, 'Edit' is a verb. + label: _("_Edit"); + } + } + + Gtk.Label no_addresses_label { + wrap: true; + wrap-mode: word_char; + xalign: 0.0; + label: _("This room has no public addresses"); + + styles [ + "dimmed", + ] + } + + Gtk.ListBox { + selection-mode: none; + margin-top: 12; + accessible-role: group; + + styles [ + "boxed-list", + ] + + Adw.ButtonRow { + selectable: false; + title: _("Copy Room Link"); + activated => $copy_permalink() swapped; + } + } + } + + Adw.PreferencesGroup visibility_group { + title: _("Access and Visibility"); + visible: bind $invert_boolean(template.room as <$Room>.is-direct) as ; + + $ButtonCountRow join_rule { + title: _("Who Can Join"); + subtitle: bind template.room as <$Room>.join-rule as <$RoomJoinRule>.display-name; + action-name: "details.show-subpage"; + action-target: "'join-rule'"; + } + + $SwitchLoadingRow guest_access { + title: _("Allow Guests"); + subtitle: _("Guests are Matrix users without a registered account"); + notify::is-active => $toggle_guest_access() swapped; + } + + $SwitchLoadingRow publish { + notify::is-active => $toggle_publish() swapped; + } + + $ComboLoadingRow history_visibility { + title: _("Who Can Read History"); + notify::selected-string => $set_history_visibility() swapped; + + string-model: Gtk.StringList { + strings [ + _("Anyone, even if they are not in the room"), + _("Members only, since this option was selected"), + _("Members only, since they joined the room"), + _("Members only, since they were invited"), + ] + }; + } + } + + Adw.PreferencesGroup { + title: _("Advanced Information"); + + $CopyableRow room_id { + title: _("Matrix Room ID"); + subtitle: bind template.room as <$Room>.room-id-string; + main-title: subtitle; + copy-button-tooltip-text: _("Copy Matrix Room ID"); + toast-text: _("Matrix room ID copied to clipboard"); + } + + $SwitchLoadingRow encryption { + title: _("Enable Encryption"); + is-active: bind template.room as <$Room>.is-encrypted; + notify::is-active => $enable_encryption() swapped; + } + + $ButtonCountRow { + title: _("Permissions"); + visible: bind $invert_boolean(template.room as <$Room>.is-direct) as ; + action-name: "details.show-subpage"; + action-target: "'permissions'"; + } + + Adw.ActionRow room_version { + selectable: false; + title: _("Room Version"); + subtitle: bind template.room as <$Room>.version; + + styles [ + "property", + ] + + $LoadingButton upgrade_button { + // Translators: In this string, 'Upgrade' is a verb, as in 'Upgrade Room'. + content-label: _("Upgrade…"); + valign: center; + clicked => $upgrade() swapped; + + styles [ + "destructive-action", + ] + } + } + + Adw.ActionRow room_federated { + selectable: false; + title: _("Federation"); + + styles [ + "property", + ] + } + } +} diff --git a/src/session/view/content/room_details/general_page.ui b/src/session/view/content/room_details/general_page.ui deleted file mode 100644 index e6f3947f..00000000 --- a/src/session/view/content/room_details/general_page.ui +++ /dev/null @@ -1,368 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/audio.blp b/src/session/view/content/room_details/history_viewer/audio.blp new file mode 100644 index 00000000..41341179 --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/audio.blp @@ -0,0 +1,85 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentAudioHistoryViewer: Adw.NavigationPage { + // Translators: As in 'Audio file'. + title: _("Audio"); + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + content: Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "loading"; + title: _("Loading"); + + child: Adw.Spinner {}; + } + + Gtk.StackPage { + name: "empty"; + title: _("No Audio"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "audio-symbolic"; + title: _("No Audio"); + description: _("This room does not contain any audio"); + }; + } + + Gtk.StackPage { + name: "error"; + title: _("Could Not Load Audio"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "error-symbolic"; + title: _("Could Not Load Audio"); + description: _("Check your network connection"); + + child: Gtk.Button { + can-shrink: true; + label: _("Try Again"); + halign: center; + clicked => $load_more_items() swapped; + + styles [ + "pill", + ] + }; + }; + } + + Gtk.StackPage { + name: "content"; + title: _("Audio History"); + + child: Gtk.ScrolledWindow { + hscrollbar-policy: never; + vexpand: true; + + Adw.ClampScrollable { + maximum-size: 400; + tightening-threshold: 400; + + Gtk.ListView list_view { + show-separators: true; + + styles [ + "navigation-sidebar", + ] + } + } + }; + } + }; + } +} diff --git a/src/session/view/content/room_details/history_viewer/audio.ui b/src/session/view/content/room_details/history_viewer/audio.ui deleted file mode 100644 index 0ada3462..00000000 --- a/src/session/view/content/room_details/history_viewer/audio.ui +++ /dev/null @@ -1,97 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/audio_row.blp b/src/session/view/content/room_details/history_viewer/audio_row.blp new file mode 100644 index 00000000..c0f483b5 --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/audio_row.blp @@ -0,0 +1,45 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentAudioHistoryViewerRow: Adw.Bin { + Gtk.Box { + spacing: 12; + + Gtk.Button play_button { + clicked => $toggle_play() swapped; + icon-name: "media-playback-start-symbolic"; + valign: center; + // Translators: As in "Play audio file". + tooltip-text: _("Play"); + + styles [ + "circular", + "suggested-action", + ] + } + + Gtk.Box { + orientation: vertical; + homogeneous: true; + + Gtk.Label title_label { + ellipsize: end; + xalign: 0; + + styles [ + "heading", + ] + } + + Gtk.Label duration_label { + ellipsize: end; + xalign: 0; + + styles [ + "dimmed", + "numeric", + ] + } + } + } +} diff --git a/src/session/view/content/room_details/history_viewer/audio_row.ui b/src/session/view/content/room_details/history_viewer/audio_row.ui deleted file mode 100644 index a0b0d788..00000000 --- a/src/session/view/content/room_details/history_viewer/audio_row.ui +++ /dev/null @@ -1,48 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/file.blp b/src/session/view/content/room_details/history_viewer/file.blp new file mode 100644 index 00000000..8b43e359 --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/file.blp @@ -0,0 +1,84 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentFileHistoryViewer: Adw.NavigationPage { + title: _("File"); + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + content: Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "loading"; + title: _("Loading"); + + child: Adw.Spinner {}; + } + + Gtk.StackPage { + name: "empty"; + title: _("No Files"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "document-symbolic"; + title: _("No Files"); + description: _("This room does not contain any files"); + }; + } + + Gtk.StackPage { + name: "error"; + title: _("Could Not Load Files"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "error-symbolic"; + title: _("Could Not Load Files"); + description: _("Check your network connection"); + + child: Gtk.Button { + can-shrink: true; + label: _("Try Again"); + halign: center; + clicked => $load_more_items() swapped; + + styles [ + "pill", + ] + }; + }; + } + + Gtk.StackPage { + name: "content"; + title: _("File History"); + + child: Gtk.ScrolledWindow { + hscrollbar-policy: never; + vexpand: true; + + Adw.ClampScrollable { + maximum-size: 400; + tightening-threshold: 400; + + Gtk.ListView list_view { + show-separators: true; + + styles [ + "navigation-sidebar", + ] + } + } + }; + } + }; + } +} diff --git a/src/session/view/content/room_details/history_viewer/file.ui b/src/session/view/content/room_details/history_viewer/file.ui deleted file mode 100644 index 2ef5bc40..00000000 --- a/src/session/view/content/room_details/history_viewer/file.ui +++ /dev/null @@ -1,96 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/file_row.blp b/src/session/view/content/room_details/history_viewer/file_row.blp new file mode 100644 index 00000000..fec5e246 --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/file_row.blp @@ -0,0 +1,44 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentFileHistoryViewerRow: Adw.Bin { + Gtk.Box { + spacing: 12; + + Gtk.Button button { + clicked => $button_clicked() swapped; + icon-name: "save-symbolic"; + valign: center; + tooltip-text: _("Save File"); + + styles [ + "circular", + "suggested-action", + ] + } + + Gtk.Box { + orientation: vertical; + homogeneous: true; + + Gtk.Label title_label { + ellipsize: end; + xalign: 0; + + styles [ + "heading", + ] + } + + Gtk.Label size_label { + ellipsize: end; + xalign: 0; + + styles [ + "dimmed", + "numeric", + ] + } + } + } +} diff --git a/src/session/view/content/room_details/history_viewer/file_row.ui b/src/session/view/content/room_details/history_viewer/file_row.ui deleted file mode 100644 index c9fc5ae1..00000000 --- a/src/session/view/content/room_details/history_viewer/file_row.ui +++ /dev/null @@ -1,47 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/visual_media.blp b/src/session/view/content/room_details/history_viewer/visual_media.blp new file mode 100644 index 00000000..dae06b87 --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/visual_media.blp @@ -0,0 +1,89 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentVisualMediaHistoryViewer: Adw.NavigationPage { + title: _("Media"); + + Gtk.Overlay { + [overlay] + $MediaViewer media_viewer { + visible: false; + } + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + content: Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "loading"; + title: _("Loading"); + + child: Adw.Spinner {}; + } + + Gtk.StackPage { + name: "empty"; + title: _("No Media"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "image-symbolic"; + title: _("No Media"); + description: _("This room does not contain any media"); + }; + } + + Gtk.StackPage { + name: "error"; + title: _("Could Not Load Media"); + + child: Adw.StatusPage { + visible: true; + hexpand: true; + vexpand: true; + icon-name: "error-symbolic"; + title: _("Could Not Load Media"); + description: _("Check your network connection"); + + child: Gtk.Button { + can-shrink: true; + label: _("Try Again"); + halign: center; + clicked => $load_more_items() swapped; + + styles [ + "pill", + ] + }; + }; + } + + Gtk.StackPage { + name: "content"; + title: _("Media History"); + + child: Gtk.ScrolledWindow { + hscrollbar-policy: never; + vexpand: true; + + Adw.ClampScrollable { + maximum-size: 1000; + tightening-threshold: 800; + vscroll-policy: natural; + + Gtk.GridView grid_view { + min-columns: 2; + max-columns: 5; + } + } + }; + } + }; + } + } +} diff --git a/src/session/view/content/room_details/history_viewer/visual_media.ui b/src/session/view/content/room_details/history_viewer/visual_media.ui deleted file mode 100644 index 53ecee3b..00000000 --- a/src/session/view/content/room_details/history_viewer/visual_media.ui +++ /dev/null @@ -1,104 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/history_viewer/visual_media_item.blp b/src/session/view/content/room_details/history_viewer/visual_media_item.blp new file mode 100644 index 00000000..7c0e782f --- /dev/null +++ b/src/session/view/content/room_details/history_viewer/visual_media_item.blp @@ -0,0 +1,36 @@ +using Gtk 4.0; + +template $ContentVisualMediaHistoryViewerItem: Gtk.Widget { + focusable: true; + accessible-role: button; + height-request: 150; + width-request: 150; + + Gtk.GestureClick { + released => $activate() swapped; + } + + Gtk.Overlay overlay { + Gtk.Picture picture { + content-fit: cover; + } + + [overlay] + Gtk.Image play_icon { + visible: false; + halign: center; + valign: center; + icon-name: "media-playback-start-symbolic"; + accessible-role: presentation; + + styles [ + "osd", + "circular", + ] + + layout { + measure: true; + } + } + } +} diff --git a/src/session/view/content/room_details/history_viewer/visual_media_item.ui b/src/session/view/content/room_details/history_viewer/visual_media_item.ui deleted file mode 100644 index 98fe5562..00000000 --- a/src/session/view/content/room_details/history_viewer/visual_media_item.ui +++ /dev/null @@ -1,39 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/invite_subpage/mod.blp b/src/session/view/content/room_details/invite_subpage/mod.blp new file mode 100644 index 00000000..40d8185b --- /dev/null +++ b/src/session/view/content/room_details/invite_subpage/mod.blp @@ -0,0 +1,126 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsInviteSubpage: Adw.NavigationPage { + title: _("Invite New Members"); + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar { + show-back-button: false; + show-end-title-buttons: false; + + [start] + Gtk.Button cancel_button { + label: _("_Cancel"); + use-underline: true; + clicked => $close() swapped; + } + + [end] + $LoadingButton invite_button { + content-label: _("I_nvite"); + use-underline: true; + sensitive: false; + clicked => $invite() swapped; + + styles [ + "suggested-action", + ] + } + } + + [top] + Adw.Clamp { + margin-bottom: 6; + margin-end: 30; + margin-start: 30; + margin-top: 6; + hexpand: true; + + $PillSearchEntry search_entry { + editable: bind invite_button.is-loading inverted; + pill-removed => $remove_pill_invitee() swapped; + } + } + + content: Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "no-search"; + // Translators: In this string, this is a verb. + title: _("Search"); + + child: Adw.StatusPage no_search_page { + vexpand: true; + icon-name: "system-search-symbolic"; + // Translators: In this string, this is a verb. + title: _("Search"); + description: _("Search for users to invite them to this room"); + }; + } + + Gtk.StackPage { + name: "results"; + title: _("Matching Users"); + + child: Gtk.ScrolledWindow matching_page { + child: Adw.ClampScrollable { + child: Gtk.ListView list_view { + margin-end: 12; + margin-start: 12; + single-click-activate: true; + tab-behavior: item; + activate => $toggle_item_is_invitee() swapped; + + factory: Gtk.BuilderListItemFactory { + template Gtk.ListItem { + activatable: bind template.item as <$RoomDetailsInviteItem>.can-invite; + selectable: false; + + child: $RoomDetailsInviteRow row { + item: bind template.item; + }; + } + }; + + styles [ + "user-search-results", + ] + }; + }; + }; + } + + Gtk.StackPage { + name: "no-results"; + title: _("No Users Found"); + + child: Adw.StatusPage no_matching_page { + icon-name: "system-search-symbolic"; + title: _("No Users Found"); + description: _("No users matching the search were found"); + }; + } + + Gtk.StackPage { + name: "error"; + title: _("Error"); + + child: Adw.StatusPage error_page { + icon-name: "error-symbolic"; + title: _("Error"); + description: _("An error occurred while searching for matches"); + }; + } + + Gtk.StackPage { + name: "loading"; + title: _("Searching for Users"); + + child: Adw.Spinner {}; + } + }; + }; +} diff --git a/src/session/view/content/room_details/invite_subpage/mod.ui b/src/session/view/content/room_details/invite_subpage/mod.ui deleted file mode 100644 index 1fa4db23..00000000 --- a/src/session/view/content/room_details/invite_subpage/mod.ui +++ /dev/null @@ -1,155 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/invite_subpage/row.blp b/src/session/view/content/room_details/invite_subpage/row.blp new file mode 100644 index 00000000..1baedfc8 --- /dev/null +++ b/src/session/view/content/room_details/invite_subpage/row.blp @@ -0,0 +1,68 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsInviteRow: Adw.Bin { + margin-top: 12; + margin-bottom: 12; + margin-start: 12; + margin-end: 12; + + child: Gtk.Box header { + spacing: 12; + + styles [ + "header", + ] + + $Avatar { + size: 32; + data: bind template.item as <$RoomDetailsInviteItem>.user as <$User>.avatar-data; + accessible-role: "presentation"; + } + + Gtk.Box { + orientation: vertical; + + styles [ + "title", + ] + + Gtk.Label display-name { + halign: start; + ellipsize: end; + label: bind template.item as <$RoomDetailsInviteItem>.user as <$User>.display-name; + + styles [ + "title", + ] + } + + Gtk.Label subtitle { + hexpand: true; + halign: start; + ellipsize: end; + label: bind template.item as <$RoomDetailsInviteItem>.user as <$User>.user-id-string; + + styles [ + "subtitle", + ] + } + } + + Gtk.CheckButton check_button { + visible: bind template.item as <$RoomDetailsInviteItem>.can-invite; + } + + Gtk.Label { + visible: bind $invert_boolean(template.item as <$RoomDetailsInviteItem>.can-invite) as ; + hexpand: true; + halign: end; + ellipsize: end; + label: bind template.item as <$RoomDetailsInviteItem>.invite-exception; + + styles [ + "subtitle", + ] + } + }; +} diff --git a/src/session/view/content/room_details/invite_subpage/row.ui b/src/session/view/content/room_details/invite_subpage/row.ui deleted file mode 100644 index 0ba91fcf..00000000 --- a/src/session/view/content/room_details/invite_subpage/row.ui +++ /dev/null @@ -1,102 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/join_rule_subpage.blp b/src/session/view/content/room_details/join_rule_subpage.blp new file mode 100644 index 00000000..0b265f11 --- /dev/null +++ b/src/session/view/content/room_details/join_rule_subpage.blp @@ -0,0 +1,107 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsJoinRuleSubpage: Adw.NavigationPage { + title: _("Who Can Join"); + + styles [ + "form-page", + ] + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar { + show-back-button: false; + + [start] + Gtk.Button { + icon-name: "go-previous-symbolic"; + tooltip-text: _("Back"); + clicked => $go_back() swapped; + + styles [ + "back", + ] + } + + [end] + $LoadingButton save_button { + sensitive: bind template.changed; + content-label: _("_Save"); + use-underline: true; + clicked => $save() swapped; + + styles [ + "suggested-action", + ] + } + } + + content: Gtk.ScrolledWindow scrolled_window { + hscrollbar-policy: never; + propagate-natural-height: true; + + child: Adw.Clamp { + child: Gtk.Box { + orientation: vertical; + + Gtk.Box info_box { + visible: false; + margin-start: 12; + margin-end: 12; + spacing: 12; + + styles [ + "dimmed", + ] + + Gtk.Image info_image { + pixel-size: 24; + accessible-role: presentation; + } + + Gtk.Label info_description { + wrap: true; + wrap-mode: word_char; + xalign: 0.0; + + styles [ + "body", + ] + } + } + + Gtk.ListBox { + styles [ + "boxed-list", + ] + + $CheckLoadingRow { + title: _("Only Invited Users"); + action-name: "join-rule.set-value"; + action-target: "'invite'"; + } + + $CheckLoadingRow { + title: _("Any Registered User"); + action-name: "join-rule.set-value"; + action-target: "'public'"; + } + } + + Gtk.ListBox knock_box { + styles [ + "boxed-list", + ] + + Adw.SwitchRow knock_row { + selectable: false; + title: _("Allow Invite Requests"); + notify::active => $update_changed() swapped; + } + } + }; + }; + }; + }; +} diff --git a/src/session/view/content/room_details/join_rule_subpage.ui b/src/session/view/content/room_details/join_rule_subpage.ui deleted file mode 100644 index 63e9f22b..00000000 --- a/src/session/view/content/room_details/join_rule_subpage.ui +++ /dev/null @@ -1,116 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/member_row.blp b/src/session/view/content/room_details/member_row.blp new file mode 100644 index 00000000..7497605c --- /dev/null +++ b/src/session/view/content/room_details/member_row.blp @@ -0,0 +1,62 @@ +using Gtk 4.0; + +template $ContentMemberRow: Box { + spacing: 12; + + styles [ + "header", + ] + + $Avatar { + size: 32; + data: bind template.member as <$Member>.avatar-data; + accessible-role: "presentation"; + } + + Gtk.Box { + orientation: vertical; + + styles [ + "title", + ] + + Gtk.Box { + spacing: 6; + + Gtk.Label { + halign: start; + ellipsize: end; + label: bind template.member as <$Member>.display-name; + + styles [ + "title", + ] + } + + Gtk.Image { + icon-name: "verified-symbolic"; + tooltip-text: _("Identity Verified"); + visible: bind template.member as <$User>.is-verified; + + styles [ + "success", + ] + } + + $RoleBadge role_badge { + role: bind template.member as <$Member>.role; + } + } + + Gtk.Label { + hexpand: true; + halign: start; + ellipsize: end; + label: bind template.member as <$Member>.user-id-string; + + styles [ + "subtitle", + ] + } + } +} diff --git a/src/session/view/content/room_details/member_row.ui b/src/session/view/content/room_details/member_row.ui deleted file mode 100644 index a5ded6c0..00000000 --- a/src/session/view/content/room_details/member_row.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.blp b/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.blp new file mode 100644 index 00000000..5a58b81b --- /dev/null +++ b/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.blp @@ -0,0 +1,43 @@ +using Gtk 4.0; + +template $MembersPageMembershipSubpageRow: Gtk.ListBoxRow { + selectable: false; + + accessibility { + labelled-by: [ + title, + ]; + } + + child: Gtk.Box { + spacing: 6; + + Gtk.Image { + valign: center; + accessible-role: presentation; + icon-name: bind template.icon-name; + + styles [ + "icon", + ] + } + + Gtk.Label title { + valign: center; + hexpand: true; + xalign: 0.0; + ellipsize: end; + label: bind template.label; + } + + Gtk.Label members_count { + valign: center; + } + + Gtk.Image { + valign: center; + icon-name: "go-next-symbolic"; + accessible-role: presentation; + } + }; +} diff --git a/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.ui b/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.ui deleted file mode 100644 index 90c286a7..00000000 --- a/src/session/view/content/room_details/members_page/members_list_view/membership_subpage_row.ui +++ /dev/null @@ -1,45 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/members_page/members_list_view/mod.blp b/src/session/view/content/room_details/members_page/members_list_view/mod.blp new file mode 100644 index 00000000..e5f38815 --- /dev/null +++ b/src/session/view/content/room_details/members_page/members_list_view/mod.blp @@ -0,0 +1,151 @@ +using Gtk 4.0; +using Adw 1; + +template $ContentMembersListView: Adw.NavigationPage { + Adw.ToolbarView { + [top] + Adw.HeaderBar { + [end] + Gtk.ToggleButton search_button { + icon-name: "system-search-symbolic"; + tooltip-text: _("Toggle Room Members Search"); + + accessibility { + label: _("Toggle Room Members Search"); + } + } + } + + [top] + Gtk.SearchBar search_bar { + search-mode-enabled: bind search_button.active no-sync-create; + + child: Adw.Clamp { + hexpand: true; + maximum-size: 750; + tightening-threshold: 550; + + accessibility { + label: _("Search for room members"); + } + + Gtk.SearchEntry search_entry { + placeholder-text: _("Search for room members"); + } + }; + } + + content: Gtk.Overlay { + Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "loading"; + + child: Adw.Spinner {}; + } + + Gtk.StackPage empty_stack_page { + name: "empty"; + + child: Adw.StatusPage empty_page { + vexpand: true; + + child: Adw.Clamp { + child: Gtk.ListBox empty_listbox { + row-activated => $activate_listbox_row() swapped; + + styles [ + "boxed-list", + ] + }; + }; + }; + } + + Gtk.StackPage { + name: "error"; + title: _("Error"); + + child: Adw.StatusPage error_page { + icon-name: "error-symbolic"; + title: _("Error"); + description: _("Could not load the full list of room members"); + + child: Gtk.Button { + can-shrink: true; + label: _("Try Again"); + halign: center; + clicked => $reload_members() swapped; + + styles [ + "pill", + ] + }; + }; + } + + Gtk.StackPage members_stack_page { + name: "members"; + + child: Gtk.ScrolledWindow { + hexpand: true; + vexpand: true; + hscrollbar-policy: never; + propagate-natural-height: true; + + child: Adw.ClampScrollable { + margin-start: 12; + margin-end: 12; + + child: Gtk.ListView list_view { + single-click-activate: true; + tab-behavior: item; + activate => $activate_listview_row() swapped; + + factory: Gtk.BuilderListItemFactory { + template Gtk.ListItem { + selectable: false; + activatable: bind row.activatable; + + child: $ContentMemberItemRow row { + item: bind template.item; + }; + } + }; + }; + }; + }; + } + } + + [overlay] + Gtk.Button invite_button { + visible: bind template.can-invite; + valign: end; + halign: center; + margin-bottom: 24; + action-name: "details.show-subpage"; + action-target: "'invite'"; + + styles [ + "pill", + "suggested-action", + ] + + child: Gtk.Box { + spacing: 6; + + Gtk.Image { + icon-name: "user-add-symbolic"; + } + + Gtk.Label { + // Translators: This is a verb. + label: _("Invite"); + } + }; + } + }; + } +} diff --git a/src/session/view/content/room_details/members_page/members_list_view/mod.ui b/src/session/view/content/room_details/members_page/members_list_view/mod.ui deleted file mode 100644 index 1fbd2f30..00000000 --- a/src/session/view/content/room_details/members_page/members_list_view/mod.ui +++ /dev/null @@ -1,183 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/members_page/mod.blp b/src/session/view/content/room_details/members_page/mod.blp new file mode 100644 index 00000000..cace9e18 --- /dev/null +++ b/src/session/view/content/room_details/members_page/mod.blp @@ -0,0 +1,6 @@ +using Gtk 4.0; +using Adw 1; + +template $MembersPage: Adw.NavigationPage { + Adw.NavigationView navigation_view {} +} diff --git a/src/session/view/content/room_details/members_page/mod.ui b/src/session/view/content/room_details/members_page/mod.ui deleted file mode 100644 index 6ca9e6c1..00000000 --- a/src/session/view/content/room_details/members_page/mod.ui +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/mod.blp b/src/session/view/content/room_details/mod.blp new file mode 100644 index 00000000..1f316c49 --- /dev/null +++ b/src/session/view/content/room_details/mod.blp @@ -0,0 +1,14 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetails: Adw.PreferencesWindow { + title: _("Room Details"); + modal: true; + destroy-with-parent: true; + default-height: 780; + search-enabled: false; + + styles [ + "room-details", + ] +} diff --git a/src/session/view/content/room_details/mod.ui b/src/session/view/content/room_details/mod.ui deleted file mode 100644 index 828105f4..00000000 --- a/src/session/view/content/room_details/mod.ui +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/permissions/add_members_subpage.blp b/src/session/view/content/room_details/permissions/add_members_subpage.blp new file mode 100644 index 00000000..7c3ab4bf --- /dev/null +++ b/src/session/view/content/room_details/permissions/add_members_subpage.blp @@ -0,0 +1,94 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsPermissionsAddMembersSubpage: Adw.NavigationPage { + title: _("Add Custom Permissions"); + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar { + [end] + Gtk.Button add_button { + label: _("_Add"); + use-underline: true; + sensitive: false; + clicked => $add_members() swapped; + + styles [ + "suggested-action", + ] + } + } + + [top] + Adw.Clamp { + margin-bottom: 6; + margin-end: 30; + margin-start: 30; + margin-top: 6; + + $PillSearchEntry search_entry {} + } + + [top] + Adw.Clamp { + margin-bottom: 6; + margin-end: 30; + margin-start: 30; + margin-top: 6; + + Gtk.Box { + spacing: 12; + halign: center; + + Gtk.Label power_level_combo_label { + // Translators: value used to assign room member roles. + label: _("Assign Power Level"); + xalign: 0; + ellipsize: end; + } + + $PowerLevelSelectionComboBox power_level_combo { + accessibility { + labelled-by: [ + power_level_combo_label, + ]; + } + } + } + } + + content: Gtk.Stack stack { + Gtk.StackPage { + name: "list"; + title: _("Search Results"); + + child: Gtk.ScrolledWindow { + child: Adw.ClampScrollable { + child: Gtk.ListView list_view { + margin-end: 12; + margin-start: 12; + single-click-activate: true; + tab-behavior: item; + + styles [ + "user-search-results", + ] + }; + }; + }; + } + + Gtk.StackPage { + name: "no-match"; + title: _("No Matching Members Found"); + + child: Adw.StatusPage no_matching_page { + icon-name: "system-search-symbolic"; + title: _("No Matching Members Found"); + description: _("No room members matching the search were found"); + }; + } + }; + }; +} diff --git a/src/session/view/content/room_details/permissions/add_members_subpage.ui b/src/session/view/content/room_details/permissions/add_members_subpage.ui deleted file mode 100644 index 438d1dec..00000000 --- a/src/session/view/content/room_details/permissions/add_members_subpage.ui +++ /dev/null @@ -1,106 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/permissions/member_row.blp b/src/session/view/content/room_details/permissions/member_row.blp new file mode 100644 index 00000000..ad95e40c --- /dev/null +++ b/src/session/view/content/room_details/permissions/member_row.blp @@ -0,0 +1,74 @@ +using Gtk 4.0; + +template $RoomDetailsPermissionsMemberRow: Box { + focusable: true; + spacing: 12; + + $Avatar { + size: 32; + data: bind template.member as <$RoomDetailsPermissionsMemberPowerLevel>.user as <$User>.avatar-data; + accessible-role: "presentation"; + } + + Gtk.Box { + orientation: vertical; + + Gtk.Label title { + halign: start; + ellipsize: end; + label: bind template.member as <$RoomDetailsPermissionsMemberPowerLevel>.user as <$User>.display-name; + + styles [ + "title", + ] + } + + Gtk.Label subtitle { + hexpand: true; + halign: start; + ellipsize: end; + label: bind template.member as <$RoomDetailsPermissionsMemberPowerLevel>.user as <$User>.user-id-string; + + styles [ + "subtitle", + ] + } + } + + Gtk.Box suffixes { + Gtk.Box selected_box { + accessible-role: group; + spacing: 12; + margin-end: 6; + + Gtk.Label selected_level_label {} + + $RoleBadge selected_role_badge { + valign: center; + role: bind template.member as <$RoomDetailsPermissionsMemberPowerLevel>.role; + } + } + + Gtk.Box arrow_box { + valign: center; + + Gtk.Image { + icon-name: "pan-down-symbolic"; + accessible-role: presentation; + + styles [ + "dropdown-arrow", + ] + } + + $PowerLevelSelectionPopover popover { + notify::visible => $popover_visible() swapped; + notify::selected-power-level => $power_level_changed() swapped; + } + } + } + + Gtk.GestureClick { + released => $activate_row() swapped; + } +} diff --git a/src/session/view/content/room_details/permissions/member_row.ui b/src/session/view/content/room_details/permissions/member_row.ui deleted file mode 100644 index 888da575..00000000 --- a/src/session/view/content/room_details/permissions/member_row.ui +++ /dev/null @@ -1,107 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/permissions/members_subpage.blp b/src/session/view/content/room_details/permissions/members_subpage.blp new file mode 100644 index 00000000..1aa316d2 --- /dev/null +++ b/src/session/view/content/room_details/permissions/members_subpage.blp @@ -0,0 +1,109 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsPermissionsMembersSubpage: Adw.NavigationPage { + // Translators: value used to assign room member roles. + title: _("Members With Assigned Power Levels"); + + Adw.ToolbarView { + [top] + Adw.HeaderBar { + [end] + Gtk.ToggleButton search_button { + icon-name: "system-search-symbolic"; + tooltip-text: _("Toggle Room Members Search"); + + accessibility { + label: _("Toggle Room Members Search"); + } + } + } + + [top] + Gtk.SearchBar search_bar { + search-mode-enabled: bind search_button.active no-sync-create; + + child: Adw.Clamp { + hexpand: true; + maximum-size: 750; + tightening-threshold: 550; + + accessibility { + label: _("Search for room members"); + } + + Gtk.SearchEntry search_entry { + placeholder-text: _("Search for room members"); + } + }; + } + + content: Gtk.Overlay { + Gtk.Stack stack { + transition-type: crossfade; + + Gtk.StackPage { + name: "empty"; + + child: Adw.StatusPage empty_page { + vexpand: true; + icon-name: "users-symbolic"; + title: _("No Room Members"); + }; + } + + Gtk.StackPage { + name: "members"; + + child: ScrolledWindow { + hexpand: true; + vexpand: true; + hscrollbar-policy: never; + propagate-natural-height: true; + + child: Adw.ClampScrollable { + margin-start: 12; + margin-end: 12; + + child: Gtk.ListView list_view { + single-click-activate: true; + tab-behavior: item; + + styles [ + "permissions-member-list", + ] + }; + }; + }; + } + } + + [overlay] + Gtk.Button add_button { + visible: bind template.editable; + valign: end; + halign: center; + margin-bottom: 24; + action-name: "navigation.push"; + action-target: "'add-members'"; + + styles [ + "pill", + "suggested-action", + ] + + child: Gtk.Box { + spacing: 6; + + Gtk.Image { + icon-name: "user-add-symbolic"; + } + + Gtk.Label { + label: _("Add"); + } + }; + } + }; + } +} diff --git a/src/session/view/content/room_details/permissions/members_subpage.ui b/src/session/view/content/room_details/permissions/members_subpage.ui deleted file mode 100644 index a23fb0fd..00000000 --- a/src/session/view/content/room_details/permissions/members_subpage.ui +++ /dev/null @@ -1,121 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/permissions/permissions_subpage.blp b/src/session/view/content/room_details/permissions/permissions_subpage.blp new file mode 100644 index 00000000..21fa1ee3 --- /dev/null +++ b/src/session/view/content/room_details/permissions/permissions_subpage.blp @@ -0,0 +1,300 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsPermissionsSubpage: Adw.NavigationPage { + title: _("Permissions"); + + child: Adw.NavigationView navigation { + Adw.NavigationPage { + title: _("Permissions"); + tag: "permissions"; + + child: Adw.ToolbarView { + [top] + Adw.HeaderBar { + show-back-button: false; + + [start] + Gtk.Button back_button { + icon-name: "go-previous-symbolic"; + tooltip-text: _("Back"); + clicked => $go_back() swapped; + + styles [ + "back", + ] + } + + [end] + $LoadingButton save_button { + visible: bind template.editable; + sensitive: bind template.changed; + label: _("_Save"); + use-underline: true; + clicked => $save() swapped; + + styles [ + "suggested-action", + ] + } + } + + content: Adw.PreferencesPage { + Adw.PreferencesGroup room_actions_group { + title: _("Room Actions"); + // Translators: value used to assign room member roles. + description: _("Power level required to perform different actions in the room"); + + $PowerLevelSelectionRow messages_row { + title: _("Send Messages"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow redact_own_row { + title: _("Remove Own Messages"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $redact_own_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow redact_others_row { + title: _("Remove Messages of Other Members"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $redact_others_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow notify_room_row { + title: _("Notify Entire Room"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow state_row { + title: _("Change Room Settings"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $state_default_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow name_row { + title: _("Change Room Name"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow topic_row { + title: _("Change Room Description"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow avatar_row { + title: _("Change Room Avatar"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow aliases_row { + title: _("Change Addresses"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow history_visibility_row { + title: _("Change Who Can Read History"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow encryption_row { + title: _("Enable Encryption"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow power_levels_row { + title: _("Change Permissions"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow server_acl_row { + title: _("Change Server Access Control List"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow upgrade_row { + title: _("Upgrade Room"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + } + + Adw.PreferencesGroup member_actions_group { + title: _("Member Actions"); + // Translators: value used to assign room member roles. + description: _("Power level required to perform different actions on room members"); + + $PowerLevelSelectionRow invite_row { + // Translators: This is a verb. + title: _("Invite"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow kick_row { + // Translators: As in, 'Kick room member'. + title: _("Kick"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + + $PowerLevelSelectionRow ban_row { + // Translators: As in, 'Ban room member'. + title: _("Ban"); + use-subtitle: true; + permissions: bind template.permissions; + selected-power-level-changed => $value_changed() swapped; + + styles [ + "property", + ] + } + } + + Adw.PreferencesGroup members_group { + // Translators: value used to assign room member roles. + title: _("Members Power Levels"); + // Translators: value used to assign room member roles. + description: _("Power levels defined for all members of the room"); + + Adw.SpinRow members_default_spin_row { + // Translators: value used to assign room member roles. + title: _("Default Power Level"); + numeric: true; + + adjustment: Gtk.Adjustment members_default_adjustment { + lower: -9007199254740991; + page-increment: 10; + step-increment: 1; + notify::value => $value_changed() swapped; + }; + } + + Adw.ActionRow members_default_text_row { + selectable: false; + // Translators: value used to assign room member roles. + title: _("Default Power Level"); + + accessibility { + described-by: [ + members_default_label, + ]; + } + + Gtk.Label members_default_label { + valign: center; + } + } + + $ButtonCountRow members_privileged_button { + // Translators: value used to assign room member roles. + title: _("Members With Assigned Power Levels"); + action-name: "navigation.push"; + action-target: "'members'"; + } + } + }; + }; + } + + $RoomDetailsPermissionsMembersSubpage members_subpage { + tag: "members"; + editable: bind template.editable; + } + + $RoomDetailsPermissionsAddMembersSubpage add_members_subpage { + tag: "add-members"; + } + }; +} diff --git a/src/session/view/content/room_details/permissions/permissions_subpage.ui b/src/session/view/content/room_details/permissions/permissions_subpage.ui deleted file mode 100644 index dd761ded..00000000 --- a/src/session/view/content/room_details/permissions/permissions_subpage.ui +++ /dev/null @@ -1,306 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/permissions/select_member_row.blp b/src/session/view/content/room_details/permissions/select_member_row.blp new file mode 100644 index 00000000..110fe3be --- /dev/null +++ b/src/session/view/content/room_details/permissions/select_member_row.blp @@ -0,0 +1,59 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsPermissionsSelectMemberRow: Adw.Bin { + margin-top: 12; + margin-bottom: 12; + margin-start: 12; + margin-end: 12; + accessible-role: checkbox; + focusable: true; + + child: Gtk.Box header { + spacing: 12; + + styles [ + "header", + ] + + $Avatar { + size: 32; + data: bind template.member as <$Member>.avatar-data; + accessible-role: presentation; + } + + Gtk.Box { + orientation: vertical; + + styles [ + "title", + ] + + Gtk.Label { + halign: start; + ellipsize: end; + label: bind template.member as <$Member>.display-name; + + styles [ + "title", + ] + } + + Gtk.Label { + hexpand: true; + halign: start; + ellipsize: end; + label: bind template.member as <$Member>.user-id-string; + + styles [ + "subtitle", + ] + } + } + + Gtk.CheckButton { + focusable: false; + active: bind template.selected bidirectional; + } + }; +} diff --git a/src/session/view/content/room_details/permissions/select_member_row.ui b/src/session/view/content/room_details/permissions/select_member_row.ui deleted file mode 100644 index 86989e3d..00000000 --- a/src/session/view/content/room_details/permissions/select_member_row.ui +++ /dev/null @@ -1,73 +0,0 @@ - - - - diff --git a/src/session/view/content/room_details/upgrade_dialog/mod.blp b/src/session/view/content/room_details/upgrade_dialog/mod.blp new file mode 100644 index 00000000..5b22b535 --- /dev/null +++ b/src/session/view/content/room_details/upgrade_dialog/mod.blp @@ -0,0 +1,132 @@ +using Gtk 4.0; +using Adw 1; + +template $RoomDetailsUpgradeDialog: Adw.Dialog { + title: _("Upgrade Room"); + follows-content-size: true; + + styles [ + "alert", + ] + + accessibility { + described-by: [ + description, + ]; + } + + child: Gtk.WindowHandle { + child: Gtk.Box { + orientation: vertical; + + Gtk.ScrolledWindow { + propagate-natural-width: true; + propagate-natural-height: true; + hscrollbar-policy: never; + + styles [ + "body-scrolled-window", + "undershoot-bottom", + ] + + child: Gtk.Box { + orientation: vertical; + + styles [ + "message-area", + "has-heading", + "has-body", + ] + + Adw.Bin { + styles [ + "heading-bin", + ] + + Gtk.Label { + justify: center; + xalign: 0.5; + label: _("Upgrade Room"); + + styles [ + "title-2", + ] + } + } + + Gtk.Label description { + vexpand: true; + wrap: true; + wrap-mode: word_char; + justify: center; + xalign: 0.5; + max-width-chars: 60; + label: _("Upgrading a room to a more recent version allows to benefit from new features from the Matrix specification. It can also be used to reset the room state, which should make the room faster to join. However it should be used sparingly because it can be disruptive, as room members need to join the new room manually."); + + styles [ + "body", + ] + } + + Gtk.ListBox { + margin-top: 6; + margin-start: 24; + margin-end: 24; + accessible-role: group; + + styles [ + "boxed-list", + ] + + Adw.ComboRow version_combo { + selectable: false; + title: _("Version"); + } + } + + Gtk.Label warning_label { + vexpand: true; + wrap: true; + wrap-mode: word_char; + justify: center; + xalign: 0.5; + max-width-chars: 60; + + styles [ + "warning", + "body", + ] + } + }; + } + + Adw.WrapBox { + child-spacing: 12; + line-spacing: 12; + justify: fill; + justify-last-line: true; + + styles [ + "response-area", + ] + + Gtk.Button { + can-shrink: true; + label: _("Cancel"); + clicked => $cancel() swapped; + } + + Gtk.Button { + can-shrink: true; + // Translators: In this string, 'Upgrade' is a verb, as in 'Upgrade Room'. + label: _("Upgrade"); + clicked => $upgrade() swapped; + + styles [ + "destructive-action", + ] + } + } + }; + }; +} diff --git a/src/session/view/content/room_details/upgrade_dialog/mod.ui b/src/session/view/content/room_details/upgrade_dialog/mod.ui deleted file mode 100644 index 3d063e21..00000000 --- a/src/session/view/content/room_details/upgrade_dialog/mod.ui +++ /dev/null @@ -1,134 +0,0 @@ - - - - diff --git a/src/ui-resources.gresource.xml b/src/ui-resources.gresource.xml index 481996ba..70c7ee40 100644 --- a/src/ui-resources.gresource.xml +++ b/src/ui-resources.gresource.xml @@ -2,30 +2,6 @@ session/view/account_settings/general_page/change_password_subpage.ui - session/view/content/room_details/addresses_subpage/completion_popover.ui - session/view/content/room_details/addresses_subpage/mod.ui - session/view/content/room_details/edit_details_subpage.ui - session/view/content/room_details/general_page.ui - session/view/content/room_details/history_viewer/audio.ui - session/view/content/room_details/history_viewer/audio_row.ui - session/view/content/room_details/history_viewer/file.ui - session/view/content/room_details/history_viewer/file_row.ui - session/view/content/room_details/history_viewer/visual_media.ui - session/view/content/room_details/history_viewer/visual_media_item.ui - session/view/content/room_details/invite_subpage/mod.ui - session/view/content/room_details/invite_subpage/row.ui - session/view/content/room_details/join_rule_subpage.ui - session/view/content/room_details/member_row.ui - session/view/content/room_details/members_page/members_list_view/membership_subpage_row.ui - session/view/content/room_details/members_page/members_list_view/mod.ui - session/view/content/room_details/members_page/mod.ui - session/view/content/room_details/mod.ui - session/view/content/room_details/permissions/add_members_subpage.ui - session/view/content/room_details/permissions/member_row.ui - session/view/content/room_details/permissions/members_subpage.ui - session/view/content/room_details/permissions/permissions_subpage.ui - session/view/content/room_details/permissions/select_member_row.ui - session/view/content/room_details/upgrade_dialog/mod.ui session/view/content/room_history/divider_row.ui session/view/content/room_history/event_actions/context_menu.ui session/view/content/room_history/event_actions/quick_reaction_chooser.ui