X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=midi_mapping_dialog.h;h=5a1ec3f425a9b4caada9a8fe768e1cb26717636c;hb=4a0187ffb4075b4d217b8d9e9c96cac548b199d8;hp=f2cd0bfe3e490a3eccaefac757c8d7d4da3c56b2;hpb=cf729d2ddd503b90413987bf94a928ae31efe0d0;p=nageru diff --git a/midi_mapping_dialog.h b/midi_mapping_dialog.h index f2cd0bf..5a1ec3f 100644 --- a/midi_mapping_dialog.h +++ b/midi_mapping_dialog.h @@ -1,25 +1,30 @@ #ifndef _MIDI_MAPPING_DIALOG_H #define _MIDI_MAPPING_DIALOG_H +#include #include +#include +#include +#include #include +#include #include -#include -#include "audio_mixer.h" -#include "mixer.h" +#include "midi_mapper.h" + +class QEvent; +class QObject; namespace Ui { class MIDIMappingDialog; } // namespace Ui -class MIDIMapper; class MIDIMappingProto; class QComboBox; class QSpinBox; class QTreeWidgetItem; -class MIDIMappingDialog : public QDialog +class MIDIMappingDialog : public QDialog, public ControllerReceiver { Q_OBJECT @@ -27,6 +32,8 @@ public: MIDIMappingDialog(MIDIMapper *mapper); ~MIDIMappingDialog(); + bool eventFilter(QObject *obj, QEvent *event) override; + // For use in midi_mapping_dialog.cpp only. struct Control { std::string label; @@ -34,7 +41,54 @@ public: int bank_field_number; // In MIDIMappingProto. }; + // ControllerReceiver interface. We only implement the raw events. + // All values are [0.0, 1.0]. + void set_locut(float value) override {} + void set_limiter_threshold(float value) override {} + void set_makeup_gain(float value) override {} + + void set_treble(unsigned bus_idx, float value) override {} + void set_mid(unsigned bus_idx, float value) override {} + void set_bass(unsigned bus_idx, float value) override {} + void set_gain(unsigned bus_idx, float value) override {} + void set_compressor_threshold(unsigned bus_idx, float value) override {} + void set_fader(unsigned bus_idx, float value) override {} + + void toggle_mute(unsigned bus_idx) override {} + void toggle_locut(unsigned bus_idx) override {} + void toggle_auto_gain_staging(unsigned bus_idx) override {} + void toggle_compressor(unsigned bus_idx) override {} + void clear_peak(unsigned bus_idx) override {} + void toggle_limiter() override {} + void toggle_auto_makeup_gain() override {} + + void clear_all_highlights() override {} + + void highlight_locut(bool highlight) override {} + void highlight_limiter_threshold(bool highlight) override {} + void highlight_makeup_gain(bool highlight) override {} + + void highlight_treble(unsigned bus_idx, bool highlight) override {} + void highlight_mid(unsigned bus_idx, bool highlight) override {} + void highlight_bass(unsigned bus_idx, bool highlight) override {} + void highlight_gain(unsigned bus_idx, bool highlight) override {} + void highlight_compressor_threshold(unsigned bus_idx, bool highlight) override {} + void highlight_fader(unsigned bus_idx, bool highlight) override {} + + void highlight_mute(unsigned bus_idx, bool highlight) override {} + void highlight_toggle_locut(unsigned bus_idx, bool highlight) override {} + void highlight_toggle_auto_gain_staging(unsigned bus_idx, bool highlight) override {} + void highlight_toggle_compressor(unsigned bus_idx, bool highlight) override {} + void highlight_clear_peak(unsigned bus_idx, bool highlight) override {} + void highlight_toggle_limiter(bool highlight) override {} + void highlight_toggle_auto_makeup_gain(bool highlight) override {} + + // Raw events; used for the editor dialog only. + void controller_changed(unsigned controller) override; + void note_on(unsigned note) override; + public slots: + void guess_clicked(bool limit_to_group); void ok_clicked(); void cancel_clicked(); void save_clicked(); @@ -43,18 +97,47 @@ public slots: private: static constexpr unsigned num_buses = 8; + // Each spinner belongs to exactly one group, corresponding to the + // subheadings in the UI. This is so that we can extrapolate data + // across only single groups if need be. + enum class SpinnerGroup { + ALL_GROUPS = -1, + PER_BUS_CONTROLLERS, + PER_BUS_BUTTONS, + PER_BUS_LIGHTS, + GLOBAL_CONTROLLERS, + GLOBAL_BUTTONS, + GLOBAL_LIGHTS + }; + void add_bank_selector(QTreeWidgetItem *item, const MIDIMappingProto &mapping_proto, int bank_field_number); - enum class ControlType { CONTROLLER, BUTTON }; + enum class ControlType { CONTROLLER, BUTTON, LIGHT }; void add_controls(const std::string &heading, ControlType control_type, + SpinnerGroup spinner_group, const MIDIMappingProto &mapping_proto, const std::vector &controls); void fill_controls_from_mapping(const MIDIMappingProto &mapping_proto); - std::unique_ptr construct_mapping_proto_from_ui(); + // Tries to find a source bus and an offset to it that would give + // a consistent offset for the rest of the mappings in this bus. + // Returns -1 for the bus if no consistent offset can be found. + std::pair guess_offset(unsigned bus_idx, SpinnerGroup spinner_group); + bool bus_is_empty(unsigned bus_idx, SpinnerGroup spinner_group); + void update_guess_button_state(); + struct FocusInfo { + int bus_idx; // -1 for none. + SpinnerGroup spinner_group; + int field_number; + }; + FocusInfo find_focus() const; + + std::unique_ptr construct_mapping_proto_from_ui(); Ui::MIDIMappingDialog *ui; MIDIMapper *mapper; + ControllerReceiver *old_receiver; + FocusInfo last_focus{-1, SpinnerGroup::ALL_GROUPS, -1}; // All controllers actually laid out on the grid (we need to store them // so that we can move values back and forth between the controls and @@ -62,6 +145,7 @@ private: struct InstantiatedSpinner { QSpinBox *spinner; unsigned bus_idx; + SpinnerGroup spinner_group; int field_number; // In MIDIMappingBusProto. }; struct InstantiatedComboBox { @@ -70,7 +154,15 @@ private: }; std::vector controller_spinners; std::vector button_spinners; + std::vector light_spinners; std::vector bank_combo_boxes; + + // Keyed on bus index, then field number. + struct SpinnerAndGroup { + QSpinBox *spinner; + SpinnerGroup group; + }; + std::map> spinners; }; #endif // !defined(_MIDI_MAPPING_DIALOG_H)