summaryrefslogtreecommitdiff
path: root/gtk2_ardour/port_matrix.h
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2007-10-19 13:30:07 +0000
committerCarl Hetherington <carl@carlh.net>2007-10-19 13:30:07 +0000
commit77f16522e0b396262bc272c1637753faa9da0ba7 (patch)
tree54520a9d20bc61e72cfdf8c162eb9ed07b95e99d /gtk2_ardour/port_matrix.h
parent239ec39da6583e6e00cd03fa3bde8f1e27016b4d (diff)
Various work on bundles. We now have a Bundle Manager dialogue, and hopefully things are a bit cleaner internally. This commit changes the session file format with respect to bundles (or Connections as they used to be called).
git-svn-id: svn://localhost/ardour2/trunk@2561 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/port_matrix.h')
-rw-r--r--gtk2_ardour/port_matrix.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h
new file mode 100644
index 0000000000..a945d00496
--- /dev/null
+++ b/gtk2_ardour/port_matrix.h
@@ -0,0 +1,200 @@
+/*
+ Copyright (C) 2002-2007 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 __ardour_ui_port_matrix_h__
+#define __ardour_ui_port_matrix_h__
+
+#include <gtkmm/box.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/table.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/eventbox.h>
+#include <gtkmm/scrolledwindow.h>
+
+#include "ardour_dialog.h"
+
+namespace ARDOUR {
+ class Session;
+ class IO;
+ class PortInsert;
+}
+
+class PortMatrix;
+
+/// A list of port names, grouped by some aspect of their type e.g. busses, tracks, system
+class PortGroup
+{
+ 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);
+
+ std::string name; ///< name for the group
+ std::string prefix; ///< prefix (before colon) e.g. "ardour:"
+ std::vector<std::string> 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_table ();
+ Gtk::Widget& get_visibility_checkbutton ();
+ std::pair<int, int> unit_size () const;
+ PortGroup& port_group () { return _port_group; }
+ void setup_visibility ();
+
+ private:
+ void port_checkbutton_toggled (Gtk::CheckButton*, int, int);
+ 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::Table _table;
+ Gtk::EventBox _table_box;
+ std::vector<std::vector<Gtk::CheckButton* > > _port_checkbuttons;
+ Gtk::CheckButton _visibility_checkbutton;
+};
+
+/// A list of PortGroups
+class PortGroupList : public std::list<PortGroup*>
+{
+ 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;
+};
+
+
+/// A widget which provides a set of rotated text labels
+class RotatedLabelSet : public Gtk::Widget {
+ public:
+ RotatedLabelSet (PortGroupList&);
+ virtual ~RotatedLabelSet ();
+
+ void set_angle (int);
+ void set_base_width (int);
+ void update_visibility ();
+
+ protected:
+ virtual void on_size_request (Gtk::Requisition*);
+ virtual void on_size_allocate (Gtk::Allocation&);
+ virtual void on_realize ();
+ virtual void on_unrealize ();
+ virtual bool on_expose_event (GdkEventExpose*);
+
+ Glib::RefPtr<Gdk::Window> _gdk_window;
+
+ private:
+ std::pair<int, int> setup_layout (std::string const &);
+
+ PortGroupList& _port_group_list; ///< list of ports to display
+ int _angle_degrees; ///< label rotation angle in degrees
+ double _angle_radians; ///< label rotation angle in radians
+ int _base_width; ///< width of labels; see set_base_width() for more details
+ Glib::RefPtr<Pango::Context> _pango_context;
+ Glib::RefPtr<Pango::Layout> _pango_layout;
+ Glib::RefPtr<Gdk::GC> _gc;
+ Gdk::Color _fg_colour;
+ Gdk::Color _bg_colour;
+};
+
+
+class PortMatrix : public Gtk::VBox {
+ public:
+ PortMatrix (ARDOUR::Session&, ARDOUR::DataType, bool, PortGroupList::Mask);
+ ~PortMatrix ();
+
+ void redisplay ();
+
+ enum Result {
+ Cancelled,
+ Accepted
+ };
+
+ sigc::signal<void, Result> Finished;
+
+ void set_type (ARDOUR::DataType);
+ void set_offer_inputs (bool);
+
+ virtual void set_state (int, std::string const &, bool) = 0;
+ virtual bool get_state (int, std::string const &) const = 0;
+ virtual uint32_t n_rows () const = 0;
+ virtual uint32_t maximum_rows () const = 0;
+ virtual uint32_t minimum_rows () const = 0;
+ virtual std::string row_name (int) const = 0;
+ virtual void add_row () = 0;
+ virtual void remove_row (int) = 0;
+ virtual std::string row_descriptor () const = 0;
+
+ protected:
+
+ bool _offer_inputs;
+
+ private:
+ void setup ();
+ void clear ();
+ void setup_dimensions ();
+ bool row_label_button_pressed (GdkEventButton*, int);
+
+ PortGroupList _port_group_list;
+ ARDOUR::DataType _type;
+ std::vector<PortGroupUI*> _port_group_ui;
+ std::vector<Gtk::EventBox*> _row_labels[2];
+ Gtk::VBox* _row_labels_vbox[2];
+ RotatedLabelSet _column_labels;
+ Gtk::HBox _overall_hbox;
+ Gtk::VBox _side_vbox[2];
+ Gtk::HBox _port_group_hbox;
+ Gtk::ScrolledWindow _scrolled_window;
+ Gtk::Label* _side_vbox_pad[2];
+ Gtk::HBox _visibility_checkbutton_box;
+};
+
+#endif