13
0
livetrax/gtk2_ardour/selection.h
Tim Mayberry 084af96bf4 Change handling of Midi note selection to eliminate signal emission/delays.
Each MidiRegionView(MRV) is connected to the Selection::ClearMidiNoteSelection
signal that is used to notify the all MRV instances to clear their note
selection.

The MRV class also has a private static SelectionCleared signal that is used to
signal other MRV instances when their selection has been cleared. When the
Selection::ClearMidiNoteSelection signal is emitted it causes each MRV to also
emit the SelectionCleared signal. So the emission takes quadratic time.

With 1500 MRV instances emission takes about 2.2 seconds on my machine, and
some operations like track selection cause it to be emitted 3 times(another
issue).

The Selection class in the Editor knows which MRV instances have note
selections, as it is notified by MidiRegionView whenever the selection count
becomes zero or becomes non-zero. Clearing the Note selection should then just
be O(N) and direct calls can be used rather than signals.

This change removes both the signals and uses the existing references between
Selection and MRV class to control note selection. There should be no
behavioural changes in Midi note selection with this change.
2016-01-14 20:41:44 +10:00

235 lines
7.0 KiB
C++

/*
Copyright (C) 2000-2003 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __ardour_gtk_selection_h__
#define __ardour_gtk_selection_h__
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <sigc++/signal.h>
#include "pbd/signals.h"
#include "time_selection.h"
#include "region_selection.h"
#include "track_selection.h"
#include "automation_selection.h"
#include "playlist_selection.h"
#include "processor_selection.h"
#include "point_selection.h"
#include "marker_selection.h"
#include "midi_selection.h"
class TimeAxisView;
class RegionView;
class Selectable;
class PublicEditor;
class MidiRegionView;
class AutomationLine;
class ControlPoint;
namespace ARDOUR {
class Region;
class AudioRegion;
class Playlist;
class Processor;
class AutomationList;
}
namespace Evoral {
class ControlList;
}
/// Lists of selected things
/** The Selection class holds lists of selected items (tracks, regions, etc. etc.). */
class Selection : public sigc::trackable, public PBD::ScopedConnectionList
{
public:
enum SelectionType {
Object = 0x1,
Range = 0x2
};
enum Operation {
Set,
Add,
Toggle,
Extend
};
TrackSelection tracks;
RegionSelection regions;
TimeSelection time;
AutomationSelection lines;
PlaylistSelection playlists;
PointSelection points;
MarkerSelection markers;
MidiRegionSelection midi_regions;
/** only used when this class is used as a cut buffer */
MidiNoteSelection midi_notes;
Selection (PublicEditor const * e);
// Selection& operator= (const Selection& other);
sigc::signal<void> RegionsChanged;
sigc::signal<void> TracksChanged;
sigc::signal<void> TimeChanged;
sigc::signal<void> LinesChanged;
sigc::signal<void> PlaylistsChanged;
sigc::signal<void> PointsChanged;
sigc::signal<void> MarkersChanged;
sigc::signal<void> MidiNotesChanged;
sigc::signal<void> MidiRegionsChanged;
void block_tracks_changed (bool);
void clear ();
bool empty (bool internal_selection = false);
void dump_region_layers();
bool selected (TimeAxisView*);
bool selected (RegionView*);
bool selected (ArdourMarker*);
bool selected (ControlPoint*);
void set (std::list<Selectable*> const &);
void add (std::list<Selectable*> const &);
void toggle (std::list<Selectable*> const &);
void set (TimeAxisView*);
void set (const TrackViewList&);
void set (const MidiNoteSelection&);
void set (RegionView*, bool also_clear_tracks = true);
void set (MidiRegionView*);
void set (std::vector<RegionView*>&);
long set (framepos_t, framepos_t);
void set_preserving_all_ranges (framepos_t, framepos_t);
void set (boost::shared_ptr<Evoral::ControlList>);
void set (boost::shared_ptr<ARDOUR::Playlist>);
void set (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void set (ControlPoint *);
void set (ArdourMarker*);
void set (const RegionSelection&);
void toggle (TimeAxisView*);
void toggle (const TrackViewList&);
void toggle (const MidiNoteSelection&);
void toggle (RegionView*);
void toggle (MidiRegionView*);
void toggle (MidiCutBuffer*);
void toggle (std::vector<RegionView*>&);
long toggle (framepos_t, framepos_t);
void toggle (ARDOUR::AutomationList*);
void toggle (boost::shared_ptr<ARDOUR::Playlist>);
void toggle (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void toggle (ControlPoint *);
void toggle (std::vector<ControlPoint*> const &);
void toggle (ArdourMarker*);
void add (TimeAxisView*);
void add (const TrackViewList&);
void add (const MidiNoteSelection&);
void add (RegionView*);
void add (MidiRegionView*);
void add (MidiCutBuffer*);
void add (std::vector<RegionView*>&);
long add (framepos_t, framepos_t);
void add (boost::shared_ptr<Evoral::ControlList>);
void add (boost::shared_ptr<ARDOUR::Playlist>);
void add (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void add (ControlPoint *);
void add (std::vector<ControlPoint*> const &);
void add (ArdourMarker*);
void add (const std::list<ArdourMarker*>&);
void add (const RegionSelection&);
void add (const PointSelection&);
void remove (TimeAxisView*);
void remove (const TrackViewList&);
void remove (const MidiNoteSelection&);
void remove (RegionView*);
void remove (MidiRegionView*);
void remove (MidiCutBuffer*);
void remove (uint32_t selection_id);
void remove (framepos_t, framepos_t);
void remove (boost::shared_ptr<ARDOUR::AutomationList>);
void remove (boost::shared_ptr<ARDOUR::Playlist>);
void remove (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void remove (const std::list<Selectable*>&);
void remove (ArdourMarker*);
void remove (ControlPoint *);
void remove_regions (TimeAxisView *);
void move_time (framecnt_t);
void replace (uint32_t time_index, framepos_t start, framepos_t end);
/*
* A note about items in an editing Selection:
* At a high level, selections can include Tracks, Objects, or Time Ranges
* Range and Object selections are mutually exclusive.
* Selecting a Range will deselect all Objects, and vice versa.
* This is done to avoid confusion over what will happen in an operation such as Delete
* Tracks are somewhat orthogonal b/c editing operations don't apply to tracks.
* 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
// these items get cleared wholesale in clear_objects
void clear_regions();
void clear_lines ();
void clear_playlists ();
void clear_points ();
void clear_markers ();
void clear_midi_notes ();
void clear_midi_regions ();
void foreach_region (void (ARDOUR::Region::*method)(void));
void foreach_regionview (void (RegionView::*method)(void));
void foreach_midi_regionview (void (MidiRegionView::*method)(void));
template<class A> void foreach_region (void (ARDOUR::Region::*method)(A), A arg);
XMLNode& get_state () const;
int set_state (XMLNode const &, int);
std::list<std::pair<PBD::ID const, std::list<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > > pending_midi_note_selection;
private:
PublicEditor const * editor;
uint32_t next_time_id;
bool _no_tracks_changed;
};
bool operator==(const Selection& a, const Selection& b);
#endif /* __ardour_gtk_selection_h__ */