traverso-style mixer window bindings. note: messes up some bindings when mouse is not in the processor box (fix to follow); notes: m=mute, s=solo, g=gain_up ctrl-g=gain_down r=rec-enable e=show-sends KP_0=toggle processor active status (selected or pointed-at)

git-svn-id: svn://localhost/ardour2/branches/3.0@5356 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-07-13 23:09:16 +00:00
parent 385635c445
commit 17bfb7cad5
8 changed files with 256 additions and 30 deletions

View File

@ -295,8 +295,14 @@ MixerStrip::init ()
else
set_name ("AudioTrackStripBase");
add_events (Gdk::BUTTON_RELEASE_MASK);
add_events (Gdk::BUTTON_RELEASE_MASK|
Gdk::ENTER_NOTIFY_MASK|
Gdk::LEAVE_NOTIFY_MASK|
Gdk::KEY_PRESS_MASK|
Gdk::KEY_RELEASE_MASK);
set_flags (get_flags() | Gtk::CAN_FOCUS);
SwitchIO.connect (mem_fun (*this, &MixerStrip::switch_io));
}
@ -1486,3 +1492,110 @@ MixerStrip::set_button_names ()
}
}
bool
MixerStrip::on_key_press_event (GdkEventKey* ev)
{
GdkEventButton fake;
fake.type = GDK_BUTTON_PRESS;
fake.button = 1;
fake.state = ev->state;
switch (ev->keyval) {
case GDK_m:
mute_press (&fake);
return true;
break;
case GDK_s:
solo_press (&fake);
return true;
break;
case GDK_r:
rec_enable_press (&fake);
return true;
break;
case GDK_e:
show_sends_press (&fake);
return true;
break;
case GDK_g:
if (ev->state & Keyboard::PrimaryModifier) {
step_gain_down ();
} else {
step_gain_up ();
}
return true;
break;
default:
break;
}
return false;
}
bool
MixerStrip::on_key_release_event (GdkEventKey* ev)
{
GdkEventButton fake;
fake.type = GDK_BUTTON_RELEASE;
fake.button = 1;
fake.state = ev->state;
switch (ev->keyval) {
case GDK_m:
mute_release (&fake);
return true;
break;
case GDK_s:
solo_release (&fake);
return true;
break;
case GDK_r:
rec_enable_release (&fake);
return true;
break;
case GDK_e:
show_sends_release (&fake);
return true;
break;
case GDK_g:
return true;
break;
default:
break;
}
return false;
}
bool
MixerStrip::on_enter_notify_event (GdkEventCrossing* ev)
{
Keyboard::magic_widget_grab_focus ();
grab_focus ();
return false;
}
bool
MixerStrip::on_leave_notify_event (GdkEventCrossing* ev)
{
switch (ev->detail) {
case GDK_NOTIFY_INFERIOR:
break;
default:
Keyboard::magic_widget_drop_focus ();
}
return false;
}

View File

@ -109,6 +109,11 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void set_selected(bool yn);
void set_stuff_from_route ();
bool on_leave_notify_event (GdkEventCrossing* ev);
bool on_enter_notify_event (GdkEventCrossing* ev);
bool on_key_press_event (GdkEventKey* ev);
bool on_key_release_event (GdkEventKey* ev);
private:
Mixer_UI& _mixer;

View File

@ -1475,6 +1475,12 @@ Mixer_UI::on_key_press_event (GdkEventKey* ev)
return key_press_focus_accelerator_handler (*this, ev);
}
bool
Mixer_UI::on_key_release_event (GdkEventKey* ev)
{
return key_press_focus_accelerator_handler (*this, ev);
}
void
Mixer_UI::parameter_changed (string const & p)
{

View File

@ -115,6 +115,7 @@ class Mixer_UI : public Gtk::Window
void get_window_pos_and_size ();
bool on_key_press_event (GdkEventKey*);
bool on_key_release_event (GdkEventKey*);
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);

View File

@ -135,6 +135,7 @@ ProcessorBox::ProcessorBox (Session& sess, PluginSelector &plugsel,
processor_display.get_column(0)->set_sizing(TREE_VIEW_COLUMN_FIXED);
processor_display.get_column(0)->set_fixed_width(48);
processor_display.add_object_drag (columns.processor.index(), "processors");
processor_display.set_enable_search (false);
processor_display.signal_drop.connect (mem_fun (*this, &ProcessorBox::object_drop));
TreeViewColumn* name_col = processor_display.get_column(0);
@ -153,14 +154,16 @@ ProcessorBox::ProcessorBox (Session& sess, PluginSelector &plugsel,
pack_start (processor_eventbox, true, true);
processor_eventbox.signal_enter_notify_event().connect (bind (
sigc::ptr_fun (ProcessorBox::enter_box),
this));
processor_display.signal_enter_notify_event().connect (mem_fun(*this, &ProcessorBox::enter_notify), false);
processor_display.signal_leave_notify_event().connect (mem_fun(*this, &ProcessorBox::leave_notify), false);
processor_display.signal_key_press_event().connect (mem_fun(*this, &ProcessorBox::processor_key_press_event));
processor_display.signal_key_release_event().connect (mem_fun(*this, &ProcessorBox::processor_key_release_event));
processor_display.signal_button_press_event().connect (
mem_fun(*this, &ProcessorBox::processor_button_press_event), false);
mem_fun(*this, &ProcessorBox::processor_button_press_event), false);
processor_display.signal_button_release_event().connect (
mem_fun(*this, &ProcessorBox::processor_button_release_event));
mem_fun(*this, &ProcessorBox::processor_button_release_event));
}
ProcessorBox::~ProcessorBox ()
@ -313,6 +316,91 @@ ProcessorBox::processor_drag_end (GdkDragContext *context)
processor_drag_in_progress = false;
}
bool
ProcessorBox::enter_notify (GdkEventCrossing* ev)
{
_current_processor_box = this;
Keyboard::magic_widget_grab_focus ();
processor_display.grab_focus ();
return false;
}
bool
ProcessorBox::leave_notify (GdkEventCrossing* ev)
{
switch (ev->detail) {
case GDK_NOTIFY_INFERIOR:
break;
default:
Keyboard::magic_widget_drop_focus ();
}
return false;
}
bool
ProcessorBox::processor_key_press_event (GdkEventKey *ev)
{
/* do real stuff on key release */
return false;
}
bool
ProcessorBox::processor_key_release_event (GdkEventKey *ev)
{
bool ret = false;
ProcSelection targets;
get_selected_processors (targets);
if (targets.empty()) {
int x, y;
TreeIter iter;
TreeModel::Path path;
TreeViewColumn* column;
int cellx;
int celly;
processor_display.get_pointer (x, y);
if (processor_display.get_path_at_pos (x, y, path, column, cellx, celly)) {
if ((iter = model->get_iter (path))) {
targets.push_back ((*iter)[columns.processor]);
}
}
}
if (targets.empty()) {
return ret;
}
switch (ev->keyval) {
case GDK_Delete:
case GDK_BackSpace:
delete_processors ();
ret = true;
break;
case GDK_KP_0:
for (ProcSelection::iterator i = targets.begin(); i != targets.end(); ++i) {
if ((*i)->active()) {
(*i)->deactivate ();
} else {
(*i)->activate ();
}
}
ret = true;
break;
default:
break;
}
return ret;
}
bool
ProcessorBox::processor_button_press_event (GdkEventButton *ev)
{
@ -392,10 +480,8 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev)
} else {
_placement = PostFader;
}
cerr << "had processor " << processor->name() << " placement = " << _placement << endl;
} else {
_placement = PostFader;
cerr << "no processor, postfader\n";
}
show_processor_menu (ev->time);
@ -727,7 +813,7 @@ ProcessorBox::processor_name (boost::weak_ptr<Processor> weak_processor)
string::size_type lbracket, rbracket;
lbracket = send->name().find ('[');
rbracket = send->name().find (']');
switch (_width) {
case Wide:
name_display += send->name().substr (lbracket+1, lbracket-rbracket-1);
@ -741,10 +827,10 @@ ProcessorBox::processor_name (boost::weak_ptr<Processor> weak_processor)
switch (_width) {
case Wide:
name_display += processor->name();
name_display += processor->display_name();
break;
case Narrow:
name_display += PBD::short_version (processor->name(), 5);
name_display += PBD::short_version (processor->display_name(), 5);
break;
}
@ -826,6 +912,7 @@ ProcessorBox::compute_processor_sort_keys ()
Route::ProcessorList our_processors;
for (Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
boost::shared_ptr<Processor> p = (*iter)[columns.processor];
our_processors.push_back ((*iter)[columns.processor]);
}
@ -1319,23 +1406,6 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
}
}
bool
ProcessorBox::enter_box (GdkEventCrossing *ev, ProcessorBox* rb)
{
switch (ev->detail) {
case GDK_NOTIFY_INFERIOR:
break;
case GDK_NOTIFY_VIRTUAL:
/* fallthru */
default:
_current_processor_box = rb;
}
return false;
}
void
ProcessorBox::register_actions ()
{

View File

@ -158,6 +158,10 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
bool no_processor_redisplay;
bool ignore_delete;
bool enter_notify (GdkEventCrossing *ev);
bool leave_notify (GdkEventCrossing *ev);
bool processor_key_press_event (GdkEventKey *);
bool processor_key_release_event (GdkEventKey *);
bool processor_button_press_event (GdkEventButton *);
bool processor_button_release_event (GdkEventButton *);
void redisplay_processors ();
@ -208,8 +212,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams);
static ProcessorBox* _current_processor_box;
static bool enter_box (GdkEventCrossing*, ProcessorBox*);
static bool leave_box (GdkEventCrossing*, ProcessorBox*);
static void rb_choose_plugin ();
static void rb_choose_insert ();

View File

@ -26,6 +26,7 @@
#include <gtkmm2ext/gtk_ui.h>
#include "ardour/route_group.h"
#include "ardour/dB.h"
#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "pbd/shiva.h"
@ -1420,3 +1421,26 @@ RouteUI::parameter_changed (string const & p)
}
}
void
RouteUI::step_gain_up ()
{
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), this);
}
void
RouteUI::page_gain_up ()
{
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), this);
}
void
RouteUI::step_gain_down ()
{
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), this);
}
void
RouteUI::page_gain_down ()
{
_route->set_gain (dB_to_coefficient (coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), this);
}

View File

@ -114,6 +114,11 @@ class RouteUI : public virtual AxisView
bool show_sends_press(GdkEventButton*);
bool show_sends_release(GdkEventButton*);
void step_gain_up ();
void step_gain_down ();
void page_gain_up ();
void page_gain_down ();
void build_sends_menu ();
void set_sends_gain_from_track ();
void set_sends_gain_to_zero ();