--- gpe-calendar-0.58/day_view.c~ Sat Oct 9 20:14:26 2004 +++ gpe-calendar-0.58/day_view.c Mon Oct 18 00:21:05 2004 @@ -33,15 +33,26 @@ #define _(x) gettext(x) +enum +{ + COL_HOUR = 0, + COL_MIN, + COL_DIV, + COL_ICON, + COL_DETAIL, + COL_BACK, + COL_EVENT, + NUM_COLS +}; + + static GSList *strings; +static GtkListStore *liststore; static GSList *day_events[24], *untimed_events; -GtkWidget *day_list; +static GtkWidget *day_list; static GtkWidget *datesel, *calendar; static GtkAdjustment *scroll_adjustment; -static GtkStyle *light_style, *dark_style, *time_style; -static GdkColor light_color, dark_color, time_color; - void delete_event (event_t ev) @@ -89,85 +100,61 @@ static gboolean -list_key_press_event (GtkWidget *clist, GdkEventKey *k, gpointer user_data) +list_key_press_event (GtkWidget *treeview, GdkEventKey *k, gpointer user_data) { - int row; event_t ev; + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + GtkTreeModel *model; + GtkTreeIter iter; GtkWidget *w; - int lastrow = (int)g_object_get_data(G_OBJECT(clist),"last-row"); - - row = (int)g_object_get_data(G_OBJECT(clist),"selected-row"); - - if (k->keyval == GDK_Up) - { - gtk_clist_select_row(GTK_CLIST(clist),row-1, 0); - return FALSE; - } - - if (k->keyval == GDK_Down) - { - gtk_clist_select_row (GTK_CLIST(clist),row + 1, 0); - - if (row == lastrow) - { - lastrow = -1; - return TRUE; - } - else - { - lastrow = row; - return FALSE; - } - } if (k->keyval == GDK_Left) { - gtk_date_sel_move_day (datesel, -1); + gtk_date_sel_move_day (GTK_DATE_SEL(datesel), -1); return TRUE; } if (k->keyval == GDK_Right) { - gtk_date_sel_move_day (datesel, 1); + gtk_date_sel_move_day (GTK_DATE_SEL(datesel), 1); return TRUE; } + if (!selection) return FALSE; + + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return FALSE; + + gtk_tree_model_get(model, &iter, COL_EVENT, &ev, -1); + if (k->keyval == GDK_Return) - { - if (row >= 0) - { - struct tm tm; - ev = gtk_clist_get_row_data(GTK_CLIST (clist), row); - if (ev) - { - w = edit_event(ev); - } - else - { - char *t; - localtime_r (&viewtime, &tm); - if (gtk_clist_get_text (GTK_CLIST (clist), row, 0, &t)) - strptime (t, TIMEFMT, &tm); - w = new_event (mktime (&tm), 1); - } - gtk_widget_show (w); - } - return TRUE; - } + { + struct tm tm; + + if (ev) + { + w = edit_event(ev); + } + else + { + char *hour; + char *min; + localtime_r (&viewtime, &tm); + gtk_tree_model_get(model, &iter, COL_HOUR, &hour, -1); + strptime (hour, "%H:", &tm); + gtk_tree_model_get(model, &iter, COL_HOUR, &min, -1); + strptime (min, "%M", &tm); + w = new_event (mktime (&tm), 1); + } + gtk_widget_show (w); + return TRUE; + } if (k->keyval == GDK_Delete) { - row = (int)g_object_get_data(G_OBJECT(clist),"selected-row"); - if (row >= 0) - { - ev = gtk_clist_get_row_data(GTK_CLIST (clist), row); - if ((ev) && (gpe_question_ask (_("Delete event?"), _("Question"), "question", - "!gtk-no", NULL, "!gtk-yes", NULL, NULL))) - { - delete_event(ev); - g_object_set_data(G_OBJECT(clist),"selected-row",(void *)-1); - } - } + if ((ev) && (gpe_question_ask (_("Delete event?"), _("Question"), "question", + "!gtk-no", NULL, "!gtk-yes", NULL, NULL))) + delete_event(ev); return TRUE; } @@ -217,39 +204,53 @@ return g_strdup (buf); } -static void -selection_made (GtkWidget *clist, - gint row, - gint column, - GdkEventButton *event, - GtkWidget *widget) +static gboolean +selection_made (GtkWidget *treeview, GdkEventButton *event, gpointer userdata) { event_t ev; GtkWidget *w; - - g_object_set_data(G_OBJECT(clist),"last-row", - g_object_get_data(G_OBJECT(clist),"selected-row")); - g_object_set_data(G_OBJECT(clist),"selected-row",(void *)row); + GtkTreeViewColumn *treecolumn; + GtkTreePath *path; + GtkTreeModel *model; + GtkTreeIter iter; + GList *cols; + gint column; - if (!event) return; - - if ((event->type == GDK_2BUTTON_PRESS) - || ((event->type == GDK_BUTTON_RELEASE) && (column == 1))) + if (!event) return FALSE; + + if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, + &path, &treecolumn, NULL, NULL)) + return FALSE; + + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(treeview)); + column = g_list_index(cols, (gpointer) treecolumn); + g_list_free(cols); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); + + if (!gtk_tree_model_get_iter(model, &iter, path)) + return FALSE; + + gtk_tree_model_get(model, &iter, COL_EVENT, &ev, -1); + + if ((event->type == GDK_2BUTTON_PRESS) + || ((event->type == GDK_BUTTON_RELEASE) && (column == COL_DETAIL))) { struct tm tm; - ev = gtk_clist_get_row_data (GTK_CLIST (clist), row); - - if (ev) + if (ev) { w = edit_event (ev); } - else + else { - char *t; + char *hour; + char *min; localtime_r (&viewtime, &tm); - if (gtk_clist_get_text (GTK_CLIST (clist), row, 0, &t)) - strptime (t, TIMEFMT, &tm); + gtk_tree_model_get(model, &iter, COL_HOUR, &hour, -1); + strptime (hour, "%H:", &tm); + gtk_tree_model_get(model, &iter, COL_HOUR, &min, -1); + strptime (min, "%M", &tm); w = new_event (mktime (&tm), 1); } gtk_widget_show (w); @@ -258,63 +259,156 @@ { // set the default event time to match the selected row struct tm tm; - char *t; - if (gtk_clist_get_text (GTK_CLIST (clist), row, 0, &t)) - { - localtime_r (&viewtime, &tm); - strptime (t, TIMEFMT, &tm); - viewtime = mktime (&tm); - } + char *hour; + char *min; + + gtk_tree_model_get(model, &iter, COL_HOUR, &hour, -1); + localtime_r (&viewtime, &tm); + strptime (hour, "%H:", &tm); + gtk_tree_model_get(model, &iter, COL_HOUR, &min, -1); + strptime (min, "%M", &tm); + + viewtime = mktime (&tm); } + + return FALSE; +} + + +static GtkWidget * +create_day_view (void) +{ + GtkTreeViewColumn *col; + GtkCellRenderer *renderer; + GtkTreeModel *model; + GtkWidget *view; + + view = gtk_tree_view_new (); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (view), FALSE); + + /* Hour column */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "font", "Serif 12", + "xpad", 0, + "width", 24, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "", + renderer, + "text", COL_HOUR, + NULL); + + /* Minute column */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "font", "Serif", + "xpad", 0, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "", + renderer, + "text", COL_MIN, + NULL); + + /* Divider column */ + renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, + "cell-background", "black", + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "", + renderer, + NULL); + + + /* Force divider column to single pixel */ + col = gtk_tree_view_get_column(GTK_TREE_VIEW (view), COL_DIV); + g_object_set(col, + "sizing", GTK_TREE_VIEW_COLUMN_FIXED, + "min-width", 1, + NULL); + + /* Pixmap */ + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "", + renderer, + "pixbuf", COL_ICON, + NULL); + + /* Details */ + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "", + renderer, + "text", COL_DETAIL, + "cell-background", COL_BACK, + NULL); + + col = gtk_tree_view_get_column(GTK_TREE_VIEW (view), COL_DETAIL); + gtk_tree_view_column_set_expand(col, TRUE); + + /* Background colour */ + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), + -1, + "", + renderer, + NULL); + + col = gtk_tree_view_get_column(GTK_TREE_VIEW (view), COL_BACK); + g_object_set(col, + "sizing", GTK_TREE_VIEW_COLUMN_FIXED, + "max-width", 0, + NULL); + + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW (view), + -1, + "", + renderer, + NULL); + + col = gtk_tree_view_get_column(GTK_TREE_VIEW (view), COL_EVENT); + g_object_set(col, + "sizing", GTK_TREE_VIEW_COLUMN_FIXED, + "max-width", 0, + NULL); + + liststore = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); + model = GTK_TREE_MODEL (liststore); + + gtk_tree_view_set_model (GTK_TREE_VIEW (view), model); + g_object_unref (model); /* destroy model automatically with view */ + + return view; } + static gint day_view_update () { - guint hour, row = 0; + guint hour; time_t start, end; struct tm tm_start, tm_end; - char buf[10]; + char hour_buf[4]; + char min_buf[4]; gchar *line_info[2]; GSList *iter; - guint i, width = 0, widget_width; - PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET (day_list), NULL); - PangoRectangle pr; double pos; gchar *last_text = NULL; - - widget_width = day_list->allocation.width; + GtkTreeIter treeiter; - if (! light_style) - { - guint j; - light_color.red = 60000; - light_color.green = 60000; - light_color.blue = 60000; - - time_color.red = 20000; - time_color.green = 20000; - time_color.blue = 20000; - - dark_color.red = 45000; - dark_color.green = 45000; - dark_color.blue = 45000; - - light_style = gtk_style_copy (gtk_widget_get_style (day_list)); - dark_style = gtk_style_copy (gtk_widget_get_style (day_list)); - time_style = gtk_style_copy (gtk_widget_get_style (day_list)); - - for (j = 0; j < 5; j++) - { - light_style->base[j] = light_color; - dark_style->base[j] = dark_color; - time_style->base[j] = time_color; - time_style->fg[j] = light_color; - } - } - - gtk_clist_freeze (GTK_CLIST (day_list)); - gtk_clist_clear (GTK_CLIST (day_list)); + gtk_list_store_clear(liststore); if (strings) { @@ -324,6 +418,7 @@ strings = NULL; } + localtime_r (&viewtime, &tm_start); pos = 24 / (tm_start.tm_hour + 1); gtk_adjustment_set_value (scroll_adjustment, pos); @@ -344,16 +439,21 @@ { event_t ev = (event_t)iter->data; gchar *text = format_event (ev); - g_slist_append (strings, text); - line_info[0] = NULL; - line_info[1] = text; + g_slist_append (strings, text); - gtk_clist_append (GTK_CLIST (day_list), line_info); - gtk_clist_set_row_data (GTK_CLIST (day_list), row, ev); - row++; + gtk_list_store_append (liststore, &treeiter); + gtk_list_store_set (liststore, &treeiter, + COL_HOUR, "", + COL_MIN, "", + COL_DIV, "", + COL_ICON, NULL, + COL_DETAIL, text, + COL_BACK, "back", + COL_EVENT, ev, + -1); } - + for (hour = 0; hour <= 23; hour++) { localtime_r (&viewtime, &tm_start); @@ -377,7 +477,6 @@ for (hour = 0; hour <= 23; hour++) { - guint w; gchar *text = NULL; event_t ev = NULL; @@ -385,7 +484,8 @@ tm_start.tm_min = 0; tm_start.tm_sec = 0; - strftime (buf, sizeof (buf), "%R", &tm_start); + strftime (hour_buf, sizeof (hour_buf), "%H:", &tm_start); + strftime (min_buf, sizeof (min_buf), "%M", &tm_start); for (iter = day_events[hour]; iter; iter = iter->next) { @@ -397,72 +497,54 @@ ev->mark = TRUE; text = format_event (ev); g_slist_append (strings, text); - + if (day_view_combined_times) { localtime_r (&ev->start, &tm); - strftime (buf, sizeof (buf), "%R", &tm); + strftime (hour_buf, sizeof (hour_buf), "%H:", &tm); + strftime (min_buf, sizeof (min_buf), "%M", &tm); } break; } - } + } if (!last_text || !text || (strcmp(last_text,text))) line_info[1] = text; else line_info[1] = NULL; - line_info[0] = buf; + line_info[0] = hour_buf; if (last_text) g_free(last_text); last_text = g_strdup(text); - pango_layout_set_text (pl, buf, strlen (buf)); - pango_layout_get_pixel_extents (pl, &pr, NULL); - w = pr.width; - - if (w > width) width = w; - /* don't display very early/late slots if they are not used */ if (ev || ((hour > 5) && (hour < 23))) - { - gtk_clist_append (GTK_CLIST (day_list), line_info); - gtk_clist_set_row_data (GTK_CLIST (day_list), row, ev); - } - - if (ev) { - GdkPixmap *pmap; - GdkBitmap *bmap; - - if ((ev->flags & FLAG_ALARM) && ev->recur) - { - if (gpe_find_icon_pixmap ("bell_recur", &pmap, &bmap)) - gtk_clist_set_pixtext (GTK_CLIST (day_list), row, 1, text, 5, - pmap, bmap); - } - else if (ev->flags & FLAG_ALARM) - { - if (gpe_find_icon_pixmap ("bell", &pmap, &bmap)) - gtk_clist_set_pixtext (GTK_CLIST (day_list), row, 1, text, 5, - pmap, bmap); - } - else if (ev->recur) + GdkPixbuf *pbuf = NULL; + + if (ev) { - if (gpe_find_icon_pixmap ("recur", &pmap, &bmap)) - gtk_clist_set_pixtext (GTK_CLIST (day_list), row, 1, text, 5, - pmap, bmap); - } + if ((ev->flags & FLAG_ALARM) && ev->recur) + pbuf = gpe_find_icon ("bell_recur"); + else if (ev->flags & FLAG_ALARM) + pbuf = gpe_find_icon ("bell"); + else if (ev->recur) + pbuf = gpe_find_icon ("recur"); + } + + gtk_list_store_append (liststore, &treeiter); + gtk_list_store_set (liststore, &treeiter, + COL_HOUR, hour_buf, + COL_MIN, min_buf, + COL_DIV, "", + COL_ICON, pbuf, + COL_DETAIL, line_info[1], + COL_BACK, day_events[hour] ? "white" : "palegoldenrod", + COL_EVENT, ev, + -1); } - - /* don't display very early/late slots if they are not used */ - if (ev || ((hour > 5) && (hour < 23))) - { - gtk_clist_set_cell_style (GTK_CLIST (day_list), row, 1, - day_events[hour] ? dark_style : light_style); - row++; - } - - for (; iter; iter = iter->next) + + for (; iter; iter = iter->next) { ev = (event_t) iter->data; @@ -475,8 +557,9 @@ { struct tm tm; localtime_r (&ev->start, &tm); - strftime (buf, sizeof (buf), "%R", &tm); - line_info[0] = buf; + strftime (hour_buf, sizeof (hour_buf), "%H:", &tm); + strftime (min_buf, sizeof (min_buf), "%M", &tm); + line_info[0] = hour_buf; } else { @@ -484,25 +567,23 @@ } line_info[1] = format_event (ev); + + gtk_list_store_append (liststore, &treeiter); + gtk_list_store_set (liststore, &treeiter, + COL_HOUR, line_info[0], + COL_MIN, line_info[0] ? min_buf : NULL, + COL_DIV, "", + COL_ICON, NULL, + COL_DETAIL, line_info[1], + COL_BACK, "white", + COL_EVENT, ev, + -1); + g_slist_append (strings, line_info[1]); - gtk_clist_append (GTK_CLIST (day_list), line_info); - gtk_clist_set_row_data (GTK_CLIST (day_list), row, ev); - gtk_clist_set_cell_style (GTK_CLIST (day_list), row, 1, dark_style); - row++; - } + } } - for (i = 0; i < row; i++) - gtk_clist_set_cell_style (GTK_CLIST (day_list), i, 0, time_style); - - gtk_clist_set_column_width (GTK_CLIST (day_list), 0, width + 4); - gtk_clist_set_column_width (GTK_CLIST (day_list), 1, widget_width - 20 - (width + 4)); - - gtk_clist_thaw (GTK_CLIST (day_list)); - - g_object_unref (pl); - return TRUE; } @@ -530,7 +611,7 @@ } static void -date_sel_changed (GtkWidget *widget, GtkWidget *clist) +date_sel_changed (GtkWidget *widget, GtkWidget *list) { struct tm tm; viewtime = gtk_date_sel_get_time (GTK_DATE_SEL (widget)); @@ -568,13 +649,6 @@ } } -gboolean -list_exposed (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) -{ - gtk_container_propagate_expose (GTK_CONTAINER (widget), day_list, event); - return FALSE; -} - GtkWidget * day_view (void) { @@ -597,16 +671,16 @@ datesel = gtk_date_sel_new (GTKDATESEL_FULL); gtk_widget_show (datesel); - - day_list = gtk_clist_new (2); - gtk_clist_set_selection_mode (GTK_CLIST (day_list), GTK_SELECTION_SINGLE); + + day_list = create_day_view(); + gtk_widget_show (day_list); g_signal_connect (G_OBJECT (calendar), "day-selected", G_CALLBACK (day_changed_calendar), NULL); - g_signal_connect (G_OBJECT (day_list), "select_row", + g_signal_connect (G_OBJECT (day_list), "button-press-event", G_CALLBACK (selection_made), NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), @@ -639,11 +713,8 @@ scroll_adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)); - g_signal_connect (G_OBJECT (day_list), "key_press_event", + g_signal_connect (G_OBJECT (day_list), "key_press_event", G_CALLBACK (list_key_press_event), NULL); - g_signal_connect (G_OBJECT (scrolled_window), "expose-event", - G_CALLBACK (list_exposed), NULL); - g_object_set_data (G_OBJECT (day_list), "selected-row", (void *)0); g_object_set_data (G_OBJECT (main_window), "datesel-day", datesel);