A step sequencer for Adafruit's RP2040-based macropad

add limits to numeric menus

+23 -3
+15 -3
src/menus/mod.rs
··· 96 96 97 97 pub struct NumericMenuItem<'a, T> { 98 98 title: &'a str, 99 + min: u32, 100 + max: u32, 99 101 pub value: u32, 100 102 buffer: itoa::Buffer, 101 103 callback: &'a dyn Fn(&mut T, u32), 102 104 } 103 105 104 106 impl<'a, T> NumericMenuItem<'a, T> { 105 - pub fn new(title: &'a str, value: u32, on_change: &'a dyn Fn(&mut T, u32)) -> Self { 107 + pub fn new( 108 + title: &'a str, 109 + value: u32, 110 + min: u32, 111 + max: u32, 112 + on_change: &'a dyn Fn(&mut T, u32), 113 + ) -> Self { 106 114 let buffer = itoa::Buffer::new(); 107 115 108 116 Self { 109 117 title, 118 + min, 119 + max, 110 120 value, 111 121 buffer, 112 122 callback: on_change, ··· 122 132 fn on_change(&mut self, value: &mut T, step: i32) { 123 133 let mut intermediate = self.value as i32; 124 134 intermediate += step; 125 - if intermediate < 0 { 126 - intermediate = 0; 135 + if intermediate < self.min as i32 { 136 + intermediate = self.min as i32; 137 + } else if intermediate > self.max as i32 { 138 + intermediate = self.max as i32; 127 139 } 128 140 129 141 self.value = intermediate as u32;
+4
src/menus/sequencer.rs
··· 63 63 let bpm_menu = NumericMenuItem::<SequencerMenuValue>::new( 64 64 "BPM", 65 65 defaults.bpm, 66 + 1, 67 + 1000, 66 68 &|menu_value, value| { 67 69 menu_value.bpm = value; 68 70 }, ··· 86 88 let steps_menu = NumericMenuItem::<SequencerMenuValue>::new( 87 89 "STEPS", 88 90 defaults.steps, 91 + 1, 92 + 12, 89 93 &|menu_value, value| { 90 94 menu_value.steps = value; 91 95 },
+4
src/menus/step.rs
··· 87 87 let octave_menu = NumericMenuItem::<StepMenuValue>::new( 88 88 "OCTAVE", 89 89 defaults.octave, 90 + 0, 91 + 9, 90 92 &|menu_value, value| { 91 93 menu_value.octave = value; 92 94 }, ··· 95 97 let velocity_menu = NumericMenuItem::<StepMenuValue>::new( 96 98 "VELOCITY", 97 99 defaults.velocity, 100 + 0, 101 + 128, 98 102 &|menu_value, value| { 99 103 menu_value.velocity = value; 100 104 },