X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fardour%2Fpresentation_info.h;h=7c847e9fce8e9b7c263c739670d5909e0072b9d3;hb=940707e327014f30791d75be00ccbd33b0a0555d;hp=2afaa345d1d3bae6fb5eeac779561fa626776e86;hpb=e8379b3818b8a297d4ed911d1e7a42bc2b55a587;p=ardour.git diff --git a/libs/ardour/ardour/presentation_info.h b/libs/ardour/ardour/presentation_info.h index 2afaa345d1..7c847e9fce 100644 --- a/libs/ardour/ardour/presentation_info.h +++ b/libs/ardour/ardour/presentation_info.h @@ -25,13 +25,25 @@ #include +#include "pbd/signals.h" +#include "pbd/stateful.h" +#include "pbd/properties.h" + #include "ardour/libardour_visibility.h" class XMLNode; namespace ARDOUR { -class LIBARDOUR_API PresentationInfo +namespace Properties { + LIBARDOUR_API extern PBD::PropertyDescriptor order; + LIBARDOUR_API extern PBD::PropertyDescriptor color; + LIBARDOUR_API extern PBD::PropertyDescriptor selected; + /* we use this; declared in region.cc */ + LIBARDOUR_API extern PBD::PropertyDescriptor hidden; +} + +class LIBARDOUR_API PresentationInfo : public PBD::Stateful { public: @@ -110,46 +122,48 @@ class LIBARDOUR_API PresentationInfo Selected = 0x100, Hidden = 0x200, /* single bit indicates that the group order is set */ - GroupOrderSet = 0x400, + OrderSet = 0x400, /* special mask to delect out "state" bits */ - StatusMask = (Selected|Hidden) + StatusMask = (Selected|Hidden), + /* special mask to delect select type bits */ + TypeMask = (AudioBus|AudioTrack|MidiTrack|MidiBus|VCA|MasterOut|MonitorOut|Auditioner) }; - static const Flag Route; - static const Flag Track; - static const Flag Bus; + static const Flag AllStripables; /* mask to use for any route or VCA (but not auditioner) */ + static const Flag AllRoutes; /* mask to use for any route include master+monitor, but not auditioner */ + static const Flag Route; /* mask for any route (bus or track */ + static const Flag Track; /* mask to use for any track */ + static const Flag Bus; /* mask to use for any bus */ typedef uint32_t order_t; - typedef uint64_t global_order_t; + typedef uint32_t color_t; - PresentationInfo (Flag f) : _order (0), _flags (Flag (f & ~GroupOrderSet)) { /* GroupOrderSet is not set */ } - PresentationInfo (order_t o, Flag f) : _order (o), _flags (Flag (f | GroupOrderSet)) { /* GroupOrderSet is set */ } + PresentationInfo (Flag f); + PresentationInfo (order_t o, Flag f); + PresentationInfo (PresentationInfo const &); static const order_t max_order; + PresentationInfo::Flag flags() const { return _flags; } order_t order() const { return _order; } + color_t color() const { return _color; } - PresentationInfo::Flag flags() const { return _flags; } + bool color_set() const; - bool order_set() const { return _flags & GroupOrderSet; } + void set_color (color_t); + void set_selected (bool yn); + void set_hidden (bool yn); + void set_flags (Flag f) { _flags = f; } + + bool order_set() const { return _flags & OrderSet; } + + int selection_cnt() const { return _selection_cnt; } bool hidden() const { return _flags & Hidden; } bool selected() const { return _flags & Selected; } bool special() const { return _flags & (MasterOut|MonitorOut|Auditioner); } - void set_flag (PresentationInfo::Flag f) { - _flags = PresentationInfo::Flag (_flags | f); - } - - void unset_flag (PresentationInfo::Flag f) { - _flags = PresentationInfo::Flag (_flags & ~f); - } - - void set_flags (Flag f) { - _flags = f; - } - bool flag_match (Flag f) const { /* no flags, match all */ @@ -175,31 +189,37 @@ class LIBARDOUR_API PresentationInfo return true; } if (f == Route && (_flags & Route)) { - /* any kind of route */ + /* any kind of route, but not master, monitor in + or auditioner. + */ return true; } - return f == _flags; - } - - std::string to_string () const; + if (f == AllRoutes && (_flags & AllRoutes)) { + /* any kind of route, but not auditioner. Ask for that + specifically. + */ + return true; + } - uint64_t to_integer () const { - return ((uint64_t) _flags << (8*sizeof(order_t))) | _order; - } + if (f == AllStripables && (_flags & AllStripables)) { + /* any kind of stripable, but not auditioner. Ask for that + specifically. + */ + return true; + } - bool operator< (PresentationInfo const& other) const { - return order() < other.order(); - } + /* check for any matching type bits. + * + * Do comparisoon without status mask or order set bits - we + * already checked that above. + */ - PresentationInfo& operator= (std::string const& str) { - parse (str); - return *this; + return ((f & TypeMask) & _flags); } - bool match (PresentationInfo const& other) const { - return (_order == other.order()) && flag_match (other.flags()); - } + int set_state (XMLNode const&, int); + XMLNode& get_state (); bool operator==(PresentationInfo const& other) { return (_order == other.order()) && (_flags == other.flags()); @@ -209,19 +229,50 @@ class LIBARDOUR_API PresentationInfo return (_order != other.order()) || (_flags != other.flags()); } + PresentationInfo& operator= (PresentationInfo const& other); + static Flag get_flags (XMLNode const& node); + static std::string state_node_name; + + /* for things concerned about *any* PresentationInfo. + */ + + static PBD::Signal1 Change; + + static void make_property_quarks (); + + protected: + friend class ChangeSuspender; + static void suspend_change_signal (); + static void unsuspend_change_signal (); + + public: + class ChangeSuspender { + public: + ChangeSuspender() { + PresentationInfo::suspend_change_signal (); + } + ~ChangeSuspender() { + PresentationInfo::unsuspend_change_signal (); + } + }; protected: friend class Stripable; - void set_order (order_t order) { _order = order; _flags = Flag (_flags|GroupOrderSet); } + void set_order (order_t order); private: order_t _order; Flag _flags; + color_t _color; + int _selection_cnt; + + static PBD::PropertyChange _pending_static_changes; + static Glib::Threads::Mutex static_signal_lock; + static int _change_signal_suspended; + static void send_static_change (const PBD::PropertyChange&); - PresentationInfo (std::string const & str); - int parse (std::string const&); - int parse (order_t, Flag f); + static int selection_counter; }; }