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 --- data/Makefile.am | 5 +- data/empathy-log-window.html | 126 ++++++++++++++++++++++++++++++++++ libempathy-gtk/empathy-log-window.c | 133 ++++++++++++++++++++++++++++++++++++ 3 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 data/empathy-log-window.html diff --git a/data/Makefile.am b/data/Makefile.am index 88de4f09b..d652ca9e5 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -58,7 +58,10 @@ clientfile_DATA = \ Empathy.FileTransfer.client htmldir = $(datadir)/empathy -html_DATA = Template.html +html_DATA = \ + Template.html \ + empathy-log-window.html \ + $(NULL) EXTRA_DIST = \ $(convert_DATA) \ diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html new file mode 100644 index 000000000..ef01df34b --- /dev/null +++ b/data/empathy-log-window.html @@ -0,0 +1,126 @@ + + + + + + + +
+
+ + 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 From d890a28335477c0e18cd68264467e7be45496388 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 1 Aug 2011 12:14:50 +1000 Subject: Copy fix for bug #625745 from empathy-theme-adium --- data/empathy-log-window.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html index ef01df34b..2b87647fc 100644 --- a/data/empathy-log-window.html +++ b/data/empathy-log-window.html @@ -10,6 +10,11 @@ html, body, div, p { div.row { margin-left: 1em; } + +div.row p { + display: inline; + white-space: pre-wrap; +} diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index 9459ce26b..ef6450f36 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -429,6 +429,27 @@ store_events_row_deleted (GtkTreeModel *model, g_free (script); } +static void +store_events_has_child_rows (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + char *script; + + script = g_strdup_printf ("javascript:hasChildRows([%s], %u);", + g_strdelimit (str, ":", ','), + gtk_tree_model_iter_has_child (model, iter)); + + // 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, @@ -695,6 +716,8 @@ empathy_log_window_init (EmpathyLogWindow *self) G_CALLBACK (store_events_row_deleted), self); g_signal_connect (self->priv->store_events, "rows-reordered", G_CALLBACK (store_events_rows_reordered), self); + g_signal_connect (self->priv->store_events, "row-has-child-toggled", + G_CALLBACK (store_events_has_child_rows), self); // debug gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); -- cgit v1.2.3 From 0f84b8fa5a7f061cb5f82ed489e22f15ae2bc7cc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 1 Aug 2011 15:51:23 +1000 Subject: Handle links via external browser --- libempathy-gtk/empathy-log-window.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index ef6450f36..f81ea4cfe 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -482,6 +482,21 @@ store_events_rows_reordered (GtkTreeModel *model, g_strfreev (new_order_strv); } +static gboolean +events_webview_handle_navigation (WebKitWebView *webview, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + EmpathyLogWindow *window) +{ + empathy_url_show (GTK_WIDGET (webview), + webkit_network_request_get_uri (request)); + + webkit_web_policy_decision_ignore (policy_decision); + return TRUE; +} + static GObject * empathy_log_window_constructor (GType type, guint n_props, @@ -703,6 +718,10 @@ empathy_log_window_init (EmpathyLogWindow *self) g_file_get_uri (gfile)); g_object_unref (gfile); + /* handle all navigation externally */ + g_signal_connect (self->priv->webview, "navigation-policy-decision-requested", + G_CALLBACK (events_webview_handle_navigation), self); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), sw, gtk_label_new ("webview")); gtk_widget_show_all (sw); -- cgit v1.2.3 From 79de445e7b21747cbc7893737a5d6756da184274 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Thu, 4 Aug 2011 12:14:11 +1000 Subject: Support smileys in log viewer --- libempathy-gtk/empathy-log-window.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index f81ea4cfe..8869d4acd 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -121,6 +122,8 @@ struct _EmpathyLogWindowPriv TpAccount *selected_account; gchar *selected_chat_id; gboolean selected_is_chatroom; + + GSettings *gsettings_chat; }; static void log_window_search_entry_changed_cb (GtkWidget *entry, @@ -546,6 +549,7 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->selected_account); tp_clear_object (&self->priv->selected_contact); tp_clear_object (&self->priv->camera_monitor); + tp_clear_object (&self->priv->gsettings_chat); G_OBJECT_CLASS (empathy_log_window_parent_class)->dispose (object); } @@ -594,6 +598,8 @@ empathy_log_window_init (EmpathyLogWindow *self) self->priv->log_manager = tpl_log_manager_dup_singleton (); + self->priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); + gtk_window_set_title (GTK_WINDOW (self), _("History")); gtk_widget_set_can_focus (GTK_WIDGET (self), FALSE); gtk_window_set_default_size (GTK_WINDOW (self), 800, 600); @@ -1290,8 +1296,9 @@ log_window_append_chat_message (TplEvent *event, // } /* escape the text */ - // FIXME: handle smileys - parsers = empathy_webkit_get_string_parser (FALSE); + parsers = empathy_webkit_get_string_parser ( + g_settings_get_boolean (log_window->priv->gsettings_chat, + EMPATHY_PREFS_CHAT_SHOW_SMILEYS)); msg = g_string_new (""); empathy_string_parser_substr (empathy_message_get_body (message), -1, -- cgit v1.2.3 From e15b7f70a43898e4978836fdf8efbed0bebeaea4 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 5 Aug 2011 14:43:00 +1000 Subject: Replace highlighting of search strings --- libempathy-gtk/empathy-log-window.c | 47 +++++-------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index 8869d4acd..b5c2e48cf 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -1254,47 +1254,6 @@ log_window_append_chat_message (TplEvent *event, alias = g_markup_escape_text ( tpl_entity_get_alias (tpl_event_get_sender (event)), -1); - // /* If the user is searching, highlight the matched text */ - // if (!EMP_STR_EMPTY (log_window->priv->last_find)) - // { - // gchar *str = g_regex_escape_string (log_window->priv->last_find, -1); - // gchar *replacement = g_markup_printf_escaped ( - // "%s", - // log_window->priv->last_find); - // GError *error = NULL; - // GRegex *regex = g_regex_new (str, 0, 0, &error); - - // if (regex == NULL) - // { - // DEBUG ("Could not create regex: %s", error->message); - // g_error_free (error); - // } - // else - // { - // gchar *new_msg = g_regex_replace_literal (regex, - // empathy_message_get_body (message), -1, 0, replacement, - // 0, &error); - - // if (new_msg != NULL) - // { - // /* We pass ownership of new_msg to msg, which is freed later */ - // g_free (msg); - // msg = new_msg; - // } - // else - // { - // DEBUG ("Error while performing string substitution: %s", - // error->message); - // g_error_free (error); - // } - // } - - // g_free (str); - // g_free (replacement); - - // tp_clear_pointer (®ex, g_regex_unref); - // } - /* escape the text */ parsers = empathy_webkit_get_string_parser ( g_settings_get_boolean (log_window->priv->gsettings_chat, @@ -1977,6 +1936,8 @@ log_window_find_populate (EmpathyLogWindow *self, if (EMP_STR_EMPTY (search_criteria)) { tp_clear_pointer (&self->priv->hits, tpl_log_manager_search_free); + webkit_web_view_set_highlight_text_matches ( + WEBKIT_WEB_VIEW (self->priv->webview), FALSE); log_window_who_populate (self); return; } @@ -1985,6 +1946,10 @@ log_window_find_populate (EmpathyLogWindow *self, log_window_when_changed_cb, self); + /* highlight the search text */ + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (self->priv->webview), + search_criteria, FALSE, 0); + tpl_log_manager_search_async (self->priv->log_manager, search_criteria, TPL_EVENT_MASK_ANY, log_manager_searched_new_cb, NULL); -- cgit v1.2.3 From 7424ac01d5010aaa101c2b5841daf840b4d0e20c Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Sun, 7 Aug 2011 13:17:31 +1000 Subject: Remove treeview_events -- make the webview the only viewing component Still some commented out code to reimplement. --- libempathy-gtk/empathy-log-window.c | 166 ++++++++++++----------------------- libempathy-gtk/empathy-log-window.ui | 9 -- 2 files changed, 58 insertions(+), 117 deletions(-) diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index b5c2e48cf..cd1daac22 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -86,7 +86,6 @@ struct _EmpathyLogWindowPriv GtkWidget *treeview_who; GtkWidget *treeview_what; GtkWidget *treeview_when; - GtkWidget *treeview_events; GtkWidget *webview; GtkTreeStore *store_events; @@ -551,6 +550,8 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->camera_monitor); tp_clear_object (&self->priv->gsettings_chat); + tp_clear_object (&self->priv->store_events); + G_OBJECT_CLASS (empathy_log_window_parent_class)->dispose (object); } @@ -587,7 +588,7 @@ empathy_log_window_init (EmpathyLogWindow *self) gchar *filename; GFile *gfile; GtkWidget *vbox, *accounts, *search, *label, *quit; - GtkWidget *sw; + GtkWidget *scrolledwindow_events; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_LOG_WINDOW, EmpathyLogWindowPriv); @@ -617,7 +618,7 @@ empathy_log_window_init (EmpathyLogWindow *self) "treeview_who", &self->priv->treeview_who, "treeview_what", &self->priv->treeview_what, "treeview_when", &self->priv->treeview_when, - "treeview_events", &self->priv->treeview_events, + "scrolledwindow_events", &scrolledwindow_events, "notebook", &self->priv->notebook, "spinner", &self->priv->spinner, NULL); @@ -710,11 +711,12 @@ 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_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_events), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), self->priv->webview); + gtk_container_add (GTK_CONTAINER (scrolledwindow_events), + self->priv->webview); + gtk_widget_show (self->priv->webview); filename = empathy_file_lookup ("empathy-log-window.html", "data"); gfile = g_file_new_for_path (filename); @@ -728,10 +730,6 @@ empathy_log_window_init (EmpathyLogWindow *self) g_signal_connect (self->priv->webview, "navigation-policy-decision-requested", G_CALLBACK (events_webview_handle_navigation), self); - 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); @@ -744,9 +742,6 @@ empathy_log_window_init (EmpathyLogWindow *self) g_signal_connect (self->priv->store_events, "row-has-child-toggled", G_CALLBACK (store_events_has_child_rows), self); - // debug - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); - gtk_widget_show (GTK_WIDGET (self)); } @@ -2066,15 +2061,16 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *self) /* If the Who pane doesn't contain a contact (e.g. it has many * selected, or has 'Anyone', let's try to get the contact from * the selected event. */ - view = GTK_TREE_VIEW (self->priv->treeview_events); - model = gtk_tree_view_get_model (view); - selection = gtk_tree_view_get_selection (view); + goto out; // FIXME: reimplement + // view = GTK_TREE_VIEW (self->priv->treeview_events); + // model = gtk_tree_view_get_model (view); + // selection = gtk_tree_view_get_selection (view); - if (gtk_tree_selection_count_selected_rows (selection) != 1) - goto out; + // if (gtk_tree_selection_count_selected_rows (selection) != 1) + // goto out; - if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) - goto out; + // if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) + // goto out; gtk_tree_model_get (model, &iter, COL_EVENTS_ACCOUNT, &account, @@ -2482,40 +2478,33 @@ who_row_is_separator (GtkTreeModel *model, return (type == COL_TYPE_SEPARATOR); } -static void -log_window_events_changed_cb (GtkTreeSelection *selection, - EmpathyLogWindow *self) -{ - DEBUG ("log_window_events_changed_cb"); - - log_window_update_buttons_sensitivity (self); -} - -static void -log_window_events_row_activated_cb (GtkTreeView *view, - GtkTreePath *path, - GtkTreeViewColumn *column, - EmpathyLogWindow *self) -{ - if (gtk_tree_view_row_expanded (view, path)) - gtk_tree_view_collapse_row (view, path); - else - gtk_tree_view_expand_row (view, path, FALSE); -} +// static void +// log_window_events_changed_cb (GtkTreeSelection *selection, +// EmpathyLogWindow *self) +// { +// DEBUG ("log_window_events_changed_cb"); +// +// log_window_update_buttons_sensitivity (self); +// } + +// static void +// log_window_events_row_activated_cb (GtkTreeView *view, +// GtkTreePath *path, +// GtkTreeViewColumn *column, +// EmpathyLogWindow *self) +// { +// if (gtk_tree_view_row_expanded (view, path)) +// gtk_tree_view_collapse_row (view, path); +// else +// gtk_tree_view_expand_row (view, path, FALSE); +// } static void log_window_events_setup (EmpathyLogWindow *self) { - GtkTreeView *view; GtkTreeModel *model; - GtkTreeSelection *selection; GtkTreeSortable *sortable; - GtkTreeViewColumn *column; GtkTreeStore *store; - GtkCellRenderer *cell; - - view = GTK_TREE_VIEW (self->priv->treeview_events); - selection = gtk_tree_view_get_selection (view); /* new store */ self->priv->store_events = store = gtk_tree_store_new (COL_EVENTS_COUNT, @@ -2531,49 +2520,9 @@ log_window_events_setup (EmpathyLogWindow *self) model = GTK_TREE_MODEL (store); sortable = GTK_TREE_SORTABLE (store); - gtk_tree_view_set_model (view, model); - - /* new column */ - column = gtk_tree_view_column_new (); - - cell = gtk_cell_renderer_pixbuf_new (); - gtk_tree_view_column_pack_start (column, cell, FALSE); - gtk_tree_view_column_add_attribute (column, cell, - "icon-name", COL_EVENTS_ICON); - - cell = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (column, cell, TRUE); - gtk_tree_view_column_add_attribute (column, cell, - "markup", COL_EVENTS_TEXT); - - cell = gtk_cell_renderer_text_new (); - g_object_set (cell, "xalign", 1.0, NULL); - gtk_tree_view_column_pack_end (column, cell, FALSE); - gtk_tree_view_column_add_attribute (column, cell, - "text", COL_EVENTS_PRETTY_DATE); - - gtk_tree_view_append_column (view, column); - - /* set up treeview properties */ - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - gtk_tree_view_set_headers_visible (view, FALSE); - gtk_tree_sortable_set_sort_column_id (sortable, COL_EVENTS_TS, GTK_SORT_ASCENDING); - - gtk_tree_view_set_enable_search (view, FALSE); - - /* set up signals */ - g_signal_connect (selection, "changed", - G_CALLBACK (log_window_events_changed_cb), - self); - - g_signal_connect (view, "row-activated", - G_CALLBACK (log_window_events_row_activated_cb), - self); - - g_object_unref (store); } static void @@ -3033,15 +2982,16 @@ log_window_what_setup (EmpathyLogWindow *self) static void log_window_maybe_expand_events (void) { - GtkTreeView *view; - GtkTreeModel *model; + // GtkTreeView *view; + // GtkTreeModel *model; - view = GTK_TREE_VIEW (log_window->priv->treeview_events); - model = gtk_tree_view_get_model (view); + // FIXME: reimplement + // view = GTK_TREE_VIEW (log_window->priv->treeview_events); + // model = gtk_tree_view_get_model (view); - /* If there's only one result, expand it */ - if (gtk_tree_model_iter_n_children (model, NULL) == 1) - gtk_tree_view_expand_all (view); + // /* If there's only one result, expand it */ + // if (gtk_tree_model_iter_n_children (model, NULL) == 1) + // gtk_tree_view_expand_all (view); } static gboolean @@ -3090,13 +3040,13 @@ log_window_got_messages_for_date_cb (GObject *manager, gpointer user_data) { Ctx *ctx = user_data; - GtkTreeView *view; - GtkTreeModel *model; - GtkTreeIter iter; + // GtkTreeView *view; + // GtkTreeModel *model; + // GtkTreeIter iter; GList *events; GList *l; GError *error = NULL; - gint n; + // gint n; if (log_window == NULL) { @@ -3170,18 +3120,18 @@ log_window_got_messages_for_date_cb (GObject *manager, } g_list_free (events); - view = GTK_TREE_VIEW (log_window->priv->treeview_events); - model = gtk_tree_view_get_model (view); - n = gtk_tree_model_iter_n_children (model, NULL) - 1; + // view = GTK_TREE_VIEW (log_window->priv->treeview_events); + // model = gtk_tree_view_get_model (view); + // n = gtk_tree_model_iter_n_children (model, NULL) - 1; - if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) - { - GtkTreePath *path; + // if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) + // { + // GtkTreePath *path; - path = gtk_tree_model_get_path (model, &iter); - gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); - gtk_tree_path_free (path); - } + // path = gtk_tree_model_get_path (model, &iter); + // gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); + // gtk_tree_path_free (path); + // } out: ctx_free (ctx); diff --git a/libempathy-gtk/empathy-log-window.ui b/libempathy-gtk/empathy-log-window.ui index b07e42da5..4a3bc60ae 100644 --- a/libempathy-gtk/empathy-log-window.ui +++ b/libempathy-gtk/empathy-log-window.ui @@ -270,15 +270,6 @@ True True - - - True - True - - - - - -- cgit v1.2.3 From c6837f3edb97b06d1aff8e4300d58653b9484713 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 8 Aug 2011 11:14:49 +1000 Subject: Factor out toggleExpander() --- data/empathy-log-window.html | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html index f2e0cdfe1..839ddee53 100644 --- a/data/empathy-log-window.html +++ b/data/empathy-log-window.html @@ -57,6 +57,29 @@ function getToggle(node) return filterNodes(node, 'SPAN')[0]; } +function toggleExpander(node, open) +{ + var toggle = getToggle(node); + var display; + var nodes; + + if (open) + { + toggle.setAttribute('class', 'open'); + display = 'block'; + } + else + { + toggle.setAttribute('class', 'closed'); + display = 'none'; + } + + nodes = getNodes(node); + + for (var i = 0; i < nodes.length; i++) + nodes[i].style.display = display; +} + function insertRow (path, text) { var treeview = document.getElementById('treeview'); @@ -91,26 +114,10 @@ function insertRow (path, text) toggle.onclick = function (e) { - var display; - var nodes; - if (toggle.getAttribute('class') == 'closed') - { - toggle.setAttribute('class', 'open'); - display = 'block'; - } + toggleExpander(newnode, true); else - { - toggle.setAttribute('class', 'closed'); - display = 'none'; - } - - // console.log("clicked: " + display); - - nodes = getNodes(newnode); - - for (var i = 0; i < nodes.length; i++) - nodes[i].style.display = display; + toggleExpander(newnode, false); }; var contents = document.createElement('p'); -- cgit v1.2.3 From daae637bdf6ea311c306eefe298e5760e2af22dc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 8 Aug 2011 11:15:06 +1000 Subject: Reimplement log_window_maybe_expand_events() --- data/empathy-log-window.html | 19 +++++++++++++++++++ libempathy-gtk/empathy-log-window.c | 15 ++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html index 839ddee53..794717704 100644 --- a/data/empathy-log-window.html +++ b/data/empathy-log-window.html @@ -80,6 +80,25 @@ function toggleExpander(node, open) nodes[i].style.display = display; } +function expandAll() +{ + function expandAllRecurse(node) + { + var nodes = getNodes(node); + + for (var i = 0; i < nodes.length; i++) + { + toggleExpander(nodes[i], true); + + expandAllRecurse(nodes[i]); + } + } + + var treeview = document.getElementById('treeview'); + + expandAllRecurse(treeview); +} + function insertRow (path, text) { var treeview = document.getElementById('treeview'); diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index cd1daac22..bb8b1ce42 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -2982,16 +2982,13 @@ log_window_what_setup (EmpathyLogWindow *self) static void log_window_maybe_expand_events (void) { - // GtkTreeView *view; - // GtkTreeModel *model; + GtkTreeModel *model = GTK_TREE_MODEL (log_window->priv->store_events); - // FIXME: reimplement - // view = GTK_TREE_VIEW (log_window->priv->treeview_events); - // model = gtk_tree_view_get_model (view); - - // /* If there's only one result, expand it */ - // if (gtk_tree_model_iter_n_children (model, NULL) == 1) - // gtk_tree_view_expand_all (view); + /* If there's only one result, expand it */ + if (gtk_tree_model_iter_n_children (model, NULL) == 1) + webkit_web_view_execute_script ( + WEBKIT_WEB_VIEW (log_window->priv->webview), + "javascript:expandAll()"); } static gboolean -- cgit v1.2.3 From 3b97f8064e775fd770188b4f186da95706e205f8 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 11:40:53 +1000 Subject: Utility to set the webkit default font/size from GSettings --- libempathy-gtk/empathy-webkit-utils.c | 73 +++++++++++++++++++++++++++++++++++ libempathy-gtk/empathy-webkit-utils.h | 4 ++ 2 files changed, 77 insertions(+) diff --git a/libempathy-gtk/empathy-webkit-utils.c b/libempathy-gtk/empathy-webkit-utils.c index e5d163ae2..827d57e6b 100644 --- a/libempathy-gtk/empathy-webkit-utils.c +++ b/libempathy-gtk/empathy-webkit-utils.c @@ -21,6 +21,8 @@ #include "empathy-webkit-utils.h" #include "empathy-smiley-manager.h" +#define BORING_DPI_DEFAULT 96 + static void empathy_webkit_match_newline (const gchar *text, gssize len, @@ -89,3 +91,74 @@ empathy_webkit_get_string_parser (gboolean smileys) else return string_parsers; } + +static gboolean +webkit_get_font_family (GValue *value, + GVariant *variant, + gpointer user_data) +{ + PangoFontDescription *font = pango_font_description_from_string ( + g_variant_get_string (variant, NULL)); + + if (font == NULL) + return FALSE; + + g_value_set_string (value, pango_font_description_get_family (font)); + pango_font_description_free (font); + + return TRUE; +} + +static gboolean +webkit_get_font_size (GValue *value, + GVariant *variant, + gpointer user_data) +{ + PangoFontDescription *font = pango_font_description_from_string ( + g_variant_get_string (variant, NULL)); + int size; + + if (font == NULL) + return FALSE; + + size = pango_font_description_get_size (font) / PANGO_SCALE; + + if (pango_font_description_get_size_is_absolute (font)) + { + GdkScreen *screen = gdk_screen_get_default (); + double dpi; + + if (screen != NULL) + dpi = gdk_screen_get_resolution (screen); + else + dpi = BORING_DPI_DEFAULT; + + size = (gint) (size / (dpi / 72)); + } + + g_value_set_int (value, size); + pango_font_description_free (font); + + return TRUE; +} + +void +empathy_webkit_bind_font_setting (WebKitWebView *webview, + GSettings *gsettings, + const char *key) +{ + WebKitWebSettings *settings = webkit_web_view_get_settings (webview); + + g_settings_bind_with_mapping (gsettings, key, + settings, "default-font-family", + G_SETTINGS_BIND_GET, + webkit_get_font_family, + NULL, + NULL, NULL); + g_settings_bind_with_mapping (gsettings, key, + settings, "default-font-size", + G_SETTINGS_BIND_GET, + webkit_get_font_size, + NULL, + NULL, NULL); +} diff --git a/libempathy-gtk/empathy-webkit-utils.h b/libempathy-gtk/empathy-webkit-utils.h index 38cbfedcb..5ba0a840a 100644 --- a/libempathy-gtk/empathy-webkit-utils.h +++ b/libempathy-gtk/empathy-webkit-utils.h @@ -21,11 +21,15 @@ #ifndef _EMPATHY_WEBKIT_UTILS__H_ #define _EMPATHY_WEBKIT_UTILS__H_ +#include + #include "empathy-string-parser.h" G_BEGIN_DECLS EmpathyStringParser *empathy_webkit_get_string_parser (gboolean smileys); +void empathy_webkit_bind_font_setting (WebKitWebView *webview, + GSettings *gsettings, const char *key); G_END_DECLS -- cgit v1.2.3 From a23b86b6a47b06cc9b37cafd892b73229c2d97d3 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 11:41:11 +1000 Subject: Use this utility in the log viewer It should also be used for the Adium theme, but this also supports fonts specified in the Adium theme, which we need to support. --- data/empathy-log-window.html | 7 +++++-- libempathy-gtk/empathy-log-window.c | 9 +++++++++ libempathy/empathy-gsettings.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html index 794717704..db93240b5 100644 --- a/data/empathy-log-window.html +++ b/data/empathy-log-window.html @@ -2,9 +2,12 @@ diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index ac05740cf..b4501af57 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -3049,13 +3049,12 @@ log_window_got_messages_for_date_cb (GObject *manager, gpointer user_data) { Ctx *ctx = user_data; - // GtkTreeView *view; - // GtkTreeModel *model; - // GtkTreeIter iter; + GtkTreeModel *model; + GtkTreeIter iter; GList *events; GList *l; GError *error = NULL; - // gint n; + gint n; if (log_window == NULL) { @@ -3129,18 +3128,28 @@ log_window_got_messages_for_date_cb (GObject *manager, } g_list_free (events); - // view = GTK_TREE_VIEW (log_window->priv->treeview_events); - // model = gtk_tree_view_get_model (view); - // n = gtk_tree_model_iter_n_children (model, NULL) - 1; + model = GTK_TREE_MODEL (log_window->priv->store_events); + n = gtk_tree_model_iter_n_children (model, NULL) - 1; + + if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) + { + GtkTreePath *path; + char *str, *script; + + path = gtk_tree_model_get_path (model, &iter); + str = gtk_tree_path_to_string (path); - // if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) - // { - // GtkTreePath *path; + script = g_strdup_printf ("javascript:scrollToRow([%s]);", + g_strdelimit (str, ":", ',')); - // path = gtk_tree_model_get_path (model, &iter); - // gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); - // gtk_tree_path_free (path); - // } + webkit_web_view_execute_script ( + WEBKIT_WEB_VIEW (log_window->priv->webview), + script); + + gtk_tree_path_free (path); + g_free (str); + g_free (script); + } out: ctx_free (ctx); -- cgit v1.2.3 From ede83c3b09c25b9e08c0aa54d842d844b582e0d8 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 16 Aug 2011 16:15:38 +1000 Subject: Allow clicking on a row to select the contact Does not currently highlight the row. --- data/empathy-log-window.html | 26 ++++++++- libempathy-gtk/empathy-log-window.c | 112 ++++++++++++++++++++++++++---------- 2 files changed, 108 insertions(+), 30 deletions(-) diff --git a/data/empathy-log-window.html b/data/empathy-log-window.html index 5a94b7e09..6962528a4 100644 --- a/data/empathy-log-window.html +++ b/data/empathy-log-window.html @@ -1,4 +1,7 @@ - + +