From 1526735d7925bf07f7a6c3378a87bf559e11050a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 26 Aug 2010 23:25:44 +0000 Subject: [PATCH] some (unfinished) work on incorporating Ben's rev 6919 changes regarding track selection; make newly selected tracks show the current range selection; fix crashes related to meter display; remove "all" group from main group tab display and just put it down in its own button (totally incomplete); minor cleanups git-svn-id: svn://localhost/ardour2/branches/3.0@7696 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.h | 2 +- gtk2_ardour/editor_drag.cc | 7 ++- gtk2_ardour/editor_mouse.cc | 12 ++--- gtk2_ardour/editor_route_groups.cc | 21 +++----- gtk2_ardour/editor_route_groups.h | 6 ++- gtk2_ardour/editor_selection.cc | 85 +++++++++++++++++++++++++++++- gtk2_ardour/gain_meter.cc | 7 +-- gtk2_ardour/ui_config.cc | 2 +- libs/ardour/ardour/session.h | 4 +- libs/ardour/audioengine.cc | 1 - libs/ardour/midi_ui.cc | 2 - libs/ardour/session.cc | 47 +++++++++-------- libs/ardour/session_state.cc | 6 +++ libs/evoral/src/ControlList.cpp | 4 +- 14 files changed, 147 insertions(+), 59 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 3b306e1594..3f9dc6d880 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -645,7 +645,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false); void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false); - void set_selected_track_as_side_effect (bool force = false); + void set_selected_track_as_side_effect (Selection::Operation op, bool force = false); bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false); bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index cef27660a6..90e67d77af 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3401,14 +3401,16 @@ SelectionDrag::motion (GdkEvent* event, bool first_move) if (_copy) { /* adding to the selection */ - _editor->selection->add (_editor->clicked_axisview); + _editor->set_selected_track_as_side_effect (Selection::Add); + //_editor->selection->add (_editor->clicked_axisview); _editor->clicked_selection = _editor->selection->add (start, end); _copy = false; } else { /* new selection */ if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) { - _editor->selection->set (_editor->clicked_axisview); + //_editor->selection->set (_editor->clicked_axisview); + _editor->set_selected_track_as_side_effect (Selection::Set); } _editor->clicked_selection = _editor->selection->set (start, end); @@ -3417,6 +3419,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move) /* select the track that we're in */ if (find (_added_time_axes.begin(), _added_time_axes.end(), pending_time_axis.first) == _added_time_axes.end()) { + // _editor->set_selected_track_as_side_effect (Selection::Add); _editor->selection->add (pending_time_axis.first); _added_time_axes.push_back (pending_time_axis.first); } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index a7b370a04b..0346ca11ef 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -478,7 +478,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { selection->clear_tracks (); - set_selected_track_as_side_effect (true); + set_selected_track_as_side_effect (op, true); } if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty()) { clicked_selection = select_range_around_region (selection->regions.front()); @@ -492,7 +492,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { - set_selected_track_as_side_effect (); + set_selected_track_as_side_effect (op); } break; @@ -504,12 +504,12 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { - set_selected_track_as_side_effect (); + set_selected_track_as_side_effect (op); } break; case ControlPointItem: - set_selected_track_as_side_effect (true); + set_selected_track_as_side_effect (op, true); if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) { set_selected_control_point_from_click (op, false); } @@ -519,12 +519,12 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp /* for context click, select track */ if (event->button.button == 3) { selection->clear_tracks (); - set_selected_track_as_side_effect (true); + set_selected_track_as_side_effect (op, true); } break; case AutomationTrackItem: - set_selected_track_as_side_effect (true); + set_selected_track_as_side_effect (op, true); break; default: diff --git a/gtk2_ardour/editor_route_groups.cc b/gtk2_ardour/editor_route_groups.cc index 2f9f27ae2c..d4ab4542ea 100644 --- a/gtk2_ardour/editor_route_groups.cc +++ b/gtk2_ardour/editor_route_groups.cc @@ -47,8 +47,9 @@ using namespace Gtk; using Gtkmm2ext::Keyboard; EditorRouteGroups::EditorRouteGroups (Editor* e) - : EditorComponent (e), - _in_row_change (false) + : EditorComponent (e) + , _all_group_active_button (_("\"all\" group")) + , _in_row_change (false) { _model = ListStore::create (_columns); @@ -135,7 +136,6 @@ EditorRouteGroups::EditorRouteGroups (Editor* e) _display.signal_button_press_event().connect (sigc::mem_fun(*this, &EditorRouteGroups::button_press_event), false); - _display_packer = new VBox; HBox* button_box = manage (new HBox()); button_box->set_homogeneous (true); @@ -158,8 +158,11 @@ EditorRouteGroups::EditorRouteGroups (Editor* e) button_box->pack_start (*add_button); button_box->pack_start (*remove_button); - _display_packer->pack_start (_scroller, true, true); - _display_packer->pack_start (*button_box, false, false); + _all_group_active_button.show (); + + _display_packer.pack_start (_scroller, true, true); + _display_packer.pack_start (_all_group_active_button, false, false); + _display_packer.pack_start (*button_box, false, false); } void @@ -418,14 +421,6 @@ EditorRouteGroups::groups_changed () _model->clear (); - { - TreeModel::Row row; - row = *(_model->append()); - row[_columns.is_visible] = true; - row[_columns.text] = (_("-all-")); - row[_columns.routegroup] = 0; - } - if (_session) { _session->foreach_route_group (sigc::mem_fun (*this, &EditorRouteGroups::add)); } diff --git a/gtk2_ardour/editor_route_groups.h b/gtk2_ardour/editor_route_groups.h index 402f8e2aed..5610596be1 100644 --- a/gtk2_ardour/editor_route_groups.h +++ b/gtk2_ardour/editor_route_groups.h @@ -27,10 +27,11 @@ public: void set_session (ARDOUR::Session *); Gtk::Widget& widget () { - return *_display_packer; + return _display_packer; } void clear (); + Gtk::ToggleButton& all_group_active_button() { return _all_group_active_button; } private: @@ -75,7 +76,8 @@ private: Glib::RefPtr _selection; Gtk::TreeView _display; Gtk::ScrolledWindow _scroller; - Gtk::VBox* _display_packer; + Gtk::VBox _display_packer; + Gtk::ToggleButton _all_group_active_button; bool _in_row_change; PBD::ScopedConnection property_changed_connection; }; diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index e99b31c478..bde72e5374 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -174,12 +174,83 @@ Editor::select_all_tracks () * tracks, in which case nothing will happen unless `force' is true. */ void -Editor::set_selected_track_as_side_effect (bool force) +Editor::set_selected_track_as_side_effect (Selection::Operation op, bool force) { + cerr << "E::sstase ca = " << clicked_axisview << " cr = " << clicked_routeview + << " op = " << op << " force = " << force + << endl; + if (!clicked_axisview) { return; } +#if 1 + if (!clicked_routeview) { + return; + } + + RouteGroup* group = clicked_routeview->route()->route_group(); + + switch (op) { + case Selection::Toggle: + if (selection->selected (clicked_axisview)) { + if (_session->all_route_group().is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + selection->remove(*i); + } + } else if (group && group->is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + if ((*i)->route_group() == group) + selection->remove(*i); + } + } else { + selection->remove (clicked_axisview); + } + } else { + if (_session->all_route_group().is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + selection->add(*i); + } + } else if (group && group->is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + if ( (*i)->route_group() == group) + selection->add(*i); + } + } else { + selection->add (clicked_axisview); + } + } + break; + + case Selection::Add: + selection->clear(); + cerr << ("Editor::set_selected_track_as_side_effect case Selection::Add not yet implemented\n"); + break; + + case Selection::Set: + selection->clear(); + if (_session->all_route_group().is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + selection->add(*i); + } + } else if (group && group->is_active()) { + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { + if ((*i)->route_group() == group) + selection->add(*i); + } + } else { + selection->set (clicked_axisview); + } + break; + + case Selection::Extend: + selection->clear(); + cerr << ("Editor::set_selected_track_as_side_effect case Selection::Add not yet implemented\n"); + break; + } + +#else // the older version + if (!selection->tracks.empty()) { if (!selection->selected (clicked_axisview)) { selection->add (clicked_axisview); @@ -188,6 +259,7 @@ Editor::set_selected_track_as_side_effect (bool force) } else if (force) { selection->set (clicked_axisview); } +#endif } void @@ -797,12 +869,21 @@ Editor::track_selection_changed () } for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - (*i)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), *i) != selection->tracks.end()); + + bool yn = (find (selection->tracks.begin(), selection->tracks.end(), *i) != selection->tracks.end()); + + (*i)->set_selected (yn); TimeAxisView::Children c = (*i)->get_child_list (); for (TimeAxisView::Children::iterator j = c.begin(); j != c.end(); ++j) { (*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end()); } + + if (yn) { + (*i)->reshow_selection (selection->time); + } else { + (*i)->hide_selection (); + } } ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty()); diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 9ae59f63e6..1bc9dc3f79 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -92,7 +92,6 @@ GainMeterBase::GainMeterBase (Session* s, ignore_toggle = false; meter_menu = 0; next_release_selects = false; - style_changed = true; _width = Wide; if (horizontal) { @@ -915,12 +914,8 @@ GainMeter::render_metrics (Gtk::Widget& w) gint GainMeter::meter_metrics_expose (GdkEventExpose *ev) { - static Glib::RefPtr meter_style; - if (style_changed) { - meter_style = meter_metric_area.get_style(); - } Glib::RefPtr win (meter_metric_area.get_window()); - Glib::RefPtr bg_gc (meter_style->get_bg_gc (Gtk::STATE_INSENSITIVE)); + Glib::RefPtr bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_INSENSITIVE)); GdkRectangle base_rect; GdkRectangle draw_rect; gint width, height; diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc index e80c85da8f..b61ef1b551 100644 --- a/gtk2_ardour/ui_config.cc +++ b/gtk2_ardour/ui_config.cc @@ -134,7 +134,7 @@ UIConfiguration::load_state () string rcfile = user_ui_rc_file.to_string(); - info << string_compose (_("Loading user ui configuration file %1"), rcfile) << endl; + info << string_compose (_("Loading user ui configuration file %1"), rcfile) << endmsg; if (!tree.read (rcfile)) { error << string_compose(_("cannot read ui configuration file \"%1\""), rcfile) << endmsg; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 75b9fb1831..88f62aa9b3 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -393,7 +393,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void add_route_group (RouteGroup *); void remove_route_group (RouteGroup&); - RouteGroup *route_group_by_name (std::string); + RouteGroup* route_group_by_name (std::string); + RouteGroup& all_route_group() const; PBD::Signal1 route_group_added; PBD::Signal0 route_group_removed; @@ -1171,6 +1172,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi int load_route_groups (const XMLNode&, int); std::list _route_groups; + RouteGroup* _all_route_group; /* routes stuff */ diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 12f0254ec2..9a946a1c0a 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -243,7 +243,6 @@ AudioEngine::start () error << _("Cannot create temporary MIDI port to determine MIDI buffer size") << endmsg; } else { _raw_buffer_sizes[DataType::MIDI] = jack_midi_max_event_size (jack_port_get_buffer(midi_port, blocksize)); - cerr << "MIDI port buffers = " << _raw_buffer_sizes[DataType::MIDI] << endl; jack_port_unregister (_priv_jack, midi_port); } } diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 5d9407d579..5c36d46c3b 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -158,8 +158,6 @@ MidiControlUI::thread_init () strcpy (c, X_("midiUI")); pthread_set_name (c); - cerr << "MIDI UI running\n"; - PBD::notify_gui_about_thread_creation (X_("gui"), pthread_self(), X_("MIDI"), 2048); SessionEvent::create_per_thread_pool (X_("MIDI I/O"), 128); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index ee475c0f32..f687580d3d 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -136,31 +136,35 @@ Session::Session (AudioEngine &eng, BusProfile* bus_profile, string mix_template) - : _engine (eng), - _target_transport_speed (0.0), - _requested_return_frame (-1), - _session_dir (new SessionDirectory(fullpath)), - state_tree (0), - _butler (new Butler (*this)), - _post_transport_work (0), - _send_timecode_update (false), - route_graph (new Graph(*this)), - routes (new RouteList), - _total_free_4k_blocks (0), - _bundles (new BundleList), - _bundle_xml_node (0), - _click_io ((IO*) 0), - click_data (0), - click_emphasis_data (0), - main_outs (0), - _metadata (new SessionMetadata()), - _have_rec_enabled_track (false), - _suspend_timecode_transmission (0) + : _engine (eng) + , _target_transport_speed (0.0) + , _requested_return_frame (-1) + , _session_dir (new SessionDirectory(fullpath)) + , state_tree (0) + , _butler (new Butler (*this)) + , _post_transport_work (0) + , _send_timecode_update (false) + , _all_route_group (new RouteGroup (*this, "all")) + , route_graph (new Graph(*this)) + , routes (new RouteList) + , _total_free_4k_blocks (0) + , _bundles (new BundleList) + , _bundle_xml_node (0) + , _click_io ((IO*) 0) + , click_data (0) + , click_emphasis_data (0) + , main_outs (0) + , _metadata (new SessionMetadata()) + , _have_rec_enabled_track (false) + , _suspend_timecode_transmission (0) { _locations = new Locations (*this); playlists.reset (new SessionPlaylists); - + + _all_route_group->set_edit (true); + _all_route_group->set_active (true, this); + interpolation.add_channel_to (0, 0); if (!eng.connected()) { @@ -241,6 +245,7 @@ Session::destroy () _butler->drop_references (); delete _butler; delete midi_control_ui; + delete _all_route_group; if (click_data != default_click) { delete [] click_data; diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 225b7c1909..6d319d23b8 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -2295,6 +2295,12 @@ Session::route_group_by_name (string name) return 0; } +RouteGroup& +Session::all_route_group() const +{ + return *_all_route_group; +} + UndoTransaction* Session::start_reversible_command (const string& name) { diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp index 72af04a2d1..b41141a61e 100644 --- a/libs/evoral/src/ControlList.cpp +++ b/libs/evoral/src/ControlList.cpp @@ -390,7 +390,9 @@ ControlList::fast_simple_add (double when, double value) void ControlList::add (double when, double value) { - /* this is for graphical editing */ + /* this is for making changes from some kind of user interface or + control surface (GUI, MIDI, OSC etc) + */ { Glib::Mutex::Lock lm (_lock); -- 2.30.2