/*
- 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
#include <gtkmm/table.h>
#include <gtkmm/label.h>
#include <gtkmm/checkbutton.h>
+#include <gtkmm/notebook.h>
#include <boost/shared_ptr.hpp>
+
#include "ardour/bundle.h"
+#include "ardour/types.h"
+#include "ardour/session_handle.h"
+
#include "port_group.h"
#include "port_matrix_types.h"
-#include "i18n.h"
/** The `port matrix' UI. This is a widget which lets the user alter
* associations between one set of ports and another. e.g. to connect
class Bundle;
}
+namespace Gtk {
+ namespace Menu_Helpers {
+ class MenuList;
+ }
+}
+
class PortMatrixBody;
-class PortMatrix : public Gtk::Table
+class PortMatrix : public Gtk::Table, public ARDOUR::SessionHandlePtr
{
public:
- PortMatrix (Gtk::Window*, ARDOUR::Session&, ARDOUR::DataType);
+ PortMatrix (Gtk::Window*, ARDOUR::Session *, ARDOUR::DataType);
~PortMatrix ();
void set_type (ARDOUR::DataType);
ARDOUR::DataType type () const {
return _type;
}
-
+
void disassociate_all ();
void setup_scrollbars ();
- void popup_menu (
- std::pair<boost::shared_ptr<PortGroup>, ARDOUR::BundleChannel>,
- std::pair<boost::shared_ptr<PortGroup>, ARDOUR::BundleChannel>,
- uint32_t
- );
+ void popup_menu (ARDOUR::BundleChannel, ARDOUR::BundleChannel, uint32_t);
int min_height_divisor () const {
return _min_height_divisor;
LEFT_TO_BOTTOM ///< row labels to the left, column labels on the bottom
};
+
/** @return Arrangement in use */
Arrangement arrangement () const {
return _arrangement;
}
PortGroupList const * columns () const;
+ boost::shared_ptr<const PortGroup> visible_columns () const;
/** @return index into the _ports array for the list which is displayed as columns */
int column_index () const {
}
PortGroupList const * rows () const;
+ boost::shared_ptr<const PortGroup> visible_rows () const;
/** @return index into the _ports array for the list which is displayed as rows */
int row_index () const {
PortGroupList const * ports (int d) const {
return &_ports[d];
}
+
+ boost::shared_ptr<const PortGroup> visible_ports (int d) const;
+ void init ();
void setup ();
virtual void setup_ports (int) = 0;
void setup_all_ports ();
std::pair<uint32_t, uint32_t> max_size () const;
+ bool should_show (ARDOUR::DataType) const;
+ uint32_t count_of_our_type (ARDOUR::ChanCount) const;
+
/** @param c Channels; where c[0] is from _ports[0] and c[1] is from _ports[1].
* @param s New state.
*/
virtual bool list_is_global (int) const = 0;
virtual bool can_add_channel (boost::shared_ptr<ARDOUR::Bundle>) const;
- virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>);
+ virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
virtual bool can_remove_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
virtual void remove_channel (ARDOUR::BundleChannel);
+ virtual void remove_all_channels (boost::weak_ptr<ARDOUR::Bundle>);
virtual bool can_rename_channels (boost::shared_ptr<ARDOUR::Bundle>) const {
return false;
}
virtual void rename_channel (ARDOUR::BundleChannel) {}
virtual std::string disassociation_verb () const = 0;
- virtual std::string channel_noun () const { return _("channel"); }
-
+ virtual std::string channel_noun () const;
+
enum Result {
Cancelled,
Accepted
from left to right as you go from list 0 to list 1. Hence subclasses which deal with
inputs and outputs should put outputs in list 0 and inputs in list 1. */
PortGroupList _ports[2];
- ARDOUR::Session& _session;
-
+
private:
void hscroll_changed ();
void routes_changed ();
void reconnect_to_routes ();
void select_arrangement ();
- void add_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>);
+ void add_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
void remove_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
void rename_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
void disassociate_all_on_channel (boost::weak_ptr<ARDOUR::Bundle>, uint32_t, int);
+ void disassociate_all_on_bundle (boost::weak_ptr<ARDOUR::Bundle>, int);
void setup_global_ports ();
- void hide_group (boost::weak_ptr<PortGroup>);
- void show_group (boost::weak_ptr<PortGroup>);
+ void setup_global_ports_proxy ();
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 setup_notebooks ();
+ void remove_notebook_pages (Gtk::Notebook &);
+ void notebook_page_selected (GtkNotebookPage *, guint);
+ void route_processors_changed (ARDOUR::RouteProcessorChange);
+ void body_dimensions_changed ();
+ void session_going_away ();
+ void add_remove_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr<ARDOUR::Bundle>, int);
+ void add_disassociate_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr<ARDOUR::Bundle>, int, int);
+ void port_connected_or_disconnected ();
Gtk::Window* _parent;
- /// port type that we are working with
+ /// port type that we are working with, or NIL if we are working with all of them
ARDOUR::DataType _type;
- std::vector<sigc::connection> _route_connections;
+ PBD::ScopedConnectionList _route_connections;
+ PBD::ScopedConnectionList _changed_connections;
+ PBD::ScopedConnectionList _bundle_changed_connections;
PortMatrixBody* _body;
Gtk::HScrollbar _hscroll;
Gtk::VScrollbar _vscroll;
+ Gtk::Notebook _vnotebook;
+ Gtk::Notebook _hnotebook;
+ Gtk::Label _vlabel;
+ Gtk::Label _hlabel;
+ Gtk::VBox _vbox;
+ Gtk::HBox _hbox;
+ Gtk::Label _hspacer;
+ Gtk::Label _vspacer;
Gtk::Menu* _menu;
Arrangement _arrangement;
int _row_index;
int _min_height_divisor;
bool _show_only_bundles;
bool _inhibit_toggle_show_only_bundles;
- bool _realized;
+ bool _ignore_notebook_page_selected;
};
#endif