diff options
| author | s-ol <s+removethis@s-ol.nu> | 2022-11-20 13:38:14 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2022-11-20 13:38:14 +0000 |
| commit | 7c7eb8963f628ae5a1485d4f2e831fd64d26aaec (patch) | |
| tree | 1a7b5ca169a8cc9695c4368560be8480ef2fcdd1 | |
| parent | add Slider16Setting for MIDI CH (diff) | |
| download | firmware-7c7eb8963f628ae5a1485d4f2e831fd64d26aaec.tar.gz firmware-7c7eb8963f628ae5a1485d4f2e831fd64d26aaec.zip | |
group settings into categories
| -rw-r--r-- | hex33board/__init__.py | 49 | ||||
| -rw-r--r-- | hex33board/menu.py | 54 |
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 |
