From a808190e9adf316bc955fb545ed98a9a20559aa2 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 17 Sep 2022 01:14:51 +0100 Subject: [PATCH] Add method for module widgets to persist their black/silver screws --- include/helpers.hpp | 17 +++++++++--- plugins/ArableInstruments | 2 +- src/custom/asset.cpp | 9 ++++++- src/custom/dep.cpp | 54 ++++++++++++++++++++++++++++++++++----- 4 files changed, 70 insertions(+), 12 deletions(-) diff --git a/include/helpers.hpp b/include/helpers.hpp index 7126f3f..2cf4ad0 100644 --- a/include/helpers.hpp +++ b/include/helpers.hpp @@ -36,6 +36,10 @@ namespace rack { +namespace asset { +void updateForcingBlackSilverScrewMode(std::string slug); +} + struct CardinalPluginModelHelper : plugin::Model { virtual app::ModuleWidget* createModuleWidgetFromEngineLoad(engine::Module* m) = 0; virtual void removeCachedModuleWidget(engine::Module* m) = 0; @@ -47,6 +51,11 @@ struct CardinalPluginModel : CardinalPluginModelHelper std::unordered_map widgets; std::unordered_map widgetNeedsDeletion; + CardinalPluginModel(const std::string slug) + { + this->slug = slug; + } + engine::Module* createModule() override { engine::Module* const m = new TModule; @@ -67,6 +76,7 @@ struct CardinalPluginModel : CardinalPluginModelHelper } tm = dynamic_cast(m); } + asset::updateForcingBlackSilverScrewMode(slug); app::ModuleWidget* const tmw = new TModuleWidget(tm); DISTRHO_CUSTOM_SAFE_ASSERT_RETURN(m != nullptr ? m->model->name.c_str() : "null", tmw->module == m, nullptr); tmw->setModel(this); @@ -81,6 +91,7 @@ struct CardinalPluginModel : CardinalPluginModelHelper TModule* const tm = dynamic_cast(m); DISTRHO_SAFE_ASSERT_RETURN(tm != nullptr, nullptr); + asset::updateForcingBlackSilverScrewMode(slug); TModuleWidget* const tmw = new TModuleWidget(tm); DISTRHO_SAFE_ASSERT_RETURN(tmw->module == m, nullptr); tmw->setModel(this); @@ -107,11 +118,9 @@ struct CardinalPluginModel : CardinalPluginModelHelper }; template -CardinalPluginModel* createModel(std::string slug) +CardinalPluginModel* createModel(const std::string slug) { - CardinalPluginModel* const o = new CardinalPluginModel(); - o->slug = slug; - return o; + return new CardinalPluginModel(slug); } } diff --git a/plugins/ArableInstruments b/plugins/ArableInstruments index f93a357..a2de62d 160000 --- a/plugins/ArableInstruments +++ b/plugins/ArableInstruments @@ -1 +1 @@ -Subproject commit f93a357f1643b831d60e28a3ac51575007aa4c5f +Subproject commit a2de62d0c3b9f764ce6b42441366788d1e52bfcc diff --git a/src/custom/asset.cpp b/src/custom/asset.cpp index 40ee4f2..efee14a 100644 --- a/src/custom/asset.cpp +++ b/src/custom/asset.cpp @@ -31,6 +31,9 @@ namespace rack { namespace asset { +extern bool forceBlackScrew; +extern bool forceSilverScrew; + std::string userDir; // ignored std::string systemDir; // points to plugin resources dir (or installed/local Rack dir) std::string bundlePath; // points to plugin manifests dir (or empty) @@ -50,10 +53,14 @@ std::string user(std::string filename) { // get system resource, trimming "res/" prefix if we are loaded as a plugin bundle std::string system(std::string filename) { + /**/ if (forceBlackScrew && string::endsWith(filename, "/ScrewBlack.svg")) + filename = filename.substr(0, filename.size()-15) + "/./ScrewBlack.svg"; + else if (forceSilverScrew && string::endsWith(filename, "/ScrewSilver.svg")) + filename = filename.substr(0, filename.size()-16) + "/./ScrewSilver.svg"; return system::join(systemDir, bundlePath.empty() ? filename : trim(filename)); } -// get plugin resource +// get plugin resource path std::string plugin(plugin::Plugin* plugin, std::string filename) { DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); return system::join(plugin->path, filename); diff --git a/src/custom/dep.cpp b/src/custom/dep.cpp index 53a5e2a..13379e9 100644 --- a/src/custom/dep.cpp +++ b/src/custom/dep.cpp @@ -23,6 +23,42 @@ #include namespace rack { +namespace asset { +bool forceBlackScrew = false; +bool forceSilverScrew = false; +void updateForcingBlackSilverScrewMode(std::string slug) { + forceBlackScrew = ( + // arable instruments + slug == "Joni" + // axioma + || slug == "TheBifurcator" + || slug == "Tesseract" + || slug == "Ikeda" + || slug == "Rhodonea" + // parable instruments + || slug == "Neil" + // rackwindows + || slug == "bitshiftgain" + || slug == "capacitor" + || slug == "capacitor_stereo" + || slug == "chorus" + || slug == "console" + || slug == "console_mm" + || slug == "distance" + || slug == "golem" + || slug == "holt" + || slug == "hombre" + || slug == "interstage" + || slug == "monitoring" + || slug == "mv" + || slug == "rasp" + || slug == "reseq" + || slug == "tape" + || slug == "tremolo" + || slug == "vibrato" + ); +} +} namespace settings { bool darkMode = true; int rateLimit = 0; @@ -1217,17 +1253,14 @@ NSVGimage* nsvgParseFromFileCardinal(const char* const filename, const char* con NSVGshape* shapesOrig; NSVGshape* shapesMOD; - // Special case for light/dark screws - if (std::strncmp(filename + (filenamelen-16), "/ScrewSilver.svg", 16) == 0) + if (filenamelen < 18) { - const std::string blackfilename = std::string(filename).substr(0, filenamelen-10) + "Black.svg"; - hasDarkMode = true; shapesOrig = shapesMOD = nullptr; - handleMOD = nsvgParseFromFile(blackfilename.c_str(), units, dpi); goto postparse; } - if (std::strncmp(filename + (filenamelen-15), "/ScrewBlack.svg", 15) == 0) + // Special case for light/dark screws + if (std::strncmp(filename + (filenamelen-15), "/ScrewBlack.svg", 15) == 0 && filename[filenamelen-16] != '.') { const std::string silverfilename = std::string(filename).substr(0, filenamelen-9) + "Silver.svg"; hasLightMode = true; @@ -1236,6 +1269,15 @@ NSVGimage* nsvgParseFromFileCardinal(const char* const filename, const char* con goto postparse; } + if (std::strncmp(filename + (filenamelen-16), "/ScrewSilver.svg", 16) == 0 && filename[filenamelen-17] != '.') + { + const std::string blackfilename = std::string(filename).substr(0, filenamelen-10) + "Black.svg"; + hasDarkMode = true; + shapesOrig = shapesMOD = nullptr; + handleMOD = nsvgParseFromFile(blackfilename.c_str(), units, dpi); + goto postparse; + } + #if 0 // Special case for GlueTheGiant if (std::strstr(filename, "/GlueTheGiant/res/") != nullptr)