aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2025-10-05 11:20:39 +0200
committerfiaxh <git@lightrise.org>2025-10-05 11:20:39 +0200
commit3f9318f83f75ee45ede07da4e617556421505eeb (patch)
treece783c258f9574cda7cb83f6e418a6cac5688007 /main/src/ui
parentd625058d76efc9e344dd5e1239a4b040a7d2519a (diff)
Use AdwNavigationSplitView instead of AdwLeaflet for main window
Diffstat (limited to 'main/src/ui')
-rw-r--r--main/src/ui/conversation_list_titlebar.vala27
-rw-r--r--main/src/ui/conversation_selector/conversation_selector.vala1
-rw-r--r--main/src/ui/conversation_selector/conversation_selector_row.vala32
-rw-r--r--main/src/ui/conversation_titlebar/conversation_titlebar.vala54
-rw-r--r--main/src/ui/conversation_view_controller.vala60
-rw-r--r--main/src/ui/main_window.vala95
-rw-r--r--main/src/ui/main_window_controller.vala2
7 files changed, 68 insertions, 203 deletions
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);