diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 58686712..93a06d6f 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -56,26 +56,15 @@ typedef struct _GcalWeekViewChild GcalWeekViewChild; typedef struct { - /** - * This is where we keep the refs of the child widgets. - * Every child added to the list placed in the position - * of it corresponding cell number. - * The cell number is calculated in _add method. - * day[0] Represents the first_weekday according to locale - */ - GList *days [7]; + GtkBox parent; - GdkWindow *view_window; - GdkWindow *grid_window; - - GtkWidget *vscrollbar; - - /** + /* * first day of the week according to user locale, being - * 0 for Sunday, 1 for Monday and so on */ + * 0 for Sunday, 1 for Monday and so on + */ gint first_weekday; - /** + /* * clock format from GNOME desktop settings */ gboolean use_24h_format; @@ -84,22 +73,9 @@ typedef struct icaltimetype *date; GcalManager *manager; /* weak referenced */ - GdkWindow *event_window; - gint clicked_cell; } GcalWeekViewPrivate; -static void event_opened (GcalEventWidget *event_widget, - gpointer user_data); - -static void draw_header (GcalWeekView *view, - cairo_t *cr, - GtkAllocation *alloc, - GtkBorder *padding); - -static void draw_grid_window (GcalWeekView *view, - cairo_t *cr); - static void gcal_week_view_constructed (GObject *object); static void gcal_week_view_finalize (GObject *object); @@ -114,51 +90,15 @@ static void gcal_week_view_get_property (GObject *obje GValue *value, GParamSpec *pspec); -static void gcal_week_view_realize (GtkWidget *widget); - -static void gcal_week_view_unrealize (GtkWidget *widget); - -static void gcal_week_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - -static gboolean gcal_week_view_draw (GtkWidget *widget, - cairo_t *cr); - -static gboolean gcal_week_view_scroll_event (GtkWidget *widget, - GdkEventScroll *event); - -static gboolean gcal_week_view_button_press_event (GtkWidget *widget, - GdkEventButton *event); - -static gboolean gcal_week_view_button_release_event (GtkWidget *widget, - GdkEventButton *event); - -static void gcal_week_view_add (GtkContainer *constainer, - GtkWidget *widget); - -static void gcal_week_view_remove (GtkContainer *constainer, - GtkWidget *widget); - -static void gcal_week_view_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -static void gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, - gpointer user_data); - static icaltimetype* gcal_week_view_get_final_date (GcalView *view); -static GtkWidget* gcal_week_view_get_by_uuid (GcalSubscriberView *view, - const gchar *uuid); - static void gcal_view_interface_init (GcalViewInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GCAL_TYPE_SUBSCRIBER_VIEW, G_ADD_PRIVATE (GcalWeekView) G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)); -/** +/* * gcal_week_view_get_start_grid_y: * * In GcalMonthView this method returns the height of the headers of the view @@ -206,259 +146,6 @@ gcal_week_view_get_start_grid_y (GtkWidget *widget) return start_grid_y; } -static void -event_opened (GcalEventWidget *event_widget, - gpointer user_data) -{ - g_signal_emit_by_name (GCAL_VIEW (user_data), - "event-activated", - event_widget); -} - -static void -draw_header (GcalWeekView *view, - cairo_t *cr, - GtkAllocation *alloc, - GtkBorder *padding) -{ - GcalWeekViewPrivate *priv; - GtkWidget *widget; - GtkStyleContext *context; - GtkStateFlags state; - GdkRGBA color; - /* GdkRGBA current_color; */ - - PangoLayout *layout; - PangoFontDescription *bold_font; - - gint i; - gint pos_i; - gint start_grid_y; - gint font_height; - gdouble sidebar_width; - gdouble cell_width; - icaltimetype *start_of_week; - gint current_cell; - - cairo_pattern_t *pattern; - - priv = gcal_week_view_get_instance_private (view); - widget = GTK_WIDGET (view); - - cairo_save (cr); - start_grid_y = gcal_week_view_get_start_grid_y (widget); - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - /* adding shadow */ - pattern = cairo_pattern_create_linear(0, start_grid_y - 18, - 0, start_grid_y + 6); - - cairo_pattern_add_color_stop_rgba(pattern, 0.0, 0, 0, 0, 0.6); - cairo_pattern_add_color_stop_rgba(pattern, 1.0, 0, 0, 0, 0.0); - - cairo_set_source(cr, pattern); - cairo_pattern_destroy(pattern); - - cairo_rectangle(cr, 0, start_grid_y, alloc->width, 6); - cairo_fill(cr); - - gtk_style_context_get_color (context, state, &color); - gdk_cairo_set_source_rgba (cr, &color); - - /* grid header */ - layout = pango_cairo_create_layout (cr); - gtk_style_context_get (context, state, "font", &bold_font, NULL); - pango_font_description_set_weight (bold_font, PANGO_WEIGHT_SEMIBOLD); - pango_layout_set_font_description (layout, bold_font); - - start_of_week = gcal_week_view_get_initial_date (GCAL_VIEW (view)); - current_cell = icaltime_day_of_week (*(priv->date)) - 1; - current_cell = (7 + current_cell - priv->first_weekday) % 7; - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - cell_width = (alloc->width - sidebar_width) / 7; - pango_layout_get_pixel_size (layout, NULL, &font_height); - - gtk_style_context_save (context); - gtk_style_context_add_class (context, "current"); - gtk_render_background (context, cr, - cell_width * current_cell + sidebar_width, - font_height + padding->bottom, - cell_width, - ALL_DAY_CELLS_HEIGHT); - gtk_style_context_remove_class (context, "current"); - gtk_style_context_restore (context); - - for (i = 0; i < 7; i++) - { - gchar *weekday_header; - gchar *weekday_abv; - gint n_day; - - n_day = start_of_week->day + i; - if (n_day > icaltime_days_in_month (start_of_week->month, - start_of_week->year)) - { - n_day = n_day - icaltime_days_in_month (start_of_week->month, - start_of_week->year); - } - - weekday_abv = gcal_get_weekday ((i + priv->first_weekday) % 7); - weekday_header = g_strdup_printf ("%s %d", weekday_abv, n_day); - - pango_layout_set_text (layout, weekday_header, -1); - cairo_move_to (cr, - padding->left + cell_width * i + sidebar_width, - 0.0); - pango_cairo_show_layout (cr, layout); - - cairo_save (cr); - cairo_move_to (cr, - cell_width * i + sidebar_width + 0.3, - font_height + padding->bottom); - cairo_rel_line_to (cr, 0.0, ALL_DAY_CELLS_HEIGHT); - cairo_stroke (cr); - cairo_restore (cr); - - g_free (weekday_header); - } - - /* horizontal line */ - gtk_style_context_get_color (context, - state | GTK_STATE_FLAG_INSENSITIVE, - &color); - gdk_cairo_set_source_rgba (cr, &color); - pos_i = font_height + padding->bottom; - cairo_move_to (cr, sidebar_width, pos_i + 0.3); - cairo_rel_line_to (cr, alloc->width - sidebar_width, 0); - - cairo_stroke (cr); - - cairo_restore (cr); - - g_free (start_of_week); - pango_font_description_free (bold_font); - g_object_unref (layout); -} - -static void -draw_grid_window (GcalWeekView *view, - cairo_t *cr) -{ - GcalWeekViewPrivate *priv; - GtkWidget *widget; - - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; - GdkRGBA color; - - gint i; - gint width; - gint height; - gdouble sidebar_width; - gint current_cell; - - PangoLayout *layout; - PangoFontDescription *font_desc; - - priv = gcal_week_view_get_instance_private (view); - widget = GTK_WIDGET (view); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_get_color (context, state, &color); - gtk_style_context_get_padding (context, state, &padding); - gtk_style_context_get (context, state, "font", &font_desc, NULL); - - layout = pango_cairo_create_layout (cr); - pango_layout_set_font_description (layout, font_desc); - gdk_cairo_set_source_rgba (cr, &color); - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - width = gdk_window_get_width (priv->grid_window); - height = gdk_window_get_height (priv->grid_window); - - current_cell = icaltime_day_of_week (*(priv->date)) - 1; - current_cell = (7 + current_cell - priv->first_weekday) % 7; - - gtk_cairo_transform_to_window (cr, widget, priv->grid_window); - - gtk_style_context_save (context); - gtk_style_context_add_class (context, "current"); - gtk_render_background ( - context, cr, - ((width - sidebar_width)/ 7.0) * current_cell + sidebar_width, - 0, - ((width - sidebar_width)/ 7.0), - height); - gtk_style_context_remove_class (context, "current"); - gtk_style_context_restore (context); - - /* grid, sidebar hours */ - for (i = 0; i < 24; i++) - { - gchar *hours; - if (priv->use_24h_format) - { - hours = g_strdup_printf ("%02d:00", i); - pango_layout_set_text (layout, hours, -1); - } - else - { - hours = g_strdup_printf ("%02d: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); - } - - cairo_move_to (cr, padding.left, padding.top + (height / 24) * i); - pango_cairo_show_layout (cr, layout); - - g_free (hours); - } - - /* grid, vertical lines first */ - for (i = 0; i < 7; i++) - { - cairo_move_to (cr, - sidebar_width + ((width - sidebar_width) / 7) * i + 0.4, - 0); - cairo_rel_line_to (cr, 0, height); - } - - /* rest of the lines */ - for (i = 0; i < 24; i++) - { - /* hours lines */ - cairo_move_to (cr, 0, (height / 24) * i + 0.4); - cairo_rel_line_to (cr, width, 0); - } - - cairo_stroke (cr); - - cairo_set_dash (cr, dashed, 2, 0); - for (i = 0; i < 24; i++) - { - /* 30 minutes lines */ - cairo_move_to (cr, sidebar_width, (height / 24) * i + (height / 48) + 0.4); - cairo_rel_line_to (cr, width - sidebar_width, 0); - } - - cairo_stroke (cr); - - pango_font_description_free (font_desc); - g_object_unref (layout); -} - gint gcal_week_view_get_sidebar_width (GtkWidget *widget) { @@ -508,28 +195,10 @@ gcal_week_view_get_sidebar_width (GtkWidget *widget) static void gcal_week_view_class_init (GcalWeekViewClass *klass) { - GcalSubscriberViewClass *subscriber_view_class; - GtkContainerClass *container_class; GtkWidgetClass *widget_class; GObjectClass *object_class; - subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass); - subscriber_view_class->get_child_by_uuid = gcal_week_view_get_by_uuid; - - container_class = GTK_CONTAINER_CLASS (klass); - container_class->add = gcal_week_view_add; - container_class->remove = gcal_week_view_remove; - container_class->forall = gcal_week_view_forall; - gtk_container_class_handle_border_width (container_class); - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->realize = gcal_week_view_realize; - widget_class->unrealize = gcal_week_view_unrealize; - widget_class->size_allocate = gcal_week_view_size_allocate; - widget_class->draw = gcal_week_view_draw; - widget_class->scroll_event = gcal_week_view_scroll_event; - widget_class->button_press_event = gcal_week_view_button_press_event; - widget_class->button_release_event = gcal_week_view_button_release_event; object_class = G_OBJECT_CLASS (klass); object_class->constructed = gcal_week_view_constructed; @@ -567,18 +236,6 @@ gcal_week_view_constructed (GObject *object) if (G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed != NULL) G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed (object); - - priv->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, NULL); - - gtk_widget_set_parent (priv->vscrollbar, GTK_WIDGET (object)); - gtk_widget_show (priv->vscrollbar); - - g_signal_connect (gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - "value-changed", - G_CALLBACK (gcal_week_view_scroll_value_changed), - object); - - g_object_ref (priv->vscrollbar); } static void @@ -591,12 +248,6 @@ gcal_week_view_finalize (GObject *object) if (priv->date != NULL) g_free (priv->date); - if (priv->vscrollbar != NULL) - { - gtk_widget_unparent (priv->vscrollbar); - g_clear_object (&(priv->vscrollbar)); - } - /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (gcal_week_view_parent_class)->finalize (object); } @@ -669,611 +320,6 @@ gcal_week_view_get_property (GObject *object, } } -static void -gcal_week_view_realize (GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GdkWindow *parent_window; - GdkWindowAttr attributes; - gint attributes_mask; - GtkAllocation allocation; - - gint i; - GList *l; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - gtk_widget_set_realized (widget, TRUE); - - gtk_widget_get_allocation (widget, &allocation); - - parent_window = gtk_widget_get_parent_window (widget); - gtk_widget_set_window (widget, parent_window); - g_object_ref (parent_window); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_ONLY; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y; - - priv->event_window = gdk_window_new (parent_window, - &attributes, - attributes_mask); - gtk_widget_register_window (widget, priv->event_window); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_POINTER_MOTION_MASK | - GDK_SCROLL_MASK | - GDK_TOUCH_MASK | - GDK_SMOOTH_SCROLL_MASK); - attributes.visual = gtk_widget_get_visual (widget); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; - - priv->view_window = gdk_window_new (parent_window, - &attributes, - attributes_mask); - gtk_widget_register_window (widget, priv->view_window); - - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= GDK_EXPOSURE_MASK; - priv->grid_window = gdk_window_new (priv->view_window, - &attributes, - attributes_mask); - gtk_widget_register_window (widget, priv->grid_window); - - gdk_window_show (priv->event_window); - gdk_window_show (priv->grid_window); - gdk_window_show (priv->view_window); - - /* setting parent_window for every event child */ - for (i = 0; i < 7; i++) - { - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - gtk_widget_set_parent_window (child->widget, - priv->grid_window); - } - } -} - -static void -gcal_week_view_unrealize (GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - if (priv->view_window != NULL) - { - gtk_widget_unregister_window (widget, priv->view_window); - gdk_window_destroy (priv->view_window); - priv->view_window = NULL; - } - - if (priv->grid_window != NULL) - { - gtk_widget_unregister_window (widget, priv->grid_window); - gdk_window_destroy (priv->grid_window); - priv->grid_window = NULL; - } - if (priv->event_window != NULL) - { - gtk_widget_unregister_window (widget, priv->event_window); - gdk_window_destroy (priv->event_window); - priv->event_window = NULL; - } - - GTK_WIDGET_CLASS (gcal_week_view_parent_class)->unrealize (widget); -} - -static void -gcal_week_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GcalWeekViewPrivate *priv; - - GtkBorder padding; - PangoLayout *layout; - PangoFontDescription *font_desc; - gint font_height; - - gint start_grid_y; - gint sidebar_width; - - GtkAllocation scroll_allocation; - gint min; - gint natural; - - gdouble horizontal_block; - gdouble vertical_block; - gdouble adj_value; - - gint i; - GList *l; - - gboolean scroll_needed; - gint grid_height; - gint view_height; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - gtk_widget_set_allocation (widget, allocation); - - if (! gtk_widget_get_realized (widget)) - return; - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - gdk_window_move_resize (priv->event_window, - allocation->x, - allocation->y, - allocation->width, - start_grid_y); - - /* Estimating cell height */ - layout = pango_layout_new (gtk_widget_get_pango_context (widget)); - 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, NULL, &font_height); - pango_font_description_free (font_desc); - - gtk_widget_get_preferred_width (priv->vscrollbar, &min, &natural); - - view_height = allocation->height - start_grid_y; - grid_height = 24 * (padding.top + padding.bottom + 3 * font_height); - scroll_needed = grid_height > allocation->height - start_grid_y ? TRUE : FALSE; - grid_height = scroll_needed ? grid_height : allocation->height - start_grid_y; - - if (scroll_needed) - { - adj_value = gtk_adjustment_get_value ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar))); - } - else - { - adj_value = 0; - } - - gdk_window_move_resize (priv->view_window, - allocation->x, - allocation->y + start_grid_y, - allocation->width, - allocation->height - start_grid_y); - gdk_window_move_resize (priv->grid_window, - allocation->x, - - adj_value, - allocation->width, - grid_height); - - if (scroll_needed) - { - scroll_allocation.x = allocation->width - natural; - scroll_allocation.y = start_grid_y; - scroll_allocation.width = natural; - scroll_allocation.height = view_height; - gtk_widget_size_allocate (priv->vscrollbar, &scroll_allocation); - - gtk_adjustment_set_page_size ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - view_height * view_height / grid_height); - gtk_adjustment_set_upper ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - grid_height - view_height + (view_height * view_height / grid_height)); - } - else - { - gtk_widget_hide (priv->vscrollbar); - } - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - horizontal_block = (allocation->width - sidebar_width) / 7.0; - vertical_block = gdk_window_get_height (priv->grid_window) / 24.0; - - for (i = 0; i < 7; i++) - { - gdouble *added_height; - added_height = g_malloc0 (sizeof (gdouble) * 25); - - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - gint min_height; - gint natural_height; - gdouble vertical_span; - GtkAllocation child_allocation; - - child = (GcalWeekViewChild*) l->data; - - if ((! gtk_widget_get_visible (child->widget)) && - (! child->hidden_by_me)) - { - continue; - } - - gtk_widget_get_preferred_height (child->widget, - &min_height, - &natural_height); - - child_allocation.x = i * horizontal_block + sidebar_width; - if (child->index == -1) - { - vertical_span = 2 * font_height; - child_allocation.y = start_grid_y - vertical_span; - } - else - { - vertical_span = vertical_block; - child_allocation.y = child->index * vertical_block; - } - - child_allocation.width = horizontal_block; - child_allocation.height = MIN (natural_height, vertical_span); - if (added_height[child->index + 1] + child_allocation.height > vertical_span) - { - gtk_widget_hide (child->widget); - child->hidden_by_me = TRUE; - } - else - { - gtk_widget_show (child->widget); - child->hidden_by_me = FALSE; - child_allocation.y = child_allocation.y + added_height[child->index + 1]; - gtk_widget_size_allocate (child->widget, &child_allocation); - added_height[child->index + 1] += child_allocation.height; - } - } - g_free (added_height); - } -} - -static gboolean -gcal_week_view_draw (GtkWidget *widget, - cairo_t *cr) -{ - GcalWeekViewPrivate *priv; - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; - GtkAllocation alloc; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (widget), FALSE); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - /* getting padding and allocation */ - gtk_style_context_get_padding (context, state, &padding); - gtk_widget_get_allocation (widget, &alloc); - - if (gtk_cairo_should_draw_window (cr, gtk_widget_get_window (widget))) - { - cairo_save (cr); - cairo_set_line_width (cr, 0.4); - draw_header (GCAL_WEEK_VIEW (widget), cr, &alloc, &padding); - cairo_restore (cr); - } - - if (priv->view_window != NULL && - gtk_cairo_should_draw_window (cr, priv->view_window)) - { - gint y; - - gdk_window_get_position (priv->view_window, NULL, &y); - cairo_rectangle (cr, - alloc.x, - y, - alloc.width, - gdk_window_get_height (priv->view_window)); - cairo_clip (cr); - } - - if (priv->grid_window != NULL && - gtk_cairo_should_draw_window (cr, priv->grid_window)) - { - cairo_save (cr); - cairo_set_line_width (cr, 0.3); - draw_grid_window (GCAL_WEEK_VIEW (widget), cr); - cairo_restore (cr); - } - - GTK_WIDGET_CLASS (gcal_week_view_parent_class)->draw (widget, cr); - - return FALSE; -} - -static gboolean -gcal_week_view_scroll_event (GtkWidget *widget, - GdkEventScroll *event) -{ - GcalWeekViewPrivate *priv; - - gdouble delta_y; - gdouble delta; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (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 gboolean -gcal_week_view_button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - gdouble y, start_grid_y; - - y = event->y; - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - if (y - start_grid_y < 0) - { - /* FIXME: click on the header should create all day events */ - return FALSE; - } - - return FALSE; -} - -static gboolean -gcal_week_view_button_release_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalWeekViewPrivate *priv; - gdouble y, start_grid_y; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - y = event->y; - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - if (y - start_grid_y < 0) - { - /* FIXME: click on the header should create all day events */ - priv->clicked_cell = -1; - return FALSE; - } - - priv->clicked_cell = -1; - return FALSE; -} - -static void -gcal_week_view_add (GtkContainer *container, - GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GList *l; - - gint day; - - GcalWeekViewChild *new_child; - GDateTime *date; - GcalEvent *event; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (container)); - g_return_if_fail (GCAL_IS_EVENT_WIDGET (widget)); - g_return_if_fail (gtk_widget_get_parent (widget) == NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - - /* Check if it's already added for date */ - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (widget)); - date = gcal_event_get_date_start (event); - day = (g_date_time_get_day_of_week (date) - priv->first_weekday + 6) % 7; - - for (l = priv->days[day]; l != NULL; l = l->next) - { - GtkWidget *event_widget; - - event_widget = GTK_WIDGET (((GcalWeekViewChild*) l->data)->widget); - if (gcal_event_widget_equal (GCAL_EVENT_WIDGET (widget), - GCAL_EVENT_WIDGET (event_widget))) - { - //TODO: remove once the main-dev phase its over - g_warning ("Trying to add an event with the same uuid to the view"); - g_free (date); - gtk_widget_destroy (widget); - return; - } - } - - new_child = g_new0 (GcalWeekViewChild, 1); - new_child->widget = widget; - new_child->hidden_by_me = FALSE; - - if (gcal_event_get_all_day (event)) - { - new_child->index = -1; - if (gtk_widget_get_window (widget) != NULL) - gtk_widget_set_parent_window (widget, - gtk_widget_get_window (widget)); - } - else - { - new_child->index = g_date_time_get_hour (date); - if (priv->grid_window != NULL) - gtk_widget_set_parent_window (widget, priv->grid_window); - } - - priv->days[day] = g_list_append (priv->days[day], new_child); - gtk_widget_set_parent (widget, GTK_WIDGET (container)); - - g_signal_connect (widget, - "activate", - G_CALLBACK (event_opened), - container); -} - -static void -gcal_week_view_remove (GtkContainer *container, - GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GcalEvent *event; - GDateTime *date; - GList *l; - gint day; - gboolean was_visible; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (container)); - g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (widget)); - date = gcal_event_get_date_start (event); - day = (g_date_time_get_day_of_week (date) - priv->first_weekday + 6) % 7; - - for (l = priv->days[day]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - if (child->widget == widget) - { - priv->days[day] = g_list_remove (priv->days[day], child); - g_free (child); - break; - } - } - - - was_visible = gtk_widget_get_visible (widget); - gtk_widget_unparent (widget); - - if (was_visible) - gtk_widget_queue_resize (GTK_WIDGET (container)); - - g_free (date); -} - -static void -gcal_week_view_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GcalWeekViewPrivate *priv; - gint i; - GList *l; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - - for (i = 0; i < 7; i++) - { - l = priv->days[i]; - - while (l) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - l = l->next; - - (* callback) (child->widget, callback_data); - } - } - - if (include_internals && priv->vscrollbar != NULL) - (* callback) (priv->vscrollbar, callback_data); -} - -static void -gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, - gpointer user_data) -{ - GcalWeekViewPrivate *priv; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (user_data)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (user_data)); - - if (priv->grid_window != NULL) - { - gdk_window_move (priv->grid_window, - 0, - - gtk_adjustment_get_value (adjusment)); - } -} - /* GcalView Interface API */ /** * gcal_week_view_get_initial_date: @@ -1329,36 +375,6 @@ gcal_week_view_get_final_date (GcalView *view) return new_date; } -static GtkWidget* -gcal_week_view_get_by_uuid (GcalSubscriberView *subscriber_view, - const gchar *uuid) -{ - GcalWeekViewPrivate *priv; - gint i; - GList *l; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (subscriber_view), NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW(subscriber_view)); - - for (i = 0; i < 7; i++) - { - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - GcalEvent *event; - const gchar* widget_uuid; - - child = (GcalWeekViewChild*) l->data; - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (child->widget)); - widget_uuid = gcal_event_get_uid (event); - - if (g_strcmp0 (uuid, widget_uuid) == 0) - return child->widget; - } - } - return NULL; -} - /* Public API */ /** * gcal_week_view_new: