From 7ab8a11fb53782dfcf67b652dc65d8d177b0a1b6 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Fri, 12 Dec 2014 17:16:50 -0600 Subject: Enforce internal/external selection exclusivity. --- gtk2_ardour/editor_mouse.cc | 38 +++++++++++++++++++++++++++++++------- gtk2_ardour/midi_region_view.cc | 9 +++++++++ gtk2_ardour/midi_region_view.h | 5 +++++ gtk2_ardour/public_editor.h | 1 + gtk2_ardour/selection.cc | 6 ++++++ gtk2_ardour/selection.h | 4 ++++ gtk2_ardour/time_axis_view_item.cc | 9 +-------- 7 files changed, 57 insertions(+), 15 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index ab153b943b..99f0775106 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -329,13 +329,37 @@ Editor::internal_editing() const void Editor::update_time_selection_display () { - switch (mouse_mode) { - case MouseRange: - selection->clear_objects (); - break; - default: - selection->clear_time (); - break; + if (smart_mode_action->get_active()) { + /* not sure what to do here */ + if (mouse_mode == MouseObject) { + } else { + } + } else { + switch (mouse_mode) { + case MouseRange: + selection->clear_objects (); + selection->ClearMidiNoteSelection(); //signal + break; + case MouseObject: + selection->clear_objects (); + selection->clear_time (); + selection->clear_tracks (); + selection->ClearMidiNoteSelection(); //signal + break; + case MouseContent: + case MouseDraw: + //if we go into internal editing, clear everything in the outside world + selection->clear_objects (); + selection->clear_time (); + selection->clear_tracks (); + break; + default: + //clear everything + selection->clear_objects (); + selection->clear_time (); + selection->clear_tracks (); + break; + } } } diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 8533cefdc0..197e190761 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -135,6 +135,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, connect_to_diskstream (); SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + + PublicEditor& editor (trackview.editor()); + editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ()); } MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, @@ -181,6 +184,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, connect_to_diskstream (); SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + + PublicEditor& editor (trackview.editor()); + editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ()); } void @@ -315,6 +321,9 @@ MidiRegionView::init (bool wfd) connect_to_diskstream (); SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + + PublicEditor& editor (trackview.editor()); + editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ()); } InstrumentInfo& diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 7280ba6e4e..f9cc7c7299 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -348,6 +348,11 @@ private: PBD::ScopedConnection _selection_cleared_connection; void selection_cleared (MidiRegionView *); + /** this handles the case when the "external" world wants us to clear our internal selections + */ + PBD::ScopedConnection _clear_midi_selection_connection; + void clear_midi_selection () { clear_selection(); } + friend class EditNoteDialog; /** Play the NoteOn event of the given note immediately diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 884a1b351b..2cc4673463 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -235,6 +235,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void copy_playlists (TimeAxisView*) = 0; virtual void clear_playlists (TimeAxisView*) = 0; virtual void select_all_tracks () = 0; + virtual void deselect_all () = 0; virtual void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove = false) = 0; virtual void set_selected_mixer_strip (TimeAxisView&) = 0; virtual void hide_track_in_display (TimeAxisView* tv, bool apply_to_selection = false) = 0; diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index b29f5c3241..9f69666497 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -42,6 +42,8 @@ using namespace std; using namespace ARDOUR; using namespace PBD; +PBD::Signal0 Selection::ClearMidiNoteSelection; + struct AudioRangeComparator { bool operator()(AudioRange a, AudioRange b) { return a.start < b.start; @@ -173,6 +175,10 @@ Selection::clear_midi_notes () midi_notes.clear (); MidiNotesChanged (); } + + /* The note selection is actually stored in MidiRegionView, emit signal to + tell them to clear their selection. */ + ClearMidiNoteSelection(); /* EMIT SIGNAL */ } void diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h index 3c14eb9a09..1701d69399 100644 --- a/gtk2_ardour/selection.h +++ b/gtk2_ardour/selection.h @@ -198,6 +198,8 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList * The Track selection isn't affected when ranges or objects are added. */ + void clear_all() { clear_time(); clear_tracks(); clear_objects(); } + void clear_time(); //clears any time selection ( i.e. Range ) void clear_tracks (); //clears the track header selections void clear_objects(); //clears the items listed below @@ -219,6 +221,8 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList XMLNode& get_state () const; int set_state (XMLNode const &, int); + static PBD::Signal0 ClearMidiNoteSelection; + private: PublicEditor const * editor; uint32_t next_time_id; diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index 9df14240f5..2f860d897b 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -782,14 +782,7 @@ TimeAxisViewItem::set_frame_color() set_frame_gradient (); if (!_recregion) { - uint32_t f = ARDOUR_UI::config()->color ("time axis frame"); - - if (!rect_visible) { - /* make the frame outline be visible but rather transparent */ - f = UINT_RGBA_CHANGE_A (f, 64); - } - - frame->set_outline_color (f); + frame->set_outline_color (ARDOUR_UI::config()->color ("time axis frame")); } } -- cgit v1.2.3