diff options
| -rw-r--r-- | main/data/chat_input.ui | 6 | ||||
| -rw-r--r-- | main/data/conversation_list_titlebar.ui | 33 | ||||
| -rw-r--r-- | main/data/conversation_row.ui | 4 | ||||
| -rw-r--r-- | main/data/gresource.xml | 5 | ||||
| -rw-r--r-- | main/data/main_window.ui | 188 | ||||
| -rw-r--r-- | main/data/main_window_placeholder.ui (renamed from main/data/unified_window_placeholder.ui) | 0 | ||||
| -rw-r--r-- | main/data/style.css | 14 | ||||
| -rw-r--r-- | main/data/unified_main_content.ui | 126 | ||||
| -rw-r--r-- | main/meson.build | 2 | ||||
| -rw-r--r-- | main/src/ui/conversation_list_titlebar.vala | 27 | ||||
| -rw-r--r-- | main/src/ui/conversation_selector/conversation_selector.vala | 1 | ||||
| -rw-r--r-- | main/src/ui/conversation_selector/conversation_selector_row.vala | 32 | ||||
| -rw-r--r-- | main/src/ui/conversation_titlebar/conversation_titlebar.vala | 54 | ||||
| -rw-r--r-- | main/src/ui/conversation_view_controller.vala | 60 | ||||
| -rw-r--r-- | main/src/ui/main_window.vala | 95 | ||||
| -rw-r--r-- | main/src/ui/main_window_controller.vala | 2 |
16 files changed, 263 insertions, 386 deletions
diff --git a/main/data/chat_input.ui b/main/data/chat_input.ui index cde00b22..7164f733 100644 --- a/main/data/chat_input.ui +++ b/main/data/chat_input.ui @@ -4,15 +4,15 @@ <template class="DinoUiChatInputView"> <property name="hexpand">True</property> <property name="orientation">vertical</property> - <style> - <class name="dino-chatinput"/> - </style> <child> <object class="GtkFrame" id="frame"> <property name="margin_start">14</property> <property name="margin_end">14</property> <property name="child"> <object class="GtkBox" id="outer_box"> + <style> + <class name="dino-chatinput"/> + </style> <child> <object class="GtkButton" id="file_button"> <property name="icon-name">mail-attachment-symbolic</property> diff --git a/main/data/conversation_list_titlebar.ui b/main/data/conversation_list_titlebar.ui deleted file mode 100644 index afe10926..00000000 --- a/main/data/conversation_list_titlebar.ui +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <requires lib="gtk" version="4.0"/> - <requires lib="adw" version="1.0"/> - <object class="AdwHeaderBar" id="header_bar"> - <property name="hexpand">False</property> - <style> - <class name="dino-left"/> - </style> - <child> - <object class="GtkMenuButton" id="add_button"> - <property name="has-frame">False</property> - <child> - <object class="GtkImage"> - <property name="icon-name">list-add-symbolic</property> - <property name="icon-size">normal</property> - </object> - </child> - </object> - </child> - <child type="end"> - <object class="GtkMenuButton" id="menu_button"> - <property name="has-frame">False</property> - <child> - <object class="GtkImage"> - <property name="icon-name">open-menu-symbolic</property> - <property name="icon-size">normal</property> - </object> - </child> - </object> - </child> - </object> -</interface> diff --git a/main/data/conversation_row.ui b/main/data/conversation_row.ui index c59ab8e0..1cd499a2 100644 --- a/main/data/conversation_row.ui +++ b/main/data/conversation_row.ui @@ -11,8 +11,8 @@ <property name="orientation">horizontal</property> <property name="margin-top">10</property> <property name="margin-bottom">10</property> - <property name="margin-start">7</property> - <property name="margin-end">14</property> + <property name="margin-start">2</property> + <property name="margin-end">4</property> <child> <object class="DinoUiAvatarPicture" id="picture"> <property name="height-request">35</property> diff --git a/main/data/gresource.xml b/main/data/gresource.xml index 5b9b0211..e39295c4 100644 --- a/main/data/gresource.xml +++ b/main/data/gresource.xml @@ -14,7 +14,6 @@ <file>conversation_details.css</file> <file>conversation_details.ui</file> <file>conversation_item_widget.ui</file> - <file>conversation_list_titlebar.ui</file> <file>conversation_row.ui</file> <file>conversation_view.ui</file> <file>dino-conversation-list-placeholder-arrow.svg</file> @@ -66,6 +65,8 @@ <file>join_room_dialog.ui</file> <file>join_room_dialog1.ui</file> <file>join_room_dialog2.ui</file> + <file>main_window.ui</file> + <file>main_window_placeholder.ui</file> <file>menu_add.ui</file> <file>menu_app.ui</file> <file>menu_conversation.ui</file> @@ -78,7 +79,5 @@ <file>search_autocomplete.ui</file> <file>style-dark.css</file> <file>style.css</file> - <file>unified_main_content.ui</file> - <file>unified_window_placeholder.ui</file> </gresource> </gresources> diff --git a/main/data/main_window.ui b/main/data/main_window.ui new file mode 100644 index 00000000..df755d17 --- /dev/null +++ b/main/data/main_window.ui @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <requires lib="gtk" version="4.0"/> + <requires lib="libadwaita" version="1.4"/> + <template class="DinoUiMainWindow" parent="AdwApplicationWindow"> + <child> + <object class="AdwBreakpoint"> + <condition>max-width: 600sp</condition> + <setter object="navigation_split_view" property="collapsed">True</setter> + </object> + </child> + <property name="content"> + <object class="GtkStack" id="stack"> + <child> + <object class="GtkStackPage"> + <property name="name">main</property> + <property name="child"> + <object class="AdwNavigationSplitView" id="navigation_split_view"> + <property name="vexpand">True</property> + <property name="sidebar"> + <object class="AdwNavigationPage"> + <property name="title">Dino</property> + <property name="tag">sidebar</property> + <property name="child"> + <object class="AdwToolbarView"> + <child type="top"> + <object class="AdwHeaderBar" id="header_bar"> + <property name="show-title">False</property> + <property name="hexpand">False</property> + <style> + <class name="dino-left"/> + </style> + <child> + <object class="GtkMenuButton" id="add_button"> + <property name="has-frame">False</property> + <child> + <object class="GtkImage"> + <property name="icon-name">list-add-symbolic</property> + <property name="icon-size">normal</property> + </object> + </child> + </object> + </child> + <child type="end"> + <object class="GtkMenuButton" id="menu_button"> + <property name="has-frame">False</property> + <child> + <object class="GtkImage"> + <property name="icon-name">open-menu-symbolic</property> + <property name="icon-size">normal</property> + </object> + </child> + </object> + </child> + </object> + </child> + <property name="content"> + <object class="GtkStack" id="left_stack"> + <property name="hexpand">False</property> + <child> + <object class="GtkStackPage"> + <property name="name">content</property> + <property name="child"> + <object class="GtkScrolledWindow"> + <property name="hscrollbar_policy">never</property> + <property name="vexpand">1</property> + <child> + <object class="DinoUiConversationSelector" id="conversation_selector"> + </object> + </child> + </object> + </property> + </object> + </child> + <child> + <object class="GtkStackPage"> + <property name="name">placeholder</property> + <property name="child"> + <object class="AdwStatusPage"> + <style> + <class name="compact"/> + </style> + <property name="margin-start">20</property> + <property name="margin-end">20</property> + <property name="margin-top">20</property> + <property name="margin-bottom">20</property> + <property name="width_request">260</property> + + <property name="title" translatable="yes">You have no open chats</property> + <property name="description" translatable="yes">Click + to start a chat or join a channel</property> + </object> + </property> + </object> + </child> + </object> + </property> + </object> + </property> + </object> + </property> + <property name="content"> + <object class="AdwNavigationPage"> + <property name="title">Conversation</property> + <property name="child"> + <object class="AdwToolbarView"> + <child type="top"> + <object class="AdwHeaderBar" id="conversation_headerbar"> + <property name="title-widget"> + <object class="AdwWindowTitle" id="conversation_window_title" /> + </property> + </object> + </child> + <property name="content"> + <object class="AdwFlap" id="search_flap"> + <property name="flap-position">end</property> + <property name="modal">true</property> + <property name="locked">true</property> + <property name="swipe-to-open">false</property> + <property name="fold-threshold-policy">natural</property> + <property name="hexpand">true</property> + <child type="content"> + <object class="DinoUiNaturalSizeIncrease"> + <property name="min-natural-width">600</property> + <child> + <object class="GtkStack" id="right_stack"> + <property name="hexpand">false</property> + <child> + <object class="GtkStackPage"> + <property name="name">content</property> + <property name="child"> + <object class="DinoUiConversationView" id="conversation_view"> + </object> + </property> + </object> + </child> + <child> + <object class="GtkStackPage"> + <property name="name">placeholder</property> + <property name="child"> + <object class="AdwStatusPage"> + <property name="icon-name">im.dino.Dino-symbolic</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </property> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="separator"> + <object class="GtkSeparator" /> + </child> + <child type="flap"> + <object class="AdwClamp"> + <property name="hexpand">false</property> + <property name="maximum-size">400</property> + <property name="tightening-threshold">400</property> + <child> + <object class="DinoUiNaturalSizeIncrease"> + <property name="min-natural-width">400</property> + <child> + <object class="AdwBin" id="search_frame"> + <property name="hexpand">true</property> + <style> + <class name="background"/> + </style> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </property> + </object> + </property> + </object> + </property> + </object> + </property> + </object> + </child> + </object> + </property> + </template> +</interface> diff --git a/main/data/unified_window_placeholder.ui b/main/data/main_window_placeholder.ui index 123920fe..123920fe 100644 --- a/main/data/unified_window_placeholder.ui +++ b/main/data/main_window_placeholder.ui diff --git a/main/data/style.css b/main/data/style.css index 007586c5..bc004cb4 100644 --- a/main/data/style.css +++ b/main/data/style.css @@ -23,10 +23,6 @@ window.dino-main headerbar.dino-left label.title { color: transparent; } -window.dino-main .dino-conversation { - background: @theme_base_color; -} - window.dino-main .dino-conversation undershoot, window.dino-main .dino-conversation viewport /* Some themes set this */ { background: none; @@ -86,12 +82,6 @@ window.dino-main .unread-count:backdrop { color: @theme_unfocused_fg_color; } -window.dino-main .dino-sidebar > frame { - background: @insensitive_bg_color; - border-left: 1px solid @borders; - border-bottom: 1px solid @borders; -} - /* Message */ .message-box { @@ -257,10 +247,6 @@ window.dino-main .dino-file-overlay { /* Chat Input*/ -window.dino-main .dino-chatinput frame box { - background: transparent; -} - window.dino-main .dino-attach-button { min-width: 24px; /* Make button the same width as avatars */ } diff --git a/main/data/unified_main_content.ui b/main/data/unified_main_content.ui deleted file mode 100644 index 45c0d332..00000000 --- a/main/data/unified_main_content.ui +++ /dev/null @@ -1,126 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <requires lib="gtk" version="4.0"/> - <object class="AdwLeaflet" id="leaflet"> - <property name="transition-type">slide</property> - <property name="can-navigate-back">true</property> - <property name="can-navigate-forward">true</property> - <child> - <object class="GtkBox" id="left_box"> - <property name="orientation">vertical</property> - <style> - <class name="sidebar"/> - </style> - <child> - <object class="GtkStack" id="left_stack"> - <property name="hexpand">False</property> - <child> - <object class="GtkStackPage"> - <property name="name">content</property> - <property name="child"> - <object class="GtkScrolledWindow"> - <property name="hscrollbar_policy">never</property> - <property name="vexpand">1</property> - <child> - <object class="DinoUiConversationSelector" id="conversation_list"> - </object> - </child> - </object> - </property> - </object> - </child> - <child> - <object class="GtkStackPage"> - <property name="name">placeholder</property> - <property name="child"> - <object class="AdwStatusPage"> - <style> - <class name="compact"/> - </style> - <property name="margin-start">20</property> - <property name="margin-end">20</property> - <property name="margin-top">20</property> - <property name="margin-bottom">20</property> - <property name="width_request">260</property> - - <property name="title" translatable="yes">You have no open chats</property> - <property name="description" translatable="yes">Click + to start a chat or join a channel</property> - </object> - </property> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkBox" id="right_box"> - <property name="orientation">vertical</property> - <child> - <object class="AdwFlap" id="search_flap"> - <property name="flap-position">end</property> - <property name="modal">true</property> - <property name="locked">true</property> - <property name="swipe-to-open">false</property> - <property name="fold-threshold-policy">natural</property> - <property name="hexpand">true</property> - <child type="content"> - <object class="DinoUiNaturalSizeIncrease"> - <property name="min-natural-width">600</property> - <child> - <object class="GtkStack" id="right_stack"> - <property name="hexpand">false</property> - <child> - <object class="GtkStackPage"> - <property name="name">content</property> - <property name="child"> - <object class="DinoUiConversationView" id="conversation_view"> - </object> - </property> - </object> - </child> - <child> - <object class="GtkStackPage"> - <property name="name">placeholder</property> - <property name="child"> - <object class="AdwStatusPage"> - <property name="icon-name">im.dino.Dino-symbolic</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - </object> - </property> - </object> - </child> - </object> - </child> - </object> - </child> - <child type="separator"> - <object class="GtkSeparator" /> - </child> - <child type="flap"> - <object class="AdwClamp"> - <property name="hexpand">false</property> - <property name="maximum-size">400</property> - <property name="tightening-threshold">400</property> - <child> - <object class="DinoUiNaturalSizeIncrease"> - <property name="min-natural-width">400</property> - <child> - <object class="AdwBin" id="search_frame"> - <property name="hexpand">true</property> - <style> - <class name="background"/> - </style> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - </child> - </object> -</interface> diff --git a/main/meson.build b/main/meson.build index 8fdcf1e9..be7e531c 100644 --- a/main/meson.build +++ b/main/meson.build @@ -57,11 +57,9 @@ sources = files( 'src/ui/conversation_content_view/subscription_notification.vala', 'src/ui/conversation_content_view/unread_indicator_populator.vala', 'src/ui/conversation_details.vala', - 'src/ui/conversation_list_titlebar.vala', 'src/ui/conversation_selector/conversation_selector.vala', 'src/ui/conversation_selector/conversation_selector_row.vala', 'src/ui/conversation_titlebar/call_entry.vala', - 'src/ui/conversation_titlebar/conversation_titlebar.vala', 'src/ui/conversation_titlebar/menu_entry.vala', 'src/ui/conversation_titlebar/occupants_entry.vala', 'src/ui/conversation_titlebar/search_entry.vala', diff --git a/main/src/ui/conversation_list_titlebar.vala b/main/src/ui/conversation_list_titlebar.vala deleted file mode 100644 index 51dbdcf6..00000000 --- a/main/src/ui/conversation_list_titlebar.vala +++ /dev/null @@ -1,27 +0,0 @@ -using Gtk; - -using Dino.Entities; - -namespace Dino.Ui { - -public static Adw.HeaderBar get_conversation_list_titlebar() { - Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_list_titlebar.ui"); - MenuButton add_button = (MenuButton) builder.get_object("add_button"); - MenuButton menu_button = (MenuButton) builder.get_object("menu_button"); - create_add_menu(add_button, menu_button); - return (Adw.HeaderBar) builder.get_object("header_bar"); -} - -private static void create_add_menu(MenuButton add_button, MenuButton menu_button) { - add_button.tooltip_text = Util.string_if_tooltips_active(_("Start Conversation")); - - Builder add_builder = new Builder.from_resource("/im/dino/Dino/menu_add.ui"); - MenuModel add_menu_model = add_builder.get_object("menu_add") as MenuModel; - add_button.set_menu_model(add_menu_model); - - Builder menu_builder = new Builder.from_resource("/im/dino/Dino/menu_app.ui"); - MenuModel menu_menu_model = menu_builder.get_object("menu_app") as MenuModel; - menu_button.set_menu_model(menu_menu_model); -} - -} diff --git a/main/src/ui/conversation_selector/conversation_selector.vala b/main/src/ui/conversation_selector/conversation_selector.vala index 4439f443..3b3caf5a 100644 --- a/main/src/ui/conversation_selector/conversation_selector.vala +++ b/main/src/ui/conversation_selector/conversation_selector.vala @@ -19,6 +19,7 @@ public class ConversationSelector : Widget { public ConversationSelector init(StreamInteractor stream_interactor) { this.stream_interactor = stream_interactor; list_box.set_parent(this); + list_box.add_css_class("navigation-sidebar"); this.layout_manager = new BinLayout(); stream_interactor.get_module(ConversationManager.IDENTITY).conversation_activated.connect(add_conversation); diff --git a/main/src/ui/conversation_selector/conversation_selector_row.vala b/main/src/ui/conversation_selector/conversation_selector_row.vala index c180b6b3..a0e8b11b 100644 --- a/main/src/ui/conversation_selector/conversation_selector_row.vala +++ b/main/src/ui/conversation_selector/conversation_selector_row.vala @@ -39,29 +39,15 @@ public class ConversationSelectorRow : ListBoxRow { this.conversation = conversation; this.stream_interactor = stream_interactor; - switch (conversation.type_) { - case Conversation.Type.CHAT: - stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => { - if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) { - update_name_label(); - } - }); - break; - case Conversation.Type.GROUPCHAT: - stream_interactor.get_module(MucManager.IDENTITY).room_info_updated.connect((account, jid) => { - if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { - update_name_label(); - update_read(true); // bubble color might have changed - } - }); - stream_interactor.get_module(MucManager.IDENTITY).private_room_occupant_updated.connect((account, room, occupant) => { - if (conversation != null && conversation.counterpart.equals_bare(room.bare_jid) && conversation.account.equals(account)) { - update_name_label(); - } - }); - break; - case Conversation.Type.GROUPCHAT_PM: - break; + var display_name_model = stream_interactor.get_module(ContactModels.IDENTITY).get_display_name_model(conversation); + display_name_model.bind_property("display-name", name_label, "label", BindingFlags.SYNC_CREATE); + + if (conversation.type_ == Conversation.Type.GROUPCHAT) { + stream_interactor.get_module(MucManager.IDENTITY).room_info_updated.connect((account, jid) => { + if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { + update_read(true); // bubble color might have changed + } + }); } // Set tooltip diff --git a/main/src/ui/conversation_titlebar/conversation_titlebar.vala b/main/src/ui/conversation_titlebar/conversation_titlebar.vala deleted file mode 100644 index 326528bd..00000000 --- a/main/src/ui/conversation_titlebar/conversation_titlebar.vala +++ /dev/null @@ -1,54 +0,0 @@ -using Gtk; -using Gee; -using Pango; - -using Dino.Entities; - -namespace Dino.Ui { - -public class ConversationTitlebar : Object { - - public signal void back_pressed(); - - public new string? title { get { return title_label.label; } set { title_label.label = value; } } - public new string? subtitle { get { return subtitle_label.label; } set { subtitle_label.label = value; subtitle_label.visible = (value != null); } } - public bool back_button_visible { - get { return back_revealer.reveal_child; } - set { back_revealer.reveal_child = value; } - } - - public Adw.HeaderBar header_bar = new Adw.HeaderBar(); - private Label title_label = new Label("") { ellipsize=EllipsizeMode.END }; - private Label subtitle_label = new Label("") { use_markup=true, ellipsize=EllipsizeMode.END, visible=false }; - private Revealer back_revealer; - - public ConversationTitlebar() { - Box titles_box = new Box(Orientation.VERTICAL, 0) { valign=Align.CENTER }; - title_label.attributes = new AttrList(); - title_label.attributes.insert(Pango.attr_weight_new(Weight.BOLD)); - titles_box.append(title_label); - subtitle_label.attributes = new AttrList(); - subtitle_label.attributes.insert(Pango.attr_scale_new(Pango.Scale.SMALL)); - subtitle_label.add_css_class("dim-label"); - titles_box.append(subtitle_label); - - back_revealer = new Revealer() { visible = true, transition_type = RevealerTransitionType.SLIDE_RIGHT, transition_duration = 200, can_focus = false, reveal_child = false }; - Button back_button = new Button.from_icon_name("go-previous-symbolic") { visible = true, valign = Align.CENTER, use_underline = true }; - back_button.get_style_context().add_class("image-button"); - back_button.clicked.connect(() => back_pressed()); - back_revealer.set_child(back_button); - header_bar.pack_start(back_revealer); - - header_bar.set_title_widget(titles_box); - } - - public void insert_button(Widget button) { - header_bar.pack_end(button); - } - - public Widget get_widget() { - return header_bar; - } -} - -} diff --git a/main/src/ui/conversation_view_controller.vala b/main/src/ui/conversation_view_controller.vala index 21459669..1662ae56 100644 --- a/main/src/ui/conversation_view_controller.vala +++ b/main/src/ui/conversation_view_controller.vala @@ -8,13 +8,10 @@ namespace Dino.Ui { public class ConversationViewController : Object { - public new string? conversation_display_name { get; set; } - public string? conversation_topic { get; set; } - private Application app; + private MainWindow main_window; private ConversationView view; private Widget? overlay_dialog; - private ConversationTitlebar titlebar; public SearchMenuEntry search_menu_entry = new SearchMenuEntry(); public ListView list_view = new ListView(null, null); private DropTarget drop_event_controller = new DropTarget(typeof(File), DragAction.COPY ); @@ -23,11 +20,13 @@ public class ConversationViewController : Object { private StreamInteractor stream_interactor; private Conversation? conversation; + private Binding? display_name_binding = null; + private const string[] KEY_COMBINATION_CLOSE_CONVERSATION = {"<Ctrl>W", null}; - public ConversationViewController(ConversationView view, ConversationTitlebar titlebar, StreamInteractor stream_interactor) { + public ConversationViewController(MainWindow main_window, ConversationView view, StreamInteractor stream_interactor) { + this.main_window = main_window; this.view = view; - this.titlebar = titlebar; this.stream_interactor = stream_interactor; this.app = GLib.Application.get_default() as Application; @@ -52,7 +51,7 @@ public class ConversationViewController : Object { var key_controller3 = new EventControllerKey() { name = "dino-forward-to-input-key-events-3" }; key_controller3.key_pressed.connect(forward_key_press_to_chat_input); - titlebar.get_widget().add_controller(key_controller3); + main_window.conversation_headerbar.add_controller(key_controller3); // goto-end floating button var vadjustment = view.conversation_frame.scrolled.vadjustment; @@ -65,29 +64,12 @@ public class ConversationViewController : Object { view.conversation_frame.initialize_for_conversation(conversation); }); - // Update conversation display name & topic - this.bind_property("conversation-display-name", titlebar, "title"); - this.bind_property("conversation-topic", titlebar, "subtitle"); - stream_interactor.get_module(MucManager.IDENTITY).room_info_updated.connect((account, jid) => { - if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { - update_conversation_display_name(); - } - }); - stream_interactor.get_module(MucManager.IDENTITY).private_room_occupant_updated.connect((account, room, occupant) => { - if (conversation != null && conversation.counterpart.equals_bare(room.bare_jid) && conversation.account.equals(account)) { - update_conversation_display_name(); - } - }); + // Update conversation topic stream_interactor.get_module(MucManager.IDENTITY).subject_set.connect((account, jid, subject) => { if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { update_conversation_topic(subject); } }); - stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => { - if (conversation != null && conversation.account.equals(account) && conversation.counterpart.equals(jid)) { - update_conversation_display_name(); - } - }); stream_interactor.get_module(FileManager.IDENTITY).upload_available.connect(update_file_upload_status); @@ -101,7 +83,7 @@ public class ConversationViewController : Object { if (button == null) { continue; } - titlebar.insert_button(button); + main_window.conversation_headerbar.pack_end(button); } Shortcut shortcut = new Shortcut(new KeyvalTrigger(Key.U, ModifierType.CONTROL_MASK), new CallbackAction(() => { @@ -144,7 +126,10 @@ public class ConversationViewController : Object { chat_input_controller.set_conversation(conversation); - update_conversation_display_name(); + if (display_name_binding != null) display_name_binding.unbind(); + var display_name_model = stream_interactor.get_module(ContactModels.IDENTITY).get_display_name_model(conversation); + display_name_binding = display_name_model.bind_property("display-name", main_window.conversation_window_title, "title", BindingFlags.SYNC_CREATE); + update_conversation_topic(); foreach(Plugins.ConversationTitlebarEntry e in this.app.plugin_registry.conversation_titlebar_entries) { @@ -159,8 +144,8 @@ public class ConversationViewController : Object { } public void unset_conversation() { - conversation_display_name = null; - conversation_topic = null; + main_window.conversation_window_title.title = null; + main_window.conversation_window_title.subtitle = null; } private async void update_file_upload_status() { @@ -180,25 +165,18 @@ public class ConversationViewController : Object { } } - private void update_conversation_display_name() { - conversation_display_name = Util.get_conversation_display_name(stream_interactor, conversation); - } - private void update_conversation_topic(string? subtitle = null) { + string? str = null; if (subtitle != null) { - string summarized_topic = Util.summarize_whitespaces_to_space(subtitle); - conversation_topic = Util.parse_add_markup(summarized_topic, null, true, true); + str = Util.summarize_whitespaces_to_space(subtitle); } else if (conversation.type_ == Conversation.Type.GROUPCHAT) { string? subject = stream_interactor.get_module(MucManager.IDENTITY).get_groupchat_subject(conversation.counterpart, conversation.account); if (subject != null) { - string summarized_topic = Util.summarize_whitespaces_to_space(subject); - conversation_topic = Util.parse_add_markup(summarized_topic, null, true, true); - } else { - conversation_topic = null; + str = Util.summarize_whitespaces_to_space(subject); } - } else { - conversation_topic = null; } + + main_window.conversation_window_title.subtitle = str; } private async void on_clipboard_paste() { diff --git a/main/src/ui/main_window.vala b/main/src/ui/main_window.vala index e3110336..63ee1350 100644 --- a/main/src/ui/main_window.vala +++ b/main/src/ui/main_window.vala @@ -6,30 +6,32 @@ using Dino.Entities; namespace Dino.Ui { +[GtkTemplate (ui = "/im/dino/Dino/main_window.ui")] public class MainWindow : Adw.ApplicationWindow { public signal void conversation_selected(Conversation conversation); - public new string? title { get; set; } - public string? subtitle { get; set; } + [GtkChild] public Stack stack; + [GtkChild] public Adw.NavigationSplitView navigation_split_view; + + [GtkChild] public MenuButton add_button; + [GtkChild] public MenuButton menu_button; + + [GtkChild] public Adw.HeaderBar conversation_headerbar; + [GtkChild] public Adw.WindowTitle conversation_window_title; + + [GtkChild] public ConversationView conversation_view; + [GtkChild] public ConversationSelector conversation_selector; + [GtkChild] public Adw.Flap search_flap; + [GtkChild] private Stack left_stack; + [GtkChild] private Stack right_stack; + [GtkChild] public Adw.Bin search_frame; + + public GlobalSearch global_search; public WelcomePlaceholder welcome_placeholder = new WelcomePlaceholder(); public NoAccountsPlaceholder accounts_placeholder = new NoAccountsPlaceholder(); - public ConversationView conversation_view; - public ConversationSelector conversation_selector; - public ConversationTitlebar conversation_titlebar; - public Widget conversation_list_titlebar; - public Box box = new Box(Orientation.VERTICAL, 0) { orientation=Orientation.VERTICAL }; - private Adw.Leaflet leaflet; - public Box left_box; - public Box right_box; - public Adw.Flap search_flap; - public GlobalSearch global_search; - private Stack stack = new Stack(); - private Stack left_stack; - private Stack right_stack; - private StreamInteractor stream_interactor; private Database db; private Config config; @@ -43,7 +45,6 @@ public class MainWindow : Adw.ApplicationWindow { public MainWindow(Application application, StreamInteractor stream_interactor, Database db, Config config) { Object(application : application); - this.stream_interactor = stream_interactor; this.db = db; this.config = config; @@ -53,45 +54,16 @@ public class MainWindow : Adw.ApplicationWindow { ((Widget)this).realize.connect(restore_window_size); - setup_unified(); - setup_headerbar(); - setup_stack(); - } - - private void setup_unified() { - Builder builder = new Builder.from_resource("/im/dino/Dino/unified_main_content.ui"); - leaflet = (Adw.Leaflet) builder.get_object("leaflet"); - box.append(leaflet); - left_box = (Box) builder.get_object("left_box"); - right_box = (Box) builder.get_object("right_box"); - left_stack = (Stack) builder.get_object("left_stack"); - right_stack = (Stack) builder.get_object("right_stack"); - conversation_view = (ConversationView) builder.get_object("conversation_view"); - search_flap = (Adw.Flap) builder.get_object("search_flap"); - conversation_selector = ((ConversationSelector) builder.get_object("conversation_list")).init(stream_interactor); - conversation_selector.conversation_selected.connect_after(() => leaflet.navigate(Adw.NavigationDirection.FORWARD)); + conversation_selector.init(stream_interactor); + conversation_selector.conversation_selected.connect_after(() => { navigation_split_view.show_content = true; }); - Adw.Bin search_frame = (Adw.Bin) builder.get_object("search_frame"); global_search = new GlobalSearch(stream_interactor); search_frame.set_child(global_search.get_widget()); - } - private void setup_headerbar() { - conversation_list_titlebar = get_conversation_list_titlebar(); - conversation_titlebar = new ConversationTitlebar(); - leaflet.bind_property("folded", conversation_list_titlebar, "show-end-title-buttons", BindingFlags.SYNC_CREATE); - leaflet.bind_property("folded", conversation_titlebar.get_widget(), "show-start-title-buttons", BindingFlags.SYNC_CREATE); - left_box.prepend(conversation_list_titlebar); - right_box.prepend(conversation_titlebar.get_widget()); - leaflet.notify["folded"].connect_after(() => conversation_titlebar.back_button_visible = leaflet.folded); - conversation_titlebar.back_pressed.connect(() => leaflet.navigate(Adw.NavigationDirection.BACK)); - } + create_add_menu(add_button, menu_button); - private void setup_stack() { - stack.add_named(box, "main"); stack.add_named(welcome_placeholder, "welcome_placeholder"); stack.add_named(accounts_placeholder, "accounts_placeholder"); - set_content(stack); } public enum StackState { @@ -105,14 +77,11 @@ public class MainWindow : Adw.ApplicationWindow { if (stack_state == StackState.CONVERSATION) { left_stack.set_visible_child_name("content"); right_stack.set_visible_child_name("content"); - stack.set_visible_child_name("main"); - } else if (stack_state == StackState.CLEAN_START || stack_state == StackState.NO_ACTIVE_ACCOUNTS) { - if (stack_state == StackState.CLEAN_START) { - stack.set_visible_child_name("welcome_placeholder"); - } else if (stack_state == StackState.NO_ACTIVE_ACCOUNTS) { - stack.set_visible_child_name("accounts_placeholder"); - } + } else if (stack_state == StackState.CLEAN_START) { + stack.set_visible_child_name("welcome_placeholder"); + } else if (stack_state == StackState.NO_ACTIVE_ACCOUNTS) { + stack.set_visible_child_name("accounts_placeholder"); } else if (stack_state == StackState.NO_ACTIVE_CONVERSATIONS) { stack.set_visible_child_name("main"); left_stack.set_visible_child_name("placeholder"); @@ -163,6 +132,18 @@ public class MainWindow : Adw.ApplicationWindow { } } } + + private static void create_add_menu(MenuButton add_button, MenuButton menu_button) { + add_button.tooltip_text = Util.string_if_tooltips_active(_("Start Conversation")); + + Builder add_builder = new Builder.from_resource("/im/dino/Dino/menu_add.ui"); + MenuModel add_menu_model = add_builder.get_object("menu_add") as MenuModel; + add_button.set_menu_model(add_menu_model); + + Builder menu_builder = new Builder.from_resource("/im/dino/Dino/menu_app.ui"); + MenuModel menu_menu_model = menu_builder.get_object("menu_app") as MenuModel; + menu_button.set_menu_model(menu_menu_model); + } } public class WelcomePlaceholder : MainWindowPlaceholder { @@ -182,7 +163,7 @@ public class NoAccountsPlaceholder : MainWindowPlaceholder { } } -[GtkTemplate (ui = "/im/dino/Dino/unified_window_placeholder.ui")] +[GtkTemplate (ui = "/im/dino/Dino/main_window_placeholder.ui")] public class MainWindowPlaceholder : Box { [GtkChild] public unowned Adw.StatusPage status_page; [GtkChild] public unowned Button primary_button; diff --git a/main/src/ui/main_window_controller.vala b/main/src/ui/main_window_controller.vala index 2e270663..118eb73b 100644 --- a/main/src/ui/main_window_controller.vala +++ b/main/src/ui/main_window_controller.vala @@ -43,7 +43,7 @@ public class MainWindowController : Object { public void set_window(MainWindow window) { this.window = window; - this.conversation_view_controller = new ConversationViewController(window.conversation_view, window.conversation_titlebar, stream_interactor); + this.conversation_view_controller = new ConversationViewController(window, window.conversation_view, stream_interactor); conversation_view_controller.search_menu_entry.button.bind_property("active", window.search_flap, "reveal-flap", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); |
