new GUIs for stereo panners

git-svn-id: svn://localhost/ardour2/trunk@1236 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-12-20 21:03:11 +00:00
parent 99e92a1172
commit f66a09c344
8 changed files with 166 additions and 21 deletions

View File

@ -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

View File

@ -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"

113
gtk2_ardour/panner.cc Normal file
View File

@ -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);
}

18
gtk2_ardour/panner.h Normal file
View File

@ -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__ */

View File

@ -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;

View File

@ -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);

View File

@ -456,3 +456,10 @@ BarController::set_use_parent (bool yn)
use_parent = yn;
queue_draw ();
}
void
BarController::set_sensitive (bool yn)
{
Frame::set_sensitive (yn);
darea.set_sensitive (yn);
}

View File

@ -35,10 +35,6 @@ class BarController : public Gtk::Frame
BarController (Gtk::Adjustment& adj, PBD::Controllable&, sigc::slot<void,char*,unsigned int>);
virtual ~BarController () {}
void set_sensitive (bool yn) {
darea.set_sensitive (yn);
}
enum Style {
LeftToRight,
RightToLeft,
@ -53,6 +49,8 @@ class BarController : public Gtk::Frame
void set_with_text (bool yn);
void set_use_parent (bool yn);
void set_sensitive (bool yn);
Gtk::SpinButton& get_spin_button() { return spinner; }
sigc::signal<void> StartGesture;
@ -79,12 +77,12 @@ class BarController : public Gtk::Frame
Gtk::SpinButton spinner;
bool use_parent;
bool button_press (GdkEventButton *);
bool button_release (GdkEventButton *);
bool motion (GdkEventMotion *);
bool expose (GdkEventExpose *);
bool scroll (GdkEventScroll *);
bool entry_focus_out (GdkEventFocus*);
virtual bool button_press (GdkEventButton *);
virtual bool button_release (GdkEventButton *);
virtual bool motion (GdkEventMotion *);
virtual bool expose (GdkEventExpose *);
virtual bool scroll (GdkEventScroll *);
virtual bool entry_focus_out (GdkEventFocus*);
gint mouse_control (double x, GdkWindow* w, double scaling);