Skip to content

Commit 43dd736

Browse files
committed
adden preset hotkeys
1 parent badcc39 commit 43dd736

File tree

6 files changed

+124
-7
lines changed

6 files changed

+124
-7
lines changed

lib/UI/pages/hotkeysMainPage.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class HotkeysMainPage extends StatelessWidget {
1616
body: ListView(
1717
children: [
1818
ListTile(
19-
title: const Text("Channel Hotkeys"),
19+
title: const Text("Channel/Preset Hotkeys"),
2020
trailing: const Icon(Icons.keyboard_arrow_right),
2121
onTap: () => Navigator.of(context).push(MaterialPageRoute(
2222
builder: (context) => HotkeysSetup(

lib/UI/pages/hotkeysSetup.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,27 @@ class _HotkeysSetupState extends State<HotkeysSetup> {
8484
widgets.add(buildWidget("Channel ${i + 1}", Icons.circle, colors[i],
8585
HotkeyControl.ChannelByIndex, i, 0, false));
8686
}
87+
88+
widgets.add(buildWidget("Previous Preset", Icons.keyboard_double_arrow_up,
89+
null, HotkeyControl.PreviousPresetGlobal, 0, 0, false));
90+
widgets.add(buildWidget("Next Preset", Icons.keyboard_double_arrow_down,
91+
null, HotkeyControl.NextPresetGlobal, 0, 0, false));
92+
widgets.add(buildWidget(
93+
"Previous Preset in Category",
94+
Icons.keyboard_arrow_up,
95+
null,
96+
HotkeyControl.PreviousPresetCategory,
97+
0,
98+
0,
99+
false));
100+
widgets.add(buildWidget(
101+
"Next Preset in Category",
102+
Icons.keyboard_arrow_down,
103+
null,
104+
HotkeyControl.NextPresetCategory,
105+
0,
106+
0,
107+
false));
87108
return widgets;
88109
}
89110

lib/bluetooth/ble_controllers/FlutterBluePlusController.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ class FlutterBluePlusController extends BLEController {
108108
}
109109

110110
@override
111-
void stopScanning() {
112-
if (bleState == BleState.off) return;
113-
flutterBlue.stopScan();
111+
Future stopScanning() {
112+
if (bleState == BleState.off) return Future.value(null);
113+
return flutterBlue.stopScan();
114114
}
115115

116116
@override
@@ -128,7 +128,7 @@ class FlutterBluePlusController extends BLEController {
128128
}
129129

130130
_connectInProgress = true;
131-
stopScanning();
131+
await stopScanning();
132132
setMidiSetupStatus(MidiSetupStatus.deviceConnecting);
133133
try {
134134
await ownDevice.connect(

lib/bluetooth/devices/presets/presetsStorage.dart

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import 'package:uuid/uuid.dart';
1111

1212
import '../../../platform/platformUtils.dart';
1313

14+
enum PresetChangeDirection { previous, next }
15+
1416
class PresetsStorage extends ChangeNotifier {
1517
static final PresetsStorage _storage = PresetsStorage._();
1618
static const presetsFile = "presets.json";
@@ -150,6 +152,29 @@ class PresetsStorage extends ChangeNotifier {
150152
return null;
151153
}
152154

155+
dynamic findAdjacentPreset(
156+
String uuid, bool acrossCategories, PresetChangeDirection direction) {
157+
int catsCount = presetsData.length;
158+
int catIndex = 0;
159+
160+
if (uuid.isEmpty) {
161+
return _getAdjacentPreset(0, -1, direction, acrossCategories);
162+
}
163+
for (catIndex = 0; catIndex < catsCount; catIndex++) {
164+
int pIndex = 0;
165+
var cat = presetsData[catIndex];
166+
var presets = cat["presets"];
167+
int pCount = presets.length;
168+
for (pIndex = 0; pIndex < pCount; pIndex++) {
169+
if (presets[pIndex]?["uuid"] == uuid) {
170+
return _getAdjacentPreset(
171+
catIndex, pIndex, direction, acrossCategories);
172+
}
173+
}
174+
}
175+
return _getAdjacentPreset(0, -1, direction, acrossCategories);
176+
}
177+
153178
Map<String, dynamic>? findCategoryOfPreset(Map<String, dynamic> preset) {
154179
for (var cat in presetsData) {
155180
for (var pr in cat["presets"]) {
@@ -410,6 +435,44 @@ class PresetsStorage extends ChangeNotifier {
410435
if (_name != null) savePreset(presetData, _name, category);
411436
}
412437

438+
dynamic _getAdjacentPreset(int catIndex, int pIndex,
439+
PresetChangeDirection direction, bool acrossCategory) {
440+
if (presetsData.length <= catIndex) return null;
441+
var catLength = presetsData[catIndex]["presets"].length;
442+
if (direction == PresetChangeDirection.previous) {
443+
pIndex--;
444+
} else {
445+
pIndex++;
446+
}
447+
448+
if (pIndex < 0) {
449+
if (!acrossCategory) {
450+
pIndex = catLength - 1;
451+
} else {
452+
do {
453+
catIndex--;
454+
if (catIndex < 0) {
455+
catIndex = presetsData.length - 1;
456+
}
457+
} while (presetsData[catIndex]["presets"].length == 0);
458+
pIndex = presetsData[catIndex]["presets"].length - 1;
459+
}
460+
} else if (pIndex >= catLength) {
461+
if (!acrossCategory) {
462+
pIndex = 0;
463+
} else {
464+
do {
465+
catIndex++;
466+
if (catIndex >= presetsData.length) {
467+
catIndex = 0;
468+
}
469+
} while (presetsData[catIndex]["presets"].length == 0);
470+
pIndex = 0;
471+
}
472+
}
473+
return presetsData[catIndex]["presets"][pIndex];
474+
}
475+
413476
String? _findFreeName(String name, String category) {
414477
for (int i = 1; i < 1000; i++) {
415478
RegExp regex = RegExp(r"\((\d+)\)$");

lib/midi/ControllerConstants.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/material.dart';
2-
import 'package:flutter/widgets.dart';
32

43
class MidiConstants {
54
static const NoteOn = 0x90;
@@ -35,7 +34,11 @@ enum HotkeyControl {
3534
JamTracksNextTrack,
3635
JamTracksRewind,
3736
JamTracksFF,
38-
JamTracksABRepeat;
37+
JamTracksABRepeat,
38+
PreviousPresetGlobal,
39+
NextPresetGlobal,
40+
PreviousPresetCategory,
41+
NextPresetCategory
3942
}
4043

4144
extension HotkeyLabel on HotkeyControl {

lib/midi/controllers/ControllerHotkey.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';
22
import 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';
3+
import 'package:mighty_plug_manager/bluetooth/devices/presets/presetsStorage.dart';
34
import 'package:mighty_plug_manager/bluetooth/devices/utilities/DelayTapTimer.dart';
45
import '../../bluetooth/devices/NuxDevice.dart';
56
import '../../bluetooth/devices/effects/MidiControllerHandles.dart';
@@ -183,6 +184,18 @@ class ControllerHotkey {
183184
case HotkeyControl.JamTracksABRepeat:
184185
SetlistPlayerState.instance().toggleABRepeat();
185186
break;
187+
case HotkeyControl.PreviousPresetGlobal:
188+
_changeToAdjacentPreset(device, true, PresetChangeDirection.previous);
189+
break;
190+
case HotkeyControl.NextPresetGlobal:
191+
_changeToAdjacentPreset(device, true, PresetChangeDirection.next);
192+
break;
193+
case HotkeyControl.PreviousPresetCategory:
194+
_changeToAdjacentPreset(device, false, PresetChangeDirection.previous);
195+
break;
196+
case HotkeyControl.NextPresetCategory:
197+
_changeToAdjacentPreset(device, false, PresetChangeDirection.next);
198+
break;
186199
default:
187200
onHotkeyReceived(control);
188201
}
@@ -194,6 +207,23 @@ class ControllerHotkey {
194207
return (val / 127) * 100;
195208
}
196209

210+
void _changeToAdjacentPreset(
211+
NuxDevice device, bool acrossCategories, PresetChangeDirection dir) {
212+
var uuid = NuxDeviceControl.instance().presetUUID;
213+
for (int i = 0; i < 200; i++) {
214+
var preset =
215+
PresetsStorage().findAdjacentPreset(uuid, acrossCategories, dir);
216+
if (preset != null &&
217+
preset["uuid"] != uuid &&
218+
device.isPresetSupported(preset)) {
219+
device.presetFromJson(preset, null);
220+
break;
221+
} else if (preset != null) {
222+
uuid = preset["uuid"];
223+
}
224+
}
225+
}
226+
197227
void _modifyTempo(NuxDevice device, double amount) {
198228
double newTempo = device.drumsTempo + amount;
199229
device.setDrumsTempo(newTempo, true);

0 commit comments

Comments
 (0)