/soc/2015/igor.gajowiak/chatlog: 6333c6948398: Implemented showi...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 6333c694839876466ac91d63a91eb6febf552389 Author: Igor Gajowiak <[email protected]> Date: 2015-07-30 18:11 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/6333c6948398 Description: Implemented showing days in the log. diffstat: pidgin/gtkgenericlog.c | 178 +++++++++++++++++++++++++++++++++++++----------- pidgin/gtkgenericlog.h | 8 +- 2 files changed, 142 insertions(+), 44 deletions(-) diffs (truncated from 321 to 300 lines): diff --git a/pidgin/gtkgenericlog.c b/pidgin/gtkgenericlog.c --- a/pidgin/gtkgenericlog.c +++ b/pidgin/gtkgenericlog.c @@ -19,7 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#include "blistnodetypes.h" +#include <sys/time.h> + #include "buddylist.h" #include "genericlog.h" #include "gtkgenericlog.h" @@ -227,9 +228,40 @@ on_buddylist_row_activated(GtkTreeView * } static void +populate_calendar_store(PurpleBuddy *buddy, GtkTreeStore *store); + +static void on_buddylist_row_changed(GtkTreeSelection *sel, gpointer data) { - printf("on_buddylist_row_changed\n"); + g_assert(data); + + PidginGenericLogViewer *viewer = (PidginGenericLogViewer*) data; + + g_object_unref(G_OBJECT(viewer->current_buddy)); + viewer->current_buddy = NULL; + + GtkTreeModel *model; + GtkTreeIter row; + + /* No buddy selected */ + if (!gtk_tree_selection_get_selected(sel, &model, &row)) { + gtk_tree_store_clear(viewer->calendar_tree_store); + return; + } + + gpointer buddy = NULL; + gtk_tree_model_get(model, &row, BLIST_TREE_STORE_COL_BUDDY, &buddy, -1); + + /* Group row activated */ + if (!buddy) { + gtk_tree_store_clear(viewer->calendar_tree_store); + return; + } + + g_object_ref(buddy); + viewer->current_buddy = buddy; + + populate_calendar_store((PurpleBuddy*) buddy, viewer->calendar_tree_store); } static void @@ -259,20 +291,28 @@ append_buddy(GtkTreeStore *store, GHashT BLIST_TREE_STORE_COL_BUDDY, buddy, -1); } -static GtkTreeModel * -create_buddylist_model(void) +static GtkTreeStore * +create_buddylist_store(void) { + // Stores (group_name, NULL) or (buddy_name, buddy) + return gtk_tree_store_new(BLIST_TREE_STORE_COLUMNS, + G_TYPE_STRING, G_TYPE_OBJECT); +} + +static void +populate_buddylist_store(GtkTreeStore *store) +{ + g_assert(store); + + gtk_tree_store_clear(store); + GList *buddies; if (!purple_genericlog_get_all_buddies(&buddies, NULL)) { purple_debug_error(GTKGENERICLOG_DEBUG_CATEGORY, "Getting buddies failed"); - buddies = NULL; + return; } - // Stores (group_name, NULL) or (buddy_name, buddy) - GtkTreeStore *store = gtk_tree_store_new(BLIST_TREE_STORE_COLUMNS, - G_TYPE_STRING, G_TYPE_OBJECT); - // Maps PurpleGroup* -> GtkTreeIter* GHashTable *branches = g_hash_table_new_full(g_direct_hash, g_direct_equal, g_object_unref, g_free); @@ -283,17 +323,15 @@ create_buddylist_model(void) g_list_free_full(buddies, g_object_unref); g_hash_table_destroy(branches); - - return GTK_TREE_MODEL(store); } static GtkWidget * -create_buddylist_view(GtkTreeModel *model, PidginGenericLogViewer *viewer) +create_buddylist_view(GtkTreeStore *store, PidginGenericLogViewer *viewer) { - g_assert(model); + g_assert(store); g_assert(viewer); - GtkWidget *view = gtk_tree_view_new_with_model(model); + GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes( @@ -317,6 +355,12 @@ create_buddylist_view(GtkTreeModel *mode /* Calendar view */ /******************************************************************************/ +typedef enum +{ + CALENDAR_TREE_STORE_COL_DATESTRING = 0, + CALENDAR_TREE_STORE_COL_DATE = 1, +} CalendarTreeStoreColumn; + static void on_calendar_row_activated(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) @@ -341,36 +385,85 @@ popup_calendar_button_pressed(GtkWidget return FALSE; } -static GtkTreeModel * -create_calendar_model(void) +static GtkTreeStore * +create_calendar_store(void) { - // TODO: Fill the store with real values + return gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_UINT64); +} - GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); - GtkTreeIter iter; +static void +append_new_calendar_group(GtkTreeStore *store, GtkTreeIter *group, + const struct tm *time) +{ + g_assert(store); + g_assert(group); + g_assert(time); - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, "Entry 1", -1); + gtk_tree_store_append(store, group, NULL); - gtk_tree_store_append(store, &iter, &iter); - gtk_tree_store_set(store, &iter, 0, "Entry 2", -1); + gtk_tree_store_set(store, group, + CALENDAR_TREE_STORE_COL_DATESTRING, purple_utf8_strftime( + "%Y %b", time), + CALENDAR_TREE_STORE_COL_DATE, 0, -1); +} - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, "Entry 3", -1); +static void +populate_calendar_store(PurpleBuddy *buddy, GtkTreeStore *store) +{ + g_assert(buddy); + g_assert(store); - GtkTreeModel *model = GTK_TREE_MODEL(store); + gtk_tree_store_clear(store); - return model; + GArray *days; + if (!purple_genericlog_get_all_days(buddy, &days, NULL)) { + purple_debug_error(GTKGENERICLOG_DEBUG_CATEGORY, + "Getting days failed"); + return; + } + + if (days->len == 0) { + g_array_unref(days); + return; + } + + time_t timestamp = (time_t) g_array_index(days, guint64, 0); + + GtkTreeIter curr_group; + struct tm curr_group_time = *localtime(×tamp); + append_new_calendar_group(store, &curr_group, &curr_group_time); + + for (guint i = 0; i < days->len; ++i) { + timestamp = (time_t) g_array_index(days, guint64, i); + + /* Start a new group if year or month changed */ + struct tm *curr_time = localtime(×tamp); + if (curr_time->tm_year != curr_group_time.tm_year || + curr_time->tm_mon != curr_group_time.tm_mon) { + curr_group_time = *curr_time; + append_new_calendar_group(store, &curr_group, &curr_group_time); + } + + /* Append a new day under current group */ + GtkTreeIter day_iter; + gtk_tree_store_append(store, &day_iter, &curr_group); + gtk_tree_store_set(store, &day_iter, + CALENDAR_TREE_STORE_COL_DATESTRING, purple_utf8_strftime( + "%a %d", curr_time), + CALENDAR_TREE_STORE_COL_DATE, (guint64) timestamp, -1); + } + + g_array_unref(days); } static GtkWidget * -create_calendar_view(GtkTreeModel *model, PidginGenericLogViewer *viewer) +create_calendar_view(GtkTreeStore *store, PidginGenericLogViewer *viewer) { - g_assert(model); + g_assert(store); g_assert(viewer); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - GtkWidget *view = gtk_tree_view_new_with_model(model); + GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), -1, "Calendar", renderer, "text", 0, NULL); @@ -416,14 +509,14 @@ on_close_response(GtkWidget *widget, gin static GtkWidget * create_window(PidginGenericLogViewer *viewer, GtkWidget **buddylist_view_res, - GtkTreeModel **buddylist_model_res, GtkWidget **calendar_view_res, - GtkTreeModel **calendar_model_res, GtkWidget **webview_res) + GtkTreeStore **buddylist_store_res, GtkWidget **calendar_view_res, + GtkTreeStore **calendar_store_res, GtkWidget **webview_res) { g_assert(viewer); g_assert(buddylist_view_res); - g_assert(buddylist_model_res); + g_assert(buddylist_store_res); g_assert(calendar_view_res); - g_assert(calendar_model_res); + g_assert(calendar_store_res); g_assert(webview_res); GtkWidget *window = gtk_dialog_new_with_buttons( @@ -447,8 +540,9 @@ create_window(PidginGenericLogViewer *vi gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(window))), horizontal_pane, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); - GtkTreeModel *buddylist_model = create_buddylist_model(); - GtkWidget *buddylist_view = create_buddylist_view(buddylist_model, viewer); + GtkTreeStore *buddylist_store = create_buddylist_store(); + populate_buddylist_store(buddylist_store); + GtkWidget *buddylist_view = create_buddylist_view(buddylist_store, viewer); gtk_paned_add1(GTK_PANED(horizontal_pane), pidgin_make_scrollable( buddylist_view, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1)); @@ -456,8 +550,8 @@ create_window(PidginGenericLogViewer *vi GtkWidget *vertical_pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL); gtk_paned_add2(GTK_PANED(horizontal_pane), vertical_pane); - GtkTreeModel *calendar_model = create_calendar_model(); - GtkWidget *calendar_view = create_calendar_view(calendar_model, viewer); + GtkTreeStore *calendar_store = create_calendar_store(); + GtkWidget *calendar_view = create_calendar_view(calendar_store, viewer); gtk_paned_add1(GTK_PANED(vertical_pane), pidgin_make_scrollable( calendar_view, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1)); @@ -467,10 +561,10 @@ create_window(PidginGenericLogViewer *vi gtk_paned_add2(GTK_PANED(vertical_pane), frame); *buddylist_view_res = buddylist_view; - *buddylist_model_res = buddylist_model; + *buddylist_store_res = buddylist_store; *calendar_view_res = calendar_view; - *calendar_model_res = calendar_model; + *calendar_store_res = calendar_store; *webview_res = webview; @@ -483,8 +577,8 @@ create_genericlog_viewer() PidginGenericLogViewer *viewer = g_new0(PidginGenericLogViewer, 1); viewer->window = create_window(viewer, - &viewer->blist_tree_view, &viewer->blist_tree_model, - &viewer->calendar_tree_view, &viewer->calendar_tree_model, + &viewer->blist_tree_view, &viewer->blist_tree_store, + &viewer->calendar_tree_view, &viewer->calendar_tree_store, &viewer->webview); return viewer; diff --git a/pidgin/gtkgenericlog.h b/pidgin/gtkgenericlog.h --- a/pidgin/gtkgenericlog.h +++ b/pidgin/gtkgenericlog.h @@ -24,18 +24,22 @@ #include <gtk/gtk.h> _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits