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:
parent
040869db5c
commit
660fd702af
|
@ -75,6 +75,10 @@ PortMatrixNode::State
|
|||
BundleEditorMatrix::get_state (BundleChannel c[2]) const
|
||||
{
|
||||
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) {
|
||||
if (!c[OURS].bundle->port_attached_to_channel (c[OURS].channel, *i)) {
|
||||
return PortMatrixNode::NOT_ASSOCIATED;
|
||||
|
@ -162,7 +166,7 @@ BundleEditorMatrix::list_is_global (int dim) const
|
|||
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)
|
||||
{
|
||||
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()->set_spacing (4);
|
||||
|
||||
add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
|
||||
if (add) {
|
||||
add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT);
|
||||
} else {
|
||||
add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_ACCEPT);
|
||||
}
|
||||
|
||||
add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT);
|
||||
show_all ();
|
||||
}
|
||||
|
||||
|
@ -320,6 +318,10 @@ BundleManager::BundleManager (Session& session)
|
|||
sigc::mem_fun (*this, &BundleManager::set_button_sensitivity)
|
||||
);
|
||||
|
||||
_tree_view.signal_row_activated().connect (
|
||||
sigc::mem_fun (*this, &BundleManager::row_activated)
|
||||
);
|
||||
|
||||
set_button_sensitivity ();
|
||||
|
||||
show_all ();
|
||||
|
@ -342,12 +344,11 @@ BundleManager::new_clicked ()
|
|||
/* Start off with a single channel */
|
||||
b->add_channel ("1");
|
||||
|
||||
BundleEditor e (_session, b, true);
|
||||
_session.add_bundle (b);
|
||||
add_bundle (b);
|
||||
|
||||
if (e.run () == Gtk::RESPONSE_ACCEPT) {
|
||||
_session.add_bundle (b);
|
||||
add_bundle (b);
|
||||
}
|
||||
BundleEditor e (_session, b);
|
||||
e.run ();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -356,10 +357,8 @@ BundleManager::edit_clicked ()
|
|||
Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected();
|
||||
if (i) {
|
||||
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
|
||||
BundleEditor e (_session, b, false);
|
||||
if (e.run () == Gtk::RESPONSE_ACCEPT) {
|
||||
_session.set_dirty ();
|
||||
}
|
||||
BundleEditor e (_session, b);
|
||||
e.run ();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 ()
|
||||
: ArdourDialog (_("Add channel")),
|
||||
_adding (true)
|
||||
|
@ -435,6 +447,7 @@ NameChannelDialog::setup ()
|
|||
|
||||
box->pack_start (*Gtk::manage (new Gtk::Label (_("Name"))));
|
||||
box->pack_start (_name);
|
||||
_name.set_activates_default (true);
|
||||
|
||||
get_vbox ()->pack_end (*box);
|
||||
box->show_all ();
|
||||
|
|
|
@ -67,7 +67,7 @@ class BundleEditorMatrix : public PortMatrix
|
|||
class BundleEditor : public ArdourDialog
|
||||
{
|
||||
public:
|
||||
BundleEditor (ARDOUR::Session &, boost::shared_ptr<ARDOUR::UserBundle>, bool);
|
||||
BundleEditor (ARDOUR::Session &, boost::shared_ptr<ARDOUR::UserBundle>);
|
||||
|
||||
protected:
|
||||
void on_map ();
|
||||
|
@ -98,6 +98,7 @@ class BundleManager : public ArdourDialog
|
|||
void add_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
||||
void bundle_changed (ARDOUR::Bundle::Change, boost::shared_ptr<ARDOUR::UserBundle>);
|
||||
void set_button_sensitivity ();
|
||||
void row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c);
|
||||
|
||||
class ModelColumns : public Gtk::TreeModelColumnRecord
|
||||
{
|
||||
|
|
|
@ -184,7 +184,7 @@ PortGroup::io_from_bundle (boost::shared_ptr<ARDOUR::Bundle> b) const
|
|||
/** PortGroupList constructor.
|
||||
*/
|
||||
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
|
||||
otherwise there is duplication of the same ports within the matrix */
|
||||
/* Bundles owned by the session */
|
||||
|
||||
boost::shared_ptr<BundleList> b = session.bundles ();
|
||||
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
|
||||
if ((*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
|
||||
|
||||
if ((*i)->nchannels() == 1 || boost::dynamic_pointer_cast<UserBundle> (*i)) {
|
||||
system->add_bundle (*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));
|
||||
|
||||
_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 ();
|
||||
|
@ -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
|
||||
PortGroupList::suspend_signals ()
|
||||
{
|
||||
|
@ -514,6 +518,11 @@ PortGroupList::resume_signals ()
|
|||
_pending_change = false;
|
||||
}
|
||||
|
||||
if (_pending_bundle_change != 0) {
|
||||
BundleChanged (_pending_bundle_change);
|
||||
_pending_bundle_change = (ARDOUR::Bundle::Change) 0;
|
||||
}
|
||||
|
||||
_signals_suspended = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,12 +127,14 @@ class PortGroupList : public sigc::trackable
|
|||
}
|
||||
|
||||
sigc::signal<void> Changed;
|
||||
sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged;
|
||||
|
||||
private:
|
||||
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_before (std::vector<std::string> const &, std::string const &) const;
|
||||
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;
|
||||
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;
|
||||
bool _signals_suspended;
|
||||
bool _pending_change;
|
||||
ARDOUR::Bundle::Change _pending_bundle_change;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -65,6 +65,9 @@ PortMatrix::PortMatrix (Window* parent, Session& session, DataType type)
|
|||
|
||||
/* watch for the content of _ports[] changing */
|
||||
_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));
|
||||
|
@ -587,3 +590,13 @@ PortMatrix::add_channel_proxy (boost::weak_ptr<Bundle> w)
|
|||
|
||||
add_channel (b);
|
||||
}
|
||||
|
||||
void
|
||||
PortMatrix::bundle_changed (ARDOUR::Bundle::Change c)
|
||||
{
|
||||
if (c & (Bundle::DirectionChanged | Bundle::TypeChanged)) {
|
||||
setup_all_ports ();
|
||||
}
|
||||
|
||||
setup ();
|
||||
}
|
||||
|
|
|
@ -169,6 +169,7 @@ private:
|
|||
void toggle_show_only_bundles ();
|
||||
bool on_scroll_event (GdkEventScroll *);
|
||||
boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
|
||||
void bundle_changed (ARDOUR::Bundle::Change);
|
||||
|
||||
Gtk::Window* _parent;
|
||||
|
||||
|
|
|
@ -90,27 +90,18 @@ class Bundle : public sigc::trackable
|
|||
void disconnect (boost::shared_ptr<Bundle>, AudioEngine &);
|
||||
bool connected_to (boost::shared_ptr<Bundle>, AudioEngine &);
|
||||
|
||||
/** Set the name.
|
||||
* @param n New name.
|
||||
*/
|
||||
void set_name (std::string const & n) {
|
||||
_name = n;
|
||||
Changed (NameChanged);
|
||||
}
|
||||
void set_name (std::string const &);
|
||||
|
||||
/** @return Bundle name */
|
||||
std::string name () const { return _name; }
|
||||
|
||||
/** Set the type of the ports in this Bundle.
|
||||
* @param t New type.
|
||||
*/
|
||||
void set_type (DataType t) { _type = t; }
|
||||
void set_type (DataType);
|
||||
|
||||
/** @return Type of the ports in this Bundle. */
|
||||
DataType type () const { return _type; }
|
||||
|
||||
void set_ports_are_inputs () { _ports_are_inputs = true; }
|
||||
void set_ports_are_outputs () { _ports_are_inputs = false; }
|
||||
void set_ports_are_inputs ();
|
||||
void set_ports_are_outputs ();
|
||||
bool ports_are_inputs () 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 {
|
||||
NameChanged = 0x1, ///< the bundle name or a channel name 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;
|
||||
|
|
|
@ -432,3 +432,37 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine)
|
|||
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue