- attach(*new Gtk::HSeparator(), 0, 4, 4, 5, Gtk::FILL, Gtk::SHRINK, 0, 0);
- set_col_spacing(4, -5);
- attach(_select_all, 0, 2, 5, 6);
- attach(_select_none, 2, 4, 5, 6);
- attach(_invert_selection, 0, 4, 6, 7);
-
- _selected_channels = 0;
- for(uint16_t i = 0; i < 16; i++) {
- Gtk::ToggleButton *button = &_buttons[i / 4][i % 4];
- if(initial_selection & (1L << i)) {
+ attach(*manage(new VSeparator()), 4, 5, 0, 4, SHRINK, FILL, 0, 0);
+ //set_row_spacing(4, -5);
+ attach(_select_all, 5, 6, 0, 1);
+ attach(_select_none, 5, 6, 1, 2);
+ attach(_invert_selection, 5, 6, 2, 3);
+ attach(_force_channel, 5, 6, 3, 4);
+
+ set_selected_channels(mask);
+}
+
+MidiMultipleChannelSelector::~MidiMultipleChannelSelector()
+{
+ mode_changed.clear();
+}
+
+void
+MidiMultipleChannelSelector::set_channel_mode(ChannelMode mode, uint16_t mask)
+{
+ switch (mode) {
+ case AllChannels:
+ _force_channel.set_active(false);
+ set_selected_channels(0xFFFF);
+ break;
+ case FilterChannels:
+ _force_channel.set_active(false);
+ set_selected_channels(mask);
+ break;
+ case ForceChannel:
+ _force_channel.set_active(true);
+ for (uint16_t i = 0; i < 16; i++) {
+ ToggleButton* button = &_buttons[i / 4][i % 4];
+ button->set_active(i == mask);
+ }
+ }
+}
+
+uint16_t
+MidiMultipleChannelSelector::get_selected_channels() const
+{
+ uint16_t selected_channels = 0;
+ for (uint16_t i = 0; i < 16; i++) {
+ const ToggleButton* button = &_buttons[i / 4][i % 4];
+ if (button->get_active()) {
+ selected_channels |= (1L << i);
+ }
+ }
+
+ return selected_channels;
+}
+
+void
+MidiMultipleChannelSelector::set_selected_channels(uint16_t selected_channels)
+{
+ for (uint16_t i = 0; i < 16; i++) {
+ ToggleButton* button = &_buttons[i / 4][i % 4];
+ if (selected_channels & (1L << i)) {