X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.h;h=3d9e87f710879294f59e7ca2b2a85e229ad0bc6e;hb=474d68c05132291fd8eb200006e7e63aebefdc8d;hp=d5334640b1cec3f3c57f1a0bb703aed76e1ce434;hpb=3be16e8afbd891c0bfe7227158384ed0d127597f;p=ardour.git diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index d5334640b1..3d9e87f710 100644 --- a/gtk2_ardour/port_group.h +++ b/gtk2_ardour/port_group.h @@ -1,90 +1,157 @@ -#ifndef __gtk_ardour_port_group_h__ -#define __gtk_ardour_port_group_h__ +/* + 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 + 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 __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" namespace ARDOUR { class Session; + class Bundle; + class Processor; class IO; - class PortInsert; } class PortMatrix; +class PublicEditor; -/// A list of port names, grouped by some aspect of their type e.g. busses, tracks, system -class PortGroup +/** 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 p Port name prefix. - * @param v true if group should be visible in the UI, otherwise false. - */ - PortGroup (std::string const & n, std::string const & p, bool v) : name (n), prefix (p), visible (v) {} - - void add (std::string const & p); +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::string prefix; ///< prefix (before colon) e.g. "ardour:" - std::vector ports; ///< port names - bool visible; ///< true if the group is visible in the UI -}; -/// The UI for a PortGroup -class PortGroupUI -{ - public: - PortGroupUI (PortMatrix&, PortGroup&); - - Gtk::Widget& get_visibility_checkbutton (); - PortGroup& port_group () { return _port_group; } - void setup_visibility (); - - private: - void port_checkbutton_toggled (Gtk::CheckButton*, int, int); - bool port_checkbutton_release (GdkEventButton* ev, Gtk::CheckButton* b, int r, int c); - void visibility_checkbutton_toggled (); - - PortMatrix& _port_matrix; ///< the PortMatrix that we are working for - PortGroup& _port_group; ///< the PortGroup that we are representing - bool _ignore_check_button_toggle; - Gtk::CheckButton _visibility_checkbutton; + 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; + + 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; }; /// 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 (ARDOUR::Session &, ARDOUR::DataType, bool, Mask); - - void refresh (); - int n_visible_ports () const; - std::string get_port_by_index (int, bool with_prefix = true) const; - void set_type (ARDOUR::DataType); - void set_offer_inputs (bool); - - private: - ARDOUR::Session& _session; - ARDOUR::DataType _type; - bool _offer_inputs; - - PortGroup buss; - PortGroup track; - PortGroup system; - PortGroup other; +public: + 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; + + /** 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 (); + 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__ */