summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_channel_selector.cc
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2008-04-17 10:27:03 +0000
committerHans Baier <hansfbaier@googlemail.com>2008-04-17 10:27:03 +0000
commit7ba87f7672caf9a0ae395e895c1ca50543442636 (patch)
treed377bffbc0f3103cccbdb8232e207ac74aba93c1 /gtk2_ardour/midi_channel_selector.cc
parent0c66131fea79acd8d540be8c943865257d49b001 (diff)
* added All/None/Invert Buttons to MidiMultipleChannelSelector
* Added assertion at crash location introduced by latest merge in ProcessorBox::build_processor_menu: git-svn-id: svn://localhost/ardour2/branches/3.0@3260 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_channel_selector.cc')
-rw-r--r--gtk2_ardour/midi_channel_selector.cc78
1 files changed, 70 insertions, 8 deletions
diff --git a/gtk2_ardour/midi_channel_selector.cc b/gtk2_ardour/midi_channel_selector.cc
index 327b9d74ae..6fba415389 100644
--- a/gtk2_ardour/midi_channel_selector.cc
+++ b/gtk2_ardour/midi_channel_selector.cc
@@ -1,11 +1,18 @@
#include "midi_channel_selector.h"
+#include "gtkmm/separator.h"
+#include "i18n.h"
#include <sstream>
using namespace std;
-MidiChannelSelector::MidiChannelSelector() :
- Gtk::Table(4,4,true)
-{
+MidiChannelSelector::MidiChannelSelector(int no_rows, int no_columns, int start_row, int start_column) :
+ Gtk::Table(no_rows, no_columns, true)
+{
+ assert(no_rows >= 4);
+ assert(no_rows >= start_row + 4);
+ assert(no_columns >=4);
+ assert(no_columns >= start_column + 4);
+
property_column_spacing() = 0;
property_row_spacing() = 0;
@@ -22,7 +29,10 @@ MidiChannelSelector::MidiChannelSelector() :
sigc::mem_fun(this, &MidiChannelSelector::button_toggled),
&_buttons[row][column],
channel_nr - 1));
- attach(_buttons[row][column], column, column + 1, row, row + 1);
+
+ int table_row = start_row + row;
+ int table_column = start_column + column;
+ attach(_buttons[row][column], table_column, table_column + 1, table_row, table_row + 1);
}
}
}
@@ -54,12 +64,64 @@ SingleMidiChannelSelector::button_toggled(Gtk::ToggleButton *button, uint8_t cha
}
}
+MidiMultipleChannelSelector::MidiMultipleChannelSelector(uint16_t initial_selection)
+ : MidiChannelSelector(6, 4, 0, 0)
+{
+ _select_all.add(*new Gtk::Label(_("All")));
+ _select_all.signal_clicked().connect(
+ sigc::bind(sigc::mem_fun(this, &MidiMultipleChannelSelector::select_all), true));
+
+ _select_none.add(*new Gtk::Label(_("None")));
+ _select_none.signal_clicked().connect(
+ sigc::bind(sigc::mem_fun(this, &MidiMultipleChannelSelector::select_all), false));
+
+ _invert_selection.add(*new Gtk::Label(_("Invert")));
+ _invert_selection.signal_clicked().connect(
+ sigc::mem_fun(this, &MidiMultipleChannelSelector::invert_selection));
+
+ set_homogeneous(false);
+ 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)) {
+ button->set_active(true);
+ } else {
+ button->set_active(false);
+ }
+ }
+}
+
void
MidiMultipleChannelSelector::button_toggled(Gtk::ToggleButton *button, uint8_t channel)
{
- if(button->get_active()) {
- _selected_channels.insert(channel);
- } else {
- _selected_channels.erase(channel);
+ _selected_channels = _selected_channels ^ (1L << channel);
+}
+
+void
+MidiMultipleChannelSelector::select_all(bool on)
+{
+ for(uint16_t i = 0; i < 16; i++) {
+ Gtk::ToggleButton *button = &_buttons[i / 4][i % 4];
+ button->set_active(on);
}
}
+
+void
+MidiMultipleChannelSelector::invert_selection(void)
+{
+ for(uint16_t i = 0; i < 16; i++) {
+ Gtk::ToggleButton *button = &_buttons[i / 4][i % 4];
+ if(button->get_active()) {
+ button->set_active(false);
+ } else {
+ button->set_active(true);
+ }
+ }
+}
+