@@ -36,6 +36,10 @@ | |||||
namespace rack { | namespace rack { | ||||
namespace asset { | |||||
void updateForcingBlackSilverScrewMode(std::string slug); | |||||
} | |||||
struct CardinalPluginModelHelper : plugin::Model { | struct CardinalPluginModelHelper : plugin::Model { | ||||
virtual app::ModuleWidget* createModuleWidgetFromEngineLoad(engine::Module* m) = 0; | virtual app::ModuleWidget* createModuleWidgetFromEngineLoad(engine::Module* m) = 0; | ||||
virtual void removeCachedModuleWidget(engine::Module* m) = 0; | virtual void removeCachedModuleWidget(engine::Module* m) = 0; | ||||
@@ -47,6 +51,11 @@ struct CardinalPluginModel : CardinalPluginModelHelper | |||||
std::unordered_map<engine::Module*, TModuleWidget*> widgets; | std::unordered_map<engine::Module*, TModuleWidget*> widgets; | ||||
std::unordered_map<engine::Module*, bool> widgetNeedsDeletion; | std::unordered_map<engine::Module*, bool> widgetNeedsDeletion; | ||||
CardinalPluginModel(const std::string slug) | |||||
{ | |||||
this->slug = slug; | |||||
} | |||||
engine::Module* createModule() override | engine::Module* createModule() override | ||||
{ | { | ||||
engine::Module* const m = new TModule; | engine::Module* const m = new TModule; | ||||
@@ -67,6 +76,7 @@ struct CardinalPluginModel : CardinalPluginModelHelper | |||||
} | } | ||||
tm = dynamic_cast<TModule*>(m); | tm = dynamic_cast<TModule*>(m); | ||||
} | } | ||||
asset::updateForcingBlackSilverScrewMode(slug); | |||||
app::ModuleWidget* const tmw = new TModuleWidget(tm); | app::ModuleWidget* const tmw = new TModuleWidget(tm); | ||||
DISTRHO_CUSTOM_SAFE_ASSERT_RETURN(m != nullptr ? m->model->name.c_str() : "null", tmw->module == m, nullptr); | DISTRHO_CUSTOM_SAFE_ASSERT_RETURN(m != nullptr ? m->model->name.c_str() : "null", tmw->module == m, nullptr); | ||||
tmw->setModel(this); | tmw->setModel(this); | ||||
@@ -81,6 +91,7 @@ struct CardinalPluginModel : CardinalPluginModelHelper | |||||
TModule* const tm = dynamic_cast<TModule*>(m); | TModule* const tm = dynamic_cast<TModule*>(m); | ||||
DISTRHO_SAFE_ASSERT_RETURN(tm != nullptr, nullptr); | DISTRHO_SAFE_ASSERT_RETURN(tm != nullptr, nullptr); | ||||
asset::updateForcingBlackSilverScrewMode(slug); | |||||
TModuleWidget* const tmw = new TModuleWidget(tm); | TModuleWidget* const tmw = new TModuleWidget(tm); | ||||
DISTRHO_SAFE_ASSERT_RETURN(tmw->module == m, nullptr); | DISTRHO_SAFE_ASSERT_RETURN(tmw->module == m, nullptr); | ||||
tmw->setModel(this); | tmw->setModel(this); | ||||
@@ -107,11 +118,9 @@ struct CardinalPluginModel : CardinalPluginModelHelper | |||||
}; | }; | ||||
template <class TModule, class TModuleWidget> | template <class TModule, class TModuleWidget> | ||||
CardinalPluginModel<TModule, TModuleWidget>* createModel(std::string slug) | |||||
CardinalPluginModel<TModule, TModuleWidget>* createModel(const std::string slug) | |||||
{ | { | ||||
CardinalPluginModel<TModule, TModuleWidget>* const o = new CardinalPluginModel<TModule, TModuleWidget>(); | |||||
o->slug = slug; | |||||
return o; | |||||
return new CardinalPluginModel<TModule, TModuleWidget>(slug); | |||||
} | } | ||||
} | } | ||||
@@ -1 +1 @@ | |||||
Subproject commit f93a357f1643b831d60e28a3ac51575007aa4c5f | |||||
Subproject commit a2de62d0c3b9f764ce6b42441366788d1e52bfcc |
@@ -31,6 +31,9 @@ | |||||
namespace rack { | namespace rack { | ||||
namespace asset { | namespace asset { | ||||
extern bool forceBlackScrew; | |||||
extern bool forceSilverScrew; | |||||
std::string userDir; // ignored | std::string userDir; // ignored | ||||
std::string systemDir; // points to plugin resources dir (or installed/local Rack dir) | std::string systemDir; // points to plugin resources dir (or installed/local Rack dir) | ||||
std::string bundlePath; // points to plugin manifests dir (or empty) | 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 | // get system resource, trimming "res/" prefix if we are loaded as a plugin bundle | ||||
std::string system(std::string filename) { | 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)); | 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) { | std::string plugin(plugin::Plugin* plugin, std::string filename) { | ||||
DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); | DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); | ||||
return system::join(plugin->path, filename); | return system::join(plugin->path, filename); | ||||
@@ -23,6 +23,42 @@ | |||||
#include <string> | #include <string> | ||||
namespace rack { | 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 { | namespace settings { | ||||
bool darkMode = true; | bool darkMode = true; | ||||
int rateLimit = 0; | int rateLimit = 0; | ||||
@@ -1217,17 +1253,14 @@ NSVGimage* nsvgParseFromFileCardinal(const char* const filename, const char* con | |||||
NSVGshape* shapesOrig; | NSVGshape* shapesOrig; | ||||
NSVGshape* shapesMOD; | 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; | shapesOrig = shapesMOD = nullptr; | ||||
handleMOD = nsvgParseFromFile(blackfilename.c_str(), units, dpi); | |||||
goto postparse; | 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"; | const std::string silverfilename = std::string(filename).substr(0, filenamelen-9) + "Silver.svg"; | ||||
hasLightMode = true; | hasLightMode = true; | ||||
@@ -1236,6 +1269,15 @@ NSVGimage* nsvgParseFromFileCardinal(const char* const filename, const char* con | |||||
goto postparse; | 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 | #if 0 | ||||
// Special case for GlueTheGiant | // Special case for GlueTheGiant | ||||
if (std::strstr(filename, "/GlueTheGiant/res/") != nullptr) | if (std::strstr(filename, "/GlueTheGiant/res/") != nullptr) | ||||