diff options
Diffstat (limited to 'src/ui/chat.c')
-rw-r--r-- | src/ui/chat.c | 50 |
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 | ||
145 | static gint | ||
146 | handle_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 | |||
145 | static void | 174 | static void |
146 | handle_chat_messages_selected_rows_changed(GtkListBox *listbox, | 175 | handle_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 | ||
748 | void | 784 | void |
749 | ui_chat_add_message(UI_CHAT_Handle *handle, | 785 | ui_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 | ||
763 | void | 805 | void |
764 | ui_chat_remove_message(UI_CHAT_Handle *handle, | 806 | ui_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)) |