[california/wip/725767-week] Show events, request event creation when clicking on week days



commit 0cc5fdd1a1bf0ded5eb169742be5422a339c02a8
Author: Jim Nelson <jim yorba org>
Date:   Thu May 15 20:12:05 2014 -0700

    Show events, request event creation when clicking on week days

 src/calendar/calendar-exact-time-span.vala |    8 ++++
 src/toolkit/toolkit-button-connector.vala  |    2 +-
 src/toolkit/toolkit-button-event.vala      |   49 +++++++++++++++++++++++----
 src/toolkit/toolkit.vala                   |   31 -----------------
 src/view/week/week-day-pane.vala           |   14 ++++++++
 src/view/week/week-grid.vala               |   17 ++++-----
 src/view/week/week-pane.vala               |   14 ++++++++
 7 files changed, 86 insertions(+), 49 deletions(-)
---
diff --git a/src/calendar/calendar-exact-time-span.vala b/src/calendar/calendar-exact-time-span.vala
index 2ed1473..60aa3bd 100644
--- a/src/calendar/calendar-exact-time-span.vala
+++ b/src/calendar/calendar-exact-time-span.vala
@@ -88,6 +88,14 @@ public class ExactTimeSpan : BaseObject, Gee.Comparable<ExactTimeSpan>, Gee.Hash
     }
     
     /**
+     * Returns true if the { link ExactTime} is in this { link ExactTimeSpan}.
+     */
+    public bool contains(ExactTime exact_time) {
+        return start_exact_time.compare_to(exact_time) <= 0
+            && end_exact_time.compare_to(exact_time) >= 0;
+    }
+    
+    /**
      * Compares the { link start_exact_time} of two { link ExactTimeSpan}s.
      */
     public int compare_to(ExactTimeSpan other) {
diff --git a/src/toolkit/toolkit-button-connector.vala b/src/toolkit/toolkit-button-connector.vala
index 9c62e70..042d977 100644
--- a/src/toolkit/toolkit-button-connector.vala
+++ b/src/toolkit/toolkit-button-connector.vala
@@ -57,7 +57,7 @@ public class ButtonConnector : EventConnector {
             base.update_release(widget, release_event);
             
             cancel_timeout();
-            timeout_id = Timeout.add(CLICK_DETERMINATION_DELAY_MSEC, on_timeout);
+            timeout_id = Timeout.add(CLICK_DETERMINATION_DELAY_MSEC, on_timeout, Priority.LOW);
         }
         
         private bool on_timeout() {
diff --git a/src/toolkit/toolkit-button-event.vala b/src/toolkit/toolkit-button-event.vala
index 1aa3f80..917a54f 100644
--- a/src/toolkit/toolkit-button-event.vala
+++ b/src/toolkit/toolkit-button-event.vala
@@ -7,6 +7,37 @@
 namespace California.Toolkit {
 
 /**
+ * Enumeration for (mouse) buttons.
+ *
+ * @see ButtonConnector
+ */
+public enum Button {
+    PRIMARY,
+    SECONDARY,
+    TERTIARY,
+    OTHER;
+    
+    /**
+     * Converts the button field of a Gdk.EventButton to a { link Button} enumeration.
+     */
+    public static Button from_event(Gdk.EventButton event) {
+        switch (event.button) {
+            case 1:
+                return PRIMARY;
+            
+            case 3:
+                return SECONDARY;
+            
+            case 2:
+                return TERTIARY;
+            
+            default:
+                return OTHER;
+        }
+    }
+}
+
+/**
  * Details of a (mouse) button event as reported by { link ButtonConnector}.
  */
 
@@ -32,19 +63,21 @@ public class ButtonEvent : BaseObject {
     /**
      * The x,y coordinates (in { link widget}'s coordinate system} the last press occurred.
      */
-    public Gdk.Point press_point { get; private set; }
+    private Gdk.Point _press_point = Gdk.Point();
+    public Gdk.Point press_point { get { return _press_point; } }
     
     /**
      * The x,y coordinates (in { link widget}'s coordinate system} the last release occurred.
      */
-    public Gdk.Point release_point { get; private set; }
+    private Gdk.Point _release_point = Gdk.Point();
+    public Gdk.Point release_point { get { return _release_point; } }
     
     internal ButtonEvent(Gtk.Widget widget, Gdk.EventButton press_event) {
         this.widget = widget;
         button = Button.from_event(press_event);
         press_type = press_event.type;
-        press_point.x = (int) press_event.x;
-        press_point.y = (int) press_event.y;
+        _press_point.x = (int) press_event.x;
+        _press_point.y = (int) press_event.y;
     }
     
     // Update state with the next button press
@@ -53,8 +86,8 @@ public class ButtonEvent : BaseObject {
         assert(Button.from_event(press_event) == button);
         
         press_type = press_event.type;
-        press_point.x = (int) press_event.x;
-        press_point.y = (int) press_event.y;
+        _press_point.x = (int) press_event.x;
+        _press_point.y = (int) press_event.y;
     }
     
     // Update state with the next button release and start the release timer
@@ -62,8 +95,8 @@ public class ButtonEvent : BaseObject {
         assert(this.widget == widget);
         assert(Button.from_event(release_event) == button);
         
-        release_point.x = (int) release_event.x;
-        release_point.y = (int) release_event.y;
+        _release_point.x = (int) release_event.x;
+        _release_point.y = (int) release_event.y;
     }
     
     public override string to_string() {
diff --git a/src/toolkit/toolkit.vala b/src/toolkit/toolkit.vala
index 5661dd8..ec84471 100644
--- a/src/toolkit/toolkit.vala
+++ b/src/toolkit/toolkit.vala
@@ -22,37 +22,6 @@ public const int DEFAULT_STACK_TRANSITION_DURATION_MSEC = 300;
  */
 public const int SLOW_STACK_TRANSITION_DURATION_MSEC = 500;
 
-/**
- * Enumeration for (mouse) buttons.
- *
- * @see ButtonConnector
- */
-public enum Button {
-    PRIMARY,
-    SECONDARY,
-    TERTIARY,
-    OTHER;
-    
-    /**
-     * Converts the button field of a Gdk.EventButton to a { link Button} enumeration.
-     */
-    public static Button from_event(Gdk.EventButton event) {
-        switch (event.button) {
-            case 1:
-                return PRIMARY;
-            
-            case 3:
-                return SECONDARY;
-            
-            case 2:
-                return TERTIARY;
-            
-            default:
-                return OTHER;
-        }
-    }
-}
-
 private int init_count = 0;
 
 public void init() throws Error {
diff --git a/src/view/week/week-day-pane.vala b/src/view/week/week-day-pane.vala
index 66d570f..6af8151 100644
--- a/src/view/week/week-day-pane.vala
+++ b/src/view/week/week-day-pane.vala
@@ -57,6 +57,20 @@ internal class DayPane : Pane {
         queue_draw();
     }
     
+    public Component.Event? get_event_at(Gdk.Point point) {
+        Calendar.ExactTime exact_time = new Calendar.ExactTime(Calendar.Timezone.local, date,
+            get_wall_time(point.y));
+        foreach (Component.Event event in days_events) {
+            if (event.is_all_day)
+                continue;
+            
+            if (exact_time in event.exact_time_span)
+                return event;
+        }
+        
+        return null;
+    }
+    
     // 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) {
diff --git a/src/view/week/week-grid.vala b/src/view/week/week-grid.vala
index 799ac61..eb4f214 100644
--- a/src/view/week/week-grid.vala
+++ b/src/view/week/week-grid.vala
@@ -101,7 +101,6 @@ internal class Grid : Gtk.Box {
         // connect panes' event signal handlers
         day_pane_button_connector.clicked.connect(on_day_pane_clicked);
         day_pane_button_connector.double_clicked.connect(on_day_pane_double_clicked);
-        day_pane_button_connector.triple_clicked.connect(on_day_pane_triple_clicked);
         
         // set up calendar subscriptions for the week
         subscriptions = new Backing.CalendarSubscriptionManager(
@@ -176,21 +175,21 @@ internal class Grid : Gtk.Box {
         if (details.button != Toolkit.Button.PRIMARY)
             return;
         
-        debug("clicked");
+        DayPane day_pane = (DayPane) details.widget;
+        
+        Component.Event? event = day_pane.get_event_at(details.press_point);
+        if (event != null)
+            owner.request_display_event(event, day_pane, details.press_point);
     }
     
     private void on_day_pane_double_clicked(Toolkit.ButtonEvent details) {
         if (details.button != Toolkit.Button.PRIMARY)
             return;
         
-        debug("double clicked");
-    }
-    
-    private void on_day_pane_triple_clicked(Toolkit.ButtonEvent details) {
-        if (details.button != Toolkit.Button.PRIMARY)
-            return;
+        DayPane day_pane = (DayPane) details.widget;
         
-        debug("triple clicked");
+        owner.request_create_all_day_event(new Calendar.DateSpan.from_span(day_pane.date),
+            day_pane, details.press_point);
     }
 }
 
diff --git a/src/view/week/week-pane.vala b/src/view/week/week-pane.vala
index 3a03826..b9fac89 100644
--- a/src/view/week/week-pane.vala
+++ b/src/view/week/week-pane.vala
@@ -115,6 +115,20 @@ internal abstract class Pane : Gtk.EventBox {
     protected int get_text_y(Calendar.WallTime wall_time) {
         return get_line_y(wall_time) + Palette.LINE_PADDING_PX;
     }
+    
+    /**
+     * Returns the { link Calendar.WallTime} for a y-coordinate down to the minute;
+     */
+    protected Calendar.WallTime get_wall_time(int y) {
+        // every hour gets two "lines" of text
+        int one_hour = line_height_px * 2;
+        
+        int hour = y / one_hour;
+        int rem = y % one_hour;
+        double min = ((double) rem / (double) one_hour) * 60.0;
+        
+        return new Calendar.WallTime(hour, (int) min, 0);
+    }
 }
 
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]