Added input handling to GcalYearView.

Added drawing primitives from marking the range of dates.
This code is almost the same of the one in GcalMonthView.
This commit is contained in:
Erick Pérez Castellanos
2012-12-01 15:29:03 -05:00
committed by Rene A. Viant Moran
parent 8a5d1ba4fb
commit 85634c79df
+287 -2
View File
@@ -43,6 +43,11 @@ struct _GcalYearViewPrivate
/* property */
icaltimetype *date;
gint clicked_cell;
gint start_mark_cell;
gint end_mark_cell;
/* helpers */
GdkRectangle *prev_rectangle;
GdkRectangle *next_rectangle;
@@ -84,6 +89,15 @@ static void gcal_year_view_size_allocate (GtkWidget
static gboolean gcal_year_view_draw (GtkWidget *widget,
cairo_t *cr);
static gboolean gcal_year_view_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gcal_year_view_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event);
static gboolean gcal_year_view_button_release (GtkWidget *widget,
GdkEventButton *event);
static void gcal_year_view_add (GtkContainer *constainer,
GtkWidget *widget);
@@ -156,6 +170,9 @@ gcal_year_view_class_init (GcalYearViewClass *klass)
widget_class->unmap = gcal_year_view_unmap;
widget_class->size_allocate = gcal_year_view_size_allocate;
widget_class->draw = gcal_year_view_draw;
widget_class->button_press_event = gcal_year_view_button_press;
widget_class->motion_notify_event = gcal_year_view_motion_notify_event;
widget_class->button_release_event = gcal_year_view_button_release;
object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gcal_year_view_set_property;
@@ -182,6 +199,11 @@ gcal_year_view_init (GcalYearView *self)
GcalYearViewPrivate);
priv = self->priv;
priv->clicked_cell = -1;
priv->start_mark_cell = -1;
priv->end_mark_cell = -1;
priv->prev_rectangle = NULL;
priv->next_rectangle = NULL;
@@ -482,6 +504,208 @@ gcal_year_view_draw (GtkWidget *widget,
return FALSE;
}
static gboolean
gcal_year_view_button_press (GtkWidget *widget,
GdkEventButton *event)
{
GcalYearViewPrivate *priv;
gdouble x, y;
gint width, height;
gdouble start_grid_y;
priv = GCAL_YEAR_VIEW (widget)->priv;
x = event->x;
y = event->y;
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
start_grid_y = gcal_year_view_get_start_grid_y (widget);
if (y - start_grid_y < 0)
{
if (priv->prev_rectangle->x < x &&
x < priv->prev_rectangle->x + priv->prev_rectangle->width &&
priv->prev_rectangle->y < y &&
y < priv->prev_rectangle->y + priv->prev_rectangle->height)
{
priv->clicked_prev = TRUE;
}
else if (priv->next_rectangle->x < x &&
x < priv->next_rectangle->x + priv->next_rectangle->width &&
priv->next_rectangle->y < y &&
y < priv->next_rectangle->y + priv->next_rectangle->height)
{
priv->clicked_next = TRUE;
}
return TRUE;
}
y = y - start_grid_y;
priv->clicked_cell = 6 * ( (gint ) ( y / ((height - start_grid_y) / 2) )) + ((gint) ( x / (width / 6) ));
priv->start_mark_cell = priv->clicked_cell;
if (event->type == GDK_2BUTTON_PRESS)
{
icaltimetype *start_date;
icaltimetype *end_date;
priv->end_mark_cell = priv->start_mark_cell;
x = (width / 6) * (( priv->start_mark_cell % 6) + 0.5);
y = start_grid_y + ((height - start_grid_y) / 2) * (( priv->start_mark_cell / 6) + 0.5);
gtk_widget_queue_draw (widget);
start_date = gcal_dup_icaltime (priv->date);
start_date->day = 1;
start_date->month = priv->start_mark_cell + 1;
start_date->is_date = 1;
end_date = gcal_dup_icaltime (priv->date);
end_date->day = icaltime_days_in_month (start_date->month,
start_date->year);
end_date->month = priv->start_mark_cell + 1;
end_date->is_date = 1;
g_signal_emit_by_name (GCAL_VIEW (widget),
"create-event",
start_date, end_date,
x, y);
g_free (start_date);
g_free (end_date);
}
return TRUE;
}
static gboolean
gcal_year_view_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event)
{
GcalYearViewPrivate *priv;
gint width, height;
gint y;
gdouble start_grid_y;
priv = GCAL_YEAR_VIEW (widget)->priv;
if (priv->clicked_cell == -1)
return FALSE;
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
start_grid_y = gcal_year_view_get_start_grid_y (widget);
y = event->y - start_grid_y;
if (y < 0)
return FALSE;
priv->end_mark_cell = 6 * ( (gint ) ( y / ((height - start_grid_y) / 2) )) + ((gint) ( event->x / (width / 6) ));
if (priv->end_mark_cell == priv->start_mark_cell)
{
priv->end_mark_cell = -1;
return FALSE;
}
gtk_widget_queue_draw (widget);
return TRUE;
}
static gboolean
gcal_year_view_button_release (GtkWidget *widget,
GdkEventButton *event)
{
GcalYearViewPrivate *priv;
gdouble x, y;
gint width, height;
gdouble start_grid_y;
gint released;
priv = GCAL_YEAR_VIEW (widget)->priv;
x = event->x;
y = event->y;
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
start_grid_y = gcal_year_view_get_start_grid_y (widget);
if (y - start_grid_y < 0)
{
if (priv->prev_rectangle->x < x &&
x < priv->prev_rectangle->x + priv->prev_rectangle->width &&
priv->prev_rectangle->y < y &&
y < priv->prev_rectangle->y + priv->prev_rectangle->height &&
priv->clicked_prev)
{
icaltimetype *prev_year;
prev_year = gcal_view_get_date (GCAL_VIEW (widget));
prev_year->year--;
g_signal_emit_by_name (GCAL_VIEW (widget), "updated", prev_year);
g_free (prev_year);
}
else if (priv->next_rectangle->x < x &&
x < priv->next_rectangle->x + priv->next_rectangle->width &&
priv->next_rectangle->y < y &&
y < priv->next_rectangle->y + priv->next_rectangle->height &&
priv->clicked_next)
{
icaltimetype *next_year;
next_year = gcal_view_get_date (GCAL_VIEW (widget));
next_year->year++;
g_signal_emit_by_name (GCAL_VIEW (widget), "updated", next_year);
g_free (next_year);
}
priv->clicked_cell = -1;
priv->clicked_prev = FALSE;
priv->clicked_next = FALSE;
return TRUE;
}
y = y - start_grid_y;
released = 6 * ( (gint ) ( y / ((height - start_grid_y) / 2) )) + ((gint) ( x / (width / 6) ));
if (priv->clicked_cell != released)
{
icaltimetype *start_date;
icaltimetype *end_date;
x = (width / 6) * (( priv->end_mark_cell % 6) + 0.5);
y = start_grid_y + ((height - start_grid_y) / 2) * (( priv->end_mark_cell / 6) + 0.5);
start_date = gcal_dup_icaltime (priv->date);
start_date->day = 1;
start_date->month = priv->start_mark_cell + 1;
start_date->is_date = 1;
end_date = gcal_dup_icaltime (priv->date);
end_date->day = icaltime_days_in_month (priv->end_mark_cell + 1,
end_date->year);
end_date->month = priv->end_mark_cell + 1;
end_date->is_date = 1;
g_signal_emit_by_name (GCAL_VIEW (widget),
"create-event",
start_date, end_date,
x, y);
g_free (start_date);
g_free (end_date);
}
priv->clicked_cell = -1;
priv->clicked_prev = FALSE;
priv->clicked_next = FALSE;
return TRUE;
}
static void
gcal_year_view_add (GtkContainer *container,
GtkWidget *widget)
@@ -812,6 +1036,62 @@ gcal_year_view_draw_grid (GcalYearView *view,
ligther_color.green,
ligther_color.blue);
/* drawing new-event mark */
if (priv->start_mark_cell != -1 &&
priv->end_mark_cell != -1)
{
gint first_cell;
gint last_cell;
gint rows;
cairo_save (cr);
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_set_source_rgba (cr,
background_selected_color.red,
background_selected_color.green,
background_selected_color.blue,
background_selected_color.alpha);
for (rows = 0; rows < (last_cell / 6) - (first_cell / 6) + 1; rows++)
{
gint first_point;
gint last_point;
first_point = (rows == 0) ? first_cell : ((first_cell / 6) + rows) * 6;
cairo_move_to (
cr,
(alloc->width / 6) * ( first_point % 6),
start_grid_y + ((alloc->height - start_grid_y) / 2) * ( first_point / 6) + 1);
last_point = (rows == (last_cell / 6 - first_cell / 6)) ? last_cell : ((first_cell / 6) + rows) * 6 + 5;
cairo_rel_line_to (cr,
(alloc->width / 6) * (last_point - first_point + 1),
0);
cairo_rel_line_to (cr,
0,
(alloc->height - start_grid_y) / 2);
cairo_rel_line_to (cr,
- (alloc->width / 6) * (last_point - first_point + 1),
0);
cairo_rel_line_to (cr,
0,
- (alloc->height - start_grid_y) / 2);
cairo_fill (cr);
}
cairo_restore (cr);
}
/* drawing grid text */
for (i = 0; i < 2; i++)
{
@@ -1080,8 +1360,13 @@ gcal_year_view_reposition_child (GcalView *view,
static void
gcal_year_view_clear_selection (GcalView *view)
{
/* FIXME: implement this */
;
GcalYearViewPrivate *priv;
priv = GCAL_YEAR_VIEW (view)->priv;
priv->start_mark_cell = -1;
priv->end_mark_cell = -1;
gtk_widget_queue_draw (GTK_WIDGET (view));
}
static void