aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2011-04-25 20:23:09 +0800
committerEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2011-04-25 20:23:09 +0800
commit002999484aa4ffb681ec31a5dec5ceb456551c51 (patch)
tree43ba498867566a55f92f154220503e977d9e2f51
parentd0b3485a2c13036b0b7eb8a1700e477358f0a9f3 (diff)
downloadgsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar.gz
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar.bz2
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar.lz
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar.xz
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.tar.zst
gsoc2013-empathy-002999484aa4ffb681ec31a5dec5ceb456551c51.zip
LogWindow: Add multiselection to the 'When' pane
-rw-r--r--libempathy-gtk/empathy-log-window.c143
1 files changed, 93 insertions, 50 deletions
diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c
index ede4edf16..149c87976 100644
--- a/libempathy-gtk/empathy-log-window.c
+++ b/libempathy-gtk/empathy-log-window.c
@@ -840,7 +840,7 @@ static gboolean
log_window_get_selected (EmpathyLogWindow *window,
GList **accounts,
GList **entities,
- GDate **date,
+ GList **dates,
TplEventTypeMask *event_mask,
EventSubtype *subtype)
{
@@ -850,7 +850,6 @@ log_window_get_selected (EmpathyLogWindow *window,
GtkTreeIter iter;
TplEventTypeMask ev = 0;
EventSubtype st = 0;
- GDate *d = NULL;
GList *paths, *l;
gint type;
@@ -924,15 +923,24 @@ log_window_get_selected (EmpathyLogWindow *window,
model = gtk_tree_view_get_model (view);
selection = gtk_tree_view_get_selection (view);
- if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+ if (dates != NULL)
{
- gtk_tree_model_get (model, &iter,
- COL_WHEN_DATE, &d,
- -1);
- }
+ *dates = NULL;
- if (date != NULL)
- *date = d;
+ paths = gtk_tree_selection_get_selected_rows (selection, NULL);
+ for (l = paths; l != NULL; l = l->next)
+ {
+ GtkTreePath *path = l->data;
+ GDate *date;
+
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter,
+ COL_WHEN_DATE, &date,
+ -1);
+
+ *dates = g_list_append (*dates, date);
+ }
+ }
if (event_mask != NULL)
*event_mask = ev;
@@ -996,18 +1004,21 @@ get_events_for_date (TplActionChain *chain, gpointer user_data);
static void
populate_events_from_search_hits (GList *accounts,
GList *targets,
- GDate *date)
+ GList *dates)
{
TplEventTypeMask event_mask;
EventSubtype subtype;
GDate *anytime;
GList *l;
+ gboolean is_anytime = FALSE;
if (!log_window_get_selected (log_window,
NULL, NULL, NULL, &event_mask, &subtype))
return;
anytime = g_date_new_dmy (2, 1, -1);
+ if (g_list_find_custom (dates, anytime, (GCompareFunc) g_date_compare))
+ is_anytime = TRUE;
for (l = log_window->hits; l != NULL; l = l->next)
{
@@ -1034,8 +1045,9 @@ populate_events_from_search_hits (GList *accounts,
if (!found)
continue;
- if (g_date_compare (date, anytime) == 0 ||
- g_date_compare (date, hit->date) == 0)
+ if (is_anytime ||
+ g_list_find_custom (dates, hit->date, (GCompareFunc) g_date_compare)
+ != NULL)
{
Ctx *ctx;
@@ -1869,7 +1881,33 @@ static void
log_window_when_changed_cb (GtkTreeSelection *selection,
EmpathyLogWindow *window)
{
+ GtkTreeView *view;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
g_print ("log_window_when_changed_cb\n");
+
+ view = gtk_tree_selection_get_tree_view (selection);
+ model = gtk_tree_view_get_model (view);
+
+ /* If 'Anytime' is selected, everything else should be deselected */
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ {
+ if (gtk_tree_selection_iter_is_selected (selection, &iter))
+ {
+ g_signal_handlers_block_by_func (selection,
+ log_window_when_changed_cb,
+ window);
+
+ gtk_tree_selection_unselect_all (selection);
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ g_signal_handlers_unblock_by_func (selection,
+ log_window_when_changed_cb,
+ window);
+ }
+ }
+
log_window_chats_get_messages (window, FALSE);
}
@@ -1917,7 +1955,7 @@ log_window_when_setup (EmpathyLogWindow *window)
gtk_tree_view_append_column (view, column);
/* set up treeview properties */
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
gtk_tree_view_set_row_separator_func (view, when_row_is_separator,
NULL, NULL);
gtk_tree_sortable_set_sort_column_id (sortable,
@@ -2202,13 +2240,13 @@ g_print ("get_events_for_date\n");
}
static void
-log_window_get_messages_for_date (EmpathyLogWindow *window,
- GDate *date)
+log_window_get_messages_for_dates (EmpathyLogWindow *window,
+ GList *dates)
{
- GList *accounts, *targets, *acc, *targ;
+ GList *accounts, *targets, *acc, *targ, *l;
TplEventTypeMask event_mask;
EventSubtype subtype;
- GDate *anytime, *separator;
+ GDate *date, *anytime, *separator;
if (!log_window_get_selected (window,
&accounts, &targets, NULL, &event_mask, &subtype))
@@ -2227,39 +2265,44 @@ log_window_get_messages_for_date (EmpathyLogWindow *window,
TpAccount *account = acc->data;
TplEntity *target = targ->data;
- /* Get events */
- if (g_date_compare (date, anytime) != 0)
+ for (l = dates; l != NULL; l = l->next)
{
- Ctx *ctx;
+ date = l->data;
- ctx = ctx_new (window, account, target, date, event_mask, subtype,
- window->count);
- _tpl_action_chain_append (window->chain, get_events_for_date, ctx);
- }
- else
- {
- GtkTreeView *view = GTK_TREE_VIEW (window->treeview_when);
- GtkTreeModel *model = gtk_tree_view_get_model (view);
- GtkTreeIter iter;
- gboolean next;
- GDate *d;
-
- for (next = gtk_tree_model_get_iter_first (model, &iter);
- next;
- next = gtk_tree_model_iter_next (model, &iter))
+ /* Get events */
+ if (g_date_compare (date, anytime) != 0)
{
Ctx *ctx;
- gtk_tree_model_get (model, &iter,
- COL_WHEN_DATE, &d,
- -1);
-
- if (g_date_compare (d, anytime) != 0 &&
- g_date_compare (d, separator) != 0)
+ ctx = ctx_new (window, account, target, date, event_mask, subtype,
+ window->count);
+ _tpl_action_chain_append (window->chain, get_events_for_date, ctx);
+ }
+ else
+ {
+ GtkTreeView *view = GTK_TREE_VIEW (window->treeview_when);
+ GtkTreeModel *model = gtk_tree_view_get_model (view);
+ GtkTreeIter iter;
+ gboolean next;
+ GDate *d;
+
+ for (next = gtk_tree_model_get_iter_first (model, &iter);
+ next;
+ next = gtk_tree_model_iter_next (model, &iter))
{
- ctx = ctx_new (window, account, target, d,
- event_mask, subtype, window->count);
- _tpl_action_chain_append (window->chain, get_events_for_date, ctx);
+ Ctx *ctx;
+
+ gtk_tree_model_get (model, &iter,
+ COL_WHEN_DATE, &d,
+ -1);
+
+ if (g_date_compare (d, anytime) != 0 &&
+ g_date_compare (d, separator) != 0)
+ {
+ ctx = ctx_new (window, account, target, d,
+ event_mask, subtype, window->count);
+ _tpl_action_chain_append (window->chain, get_events_for_date, ctx);
+ }
}
}
}
@@ -2397,16 +2440,15 @@ static void
log_window_chats_get_messages (EmpathyLogWindow *window,
gboolean force_get_dates)
{
- GList *accounts, *targets;
+ GList *accounts, *targets, *dates;
TplEventTypeMask event_mask;
GtkTreeView *view;
GtkTreeModel *model;
GtkListStore *store;
GtkTreeSelection *selection;
- GDate *date;
if (!log_window_get_selected (window, &accounts, &targets,
- &date, &event_mask, NULL))
+ &dates, &event_mask, NULL))
return;
view = GTK_TREE_VIEW (window->treeview_when);
@@ -2429,10 +2471,10 @@ log_window_chats_get_messages (EmpathyLogWindow *window,
populate_dates_from_search_hits (accounts, targets);
}
else
- populate_events_from_search_hits (accounts, targets, date);
+ populate_events_from_search_hits (accounts, targets, dates);
}
/* Either use the supplied date or get the last */
- else if (force_get_dates || date == NULL)
+ else if (force_get_dates || dates == NULL)
{
GList *acc, *targ;
@@ -2464,11 +2506,12 @@ log_window_chats_get_messages (EmpathyLogWindow *window,
else
{
/* Show messages of the selected date */
- log_window_get_messages_for_date (window, date);
+ log_window_get_messages_for_dates (window, dates);
}
g_list_free_full (accounts, g_object_unref);
g_list_free_full (targets, g_object_unref);
+ g_list_free_full (dates, (GFreeFunc) g_date_free);
}
typedef struct {