diff --git a/plugins/ImpromptuModularDark/PanelTheme.cpp b/plugins/ImpromptuModularDark/PanelTheme.cpp new file mode 100644 index 0000000..a4263a6 --- /dev/null +++ b/plugins/ImpromptuModularDark/PanelTheme.cpp @@ -0,0 +1,131 @@ +//*********************************************************************************************** +//Impromptu Modular: Modules for VCV Rack by Marc Boulé +// +//See ./LICENSE.md for all licenses +//*********************************************************************************************** + + +#include "../ImpromptuModular/src/comp/PanelTheme.hpp" + + + +void loadThemeAndContrastFromDefault(int* panelTheme, float* panelContrast) { + *panelTheme = 1; + *panelContrast = panelContrastDefault; +} + + +void createPanelThemeMenu(ui::Menu* menu, int* panelTheme, float* panelContrast, SvgPanel* mainPanel) { + + struct PanelThemeItem : MenuItem { + int* panelTheme = NULL; + float* panelContrast = NULL; + SvgPanel* mainPanel; + + Menu *createChildMenu() override { + struct PanelThemeDarkItem : MenuItem { + int* panelTheme = NULL; + SvgPanel* mainPanel; + void onAction(const event::Action &e) override { + *panelTheme ^= 0x1; + mainPanel->fb->dirty = true; + e.unconsume(); + } + }; + + struct PanelContrastQuantity : Quantity { + float* panelContrast; + SvgPanel* mainPanel; + + PanelContrastQuantity(float* _panelContrast, SvgPanel* _mainPanel) { + panelContrast = _panelContrast; + mainPanel = _mainPanel; + } + void setValue(float value) override { + *panelContrast = math::clamp(value, getMinValue(), getMaxValue()); + mainPanel->fb->dirty = true; + } + float getValue() override { + return *panelContrast; + } + float getMinValue() override {return panelContrastMin;} + float getMaxValue() override {return panelContrastMax;} + float getDefaultValue() override {return panelContrastDefault;} + float getDisplayValue() override {return *panelContrast;} + std::string getDisplayValueString() override { + return string::f("%.1f", rescale(*panelContrast, getMinValue(), getMaxValue(), 0.0f, 100.0f)); + } + void setDisplayValue(float displayValue) override {setValue(displayValue);} + std::string getLabel() override {return "Panel contrast";} + std::string getUnit() override {return "";} + }; + struct PanelContrastSlider : ui::Slider { + PanelContrastSlider(float* panelContrast, SvgPanel* mainPanel) { + quantity = new PanelContrastQuantity(panelContrast, mainPanel); + } + ~PanelContrastSlider() { + delete quantity; + } + }; + Menu *menu = new Menu; + + PanelThemeDarkItem *ptdItem = createMenuItem("Dark", CHECKMARK(*panelTheme)); + ptdItem->panelTheme = panelTheme; + ptdItem->mainPanel = mainPanel; + menu->addChild(ptdItem); + + PanelContrastSlider *cSlider = new PanelContrastSlider(panelContrast, mainPanel); + cSlider->box.size.x = 200.0f; + menu->addChild(cSlider); + + return menu; + } + }; + + PanelThemeItem *ptItem = createMenuItem("Panel theme", RIGHT_ARROW); + ptItem->panelTheme = panelTheme; + ptItem->panelContrast = panelContrast; + ptItem->mainPanel = mainPanel; + menu->addChild(ptItem); +} + + +void PanelBaseWidget::draw(const DrawArgs& args) { + nvgBeginPath(args.vg); + NVGcolor baseColor; + if (panelContrastSrc) { + baseColor = nvgRGB(*panelContrastSrc, *panelContrastSrc, *panelContrastSrc); + } + else { + int themeDefault; + float contrastDefault; + loadThemeAndContrastFromDefault(&themeDefault, &contrastDefault); + baseColor = nvgRGB(contrastDefault, contrastDefault, contrastDefault); + } + nvgFillColor(args.vg, baseColor); + nvgRect(args.vg, 0, 0, box.size.x, box.size.y); + nvgFill(args.vg); + TransparentWidget::draw(args); +} + + +void InverterWidget::draw(const DrawArgs& args) { + TransparentWidget::draw(args); + if (isDark(panelThemeSrc)) { + // nvgSave(args.vg); + nvgBeginPath(args.vg); + nvgFillColor(args.vg, SCHEME_WHITE);// this is the source, the current framebuffer is the dest + nvgRect(args.vg, 0, 0, box.size.x, box.size.y); + nvgGlobalCompositeBlendFuncSeparate(args.vg, + NVG_ONE_MINUS_DST_COLOR,// srcRGB + NVG_ZERO,// dstRGB + NVG_ONE_MINUS_DST_COLOR,// srcAlpha + NVG_ONE);// dstAlpha + // blend factor: https://github.com/memononen/nanovg/blob/master/src/nanovg.h#L86 + // OpenGL blend doc: https://www.khronos.org/opengl/wiki/Blending + nvgFill(args.vg); + nvgClosePath(args.vg); + // nvgRestore(args.vg); + } +} + diff --git a/plugins/Makefile b/plugins/Makefile index 44d5b60..6e06169 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -404,7 +404,8 @@ PLUGIN_FILES += $(filter-out GrandeModular/src/plugin.cpp,$(wildcard GrandeModul # ImpromptuModular PLUGIN_FILES += $(wildcard ImpromptuModular/src/*.cpp) -PLUGIN_FILES += $(wildcard ImpromptuModular/src/comp/*.cpp) +PLUGIN_FILES += $(filter-out ImpromptuModular/src/comp/PanelTheme.cpp,$(wildcard ImpromptuModular/src/comp/*.cpp)) +PLUGIN_FILES += ImpromptuModularDark/PanelTheme.cpp # modules/types which are present in other plugins IMPROMPTUMODULAR_CUSTOM = RefreshCounter @@ -872,27 +873,18 @@ $(BUILD_DIR)/ImpromptuModular/src/Foundr%.cpp.o: ImpromptuModular/src/Foundr%.cp $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ $(foreach m,$(IMPROMPTUMODULAR_CUSTOM),$(call custom_module_names,$(m),ImpromptuModular)) \ -DpluginInstance=pluginInstance__ImpromptuModular \ - -DStepAttributes=StepAttributesKernel - -$(BUILD_DIR)/ImpromptuModular/src/comp/Components.cpp.o: ImpromptuModular/src/comp/Components.cpp - -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" - @echo "Compiling $<" - $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ - $(foreach m,$(IMPROMPTUMODULAR_CUSTOM),$(call custom_module_names,$(m),ImpromptuModular)) \ - -DpluginInstance=pluginInstance__ImpromptuModular \ - -DsaveDarkAsDefault=ImpromptuModularIgnore1 \ - -DloadDarkAsDefault=ImpromptuModularIgonre2 + -DStepAttributes=StepAttributesKernel \ # FIXME -DsetNextCableColor=isComplete shouldn't be here -$(BUILD_DIR)/ImpromptuModular/%.cpp.o: ImpromptuModular/%.cpp +$(BUILD_DIR)/ImpromptuModular%.cpp.o: ImpromptuModular%.cpp -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" @echo "Compiling $<" $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ $(foreach m,$(IMPROMPTUMODULAR_CUSTOM),$(call custom_module_names,$(m),ImpromptuModular)) \ $(foreach m,$(IMPROMPTUMODULAR_CUSTOM_PER_FILE),$(call custom_per_file_names,$(m),ImpromptuModular_$(shell basename $*))) \ -DpluginInstance=pluginInstance__ImpromptuModular \ - -DsetNextCableColor=isComplete \ - -Dinit=init__ImpromptuModular + -Dinit=init__ImpromptuModular \ + -DsetNextCableColor=isComplete $(BUILD_DIR)/JW-Modules/%.cpp.o: JW-Modules/%.cpp -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" diff --git a/plugins/plugins.cpp b/plugins/plugins.cpp index 3c2d7f5..e93b9d4 100644 --- a/plugins/plugins.cpp +++ b/plugins/plugins.cpp @@ -295,8 +295,6 @@ extern Model *modelMaude_221; // stuff that reads config files, we dont want that int loadConsoleType() { return 0; } int loadDirectOutMode() { return 0; } -bool loadDarkAsDefault() { return true; } -bool loadQuality() { return false; } void saveConsoleType(int) {} void saveDarkAsDefault(bool) {} void saveDirectOutMode(bool) {}