Fix PBD::copy_file on windows to work with non-ascii paths
[ardour.git] / libs / canvas / canvas / canvas.h
index b14f20b69c0e13bafab72e0f9c1418beef5ce9dc..c7054e4c01ec49b214ae44f4b1d1c01c152d87ad 100644 (file)
 
 #include "canvas/root_group.h"
 
+namespace Gtk {
+       class Window;
+       class Label;
+}
+
 namespace ArdourCanvas
 {
 struct Rect;
@@ -82,6 +87,9 @@ public:
                return &_root;
        }
 
+        void set_background_color (ArdourCanvas::Color);
+        ArdourCanvas::Color background_color() const { return _bg_color; }
+
        /** Called when an item is being destroyed */
        virtual void item_going_away (Item *, boost::optional<Rect>) {}
        void item_shown_or_hidden (Item *);
@@ -89,8 +97,6 @@ public:
        void item_changed (Item *, boost::optional<Rect>);
        void item_moved (Item *, boost::optional<Rect>);
 
-        virtual Cairo::RefPtr<Cairo::Context> context () = 0;
-
         Duple canvas_to_window (Duple const&, bool rounded = true) const;
         Duple window_to_canvas (Duple const&) const;
 
@@ -135,13 +141,26 @@ public:
         std::string indent() const;
         std::string render_indent() const;
         void dump (std::ostream&) const;
-    
-protected:
-       void queue_draw_item_area (Item *, Rect);
+
+       /** Ask the canvas to pick the current item again, and generate
+           an enter event for it.
+       */
+       virtual void re_enter () = 0;
+
+       virtual void start_tooltip_timeout (Item*) {}
+       virtual void stop_tooltip_timeout () {}
+
+       /** Set the timeout used to display tooltips, in milliseconds
+        */
+       static void set_tooltip_timeout (uint32_t msecs);
        
-       /** our root item */
-       Root _root;
+protected:
+       Root  _root;
+        Color _bg_color;
+
+       static uint32_t tooltip_timeout_msecs;
 
+       void queue_draw_item_area (Item *, Rect);
         virtual void pick_current_item (int state) = 0;
         virtual void pick_current_item (Duple const &, int state) = 0;
 
@@ -161,17 +180,26 @@ public:
        void focus (Item *);
        void unfocus (Item*);
 
-       Cairo::RefPtr<Cairo::Context> context ();
-
        Rect visible_area () const;
        Coord width() const;
        Coord height() const;
 
        bool get_mouse_position (Duple& winpos) const;
 
+       void set_single_exposure (bool s) { _single_exposure = s; }
+       bool single_exposure () { return _single_exposure; }
+
+       void re_enter ();
+
+       void start_tooltip_timeout (Item*);
+       void stop_tooltip_timeout ();
+
 protected:
+       void on_size_allocate (Gtk::Allocation&);
        bool on_scroll_event (GdkEventScroll *);
        bool on_expose_event (GdkEventExpose *);
+       bool on_key_press_event (GdkEventKey *);
+       bool on_key_release_event (GdkEventKey *);
        bool on_button_press_event (GdkEventButton *);
        bool on_button_release_event (GdkEventButton* event);
        bool on_motion_notify_event (GdkEventMotion *);
@@ -190,6 +218,8 @@ private:
        void item_going_away (Item *, boost::optional<Rect>);
        bool send_leave_event (Item const *, double, double) const;
 
+       Cairo::RefPtr<Cairo::Surface> canvas_image;
+
         /** Item currently chosen for event delivery based on pointer position */
         Item * _current_item;
         /** Item pending as _current_item */
@@ -198,6 +228,16 @@ private:
        Item * _grabbed_item;
         /** the item that currently has key focus or 0 */
        Item * _focused_item;
+       
+       bool _single_exposure;
+
+       sigc::connection tooltip_timeout_connection;
+       Item* current_tooltip_item;
+       Gtk::Window* tooltip_window;
+       Gtk::Label* tooltip_label;
+       bool show_tooltip ();
+       void hide_tooltip ();
+       bool really_start_tooltip_timeout ();
 };
 
 /** A GTK::Alignment with a GtkCanvas inside it plus some Gtk::Adjustments for