Private
Public Access
1
0

wire up message loading

This commit is contained in:
2025-04-30 19:50:36 -07:00
parent 4c7c31ab8d
commit a7e88bd3c3
8 changed files with 69 additions and 21 deletions

View File

@@ -3,6 +3,9 @@ using Gtk;
public class MainWindow : Adw.ApplicationWindow public class MainWindow : Adw.ApplicationWindow
{ {
private ConversationListView conversation_list_view;
private MessageListView message_list_view;
public MainWindow () { public MainWindow () {
Object (title: "Kordophone"); Object (title: "Kordophone");
@@ -10,10 +13,22 @@ public class MainWindow : Adw.ApplicationWindow
split_view.set_min_sidebar_width (400); split_view.set_min_sidebar_width (400);
set_content (split_view); set_content (split_view);
var conversation_list_page = new NavigationPage (new ConversationListView (), "Conversations"); conversation_list_view = new ConversationListView ();
conversation_list_view.conversation_selected.connect (conversation_selected);
var conversation_list_page = new NavigationPage (conversation_list_view, "Conversations");
split_view.sidebar = conversation_list_page; split_view.sidebar = conversation_list_page;
var message_list_page = new NavigationPage (new MessageListView (new MessageListModel ("123")), "Messages"); message_list_view = new MessageListView (new MessageListModel ("123"));
var message_list_page = new NavigationPage (message_list_view, "Messages");
split_view.content = message_list_page; split_view.content = message_list_page;
} }
private void conversation_selected(string? conversation_guid) {
if (conversation_guid == null) {
message_list_view.model = null;
} else {
message_list_view.model = new MessageListModel (conversation_guid);
}
}
} }

View File

@@ -3,6 +3,8 @@ using Gtk;
public class ConversationListView : Adw.Bin public class ConversationListView : Adw.Bin
{ {
public signal void conversation_selected(string? conversation_guid);
private Adw.ToolbarView container; private Adw.ToolbarView container;
private ListBox list_box; private ListBox list_box;
private ScrolledWindow scrolled_window; private ScrolledWindow scrolled_window;
@@ -21,6 +23,11 @@ public class ConversationListView : Adw.Bin
list_box.set_selection_mode (SelectionMode.SINGLE); list_box.set_selection_mode (SelectionMode.SINGLE);
scrolled_window.set_child (list_box); scrolled_window.set_child (list_box);
list_box.row_selected.connect ((row) => {
var conversation_row = (ConversationRow?) row;
conversation_selected(conversation_row != null ? conversation_row.conversation.guid : null);
});
header_bar = new Adw.HeaderBar (); header_bar = new Adw.HeaderBar ();
header_bar.set_title_widget (new Label ("Kordophone")); header_bar.set_title_widget (new Label ("Kordophone"));
container.add_top_bar (header_bar); container.add_top_bar (header_bar);

View File

@@ -2,11 +2,11 @@ using Adw;
using Gtk; using Gtk;
public class ConversationRow : Adw.ActionRow { public class ConversationRow : Adw.ActionRow {
public Conversation conversation;
private Label unread_badge; private Label unread_badge;
public ConversationRow(Conversation conversation) { public ConversationRow(Conversation conversation) {
Object(); this.conversation = conversation;
title = conversation.display_name; title = conversation.display_name;
subtitle = conversation.last_message_preview; subtitle = conversation.last_message_preview;
subtitle_lines = 1; subtitle_lines = 1;

View File

@@ -92,5 +92,6 @@ private class MessageDrawingArea : Widget
}); });
queue_draw(); queue_draw();
queue_resize();
} }
} }

View File

@@ -23,7 +23,7 @@ private class MessageLayout : Object
this.max_width = max_width; this.max_width = max_width;
this.parent = parent; this.parent = parent;
layout = parent.create_pango_layout(message.content); layout = parent.create_pango_layout(message.text);
// Set text attributes // Set text attributes
var font_desc = Pango.FontDescription.from_string(font_description); var font_desc = Pango.FontDescription.from_string(font_description);
@@ -35,7 +35,7 @@ private class MessageLayout : Object
public bool from_me { public bool from_me {
get { get {
return message.sender == null; return message.from_me;
} }
} }

View File

@@ -3,6 +3,8 @@ using Gee;
public class MessageListModel : Object, ListModel public class MessageListModel : Object, ListModel
{ {
public signal void messages_changed();
public SortedSet<Message> messages { public SortedSet<Message> messages {
owned get { return _messages.read_only_view; } owned get { return _messages.read_only_view; }
} }
@@ -49,6 +51,8 @@ public class MessageListModel : Object, ListModel
} catch (Error e) { } catch (Error e) {
warning("Failed to load messages: %s", e.message); warning("Failed to load messages: %s", e.message);
} }
messages_changed();
} }
private void got_messages_updated(string conversation_guid) { private void got_messages_updated(string conversation_guid) {

View File

@@ -4,12 +4,31 @@ using Gee;
public class MessageListView : Adw.Bin public class MessageListView : Adw.Bin
{ {
public MessageListModel? model {
get {
return _model;
}
set {
_model = value;
if (model != null) {
model.messages_changed.connect(reload_messages);
model.load_messages();
} else {
message_drawing_area.set_messages(new TreeSet<Message>());
}
}
}
private MessageListModel? _model = null;
private Adw.ToolbarView container; private Adw.ToolbarView container;
private MessageDrawingArea message_drawing_area = new MessageDrawingArea(); private MessageDrawingArea message_drawing_area = new MessageDrawingArea();
private ScrolledWindow scrolled_window = new ScrolledWindow(); private ScrolledWindow scrolled_window = new ScrolledWindow();
public MessageListView(MessageListModel model) { public MessageListView(MessageListModel? model = null) {
this.model = model;
container = new Adw.ToolbarView(); container = new Adw.ToolbarView();
set_child(container); set_child(container);
@@ -20,14 +39,9 @@ public class MessageListView : Adw.Bin
var header_bar = new Adw.HeaderBar(); var header_bar = new Adw.HeaderBar();
header_bar.set_title_widget(new Label("Messages")); header_bar.set_title_widget(new Label("Messages"));
container.add_top_bar(header_bar); container.add_top_bar(header_bar);
}
// Create test message set private void reload_messages() {
var messages = new TreeSet<Message>(); message_drawing_area.set_messages(_model.messages);
messages.add(new Message("Hello, world!", 1, "user"));
messages.add(new Message("How, are you?", 2, null));
messages.add(new Message("I'm fine, thank you!", 3, "user"));
messages.add(new Message("GTK also supports color expressions, which allow colors to be transformed to new ones and can be nested, providing a rich language to define colors. Color expressions resemble functions, taking 1 or more colors and in some cases a number as arguments.", 4, "user"));
message_drawing_area.set_messages(messages);
} }
} }

View File

@@ -3,19 +3,26 @@ using GLib;
public class Message : Object public class Message : Object
{ {
public string guid { get; set; default = ""; } public string guid { get; set; default = ""; }
public string content { get; set; default = ""; } public string text { get; set; default = ""; }
public int64 date { get; set; default = 0; } public int64 date { get; set; default = 0; }
public string? sender { get; set; default = null; } public string sender { get; set; default = null; }
public Message(string content, int64 date, string? sender) { public bool from_me {
this.content = content; get {
// Hm, this may have been accidental.
return sender == "(Me)";
}
}
public Message(string text, int64 date, string? sender) {
this.text = text;
this.date = date; this.date = date;
this.sender = sender; this.sender = sender;
} }
public Message.from_hash_table(HashTable<string, Variant> message_data) { public Message.from_hash_table(HashTable<string, Variant> message_data) {
guid = message_data["guid"].get_string(); guid = message_data["id"].get_string();
content = message_data["content"].get_string(); text = message_data["text"].get_string();
date = message_data["date"].get_int64(); date = message_data["date"].get_int64();
sender = message_data["sender"].get_string(); sender = message_data["sender"].get_string();
} }