Fix formatting samplecnt_t (aka int64_t aka long long int)
[ardour.git] / gtk2_ardour / midi_channel_selector.h
1 /*
2  * Copyright (C) 2008-2011 David Robillard <d@drobilla.net>
3  * Copyright (C) 2008-2012 Hans Baier <hansfbaier@googlemail.com>
4  * Copyright (C) 2010-2013 Paul Davis <paul@linuxaudiosystems.com>
5  * Copyright (C) 2011 Carl Hetherington <carl@carlh.net>
6  * Copyright (C) 2017 Robin Gareus <robin@gareus.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22
23 #ifndef __ardour_ui_midi_channel_selector_h__
24 #define __ardour_ui_midi_channel_selector_h__
25
26 #include <set>
27 #include "boost/shared_ptr.hpp"
28 #include "sigc++/trackable.h"
29
30 #include "gtkmm/table.h"
31 #include "gtkmm/box.h"
32 #include "gtkmm/button.h"
33 #include "gtkmm/radiobutton.h"
34 #include "gtkmm/label.h"
35
36 #include "widgets/stateful_button.h"
37
38 #include "ardour/types.h"
39
40 #include "ardour_window.h"
41
42 namespace ARDOUR {
43         class MidiTrack;
44 }
45
46 class MidiChannelSelector : public Gtk::Table
47 {
48 public:
49         MidiChannelSelector(int n_rows = 4, int n_columns = 4, int start_row = 0, int start_column = 0);
50         virtual ~MidiChannelSelector() = 0;
51
52         sigc::signal<void> clicked;
53
54         void set_channel_colors(const uint32_t new_channel_colors[16]);
55         void set_default_channel_color();
56
57 protected:
58         virtual void button_toggled(Gtk::ToggleButton* button, uint8_t button_nr) = 0;
59         Gtk::Label                          _button_labels[4][4];
60         ArdourWidgets::StatefulToggleButton _buttons[4][4];
61         int                                 _recursion_counter;
62
63         bool was_clicked (GdkEventButton*);
64 };
65
66 class SingleMidiChannelSelector : public MidiChannelSelector
67 {
68 public:
69         SingleMidiChannelSelector(uint8_t active_channel = 0);
70
71         uint8_t get_active_channel() const { return _active_channel; }
72
73         sigc::signal<void, uint8_t> channel_selected;
74
75 protected:
76         virtual void button_toggled(Gtk::ToggleButton* button, uint8_t button_nr);
77
78         Gtk::ToggleButton* _last_active_button;
79         uint8_t            _active_channel;
80 };
81
82 class MidiMultipleChannelSelector : public MidiChannelSelector
83 {
84 public:
85         MidiMultipleChannelSelector(ARDOUR::ChannelMode mode = ARDOUR::FilterChannels,
86                         uint16_t initial_selection = 0xFFFF);
87
88         virtual ~MidiMultipleChannelSelector();
89
90         /** The channel mode or selected channel(s) has changed.
91          *  First parameter is the new channel mode, second parameter is a bitmask
92          *  of the currently selected channels.
93          */
94         sigc::signal<void, ARDOUR::ChannelMode, uint16_t> mode_changed;
95
96         void set_channel_mode(ARDOUR::ChannelMode mode, uint16_t mask);
97         ARDOUR::ChannelMode get_channel_mode () const { return _channel_mode; }
98
99         /**
100          * @return each bit in the returned word represents a midi channel, eg.
101          *         bit 0 represents channel 0 and bit 15 represents channel 15
102          *
103          */
104         uint16_t get_selected_channels() const;
105         void     set_selected_channels(uint16_t selected_channels);
106
107 protected:
108         ARDOUR::ChannelMode _channel_mode;
109         ARDOUR::NoteMode    _note_mode;
110
111         virtual void button_toggled(Gtk::ToggleButton* button, uint8_t button_nr);
112         void force_channels_button_toggled();
113
114         void select_all(bool on);
115         void invert_selection(void);
116
117         Gtk::Button       _select_all;
118         Gtk::Button       _select_none;
119         Gtk::Button       _invert_selection;
120         Gtk::ToggleButton _force_channel;
121 };
122
123 class MidiChannelSelectorWindow : public ArdourWindow, public PBD::ScopedConnectionList
124 {
125 public:
126         MidiChannelSelectorWindow (boost::shared_ptr<ARDOUR::MidiTrack>);
127         ~MidiChannelSelectorWindow ();
128
129         void set_channel_colors (const uint32_t new_channel_colors[16]);
130         void set_default_channel_color();
131
132 private:
133         boost::shared_ptr<ARDOUR::MidiTrack> track;
134         std::vector<Gtk::ToggleButton*> playback_buttons;
135         std::vector<Gtk::ToggleButton*> capture_buttons;
136
137         std::vector<Gtk::Widget*> playback_mask_controls;
138         std::vector<Gtk::Widget*> capture_mask_controls;
139
140         Gtk::HBox         capture_mask_box;
141         Gtk::HBox         playback_mask_box;
142         Gtk::RadioButtonGroup playback_button_group;
143         Gtk::RadioButton playback_all_button;
144         Gtk::RadioButton playback_filter_button;
145         Gtk::RadioButton playback_force_button;
146         Gtk::RadioButtonGroup capture_button_group;
147         Gtk::RadioButton capture_all_button;
148         Gtk::RadioButton capture_filter_button;
149         Gtk::RadioButton capture_force_button;
150
151         ARDOUR::ChannelMode last_drawn_capture_mode;
152         ARDOUR::ChannelMode last_drawn_playback_mode;
153
154         void build();
155         void set_capture_selected_channels (uint16_t);
156         void set_playback_selected_channels (uint16_t);
157
158         void fill_playback_mask ();
159         void zero_playback_mask ();
160         void invert_playback_mask ();
161
162         void fill_capture_mask ();
163         void zero_capture_mask ();
164         void invert_capture_mask ();
165
166         void playback_mask_changed ();
167         void capture_mask_changed ();
168         void playback_mode_changed ();
169         void capture_mode_changed ();
170
171         void playback_channel_clicked (uint16_t);
172         void capture_channel_clicked (uint16_t);
173
174         void playback_all_clicked();
175         void playback_none_clicked();
176         void playback_invert_clicked();
177
178         void capture_all_clicked();
179         void capture_none_clicked();
180         void capture_invert_clicked();
181
182         void capture_mode_toggled (ARDOUR::ChannelMode);
183         void playback_mode_toggled (ARDOUR::ChannelMode);
184 };
185
186 #endif /*__ardour_ui_midi_channel_selector_h__*/