Various tweaks to the bundle manager.

git-svn-id: svn://localhost/ardour2/branches/3.0@6030 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-11-07 20:33:41 +00:00
parent 040869db5c
commit 660fd702af
8 changed files with 108 additions and 41 deletions

View file

@ -75,6 +75,10 @@ PortMatrixNode::State
BundleEditorMatrix::get_state (BundleChannel c[2]) const BundleEditorMatrix::get_state (BundleChannel c[2]) const
{ {
Bundle::PortList const& pl = c[OTHER].bundle->channel_ports (c[OTHER].channel); Bundle::PortList const& pl = c[OTHER].bundle->channel_ports (c[OTHER].channel);
if (pl.empty ()) {
return PortMatrixNode::NOT_ASSOCIATED;
}
for (Bundle::PortList::const_iterator i = pl.begin(); i != pl.end(); ++i) { for (Bundle::PortList::const_iterator i = pl.begin(); i != pl.end(); ++i) {
if (!c[OURS].bundle->port_attached_to_channel (c[OURS].channel, *i)) { if (!c[OURS].bundle->port_attached_to_channel (c[OURS].channel, *i)) {
return PortMatrixNode::NOT_ASSOCIATED; return PortMatrixNode::NOT_ASSOCIATED;
@ -162,7 +166,7 @@ BundleEditorMatrix::list_is_global (int dim) const
return (dim == OTHER); return (dim == OTHER);
} }
BundleEditor::BundleEditor (Session& session, boost::shared_ptr<UserBundle> bundle, bool add) BundleEditor::BundleEditor (Session& session, boost::shared_ptr<UserBundle> bundle)
: ArdourDialog (_("Edit Bundle")), _matrix (this, session, bundle), _bundle (bundle) : ArdourDialog (_("Edit Bundle")), _matrix (this, session, bundle), _bundle (bundle)
{ {
Gtk::Table* t = new Gtk::Table (3, 2); Gtk::Table* t = new Gtk::Table (3, 2);
@ -220,13 +224,7 @@ BundleEditor::BundleEditor (Session& session, boost::shared_ptr<UserBundle> bund
get_vbox()->pack_start (_matrix); get_vbox()->pack_start (_matrix);
get_vbox()->set_spacing (4); get_vbox()->set_spacing (4);
add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT);
if (add) {
add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT);
} else {
add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_ACCEPT);
}
show_all (); show_all ();
} }
@ -320,6 +318,10 @@ BundleManager::BundleManager (Session& session)
sigc::mem_fun (*this, &BundleManager::set_button_sensitivity) sigc::mem_fun (*this, &BundleManager::set_button_sensitivity)
); );
_tree_view.signal_row_activated().connect (
sigc::mem_fun (*this, &BundleManager::row_activated)
);
set_button_sensitivity (); set_button_sensitivity ();
show_all (); show_all ();
@ -342,12 +344,11 @@ BundleManager::new_clicked ()
/* Start off with a single channel */ /* Start off with a single channel */
b->add_channel ("1"); b->add_channel ("1");
BundleEditor e (_session, b, true); _session.add_bundle (b);
add_bundle (b);
if (e.run () == Gtk::RESPONSE_ACCEPT) { BundleEditor e (_session, b);
_session.add_bundle (b); e.run ();
add_bundle (b);
}
} }
void void
@ -356,10 +357,8 @@ BundleManager::edit_clicked ()
Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected(); Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected();
if (i) { if (i) {
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle]; boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
BundleEditor e (_session, b, false); BundleEditor e (_session, b);
if (e.run () == Gtk::RESPONSE_ACCEPT) { e.run ();
_session.set_dirty ();
}
} }
} }
@ -410,6 +409,19 @@ BundleManager::bundle_changed (Bundle::Change c, boost::shared_ptr<UserBundle> b
} }
} }
void
BundleManager::row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c)
{
Gtk::TreeModel::iterator i = _list_model->get_iter (p);
if (!i) {
return;
}
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
BundleEditor e (_session, b);
e.run ();
}
NameChannelDialog::NameChannelDialog () NameChannelDialog::NameChannelDialog ()
: ArdourDialog (_("Add channel")), : ArdourDialog (_("Add channel")),
_adding (true) _adding (true)
@ -435,6 +447,7 @@ NameChannelDialog::setup ()
box->pack_start (*Gtk::manage (new Gtk::Label (_("Name")))); box->pack_start (*Gtk::manage (new Gtk::Label (_("Name"))));
box->pack_start (_name); box->pack_start (_name);
_name.set_activates_default (true);
get_vbox ()->pack_end (*box); get_vbox ()->pack_end (*box);
box->show_all (); box->show_all ();

View file

@ -67,7 +67,7 @@ class BundleEditorMatrix : public PortMatrix
class BundleEditor : public ArdourDialog class BundleEditor : public ArdourDialog
{ {
public: public:
BundleEditor (ARDOUR::Session &, boost::shared_ptr<ARDOUR::UserBundle>, bool); BundleEditor (ARDOUR::Session &, boost::shared_ptr<ARDOUR::UserBundle>);
protected: protected:
void on_map (); void on_map ();
@ -98,6 +98,7 @@ class BundleManager : public ArdourDialog
void add_bundle (boost::shared_ptr<ARDOUR::Bundle>); void add_bundle (boost::shared_ptr<ARDOUR::Bundle>);
void bundle_changed (ARDOUR::Bundle::Change, boost::shared_ptr<ARDOUR::UserBundle>); void bundle_changed (ARDOUR::Bundle::Change, boost::shared_ptr<ARDOUR::UserBundle>);
void set_button_sensitivity (); void set_button_sensitivity ();
void row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c);
class ModelColumns : public Gtk::TreeModelColumnRecord class ModelColumns : public Gtk::TreeModelColumnRecord
{ {

View file

@ -184,7 +184,7 @@ PortGroup::io_from_bundle (boost::shared_ptr<ARDOUR::Bundle> b) const
/** PortGroupList constructor. /** PortGroupList constructor.
*/ */
PortGroupList::PortGroupList () PortGroupList::PortGroupList ()
: _type (DataType::AUDIO), _signals_suspended (false), _pending_change (false) : _type (DataType::AUDIO), _signals_suspended (false), _pending_change (false), _pending_bundle_change ((Bundle::Change) 0)
{ {
} }
@ -281,17 +281,12 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs)
} }
} }
/* Bundles owned by the session. We only add the mono ones and the User ones /* Bundles owned by the session */
otherwise there is duplication of the same ports within the matrix */
boost::shared_ptr<BundleList> b = session.bundles (); boost::shared_ptr<BundleList> b = session.bundles ();
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) { for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
if ((*i)->ports_are_inputs() == inputs && (*i)->type() == _type) { if ((*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
system->add_bundle (*i);
if ((*i)->nchannels() == 1 || boost::dynamic_pointer_cast<UserBundle> (*i)) {
system->add_bundle (*i);
}
} }
} }
@ -474,7 +469,7 @@ PortGroupList::add_group (boost::shared_ptr<PortGroup> g)
g->Changed.connect (sigc::mem_fun (*this, &PortGroupList::emit_changed)); g->Changed.connect (sigc::mem_fun (*this, &PortGroupList::emit_changed));
_bundle_changed_connections.push_back ( _bundle_changed_connections.push_back (
g->BundleChanged.connect (sigc::hide (sigc::mem_fun (*this, &PortGroupList::emit_changed))) g->BundleChanged.connect (sigc::mem_fun (*this, &PortGroupList::emit_bundle_changed))
); );
emit_changed (); emit_changed ();
@ -500,6 +495,15 @@ PortGroupList::emit_changed ()
} }
} }
void
PortGroupList::emit_bundle_changed (Bundle::Change c)
{
if (_signals_suspended) {
_pending_bundle_change = c;
} else {
BundleChanged (c);
}
}
void void
PortGroupList::suspend_signals () PortGroupList::suspend_signals ()
{ {
@ -514,6 +518,11 @@ PortGroupList::resume_signals ()
_pending_change = false; _pending_change = false;
} }
if (_pending_bundle_change != 0) {
BundleChanged (_pending_bundle_change);
_pending_bundle_change = (ARDOUR::Bundle::Change) 0;
}
_signals_suspended = false; _signals_suspended = false;
} }

View file

@ -127,12 +127,14 @@ class PortGroupList : public sigc::trackable
} }
sigc::signal<void> Changed; sigc::signal<void> Changed;
sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged;
private: private:
bool port_has_prefix (std::string const &, std::string const &) const; bool port_has_prefix (std::string const &, std::string const &) const;
std::string common_prefix (std::vector<std::string> const &) const; std::string common_prefix (std::vector<std::string> const &) const;
std::string common_prefix_before (std::vector<std::string> const &, std::string const &) const; std::string common_prefix_before (std::vector<std::string> const &, std::string const &) const;
void emit_changed (); void emit_changed ();
void emit_bundle_changed (ARDOUR::Bundle::Change);
boost::shared_ptr<ARDOUR::Bundle> make_bundle_from_ports (std::vector<std::string> const &, bool) const; boost::shared_ptr<ARDOUR::Bundle> make_bundle_from_ports (std::vector<std::string> const &, bool) const;
void maybe_add_processor_to_bundle (boost::weak_ptr<ARDOUR::Processor>, boost::shared_ptr<RouteBundle>, bool, std::set<boost::shared_ptr<ARDOUR::IO> > &); void maybe_add_processor_to_bundle (boost::weak_ptr<ARDOUR::Processor>, boost::shared_ptr<RouteBundle>, bool, std::set<boost::shared_ptr<ARDOUR::IO> > &);
@ -142,6 +144,7 @@ class PortGroupList : public sigc::trackable
std::vector<sigc::connection> _bundle_changed_connections; std::vector<sigc::connection> _bundle_changed_connections;
bool _signals_suspended; bool _signals_suspended;
bool _pending_change; bool _pending_change;
ARDOUR::Bundle::Change _pending_bundle_change;
}; };

View file

@ -65,6 +65,9 @@ PortMatrix::PortMatrix (Window* parent, Session& session, DataType type)
/* watch for the content of _ports[] changing */ /* watch for the content of _ports[] changing */
_ports[i].Changed.connect (mem_fun (*this, &PortMatrix::setup)); _ports[i].Changed.connect (mem_fun (*this, &PortMatrix::setup));
/* and for bundles in _ports[] changing */
_ports[i].BundleChanged.connect (mem_fun (*this, &PortMatrix::bundle_changed));
} }
_hscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::hscroll_changed)); _hscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::hscroll_changed));
@ -587,3 +590,13 @@ PortMatrix::add_channel_proxy (boost::weak_ptr<Bundle> w)
add_channel (b); add_channel (b);
} }
void
PortMatrix::bundle_changed (ARDOUR::Bundle::Change c)
{
if (c & (Bundle::DirectionChanged | Bundle::TypeChanged)) {
setup_all_ports ();
}
setup ();
}

View file

@ -169,6 +169,7 @@ private:
void toggle_show_only_bundles (); void toggle_show_only_bundles ();
bool on_scroll_event (GdkEventScroll *); bool on_scroll_event (GdkEventScroll *);
boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const; boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
void bundle_changed (ARDOUR::Bundle::Change);
Gtk::Window* _parent; Gtk::Window* _parent;

View file

@ -90,27 +90,18 @@ class Bundle : public sigc::trackable
void disconnect (boost::shared_ptr<Bundle>, AudioEngine &); void disconnect (boost::shared_ptr<Bundle>, AudioEngine &);
bool connected_to (boost::shared_ptr<Bundle>, AudioEngine &); bool connected_to (boost::shared_ptr<Bundle>, AudioEngine &);
/** Set the name. void set_name (std::string const &);
* @param n New name.
*/
void set_name (std::string const & n) {
_name = n;
Changed (NameChanged);
}
/** @return Bundle name */ /** @return Bundle name */
std::string name () const { return _name; } std::string name () const { return _name; }
/** Set the type of the ports in this Bundle. void set_type (DataType);
* @param t New type.
*/
void set_type (DataType t) { _type = t; }
/** @return Type of the ports in this Bundle. */ /** @return Type of the ports in this Bundle. */
DataType type () const { return _type; } DataType type () const { return _type; }
void set_ports_are_inputs () { _ports_are_inputs = true; } void set_ports_are_inputs ();
void set_ports_are_outputs () { _ports_are_inputs = false; } void set_ports_are_outputs ();
bool ports_are_inputs () const { return _ports_are_inputs; } bool ports_are_inputs () const { return _ports_are_inputs; }
bool ports_are_outputs () const { return !_ports_are_inputs; } bool ports_are_outputs () const { return !_ports_are_inputs; }
@ -121,7 +112,9 @@ class Bundle : public sigc::trackable
enum Change { enum Change {
NameChanged = 0x1, ///< the bundle name or a channel name has changed NameChanged = 0x1, ///< the bundle name or a channel name has changed
ConfigurationChanged = 0x2, ///< the number of channels has changed ConfigurationChanged = 0x2, ///< the number of channels has changed
PortsChanged = 0x4 ///< the port list associated with one of our channels has changed PortsChanged = 0x4, ///< the port list associated with one of our channels has changed
TypeChanged = 0x8, ///< the data type has changed
DirectionChanged = 0x10 ///< the direction (whether ports are inputs or outputs) has changed
}; };
sigc::signal<void, Change> Changed; sigc::signal<void, Change> Changed;

View file

@ -432,3 +432,37 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine)
return true; return true;
} }
/** Set the type of the ports in this Bundle.
* @param t New type.
*/
void
Bundle::set_type (DataType t)
{
_type = t;
emit_changed (TypeChanged);
}
void
Bundle::set_ports_are_inputs ()
{
_ports_are_inputs = true;
emit_changed (DirectionChanged);
}
void
Bundle::set_ports_are_outputs ()
{
_ports_are_inputs = false;
emit_changed (DirectionChanged);
}
/** Set the name.
* @param n New name.
*/
void
Bundle::set_name (string const & n)
{
_name = n;
emit_changed (NameChanged);
}