]> git.sesse.net Git - nageru/blobdiff - midi_mapping_dialog.cpp
Add the two final missing MIDI mappings, namely buttons for toggling limiter and...
[nageru] / midi_mapping_dialog.cpp
index 6d2159d8a079dfb0d2e49f630895d36587f6f6d8..2c84567d1015c8ff39341cfa5c82b2855f2b2a26 100644 (file)
@@ -49,7 +49,9 @@ vector<MIDIMappingDialog::Control> global_buttons = {
        { "Select bank 2",            MIDIMappingBusProto::kSelectBank2FieldNumber, 0 },
        { "Select bank 3",            MIDIMappingBusProto::kSelectBank3FieldNumber, 0 },
        { "Select bank 4",            MIDIMappingBusProto::kSelectBank4FieldNumber, 0 },
-       { "Select bank 5",            MIDIMappingBusProto::kSelectBank5FieldNumber, 0 }
+       { "Select bank 5",            MIDIMappingBusProto::kSelectBank5FieldNumber, 0 },
+       { "Toggle limiter",           MIDIMappingBusProto::kToggleLimiterFieldNumber, MIDIMappingProto::kToggleLimiterBankFieldNumber },
+       { "Toggle auto makeup gain",  MIDIMappingBusProto::kToggleAutoMakeupGainFieldNumber, MIDIMappingProto::kToggleAutoMakeupGainBankFieldNumber }
 };
 
 namespace {
@@ -147,6 +149,7 @@ MIDIMappingDialog::MIDIMappingDialog(MIDIMapper *mapper)
 MIDIMappingDialog::~MIDIMappingDialog()
 {
        mapper->set_receiver(old_receiver);
+       mapper->refresh_highlights();
 }
 
 bool MIDIMappingDialog::eventFilter(QObject *obj, QEvent *event)
@@ -192,6 +195,19 @@ void MIDIMappingDialog::guess_clicked(bool limit_to_group)
                        spinner->setValue(source_spinner->value() + offset);
                }
        }
+
+       // See if we can find a “next” bus to move the focus to.
+       const int next_bus_idx = focus.bus_idx + (focus.bus_idx - source_bus_idx);  // Note: Could become e.g. -1.
+       for (const InstantiatedSpinner &is : controller_spinners) {
+               if (int(is.bus_idx) == next_bus_idx && is.field_number == focus.field_number) {
+                       is.spinner->setFocus();
+               }
+       }
+       for (const InstantiatedSpinner &is : button_spinners) {
+               if (int(is.bus_idx) == next_bus_idx && is.field_number == focus.field_number) {
+                       is.spinner->setFocus();
+               }
+       }
 }
 
 void MIDIMappingDialog::ok_clicked()
@@ -400,22 +416,29 @@ pair<int, int> MIDIMappingDialog::guess_offset(unsigned bus_idx, MIDIMappingDial
        // See if we can find a consistent offset.
        bool found_offset = false;
        int offset = 0;
+       int minimum_allowed_offset = numeric_limits<int>::min();
+       int maximum_allowed_offset = numeric_limits<int>::max();
        for (const auto &field_number_and_spinner : spinners[bus_idx]) {
                int field_number = field_number_and_spinner.first;
                QSpinBox *spinner = field_number_and_spinner.second.spinner;
                SpinnerGroup this_spinner_group = field_number_and_spinner.second.group;
+               assert(spinners[source_bus_idx].count(field_number));
+               QSpinBox *source_spinner = spinners[source_bus_idx][field_number].spinner;
+               assert(spinners[source_bus_idx][field_number].group == this_spinner_group);
 
-               if (spinner->value() == 0) {
-                       continue;
-               }
                if (spinner_group != SpinnerGroup::ALL_GROUPS &&
                    spinner_group != this_spinner_group) {
                        continue;
                }
-
-               assert(spinners[source_bus_idx].count(field_number));
-               QSpinBox *source_spinner = spinners[source_bus_idx][field_number].spinner;
-               assert(spinners[source_bus_idx][field_number].group == this_spinner_group);
+               if (spinner->value() == 0) {
+                       if (source_spinner->value() != 0) {
+                               // If the source value is e.g. 3, offset can't be less than -2 or larger than 124.
+                               // Otherwise, we'd extrapolate values outside [1..127].
+                               minimum_allowed_offset = max(minimum_allowed_offset, 1 - source_spinner->value());
+                               maximum_allowed_offset = min(maximum_allowed_offset, 127 - source_spinner->value());
+                       }
+                       continue;
+               }
                if (source_spinner->value() == 0) {
                        // The bus has a controller set that the source bus doesn't set.
                        return not_found;
@@ -435,6 +458,10 @@ pair<int, int> MIDIMappingDialog::guess_offset(unsigned bus_idx, MIDIMappingDial
                assert(false);
                return not_found;
        }
+
+       if (offset < minimum_allowed_offset || offset > maximum_allowed_offset) {
+               return not_found;
+       }
        return make_pair(source_bus_idx, offset);
 }
 
@@ -475,13 +502,18 @@ MIDIMappingDialog::FocusInfo MIDIMappingDialog::find_focus() const
 {
        for (const InstantiatedSpinner &is : controller_spinners) {
                if (is.spinner->hasFocus()) {
-                       return FocusInfo{ int(is.bus_idx), is.spinner_group };
+                       return FocusInfo{ int(is.bus_idx), is.spinner_group, is.field_number };
                }
        }
        for (const InstantiatedSpinner &is : button_spinners) {
                if (is.spinner->hasFocus()) {
-                       return FocusInfo{ int(is.bus_idx), is.spinner_group };
+                       return FocusInfo{ int(is.bus_idx), is.spinner_group, is.field_number };
+               }
+       }
+       for (const InstantiatedSpinner &is : light_spinners) {
+               if (is.spinner->hasFocus()) {
+                       return FocusInfo{ int(is.bus_idx), is.spinner_group, is.field_number };
                }
        }
-       return FocusInfo{ -1, SpinnerGroup::ALL_GROUPS };
+       return FocusInfo{ -1, SpinnerGroup::ALL_GROUPS, -1 };
 }