summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-12-20 21:03:11 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-12-20 21:03:11 +0000
commitf66a09c344188cb6a82c3a5c0035da22d36e2ada (patch)
tree213a5ffaa6136547c18154e8de8c8576693af2b0 /gtk2_ardour
parent99e92a1172d73f829c088ca1a15bb71a5de3fb4b (diff)
new GUIs for stereo panners
git-svn-id: svn://localhost/ardour2/trunk@1236 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/SConscript1
-rw-r--r--gtk2_ardour/ardour2_ui.rc9
-rw-r--r--gtk2_ardour/panner.cc113
-rw-r--r--gtk2_ardour/panner.h18
-rw-r--r--gtk2_ardour/panner_ui.cc17
-rw-r--r--gtk2_ardour/panner_ui.h4
6 files changed, 151 insertions, 11 deletions
diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript
index fe98307c2d..466713272a 100644
--- a/gtk2_ardour/SConscript
+++ b/gtk2_ardour/SConscript
@@ -167,6 +167,7 @@ new_session_dialog.cc
option_editor.cc
opts.cc
pan_automation_time_axis.cc
+panner.cc
panner2d.cc
panner_ui.cc
playlist_selector.cc
diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc
index 35349795e8..c5da7dd2bc 100644
--- a/gtk2_ardour/ardour2_ui.rc
+++ b/gtk2_ardour/ardour2_ui.rc
@@ -968,6 +968,15 @@ style "pan_slider"
text[INSENSITIVE] = { 0.70, 0.70, 0.70 }
text[SELECTED] = { 0.70, 0.70, 0.70 }
text[PRELIGHT] = { 0.70, 0.70, 0.70 }
+
+ # used to draw the triangular indicators
+
+ base[NORMAL] = { 0.93, 0.94, 0.71 }
+ base[ACTIVE] = {0.93, 0.94, 0.71 }
+ base[INSENSITIVE] = {0.32, 0.39, 0.45 } # matches default_base
+ base[SELECTED] = { 0.93, 0.94, 0.71 }
+ base[PRELIGHT] = { 0.93, 0.94, 0.71 }
+
}
style "region_list_whole_file"
diff --git a/gtk2_ardour/panner.cc b/gtk2_ardour/panner.cc
new file mode 100644
index 0000000000..938e8042c0
--- /dev/null
+++ b/gtk2_ardour/panner.cc
@@ -0,0 +1,113 @@
+#include <iostream>
+
+#include "panner.h"
+
+using namespace std;
+
+static const int triangle_size = 9;
+
+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))
+{
+
+}
+
+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];
+
+
+
+ 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);
+
+ points[0].x = darea.get_width()/2 - (triangle_size - 2);
+ points[0].y = 0;
+
+ points[1].x = darea.get_width()/2 + (triangle_size - 2);
+ points[1].y = 0;
+
+ points[2].x = darea.get_width()/2;
+ points[2].y = triangle_size - 2;
+
+ gdk_draw_polygon (win->gobj(), gc->gobj(), true, points, 3);
+
+ points[0].x = darea.get_width() - triangle_size;
+ points[0].y = 0;
+
+ points[1].x = darea.get_width();
+ points[1].y = 0;
+
+ points[2].x = darea.get_width();
+ 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) {
+ return true;
+ } else if (ev->x > (darea.get_width() - triangle_size)) {
+ return true;
+ } else if (ev->x > (darea.get_width()/2 - triangle_size) &&
+ ev->x < (darea.get_width()/2 + triangle_size)) {
+ return true;
+ }
+ }
+
+ return BarController::button_press (ev);
+}
+
+bool
+PannerBar::button_release (GdkEventButton* ev)
+{
+ if (ev->button == 1 && ev->type == GDK_BUTTON_RELEASE && ev->y < 10) {
+ if (ev->x < triangle_size) {
+ adjustment.set_value (adjustment.get_lower());
+ return true;
+ } else if (ev->x > (darea.get_width() - triangle_size)) {
+ adjustment.set_value (adjustment.get_upper());
+ return true;
+ } 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 true;
+ }
+ }
+
+ return BarController::button_release (ev);
+}
diff --git a/gtk2_ardour/panner.h b/gtk2_ardour/panner.h
new file mode 100644
index 0000000000..d06a4c21e3
--- /dev/null
+++ b/gtk2_ardour/panner.h
@@ -0,0 +1,18 @@
+#ifndef __gtk_ardour_panner_h__
+#define __gtk_ardour_panner_h__
+
+#include <gtkmm2ext/barcontroller.h>
+
+class PannerBar : public Gtkmm2ext::BarController
+{
+ public:
+ PannerBar (Gtk::Adjustment& adj, PBD::Controllable&);
+ ~PannerBar ();
+
+ protected:
+ bool expose (GdkEventExpose*);
+ bool button_press (GdkEventButton*);
+ bool button_release (GdkEventButton*);
+};
+
+#endif /* __gtk_ardour_panner_h__ */
diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc
index ccce2ec9f1..b12013e9ee 100644
--- a/gtk2_ardour/panner_ui.cc
+++ b/gtk2_ardour/panner_ui.cc
@@ -30,6 +30,7 @@
#include "panner_ui.h"
#include "panner2d.h"
#include "utils.h"
+#include "panner.h"
#include "gui_thread.h"
#include <ardour/session.h>
@@ -217,7 +218,7 @@ PannerUI::set_width (Width w)
if (panner) {
panner->set_size_request (61, 61);
}
- for (vector<BarController*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
+ for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
(*i)->set_size_request (61, 15);
}
panning_link_button.set_label (_("link"));
@@ -227,7 +228,7 @@ PannerUI::set_width (Width w)
if (panner) {
panner->set_size_request (31, 61);
}
- for (vector<BarController*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
+ for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
(*i)->set_size_request (31, 15);
}
panning_link_button.set_label (_("L"));
@@ -244,7 +245,7 @@ PannerUI::~PannerUI ()
delete (*i);
}
- for (vector<BarController*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
+ for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
delete (*i);
}
@@ -302,7 +303,7 @@ PannerUI::setup_pan ()
while ((asz = pan_adjustments.size()) < npans) {
float x;
- BarController* bc;
+ PannerBar* bc;
/* initialize adjustment with current value of panner */
@@ -313,9 +314,7 @@ PannerUI::setup_pan ()
_io->panner()[asz]->Changed.connect (bind (mem_fun(*this, &PannerUI::pan_value_changed), (uint32_t) asz));
- bc = new BarController (*pan_adjustments[asz],
- _io->panner()[asz]->control(),
- bind (mem_fun(*this, &PannerUI::pan_printer), pan_adjustments[asz]));
+ bc = new PannerBar (*pan_adjustments[asz], _io->panner()[asz]->control());
bc->set_name ("PanSlider");
bc->set_shadow_type (Gtk::SHADOW_NONE);
@@ -341,7 +340,7 @@ PannerUI::setup_pan ()
break;
}
- pan_bar_packer.pack_start (*pan_bars.back(), false, false);
+ pan_bar_packer.pack_start (*pan_bars.back(), true, true);
}
/* now that we actually have the pan bars,
@@ -631,7 +630,7 @@ PannerUI::update_pan_sensitive ()
case 1:
break;
case 2:
- for (vector<BarController*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
+ for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
(*i)->set_sensitive (sensitive);
}
break;
diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h
index 7658978233..b4547a4a0e 100644
--- a/gtk2_ardour/panner_ui.h
+++ b/gtk2_ardour/panner_ui.h
@@ -37,6 +37,7 @@
#include "enums.h"
class Panner2d;
+class PannerBar;
namespace ARDOUR {
class IO;
@@ -44,7 +45,6 @@ namespace ARDOUR {
}
namespace Gtkmm2ext {
class FastMeter;
- class BarController;
}
namespace Gtk {
@@ -107,7 +107,7 @@ class PannerUI : public Gtk::HBox
void panning_link_direction_clicked ();
vector<Gtk::Adjustment*> pan_adjustments;
- vector<Gtkmm2ext::BarController*> pan_bars;
+ vector<PannerBar*> pan_bars;
void pan_adjustment_changed (uint32_t which);
void pan_value_changed (uint32_t which);