22 #include <gtkmm/separator.h>
23 #include <gtkmm/box.h>
24 #include <gtkmm/label.h>
25 #include <gtkmm/togglebutton.h>
26 #include <gtkmm/radiobutton.h>
27 #include <gtkmm/table.h>
48 : Table(
std::max(4,
std::max(n_rows, start_row + 4)),
49 std::max(4,
std::max(n_columns, start_column + 4)),
51 , _recursion_counter(0)
53 property_column_spacing() = 0;
54 property_row_spacing() = 0;
56 uint8_t channel_nr = 0;
57 for (
int row = 0; row < 4; ++row) {
58 for (
int column = 0; column < 4; ++column) {
59 ostringstream channel;
60 channel << int(++channel_nr);
64 _buttons[row][column].signal_toggled().connect(
71 _buttons[row][column].signal_button_release_event().connect(
74 int table_row = start_row + row;
75 int table_column = start_column + column;
76 attach(
_buttons[row][column], table_column, table_column + 1, table_row, table_row + 1);
95 for (
int row = 0; row < 4; ++row) {
96 for (
int column = 0; column < 4; ++column) {
99 snprintf(color_normal, 8,
"#%x",
UINT_INTERPOLATE(new_channel_colors[row * 4 + column], 0x000000ff, 0.6));
100 snprintf(color_active, 8,
"#%x", new_channel_colors[row * 4 + column]);
101 _buttons[row][column].modify_bg(STATE_NORMAL, Gdk::Color(color_normal));
102 _buttons[row][column].modify_bg(STATE_ACTIVE, Gdk::Color(color_active));
110 for (
int row = 0; row < 4; ++row) {
111 for (
int column = 0; column < 4; ++column) {
112 _buttons[row][column].unset_fg (STATE_NORMAL);
113 _buttons[row][column].unset_fg (STATE_ACTIVE);
114 _buttons[row][column].unset_bg (STATE_NORMAL);
115 _buttons[row][column].unset_bg (STATE_ACTIVE);
124 ToggleButton* button = &
_buttons[active_channel / 4][active_channel % 4];
126 button->set_active(
true);
137 if (button->get_active()) {
146 button->set_active(
true);
155 , _channel_mode(mode)
173 set_homogeneous(
false);
174 attach(*manage(
new VSeparator()), 4, 5, 0, 4, SHRINK, FILL, 0, 0);
203 for (uint16_t i = 0; i < 16; i++) {
204 ToggleButton* button = &
_buttons[i / 4][i % 4];
205 button->set_active(i == mask);
213 uint16_t selected_channels = 0;
214 for (uint16_t i = 0; i < 16; i++) {
215 const ToggleButton* button = &
_buttons[i / 4][i % 4];
216 if (button->get_active()) {
217 selected_channels |= (1L << i);
221 return selected_channels;
227 for (uint16_t i = 0; i < 16; i++) {
228 ToggleButton* button = &
_buttons[i / 4][i % 4];
229 if (selected_channels & (1L << i)) {
230 button->set_active(
true);
232 button->set_active(
false);
257 bool found_first_active =
false;
259 uint16_t active_channel = 0;
260 for (
int i = 0; i <= 15; i++) {
261 ToggleButton* button = &
_buttons[i / 4][i % 4];
262 if (button->get_active()) {
263 if (found_first_active) {
265 button->set_active(
false);
268 found_first_active =
true;
274 if (!found_first_active) {
298 for (uint16_t i = 0; i < 16; i++) {
299 ToggleButton* button = &
_buttons[i / 4][i % 4];
300 button->set_active(on);
313 for (uint16_t i = 0; i < 16; i++) {
314 ToggleButton* button = &
_buttons[i / 4][i % 4];
315 if (button->get_active()) {
316 button->set_active(
false);
318 button->set_active(
true);
330 , playback_all_button (playback_button_group,
_(
"Playback all channels"))
331 , playback_filter_button (playback_button_group,
_(
"Play only selected channels"))
332 , playback_force_button (playback_button_group,
_(
"Use a single fixed channel for all playback"))
333 , capture_all_button (capture_button_group,
_(
"Record all channels"))
334 , capture_filter_button (capture_button_group,
_(
"Record only selected channels"))
335 , capture_force_button (capture_button_group,
_(
"Force all channels to 1 channel"))
361 HBox* capture_controls;
362 HBox* playback_controls;
366 vpacker = manage (
new VBox);
367 vpacker->set_spacing (6);
368 vpacker->set_border_width (12);
370 l = manage (
new Label (
string_compose ((
"<span size=\"larger\" weight=\"bold\">%1: %2</span>"),
_(
"MIDI Channel Control"),
track->
name())));
371 l->set_use_markup (
true);
372 l->set_alignment (0.5, 0.0);
374 vpacker->pack_start (*l,
true,
true);
376 l = manage (
new Label (
string_compose (
"<span size=\"large\" weight=\"bold\">%1</span>",
_(
"Inbound"))));
377 l->set_use_markup (
true);
378 vpacker->pack_start (*l);
392 capture_controls = manage (
new HBox);
393 capture_controls->set_spacing (6);
395 b = manage (
new Button (
_(
"All")));
397 capture_controls->pack_start (*b);
400 b = manage (
new Button (
_(
"None")));
402 capture_controls->pack_start (*b);
405 b = manage (
new Button (
_(
"Invert")));
407 capture_controls->pack_start (*b);
411 vpacker->pack_start (*capture_controls);
413 l = manage (
new Label (
string_compose (
"<span size=\"large\" weight=\"bold\">%1</span>",
_(
"Playback"))));
414 l->set_use_markup (
true);
415 vpacker->pack_start (*l);
428 playback_controls = manage (
new HBox);
429 playback_controls->set_spacing (6);
431 b = manage (
new Button (
_(
"All")));
433 playback_controls->pack_start (*b);
436 b = manage (
new Button (
_(
"None")));
438 playback_controls->pack_start (*b);
441 b = manage (
new Button (
_(
"Invert")));
443 playback_controls->pack_start (*b);
447 vpacker->pack_start (*playback_controls);
509 for (uint16_t i = 0; i < 16; i++) {
516 for (uint16_t i = 0; i < 16; i++) {
532 for (uint16_t i = 0; i < 16; i++) {
539 for (uint16_t i = 0; i < 16; i++) {
561 uint32_t first_channel = 0;
574 (*i)->set_sensitive (
false);
584 (*i)->set_sensitive (
true);
588 (*i)->set_sensitive (
true);
599 (*i)->set_sensitive (
false);
610 RadioButtonGroup group;
612 for (uint32_t n = 0; n < 16; ++n) {
614 snprintf (buf,
sizeof (buf),
"%d", n+1);
619 tb = manage (
new ToggleButton (buf));
623 tb = manage (
new RadioButton (group, buf));
624 tb->property_draw_indicator() =
false;
625 if (n == first_channel) {
626 tb->set_active (
true);
632 tb->set_name (
X_(
"MidiChannelSelectorButton"));
638 tb->set_sensitive (
false);
649 (*i)->set_sensitive (
false);
659 uint32_t first_channel = 0;
672 (*i)->set_sensitive (
false);
682 (*i)->set_sensitive (
true);
686 (*i)->set_sensitive (
true);
697 (*i)->set_sensitive (
false);
708 RadioButtonGroup group;
710 for (uint32_t n = 0; n < 16; ++n) {
712 snprintf (buf,
sizeof (buf),
"%d", n+1);
717 tb = manage (
new ToggleButton (buf));
721 tb = manage (
new RadioButton (group, buf));
722 tb->property_draw_indicator() =
false;
723 if (n == first_channel) {
724 tb->set_active (
true);
730 tb->set_name (
X_(
"MidiChannelSelectorButton"));
736 tb->set_sensitive (
false);
747 (*i)->set_sensitive (
false);
859 for (uint32_t n = 0; n < 16; ++n) {
861 char color_normal[8];
862 char color_active[8];
864 snprintf(color_normal, 8,
"#%x",
UINT_INTERPOLATE(new_channel_colors[n], 0x000000ff, 0.6));
865 snprintf(color_active, 8,
"#%x", new_channel_colors[n]);
878 for (uint32_t n = 0; n < 16; ++n) {
void set_channel_mode(ARDOUR::ChannelMode mode, uint16_t mask)
std::vector< Gtk::Widget * > playback_mask_controls
Force all events to a certain channel.
void set_channel_colors(const uint32_t new_channel_colors[16])
void playback_mode_changed()
PBD::Signal0< void > ChannelModeChanged
virtual ~MidiChannelSelector()=0
void set_selected_channels(uint16_t selected_channels)
std::vector< Gtk::Widget * > capture_mask_controls
void set_capture_selected_channels(uint16_t)
void playback_mask_changed()
ARDOUR::ChannelMode _channel_mode
ARDOUR::ChannelMode last_drawn_playback_mode
std::vector< Gtk::ToggleButton * > capture_buttons
ARDOUR::ChannelMode last_drawn_capture_mode
Gtk::RadioButton playback_filter_button
uint16_t get_playback_channel_mask() const
virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr)
void set_capture_channel_mode(ChannelMode mode, uint16_t mask)
sigc::signal< void > clicked
MidiChannelFilter & playback_filter()
void set_playback_channel_mask(uint16_t mask)
void capture_mask_changed()
uint16_t get_selected_channels() const
PBD::Signal0< void > ChannelMaskChanged
uint16_t get_capture_channel_mask() const
boost::shared_ptr< ARDOUR::MidiTrack > track
Gtk::RadioButton playback_all_button
void invert_playback_mask()
void set_default_channel_color()
void set_capture_channel_mask(uint16_t mask)
sigc::signal< void, uint8_t > channel_selected
void fill_playback_mask()
Gtk::Button _invert_selection
void set_channel_colors(const uint32_t new_channel_colors[16])
virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr)
Gtkmm2ext::StatefulToggleButton _buttons[4][4]
void set_playback_channel_mode(ChannelMode mode, uint16_t mask)
MidiChannelFilter & capture_filter()
MidiMultipleChannelSelector(ARDOUR::ChannelMode mode=ARDOUR::FilterChannels, uint16_t initial_selection=0xFFFF)
void playback_mode_toggled(ARDOUR::ChannelMode)
sigc::signal< void, ARDOUR::ChannelMode, uint16_t > mode_changed
void invert_capture_mask()
std::vector< Gtk::ToggleButton * > playback_buttons
void force_channels_button_toggled()
bool was_clicked(GdkEventButton *)
Gtk::Label _button_labels[4][4]
~MidiChannelSelectorWindow()
void set_tip(Gtk::Widget &w, const gchar *tip)
Gtk::RadioButton capture_filter_button
void invert_selection(void)
Gtk::ToggleButton * _last_active_button
void zero_playback_mask()
ChannelMode get_capture_channel_mode() const
Gtk::RadioButton playback_force_button
void set_default_channel_color()
Pass through all channel information unmodified.
void capture_mode_changed()
SingleMidiChannelSelector(uint8_t active_channel=0)
Gtk::HBox playback_mask_box
MidiChannelSelector(int n_rows=4, int n_columns=4, int start_row=0, int start_column=0)
ChannelMode get_playback_channel_mode() const
#define UINT_INTERPOLATE(c1, c2, t)
Gtk::RadioButton capture_force_button
#define MISSING_INVALIDATOR
Gtk::RadioButton capture_all_button
void playback_channel_clicked(uint16_t)
Gtk::ToggleButton _force_channel
void set_playback_selected_channels(uint16_t)
MidiChannelSelectorWindow(boost::shared_ptr< ARDOUR::MidiTrack >)
Gtk::HBox capture_mask_box
std::string string_compose(const std::string &fmt, const T1 &o1)
LIBGTKMM2EXT_API void container_clear(Gtk::Container &)
virtual ~MidiMultipleChannelSelector()
virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr)=0
Ignore events on certain channels.
void capture_channel_clicked(uint16_t)
void capture_mode_toggled(ARDOUR::ChannelMode)