From e1ae13450cf3ad12df82bd6a2111eedd6d169ef7 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 29 Jul 2011 14:23:21 +1000 Subject: Add a webview widget for displaying the log The widget is currently bolted in alongside the existing log display widget for comparison. This includes some debugging cruft like showing the secret notebook tabs. The webview is populated from the store_events treestore, allowing all of the existing node-management and ordering code to be used. Attempting to replace this logic in Javascript was demonstratably too hard. This approach keeps the Javascript code down to the 4 GtkTreeModel signals. TODO: - icons - pretty printed dates - expanders - supporting smileys, links, etc. - using the correct font, etc. - removing the debugging --- libempathy-gtk/empathy-log-window.c | 133 ++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) (limited to 'libempathy-gtk') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index e5c935011..04f224290 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -83,6 +84,7 @@ struct _EmpathyLogWindowPriv GtkWidget *treeview_what; GtkWidget *treeview_when; GtkWidget *treeview_events; + GtkWidget *webview; GtkTreeStore *store_events; @@ -360,6 +362,103 @@ toolbutton_av_clicked (GtkToolButton *toolbutton, TRUE, video, gtk_get_current_event_time ()); } +static void +insert_or_change_row (EmpathyLogWindow *self, + const char *method, + GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter) +{ + char *str = gtk_tree_path_to_string (path); + char *script, *text; + + gtk_tree_model_get (model, iter, + COL_EVENTS_TEXT, &text, + -1); + + script = g_strdup_printf ("javascript:%s([%s], '%s');", + method, + g_strdelimit (str, ":", ','), + text); + + // g_print ("%s\n", script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (text); + g_free (script); +} + +static void +store_events_row_inserted (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + insert_or_change_row (self, "insertRow", model, path, iter); +} + +static void +store_events_row_changed (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + insert_or_change_row (self, "changeRow", model, path, iter); +} + +static void +store_events_row_deleted (GtkTreeModel *model, + GtkTreePath *path, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + char *script; + + script = g_strdup_printf ("javascript:deleteRow([%s]);", + g_strdelimit (str, ":", ',')); + + // g_print ("%s\n", script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (script); +} + +static void +store_events_rows_reordered (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + int *new_order, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + int i, children = gtk_tree_model_iter_n_children (model, iter); + char **new_order_strv, *new_order_s; + char *script; + + new_order_strv = g_new0 (char *, children + 1); + + for (i = 0; i < children; i++) + new_order_strv[i] = g_strdup_printf ("%i", new_order[i]); + + new_order_s = g_strjoinv (",", new_order_strv); + + script = g_strdup_printf ("javascript:reorderRows([%s], [%s]);", + str == NULL ? "" : g_strdelimit (str, ":", ','), + new_order_s); + + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (script); + g_free (new_order_s); + g_strfreev (new_order_strv); +} + static GObject * empathy_log_window_constructor (GType type, guint n_props, @@ -444,7 +543,9 @@ empathy_log_window_init (EmpathyLogWindow *self) EmpathyAccountChooser *account_chooser; GtkBuilder *gui; gchar *filename; + GFile *gfile; GtkWidget *vbox, *accounts, *search, *label, *quit; + GtkWidget *sw; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_LOG_WINDOW, EmpathyLogWindowPriv); @@ -564,6 +665,38 @@ empathy_log_window_init (EmpathyLogWindow *self) log_window_who_populate (self); + /* events */ + sw = gtk_scrolled_window_new (NULL, NULL); + self->priv->webview = webkit_web_view_new (); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), self->priv->webview); + + filename = empathy_file_lookup ("empathy-log-window.html", "data"); + gfile = g_file_new_for_path (filename); + g_free (filename); + + webkit_web_view_load_uri (WEBKIT_WEB_VIEW (self->priv->webview), + g_file_get_uri (gfile)); + g_object_unref (gfile); + + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + sw, gtk_label_new ("webview")); + gtk_widget_show_all (sw); + + /* listen to changes to the treemodel */ + g_signal_connect (self->priv->store_events, "row-inserted", + G_CALLBACK (store_events_row_inserted), self); + g_signal_connect (self->priv->store_events, "row-changed", + G_CALLBACK (store_events_row_changed), self); + g_signal_connect (self->priv->store_events, "row-deleted", + G_CALLBACK (store_events_row_deleted), self); + g_signal_connect (self->priv->store_events, "rows-reordered", + G_CALLBACK (store_events_rows_reordered), self); + + // debug + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); + gtk_widget_show (GTK_WIDGET (self)); } -- cgit v1.2.3