diff options
Diffstat (limited to 'gtk2_ardour/panner.cc')
-rw-r--r-- | gtk2_ardour/panner.cc | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/gtk2_ardour/panner.cc b/gtk2_ardour/panner.cc new file mode 100644 index 0000000000..bb9b432184 --- /dev/null +++ b/gtk2_ardour/panner.cc @@ -0,0 +1,104 @@ +#include <iostream> + +#include "panner.h" + +using namespace std; + +static const int triangle_size = 5; + +static void +null_label_callback (char* buf, unsigned int bufsize) +{ + /* no label */ + + buf[0] = '\0'; +} + + +PannerBar::PannerBar (Gtk::Adjustment& adj, PBD::Controllable& c) + : BarController (adj, c, sigc::ptr_fun (null_label_callback)) +{ + set_style (BarController::Line); +} + +PannerBar::~PannerBar () +{ +} + +bool +PannerBar::expose (GdkEventExpose* ev) +{ + Glib::RefPtr<Gdk::Window> win (darea.get_window()); + Glib::RefPtr<Gdk::GC> gc (get_style()->get_base_gc (get_state())); + + BarController::expose (ev); + + /* now draw triangles for left, right and center */ + + GdkPoint points[3]; + + // left + + points[0].x = 0; + points[0].y = 0; + + points[1].x = triangle_size; + points[1].y = 0; + + points[2].x = 0; + points[2].y = triangle_size; + + gdk_draw_polygon (win->gobj(), gc->gobj(), true, points, 3); + + // center + + points[0].x = (darea.get_width()/2 - triangle_size); + points[0].y = 0; + + points[1].x = (darea.get_width()/2 + triangle_size) - 1; + points[1].y = 0; + + points[2].x = darea.get_width()/2 - 1; + points[2].y = triangle_size - 1; + + gdk_draw_polygon (win->gobj(), gc->gobj(), true, points, 3); + + // right + + points[0].x = (darea.get_width() - triangle_size) - 1; + points[0].y = 0; + + points[1].x = darea.get_width() - 1; + points[1].y = 0; + + points[2].x = darea.get_width() - 1; + points[2].y = triangle_size; + + gdk_draw_polygon (win->gobj(), gc->gobj(), true, points, 3); + + return true; +} + +bool +PannerBar::button_press (GdkEventButton* ev) +{ + if (ev->button == 1 && ev->type == GDK_BUTTON_PRESS && ev->y < 10) { + if (ev->x < triangle_size) { + adjustment.set_value (adjustment.get_lower()); + } else if (ev->x > (darea.get_width() - triangle_size)) { + adjustment.set_value (adjustment.get_upper()); + } else if (ev->x > (darea.get_width()/2 - triangle_size) && + ev->x < (darea.get_width()/2 + triangle_size)) { + adjustment.set_value (adjustment.get_lower() + ((adjustment.get_upper() - adjustment.get_lower()) / 2.0)); + } + } + + return BarController::button_press (ev); +} + +bool +PannerBar::button_release (GdkEventButton* ev) +{ + return BarController::button_release (ev); +} + |