[empathy: 5/7] LogWindow: allow to start actions from an event row
- From: Emilio Pozuelo Monfort <epm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy: 5/7] LogWindow: allow to start actions from an event row
- Date: Tue, 21 Jun 2011 11:55:21 +0000 (UTC)
commit f8ca62c8d1ec38fb1e4e6ad975e1a1d40452d600
Author: Emilio Pozuelo Monfort <emilio pozuelo collabora co uk>
Date: Tue Jun 21 10:47:41 2011 +0100
LogWindow: allow to start actions from an event row
If we don't know the contact by looking at the 'Who' pane (because
e.g. there are many selected or it has 'Anyone'), look at the
selected row (if any) in the events pane to determine the contact.
https://bugzilla.gnome.org/show_bug.cgi?id=652278
libempathy-gtk/empathy-log-window.c | 188 ++++++++++++++---------------------
1 files changed, 76 insertions(+), 112 deletions(-)
---
diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c
index 50c6ab0..178c445 100644
--- a/libempathy-gtk/empathy-log-window.c
+++ b/libempathy-gtk/empathy-log-window.c
@@ -88,6 +88,8 @@ typedef struct
TplActionChain *chain;
TplLogManager *log_manager;
+ EmpathyContact *selected_contact;
+
/* Used to cancel logger calls when no longer needed */
guint count;
@@ -295,132 +297,39 @@ static void
toolbutton_profile_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- TplEntity *target;
- EmpathyContact *contact;
- gint type;
-
g_return_if_fail (window != NULL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_TARGET, &target,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
-
- contact = empathy_contact_from_tpl_contact (account, target);
- empathy_contact_information_dialog_show (contact,
+ empathy_contact_information_dialog_show (window->selected_contact,
GTK_WINDOW (window->window));
- g_object_unref (contact);
-
- g_object_unref (account);
- g_object_unref (target);
}
static void
toolbutton_chat_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- TplEntity *target;
- EmpathyContact *contact;
- gint type;
-
g_return_if_fail (window != NULL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_TARGET, &target,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
-
- contact = empathy_contact_from_tpl_contact (account, target);
- empathy_chat_with_contact (contact,
+ empathy_chat_with_contact (window->selected_contact,
gtk_get_current_event_time ());
-
- g_object_unref (contact);
- g_object_unref (account);
- g_object_unref (target);
}
static void
toolbutton_av_clicked (GtkToolButton *toolbutton,
EmpathyLogWindow *window)
{
- GtkTreeView *view;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *paths;
- TpAccount *account;
- gchar *contact;
- gint type;
gboolean video;
g_return_if_fail (window != NULL);
-
- view = GTK_TREE_VIEW (log_window->treeview_who);
- selection = gtk_tree_view_get_selection (view);
-
- paths = gtk_tree_selection_get_selected_rows (selection, &model);
- g_return_if_fail (paths != NULL);
-
- path = paths->data;
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter,
- COL_WHO_ACCOUNT, &account,
- COL_WHO_NAME, &contact,
- COL_WHO_TYPE, &type,
- -1);
-
- g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
-
- g_return_if_fail (type == COL_TYPE_NORMAL);
+ g_return_if_fail (EMPATHY_IS_CONTACT (window->selected_contact));
video = (GTK_WIDGET (toolbutton) == window->button_video);
- empathy_call_new_with_streams (contact, account,
+ empathy_call_new_with_streams (
+ empathy_contact_get_id (window->selected_contact),
+ empathy_contact_get_account (window->selected_contact),
TRUE, video, gtk_get_current_event_time ());
-
- g_free (contact);
- g_object_unref (account);
}
GtkWidget *
@@ -580,6 +489,7 @@ log_window_destroy_cb (GtkWidget *widget,
_tpl_action_chain_free (window->chain);
g_object_unref (window->log_manager);
tp_clear_object (&window->selected_account);
+ tp_clear_object (&window->selected_contact);
g_free (window->selected_chat_id);
g_free (window);
@@ -1563,11 +1473,11 @@ log_window_search_entry_icon_pressed_cb (GtkEntry *entry,
}
static void
-log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
- GtkTreeModel *model,
- GtkTreeSelection *selection)
+log_window_update_buttons_sensitivity (EmpathyLogWindow *window)
{
- EmpathyContact *contact;
+ GtkTreeView *view;
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
EmpathyCapabilities capabilities;
TpAccount *account;
TplEntity *target;
@@ -1576,16 +1486,22 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
GtkTreePath *path;
gboolean profile, chat, call, video;
+ tp_clear_object (&window->selected_contact);
+
+ view = GTK_TREE_VIEW (log_window->treeview_who);
+ model = gtk_tree_view_get_model (view);
+ selection = gtk_tree_view_get_selection (view);
+
profile = chat = call = video = FALSE;
if (!gtk_tree_model_get_iter_first (model, &iter))
- goto out;
+ goto events;
if (gtk_tree_selection_count_selected_rows (selection) != 1)
- goto out;
+ goto events;
if (gtk_tree_selection_iter_is_selected (selection, &iter))
- goto out;
+ goto events;
paths = gtk_tree_selection_get_selected_rows (selection, &model);
g_return_if_fail (paths != NULL);
@@ -1599,12 +1515,46 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *window,
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
- contact = empathy_contact_from_tpl_contact (account, target);
+ window->selected_contact = empathy_contact_from_tpl_contact (account,
+ target);
+
+ g_object_unref (account);
+ g_object_unref (target);
+
+ capabilities = empathy_contact_get_capabilities (window->selected_contact);
+
+ profile = chat = TRUE;
+ call = capabilities & EMPATHY_CAPABILITIES_AUDIO;
+ video = capabilities & EMPATHY_CAPABILITIES_VIDEO;
+
+ goto out;
+
+ events:
+ /* 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 (log_window->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_get_selected (selection, NULL, &iter))
+ goto out;
+
+ gtk_tree_model_get (model, &iter,
+ COL_EVENTS_ACCOUNT, &account,
+ COL_EVENTS_TARGET, &target,
+ -1);
+
+ window->selected_contact = empathy_contact_from_tpl_contact (account,
+ target);
g_object_unref (account);
g_object_unref (target);
- capabilities = empathy_contact_get_capabilities (contact);
+ capabilities = empathy_contact_get_capabilities (window->selected_contact);
profile = chat = TRUE;
call = capabilities & EMPATHY_CAPABILITIES_AUDIO;
@@ -1648,7 +1598,7 @@ log_window_who_changed_cb (GtkTreeSelection *selection,
}
}
- log_window_update_buttons_sensitivity (window, model, selection);
+ log_window_update_buttons_sensitivity (window);
/* The contact changed, so the dates need to be updated */
log_window_chats_get_messages (window, TRUE);
@@ -1908,6 +1858,15 @@ who_row_is_separator (GtkTreeModel *model,
}
static void
+log_window_events_changed_cb (GtkTreeSelection *selection,
+ EmpathyLogWindow *window)
+{
+ DEBUG ("log_window_events_changed_cb");
+
+ log_window_update_buttons_sensitivity (window);
+}
+
+static void
log_window_events_setup (EmpathyLogWindow *window)
{
GtkTreeView *view;
@@ -1959,7 +1918,7 @@ log_window_events_setup (EmpathyLogWindow *window)
gtk_tree_view_append_column (view, column);
/* set up treeview properties */
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
+ 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,
@@ -1968,6 +1927,11 @@ log_window_events_setup (EmpathyLogWindow *window)
gtk_tree_view_set_enable_search (view, FALSE);
+ /* set up signals */
+ g_signal_connect (selection, "changed",
+ G_CALLBACK (log_window_events_changed_cb),
+ window);
+
g_object_unref (store);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]