* made channel selector look quite nice, see http://www.flickr.com/photos/24012642...
[ardour.git] / gtk2_ardour / midi_channel_selector.h
1 #ifndef __ardour_ui_midi_channel_selector_h__
2 #define __ardour_ui_midi_channel_selector_h__
3
4 #include "boost/shared_ptr.hpp"
5 #include "gtkmm/table.h"
6 #include "sigc++/trackable.h"
7 #include "gtkmm/button.h"
8 #include "gtkmm/togglebutton.h"
9 #include "gtkmm/label.h"
10 #include <set>
11
12 class MidiChannelSelector : public Gtk::Table
13 {
14 public:
15         MidiChannelSelector(int no_rows = 4, int no_columns = 4, int start_row = 0, int start_column = 0);
16         virtual ~MidiChannelSelector() = 0;
17         
18 protected:
19         virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr) = 0;
20         Gtk::Label        _button_labels[4][4];
21         Gtk::ToggleButton _buttons[4][4];
22 };
23
24 class SingleMidiChannelSelector : public MidiChannelSelector
25 {
26 public:
27         SingleMidiChannelSelector(uint8_t active_channel = 0);
28         
29         const uint8_t get_active_channel() const { return _active_channel; }
30         
31         sigc::signal<void, uint8_t> channel_selected;
32         
33 protected:
34         virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr);
35
36         Gtk::ToggleButton *_active_button;
37         uint8_t _active_channel;
38 };
39
40 class MidiMultipleChannelSelector : public MidiChannelSelector
41 {
42 public:
43         MidiMultipleChannelSelector(uint16_t initial_selection = 1);
44         
45         const uint16_t get_selected_channels() const { return _selected_channels; }
46         
47         sigc::signal<void, uint16_t> selection_changed;
48
49 protected:
50         virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr);
51         
52         void select_all(bool on);
53         void invert_selection(void);
54         
55         Gtk::Button            _select_all;
56         Gtk::Button            _select_none;
57         Gtk::Button            _invert_selection;
58         Gtk::ToggleButton      _force_channel;
59         uint16_t               _selected_channels;
60 };
61
62 #endif /*__ardour_ui_midi_channel_selector_h__*/