aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2022-11-20 13:38:14 +0000
committers-ol <s+removethis@s-ol.nu>2022-11-20 13:38:14 +0000
commit7c7eb8963f628ae5a1485d4f2e831fd64d26aaec (patch)
tree1a7b5ca169a8cc9695c4368560be8480ef2fcdd1
parentadd Slider16Setting for MIDI CH (diff)
downloadfirmware-7c7eb8963f628ae5a1485d4f2e831fd64d26aaec.tar.gz
firmware-7c7eb8963f628ae5a1485d4f2e831fd64d26aaec.zip
group settings into categories
-rw-r--r--hex33board/__init__.py49
-rw-r--r--hex33board/menu.py54
2 files changed, 65 insertions, 38 deletions
diff --git a/hex33board/__init__.py b/hex33board/__init__.py
index 2138438..9cebcdf 100644
--- a/hex33board/__init__.py
+++ b/hex33board/__init__.py
@@ -85,6 +85,7 @@ class Keyboard:
"active_profile": SliderSetting(
"CURRENT PROFILE", 24, fmt="Profile {}", thresh=_eq
),
+ # MIDI
"midi_ch_usb": Slider16Setting(
"USB MIDI CHANNEL", fmt="CH{}", thresh=_eq
),
@@ -92,13 +93,27 @@ class Keyboard:
"TRS MIDI CHANNEL", fmt="CH{}", thresh=_eq
),
"midi_vel": SliderSetting("MIDI VELOCITY", 127, default=64),
+ # I2C
+ "i2c_mode": ChoiceSetting(
+ "I2C MODE",
+ [False, 'leader', 'follower'],
+ default=False,
+ color=_color_offor
+ ),
+ "i2c_addr": SliderSetting(
+ "I2C ADDRESS", 127, default=0x33, fmt="0x{0:02x} ({0:d})"
+ ),
+ # DISPLAY
+ "flip": ChoiceSetting(
+ "DISPLAY FLIP", [False, True], default=False, color=_color_offor
+ ),
"rgb_eff": ChoiceSetting(
"RGB EFFECT",
['scale', 'rainbow', 'rainbow scale', 'rainbow scale alt'],
default='scale',
),
"rgb_bright": SliderSetting(
- "LED BRIGHTNESS",
+ "RGB BRIGHTNESS",
100,
default=100,
fmt="{}%",
@@ -112,6 +127,7 @@ class Keyboard:
fmt="{:.2f}s",
color=_color_offor,
),
+ # LAYOUT
"layout_name": ChoiceSetting(
"KEYBOARD LAYOUT",
['wicki/hayden', 'harmonic table', 'gerhard'],
@@ -123,18 +139,7 @@ class Keyboard:
default=24,
fmt=lambda p: '{} ({})'.format(p, self.scale.label(p, octave=True)),
),
- "flip": ChoiceSetting(
- "FLIP", [False, True], default=False, color=_color_offor
- ),
- "i2c_mode": ChoiceSetting(
- "I2C MODE",
- [False, 'leader', 'follower'],
- default=False,
- color=_color_offor
- ),
- "i2c_addr": SliderSetting(
- "I2C ADDRESS", 127, default=0x33, fmt="0x{0:02x} ({0:d})"
- ),
+ # SCALE (hidden)
"scale_name": ChoiceSetting(
"HIGHLIGHT SCALE",
[
@@ -179,19 +184,11 @@ class Keyboard:
"menu": MenuMode(
self,
settings=self.settings,
- ui_settings_ids=[
- "active_profile",
- "midi_ch_usb",
- "midi_ch_trs",
- "midi_vel",
- "i2c_mode",
- "i2c_addr",
- "flip",
- "rgb_eff",
- "rgb_bright",
- "jam_timeout",
- "layout_name",
- "layout_offset",
+ groups=[
+ [ "midi_ch_usb", "midi_ch_trs", "midi_vel" ],
+ [ "i2c_mode", "i2c_addr" ],
+ [ "flip", "rgb_eff", "rgb_bright", "jam_timeout" ],
+ [ "layout_name", "layout_offset" ],
],
),
}
diff --git a/hex33board/menu.py b/hex33board/menu.py
index 6ddeb8d..367b056 100644
--- a/hex33board/menu.py
+++ b/hex33board/menu.py
@@ -262,18 +262,23 @@ class MenuMode(Mode):
color = (1.0, 1.0, 0.5)
settings: Settings
- ui_settings: list[Setting]
+ ui_setting_ids: list[list[str]]
+ ui_settings: list[list[Setting]]
+ GROUP_ACTIVE = hsv_to_rgb(0.7, 1.0, 1.0)
+ GROUP_ACTIVE_DIM = hsv_to_rgb(0.7, 1.0, 0.15)
SETTING_ACTIVE = hsv_to_rgb(0.12, 1.0, 1.0)
SETTING_ACTIVE_DIM = hsv_to_rgb(0.12, 1.0, 0.15)
- def __init__(self, *args, settings: Settings, ui_settings_ids: list[str]):
+ def __init__(self, *args, settings: Settings, groups: list[list[str]]):
super().__init__(*args)
+ groups.insert(0, [])
+
self.settings = settings
- self.ui_settings_ids = ui_settings_ids
- self.ui_settings = [settings.get(id) for id in ui_settings_ids]
- self.settings_i = 0
+ self.ui_setting_ids = groups
+ self.ui_settings = [[settings.get(id) for id in group] for group in groups]
+ self.active = (0, 0)
self.group = displayio.Group()
self.label_settings = label.Label(
@@ -323,11 +328,19 @@ class MenuMode(Mode):
@property
def setting_id(self) -> str:
- return self.ui_settings_ids[self.settings_i]
+ gi, si = self.active
+ if gi == 0:
+ return 'active_profile'
+
+ return self.ui_setting_ids[gi][si]
@property
def setting(self) -> Setting:
- return self.ui_settings[self.settings_i]
+ gi, si = self.active
+ if gi == 0:
+ return self.settings.get('active_profile')
+
+ return self.ui_settings[gi][si]
def update_pixels(self, pixels: NeoPixel):
pixels.fill(0)
@@ -336,15 +349,25 @@ class MenuMode(Mode):
pixels[2] = BLUE_DIM
pixels[3] = BLUE_DIM
+ gi, si = self.active
+
for i, setting in enumerate(self.ui_settings):
- pixels[led_map[i]] = self.SETTING_ACTIVE_DIM
- pixels[led_map[self.settings_i]] = self.SETTING_ACTIVE
+ pixels[led_map[i]] = self.GROUP_ACTIVE_DIM
+ pixels[led_map[gi]] = self.GROUP_ACTIVE
+
+ if gi != 0:
+ num_settings = len(self.ui_settings[gi])
+ so = 12 - num_settings
+
+ for i in range(num_settings):
+ pixels[led_map[so + i]] = self.SETTING_ACTIVE_DIM
+ pixels[led_map[so + si]] = self.SETTING_ACTIVE
for i, color in enumerate(self.setting.get_colors()):
pixels[led_map[24 + i]] = color
def update_display(self):
- self.label_settings.text = self.setting.name + ':'
+ self.label_settings.text = self.setting.name + ":"
self.label_value.text = str(self.setting.format())
def key_event(self, i: int, pressed: bool) -> bool:
@@ -355,8 +378,15 @@ class MenuMode(Mode):
if not pressed:
return False
- if i < len(self.ui_settings):
- self.settings_i = i
+ if i < len(self.ui_settings) and i != self.active[0]:
+ self.active = (i, 0)
+ self.update_display()
+ return True
+
+ gi, si = self.active
+ so = 12 - len(self.ui_settings[gi])
+ if i >= so and i < 12:
+ self.active = (gi, i - so)
self.update_display()
return True