[california/wip/725767-week] Begin showing event boxes in display



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]