[california/wip/725767-week] Begin showing event boxes in display
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [california/wip/725767-week] Begin showing event boxes in display
- Date: Sat, 10 May 2014 02:27:57 +0000 (UTC)
commit 58c09adb39a470ddb12fe72960c435e9710ee928
Author: Jim Nelson <jim yorba org>
Date: Fri May 9 19:27:47 2014 -0700
Begin showing event boxes in display
src/view/week/week-day-pane.vala | 55 +++++++++++++++++++++++++++++++++++++-
src/view/week/week-grid.vala | 26 ++++++++++++++++-
2 files changed, 78 insertions(+), 3 deletions(-)
---
diff --git a/src/view/week/week-day-pane.vala b/src/view/week/week-day-pane.vala
index 714def6..5fe9f13 100644
--- a/src/view/week/week-day-pane.vala
+++ b/src/view/week/week-day-pane.vala
@@ -15,6 +15,8 @@ internal class DayPane : Pane {
public bool selected { get; set; default = false; }
+ private Gee.TreeSet<Component.Event> days_events = new Gee.TreeSet<Component.Event>();
+
public DayPane(Grid owner, Calendar.Date date) {
base (owner, -1);
@@ -37,6 +39,20 @@ internal class DayPane : Pane {
queue_draw();
}
+ public void add_event(Component.Event event) {
+ if (!days_events.add(event))
+ return;
+
+ queue_draw();
+ }
+
+ public void remove_event(Component.Event event) {
+ if (!days_events.remove(event))
+ return;
+
+ queue_draw();
+ }
+
// note that a painter's algorithm should be used here: background should be painted before
// calling base method, and foreground afterward
protected override bool on_draw(Cairo.Context ctx) {
@@ -49,7 +65,44 @@ internal class DayPane : Pane {
ctx.paint();
}
- return base.on_draw(ctx);
+ base.on_draw(ctx);
+
+ int width = get_allocated_width();
+
+ foreach (Component.Event event in days_events) {
+ if (event.is_all_day)
+ continue;
+
+ Calendar.DateSpan date_span = event.get_event_date_span(Calendar.Timezone.local);
+ if (!date_span.is_same_day || !(date in date_span))
+ continue;
+
+ Calendar.WallTime start_time = new Calendar.WallTime.from_exact_time(
+ event.exact_time_span.start_exact_time.to_timezone(Calendar.Timezone.local));
+ Calendar.WallTime end_time = new Calendar.WallTime.from_exact_time(
+ event.exact_time_span.end_exact_time.to_timezone(Calendar.Timezone.local));
+
+ int start_y = get_line_y(start_time);
+ int end_y = get_line_y(end_time);
+
+ Gdk.RGBA bg = event.calendar_source.color_as_rgba();
+
+ ctx.move_to(0, start_y);
+ ctx.line_to(width, start_y);
+ ctx.line_to(width, end_y);
+ ctx.line_to(0, end_y);
+ ctx.close_path();
+
+ bg.alpha = 0.25;
+ Gdk.cairo_set_source_rgba(ctx, bg);
+ ctx.fill_preserve();
+
+ bg.alpha = 0.0;
+ Gdk.cairo_set_source_rgba(ctx, bg);
+ ctx.stroke();
+ }
+
+ return true;
}
}
diff --git a/src/view/week/week-grid.vala b/src/view/week/week-grid.vala
index ead338a..ffeb93a 100644
--- a/src/view/week/week-grid.vala
+++ b/src/view/week/week-grid.vala
@@ -40,6 +40,7 @@ internal class Grid : Gtk.Box {
public string id { owned get { return "%d:%s".printf(week.week_of_month,
week.month_of_year.abbrev_name); } }
private Backing.CalendarSubscriptionManager subscriptions;
+ private Gee.HashMap<Calendar.Date, DayPane> date_to_panes = new Gee.HashMap<Calendar.Date, DayPane>();
public Grid(Controller owner, Calendar.Week week) {
Object(orientation: Gtk.Orientation.VERTICAL, spacing: 0);
@@ -83,6 +84,8 @@ internal class Grid : Gtk.Box {
pane.expand = true;
pane_grid.attach(pane, col, 0, 1, 1);
+ date_to_panes.set(date, pane);
+
col++;
}
@@ -98,7 +101,8 @@ internal class Grid : Gtk.Box {
new Calendar.ExactTimeSpan.from_span(week, Calendar.Timezone.local));
subscriptions.calendar_added.connect(on_calendar_added);
subscriptions.calendar_removed.connect(on_calendar_removed);
- subscriptions.instance_added.connect(on_calendar_instance_added);
+ subscriptions.instance_added.connect(on_calendar_instance_added_or_altered);
+ subscriptions.instance_altered.connect(on_calendar_instance_added_or_altered);
subscriptions.instance_removed.connect(on_calendar_instance_removed);
// only start now if owner is display this week, otherwise use timeout (to prevent
@@ -137,10 +141,28 @@ internal class Grid : Gtk.Box {
private void on_calendar_removed(Backing.CalendarSource calendar) {
}
- private void on_calendar_instance_added(Component.Instance instance) {
+ private void on_calendar_instance_added_or_altered(Component.Instance instance) {
+ Component.Event? event = instance as Component.Event;
+ if (event == null)
+ return;
+
+ foreach (Calendar.Date date in event.get_event_date_span(Calendar.Timezone.local)) {
+ DayPane? day_pane = date_to_panes.get(date);
+ if (day_pane != null)
+ day_pane.add_event(event);
+ }
}
private void on_calendar_instance_removed(Component.Instance instance) {
+ Component.Event? event = instance as Component.Event;
+ if (event == null)
+ return;
+
+ foreach (Calendar.Date date in event.get_event_date_span(Calendar.Timezone.local)) {
+ DayPane? day_pane = date_to_panes.get(date);
+ if (day_pane != null)
+ day_pane.remove_event(event);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]