week-grid: implement event creation
This commit is contained in:
@@ -421,3 +421,7 @@ weekgrid.now-strip {
|
|||||||
margin: 0 0 0 1px;
|
margin: 0 0 0 1px;
|
||||||
min-height: 2px;
|
min-height: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
weekgrid:selected {
|
||||||
|
background-color: alpha(@theme_selected_bg_color, 0.4);
|
||||||
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
<object class="GcalWeekView" id="week_view">
|
<object class="GcalWeekView" id="week_view">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="active-date" bind-source="GcalWindow" bind-property="active-date" bind-flags="bidirectional"/>
|
<property name="active-date" bind-source="GcalWindow" bind-property="active-date" bind-flags="bidirectional"/>
|
||||||
|
<signal name="create-event" handler="show_new_event_widget" object="GcalWindow" swapped="no"/>
|
||||||
<signal name="event-activated" handler="event_activated" object="GcalWindow" swapped="no"/>
|
<signal name="event-activated" handler="event_activated" object="GcalWindow" swapped="no"/>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|||||||
@@ -60,6 +60,13 @@ struct _GcalWeekGrid
|
|||||||
gboolean children_changed;
|
gboolean children_changed;
|
||||||
gint redraw_timeout_id;
|
gint redraw_timeout_id;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These fields are "cells" rather than minutes. Each cell
|
||||||
|
* correspond to 30 minutes.
|
||||||
|
*/
|
||||||
|
gint selection_start;
|
||||||
|
gint selection_end;
|
||||||
|
|
||||||
GcalManager *manager;
|
GcalManager *manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -461,6 +468,45 @@ gcal_week_grid_draw (GtkWidget *widget,
|
|||||||
|
|
||||||
cairo_set_line_width (cr, 0.65);
|
cairo_set_line_width (cr, 0.65);
|
||||||
|
|
||||||
|
/* First, draw the selection */
|
||||||
|
if (self->selection_start != -1 && self->selection_end != -1)
|
||||||
|
{
|
||||||
|
gdouble minutes_height;
|
||||||
|
gint selection_height;
|
||||||
|
gint column;
|
||||||
|
gint start;
|
||||||
|
gint end;
|
||||||
|
|
||||||
|
start = self->selection_start;
|
||||||
|
end = self->selection_end;
|
||||||
|
|
||||||
|
/* Swap cells if needed */
|
||||||
|
if (start > end)
|
||||||
|
{
|
||||||
|
start = start + end;
|
||||||
|
end = start - end;
|
||||||
|
start = start - end;
|
||||||
|
}
|
||||||
|
|
||||||
|
minutes_height = (gdouble) height / MINUTES_PER_DAY;
|
||||||
|
column = start * 30 / MINUTES_PER_DAY;
|
||||||
|
selection_height = (end - start + 1) * 30 * minutes_height;
|
||||||
|
|
||||||
|
x = column * column_width;
|
||||||
|
|
||||||
|
gtk_style_context_save (context);
|
||||||
|
gtk_style_context_set_state (context, state | GTK_STATE_FLAG_SELECTED);
|
||||||
|
|
||||||
|
gtk_render_background (context,
|
||||||
|
cr,
|
||||||
|
ALIGNED (x),
|
||||||
|
round ((start * 30 % MINUTES_PER_DAY) * minutes_height),
|
||||||
|
column_width,
|
||||||
|
selection_height);
|
||||||
|
|
||||||
|
gtk_style_context_restore (context);
|
||||||
|
}
|
||||||
|
|
||||||
/* Today column */
|
/* Today column */
|
||||||
today_column = get_today_column (GCAL_WEEK_GRID (widget));
|
today_column = get_today_column (GCAL_WEEK_GRID (widget));
|
||||||
|
|
||||||
@@ -720,6 +766,135 @@ gcal_week_grid_get_preferred_height (GtkWidget *widget,
|
|||||||
*natural_height = height;
|
*natural_height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gcal_week_grid_button_press (GtkWidget *widget,
|
||||||
|
GdkEventButton *event_button)
|
||||||
|
{
|
||||||
|
GcalWeekGrid *self;
|
||||||
|
GtkAllocation alloc;
|
||||||
|
gboolean ltr;
|
||||||
|
gdouble minute_height;
|
||||||
|
gint column_width;
|
||||||
|
gint column;
|
||||||
|
gint minute;
|
||||||
|
|
||||||
|
self = GCAL_WEEK_GRID (widget);
|
||||||
|
ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (widget, &alloc);
|
||||||
|
minute_height = (gdouble) alloc.height / MINUTES_PER_DAY;
|
||||||
|
column_width = floor (alloc.width / 7);
|
||||||
|
column = (gint) event_button->x / column_width;
|
||||||
|
minute = event_button->y / minute_height;
|
||||||
|
minute = minute - (minute % 30);
|
||||||
|
|
||||||
|
self->selection_start = (column * MINUTES_PER_DAY + minute) / 30;
|
||||||
|
self->selection_end = self->selection_start;
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (widget);
|
||||||
|
|
||||||
|
return GDK_EVENT_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gcal_week_grid_motion_notify_event (GtkWidget *widget,
|
||||||
|
GdkEventMotion *event)
|
||||||
|
{
|
||||||
|
GcalWeekGrid *self;
|
||||||
|
GtkAllocation alloc;
|
||||||
|
gboolean ltr;
|
||||||
|
gdouble minute_height;
|
||||||
|
gint column;
|
||||||
|
gint minute;
|
||||||
|
|
||||||
|
if (!(event->state & GDK_BUTTON_PRESS_MASK))
|
||||||
|
return GDK_EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
self = GCAL_WEEK_GRID (widget);
|
||||||
|
ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (widget, &alloc);
|
||||||
|
minute_height = (gdouble) alloc.height / MINUTES_PER_DAY;
|
||||||
|
column = self->selection_start * 30 / MINUTES_PER_DAY;
|
||||||
|
minute = event->y / minute_height;
|
||||||
|
minute = minute - (minute % 30);
|
||||||
|
|
||||||
|
self->selection_end = (column * MINUTES_PER_DAY + minute) / 30;
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (widget);
|
||||||
|
|
||||||
|
return GDK_EVENT_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gcal_week_grid_button_release (GtkWidget *widget,
|
||||||
|
GdkEventButton *event)
|
||||||
|
{
|
||||||
|
GcalWeekGrid *self;
|
||||||
|
GtkAllocation alloc;
|
||||||
|
GDateTime *week_start;
|
||||||
|
GDateTime *start, *end;
|
||||||
|
GtkWidget *weekview;
|
||||||
|
gboolean ltr;
|
||||||
|
gdouble minute_height;
|
||||||
|
gdouble x, y;
|
||||||
|
gint column;
|
||||||
|
gint minute;
|
||||||
|
gint out_x;
|
||||||
|
gint out_y;
|
||||||
|
|
||||||
|
self = GCAL_WEEK_GRID (widget);
|
||||||
|
ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (widget, &alloc);
|
||||||
|
minute_height = (gdouble) alloc.height / MINUTES_PER_DAY;
|
||||||
|
column = self->selection_start * 30 / MINUTES_PER_DAY;
|
||||||
|
minute = event->y / minute_height;
|
||||||
|
minute = minute - (minute % 30);
|
||||||
|
|
||||||
|
self->selection_end = (column * MINUTES_PER_DAY + minute) / 30;
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (widget);
|
||||||
|
|
||||||
|
/* Fake the week view's event so we can control the X and Y values */
|
||||||
|
weekview = gtk_widget_get_ancestor (widget, GCAL_TYPE_WEEK_VIEW);
|
||||||
|
week_start = get_start_of_week (self->active_date);
|
||||||
|
|
||||||
|
if (ltr)
|
||||||
|
{
|
||||||
|
start = g_date_time_add_minutes (week_start, self->selection_start * 30);
|
||||||
|
end = g_date_time_add_minutes (week_start, (self->selection_end + 1) * 30);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
start = g_date_time_add_minutes (week_start, MAX_MINUTES - column * MINUTES_PER_DAY + minute);
|
||||||
|
end = g_date_time_add_minutes (week_start, MAX_MINUTES - column * MINUTES_PER_DAY + (self->selection_end + 1) * 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
x = round ((column + 0.5) * (alloc.width / 7.0));
|
||||||
|
y = (minute + 15) * minute_height;
|
||||||
|
|
||||||
|
gtk_widget_translate_coordinates (widget,
|
||||||
|
weekview,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
&out_x,
|
||||||
|
&out_y);
|
||||||
|
|
||||||
|
g_signal_emit_by_name (weekview,
|
||||||
|
"create-event",
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
(gdouble) out_x,
|
||||||
|
(gdouble) out_y);
|
||||||
|
|
||||||
|
gcal_clear_datetime (&week_start);
|
||||||
|
gcal_clear_datetime (&start);
|
||||||
|
gcal_clear_datetime (&end);
|
||||||
|
|
||||||
|
return GDK_EVENT_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_week_grid_class_init (GcalWeekGridClass *klass)
|
gcal_week_grid_class_init (GcalWeekGridClass *klass)
|
||||||
{
|
{
|
||||||
@@ -742,6 +917,9 @@ gcal_week_grid_class_init (GcalWeekGridClass *klass)
|
|||||||
widget_class->map = gcal_week_grid_map;
|
widget_class->map = gcal_week_grid_map;
|
||||||
widget_class->unmap = gcal_week_grid_unmap;
|
widget_class->unmap = gcal_week_grid_unmap;
|
||||||
widget_class->get_preferred_height = gcal_week_grid_get_preferred_height;
|
widget_class->get_preferred_height = gcal_week_grid_get_preferred_height;
|
||||||
|
widget_class->button_press_event = gcal_week_grid_button_press;
|
||||||
|
widget_class->motion_notify_event = gcal_week_grid_motion_notify_event;
|
||||||
|
widget_class->button_release_event = gcal_week_grid_button_release;
|
||||||
|
|
||||||
properties[PROP_ACTIVE_DATE] = g_param_spec_boxed ("active-date",
|
properties[PROP_ACTIVE_DATE] = g_param_spec_boxed ("active-date",
|
||||||
"Date",
|
"Date",
|
||||||
@@ -768,6 +946,9 @@ gcal_week_grid_init (GcalWeekGrid *self)
|
|||||||
{
|
{
|
||||||
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
|
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
|
||||||
|
|
||||||
|
self->selection_start = -1;
|
||||||
|
self->selection_end = -1;
|
||||||
|
|
||||||
self->events = gcal_range_tree_new ();
|
self->events = gcal_range_tree_new ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -903,3 +1084,14 @@ gcal_week_grid_get_children_by_uuid (GcalWeekGrid *self,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gcal_week_grid_clear_marks (GcalWeekGrid *self)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GCAL_IS_WEEK_GRID (self));
|
||||||
|
|
||||||
|
self->selection_start = -1;
|
||||||
|
self->selection_end = -1;
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (GTK_WIDGET (self));
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ void gcal_week_grid_remove_event (GcalWeekGrid
|
|||||||
GList* gcal_week_grid_get_children_by_uuid (GcalWeekGrid *self,
|
GList* gcal_week_grid_get_children_by_uuid (GcalWeekGrid *self,
|
||||||
const gchar *uid);
|
const gchar *uid);
|
||||||
|
|
||||||
|
void gcal_week_grid_clear_marks (GcalWeekGrid *self);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* GCAL_WEEK_GRID_H */
|
#endif /* GCAL_WEEK_GRID_H */
|
||||||
|
|||||||
@@ -235,6 +235,14 @@ gcal_week_view_get_children_by_uuid (GcalView *view,
|
|||||||
return g_list_concat (grid, header);
|
return g_list_concat (grid, header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gcal_week_view_clear_marks (GcalView *view)
|
||||||
|
{
|
||||||
|
GcalWeekView *self = GCAL_WEEK_VIEW (view);
|
||||||
|
|
||||||
|
gcal_week_grid_clear_marks (GCAL_WEEK_GRID (self->week_grid));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_hours_sidebar_size (GcalWeekView *self)
|
update_hours_sidebar_size (GcalWeekView *self)
|
||||||
{
|
{
|
||||||
@@ -503,8 +511,7 @@ gcal_view_interface_init (GcalViewInterface *iface)
|
|||||||
iface->get_initial_date = gcal_week_view_get_initial_date;
|
iface->get_initial_date = gcal_week_view_get_initial_date;
|
||||||
iface->get_final_date = gcal_week_view_get_final_date;
|
iface->get_final_date = gcal_week_view_get_final_date;
|
||||||
iface->get_children_by_uuid = gcal_week_view_get_children_by_uuid;
|
iface->get_children_by_uuid = gcal_week_view_get_children_by_uuid;
|
||||||
|
iface->clear_marks = gcal_week_view_clear_marks;
|
||||||
/* iface->clear_marks = gcal_week_view_clear_marks; */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user