aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/chat.c35
-rw-r--r--src/ui/chat.h3
-rw-r--r--src/ui/message.c33
-rw-r--r--src/ui/message.h8
4 files changed, 79 insertions, 0 deletions
diff --git a/src/ui/chat.c b/src/ui/chat.c
index 42ccb9e..5dd11f6 100644
--- a/src/ui/chat.c
+++ b/src/ui/chat.c
@@ -95,6 +95,29 @@ handle_chat_contacts_listbox_row_activated(GtkListBox *listbox,
95} 95}
96 96
97static void 97static void
98handle_chat_messages_listbox_size_allocate(UNUSED GtkWidget *widget,
99 UNUSED GdkRectangle *allocation,
100 gpointer user_data)
101{
102 UI_CHAT_Handle *handle = (UI_CHAT_Handle*) user_data;
103
104 GtkAdjustment *adjustment = gtk_scrolled_window_get_vadjustment(
105 handle->chat_scrolled_window
106 );
107
108 const gdouble value = gtk_adjustment_get_value(adjustment);
109 const gdouble upper = gtk_adjustment_get_upper(adjustment);
110 const gdouble page_size = gtk_adjustment_get_page_size(adjustment);
111
112 const gdouble edge_value = upper - page_size;
113
114 if (value >= handle->edge_value)
115 gtk_adjustment_set_value(adjustment, edge_value);
116
117 handle->edge_value = upper - page_size;
118}
119
120static void
98handle_back_button_click(UNUSED GtkButton *button, 121handle_back_button_click(UNUSED GtkButton *button,
99 gpointer user_data) 122 gpointer user_data)
100{ 123{
@@ -254,6 +277,7 @@ ui_chat_new(MESSENGER_Application *app)
254 UI_MESSENGER_Handle *messenger = &(app->ui.messenger); 277 UI_MESSENGER_Handle *messenger = &(app->ui.messenger);
255 278
256 handle->messages = NULL; 279 handle->messages = NULL;
280 handle->edge_value = 0;
257 281
258 handle->builder = gtk_builder_new_from_file( 282 handle->builder = gtk_builder_new_from_file(
259 "resources/ui/chat.ui" 283 "resources/ui/chat.ui"
@@ -324,6 +348,10 @@ ui_chat_new(MESSENGER_Application *app)
324 gtk_builder_get_object(handle->builder, "chat_details_contacts_box") 348 gtk_builder_get_object(handle->builder, "chat_details_contacts_box")
325 ); 349 );
326 350
351 handle->chat_scrolled_window = GTK_SCROLLED_WINDOW(
352 gtk_builder_get_object(handle->builder, "chat_scrolled_window")
353 );
354
327 handle->chat_contacts_listbox = GTK_LIST_BOX( 355 handle->chat_contacts_listbox = GTK_LIST_BOX(
328 gtk_builder_get_object(handle->builder, "chat_contacts_listbox") 356 gtk_builder_get_object(handle->builder, "chat_contacts_listbox")
329 ); 357 );
@@ -339,6 +367,13 @@ ui_chat_new(MESSENGER_Application *app)
339 gtk_builder_get_object(handle->builder, "messages_listbox") 367 gtk_builder_get_object(handle->builder, "messages_listbox")
340 ); 368 );
341 369
370 g_signal_connect(
371 handle->messages_listbox,
372 "size-allocate",
373 G_CALLBACK(handle_chat_messages_listbox_size_allocate),
374 handle
375 );
376
342 handle->attach_file_button = GTK_BUTTON( 377 handle->attach_file_button = GTK_BUTTON(
343 gtk_builder_get_object(handle->builder, "attach_file_button") 378 gtk_builder_get_object(handle->builder, "attach_file_button")
344 ); 379 );
diff --git a/src/ui/chat.h b/src/ui/chat.h
index f065f61..6619506 100644
--- a/src/ui/chat.h
+++ b/src/ui/chat.h
@@ -37,6 +37,7 @@ typedef struct UI_PICKER_Handle UI_PICKER_Handle;
37typedef struct UI_CHAT_Handle 37typedef struct UI_CHAT_Handle
38{ 38{
39 GList *messages; 39 GList *messages;
40 gdouble edge_value;
40 41
41 GtkBuilder *builder; 42 GtkBuilder *builder;
42 GtkWidget *chat_box; 43 GtkWidget *chat_box;
@@ -53,6 +54,8 @@ typedef struct UI_CHAT_Handle
53 GtkButton *hide_chat_details_button; 54 GtkButton *hide_chat_details_button;
54 GtkBox *chat_details_contacts_box; 55 GtkBox *chat_details_contacts_box;
55 56
57 GtkScrolledWindow *chat_scrolled_window;
58
56 GtkListBox *chat_contacts_listbox; 59 GtkListBox *chat_contacts_listbox;
57 GtkListBox *messages_listbox; 60 GtkListBox *messages_listbox;
58 61
diff --git a/src/ui/message.c b/src/ui/message.c
index 4c89edb..6f379d7 100644
--- a/src/ui/message.c
+++ b/src/ui/message.c
@@ -106,6 +106,10 @@ ui_message_new(UI_MESSAGE_Type type,
106 gtk_builder_get_object(builder, "read_receipt_image") 106 gtk_builder_get_object(builder, "read_receipt_image")
107 ); 107 );
108 108
109 handle->content_stack = GTK_STACK(
110 gtk_builder_get_object(builder, "content_stack")
111 );
112
109 handle->text_label = GTK_LABEL( 113 handle->text_label = GTK_LABEL(
110 gtk_builder_get_object(builder, "text_label") 114 gtk_builder_get_object(builder, "text_label")
111 ); 115 );
@@ -129,9 +133,26 @@ ui_message_new(UI_MESSAGE_Type type,
129 133
130 switch (content_type) 134 switch (content_type)
131 { 135 {
136 case UI_MESSAGE_CONTENT_TEXT:
137 gtk_stack_set_visible_child(
138 handle->content_stack,
139 GTK_WIDGET(handle->text_label)
140 );
141 break;
132 case UI_MESSAGE_CONTENT_FILE: 142 case UI_MESSAGE_CONTENT_FILE:
143 gtk_stack_set_visible_child(
144 handle->content_stack,
145 GTK_WIDGET(handle->file_revealer)
146 );
147
133 gtk_revealer_set_reveal_child(handle->file_revealer, TRUE); 148 gtk_revealer_set_reveal_child(handle->file_revealer, TRUE);
134 break; 149 break;
150 case UI_MESSAGE_CONTENT_PREVIEW:
151 gtk_stack_set_visible_child(
152 handle->content_stack,
153 GTK_WIDGET(handle->preview_drawing_area)
154 );
155 break;
135 default: 156 default:
136 break; 157 break;
137 } 158 }
@@ -145,6 +166,18 @@ ui_message_new(UI_MESSAGE_Type type,
145} 166}
146 167
147void 168void
169ui_message_update(UI_MESSAGE_Handle *handle,
170 struct GNUNET_CHAT_Message *msg)
171{
172 struct GNUNET_CHAT_File *file = GNUNET_CHAT_message_get_file(msg);
173
174 if (!file)
175 return;
176
177 // TODO
178}
179
180void
148ui_message_delete(UI_MESSAGE_Handle *handle) 181ui_message_delete(UI_MESSAGE_Handle *handle)
149{ 182{
150 g_object_unref(handle->builder); 183 g_object_unref(handle->builder);
diff --git a/src/ui/message.h b/src/ui/message.h
index b380960..704c33f 100644
--- a/src/ui/message.h
+++ b/src/ui/message.h
@@ -30,6 +30,8 @@
30#include <gtk-3.0/gtk/gtk.h> 30#include <gtk-3.0/gtk/gtk.h>
31#include <libhandy-1/handy.h> 31#include <libhandy-1/handy.h>
32 32
33#include <gnunet/gnunet_chat_lib.h>
34
33typedef struct MESSENGER_Application MESSENGER_Application; 35typedef struct MESSENGER_Application MESSENGER_Application;
34 36
35typedef enum UI_MESSAGE_Type 37typedef enum UI_MESSAGE_Type
@@ -65,6 +67,8 @@ typedef struct UI_MESSAGE_Handle
65 GtkLabel *timestamp_label; 67 GtkLabel *timestamp_label;
66 GtkImage *read_receipt_image; 68 GtkImage *read_receipt_image;
67 69
70 GtkStack *content_stack;
71
68 GtkLabel *text_label; 72 GtkLabel *text_label;
69 GtkRevealer *file_revealer; 73 GtkRevealer *file_revealer;
70 GtkDrawingArea *preview_drawing_area; 74 GtkDrawingArea *preview_drawing_area;
@@ -75,6 +79,10 @@ ui_message_new(UI_MESSAGE_Type type,
75 UI_MESSAGE_ContentType content_type); 79 UI_MESSAGE_ContentType content_type);
76 80
77void 81void
82ui_message_update(UI_MESSAGE_Handle *handle,
83 struct GNUNET_CHAT_Message *message);
84
85void
78ui_message_delete(UI_MESSAGE_Handle *handle); 86ui_message_delete(UI_MESSAGE_Handle *handle);
79 87
80#endif /* UI_MESSAGE_H_ */ 88#endif /* UI_MESSAGE_H_ */