merge with master
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / pixfader.h
index cd0f62be9d7df3379002e3aa91e5de2060ff6e35..26942371d36612a0c04644775ffd94da3e0afc54 100644 (file)
 #define __gtkmm2ext_pixfader_h__
 
 #include <cmath>
+#include <stdint.h>
 
 #include <gtkmm/drawingarea.h>
 #include <gtkmm/adjustment.h>
-#include <gdkmm/pixbuf.h>
+#include <gdkmm.h>
+
+#include "gtkmm2ext/visibility.h"
 
 namespace Gtkmm2ext {
 
-class PixFader : public Gtk::DrawingArea
+class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea
 {
   public:
-       PixFader (Glib::RefPtr<Gdk::Pixbuf> belt_image, Gtk::Adjustment& adjustment, int orientation, int);
+        PixFader (Gtk::Adjustment& adjustment, int orientation, int span, int girth);
        virtual ~PixFader ();
 
-       void set_fader_length (int);
-       
+       void set_default_value (float);
+       void set_text (const std::string&);
+
   protected:
+       Glib::RefPtr<Pango::Layout> _layout;
+       std::string                 _text;
+       int   _text_width;
+       int   _text_height;
+       double text_r;
+       double text_g;
+       double text_b;
+
        Gtk::Adjustment& adjustment;
 
        void on_size_request (GtkRequisition*);
+       void on_size_allocate (Gtk::Allocation& alloc);
 
        bool on_expose_event (GdkEventExpose*);
        bool on_button_press_event (GdkEventButton*);
        bool on_button_release_event (GdkEventButton*);
        bool on_motion_notify_event (GdkEventMotion*);
        bool on_scroll_event (GdkEventScroll* ev);
+       bool on_enter_notify_event (GdkEventCrossing* ev);
+       bool on_leave_notify_event (GdkEventCrossing* ev);
+        void on_state_changed (Gtk::StateType);
+        void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
 
        enum Orientation {
-               VERT=1,
-               HORIZ=2,
+               VERT,
+               HORIZ,
        };
 
   private:
-       Glib::RefPtr<Gdk::Pixbuf> pixbuf;
        int span, girth;
        int _orien;
+        cairo_pattern_t* pattern;
+
+        struct FaderImage {
+           cairo_pattern_t* pattern;
+           double fr;
+           double fg;
+           double fb;
+           double br;
+           double bg;
+           double bb;
+           int width;
+           int height;
+
+           FaderImage (cairo_pattern_t* p, 
+                       double afr, double afg, double afb, 
+                       double abr, double abg, double abb,
+                       int w, int h) 
+                   : pattern (p)
+                   , fr (afr)
+                   , fg (afg)
+                   , fb (afb)
+                   , br (abr)
+                   , bg (abg)
+                   , bb (abb)
+                   , width (w)
+                   , height (h)
+           {}
+
+           bool matches (double afr, double afg, double afb, 
+                         double abr, double abg, double abb,
+                         int w, int h) {
+                   return width == w && 
+                           height == h &&
+                           afr == fr &&
+                           afg == fg && 
+                           afb == fb &&
+                           abr == br &&
+                           abg == bg && 
+                           abb == bb;
+           }
+       };
 
-       GdkRectangle view;
+        static std::list<FaderImage*> _patterns;
+        static cairo_pattern_t* find_pattern (double afr, double afg, double afb, 
+                                             double abr, double abg, double abb, 
+                                             int w, int h);
+
+       bool _hovering;
 
        GdkWindow* grab_window;
        double grab_loc;
@@ -68,11 +130,10 @@ class PixFader : public Gtk::DrawingArea
        int unity_loc;
 
        void adjustment_changed ();
-
        int display_span ();
-
-       static int fine_scale_modifier;
-       static int extra_fine_scale_modifier;
+       void set_adjustment_from_event (GdkEventButton *);
+       void update_unity_position ();
+       void create_patterns();
 };