/soc/2015/igor.gajowiak/chatlog: ebba8c7398f0: Hooked showing a ...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: ebba8c7398f040868f485d4908bc5332ba611e4a Author: Igor Gajowiak <[email protected]> Date: 2015-08-16 14:41 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/ebba8c7398f0 Description: Hooked showing a generic log in proper places. Added automatic showing the last day's messages. diffstat: pidgin/gtkblist.c | 3 + pidgin/gtkconv.c | 4 ++ pidgin/gtkdialogs.c | 4 ++ pidgin/gtkgenericlog.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ pidgin/gtkgenericlog.h | 8 ++++ pidgin/gtklog.c | 3 - 6 files changed, 117 insertions(+), 3 deletions(-) diffs (243 lines): diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c --- a/pidgin/gtkblist.c +++ b/pidgin/gtkblist.c @@ -45,6 +45,7 @@ #include "gtkdebug.h" #include "gtkdialogs.h" #include "gtkxfer.h" +#include "gtkgenericlog.h" #include "gtklog.h" #include "gtkmenutray.h" #include "gtkpounce.h" @@ -732,6 +733,8 @@ static void gtk_blist_menu_bp_cb(GtkWidg static void gtk_blist_menu_showlog_cb(GtkWidget *w, PurpleBlistNode *node) { + pidgin_genericlog_show_contact_log(node); + PurpleLogType type; PurpleAccount *account; char *name = NULL; diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c --- a/pidgin/gtkconv.c +++ b/pidgin/gtkconv.c @@ -56,6 +56,7 @@ #include "gtkconv-theme.h" #include "gtkconv-theme-loader.h" #include "gtkdialogs.h" +#include "gtkgenericlog.h" #include "gtklog.h" #include "gtkmenutray.h" #include "gtkpounce.h" @@ -1212,6 +1213,8 @@ menu_view_log_cb(GtkAction *action, gpoi for (cur = buddies; cur != NULL; cur = cur->next) { PurpleBlistNode *node = cur->data; + pidgin_genericlog_show_contact_log(node); + if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) { pidgin_log_show_contact((PurpleContact *)node->parent); @@ -1224,6 +1227,7 @@ menu_view_log_cb(GtkAction *action, gpoi g_slist_free(buddies); pidgin_log_show(type, name, account); + pidgin_genericlog_show(); pidgin_clear_cursor(gtkblist->window); pidgin_clear_cursor(win->window); diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c +++ b/pidgin/gtkdialogs.c @@ -34,6 +34,7 @@ #include "gtkblist.h" #include "gtkdialogs.h" +#include "gtkgenericlog.h" #include "gtklog.h" #include "gtkutils.h" #include "gtkwebview.h" @@ -1162,6 +1163,8 @@ pidgin_dialogs_log_cb(gpointer data, Pur for (cur = buddies; cur != NULL; cur = cur->next) { PurpleBlistNode *node = cur->data; + pidgin_genericlog_show_contact_log(node); + if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) { pidgin_log_show_contact((PurpleContact *)node->parent); @@ -1174,6 +1177,7 @@ pidgin_dialogs_log_cb(gpointer data, Pur g_slist_free(buddies); pidgin_log_show(PURPLE_LOG_IM, username, account); + pidgin_genericlog_show(); pidgin_clear_cursor(gtkblist->window); } diff --git a/pidgin/gtkgenericlog.c b/pidgin/gtkgenericlog.c --- a/pidgin/gtkgenericlog.c +++ b/pidgin/gtkgenericlog.c @@ -645,6 +645,9 @@ static void populate_calendar_store(PurpleBlistNode *contact, GtkTreeStore *store); static void +select_calendar_last_day(PidginGenericLogViewer *viewer); + +static void on_buddylist_row_changed(GtkTreeSelection *sel, gpointer data) { g_assert(data); @@ -677,6 +680,8 @@ on_buddylist_row_changed(GtkTreeSelectio gtk_tree_view_set_model(GTK_TREE_VIEW(viewer->calendar_tree_view), GTK_TREE_MODEL(viewer->calendar_tree_store)); + + select_calendar_last_day(viewer); } static void @@ -777,6 +782,55 @@ populate_buddylist_store(GtkTreeStore *s g_hash_table_destroy(branches); } +typedef struct ContactSelectionData +{ + PidginGenericLogViewer *viewer; + PurpleBlistNode *contact; +} ContactSelectionData; + +static gboolean +select_contact_row_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + gpointer user_data) +{ + ContactSelectionData *data = (ContactSelectionData*) user_data; + PurpleBlistNode *contact; + + gtk_tree_model_get(model, iter, BLIST_TREE_STORE_COL_CONTACT, &contact, -1); + g_object_unref(G_OBJECT(contact)); + + if (contact == data->contact) { + /* Make sure the path to the element is expanded */ + GtkTreePath *path = gtk_tree_model_get_path(model, iter); + gtk_tree_view_expand_to_path( + GTK_TREE_VIEW(data->viewer->blist_tree_view), path); + gtk_tree_path_free(path); + + GtkTreeSelection *selection = gtk_tree_view_get_selection( + GTK_TREE_VIEW(data->viewer->blist_tree_view)); + + gtk_tree_selection_select_iter(selection, iter); + + return TRUE; + } + + return FALSE; +} + +static void +select_blist_contact_row(PidginGenericLogViewer *viewer, + PurpleBlistNode *contact) +{ + g_assert(viewer); + g_assert(contact); + + ContactSelectionData data; + data.viewer = viewer; + data.contact = contact; + + gtk_tree_model_foreach(GTK_TREE_MODEL(viewer->blist_tree_store), + select_contact_row_cb, &data); +} + static GtkWidget * create_buddylist_view(GtkTreeStore *store, PidginGenericLogViewer *viewer) { @@ -1015,6 +1069,39 @@ on_calendar_row_changed(GtkTreeSelection g_list_free_full(messages, g_object_unref); } +static void +select_calendar_last_day(PidginGenericLogViewer *viewer) +{ + g_assert(viewer); + + GtkTreeModel *model = GTK_TREE_MODEL(viewer->calendar_tree_store); + + gint years_count = gtk_tree_model_iter_n_children(model, NULL); + if (years_count == 0) + return; + + GtkTreeIter year_iter; + gtk_tree_model_iter_nth_child(model, &year_iter, NULL, years_count - 1); + + gint days_count = gtk_tree_model_iter_n_children(model, &year_iter); + if (days_count == 0) + return; + + GtkTreeIter day_iter; + gtk_tree_model_iter_nth_child(model, &day_iter, &year_iter, days_count - 1); + + /* Make sure the path to the element is expanded */ + GtkTreePath *path = gtk_tree_model_get_path(model, &day_iter); + gtk_tree_view_expand_to_path( + GTK_TREE_VIEW(viewer->calendar_tree_view), path); + gtk_tree_path_free(path); + + GtkTreeSelection *selection = gtk_tree_view_get_selection( + GTK_TREE_VIEW(viewer->calendar_tree_view)); + + gtk_tree_selection_select_iter(selection, &day_iter); +} + static gboolean popup_calendar_button_pressed(GtkWidget *treeview, GdkEventButton *event, gpointer data) @@ -1494,6 +1581,17 @@ pidgin_genericlog_show(void) gtk_widget_show_all(generic_log_viewer->window); } +void +pidgin_genericlog_show_contact_log(PurpleBlistNode *contact) +{ + g_return_if_fail(contact != NULL); + g_return_if_fail(PURPLE_IS_BUDDY(contact) || PURPLE_IS_CHAT(contact)); + + pidgin_genericlog_show(); + + select_blist_contact_row(generic_log_viewer, contact); +} + /******************************************************************************/ /* GTK+ generic log subsystem */ /******************************************************************************/ diff --git a/pidgin/gtkgenericlog.h b/pidgin/gtkgenericlog.h --- a/pidgin/gtkgenericlog.h +++ b/pidgin/gtkgenericlog.h @@ -86,6 +86,14 @@ G_BEGIN_DECLS */ void pidgin_genericlog_show(void); +/** + * pidgin_genericlog_show_contact_log: + * @contact: The contact. Must be one of #PurpleBuddy, #PurpleChat. + * + * Shows the GTK+ generic log window and sets focus to the contact. + */ +void pidgin_genericlog_show_contact_log(PurpleBlistNode *contact); + /******************************************************************************/ /* GTK+ generic log subsystem */ /******************************************************************************/ diff --git a/pidgin/gtklog.c b/pidgin/gtklog.c --- a/pidgin/gtklog.c +++ b/pidgin/gtklog.c @@ -681,9 +681,6 @@ static PidginLogViewer *display_log_view } void pidgin_log_show(PurpleLogType type, const char *buddyname, PurpleAccount *account) { - // TODO: a temporary invocation for testing - pidgin_genericlog_show(); - struct log_viewer_hash_t *ht; PidginLogViewer *lv = NULL; const char *name = buddyname; _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits