X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.h;h=a9dfc1a4addad8480800999458f6aecd39d4fd59;hb=6129b3492d3e47f7c027278f795ebb5cbea53cca;hp=22dee8de5efdae924f4a06f6ff977198b00571a4;hpb=2e7eeef44868d84f51e0d4b54d31e39d7cf26918;p=ardour.git diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index 22dee8de5e..a9dfc1a4ad 100644 --- a/gtk2_ardour/port_group.h +++ b/gtk2_ardour/port_group.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2009 Paul Davis + Copyright (C) 2002-2009 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 @@ -17,15 +17,18 @@ */ -#ifndef __gtk_ardour_port_group_h__ -#define __gtk_ardour_port_group_h__ +#ifndef __gtk_ardour_port_group_h__ +#define __gtk_ardour_port_group_h__ #include #include #include +#include +#include "pbd/signals.h" + #include #include -#include + #include "ardour/data_type.h" #include "ardour/types.h" @@ -37,59 +40,60 @@ namespace ARDOUR { } class PortMatrix; -class RouteBundle; class PublicEditor; -/** A list of bundles and ports, grouped by some aspect of their - * type e.g. busses, tracks, system. Each group has 0 or more bundles - * and 0 or more ports, where the ports are not in the bundles. +/** A list of bundles grouped by some aspect of their type e.g. busses, tracks, system. + * A group has 0 or more bundles. */ class PortGroup : public sigc::trackable { public: PortGroup (std::string const & n); + ~PortGroup (); - void add_bundle (boost::shared_ptr); - void add_bundle (boost::shared_ptr, Gdk::Color); + void add_bundle (boost::shared_ptr, bool allow_dups = false); + void add_bundle (boost::shared_ptr, boost::shared_ptr io); + void add_bundle (boost::shared_ptr, boost::shared_ptr, Gdk::Color); void remove_bundle (boost::shared_ptr); boost::shared_ptr only_bundle (); void clear (); - uint32_t total_channels () const; + ARDOUR::ChanCount total_channels () const; + boost::shared_ptr io_from_bundle (boost::shared_ptr) const; + void remove_duplicates (); std::string name; ///< name for the group - bool visible () const { - return _visible; - } - - void set_visible (bool v) { - _visible = v; - Changed (); - } - bool has_port (std::string const &) const; - sigc::signal Changed; - sigc::signal BundleChanged; + /** The bundle list has changed in some way; a bundle has been added or removed, or the list cleared etc. */ + PBD::Signal0 Changed; + + /** An individual bundle on our list has changed in some way */ + PBD::Signal1 BundleChanged; struct BundleRecord { - boost::shared_ptr bundle; - Gdk::Color colour; - bool has_colour; - sigc::connection changed_connection; + boost::shared_ptr bundle; + /** IO whose ports are in the bundle, or 0. This is so that we can do things like adding + ports to the IO from matrix editor menus. */ + boost::weak_ptr io; + Gdk::Color colour; + bool has_colour; + PBD::ScopedConnection changed_connection; + + BundleRecord (boost::shared_ptr, boost::shared_ptr, Gdk::Color, bool has_colour); }; - typedef std::list BundleList; + typedef std::list BundleList; BundleList const & bundles () const { return _bundles; } - + private: void bundle_changed (ARDOUR::Bundle::Change); + void add_bundle_internal (boost::shared_ptr, boost::shared_ptr, bool, Gdk::Color, bool); BundleList _bundles; - bool _visible; ///< true if the group is visible in the UI }; /// A list of PortGroups @@ -97,62 +101,59 @@ class PortGroupList : public sigc::trackable { public: PortGroupList (); + ~PortGroupList(); typedef std::vector > List; void add_group (boost::shared_ptr); - void set_type (ARDOUR::DataType); - void gather (ARDOUR::Session &, bool); + void add_group_if_not_empty (boost::shared_ptr); + void gather (ARDOUR::Session *, ARDOUR::DataType, bool, bool, bool); PortGroup::BundleList const & bundles () const; void clear (); void remove_bundle (boost::shared_ptr); - uint32_t total_visible_channels () const; + ARDOUR::ChanCount total_channels () const; uint32_t size () const { return _groups.size(); } + boost::shared_ptr io_from_bundle (boost::shared_ptr) const; void suspend_signals (); void resume_signals (); List::const_iterator begin () const { - return _groups.begin(); + return _groups.begin (); } List::const_iterator end () const { - return _groups.end(); + return _groups.end (); } - sigc::signal Changed; + bool empty () const; + + /** The group list has changed in some way; a group has been added or removed, or the list cleared etc. */ + PBD::Signal0 Changed; + + /** A bundle in one of our groups has changed */ + PBD::Signal1 BundleChanged; private: bool port_has_prefix (std::string const &, std::string const &) const; std::string common_prefix (std::vector const &) const; std::string common_prefix_before (std::vector const &, std::string const &) const; void emit_changed (); - boost::shared_ptr make_bundle_from_ports (std::vector const &, bool) const; - void maybe_add_processor_to_bundle (boost::weak_ptr, boost::shared_ptr, bool, std::set > &); + void emit_bundle_changed (ARDOUR::Bundle::Change); + boost::shared_ptr make_bundle_from_ports (std::vector const &, ARDOUR::DataType, bool) const; + void maybe_add_processor_to_list ( + boost::weak_ptr, std::list > *, bool, std::set > & + ); - ARDOUR::DataType _type; mutable PortGroup::BundleList _bundles; List _groups; - std::vector _bundle_changed_connections; + PBD::ScopedConnectionList _bundle_changed_connections; + PBD::ScopedConnectionList _changed_connections; bool _signals_suspended; bool _pending_change; -}; - - -class RouteBundle : public ARDOUR::Bundle -{ -public: - RouteBundle (boost::shared_ptr); - - void add_processor_bundle (boost::shared_ptr); - -private: - void reread_component_bundles (); - - boost::shared_ptr _route; - std::vector > _processor; + ARDOUR::Bundle::Change _pending_bundle_change; }; #endif /* __gtk_ardour_port_group_h__ */