From d5f2b21f37bb2a5e45bcafcc39437b77fd12aa10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Wed, 15 Oct 2014 21:44:47 -0400 Subject: [PATCH] build: removed unused/faulty code This cleaning is made in order to merge this branch into master as soon as possible. The implementation of GcalDayView is planned to go on the same lines as GcalWeekView but for two days alone, so much of the code of the latter could be reused. The approach of using shallow container and kinda layout manager objects inside GcalDayView didn't worked that well for my expertise at this time. --- src/Makefile.am | 10 - src/gcal-all-day-grid.c | 1054 ----------------------------- src/gcal-all-day-grid.h | 74 --- src/gcal-day-view.c | 690 ------------------- src/gcal-day-view.h | 53 -- src/gcal-days-grid.c | 1178 --------------------------------- src/gcal-days-grid.h | 81 --- src/gcal-floating-container.c | 337 ---------- src/gcal-floating-container.h | 59 -- src/gcal-viewport.c | 277 -------- src/gcal-viewport.h | 59 -- src/gcal-window.c | 10 - 12 files changed, 3882 deletions(-) delete mode 100644 src/gcal-all-day-grid.c delete mode 100644 src/gcal-all-day-grid.h delete mode 100644 src/gcal-day-view.c delete mode 100644 src/gcal-day-view.h delete mode 100644 src/gcal-days-grid.c delete mode 100644 src/gcal-days-grid.h delete mode 100644 src/gcal-floating-container.c delete mode 100644 src/gcal-floating-container.h delete mode 100644 src/gcal-viewport.c delete mode 100644 src/gcal-viewport.h diff --git a/src/Makefile.am b/src/Makefile.am index 20d38a7b..b7dbcb30 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,14 +27,10 @@ gnome_calendar_SOURCES = \ main.c \ gcal-application.h \ gcal-application.c \ - gcal-floating-container.c \ - gcal-floating-container.h \ gcal-window.h \ gcal-window.c \ gcal-view.c \ gcal-view.h \ - gcal-day-view.c \ - gcal-day-view.h \ gcal-month-view.c \ gcal-month-view.h \ gcal-week-view.c \ @@ -55,12 +51,6 @@ gnome_calendar_SOURCES = \ gcal-manager.h \ gcal-nav-bar.h \ gcal-nav-bar.c \ - gcal-viewport.c \ - gcal-viewport.h \ - gcal-all-day-grid.c \ - gcal-all-day-grid.h \ - gcal-days-grid.c \ - gcal-days-grid.h \ gcal-utils.c \ gcal-utils.h diff --git a/src/gcal-all-day-grid.c b/src/gcal-all-day-grid.c deleted file mode 100644 index 41eb4661..00000000 --- a/src/gcal-all-day-grid.c +++ /dev/null @@ -1,1054 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-all-day-grid.c - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "gcal-all-day-grid.h" -#include "gcal-event-widget.h" - -#include - -enum -{ - PROP_0, - PROP_COLUMNS, -}; - -struct _ChildInfo -{ - GtkWidget *widget; - - guint column_span; -}; - -typedef struct _ChildInfo ChildInfo; - -typedef struct -{ - /* property */ - guint columns_nr; - - GList *column_headers; - GList *children; - - GdkWindow *event_window; - - /* button_down/up flags */ - gint clicked_cell; - gint start_mark_cell; - gint end_mark_cell; - -} GcalAllDayGridPrivate; - -enum -{ - MARKED, - NUM_SIGNALS -}; - -static guint signals[NUM_SIGNALS] = { 0, }; - -/* Helpers and private */ -static void gcal_all_day_grid_finalize (GObject *object); - -static void gcal_all_day_grid_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); - -static void gcal_all_day_grid_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); - -static void gcal_all_day_grid_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); - -static void gcal_all_day_grid_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); - -static void gcal_all_day_grid_realize (GtkWidget *widget); - -static void gcal_all_day_grid_unrealize (GtkWidget *widget); - -static void gcal_all_day_grid_map (GtkWidget *widget); - -static void gcal_all_day_grid_unmap (GtkWidget *widget); - -static void gcal_all_day_grid_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - -static gboolean gcal_all_day_grid_draw (GtkWidget *widget, - cairo_t *cr); - -static gboolean gcal_all_day_grid_button_press_event (GtkWidget *widget, - GdkEventButton *event); - -static gboolean gcal_all_day_grid_motion_notify_event (GtkWidget *widget, - GdkEventMotion *event); - -static gboolean gcal_all_day_grid_button_release_event (GtkWidget *widget, - GdkEventButton *event); - -static void gcal_all_day_grid_add (GtkContainer *container, - GtkWidget *widget); - -static void gcal_all_day_grid_remove (GtkContainer *container, - GtkWidget *widget); - -static void gcal_all_day_grid_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -G_DEFINE_TYPE_WITH_PRIVATE (GcalAllDayGrid,gcal_all_day_grid, GTK_TYPE_CONTAINER); - -static void -gcal_all_day_grid_class_init (GcalAllDayGridClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = gcal_all_day_grid_finalize; - object_class->set_property = gcal_all_day_grid_set_property; - object_class->get_property = gcal_all_day_grid_get_property; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->get_preferred_width = gcal_all_day_grid_get_preferred_width; - widget_class->get_preferred_height = gcal_all_day_grid_get_preferred_height; - widget_class->realize = gcal_all_day_grid_realize; - widget_class->unrealize = gcal_all_day_grid_unrealize; - widget_class->map = gcal_all_day_grid_map; - widget_class->unmap = gcal_all_day_grid_unmap; - widget_class->size_allocate = gcal_all_day_grid_size_allocate; - widget_class->draw = gcal_all_day_grid_draw; - widget_class->button_press_event = gcal_all_day_grid_button_press_event; - widget_class->motion_notify_event = gcal_all_day_grid_motion_notify_event; - widget_class->button_release_event = gcal_all_day_grid_button_release_event; - - container_class = GTK_CONTAINER_CLASS (klass); - container_class->add = gcal_all_day_grid_add; - container_class->remove = gcal_all_day_grid_remove; - container_class->forall = gcal_all_day_grid_forall; - gtk_container_class_handle_border_width (container_class); - - g_object_class_install_property ( - object_class, - PROP_COLUMNS, - g_param_spec_uint ("columns", - "Columns", - "The number of columns in which to split the grid", - 0, - G_MAXUINT, - 0, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE)); - - /* comunicate to its parent view the marking */ - signals[MARKED] = g_signal_new ("marked", - GCAL_TYPE_ALL_DAY_GRID, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcalAllDayGridClass, - marked), - NULL, NULL, NULL, - G_TYPE_NONE, - 2, - G_TYPE_UINT, - G_TYPE_UINT); -} - - - -static void -gcal_all_day_grid_init (GcalAllDayGrid *self) -{ - GcalAllDayGridPrivate *priv; - - gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); - - priv = gcal_all_day_grid_get_instance_private (self); - priv->column_headers = NULL; - priv->children = NULL; - - priv->clicked_cell = -1; - priv->start_mark_cell = -1; - priv->end_mark_cell = -1; - - gtk_style_context_add_class ( - gtk_widget_get_style_context (GTK_WIDGET (self)), - "calendar-view"); -} - -static void -gcal_all_day_grid_finalize (GObject *object) -{ - GcalAllDayGridPrivate *priv; - GList *column; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (object)); - - if (priv->children != NULL) - { - column = priv->children; - while (column) - { - g_list_free_full (column->data, (GDestroyNotify) g_free); - column = column->next; - } - } - g_list_free (priv->children); - - if (priv->column_headers != NULL) - g_list_free_full (priv->column_headers, g_free); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (gcal_all_day_grid_parent_class)->finalize (object); -} - -static void -gcal_all_day_grid_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (object)); - - switch (property_id) - { - case PROP_COLUMNS: - { - gint i; - priv->columns_nr = g_value_get_uint (value); - for (i = 0; i < priv->columns_nr; ++i) - { - priv->children = g_list_prepend (priv->children, NULL); - } - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gcal_all_day_grid_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (object)); - - switch (property_id) - { - case PROP_COLUMNS: - g_value_set_uint (value, priv->columns_nr); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -/* GtkWidget API */ -static void -gcal_all_day_grid_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GcalAllDayGridPrivate* priv; - - GtkBorder padding; - - GList *headers; - gchar *longest_header; - gint length; - - PangoLayout *layout; - PangoRectangle logical_rect; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - length = 0; - longest_header = NULL; - for (headers = priv->column_headers; - headers != NULL; - headers = g_list_next (headers)) - { - gchar *header = (gchar*) headers->data; - if (length < strlen (header)) - { - length = strlen (header); - longest_header = header; - } - } - - layout = gtk_widget_create_pango_layout (widget, longest_header); - - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - if (minimum != NULL) - { - *minimum = - (priv->columns_nr * logical_rect.width) + padding.left + padding.right; - } - if (natural != NULL) - { - *natural = - (priv->columns_nr * logical_rect.width) + padding.left + padding.right; - } - - g_object_unref (layout); -} - -static void -gcal_all_day_grid_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GcalAllDayGridPrivate* priv; - - GList *columns; - - gint min_height; - guint min_keeper; - gint nat_height; - guint nat_keeper; - - GtkBorder padding; - PangoLayout *layout; - PangoRectangle logical_rect; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - layout = gtk_widget_create_pango_layout (widget, "0"); - - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - g_object_unref (layout); - - min_keeper = G_MAXUINT; - nat_keeper = 0; - - for (columns = priv->children; - columns != NULL; - columns = g_list_next (columns)) - { - GList *column_children = (GList*) columns->data; - gint column_height; - - for (;column_children != NULL; - column_children = g_list_next (column_children)) - { - ChildInfo *info; - info = (ChildInfo*) column_children->data; - - gtk_widget_get_preferred_height (info->widget, &min_height, &nat_height); - - /* minimum is calculated as the minimum required - by any child */ - if (min_keeper < min_height) - min_keeper = min_height; - - column_height += nat_height; - } - - if (nat_keeper < column_height) - nat_keeper = column_height; - } - - if (minimum != NULL) - { - *minimum = min_keeper + logical_rect.height + padding.top + padding.bottom; - } - if (natural != NULL) - { - *natural = nat_keeper + logical_rect.height + padding.top + padding.bottom; - } -} - -static void -gcal_all_day_grid_realize (GtkWidget *widget) -{ - GcalAllDayGridPrivate *priv; - GdkWindow *parent_window; - GdkWindowAttr attributes; - gint attributes_mask; - GtkAllocation allocation; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - gtk_widget_set_realized (widget, TRUE); - - parent_window = gtk_widget_get_parent_window (widget); - gtk_widget_set_window (widget, parent_window); - g_object_ref (parent_window); - - gtk_widget_get_allocation (widget, &allocation); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_ONLY; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.width = allocation.width; - attributes.height = allocation.height; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK | - GDK_POINTER_MOTION_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y; - - priv->event_window = gdk_window_new (parent_window, - &attributes, - attributes_mask); - gdk_window_set_user_data (priv->event_window, widget); -} - -static void -gcal_all_day_grid_unrealize (GtkWidget *widget) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - if (priv->event_window != NULL) - { - gdk_window_set_user_data (priv->event_window, NULL); - gdk_window_destroy (priv->event_window); - priv->event_window = NULL; - } - - GTK_WIDGET_CLASS (gcal_all_day_grid_parent_class)->unrealize (widget); -} - -static void -gcal_all_day_grid_map (GtkWidget *widget) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - if (priv->event_window != NULL) - gdk_window_show (priv->event_window); - - GTK_WIDGET_CLASS (gcal_all_day_grid_parent_class)->map (widget); -} - -static void -gcal_all_day_grid_unmap (GtkWidget *widget) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - if (priv->event_window != NULL) - gdk_window_hide (priv->event_window); - - GTK_WIDGET_CLASS (gcal_all_day_grid_parent_class)->unmap (widget); -} - -static void -gcal_all_day_grid_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GcalAllDayGridPrivate *priv; - - gint y_gap; - - GtkBorder padding; - PangoLayout *layout; - PangoRectangle logical_rect; - - GList *columns; - gint idx; - gint i; - - gint width_block; - - GArray *last_y; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - gtk_widget_set_allocation (widget, allocation); - - width_block = allocation->width / priv->columns_nr; - - layout = gtk_widget_create_pango_layout (widget, "0"); - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - y_gap = allocation->y + padding.top + logical_rect.height + padding.bottom; - - g_object_unref (layout); - - /* Placing the event_window */ - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (priv->event_window, - allocation->x, - y_gap, - allocation->width, - allocation->height - y_gap); - } - - /* last_y value for each column, - will keep the amount of columns as well */ - last_y = g_array_new (FALSE, TRUE, sizeof (guint)); - g_array_set_size (last_y, priv->columns_nr); - - /* Placing children */ - for (columns = priv->children, idx = 0; - columns != NULL; - columns = g_list_next (columns), ++idx) - { - GtkAllocation child_allocation; - GList *column; - - column = (GList*) columns->data; - - child_allocation.x = idx * width_block + allocation->x; - - y_gap += g_array_index (last_y, guint, idx); - - for (; column != NULL; column = g_list_next (column)) - { - gint natural_height; - ChildInfo *info; - GtkWidget *item; - - info = (ChildInfo*) column->data; - item = info->widget; - gtk_widget_get_preferred_height (item, NULL, &natural_height); - - child_allocation.width = width_block * info->column_span; - child_allocation.y = y_gap; - child_allocation.height = natural_height; - - y_gap += natural_height; - - gtk_widget_size_allocate (item, &child_allocation); - - /* updating y spacings */ - for (i = 0; i < info->column_span; ++i) - { - g_array_index (last_y, guint, idx + i) = natural_height; - } - } - - y_gap = allocation->y + padding.top + logical_rect.height + padding.bottom; - } - - g_array_free (last_y, TRUE); -} - -static gboolean -gcal_all_day_grid_draw (GtkWidget *widget, - cairo_t *cr) -{ - GcalAllDayGridPrivate *priv; - - GtkBorder padding; - GtkAllocation alloc; - gint y_gap; - - PangoLayout *layout; - PangoRectangle logical_rect; - PangoFontDescription *font_desc; - - GList *header; - gint i; - - GdkRGBA ligther_color; - GdkRGBA background_selected_color; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - gtk_widget_get_allocation (widget, &alloc); - - gtk_style_context_get ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - "font", &font_desc, NULL); - - cairo_save (cr); - - layout = pango_cairo_create_layout (cr); - pango_layout_set_font_description (layout, font_desc); - - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - y_gap = logical_rect.height + padding.top + padding.bottom; - - for (header = priv->column_headers, i = 0; - header != NULL; - header = g_list_next (header), i++) - { - gchar *text = (gchar*) header->data; - pango_layout_set_text (layout, text, -1); - pango_cairo_update_layout (cr, layout); - - cairo_move_to (cr, - (alloc.width / priv->columns_nr) * i + padding.left, - padding.top); - pango_cairo_show_layout (cr, layout); - } - - /* drawing marked cells */ - if (priv->start_mark_cell != -1 && - priv->end_mark_cell != -1) - { - gint first_cell; - gint last_cell; - - gtk_style_context_get_background_color ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget) | GTK_STATE_FLAG_SELECTED, - &background_selected_color); - - if (priv->start_mark_cell < priv->end_mark_cell) - { - first_cell = priv->start_mark_cell; - last_cell = priv->end_mark_cell; - } - else - { - first_cell = priv->end_mark_cell; - last_cell = priv->start_mark_cell; - } - - cairo_save (cr); - cairo_set_source_rgba (cr, - background_selected_color.red, - background_selected_color.green, - background_selected_color.blue, - background_selected_color.alpha); - - cairo_rectangle (cr, - (alloc.width / priv->columns_nr) * first_cell, y_gap, - (alloc.width / priv->columns_nr) * (last_cell + 1), alloc.height - y_gap); - cairo_fill (cr); - cairo_restore (cr); - } - - /* drawing lines */ - gtk_style_context_get_color ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget) | GTK_STATE_FLAG_INSENSITIVE, - &ligther_color); - cairo_set_source_rgb (cr, - ligther_color.red, - ligther_color.green, - ligther_color.blue); - cairo_set_line_width (cr, 0.3); - - cairo_move_to (cr, 0, y_gap + 0.4); - cairo_rel_line_to (cr, alloc.width, 0); - - for (i = 0; i < priv->columns_nr + 1; ++i) - { - cairo_move_to (cr, i * (alloc.width / priv->columns_nr) + 0.4, y_gap); - cairo_rel_line_to (cr, 0, alloc.height - y_gap); - } - - cairo_stroke (cr); - cairo_restore (cr); - - pango_font_description_free (font_desc); - g_object_unref (layout); - - /* drawing children */ - if (GTK_WIDGET_CLASS (gcal_all_day_grid_parent_class)->draw != NULL) - GTK_WIDGET_CLASS (gcal_all_day_grid_parent_class)->draw (widget, cr); - - return FALSE; -} - -static gboolean -gcal_all_day_grid_button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalAllDayGridPrivate *priv; - - gint width_block; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - width_block = gtk_widget_get_allocated_width (widget) / priv->columns_nr; - - priv->clicked_cell = event->x / width_block; - priv->start_mark_cell = priv->clicked_cell; - - return TRUE; -} - -static gboolean -gcal_all_day_grid_motion_notify_event (GtkWidget *widget, - GdkEventMotion *event) -{ - GcalAllDayGridPrivate *priv; - - gint width_block; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - if (priv->clicked_cell == -1) - return FALSE; - - width_block = gtk_widget_get_allocated_width (widget) / priv->columns_nr; - priv->end_mark_cell = event->x / width_block; - - gtk_widget_queue_draw (widget); - return TRUE; -} - -static gboolean -gcal_all_day_grid_button_release_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalAllDayGridPrivate *priv; - - gint width_block; - - gint cell_temp; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (widget)); - - if (priv->clicked_cell == -1) - return FALSE; - - width_block = gtk_widget_get_allocated_width (widget) / priv->columns_nr; - - priv->end_mark_cell = event->x / width_block; - - gtk_widget_queue_draw (widget); - - priv->clicked_cell = -1; - - if (priv->start_mark_cell > priv->end_mark_cell) - { - cell_temp = priv->end_mark_cell; - priv->end_mark_cell = priv->start_mark_cell; - priv->start_mark_cell = cell_temp; - } - - g_signal_emit (GCAL_ALL_DAY_GRID (widget), - signals[MARKED], 0, - priv->start_mark_cell, priv->end_mark_cell); - - return TRUE; -} - -/* GtkContainer API */ -/** - * gcal_all_day_grid_add: - * @container: a #GcalAllDayGrid - * @widget: a widget to add - * - * @gtk_container_add implementation. It assumes the widget will go - * to the first column. - * - **/ -static void -gcal_all_day_grid_add (GtkContainer *container, - GtkWidget *widget) -{ - GcalAllDayGridPrivate* priv; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (container)); - g_return_if_fail (priv->columns_nr != 0); - - gcal_all_day_grid_place (GCAL_ALL_DAY_GRID (container), - widget, - 0, 0); -} - -static void -gcal_all_day_grid_remove (GtkContainer *container, - GtkWidget *widget) -{ - GcalAllDayGridPrivate *priv; - - GList *columns; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (container)); - - for (columns = priv->children; - columns != NULL; - columns = g_list_next (columns)) - { - GList* column = (GList*) columns->data; - for (;column != NULL; column = g_list_next (column)) - { - ChildInfo *info = (ChildInfo*) column->data; - if (widget == info->widget) - { - GList* orig = (GList*) columns->data; - orig = g_list_delete_link (orig, column); - - gtk_widget_unparent (widget); - - columns->data = orig; - - columns = NULL; - break; - } - } - } -} - -static void -gcal_all_day_grid_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GcalAllDayGridPrivate *priv; - - GList* columns; - - priv = gcal_all_day_grid_get_instance_private (GCAL_ALL_DAY_GRID (container)); - - columns = priv->children; - while (columns) - { - GList *column; - - column = columns->data; - columns = columns->next; - - while (column) - { - ChildInfo *info = (ChildInfo*) column->data; - column = column->next; - - (* callback) (info->widget, callback_data); - } - } -} - -/* Public API */ -/** - * gcal_all_day_grid_new: - * - * Since: 0.1 - * Return value: A new #GcalAllDayGrid - * Returns: (transfer full): - **/ -GtkWidget* -gcal_all_day_grid_new (guint columns) -{ - return g_object_new (GCAL_TYPE_ALL_DAY_GRID, "columns", columns, NULL); -} - -/** - * gcal_all_day_grid_set_column_headers: - * @all_day: A #GcalAllDayGrid - * @...: a list of strings - * - * Set the columns headers. If #GcalAllDayGrid:columns property - * has not been set, this function does nothing. - **/ -void -gcal_all_day_grid_set_column_headers (GcalAllDayGrid *all_day, - ...) -{ - GcalAllDayGridPrivate *priv; - va_list args; - gint i; - - priv = gcal_all_day_grid_get_instance_private (all_day); - - if (priv->columns_nr == 0) - return; - - if (priv->column_headers != NULL) - g_list_free_full (priv->column_headers, g_free); - - va_start (args, all_day); - for (i = 0; i < priv->columns_nr; ++i) - { - gchar *header; - header = g_strdup (va_arg(args, gchar*)); - - priv->column_headers = g_list_append (priv->column_headers, - header); - } - - va_end (args); -} - -/** - * gcal_all_day_grid_place: - * @all_day: A #GcalAllDayGrid widget - * @widget: The child widget to add - * @column_idx: The index of the column, starting with zero - * @column_span: The columns the widgets should expand - * - * Adding a widget to a specified column. If the column index - * is bigger than the #GcalAllDayGrid:columns property set, - * it will do nothing. - **/ -void -gcal_all_day_grid_place (GcalAllDayGrid *all_day, - GtkWidget *widget, - guint column_idx, - guint column_span) -{ - GcalAllDayGridPrivate *priv; - GList* children_link; - GList* column; - ChildInfo *info; - - priv = gcal_all_day_grid_get_instance_private (all_day); - - g_return_if_fail (column_idx < priv->columns_nr); - - children_link = g_list_nth (priv->children, column_idx); - column = (GList*) children_link->data; - - info = g_new0 (ChildInfo, 1); - info->widget = widget; - info->column_span = column_span; - children_link->data = g_list_append (column, info); - - gtk_widget_set_parent (widget, GTK_WIDGET (all_day)); -} - -GtkWidget* -gcal_all_day_grid_get_by_uuid (GcalAllDayGrid *all_day, - const gchar *uuid) -{ - GcalAllDayGridPrivate *priv; - - GList* columns; - - priv = gcal_all_day_grid_get_instance_private (all_day); - - columns = priv->children; - while (columns) - { - GList *column; - - column = columns->data; - columns = columns->next; - - while (column) - { - ChildInfo *info; - GcalEventWidget *child; - - info = ((ChildInfo*) column->data); - child = GCAL_EVENT_WIDGET (info->widget); - column = column->next; - - if (g_strcmp0 (uuid, - gcal_event_widget_peek_uuid (child)) == 0) - { - return (GtkWidget*) child; - } - } - } - - return NULL; -} - -/** - * gcal_all_day_grid_clear_marks: - * @all_day: a #GcalAllDayGrid - * - * Clear the value of the markings and queue a draw to update - the widget looking - **/ -void -gcal_all_day_grid_clear_marks (GcalAllDayGrid *all_day) -{ - GcalAllDayGridPrivate *priv; - - priv = gcal_all_day_grid_get_instance_private (all_day); - - priv->start_mark_cell = -1; - priv->end_mark_cell = -1; - gtk_widget_queue_draw (GTK_WIDGET (all_day)); -} - -void -gcal_all_day_grid_get_cell_position (GcalAllDayGrid *all_day, - guint cell, - gint *x, - gint *y) -{ - GcalAllDayGridPrivate *priv; - - GtkWidget *widget; - - GtkBorder padding; - PangoLayout *layout; - PangoRectangle logical_rect; - gint y_gap; - - gint width_block; - - priv = gcal_all_day_grid_get_instance_private (all_day); - - widget = GTK_WIDGET (all_day); - width_block = gtk_widget_get_allocated_width (widget) / priv->columns_nr; - - if (x != NULL) - *x = cell * width_block + width_block / 2; - - if (y != NULL) - { - layout = gtk_widget_create_pango_layout (widget, "0"); - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - - y_gap = padding.top + logical_rect.height + padding.bottom; - *y = y_gap + (gtk_widget_get_allocated_height (widget) - y_gap) / 2; - - g_object_unref (layout); - } -} diff --git a/src/gcal-all-day-grid.h b/src/gcal-all-day-grid.h deleted file mode 100644 index f152118b..00000000 --- a/src/gcal-all-day-grid.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * gcal-all-day-grid.h - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __GCAL_ALL_DAY_GRID_H__ -#define __GCAL_ALL_DAY_GRID_H__ - -#include - -G_BEGIN_DECLS - -#define GCAL_TYPE_ALL_DAY_GRID (gcal_all_day_grid_get_type ()) -#define GCAL_ALL_DAY_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_ALL_DAY_GRID, GcalAllDayGrid)) -#define GCAL_ALL_DAY_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_ALL_DAY_GRID, GcalAllDayGridClass)) -#define GCAL_IS_ALL_DAY_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_ALL_DAY_GRID)) -#define GCAL_IS_ALL_DAY_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_ALL_DAY_GRID)) -#define GCAL_ALL_DAY_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_ALL_DAY_GRID, GcalAllDayGridClass)) - -typedef struct _GcalAllDayGrid GcalAllDayGrid; -typedef struct _GcalAllDayGridClass GcalAllDayGridClass; - -struct _GcalAllDayGrid -{ - GtkContainer parent; -}; - -struct _GcalAllDayGridClass -{ - GtkContainerClass parent_class; - - /* signals */ - void (*marked) (guint start_cell, guint end_cell); -}; - -GType gcal_all_day_grid_get_type (void); - -GtkWidget* gcal_all_day_grid_new (guint columns); - -void gcal_all_day_grid_set_column_headers (GcalAllDayGrid *all_day, - ...); - -void gcal_all_day_grid_place (GcalAllDayGrid *all_day, - GtkWidget *widget, - guint column_idx, - guint column_span); - -GtkWidget* gcal_all_day_grid_get_by_uuid (GcalAllDayGrid *all_day, - const gchar *uuid); - -void gcal_all_day_grid_clear_marks (GcalAllDayGrid *all_day); - -void gcal_all_day_grid_get_cell_position (GcalAllDayGrid *all_day, - guint cell, - gint *x, - gint *y); - -G_END_DECLS - -#endif /* __GCAL_ALL_DAY_GRID_H__ */ diff --git a/src/gcal-day-view.c b/src/gcal-day-view.c deleted file mode 100644 index 626412d6..00000000 --- a/src/gcal-day-view.c +++ /dev/null @@ -1,690 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-day-view.c - * - * Copyright (C) 2013 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "gcal-day-view.h" -#include "gcal-all-day-grid.h" -#include "gcal-days-grid.h" -#include "gcal-viewport.h" -#include "gcal-utils.h" -#include "gcal-view.h" -#include "gcal-event-widget.h" - -#include - -#include - -enum -{ - PROP_0, - PROP_DATE -}; - -typedef struct -{ - /* property */ - icaltimetype *date; - - GtkWidget *viewport; - GtkWidget *fold_button; - - /* events widgets parents */ - GtkWidget *all_day_grid; - GtkWidget *day_grid; -} GcalDayViewPrivate; - -static void viewport_shown (GtkWidget *widget, - gpointer user_data); - -static void days_grid_clicked (GcalDaysGrid *days_grid, - guint start_cell, - guint end_cell, - gpointer user_data); - -static void all_day_grid_clicked (GcalAllDayGrid *all_day_grid, - guint start_cell, - guint end_cell, - gpointer user_data); - -static void gcal_view_interface_init (GcalViewIface *iface); - -static void gcal_day_view_constructed (GObject *object); - -static void gcal_day_view_finalize (GObject *object); - -static void gcal_day_view_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); - -static void gcal_day_view_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); - -static void gcal_day_view_add (GtkContainer *container, - GtkWidget *widget); - -static void gcal_day_view_remove (GtkContainer *container, - GtkWidget *widget); - -static icaltimetype* gcal_day_view_get_initial_date (GcalView *view); - -static icaltimetype* gcal_day_view_get_final_date (GcalView *view); - -static void gcal_day_view_mark_current_unit (GcalView *view, - gint *x, - gint *y); - -static void gcal_day_view_clear_marks (GcalView *view); - -static gchar* gcal_day_view_get_left_header (GcalView *view); - -static gchar* gcal_day_view_get_right_header (GcalView *view); - -static gboolean gcal_day_view_draw_event (GcalView *view, - icaltimetype *start_date, - icaltimetype *end_date); - -static GtkWidget* gcal_day_view_get_by_uuid (GcalView *view, - const gchar *uuid); - -static void gcal_day_view_clear (GcalView *view); - -G_DEFINE_TYPE_WITH_CODE (GcalDayView, - gcal_day_view, - GTK_TYPE_GRID, - G_ADD_PRIVATE (GcalDayView) - G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, - gcal_view_interface_init)); - -static void -viewport_shown (GtkWidget *widget, - gpointer user_data) -{ - GcalDayViewPrivate *priv; - icaltimetype date; - gdouble value; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (user_data)); - - if (priv->date == NULL) - return; - - date = icaltime_current_time_with_zone (priv->date->zone); - - /* FIXME: This isn't working as expected */ - /* - 2.0 is spacing to the let running hour show */ - value = ((gdouble) date.hour - 2.0) / 24.0; - - g_debug ("Getting into here, with value: %f", value); - gcal_viewport_scroll_to (GCAL_VIEWPORT (priv->viewport), value); -} - -static void -days_grid_clicked (GcalDaysGrid *days_grid, - guint start_cell, - guint end_cell, - gpointer user_data) -{ - GcalDayViewPrivate *priv; - - icaltimetype *start_date; - icaltimetype *end_date; - - gint x, y; - gint new_x, new_y; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (user_data)); - - g_debug ("Cells positions: %d, %d", start_cell, end_cell); - - start_date = gcal_dup_icaltime (priv->date); - end_date = gcal_dup_icaltime (priv->date); - - start_date->hour = start_cell / 2; - start_date->minute = 0; - start_date->second = 0; - *start_date = icaltime_normalize (*start_date); - if (start_cell % 2 == 1) - start_date->minute = 30; - - end_date->hour = end_cell / 2; - end_date->minute = 0; - end_date->second = 0; - if (end_cell % 2 == 1) - end_date->hour++; - else - end_date->minute = 30; - *end_date = icaltime_normalize (*end_date); - - gcal_days_grid_get_cell_position (GCAL_DAYS_GRID (priv->day_grid), - start_cell, &x, &y); - g_debug ("Click Position: %d, %d", x, y); - - gtk_widget_translate_coordinates (priv->day_grid, - GTK_WIDGET (user_data), - x, y, - &new_x, &new_y); - g_debug ("Translated Click Position: %d, %d", new_x, new_y); - - g_signal_emit_by_name (GCAL_VIEW (user_data), - "create-event", - start_date, end_date, - (gdouble) new_x, (gdouble) new_y); - - g_free (start_date); - g_free (end_date); -} - -static void -all_day_grid_clicked (GcalAllDayGrid *all_day_grid, - guint start_cell, - guint end_cell, - gpointer user_data) -{ - GcalDayViewPrivate *priv; - - icaltimetype *start_date; - icaltimetype *end_date; - - gint x, y; - gint new_x, new_y; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (user_data)); - - g_debug ("Receiving marked signal in day-view from all-day-grid"); - g_debug ("Cells positions: %d, %d", start_cell, end_cell); - - start_date = gcal_dup_icaltime (priv->date); - end_date = gcal_dup_icaltime (priv->date); - - start_date->is_date = 1; - end_date->is_date = 1; - - if (start_cell != end_cell) - { - end_date->day++; - *end_date = icaltime_normalize (*end_date); - } - else if (start_cell == 1) - { - start_date->day++; - *start_date = icaltime_normalize (*start_date); - end_date->day++; - *end_date = icaltime_normalize (*end_date); - } - - gcal_all_day_grid_get_cell_position (GCAL_ALL_DAY_GRID (priv->all_day_grid), - start_cell, &x, &y); - g_debug ("Click Position: %d, %d", x, y); - - gtk_widget_translate_coordinates (priv->all_day_grid, - GTK_WIDGET (user_data), - x, y, - &new_x, &new_y); - g_debug ("Translated Click Position: %d, %d", new_x, new_y); - - g_signal_emit_by_name (GCAL_VIEW (user_data), - "create-event", - start_date, end_date, - (gdouble) new_x, (gdouble) new_y); - - g_debug ("start_date: %s", icaltime_as_ical_string (*start_date)); - g_debug ("end_date: %s", icaltime_as_ical_string (*end_date)); - - g_free (start_date); - g_free (end_date); -} - -static void -gcal_day_view_class_init (GcalDayViewClass *klass) -{ - GObjectClass *object_class; - GtkContainerClass *container_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->constructed = gcal_day_view_constructed; - object_class->finalize = gcal_day_view_finalize; - object_class->set_property = gcal_day_view_set_property; - object_class->get_property = gcal_day_view_get_property; - - container_class = GTK_CONTAINER_CLASS (klass); - container_class->add = gcal_day_view_add; - container_class->remove = gcal_day_view_remove; - /* FIXME: Uncomment stuff here */ - /* gtk_container_class_handle_border_width (container_class); */ - - g_object_class_override_property (object_class, PROP_DATE, "active-date"); -} - -static void -gcal_day_view_init (GcalDayView *self) -{ -} - -static void -gcal_view_interface_init (GcalViewIface *iface) -{ - /* New API */ - iface->get_initial_date = gcal_day_view_get_initial_date; - iface->get_final_date = gcal_day_view_get_final_date; - - iface->mark_current_unit = gcal_day_view_mark_current_unit; - iface->clear_marks = gcal_day_view_clear_marks; - - iface->get_left_header = gcal_day_view_get_left_header; - iface->get_right_header = gcal_day_view_get_right_header; - - iface->draw_event = gcal_day_view_draw_event; - iface->get_by_uuid = gcal_day_view_get_by_uuid; - iface->clear = gcal_day_view_clear; -} - -static void -gcal_day_view_constructed (GObject *object) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (object)); - - if (G_OBJECT_CLASS (gcal_day_view_parent_class)->constructed != NULL) - G_OBJECT_CLASS (gcal_day_view_parent_class)->constructed (object); - - priv->fold_button = gtk_button_new_with_label (_("Fold")); - g_object_set (priv->fold_button, - "valign", GTK_ALIGN_END, - "margin", 6, - NULL); - gtk_style_context_add_class ( - gtk_widget_get_style_context (priv->fold_button), - "nav-button"); - gtk_grid_attach (GTK_GRID (object), priv->fold_button, 0, 0, 1, 1); - - /* event widget holders */ - priv->all_day_grid = gcal_all_day_grid_new (2); - gcal_all_day_grid_set_column_headers (GCAL_ALL_DAY_GRID (priv->all_day_grid), - _("Today"), - _("Tomorrow")); - gtk_widget_set_size_request (priv->all_day_grid, -1, 64); - gtk_widget_set_hexpand (priv->all_day_grid, TRUE); - - priv->day_grid = gcal_days_grid_new (2); - gcal_days_grid_set_preferred_cell_height (GCAL_DAYS_GRID (priv->day_grid), 60); - - gtk_widget_set_hexpand (priv->day_grid, TRUE); - gtk_widget_set_vexpand (priv->day_grid, TRUE); - - gtk_grid_attach (GTK_GRID (object), priv->all_day_grid, 1, 0, 1, 1); - - priv->viewport = gcal_viewport_new (); - gcal_viewport_add (GCAL_VIEWPORT (priv->viewport), priv->day_grid); - gtk_grid_attach (GTK_GRID (object), priv->viewport, 0, 1, 2, 1); - - /* binding sizes */ - gtk_widget_set_size_request ( - priv->fold_button, - gcal_days_grid_get_scale_width (GCAL_DAYS_GRID (priv->day_grid)) - 12, - -1); - - gtk_widget_show_all (GTK_WIDGET (object)); - - /* signal handling */ - g_signal_connect_after (object, "map", G_CALLBACK (viewport_shown), object); - g_signal_connect (priv->day_grid, "marked", - G_CALLBACK (days_grid_clicked), object); - g_signal_connect (priv->all_day_grid, "marked", - G_CALLBACK (all_day_grid_clicked), object); -} - -static void -gcal_day_view_finalize (GObject *object) -{ - GcalDayViewPrivate *priv; - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (object)); - - if (priv->date != NULL) - g_free (priv->date); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (gcal_day_view_parent_class)->finalize (object); -} - -static void -gcal_day_view_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (object)); - - switch (property_id) - { - case PROP_DATE: - if (priv->date != NULL) - g_free (priv->date); - - priv->date = g_value_dup_boxed (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gcal_day_view_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (object)); - - switch (property_id) - { - case PROP_DATE: - g_value_set_boxed (value, priv->date); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -/* GtkContainer API */ -static void -gcal_day_view_add (GtkContainer *container, - GtkWidget *widget) -{ - GcalDayViewPrivate *priv; - icaltimetype *tomorrow; - icaltimetype *dt_start; - icaltimetype *dt_end; - gchar* summ; - - g_return_if_fail (GCAL_IS_EVENT_WIDGET (widget)); - g_return_if_fail (gtk_widget_get_parent (widget) == NULL); - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (container)); - - summ = gcal_event_widget_get_summary (GCAL_EVENT_WIDGET (widget)); - - tomorrow = gcal_day_view_get_final_date (GCAL_VIEW (container)); - dt_start = gcal_event_widget_get_date (GCAL_EVENT_WIDGET (widget)); - dt_end = gcal_event_widget_get_end_date (GCAL_EVENT_WIDGET (widget)); - - /* FIXME: recheck conditions to add, what, where */ - /* Maybe, should be good to add, inside days views only contained events */ - g_debug ("[processing] %s from %s to %s", - summ, - icaltime_as_ical_string (*dt_start), - icaltime_as_ical_string (*dt_end)); - - if (! gcal_event_widget_get_all_day (GCAL_EVENT_WIDGET (widget)) && - (dt_start->day == dt_end->day) && - (dt_start->day == priv->date->day || - dt_start->day == tomorrow->day)) - { - g_debug ("[days-grid] %s from %s to %s", - summ, - icaltime_as_ical_string (*dt_start), - icaltime_as_ical_string (*dt_end)); - - gcal_days_grid_place (GCAL_DAYS_GRID (priv->day_grid), - widget, - priv->date->day == dt_start->day ? 0 : 1, - dt_start->hour * 2 + (dt_start->minute / 30), - dt_end->hour * 2 + (dt_end->minute / 30)); /* FIXME Include half hour and length */ - } - else - { - gboolean start_tomorrow; - guint length; - g_debug ("[all-day-grid] %s from %s to %s", - summ, - icaltime_as_ical_string (*dt_start), - icaltime_as_ical_string (*dt_end)); - start_tomorrow = icaltime_compare_date_only (*dt_start, *tomorrow) == 0; - - if (start_tomorrow) - length = 1; - else if (dt_start->day != dt_end->day) - length = 2; - else - length = 1; - gcal_all_day_grid_place (GCAL_ALL_DAY_GRID (priv->all_day_grid), - widget, - start_tomorrow ? 1 : 0, length); - } - - g_free (tomorrow); - g_free (dt_start); - g_free (dt_end); - g_free (summ); -} - -static void -gcal_day_view_remove (GtkContainer *container, - GtkWidget *widget) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (container)); - - if (gtk_widget_get_parent (widget) == (GtkWidget*) container) - { - GTK_CONTAINER_CLASS (gcal_day_view_parent_class)->remove (container, - widget); - } - else - { - gtk_container_remove (GTK_CONTAINER (priv->all_day_grid), widget); - gtk_container_remove (GTK_CONTAINER (priv->day_grid), widget); - } -} - -/* GcalView API */ -static icaltimetype* -gcal_day_view_get_initial_date (GcalView *view) -{ - GcalDayViewPrivate *priv; - icaltimetype *new_date; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - new_date = g_new0 (icaltimetype, 1); - *new_date = *(priv->date); - new_date->hour = 0; - new_date->minute = 0; - new_date->second = 0; - - return new_date; -} - -/** - * gcal_day_view_get_final_date: - * @view: a #GcalDayView - * - * Returns the date of "tomorrow" at 23:59 - * - * Returns: - **/ -static icaltimetype* -gcal_day_view_get_final_date (GcalView *view) -{ - GcalDayViewPrivate *priv; - icaltimetype *new_date; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - new_date = g_new0 (icaltimetype, 1); - *new_date = *(priv->date); - - icaltime_adjust (new_date, 1, 0, 0, 0); - - new_date->hour = 23; - new_date->minute = 59; - new_date->second = 59; - - return new_date; -} - -static void -gcal_day_view_mark_current_unit (GcalView *view, - gint *x, - gint *y) -{ - GcalDayViewPrivate *priv; - - guint cell; - gint orig_x, orig_y; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - - cell = priv->date->hour * 2 + (priv->date->minute / 30); - gcal_days_grid_mark_cell (GCAL_DAYS_GRID (priv->day_grid), cell); - gcal_days_grid_get_cell_position (GCAL_DAYS_GRID (priv->day_grid), - cell, &orig_x, &orig_y); - g_debug ("Click Position: %d, %d", orig_x, orig_y); - - gtk_widget_translate_coordinates (priv->day_grid, - GTK_WIDGET (view), - orig_x, orig_y, - x, y); - g_debug ("Translated Click Position: %d, %d", *x, *y); -} - -static void -gcal_day_view_clear_marks (GcalView *view) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - gcal_days_grid_clear_marks (GCAL_DAYS_GRID (priv->day_grid)); - gcal_all_day_grid_clear_marks (GCAL_ALL_DAY_GRID (priv->all_day_grid)); -} - -static gchar* -gcal_day_view_get_left_header (GcalView *view) -{ - GcalDayViewPrivate *priv; - - gchar str_date[64]; - - struct tm tm_date; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - - tm_date = icaltimetype_to_tm (priv->date); - e_utf8_strftime_fix_am_pm (str_date, 64, "%A %B", &tm_date); - - return g_strdup_printf ("%s, %d", str_date, priv->date->day); -} - -static gchar* -gcal_day_view_get_right_header (GcalView *view) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - - return g_strdup_printf ("%d", priv->date->year); -} - -static gboolean -gcal_day_view_draw_event (GcalView *view, - icaltimetype *start_date, - icaltimetype *end_date) -{ - GcalDayViewPrivate *priv; - - icaltimetype *first_day; - icaltimetype *last_day; - gint left_boundary; - gint right_boundary; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - first_day = gcal_day_view_get_initial_date (view); - last_day = gcal_day_view_get_final_date (view); - - if (priv->date == NULL) - return FALSE; - - /* XXX: Check for date_only comparison since might drop timezone info */ - left_boundary = icaltime_compare_date_only (*end_date, *first_day); - right_boundary = icaltime_compare_date_only (*last_day, *start_date); - - if (left_boundary == -1 || right_boundary == -1) - return FALSE; - - return TRUE; -} - -static GtkWidget* -gcal_day_view_get_by_uuid (GcalView *view, - const gchar *uuid) -{ - GcalDayViewPrivate *priv; - GtkWidget *widget; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - - widget = - gcal_all_day_grid_get_by_uuid (GCAL_ALL_DAY_GRID (priv->all_day_grid), - uuid); - if (widget != NULL) - return widget; - - widget = - gcal_days_grid_get_by_uuid (GCAL_DAYS_GRID (priv->day_grid), - uuid); - if (widget != NULL) - return widget; - - return NULL; -} - -static void -gcal_day_view_clear (GcalView *view) -{ - GcalDayViewPrivate *priv; - - priv = gcal_day_view_get_instance_private (GCAL_DAY_VIEW (view)); - - gtk_container_foreach (GTK_CONTAINER (priv->all_day_grid), - (GtkCallback) gtk_widget_destroy, NULL); - gtk_container_foreach (GTK_CONTAINER (priv->day_grid), - (GtkCallback) gtk_widget_destroy, NULL); -} - -/* Public API */ -/** - * gcal_day_view_new: - * @date: - * - * Since: 0.1 - * Return value: A new #GcalDayView - * Returns: (transfer full): - **/ -GtkWidget* -gcal_day_view_new (void) -{ - return g_object_new (GCAL_TYPE_DAY_VIEW, NULL); -} diff --git a/src/gcal-day-view.h b/src/gcal-day-view.h deleted file mode 100644 index c564cd32..00000000 --- a/src/gcal-day-view.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * gcal-day-view.h - * - * Copyright (C) 2013 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __GCAL_DAY_VIEW_H__ -#define __GCAL_DAY_VIEW_H__ - -#include - -G_BEGIN_DECLS - -#define GCAL_TYPE_DAY_VIEW (gcal_day_view_get_type ()) -#define GCAL_DAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_DAY_VIEW, GcalDayView)) -#define GCAL_DAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_DAY_VIEW, GcalDayViewClass)) -#define GCAL_IS_DAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_DAY_VIEW)) -#define GCAL_IS_DAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_DAY_VIEW)) -#define GCAL_DAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_DAY_VIEW, GcalDayViewClass)) - -typedef struct _GcalDayView GcalDayView; -typedef struct _GcalDayViewClass GcalDayViewClass; - -struct _GcalDayView -{ - GtkGrid parent; -}; - -struct _GcalDayViewClass -{ - GtkGridClass parent_class; -}; - -GType gcal_day_view_get_type (void); - -GtkWidget* gcal_day_view_new (void); - -G_END_DECLS - -#endif /* __GCAL_DAY_VIEW_H__ */ diff --git a/src/gcal-days-grid.c b/src/gcal-days-grid.c deleted file mode 100644 index b48acf8a..00000000 --- a/src/gcal-days-grid.c +++ /dev/null @@ -1,1178 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-days-grid.c - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "gcal-days-grid.h" -#include "gcal-event-widget.h" - -#include - -#include -#include - -/* - * Notes: - * 1. the widget's height is divided between 48 cells - * representing each a half-hour of the day. - * the preferred value of the cell is kept is req_cell_heigth - * private field. - */ - -static const double dashed [] = -{ - 1.0, - 1.0 -}; - -enum -{ - PROP_0, - PROP_COLUMNS, - PROP_FOLDED -}; - -struct _ChildInfo -{ - GtkWidget *widget; - - guint start_cell; - guint end_cell; - guint sub_column; - - gboolean hidden; -}; - -typedef struct _ChildInfo ChildInfo; - -typedef struct -{ - /* property */ - guint columns_nr; - guint spacing; - gboolean folded; - - guint scale_width; - guint req_cell_height; - - GList *children; - - GdkWindow *event_window; - - /* button_down/up flags */ - gint clicked_cell; - gint start_mark_cell; - gint end_mark_cell; - -} GcalDaysGridPrivate; - -enum -{ - MARKED, - NUM_SIGNALS -}; - -static guint signals[NUM_SIGNALS] = { 0, }; - -/* Helpers and private */ -static gint compare_child_info (gconstpointer a, - gconstpointer b); - -static void gcal_days_grid_finalize (GObject *object); - -static void gcal_days_grid_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); - -static void gcal_days_grid_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); - -static void gcal_days_grid_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); - -static void gcal_days_grid_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); - -static void gcal_days_grid_realize (GtkWidget *widget); - -static void gcal_days_grid_unrealize (GtkWidget *widget); - -static void gcal_days_grid_map (GtkWidget *widget); - -static void gcal_days_grid_unmap (GtkWidget *widget); - -static void gcal_days_grid_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - -static gboolean gcal_days_grid_draw (GtkWidget *widget, - cairo_t *cr); - -static gboolean gcal_days_grid_button_press_event (GtkWidget *widget, - GdkEventButton *event); - -static gboolean gcal_days_grid_motion_notify_event (GtkWidget *widget, - GdkEventMotion *event); - -static gboolean gcal_days_grid_button_release_event (GtkWidget *widget, - GdkEventButton *event); - -static void gcal_days_grid_add (GtkContainer *container, - GtkWidget *widget); - -static void gcal_days_grid_remove (GtkContainer *container, - GtkWidget *widget); - -static void gcal_days_grid_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - - -G_DEFINE_TYPE_WITH_PRIVATE (GcalDaysGrid,gcal_days_grid, GTK_TYPE_CONTAINER); - -/* Helpers and private */ -static gint -compare_child_info (gconstpointer a, - gconstpointer b) -{ - ChildInfo *ac = (ChildInfo*) a; - ChildInfo *bc = (ChildInfo*) b; - - if (ac->start_cell < bc->start_cell) - return -1; - else if (ac->start_cell == bc->start_cell) - return 0; - else - return 1; -} - - -static void -gcal_days_grid_class_init (GcalDaysGridClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = gcal_days_grid_finalize; - object_class->set_property = gcal_days_grid_set_property; - object_class->get_property = gcal_days_grid_get_property; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->get_preferred_width = gcal_days_grid_get_preferred_width; - widget_class->get_preferred_height = gcal_days_grid_get_preferred_height; - widget_class->realize = gcal_days_grid_realize; - widget_class->unrealize = gcal_days_grid_unrealize; - widget_class->map = gcal_days_grid_map; - widget_class->unmap = gcal_days_grid_unmap; - widget_class->size_allocate = gcal_days_grid_size_allocate; - widget_class->draw = gcal_days_grid_draw; - widget_class->button_press_event = gcal_days_grid_button_press_event; - widget_class->motion_notify_event = gcal_days_grid_motion_notify_event; - widget_class->button_release_event = gcal_days_grid_button_release_event; - - container_class = GTK_CONTAINER_CLASS (klass); - container_class->add = gcal_days_grid_add; - container_class->remove = gcal_days_grid_remove; - container_class->forall = gcal_days_grid_forall; - gtk_container_class_handle_border_width (container_class); - - g_object_class_install_property ( - object_class, - PROP_COLUMNS, - g_param_spec_uint ("columns", - "Columns", - "The number of columns in which to split the grid", - 0, - G_MAXUINT, - 0, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_FOLDED, - g_param_spec_boolean ("folded", - "Folded status", - "Whether the view is folded or not", - FALSE, - G_PARAM_CONSTRUCT | - G_PARAM_READWRITE)); - - /* comunicate to its parent view the marking */ - signals[MARKED] = g_signal_new ("marked", - GCAL_TYPE_DAYS_GRID, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcalDaysGridClass, - marked), - NULL, NULL, NULL, - G_TYPE_NONE, - 2, - G_TYPE_UINT, - G_TYPE_UINT); -} - - - -static void -gcal_days_grid_init (GcalDaysGrid *self) -{ - GcalDaysGridPrivate *priv; - - gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); - - priv = gcal_days_grid_get_instance_private (self); - priv->scale_width = 0; - priv->req_cell_height = 0; - - priv->children = NULL; - - priv->clicked_cell = -1; - priv->start_mark_cell = -1; - priv->end_mark_cell = -1; - - gtk_style_context_add_class ( - gtk_widget_get_style_context (GTK_WIDGET (self)), - "calendar-view"); -} - -static void -gcal_days_grid_finalize (GObject *object) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (object)); - - if (priv->children != NULL) - g_list_free_full (priv->children, (GDestroyNotify) g_list_free); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (gcal_days_grid_parent_class)->finalize (object); -} - -static void -gcal_days_grid_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (object)); - - switch (property_id) - { - case PROP_COLUMNS: - { - gint i; - priv->columns_nr = g_value_get_uint (value); - for (i = 0; i < priv->columns_nr; ++i) - { - priv->children = g_list_prepend (priv->children, NULL); - } - break; - } - case PROP_FOLDED: - priv->folded = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gcal_days_grid_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (object)); - - switch (property_id) - { - case PROP_COLUMNS: - g_value_set_uint (value, priv->columns_nr); - break; - case PROP_FOLDED: - g_value_set_boolean (value, priv->folded); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -/* GtkWidget API */ -static void -gcal_days_grid_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GcalDaysGridPrivate* priv; - - GList *columns; - - gint nat_keeper; - gint nat_width; - - gint min_keeper; - gint min_width; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - gcal_days_grid_get_scale_width (GCAL_DAYS_GRID (widget)); - - nat_keeper = 0; - min_keeper = G_MAXINT; - - for (columns = priv->children; - columns != NULL; - columns = g_list_next (columns)) - { - GList *column; - - column = (GList*) columns->data; - while (column) - { - ChildInfo *info = (ChildInfo*) column->data; - column = column->next; - - gtk_widget_get_preferred_width (info->widget, &min_width, &nat_width); - if (nat_keeper < nat_width) - nat_keeper = nat_width; - if (min_keeper > min_width) - min_keeper = min_width; - } - } - - if (min_keeper == G_MAXINT) - min_keeper = 0; - - if (minimum != NULL) - { - *minimum = (priv->columns_nr * min_keeper) + priv->scale_width; - } - if (natural != NULL) - { - *natural = (priv->columns_nr * nat_keeper) + priv->scale_width; - } -} - -static void -gcal_days_grid_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GcalDaysGridPrivate* priv; - - GtkBorder padding; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - if (minimum != NULL) - { - *minimum = priv->req_cell_height * 48 + padding.top + padding.bottom; - } - if (natural != NULL) - { - *natural = priv->req_cell_height * 48 + padding.top + padding.bottom; - } -} - -static void -gcal_days_grid_realize (GtkWidget *widget) -{ - GcalDaysGridPrivate *priv; - GdkWindow *parent_window; - GdkWindowAttr attributes; - gint attributes_mask; - GtkAllocation allocation; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - gtk_widget_set_realized (widget, TRUE); - - parent_window = gtk_widget_get_parent_window (widget); - gtk_widget_set_window (widget, parent_window); - g_object_ref (parent_window); - - gtk_widget_get_allocation (widget, &allocation); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_ONLY; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.width = allocation.width; - attributes.height = allocation.height; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK | - GDK_POINTER_MOTION_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y; - - priv->event_window = gdk_window_new (parent_window, - &attributes, - attributes_mask); - gdk_window_set_user_data (priv->event_window, widget); -} - -static void -gcal_days_grid_unrealize (GtkWidget *widget) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - if (priv->event_window != NULL) - { - gdk_window_set_user_data (priv->event_window, NULL); - gdk_window_destroy (priv->event_window); - priv->event_window = NULL; - } - - GTK_WIDGET_CLASS (gcal_days_grid_parent_class)->unrealize (widget); -} - -static void -gcal_days_grid_map (GtkWidget *widget) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - if (priv->event_window != NULL) - gdk_window_show (priv->event_window); - - GTK_WIDGET_CLASS (gcal_days_grid_parent_class)->map (widget); -} - -static void -gcal_days_grid_unmap (GtkWidget *widget) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - if (priv->event_window != NULL) - gdk_window_hide (priv->event_window); - - GTK_WIDGET_CLASS (gcal_days_grid_parent_class)->unmap (widget); -} - -static void -gcal_days_grid_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GcalDaysGridPrivate *priv; - - GtkBorder padding; - gint width_block; - gint height_block; - - GList *columns; - gint idx; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - gtk_widget_set_allocation (widget, allocation); - - /* Placing the event_window */ - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (priv->event_window, - allocation->x, - allocation->y, - allocation->width, - allocation->height); - } - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - width_block = (allocation->width - priv->scale_width) / priv->columns_nr; - height_block = (allocation->height - (padding.top + padding.bottom)) / 48; - - /* detecting columns and allocs */ - for (columns = priv->children, idx = 0; - columns != NULL; - columns = g_list_next (columns), ++idx) - { - GtkAllocation child_allocation; - GArray *last_y; - GList* column = (GList*) columns->data; - - /* last_y value for each column, - will keep the amount of columns as well */ - last_y = g_array_new (FALSE, FALSE, sizeof (guint)); - - /* going through widgets */ - for (;column != NULL; column = g_list_next (column)) - { - ChildInfo *info; - gboolean new_column = TRUE; - gint i; - - info = (ChildInfo*) column->data; - - for (i = 0; i < last_y->len; ++i) - { - /* start before */ - if (info->start_cell > g_array_index (last_y, guint, i)) - { - info->sub_column = i; - new_column = FALSE; - break; - } - } - - if (new_column) - { - /* adding column to array */ - g_array_append_val (last_y, info->end_cell); - info->sub_column = last_y->len - 1; - } - else - { - g_array_index (last_y, guint, info->sub_column) = info->end_cell; - } - } - - /* allocating */ - for (column = (GList*) columns->data; - column != NULL; - column = g_list_next (column)) - { - ChildInfo *info; - guint sub_column_block; - - info = (ChildInfo*) column->data; - sub_column_block = width_block / last_y->len; - - child_allocation.x = allocation->x + priv->scale_width + - idx * width_block + sub_column_block * info->sub_column; - child_allocation.y = info->start_cell * height_block; - child_allocation.width = sub_column_block; - child_allocation.height = (info->end_cell - info->start_cell) * height_block; - - gtk_widget_size_allocate (info->widget, &child_allocation); - } - - g_array_free (last_y, TRUE); - } -} - -static gboolean -gcal_days_grid_draw (GtkWidget *widget, - cairo_t *cr) -{ - GcalDaysGridPrivate *priv; - - GtkBorder padding; - GtkAllocation alloc; - gint width; - - GdkRGBA ligther_color; - GdkRGBA background_selected_color; - GdkRGBA font_color; - - PangoLayout *layout; - PangoFontDescription *font_desc; - - gint i; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - gtk_widget_get_allocation (widget, &alloc); - width = alloc.width - (priv->scale_width); - - gtk_style_context_get_color ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &font_color); - - gtk_style_context_get_color ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget) | GTK_STATE_FLAG_INSENSITIVE, - &ligther_color); - - gtk_style_context_get ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - "font", &font_desc, NULL); - - cairo_save (cr); - - /* drawing text of the sidebar */ - layout = pango_cairo_create_layout (cr); - pango_layout_set_font_description (layout, font_desc); - - cairo_set_source_rgb (cr, - font_color.red, - font_color.green, - font_color.blue); - - for (i = 0; i < 24; i++) - { - gchar *hours; - hours = g_strdup_printf ("%d:00 %s", i % 12, i < 12 ? _("AM") : _("PM")); - - if (i == 0) - pango_layout_set_text (layout, _("Midnight"), -1); - else if (i == 12) - pango_layout_set_text (layout, _("Noon"), -1); - else - pango_layout_set_text (layout, hours, -1); - - pango_cairo_update_layout (cr, layout); - cairo_move_to (cr, - padding.left, - padding.top + (alloc.height / 24) * i); - pango_cairo_show_layout (cr, layout); - - g_free (hours); - } - - /* drawing new-event mark */ - if (priv->start_mark_cell != -1 && - priv->end_mark_cell != -1) - { - gint first_cell; - gint last_cell; - gint columns; - - gtk_style_context_get_background_color ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget) | GTK_STATE_FLAG_SELECTED, - &background_selected_color); - - if (priv->start_mark_cell < priv->end_mark_cell) - { - first_cell = priv->start_mark_cell; - last_cell = priv->end_mark_cell; - } - else - { - first_cell = priv->end_mark_cell; - last_cell = priv->start_mark_cell; - } - - cairo_save (cr); - cairo_set_source_rgba (cr, - background_selected_color.red, - background_selected_color.green, - background_selected_color.blue, - background_selected_color.alpha); - - for (columns = 0; columns < last_cell / 48 - first_cell / 48 + 1; columns++) - { - gint first_point; - gint last_point; - - first_point = (columns == 0) ? first_cell : ((first_cell / 48) + columns) * 48; - last_point = (columns == (last_cell / 48 - first_cell / 48)) ? last_cell : ((first_cell / 48) + columns) * 48 + 47; - - cairo_rectangle (cr, - priv->scale_width + (width / priv->columns_nr) * (first_point / 48), - (first_point % 48) * (alloc.height / 48), - (width / priv->columns_nr), - (last_point - first_point + 1) * (alloc.height / 48)); - cairo_fill (cr); - - } - cairo_restore (cr); - } - - /* drawing lines */ - cairo_set_source_rgb (cr, - ligther_color.red, - ligther_color.green, - ligther_color.blue); - cairo_set_line_width (cr, 0.3); - - /* grid, vertical lines first */ - for (i = 0; i < priv->columns_nr + 1; i++) - { - cairo_move_to (cr, - priv->scale_width + (width / priv->columns_nr) * i + 0.4, - 0); - cairo_rel_line_to (cr, 0, alloc.height); - } - - /* rest of the lines */ - for (i = 0; i < 24; i++) - { - /* hours lines */ - cairo_move_to (cr, 0, (alloc.height / 24) * i + 0.4); - cairo_rel_line_to (cr, width + priv->scale_width, 0); - } - - cairo_stroke (cr); - - /* 30 minutes lines */ - cairo_set_dash (cr, dashed, 2, 0); - for (i = 0; i < 24; i++) - { - cairo_move_to (cr, priv->scale_width, (alloc.height / 24) * i + (alloc.height / 48) + 0.4); - cairo_rel_line_to (cr, width + priv->scale_width, 0); - } - - cairo_stroke (cr); - cairo_restore (cr); - - pango_font_description_free (font_desc); - g_object_unref (layout); - - /* drawing children */ - if (GTK_WIDGET_CLASS (gcal_days_grid_parent_class)->draw != NULL) - GTK_WIDGET_CLASS (gcal_days_grid_parent_class)->draw (widget, cr); - - return FALSE; -} - -static gboolean -gcal_days_grid_button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalDaysGridPrivate *priv; - - GtkBorder padding; - GtkAllocation alloc; - gint width_block; - gint height_block; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - /* XXX: an improvement will be scroll to that position when - click the scale at the side */ - if (event->x < priv->scale_width) - return FALSE; - - gtk_widget_get_allocation (widget, &alloc); - width_block = (alloc.width - priv->scale_width) / priv->columns_nr; - height_block = (alloc.height - (padding.top + padding.bottom)) / 48; - - priv->clicked_cell = 48 * (((gint) event->x - priv->scale_width) / width_block) + event->y / height_block; - priv->start_mark_cell = priv->clicked_cell; - - return TRUE; -} - -static gboolean -gcal_days_grid_motion_notify_event (GtkWidget *widget, - GdkEventMotion *event) -{ - GcalDaysGridPrivate *priv; - - GtkBorder padding; - GtkAllocation alloc; - gint width_block; - gint height_block; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - if (priv->clicked_cell == -1) - return FALSE; - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - gtk_widget_get_allocation (widget, &alloc); - width_block = (alloc.width - priv->scale_width) / priv->columns_nr; - height_block = (alloc.height - (padding.top + padding.bottom)) / 48; - - priv->end_mark_cell = 48 * (((gint) event->x - priv->scale_width) / width_block) + event->y / height_block; - - gtk_widget_queue_draw (widget); - return TRUE; -} - -static gboolean -gcal_days_grid_button_release_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalDaysGridPrivate *priv; - - GtkBorder padding; - GtkAllocation alloc; - gint width_block; - gint height_block; - - gint cell_temp; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (widget)); - - if (priv->clicked_cell == -1) - return FALSE; - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - if (event->x < priv->scale_width) - { - priv->start_mark_cell = -1; - priv->end_mark_cell = -1; - return FALSE; - } - - gtk_widget_get_allocation (widget, &alloc); - width_block = (alloc.width - priv->scale_width) / priv->columns_nr; - height_block = (alloc.height - (padding.top + padding.bottom)) / 48; - - priv->end_mark_cell = 48 * (((gint) event->x - priv->scale_width) / width_block) + event->y / height_block; - - gtk_widget_queue_draw (widget); - - if (priv->start_mark_cell > priv->end_mark_cell) - { - cell_temp = priv->end_mark_cell; - priv->end_mark_cell = priv->start_mark_cell; - priv->start_mark_cell = cell_temp; - } - - g_signal_emit (GCAL_DAYS_GRID (widget), - signals[MARKED], 0, - priv->start_mark_cell, priv->end_mark_cell); - - priv->clicked_cell = -1; - return TRUE; -} - -/* GtkContainer API */ -/** - * gcal_days_grid_add: - * @container: - * @widget: - * - * @gtk_container_add implementation. It assumes the widget will go - * to the first column. If there's no column set, will set columns to 1 - * - **/ -static void -gcal_days_grid_add (GtkContainer *container, - GtkWidget *widget) -{ - GcalDaysGridPrivate* priv; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (container)); - g_return_if_fail (priv->columns_nr != 0); - - gcal_days_grid_place (GCAL_DAYS_GRID (container), - widget, - 0, 0, 0); -} - -static void -gcal_days_grid_remove (GtkContainer *container, - GtkWidget *widget) -{ - GcalDaysGridPrivate *priv; - - GList *columns; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (container)); - - for (columns = priv->children; - columns != NULL; - columns = g_list_next (columns)) - { - GList* column = (GList*) columns->data; - for (;column != NULL; column = g_list_next (column)) - { - ChildInfo *info = (ChildInfo*) column->data; - if (widget == info->widget) - { - GList* orig = (GList*) columns->data; - orig = g_list_delete_link (orig, column); - - gtk_widget_unparent (widget); - - columns->data = orig; - - columns = NULL; - break; - } - } - } -} - -static void -gcal_days_grid_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GcalDaysGridPrivate *priv; - - GList* columns; - - priv = gcal_days_grid_get_instance_private (GCAL_DAYS_GRID (container)); - - columns = priv->children; - while (columns) - { - GList *column; - - column = columns->data; - columns = columns->next; - - while (column) - { - ChildInfo *info = (ChildInfo*) column->data; - column = column->next; - - (* callback) (info->widget, callback_data); - } - } -} - -/* Public API */ -/** - * gcal_days_grid_new: - * - * Since: 0.1 - * Return value: A new #GcalDaysGrid - * Returns: (transfer full): - **/ -GtkWidget* -gcal_days_grid_new (guint columns) -{ - return g_object_new (GCAL_TYPE_DAYS_GRID, "columns", columns, NULL); -} - -void -gcal_days_grid_set_preferred_cell_height (GcalDaysGrid *days_grid, - guint cell_height) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (days_grid); - - priv->req_cell_height = cell_height; -} - -/** - * gcal_days_grid_get_scale_width: - * @days_grid: a #GcalDaysGrid widget - * - * Retrieve the size of the scale in the left size - * of the widget. The value is calculated the first - * time the function is called. After that, the value - * is cached internally. - * - * Returns: the size of the scale - **/ -guint -gcal_days_grid_get_scale_width (GcalDaysGrid *days_grid) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (days_grid); - - if (priv->scale_width == 0) - { - GtkWidget *widget; - - GtkBorder padding; - PangoLayout *layout; - PangoFontDescription *font_desc; - - gint mid_width; - - widget = GTK_WIDGET (days_grid); - - gtk_style_context_get_padding (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - layout = gtk_widget_create_pango_layout (widget, "00:00 0000"); - gtk_style_context_get (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - "font", &font_desc, - NULL); - pango_layout_set_font_description (layout, font_desc); - - pango_layout_get_pixel_size (layout, &mid_width, NULL); - - priv->scale_width = mid_width + padding.left + padding.right; - - pango_font_description_free (font_desc); - g_object_unref (layout); - } - - return priv->scale_width; -} - -/** - * gcal_days_grid_place: - * @days_grid: a #GcalDaysGrid widget - * @widget: the child widget to add - * @column_idx: the index of the column, starting with zero - * @start_cell: the start-cell, refering the hour, starting with zero - * @end_cell: the end-cell, refering the hour, starting with zero - * - * Adding a widget to a specified column. If the column index - * is bigger than the #GcalDaysGrid:columns property set, - * it will do nothing. - **/ -void -gcal_days_grid_place (GcalDaysGrid *days_grid, - GtkWidget *widget, - guint column_idx, - guint start_cell, - guint end_cell) -{ - GcalDaysGridPrivate *priv; - GList* children_link; - GList* column; - ChildInfo *info; - - priv = gcal_days_grid_get_instance_private (days_grid); - - g_return_if_fail (column_idx < priv->columns_nr); - - children_link = g_list_nth (priv->children, column_idx); - column = (GList*) children_link->data; - - info = g_new0 (ChildInfo, 1); - info->widget = widget; - info->hidden = FALSE; - info->start_cell = start_cell; - info->end_cell = end_cell == 0 ? start_cell + 1 : end_cell; - info->sub_column = 0; - children_link->data = g_list_insert_sorted (column, info, compare_child_info); - - gtk_widget_set_parent (widget, GTK_WIDGET (days_grid)); -} - -GtkWidget* -gcal_days_grid_get_by_uuid (GcalDaysGrid *days_grid, - const gchar *uuid) -{ - GcalDaysGridPrivate *priv; - - GList* columns; - - priv = gcal_days_grid_get_instance_private (days_grid); - - columns = priv->children; - while (columns) - { - GList *column; - - column = columns->data; - columns = columns->next; - - while (column) - { - GcalEventWidget *event; - - ChildInfo *info = (ChildInfo*) column->data; - column = column->next; - - event = GCAL_EVENT_WIDGET (info->widget); - - if (g_strcmp0 (uuid, - gcal_event_widget_peek_uuid (event)) == 0) - { - return info->widget; - } - } - } - - return NULL; -} - -void -gcal_days_grid_clear_marks (GcalDaysGrid *days_grid) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (days_grid); - - priv->start_mark_cell = -1; - priv->end_mark_cell = -1; - gtk_widget_queue_draw (GTK_WIDGET (days_grid)); -} - -void -gcal_days_grid_mark_cell (GcalDaysGrid *days_grid, - guint cell) -{ - GcalDaysGridPrivate *priv; - - priv = gcal_days_grid_get_instance_private (days_grid); - - priv->start_mark_cell = cell; - priv->end_mark_cell = cell; - gtk_widget_queue_draw (GTK_WIDGET (days_grid)); -} - -void -gcal_days_grid_get_cell_position (GcalDaysGrid *days_grid, - guint cell, - gint *x, - gint *y) -{ - GcalDaysGridPrivate *priv; - - GtkWidget *widget; - GtkBorder padding; - gint width; - gint height; - - priv = gcal_days_grid_get_instance_private (days_grid); - widget = GTK_WIDGET (days_grid); - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - width = gtk_widget_get_allocated_width (widget) - priv->scale_width; - height = gtk_widget_get_allocated_height (widget) - (padding.top + padding.bottom); - - *x = (gint) priv->scale_width + (width / priv->columns_nr) * (cell / 48 + 0.5); - *y = (gint) (height / 48) * ((cell % 48) + 0.5); -} diff --git a/src/gcal-days-grid.h b/src/gcal-days-grid.h deleted file mode 100644 index bd3b256e..00000000 --- a/src/gcal-days-grid.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * gcal-days-grid.h - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __GCAL_DAYS_GRID_H__ -#define __GCAL_DAYS_GRID_H__ - -#include - -G_BEGIN_DECLS - -#define GCAL_TYPE_DAYS_GRID (gcal_days_grid_get_type ()) -#define GCAL_DAYS_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_DAYS_GRID, GcalDaysGrid)) -#define GCAL_DAYS_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_DAYS_GRID, GcalDaysGridClass)) -#define GCAL_IS_DAYS_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_DAYS_GRID)) -#define GCAL_IS_DAYS_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_DAYS_GRID)) -#define GCAL_DAYS_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_DAYS_GRID, GcalDaysGridClass)) - -typedef struct _GcalDaysGrid GcalDaysGrid; -typedef struct _GcalDaysGridClass GcalDaysGridClass; - -struct _GcalDaysGrid -{ - GtkContainer parent; -}; - -struct _GcalDaysGridClass -{ - GtkContainerClass parent_class; - - /* signals */ - void (*marked) (guint start_cell, guint end_cell); -}; - -GType gcal_days_grid_get_type (void); - -GtkWidget* gcal_days_grid_new (guint columns); - -void gcal_days_grid_set_preferred_cell_height (GcalDaysGrid *days_grid, - guint cell_height); - -guint gcal_days_grid_get_scale_width (GcalDaysGrid *days_grid); - -void gcal_days_grid_place (GcalDaysGrid *days_grid, - GtkWidget *widget, - guint column_idx, - guint start_cell, - guint end_cell); - -/* GcalView API helpers */ -GtkWidget* gcal_days_grid_get_by_uuid (GcalDaysGrid *days_grid, - const gchar *uuid); - -void gcal_days_grid_clear_marks (GcalDaysGrid *days_grid); - -void gcal_days_grid_mark_cell (GcalDaysGrid *days_grid, - guint cell); - -void gcal_days_grid_get_cell_position (GcalDaysGrid *days_grid, - guint cell, - gint *x, - gint *y); - -G_END_DECLS - -#endif /* __GCAL_DAYS_GRID_H__ */ diff --git a/src/gcal-floating-container.c b/src/gcal-floating-container.c deleted file mode 100644 index 11904fa8..00000000 --- a/src/gcal-floating-container.c +++ /dev/null @@ -1,337 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-floating-container.c - * Copyright (C) 2012 Erick Pérez Castellanos - * - * gnome-calendar is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * gnome-calendar is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include "gcal-floating-container.h" - -struct _GcalFloatingContainerPrivate -{ - guint border; -}; - -static void gcal_floating_container_get_preferred_width (GtkWidget *widget, - gint *minimum_width, - gint *natural_width); - -static void gcal_floating_container_get_preferred_height_for_width (GtkWidget *widget, - gint width, - gint *minimum_height, - gint *natural_height); - -static void gcal_floating_container_get_preferred_height (GtkWidget *widget, - gint *minimum_height, - gint *natural_height); - -static void gcal_floating_container_get_preferred_width_for_height (GtkWidget *widget, - gint height, - gint *minimum_width, - gint *natural_width); - -static void gcal_floating_container_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - -static gboolean gcal_floating_container_draw (GtkWidget *widget, - cairo_t *cr); - -static void gcal_floating_container_add (GtkContainer *container, - GtkWidget *child); - -static void gcal_floating_container_get_padding_and_border (GtkWidget *widget, - GtkBorder *border); - -G_DEFINE_TYPE(GcalFloatingContainer, gcal_floating_container, GTK_TYPE_BIN) - -static void -gcal_floating_container_class_init (GcalFloatingContainerClass *klass) -{ - GtkWidgetClass* widget_class; - GtkContainerClass *container_class; - - widget_class = GTK_WIDGET_CLASS (klass); - container_class = GTK_CONTAINER_CLASS (klass); - - widget_class->get_preferred_width = - gcal_floating_container_get_preferred_width; - widget_class->get_preferred_height_for_width = - gcal_floating_container_get_preferred_height_for_width; - widget_class->get_preferred_height = - gcal_floating_container_get_preferred_height; - widget_class->get_preferred_width_for_height = - gcal_floating_container_get_preferred_width_for_height; - widget_class->size_allocate = gcal_floating_container_size_allocate; - widget_class->draw = gcal_floating_container_draw; - - container_class->add = gcal_floating_container_add; - - g_type_class_add_private ((gpointer)klass, sizeof (GcalFloatingContainerPrivate)); -} - - - -static void -gcal_floating_container_init (GcalFloatingContainer *self) -{ - gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); - - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, - GCAL_TYPE_FLOATING_CONTAINER, - GcalFloatingContainerPrivate); -} - -static void -gcal_floating_container_get_preferred_width (GtkWidget *widget, - gint *minimum_width, - gint *natural_width) -{ - gint child_min, child_nat; - GtkWidget *child; - GtkBorder padding; - gint minimum, natural; - - gcal_floating_container_get_padding_and_border (widget, &padding); - - minimum = 0; - natural = 0; - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - { - gtk_widget_get_preferred_width (child, - &child_min, &child_nat); - minimum += child_min; - natural += child_nat; - } - - minimum += padding.left + padding.right; - natural += padding.left + padding.right; - - if (minimum_width) - *minimum_width = minimum; - - if (natural_width) - *natural_width = natural; -} - -static void -gcal_floating_container_get_preferred_height_for_width (GtkWidget *widget, - gint width, - gint *minimum_height, - gint *natural_height) -{ - gint child_min, child_nat, child_width; - GtkWidget *child; - GtkBorder padding; - gint minimum; - gint natural; - - gcal_floating_container_get_padding_and_border (widget, &padding); - - minimum = 0; - natural = 0; - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - { - child_width = width - padding.left - padding.top; - - gtk_widget_get_preferred_height_for_width (child, child_width, - &child_min, &child_nat); - minimum = MAX (minimum, child_min); - natural = MAX (natural, child_nat); - } - - minimum += padding.top + padding.top; - natural += padding.top + padding.top; - - if (minimum_height) - *minimum_height = minimum; - - if (natural_height) - *natural_height = natural; -} - -static void -gcal_floating_container_get_preferred_height (GtkWidget *widget, - gint *minimum_height, - gint *natural_height) -{ - gint child_min, child_nat; - GtkWidget *child; - GtkBorder padding; - gint minimum; - gint natural; - - gcal_floating_container_get_padding_and_border (widget, &padding); - - minimum = 0; - natural = 0; - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - { - gtk_widget_get_preferred_height (child, - &child_min, &child_nat); - minimum = child_min; - natural = child_nat; - } - - minimum += padding.top + padding.top; - natural += padding.top + padding.top; - - if (minimum_height) - *minimum_height = minimum; - - if (natural_height) - *natural_height = natural; -} - -static void -gcal_floating_container_get_preferred_width_for_height (GtkWidget *widget, - gint height, - gint *minimum_width, - gint *natural_width) -{ - gint child_min, child_nat, child_height; - GtkWidget *child; - GtkBorder padding; - gint minimum; - gint natural; - - gcal_floating_container_get_padding_and_border (widget, &padding); - - minimum = 0; - natural = 0; - - child_height = height - padding.top - padding.bottom; - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - { - gtk_widget_get_preferred_width_for_height (child, child_height, - &child_min, &child_nat); - minimum += child_min; - natural += child_nat; - } - - minimum += padding.left + padding.right; - natural += padding.left + padding.right; - - if (minimum_width) - *minimum_width = minimum; - - if (natural_width) - *natural_width = natural; -} - -static void -gcal_floating_container_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkAllocation child_allocation; - GtkBorder padding; - GtkWidget *child; - - gtk_widget_set_allocation (widget, allocation); - - gcal_floating_container_get_padding_and_border (widget, &padding); - - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (gtk_widget_get_window (widget), - allocation->x, - allocation->y, - allocation->width, - allocation->height); - } - - child_allocation.x = padding.left; - child_allocation.y = padding.top; - child_allocation.height = - MAX (1, - allocation->height - padding.top - padding.bottom); - - child_allocation.width = - MAX (1, - allocation->width - padding.left - padding.right); - - child = gtk_bin_get_child (GTK_BIN (widget)); - if (child && gtk_widget_get_visible (child)) - gtk_widget_size_allocate (child, &child_allocation); -} - -static gboolean -gcal_floating_container_draw (GtkWidget *widget, - cairo_t *cr) -{ - GtkStyleContext *context; - guint border_width; - - context = gtk_widget_get_style_context (widget); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - - gtk_render_background (context, cr, - border_width, border_width, - gtk_widget_get_allocated_width (widget) - 2 * border_width, - gtk_widget_get_allocated_height (widget) - 2 * border_width); - gtk_render_frame (context, cr, - border_width, border_width, - gtk_widget_get_allocated_width (widget) - 2 * border_width, - gtk_widget_get_allocated_height (widget) - 2 * border_width); - if (GTK_WIDGET_CLASS (gcal_floating_container_parent_class)->draw != NULL) - GTK_WIDGET_CLASS (gcal_floating_container_parent_class)->draw (widget, cr); - - return FALSE; -} - -static void -gcal_floating_container_add (GtkContainer *container, - GtkWidget *child) -{ - g_return_if_fail (gtk_bin_get_child (GTK_BIN (container)) == NULL); - - GTK_CONTAINER_CLASS (gcal_floating_container_parent_class)->add (container, child); -} - -static void -gcal_floating_container_get_padding_and_border (GtkWidget *widget, - GtkBorder *border) -{ - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder tmp; - - guint border_width; - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_get_padding (context, state, border); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - - gtk_style_context_get_border (context, state, &tmp); - border->top += tmp.top + border_width; - border->right += tmp.right + border_width; - border->bottom += tmp.bottom + border_width; - border->left += tmp.left + border_width; -} - -GtkWidget* -gcal_floating_container_new (void) -{ - return g_object_new (GCAL_TYPE_FLOATING_CONTAINER, NULL); -} diff --git a/src/gcal-floating-container.h b/src/gcal-floating-container.h deleted file mode 100644 index 1b0f89c7..00000000 --- a/src/gcal-floating-container.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-floating-container.h - * Copyright (C) 2012 Erick Pérez Castellanos - * - * gnome-calendar is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * gnome-calendar is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#ifndef __GCAL_FLOATING_CONTAINER_H__ -#define __GCAL_FLOATING_CONTAINER_H__ - -#include - -G_BEGIN_DECLS - - -#define GCAL_TYPE_FLOATING_CONTAINER (gcal_floating_container_get_type ()) -#define GCAL_FLOATING_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_FLOATING_CONTAINER, GcalFloatingContainer)) -#define GCAL_FLOATING_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_FLOATING_CONTAINER, GcalFloatingContainerClass)) -#define GCAL_IS_FLOATING_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_FLOATING_CONTAINER)) -#define GCAL_IS_FLOATING_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_FLOATING_CONTAINER)) -#define GCAL_FLOATING_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_FLOATING_CONTAINER, GcalFloatingContainerClass)) - -typedef struct _GcalFloatingContainer GcalFloatingContainer; -typedef struct _GcalFloatingContainerClass GcalFloatingContainerClass; -typedef struct _GcalFloatingContainerPrivate GcalFloatingContainerPrivate; - -struct _GcalFloatingContainer -{ - GtkBin parent; - /* add your public declarations here */ - - GcalFloatingContainerPrivate *priv; -}; - -struct _GcalFloatingContainerClass -{ - GtkBinClass parent_class; -}; - - -GType gcal_floating_container_get_type (void); -GtkWidget* gcal_floating_container_new (void); - - -G_END_DECLS - -#endif /* __GCAL_FLOATING_CONTAINER_H__ */ diff --git a/src/gcal-viewport.c b/src/gcal-viewport.c deleted file mode 100644 index 219389f1..00000000 --- a/src/gcal-viewport.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* - * gcal-viewport.c - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "gcal-viewport.h" - -#include - -#include - -typedef struct -{ - /* property */ - GtkWidget *viewport; - GtkWidget *hscrollbar; - GtkWidget *vscrollbar; -} GcalViewportPrivate; - -static void gcal_viewport_constructed (GObject *object); - -static void gcal_viewport_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); - -static void gcal_viewport_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); - -static gboolean gcal_viewport_scroll_event (GtkWidget *widget, - GdkEventScroll *event); - -static void gcal_viewport_child_allocated (GtkWidget *widget, - GdkRectangle *allocation, - gpointer user_data); - -G_DEFINE_TYPE_WITH_PRIVATE (GcalViewport,gcal_viewport, GTK_TYPE_OVERLAY); - -static void -gcal_viewport_class_init (GcalViewportClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->constructed = gcal_viewport_constructed; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->get_preferred_width = gcal_viewport_get_preferred_width; - widget_class->get_preferred_height = gcal_viewport_get_preferred_height; - widget_class->scroll_event = gcal_viewport_scroll_event; - - /* Setup the template GtkBuilder xml for this class */ - gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/viewport.ui"); - - /* Bind internals widgets */ - gtk_widget_class_bind_template_child_private (widget_class, GcalViewport, hscrollbar); - gtk_widget_class_bind_template_child_private (widget_class, GcalViewport, vscrollbar); - gtk_widget_class_bind_template_child_private (widget_class, GcalViewport, viewport); -} - - - -static void -gcal_viewport_init (GcalViewport *self) -{ - gtk_widget_init_template (GTK_WIDGET (self)); -} - -static void -gcal_viewport_constructed (GObject *object) -{ - GcalViewportPrivate *priv; - - GtkAdjustment *adj; - - priv = gcal_viewport_get_instance_private (GCAL_VIEWPORT (object)); - - adj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (priv->viewport)); - gtk_range_set_adjustment (GTK_RANGE (priv->hscrollbar), adj); - - adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (priv->viewport)); - gtk_range_set_adjustment (GTK_RANGE (priv->vscrollbar), adj); -} - -static void -gcal_viewport_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - if (minimum != NULL) - *minimum = 12; - if (natural != NULL) - *natural = 12; -} - -static void -gcal_viewport_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - if (minimum != NULL) - *minimum = 12; - if (natural != NULL) - *natural = 12; -} - -static gboolean -gcal_viewport_scroll_event (GtkWidget *widget, - GdkEventScroll *event) -{ - GcalViewportPrivate *priv; - - gdouble delta_y; - gdouble delta; - - g_return_val_if_fail (event != NULL, FALSE); - - priv = gcal_viewport_get_instance_private (GCAL_VIEWPORT (widget)); - - if (gdk_event_get_scroll_deltas ((GdkEvent *) event, NULL, &delta_y)) - { - if (delta_y != 0.0 && - priv->vscrollbar != NULL && - gtk_widget_get_visible (priv->vscrollbar)) - { - GtkAdjustment *adj; - gdouble new_value; - gdouble page_size; - gdouble scroll_unit; - - adj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); - page_size = gtk_adjustment_get_page_size (adj); - scroll_unit = pow (page_size, 2.0 / 3.0); - - new_value = CLAMP (gtk_adjustment_get_value (adj) + delta_y * scroll_unit, - gtk_adjustment_get_lower (adj), - gtk_adjustment_get_upper (adj) - - gtk_adjustment_get_page_size (adj)); - - gtk_adjustment_set_value (adj, new_value); - - return TRUE; - } - } - else - { - GtkWidget *range = NULL; - - if (event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_DOWN) - range = priv->vscrollbar; - - if (range != NULL && gtk_widget_get_visible (range)) - { - GtkAdjustment *adj; - gdouble new_value; - gdouble page_size; - - adj = gtk_range_get_adjustment (GTK_RANGE (range)); - page_size = gtk_adjustment_get_page_size (adj); - delta = pow (page_size, 2.0 / 3.0); - - new_value = CLAMP (gtk_adjustment_get_value (adj) + delta, - gtk_adjustment_get_lower (adj), - gtk_adjustment_get_upper (adj) - - gtk_adjustment_get_page_size (adj)); - - gtk_adjustment_set_value (adj, new_value); - - return TRUE; - } - } - - return FALSE; -} - -static void -gcal_viewport_child_allocated (GtkWidget *widget, - GdkRectangle *allocation, - gpointer user_data) -{ - GcalViewportPrivate *priv; - gint width, height; - - priv = gcal_viewport_get_instance_private (GCAL_VIEWPORT (user_data)); - - width = gtk_widget_get_allocated_width (GTK_WIDGET (user_data)); - height = gtk_widget_get_allocated_height (GTK_WIDGET (user_data)); - - if (width >= allocation->width) - gtk_widget_hide (priv->hscrollbar); - else - gtk_widget_show (priv->hscrollbar); - - if (height >= allocation->height) - gtk_widget_hide (priv->vscrollbar); - else - gtk_widget_show (priv->vscrollbar); -} - -/* Public API */ -/** - * gcal_viewport_new: - * - * Since: 0.1 - * Return value: A new #GcalViewport - * Returns: (transfer full): - **/ -GtkWidget* -gcal_viewport_new () -{ - return g_object_new (GCAL_TYPE_VIEWPORT, NULL); -} - -/** - * gcal_viewport_add: - * @viewport: a #GcalViewport - * @widget: the widget to add - * - * Add @widget to internal viewport of #GcalViewport - **/ -void -gcal_viewport_add (GcalViewport *viewport, - GtkWidget *widget) -{ - GcalViewportPrivate *priv; - - priv = gcal_viewport_get_instance_private (viewport); - gtk_container_add (GTK_CONTAINER (priv->viewport), widget); - - /* signals handlers */ - g_signal_connect_after (widget, "size-allocate", - G_CALLBACK (gcal_viewport_child_allocated), viewport); -} - -/** - * gcal_viewport_scroll_to: - * @viewport: a #GcalViewport - * @value: a value between 0 and 1.0 for scrolling the child. - * - * If no scrollbar is shown, this method does nothing - **/ -void -gcal_viewport_scroll_to (GcalViewport *viewport, - gdouble value) -{ - GcalViewportPrivate *priv; - GtkAdjustment *adj; - gdouble lower, upper, page_size; - - priv = gcal_viewport_get_instance_private (viewport); - - value = CLAMP (value, 0.0, 1.0); - - adj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); - page_size = gtk_adjustment_get_page_size (adj); - lower = gtk_adjustment_get_lower (adj); - upper = gtk_adjustment_get_upper (adj); - - value = ((upper - page_size) - lower) * value; - gtk_adjustment_set_value (adj, value); -} diff --git a/src/gcal-viewport.h b/src/gcal-viewport.h deleted file mode 100644 index d8d3aaff..00000000 --- a/src/gcal-viewport.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * gcal-viewport.h - * - * Copyright (C) 2012 - Erick Pérez Castellanos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __GCAL_VIEWPORT_H__ -#define __GCAL_VIEWPORT_H__ - -#include - -G_BEGIN_DECLS - -#define GCAL_TYPE_VIEWPORT (gcal_viewport_get_type ()) -#define GCAL_VIEWPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_VIEWPORT, GcalViewport)) -#define GCAL_VIEWPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_VIEWPORT, GcalViewportClass)) -#define GCAL_IS_VIEWPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_VIEWPORT)) -#define GCAL_IS_VIEWPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_VIEWPORT)) -#define GCAL_VIEWPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_VIEWPORT, GcalViewportClass)) - -typedef struct _GcalViewport GcalViewport; -typedef struct _GcalViewportClass GcalViewportClass; - -struct _GcalViewport -{ - GtkOverlay parent; -}; - -struct _GcalViewportClass -{ - GtkOverlayClass parent_class; -}; - -GType gcal_viewport_get_type (void); - -GtkWidget* gcal_viewport_new (void); - -void gcal_viewport_add (GcalViewport *viewport, - GtkWidget *widget); - -void gcal_viewport_scroll_to (GcalViewport *viewport, - gdouble value); - -G_END_DECLS - -#endif /* __GCAL_VIEWPORT_H__ */ diff --git a/src/gcal-window.c b/src/gcal-window.c index fe0a3a0e..b6de465c 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -22,9 +22,7 @@ #include "gcal-nav-bar.h" #include "gcal-manager.h" -#include "gcal-floating-container.h" #include "gcal-view.h" -#include "gcal-day-view.h" #include "gcal-month-view.h" #include "gcal-week-view.h" #include "gcal-year-view.h" @@ -995,14 +993,6 @@ gcal_window_constructed (GObject *object) gtk_widget_get_style_context (priv->views_stack), "views"); - priv->views[GCAL_WINDOW_VIEW_DAY] = gcal_day_view_new (); - gtk_stack_add_titled (GTK_STACK (priv->views_stack), - priv->views[GCAL_WINDOW_VIEW_DAY], - "day", _("Day")); - g_object_bind_property (GCAL_WINDOW (object), "active-date", - priv->views[GCAL_WINDOW_VIEW_DAY], "active-date", - G_BINDING_DEFAULT); - priv->views[GCAL_WINDOW_VIEW_WEEK] = gcal_week_view_new (); gtk_stack_add_titled (GTK_STACK (priv->views_stack), priv->views[GCAL_WINDOW_VIEW_WEEK],