summaryrefslogtreecommitdiff
path: root/gtk2_ardour/transport_masters_dialog.h
blob: 0970be495116c2b9107a08227ef9083b18f31a16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
 * Copyright (C) 2018-2019 Paul Davis <paul@linuxaudiosystems.com>
 *
 * 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.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef __ardour_gtk_transport_masters_dialog_h__
#define __ardour_gtk_transport_masters_dialog_h__

#include <vector>
#include <string>

#include <gtkmm/button.h>
#include <gtkmm/eventbox.h>
#include <gtkmm/radiobutton.h>
#include <gtkmm/label.h>
#include <gtkmm/table.h>
#include <gtkmm/entry.h>
#include <gtkmm/treestore.h>

#include "widgets/ardour_button.h"

#include "ardour_window.h"

namespace Gtk {
	class Menu;
}

namespace ARDOUR {
	class TransportMaster;
}

class FloatingTextEntry;

class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
{
  public:
	TransportMastersWidget ();
	~TransportMastersWidget ();

	void update (ARDOUR::samplepos_t);
	void set_transport_master (boost::shared_ptr<ARDOUR::TransportMaster>);

	void set_session (ARDOUR::Session*);

  protected:
	void on_map ();
	void on_unmap ();

  private:

	struct AddTransportMasterDialog : public ArdourDialog {
	  public:
		AddTransportMasterDialog ();
		std::string get_name () const;
		ARDOUR::SyncSource get_type () const;

	  private:
		Gtk::Label name_label;
		Gtk::Label type_label;
		Gtk::HBox name_hbox;
		Gtk::HBox type_hbox;
		Gtk::Entry name_entry;
		Gtk::ComboBoxText type_combo;
	};

	struct Row : sigc::trackable, PBD::ScopedConnectionList {
		TransportMastersWidget& parent;
		Gtk::EventBox label_box;
		Gtk::EventBox current_box;
		Gtk::EventBox last_box;
		Gtk::Label label;
		Gtk::Label type;
		Gtk::Label format;
		Gtk::Label current;
		Gtk::Label last;
		Gtk::RadioButton use_button;
		Gtk::ComboBoxText port_combo;
		Gtk::CheckButton sclock_synced_button;
		Gtk::CheckButton fr2997_button;
		ArdourWidgets::ArdourButton request_options;
		Gtk::Menu* request_option_menu;
		ArdourWidgets::ArdourButton remove_button;
		FloatingTextEntry* name_editor;
		samplepos_t save_when;
		std::string save_last;

		void build_request_options();
		void mod_request_type (ARDOUR::TransportRequestType);

		boost::shared_ptr<ARDOUR::TransportMaster> tm;

		void update (ARDOUR::Session*, ARDOUR::samplepos_t);

		Row (TransportMastersWidget& parent);
		~Row ();

		void populate_port_combo ();
		void build_port_list (ARDOUR::DataType);

		void use_button_toggled ();
		void collect_button_toggled ();
		void sync_button_toggled ();
		void fr2997_button_toggled ();
		void port_choice_changed ();
		void connection_handler ();
		bool request_option_press (GdkEventButton*);
		void prop_change (PBD::PropertyChange);
		void remove_clicked ();

		bool name_press (GdkEventButton*);
		void name_edited (std::string, int);

		PBD::ScopedConnection property_change_connection;
		bool ignore_active_change;

		bool port_combo_proxy (GdkEventButton*);
	};

	std::vector<Row*> rows;

	Gtk::Table table;
	Gtk::Label col_title[14];
	float align[14];
	ArdourWidgets::ArdourButton add_button;
	Gtk::CheckButton lost_sync_button;

	sigc::connection update_connection;
	PBD::ScopedConnection current_connection;
	PBD::ScopedConnection add_connection;
	PBD::ScopedConnection remove_connection;
	PBD::ScopedConnection engine_running_connection;

	struct PortColumns : public Gtk::TreeModel::ColumnRecord {
		PortColumns() {
			add (short_name);
			add (full_name);
		}
		Gtk::TreeModelColumn<std::string> short_name;
		Gtk::TreeModelColumn<std::string> full_name;
	};

	PortColumns port_columns;

	friend class Row;
	Glib::RefPtr<Gtk::ListStore> midi_port_store;
	Glib::RefPtr<Gtk::ListStore> audio_port_store;

	PBD::ScopedConnection port_reg_connection;
	void update_ports ();
	bool ignore_active_change;
	void build_port_model (Glib::RefPtr<Gtk::ListStore>, std::vector<std::string> const &);

	void rebuild ();
	void clear ();
	void current_changed (boost::shared_ptr<ARDOUR::TransportMaster> old_master, boost::shared_ptr<ARDOUR::TransportMaster> new_master);
	bool add_master (GdkEventButton* ev);
	void update_usability ();
	void allow_master_select (bool);

	void lost_sync_changed ();
	void lost_sync_button_toggled ();
	void param_changed (std::string const &);
	PBD::ScopedConnection config_connection;
	PBD::ScopedConnection session_config_connection;

  public:
	bool idle_remove (Row*);
};

class TransportMastersWindow : public ArdourWindow
{
  public:
	TransportMastersWindow ();

	void set_session (ARDOUR::Session*);

  protected:
	void on_realize ();

  private:
	TransportMastersWidget w;
};


#endif /* __ardour_gtk_transport_masters_dialog_h__ */