deep, somewhat subtle changes for transport control. Everything should use Session...
[ardour.git] / libs / gtkmm2ext / pixscroller.cc
index 78f1725271645b37ee210534fc9b33d9f6e7dd4f..f459726f274820caa910d180ab55620dbe39c571 100644 (file)
@@ -29,30 +29,23 @@ using namespace std;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 
-PixScroller::PixScroller (Adjustment& a, Pix& pix)
-       : adj (a)
+PixScroller::PixScroller (Adjustment& a, 
+                         Glib::RefPtr<Gdk::Pixbuf> s,
+                         Glib::RefPtr<Gdk::Pixbuf> r)
+       : adj (a),
+         rail (r),
+         slider (s)
 {
        dragging = false;
-       add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
+       add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
 
        adj.signal_value_changed().connect (mem_fun (*this, &PixScroller::adjustment_changed));
        default_value = adj.get_value();
 
-       pix.generate ();
-
-       rail = *(pix.pixmap (0));
-       rail_mask = *(pix.shape_mask (0));
-       slider = *(pix.pixmap (1));
-       slider_mask = *(pix.shape_mask (1));
-
-       int w, h;
-
-       slider->get_size (w, h);
-       sliderrect.set_width(w);
-       sliderrect.set_height(h);
-       rail->get_size (w, h);
-       railrect.set_width(w);
-       railrect.set_height(h);
+       sliderrect.set_width(slider->get_width());
+       sliderrect.set_height(slider->get_height());
+       railrect.set_width(rail->get_width());
+       railrect.set_height(rail->get_height());
 
        railrect.set_y(sliderrect.get_height() / 2);
        sliderrect.set_x(0);
@@ -60,7 +53,7 @@ PixScroller::PixScroller (Adjustment& a, Pix& pix)
        overall_height = railrect.get_height() + sliderrect.get_height();
 
        sliderrect.set_y((int) rint ((overall_height - sliderrect.get_height()) * (adj.get_upper() - adj.get_value())));
-       railrect.set_x((sliderrect.get_width() / 2) - 3);
+       railrect.set_x((sliderrect.get_width() / 2) - 2);
 }
 
 void
@@ -84,33 +77,34 @@ PixScroller::on_expose_event (GdkEventExpose* ev)
 
        if (gdk_rectangle_intersect (railrect.gobj(), &ev->area, &intersect)) {
                Glib::RefPtr<Gdk::GC> gc(get_style()->get_bg_gc(get_state()));
-               win->draw_drawable (gc, rail, 
-                                intersect.x - railrect.get_x(),
-                                intersect.y - railrect.get_y(),
-                                intersect.x, 
-                                intersect.y, 
-                                intersect.width,
-                                intersect.height);
+               win->draw_pixbuf (gc, rail, 
+                                 intersect.x - railrect.get_x(),
+                                 intersect.y - railrect.get_y(),
+                                 intersect.x, 
+                                 intersect.y, 
+                                 intersect.width,
+                                 intersect.height,
+                                 Gdk::RGB_DITHER_NONE, 0, 0);
        }
        
        if (gdk_rectangle_intersect (sliderrect.gobj(), &ev->area, &intersect)) {
                Glib::RefPtr<Gdk::GC> gc(get_style()->get_fg_gc(get_state()));
-               Glib::RefPtr<Gdk::Bitmap> mask (slider_mask);
-// Do these have a gtk2 equivalent?
-//             Gdk::GCValues values;
-//             gc->get_values(values);
+               // Glib::RefPtr<Gdk::Bitmap> mask (slider_mask);
+
+               GdkGCValues values;
+               gdk_gc_get_values(gc->gobj(), &values);
                gc->set_clip_origin (sliderrect.get_x(), sliderrect.get_y());
-               gc->set_clip_mask (mask);
-               win->draw_drawable (gc, slider, 
-                                intersect.x - sliderrect.get_x(),
-                                intersect.y - sliderrect.get_y(),
-                                intersect.x, 
-                                intersect.y, 
-                                intersect.width,
-                                intersect.height);
-//             gc->set_clip_origin(values.clip_x_origin, values.clip_y_origin);
-//             Gdk::Bitmap i_hate_gdk (values.clip_mask);
-//             gc->set_clip_mask (i_hate_gdk);
+               // gc->set_clip_mask (mask);
+               win->draw_pixbuf (gc, slider, 
+                                 intersect.x - sliderrect.get_x(),
+                                 intersect.y - sliderrect.get_y(),
+                                 intersect.x, 
+                                 intersect.y, 
+                                 intersect.width,
+                                 intersect.height,
+                                 Gdk::RGB_DITHER_NONE, 0, 0);
+               gc->set_clip_origin (values.clip_x_origin, values.clip_y_origin);
+               // gdk_gc_set_clip_mask (gc->gobj(), values.clip_mask);
        }
 
 
@@ -182,11 +176,34 @@ PixScroller::on_button_release_event (GdkEventButton* ev)
                        }
                }
                break;
-       case 4:
+       default:
+               break;
+       }
+       return false;
+}
+
+bool
+PixScroller::on_scroll_event (GdkEventScroll* ev)
+{
+       double scale;
+       
+       if (ev->state & GDK_CONTROL_MASK) {
+               if (ev->state & GDK_MOD1_MASK) {
+                       scale = 0.05;
+               } else {
+                       scale = 0.1;
+               }
+       } else {
+               scale = 0.5;
+       }
+
+       switch (ev->direction) {
+
+       case GDK_SCROLL_UP:
                /* wheel up */
                adj.set_value (adj.get_value() + (adj.get_page_increment() * scale));
                break;
-       case 5:
+       case GDK_SCROLL_DOWN:
                /* wheel down */
                adj.set_value (adj.get_value() - (adj.get_page_increment() * scale));
                break;