Tim Mayberry
084af96bf4
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.
235 lines
7.0 KiB
C++
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__ */
|