Initial commit
[fillmore] / src / marina / Ruler.vala
diff --git a/src/marina/Ruler.vala b/src/marina/Ruler.vala
new file mode 100644 (file)
index 0000000..9bd0477
--- /dev/null
@@ -0,0 +1,80 @@
+/* Copyright 2009 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution. 
+ */
+
+namespace View {
+public class Ruler : Gtk.DrawingArea {
+    weak Model.TimeSystem provider;
+    const int BORDER = 4;
+
+    public signal void position_changed(int x);
+
+    public Ruler(Model.TimeSystem provider, int height) {
+        this.provider = provider;
+        set_flags(Gtk.WidgetFlags.NO_WINDOW);
+        set_size_request(0, height);
+    }
+
+    public override bool expose_event(Gdk.EventExpose event) {
+        int x = event.area.x;
+        int frame = provider.get_start_token(x);
+
+        Cairo.Context context = Gdk.cairo_create(window);
+
+        Gdk.cairo_set_source_color(context, parse_color("#777"));
+        context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height);
+        context.fill();
+
+        Cairo.Antialias old_antialias = context.get_antialias();
+
+        context.set_antialias(Cairo.Antialias.NONE);
+        context.set_source_rgb(1.0, 1.0, 1.0);
+        int stop = event.area.x + event.area.width;
+        Pango.FontDescription f = Pango.FontDescription.from_string("Sans 9");
+        while (x <= stop) {
+            x = provider.frame_to_xsize(frame);
+            int y = provider.get_pixel_height(frame);
+
+            context.move_to(x + BORDER, 0);
+            context.line_to(x + BORDER, y);
+
+            string? display_string = provider.get_display_string(frame);
+            if (display_string != null) {
+                Pango.Layout layout = create_pango_layout(display_string);
+
+                int w;
+                int h;
+                layout.set_font_description(f);
+                layout.get_pixel_size (out w, out h);
+                int text_pos = x - (w / 2) + BORDER;
+                if (text_pos < 0) {
+                    text_pos = 0;
+                }
+
+                Gdk.draw_layout(window, style.white_gc, text_pos, 7, layout);
+            }
+
+            frame = provider.get_next_position(frame);
+        }
+        context.set_antialias(old_antialias);
+        context.set_line_width(1.0);
+        context.stroke();
+        return true;
+    }
+
+    public override bool button_press_event(Gdk.EventButton event) {
+        position_changed((int) event.x);
+        return false;
+    }
+
+    public override bool motion_notify_event(Gdk.EventMotion event) {
+        if ((event.state & Gdk.ModifierType.BUTTON1_MASK) != 0) {
+            queue_draw();
+            position_changed((int) event.x);
+        }
+        return false;
+    }
+}
+}