From 7ba87f7672caf9a0ae395e895c1ca50543442636 Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Thu, 17 Apr 2008 10:27:03 +0000 Subject: * 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 --- gtk2_ardour/midi_channel_selector.cc | 78 ++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 8 deletions(-) (limited to 'gtk2_ardour/midi_channel_selector.cc') 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 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); + } + } +} + -- cgit v1.2.3