aboutsummaryrefslogtreecommitdiff
path: root/src/ui/chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/chat.c')
-rw-r--r--src/ui/chat.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/src/ui/chat.c b/src/ui/chat.c
index eefb7cf..e0b284d 100644
--- a/src/ui/chat.c
+++ b/src/ui/chat.c
@@ -142,6 +142,35 @@ handle_back_button_click(UNUSED GtkButton *button,
142 } 142 }
143} 143}
144 144
145static gint
146handle_chat_messages_sort(GtkListBoxRow* row0,
147 GtkListBoxRow* row1,
148 gpointer user_data)
149{
150 MESSENGER_Application *app = (MESSENGER_Application*) user_data;
151
152 UI_MESSAGE_Handle *message0 = (UI_MESSAGE_Handle*) (
153 g_hash_table_lookup(app->ui.bindings, row0)
154 );
155
156 UI_MESSAGE_Handle *message1 = (UI_MESSAGE_Handle*) (
157 g_hash_table_lookup(app->ui.bindings, row1)
158 );
159
160 if ((!message0) || (!message1))
161 return 0;
162
163 struct GNUNET_TIME_Absolute timestamp0 = message0->timestamp;
164 struct GNUNET_TIME_Absolute timestamp1 = message1->timestamp;
165
166 if (GNUNET_TIME_absolute_cmp(timestamp0, <, timestamp1))
167 return -1;
168 else if (GNUNET_TIME_absolute_cmp(timestamp0, >, timestamp1))
169 return +1;
170 else
171 return 0;
172}
173
145static void 174static void
146handle_chat_messages_selected_rows_changed(GtkListBox *listbox, 175handle_chat_messages_selected_rows_changed(GtkListBox *listbox,
147 gpointer user_data) 176 gpointer user_data)
@@ -461,6 +490,13 @@ ui_chat_new(MESSENGER_Application *app)
461 gtk_builder_get_object(handle->builder, "messages_listbox") 490 gtk_builder_get_object(handle->builder, "messages_listbox")
462 ); 491 );
463 492
493 gtk_list_box_set_sort_func(
494 handle->messages_listbox,
495 handle_chat_messages_sort,
496 app,
497 NULL
498 );
499
464 g_signal_connect( 500 g_signal_connect(
465 handle->messages_listbox, 501 handle->messages_listbox,
466 "selected-rows-changed", 502 "selected-rows-changed",
@@ -747,7 +783,7 @@ ui_chat_delete(UI_CHAT_Handle *handle)
747 783
748void 784void
749ui_chat_add_message(UI_CHAT_Handle *handle, 785ui_chat_add_message(UI_CHAT_Handle *handle,
750 GNUNET_UNUSED MESSENGER_Application *app, 786 MESSENGER_Application *app,
751 UI_MESSAGE_Handle *message) 787 UI_MESSAGE_Handle *message)
752{ 788{
753 GNUNET_assert((handle) && (message)); 789 GNUNET_assert((handle) && (message));
@@ -757,18 +793,28 @@ ui_chat_add_message(UI_CHAT_Handle *handle,
757 message->message_box 793 message->message_box
758 ); 794 );
759 795
796 GtkWidget *row = gtk_widget_get_parent(message->message_box);
797
798 g_hash_table_insert(app->ui.bindings, row, message);
799
760 handle->messages = g_list_prepend(handle->messages, message); 800 handle->messages = g_list_prepend(handle->messages, message);
801
802 gtk_list_box_invalidate_sort(handle->messages_listbox);
761} 803}
762 804
763void 805void
764ui_chat_remove_message(UI_CHAT_Handle *handle, 806ui_chat_remove_message(UI_CHAT_Handle *handle,
765 GNUNET_UNUSED MESSENGER_Application *app, 807 MESSENGER_Application *app,
766 UI_MESSAGE_Handle *message) 808 UI_MESSAGE_Handle *message)
767{ 809{
768 GNUNET_assert((handle) && (message)); 810 GNUNET_assert((handle) && (message));
769 811
770 handle->messages = g_list_remove(handle->messages, message); 812 handle->messages = g_list_remove(handle->messages, message);
771 813
814 GtkWidget *row = gtk_widget_get_parent(message->message_box);
815
816 g_hash_table_remove(app->ui.bindings, row);
817
772 gtk_container_remove( 818 gtk_container_remove(
773 GTK_CONTAINER(handle->messages_listbox), 819 GTK_CONTAINER(handle->messages_listbox),
774 gtk_widget_get_parent(GTK_WIDGET(message->message_box)) 820 gtk_widget_get_parent(GTK_WIDGET(message->message_box))