X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.h;h=f0bb1c4c58ef0c57f62393042a43297555992009;hb=b461bc1dc1970a9e147c43a721d3155f6215f8c7;hp=0641d231ef7b43c64a21b7207d690b40285e3a1e;hpb=61db2175eb8b8fffd0c1796ace78ac33c9e1adf0;p=ardour.git diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index 0641d231ef..f0bb1c4c58 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,94 +17,144 @@ */ -#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 + +#include "ardour/data_type.h" +#include "ardour/types.h" namespace ARDOUR { class Session; class Bundle; + class Processor; + class IO; } class PortMatrix; +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 +class PortGroup : public sigc::trackable { - public: - /** PortGroup constructor. - * @param n Name. - * @param v true if group should be visible in the UI, otherwise false. - */ - PortGroup (std::string const & n, bool v) - : name (n), visible (v) {} - - void add_bundle (boost::shared_ptr); - void add_port (std::string const &); +public: + PortGroup (std::string const & n); + ~PortGroup (); + + 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 (); + 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 - std::vector > bundles; - std::vector ports; - bool visible; ///< true if the group is visible in the UI -}; -/// The UI for a PortGroup -class PortGroupUI -{ - public: - PortGroupUI (PortMatrix*, PortGroup*); + bool has_port (std::string const &) const; + + /** 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; + /** 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; - Gtk::Widget& visibility_checkbutton () { - return _visibility_checkbutton; + BundleList const & bundles () const { + return _bundles; } - private: - void visibility_checkbutton_toggled (); - void setup_visibility_checkbutton (); +private: + void bundle_changed (ARDOUR::Bundle::Change); + void add_bundle_internal (boost::shared_ptr, boost::shared_ptr, bool, Gdk::Color, bool); - PortMatrix* _port_matrix; ///< the PortMatrix that we are working for - PortGroup* _port_group; ///< the PortGroup that we are representing - Gtk::CheckButton _visibility_checkbutton; + BundleList _bundles; }; /// A list of PortGroups -class PortGroupList : public std::list +class PortGroupList : public sigc::trackable { public: - enum Mask { - BUSS = 0x1, - TRACK = 0x2, - SYSTEM = 0x4, - OTHER = 0x8 - }; + PortGroupList (); + ~PortGroupList(); + + typedef std::vector > List; + + void add_group (boost::shared_ptr); + void add_group_if_not_empty (boost::shared_ptr); + void gather (ARDOUR::Session *, ARDOUR::DataType, bool, bool); + PortGroup::BundleList const & bundles () const; + void clear (); + void remove_bundle (boost::shared_ptr); + 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 (); + } + + List::const_iterator end () const { + return _groups.end (); + } + + 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; - PortGroupList (ARDOUR::Session &, ARDOUR::DataType, bool, Mask); + /** A bundle in one of our groups has changed */ + PBD::Signal1 BundleChanged; - void refresh (); - void set_type (ARDOUR::DataType); - void set_offer_inputs (bool); - private: - void maybe_add_session_bundle (boost::shared_ptr); - - ARDOUR::Session& _session; - ARDOUR::DataType _type; - bool _offer_inputs; - - PortGroup _buss; - PortGroup _track; - PortGroup _system; - PortGroup _other; + 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 (); + 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 > & + ); + boost::shared_ptr bundle_for_type (boost::shared_ptr, ARDOUR::DataType) const; + + mutable PortGroup::BundleList _bundles; + List _groups; + PBD::ScopedConnectionList _bundle_changed_connections; + PBD::ScopedConnectionList _changed_connections; + bool _signals_suspended; + bool _pending_change; + ARDOUR::Bundle::Change _pending_bundle_change; }; #endif /* __gtk_ardour_port_group_h__ */