X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.h;h=d631f8ac0515d9ea180f1236a5f2f02b831e7509;hb=65eeeb7a652d7022783b10e35941ce56e0fc7207;hp=a5b5b109c4b02fa6abbba5cc332cca160f391dad;hpb=4cd47cf253ada6218c13b9a4127834cf4a26ce3d;p=ardour.git diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index a5b5b109c4..d631f8ac05 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,115 +17,143 @@ */ -#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 : 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 &); + 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 () const { - return _visible; - } - - void set_visible (bool v) { - _visible = v; - VisibilityChanged (); - } bool has_port (std::string const &) const; - sigc::signal VisibilityChanged; + /** The bundle list has changed in some way; a bundle has been added or removed, or the list cleared etc. */ + PBD::Signal0 Changed; -private: - bool _visible; ///< true if the group is visible in the UI -}; + /** An individual bundle on our list has changed in some way */ + PBD::Signal1 BundleChanged; -/// The UI for a PortGroup -class PortGroupUI -{ - public: - PortGroupUI (PortMatrix*, PortGroup*); + 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, public sigc::trackable +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, 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; - PortGroupList (ARDOUR::Session &, ARDOUR::DataType, bool, Mask); + /** The group list has changed in some way; a group has been added or removed, or the list cleared etc. */ + PBD::Signal0 Changed; - void refresh (); - void set_type (ARDOUR::DataType); - void set_offer_inputs (bool); - std::vector > bundles (); - void take_visibility_from (PortGroupList const &); + /** A bundle in one of our groups has changed */ + PBD::Signal1 BundleChanged; - sigc::signal VisibilityChanged; - private: - void maybe_add_session_bundle (boost::shared_ptr); bool port_has_prefix (std::string const &, std::string const &) const; std::string common_prefix (std::vector const &) const; - void visibility_changed (); - - ARDOUR::Session& _session; - ARDOUR::DataType _type; - bool _offer_inputs; - - PortGroup _buss; - PortGroup _track; - PortGroup _system; - PortGroup _other; + 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, std::string const& bundle_name = std::string()) const; + void maybe_add_processor_to_list ( + boost::weak_ptr, std::list > *, bool, std::set > & + ); + + 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__ */