Private
Public Access
1
0
Files
Kordophone/src/conversation-list/conversation-list-view.vala

105 lines
3.5 KiB
Vala
Raw Normal View History

2025-04-28 17:29:32 -07:00
using Adw;
using Gtk;
public class ConversationListView : Adw.Bin
{
2025-04-30 19:50:36 -07:00
public signal void conversation_selected(string? conversation_guid);
2025-04-28 17:29:32 -07:00
private Adw.ToolbarView container;
private ListBox list_box;
private ScrolledWindow scrolled_window;
2025-04-28 17:29:32 -07:00
private Adw.HeaderBar header_bar;
private ConversationListModel conversation_model;
2025-04-28 17:29:32 -07:00
private string? selected_conversation_guid = null;
private bool selection_update_queued = false;
2025-04-28 17:29:32 -07:00
public ConversationListView () {
container = new Adw.ToolbarView ();
set_child (container);
scrolled_window = new ScrolledWindow ();
container.set_content (scrolled_window);
2025-04-28 17:29:32 -07:00
list_box = new ListBox ();
list_box.add_css_class ("boxed-list");
list_box.set_selection_mode (SelectionMode.SINGLE);
scrolled_window.set_child (list_box);
2025-04-28 17:29:32 -07:00
2025-04-30 19:50:36 -07:00
list_box.row_selected.connect ((row) => {
var conversation_row = (ConversationRow?) row;
if (conversation_row != null) {
selected_conversation_guid = conversation_row.conversation.guid;
conversation_selected(selected_conversation_guid);
}
2025-04-30 19:50:36 -07:00
});
2025-04-28 17:29:32 -07:00
header_bar = new Adw.HeaderBar ();
header_bar.set_title_widget (new Label ("Kordophone"));
container.add_top_bar (header_bar);
// Setup application menu
var app_menu = new Menu ();
app_menu.append ("Refresh", "list.refresh");
app_menu.append ("Settings...", "win.settings");
app_menu.append ("Quit", "app.quit");
var refresh_action = new SimpleAction("refresh", null);
refresh_action.activate.connect (() => {
if (conversation_model != null) {
conversation_model.load_conversations ();
}
});
var action_group = new SimpleActionGroup ();
action_group.add_action(refresh_action);
insert_action_group ("list", action_group);
2025-05-03 01:11:26 -07:00
var menu_button = new Gtk.MenuButton ();
menu_button.menu_model = app_menu;
header_bar.pack_end (menu_button);
// Set up model and bind to list
conversation_model = new ConversationListModel ();
conversation_model.items_changed.connect (on_items_changed);
list_box.bind_model (conversation_model, create_conversation_row);
2025-04-28 17:29:32 -07:00
}
private void on_items_changed (uint position, uint removed, uint added) {
enqueue_selection_update();
}
private void enqueue_selection_update() {
if (selection_update_queued) {
return;
}
selection_update_queued = true;
GLib.Idle.add(() => {
update_selection();
selection_update_queued = false;
return false;
}, GLib.Priority.HIGH);
}
private void update_selection() {
// Re-select selected_conversation_guid, if it has changed.
if (selected_conversation_guid != null) {
for (uint i = 0; i < conversation_model.get_n_items(); i++) {
var conversation = (Conversation) conversation_model.get_item(i);
if (conversation.guid == selected_conversation_guid) {
var row = list_box.get_row_at_index((int)i);
if (row != null) {
list_box.select_row(row);
}
}
}
}
}
private Widget create_conversation_row (Object item) {
Conversation conversation = (Conversation) item;
return new ConversationRow (conversation);
}
2025-04-28 17:29:32 -07:00
}