(1) awful grungy code to make tab/shift-tab correctly end route editing in track+bus tab (2) traversify the track+bus tab so that s/m/r keys solo/mute/rec-enable the appropriate things (more work to do here to follow modifier conventions established elsewhere)
git-svn-id: svn://localhost/ardour2/branches/3.0@7855 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
fef6643165
commit
9f3f3738e7
|
@ -58,12 +58,15 @@ using namespace Glib;
|
||||||
using Gtkmm2ext::Keyboard;
|
using Gtkmm2ext::Keyboard;
|
||||||
|
|
||||||
EditorRoutes::EditorRoutes (Editor* e)
|
EditorRoutes::EditorRoutes (Editor* e)
|
||||||
: EditorComponent (e),
|
: EditorComponent (e)
|
||||||
_ignore_reorder (false),
|
, _ignore_reorder (false)
|
||||||
_no_redisplay (false),
|
, _no_redisplay (false)
|
||||||
_redisplay_does_not_sync_order_keys (false),
|
, _redisplay_does_not_sync_order_keys (false)
|
||||||
_redisplay_does_not_reset_order_keys (false),
|
, _redisplay_does_not_reset_order_keys (false)
|
||||||
_menu (0)
|
,_menu (0)
|
||||||
|
, old_focus (0)
|
||||||
|
, selection_countdown (0)
|
||||||
|
, name_editable (0)
|
||||||
{
|
{
|
||||||
_scroller.add (_display);
|
_scroller.add (_display);
|
||||||
_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
|
_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
|
||||||
|
@ -156,7 +159,9 @@ EditorRoutes::EditorRoutes (Editor* e)
|
||||||
_display.append_column (*solo_isolate_state_column);
|
_display.append_column (*solo_isolate_state_column);
|
||||||
_display.append_column (*solo_safe_state_column);
|
_display.append_column (*solo_safe_state_column);
|
||||||
|
|
||||||
_display.append_column (_("Name"), _columns.text);
|
int colnum = _display.append_column (_("Name"), _columns.text);
|
||||||
|
TreeViewColumn* c = _display.get_column (colnum-1);
|
||||||
|
c->set_data ("i_am_the_tab_column", (void*) 0xfeedface);
|
||||||
_display.append_column (_("V"), _columns.visible);
|
_display.append_column (_("V"), _columns.visible);
|
||||||
|
|
||||||
_display.set_headers_visible (true);
|
_display.set_headers_visible (true);
|
||||||
|
@ -171,6 +176,7 @@ EditorRoutes::EditorRoutes (Editor* e)
|
||||||
CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (5));
|
CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (5));
|
||||||
|
|
||||||
assert (name_cell);
|
assert (name_cell);
|
||||||
|
name_cell->signal_editing_started().connect (sigc::mem_fun (*this, &EditorRoutes::name_edit_started));
|
||||||
|
|
||||||
TreeViewColumn* name_column = _display.get_column (5);
|
TreeViewColumn* name_column = _display.get_column (5);
|
||||||
|
|
||||||
|
@ -201,11 +207,71 @@ EditorRoutes::EditorRoutes (Editor* e)
|
||||||
_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &EditorRoutes::reordered));
|
_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &EditorRoutes::reordered));
|
||||||
|
|
||||||
_display.signal_button_press_event().connect (sigc::mem_fun (*this, &EditorRoutes::button_press), false);
|
_display.signal_button_press_event().connect (sigc::mem_fun (*this, &EditorRoutes::button_press), false);
|
||||||
_display.signal_key_press_event().connect (sigc::mem_fun(*this, &EditorRoutes::key_press), false);
|
_scroller.signal_key_press_event().connect (sigc::mem_fun(*this, &EditorRoutes::key_press), false);
|
||||||
|
|
||||||
|
_scroller.signal_focus_in_event().connect (sigc::mem_fun (*this, &EditorRoutes::focus_in), false);
|
||||||
|
_scroller.signal_focus_out_event().connect (sigc::mem_fun (*this, &EditorRoutes::focus_out));
|
||||||
|
|
||||||
|
_display.signal_enter_notify_event().connect (sigc::mem_fun (*this, &EditorRoutes::enter_notify), false);
|
||||||
|
_display.signal_leave_notify_event().connect (sigc::mem_fun (*this, &EditorRoutes::leave_notify), false);
|
||||||
|
|
||||||
|
_display.set_enable_search (false);
|
||||||
|
|
||||||
Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, ui_bind (&EditorRoutes::sync_order_keys, this, _1), gui_context());
|
Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, ui_bind (&EditorRoutes::sync_order_keys, this, _1), gui_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EditorRoutes::focus_in (GdkEventFocus*)
|
||||||
|
{
|
||||||
|
Window* win = dynamic_cast<Window*> (_scroller.get_toplevel ());
|
||||||
|
|
||||||
|
if (win) {
|
||||||
|
old_focus = win->get_focus ();
|
||||||
|
} else {
|
||||||
|
old_focus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to do nothing on focus in (doesn't work, hence selection_count nonsense) */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EditorRoutes::focus_out (GdkEventFocus*)
|
||||||
|
{
|
||||||
|
if (old_focus) {
|
||||||
|
old_focus->grab_focus ();
|
||||||
|
old_focus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EditorRoutes::enter_notify (GdkEventCrossing* ev)
|
||||||
|
{
|
||||||
|
/* arm counter so that ::selection_filter() will deny selecting anything for the
|
||||||
|
next two attempts to change selection status.
|
||||||
|
*/
|
||||||
|
selection_countdown = 2;
|
||||||
|
_scroller.grab_focus ();
|
||||||
|
Keyboard::magic_widget_grab_focus ();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EditorRoutes::leave_notify (GdkEventCrossing*)
|
||||||
|
{
|
||||||
|
selection_countdown = 0;
|
||||||
|
|
||||||
|
if (old_focus) {
|
||||||
|
old_focus->grab_focus ();
|
||||||
|
old_focus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Keyboard::magic_widget_drop_focus ();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EditorRoutes::set_session (Session* s)
|
EditorRoutes::set_session (Session* s)
|
||||||
{
|
{
|
||||||
|
@ -242,12 +308,12 @@ EditorRoutes::on_tv_mute_enable_toggled (std::string const & path_string)
|
||||||
Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
|
Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
|
||||||
|
|
||||||
TimeAxisView *tv = row[_columns.tv];
|
TimeAxisView *tv = row[_columns.tv];
|
||||||
AudioTimeAxisView *atv = dynamic_cast<AudioTimeAxisView*> (tv);
|
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
|
||||||
|
|
||||||
if (atv != 0) {
|
if (rtv != 0) {
|
||||||
boost::shared_ptr<RouteList> rl (new RouteList);
|
boost::shared_ptr<RouteList> rl (new RouteList);
|
||||||
rl->push_back (atv->route());
|
rl->push_back (rtv->route());
|
||||||
_session->set_mute (rl, !atv->route()->muted(), Session::rt_cleanup);
|
_session->set_mute (rl, !rtv->route()->muted(), Session::rt_cleanup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -815,10 +881,22 @@ bool
|
||||||
EditorRoutes::key_press (GdkEventKey* ev)
|
EditorRoutes::key_press (GdkEventKey* ev)
|
||||||
{
|
{
|
||||||
TreeViewColumn *col;
|
TreeViewColumn *col;
|
||||||
|
boost::shared_ptr<RouteList> rl (new RouteList);
|
||||||
|
TreePath path;
|
||||||
|
|
||||||
|
cerr << "our key press\n";
|
||||||
|
|
||||||
switch (ev->keyval) {
|
switch (ev->keyval) {
|
||||||
case GDK_Tab:
|
case GDK_Tab:
|
||||||
case GDK_ISO_Left_Tab:
|
case GDK_ISO_Left_Tab:
|
||||||
|
|
||||||
|
/* If we appear to be editing something, leave that cleanly and appropriately.
|
||||||
|
*/
|
||||||
|
if (name_editable) {
|
||||||
|
name_editable->editing_done ();
|
||||||
|
name_editable = 0;
|
||||||
|
}
|
||||||
|
|
||||||
col = _display.get_column (5); // select&focus on name column
|
col = _display.get_column (5); // select&focus on name column
|
||||||
|
|
||||||
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
||||||
|
@ -830,6 +908,26 @@ EditorRoutes::key_press (GdkEventKey* ev)
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
if (get_relevant_routes (rl)) {
|
||||||
|
_session->set_mute (rl, !rl->front()->muted(), Session::rt_cleanup);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
if (get_relevant_routes (rl)) {
|
||||||
|
_session->set_solo (rl, !rl->front()->soloed(), Session::rt_cleanup);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
if (get_relevant_routes (rl)) {
|
||||||
|
_session->set_record_enabled (rl, !rl->front()->record_enabled(), Session::rt_cleanup);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -837,6 +935,49 @@ EditorRoutes::key_press (GdkEventKey* ev)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EditorRoutes::get_relevant_routes (boost::shared_ptr<RouteList> rl)
|
||||||
|
{
|
||||||
|
TimeAxisView* tv;
|
||||||
|
RouteTimeAxisView* rtv;
|
||||||
|
RefPtr<TreeSelection> selection = _display.get_selection();
|
||||||
|
TreePath path;
|
||||||
|
TreeIter iter;
|
||||||
|
|
||||||
|
if (selection->count_selected_rows() != 0) {
|
||||||
|
|
||||||
|
/* use selection */
|
||||||
|
|
||||||
|
RefPtr<TreeModel> tm = RefPtr<TreeModel>::cast_dynamic (_model);
|
||||||
|
iter = selection->get_selected (tm);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* use mouse pointer */
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
int bx, by;
|
||||||
|
|
||||||
|
_display.get_pointer (x, y);
|
||||||
|
_display.convert_widget_to_bin_window_coords (x, y, bx, by);
|
||||||
|
|
||||||
|
if (_display.get_path_at_pos (bx, by, path)) {
|
||||||
|
iter = _model->get_iter (path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iter) {
|
||||||
|
tv = (*iter)[_columns.tv];
|
||||||
|
if (tv) {
|
||||||
|
rtv = dynamic_cast<RouteTimeAxisView*>(tv);
|
||||||
|
if (rtv) {
|
||||||
|
rl->push_back (rtv->route());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !rl->empty();
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
EditorRoutes::button_press (GdkEventButton* ev)
|
EditorRoutes::button_press (GdkEventButton* ev)
|
||||||
{
|
{
|
||||||
|
@ -877,9 +1018,16 @@ EditorRoutes::button_press (GdkEventButton* ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
EditorRoutes::selection_filter (Glib::RefPtr<TreeModel> const &, TreeModel::Path const &path , bool already_selected)
|
EditorRoutes::selection_filter (Glib::RefPtr<TreeModel> const &, TreeModel::Path const &path , bool selected)
|
||||||
{
|
{
|
||||||
cerr << path.to_string() << " is " << (already_selected ? " already selected " : " not selected ") << endl;
|
if (selection_countdown) {
|
||||||
|
if (--selection_countdown == 0) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
/* no selection yet ... */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,10 +1315,19 @@ EditorRoutes::clear ()
|
||||||
_display.set_model (_model);
|
_display.set_model (_model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EditorRoutes::name_edit_started (CellEditable* ce, const Glib::ustring&)
|
||||||
|
{
|
||||||
|
name_editable = ce;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EditorRoutes::name_edit (std::string const & path, std::string const & new_text)
|
EditorRoutes::name_edit (std::string const & path, std::string const & new_text)
|
||||||
{
|
{
|
||||||
|
name_editable = 0;
|
||||||
|
|
||||||
TreeIter iter = _model->get_iter (path);
|
TreeIter iter = _model->get_iter (path);
|
||||||
|
|
||||||
if (!iter) {
|
if (!iter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,8 +137,18 @@ private:
|
||||||
bool _redisplay_does_not_reset_order_keys;
|
bool _redisplay_does_not_reset_order_keys;
|
||||||
|
|
||||||
Gtk::Menu* _menu;
|
Gtk::Menu* _menu;
|
||||||
|
Gtk::Widget* old_focus;
|
||||||
|
uint32_t selection_countdown;
|
||||||
|
Gtk::CellEditable* name_editable;
|
||||||
|
|
||||||
bool key_press (GdkEventKey* ev);
|
bool key_press (GdkEventKey* ev);
|
||||||
|
bool focus_in (GdkEventFocus*);
|
||||||
|
bool focus_out (GdkEventFocus*);
|
||||||
|
bool enter_notify (GdkEventCrossing*);
|
||||||
|
bool leave_notify (GdkEventCrossing*);
|
||||||
|
void name_edit_started (Gtk::CellEditable*, const Glib::ustring&);
|
||||||
|
|
||||||
|
bool get_relevant_routes (boost::shared_ptr<ARDOUR::RouteList> rl);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ardour_gtk_editor_route_h__ */
|
#endif /* __ardour_gtk_editor_route_h__ */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user