Enforce internal/external selection exclusivity.
authorBen Loftis <ben@harrisonconsoles.com>
Fri, 12 Dec 2014 23:16:50 +0000 (17:16 -0600)
committerDavid Robillard <d@drobilla.net>
Fri, 19 Dec 2014 01:22:48 +0000 (20:22 -0500)
gtk2_ardour/editor_mouse.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/public_editor.h
gtk2_ardour/selection.cc
gtk2_ardour/selection.h
gtk2_ardour/time_axis_view_item.cc

index ab153b943b323e0b6154a3c123474c2ec9716fb7..99f0775106783190e27063e6c7354d06103f4922 100644 (file)
@@ -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;
+               }
        }
 }
 
index 8533cefdc07cbcdb24a34310672b79448703bbc9..197e19076124fd8344b73a1ee24e336deb21a11a 100644 (file)
@@ -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&
index 7280ba6e4eb1bfd2780c6f8991bb2d63d2624cf1..f9cc7c7299dd76c8917bb7804362e1b63bbfc7d3 100644 (file)
@@ -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
index 884a1b351b35ce85f4698423bf7a00878d35ca67..2cc46734633e10f97d40cabb1a6076859782b211 100644 (file)
@@ -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;
index b29f5c3241d38181a58617d05bf438ed85647598..9f69666497c314a869e02cb17aa07eb3d1bac174 100644 (file)
@@ -42,6 +42,8 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
+PBD::Signal0<void> 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
index 3c14eb9a093000ccdf64954beb9e783e9af4c63e..1701d693991791d049c66735274d4a622fcbbf7e 100644 (file)
@@ -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<void> ClearMidiNoteSelection;
+
   private:
        PublicEditor const * editor;
        uint32_t next_time_id;
index 9df14240f587c2aaf9e362cc14f6eede9c736cbd..2f860d897bfa10e29c760f637c9008ba50ad5d37 100644 (file)
@@ -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"));
        }
 }