| @@ -23,6 +23,7 @@ struct LedDisplayChoice : widget::TransparentWidget { | |||||
| std::shared_ptr<Font> font; | std::shared_ptr<Font> font; | ||||
| math::Vec textOffset; | math::Vec textOffset; | ||||
| NVGcolor color; | NVGcolor color; | ||||
| NVGcolor bgColor; | |||||
| LedDisplayChoice(); | LedDisplayChoice(); | ||||
| void draw(const widget::DrawContext &ctx) override; | void draw(const widget::DrawContext &ctx) override; | ||||
| void onButton(const event::Button &e) override; | void onButton(const event::Button &e) override; | ||||
| @@ -17,6 +17,8 @@ struct MIDI_Map : Module { | |||||
| midi::InputQueue midiInput; | midi::InputQueue midiInput; | ||||
| int8_t values[128]; | int8_t values[128]; | ||||
| int learningId = -1; | |||||
| int learnedCcs[16] = {}; | |||||
| dsp::ExponentialFilter valueFilters[8]; | dsp::ExponentialFilter valueFilters[8]; | ||||
| MIDI_Map() { | MIDI_Map() { | ||||
| @@ -35,10 +37,42 @@ struct MIDI_Map : Module { | |||||
| struct MIDI_MapChoice : LedDisplayChoice { | struct MIDI_MapChoice : LedDisplayChoice { | ||||
| MIDI_Map *module; | MIDI_Map *module; | ||||
| int id; | |||||
| void setModule(MIDI_Map *module) { | void setModule(MIDI_Map *module) { | ||||
| this->module = module; | this->module = module; | ||||
| } | } | ||||
| void onSelect(const event::Select &e) override { | |||||
| if (!module) | |||||
| return; | |||||
| module->learningId = id; | |||||
| e.consume(this); | |||||
| } | |||||
| void onDeselect(const event::Deselect &e) override { | |||||
| if (!module) | |||||
| return; | |||||
| if (module->learningId == id) { | |||||
| module->learningId = -1; | |||||
| } | |||||
| } | |||||
| void step() override { | |||||
| if (!module) | |||||
| return; | |||||
| if (module->learningId == id) { | |||||
| text = "Mapping..."; | |||||
| color.a = 1.0; | |||||
| bgColor = color; | |||||
| bgColor.a = 0.15; | |||||
| } | |||||
| else { | |||||
| text = "Unmapped"; | |||||
| color.a = 0.5; | |||||
| bgColor = nvgRGBA(0, 0, 0, 0); | |||||
| } | |||||
| } | |||||
| }; | }; | ||||
| @@ -52,6 +86,7 @@ struct MIDI_MapDisplay : MidiWidget { | |||||
| MIDI_MapChoice *choice = createWidget<MIDI_MapChoice>(pos); | MIDI_MapChoice *choice = createWidget<MIDI_MapChoice>(pos); | ||||
| choice->box.size.x = box.size.x; | choice->box.size.x = box.size.x; | ||||
| choice->id = i; | |||||
| choice->setModule(module); | choice->setModule(module); | ||||
| addChild(choice); | addChild(choice); | ||||
| pos = choice->box.getBottomLeft(); | pos = choice->box.getBottomLeft(); | ||||
| @@ -37,12 +37,20 @@ LedDisplayChoice::LedDisplayChoice() { | |||||
| box.size = mm2px(math::Vec(0, 28.0 / 3)); | box.size = mm2px(math::Vec(0, 28.0 / 3)); | ||||
| font = APP->window->loadFont(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | font = APP->window->loadFont(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | ||||
| color = nvgRGB(0xff, 0xd7, 0x14); | color = nvgRGB(0xff, 0xd7, 0x14); | ||||
| bgColor = nvgRGBAf(0, 0, 0, 0); | |||||
| textOffset = math::Vec(10, 18); | textOffset = math::Vec(10, 18); | ||||
| } | } | ||||
| void LedDisplayChoice::draw(const widget::DrawContext &ctx) { | void LedDisplayChoice::draw(const widget::DrawContext &ctx) { | ||||
| nvgScissor(ctx.vg, 0, 0, box.size.x, box.size.y); | nvgScissor(ctx.vg, 0, 0, box.size.x, box.size.y); | ||||
| if (bgColor.a > 0.0) { | |||||
| nvgBeginPath(ctx.vg); | |||||
| nvgRect(ctx.vg, 0, 0, box.size.x, box.size.y); | |||||
| nvgFillColor(ctx.vg, bgColor); | |||||
| nvgFill(ctx.vg); | |||||
| } | |||||
| if (font->handle >= 0) { | if (font->handle >= 0) { | ||||
| nvgFillColor(ctx.vg, color); | nvgFillColor(ctx.vg, color); | ||||
| nvgFontFaceId(ctx.vg, font->handle); | nvgFontFaceId(ctx.vg, font->handle); | ||||