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,7 +295,13 @@ MixerStrip::init ()
else else
set_name ("AudioTrackStripBase"); 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)); 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_selected(bool yn);
void set_stuff_from_route (); 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: private:
Mixer_UI& _mixer; 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); 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 void
Mixer_UI::parameter_changed (string const & p) 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 (); void get_window_pos_and_size ();
bool on_key_press_event (GdkEventKey*); bool on_key_press_event (GdkEventKey*);
bool on_key_release_event (GdkEventKey*);
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*); 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_sizing(TREE_VIEW_COLUMN_FIXED);
processor_display.get_column(0)->set_fixed_width(48); processor_display.get_column(0)->set_fixed_width(48);
processor_display.add_object_drag (columns.processor.index(), "processors"); 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)); processor_display.signal_drop.connect (mem_fun (*this, &ProcessorBox::object_drop));
TreeViewColumn* name_col = processor_display.get_column(0); TreeViewColumn* name_col = processor_display.get_column(0);
@ -153,9 +154,11 @@ ProcessorBox::ProcessorBox (Session& sess, PluginSelector &plugsel,
pack_start (processor_eventbox, true, true); pack_start (processor_eventbox, true, true);
processor_eventbox.signal_enter_notify_event().connect (bind ( processor_display.signal_enter_notify_event().connect (mem_fun(*this, &ProcessorBox::enter_notify), false);
sigc::ptr_fun (ProcessorBox::enter_box), processor_display.signal_leave_notify_event().connect (mem_fun(*this, &ProcessorBox::leave_notify), false);
this));
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 ( 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);
@ -313,6 +316,91 @@ ProcessorBox::processor_drag_end (GdkDragContext *context)
processor_drag_in_progress = false; 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 bool
ProcessorBox::processor_button_press_event (GdkEventButton *ev) ProcessorBox::processor_button_press_event (GdkEventButton *ev)
{ {
@ -392,10 +480,8 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev)
} else { } else {
_placement = PostFader; _placement = PostFader;
} }
cerr << "had processor " << processor->name() << " placement = " << _placement << endl;
} else { } else {
_placement = PostFader; _placement = PostFader;
cerr << "no processor, postfader\n";
} }
show_processor_menu (ev->time); show_processor_menu (ev->time);
@ -741,10 +827,10 @@ ProcessorBox::processor_name (boost::weak_ptr<Processor> weak_processor)
switch (_width) { switch (_width) {
case Wide: case Wide:
name_display += processor->name(); name_display += processor->display_name();
break; break;
case Narrow: case Narrow:
name_display += PBD::short_version (processor->name(), 5); name_display += PBD::short_version (processor->display_name(), 5);
break; break;
} }
@ -826,6 +912,7 @@ ProcessorBox::compute_processor_sort_keys ()
Route::ProcessorList our_processors; Route::ProcessorList our_processors;
for (Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { 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]); 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 void
ProcessorBox::register_actions () ProcessorBox::register_actions ()
{ {

View file

@ -158,6 +158,10 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
bool no_processor_redisplay; bool no_processor_redisplay;
bool ignore_delete; 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_press_event (GdkEventButton *);
bool processor_button_release_event (GdkEventButton *); bool processor_button_release_event (GdkEventButton *);
void redisplay_processors (); 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); void weird_plugin_dialog (ARDOUR::Plugin& p, ARDOUR::Route::ProcessorStreams streams);
static ProcessorBox* _current_processor_box; 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_plugin ();
static void rb_choose_insert (); static void rb_choose_insert ();

View file

@ -26,6 +26,7 @@
#include <gtkmm2ext/gtk_ui.h> #include <gtkmm2ext/gtk_ui.h>
#include "ardour/route_group.h" #include "ardour/route_group.h"
#include "ardour/dB.h"
#include "pbd/memento_command.h" #include "pbd/memento_command.h"
#include "pbd/stacktrace.h" #include "pbd/stacktrace.h"
#include "pbd/shiva.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_press(GdkEventButton*);
bool show_sends_release(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 build_sends_menu ();
void set_sends_gain_from_track (); void set_sends_gain_from_track ();
void set_sends_gain_to_zero (); void set_sends_gain_to_zero ();