Store a few more properties as plugin state, including favorites

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-04-27 18:16:15 +01:00
parent fb7ccb0beb
commit 310cab2d6d
12 changed files with 408 additions and 134 deletions

View file

@ -49,12 +49,14 @@
#include "extra/Base64.hpp"
#include "extra/SharedResourcePointer.hpp"
static const constexpr uint kCardinalStateBaseCount = 3; // patch, screenshot, comment
#ifndef HEADLESS
# include "WindowParameters.hpp"
static const constexpr uint kCardinalStateCount = 4; // patch, screenshot, comment, windowSize
static const constexpr uint kCardinalStateCount = kCardinalStateBaseCount + 2; // moduleInfos, windowSize
#else
# define kWindowParameterCount 0
static const constexpr uint kCardinalStateCount = 3; // patch, screenshot, comment
static const constexpr uint kCardinalStateCount = kCardinalStateBaseCount;
#endif
#if CARDINAL_VARIANT_FX
@ -447,9 +449,14 @@ class CardinalPlugin : public CardinalBasePlugin
std::string fAutosavePath;
uint64_t fPreviousFrame;
String fStateComment;
String fStateScreenshot;
String fWindowSize;
struct {
String comment;
String screenshot;
#ifndef HEADLESS
String windowSize;
#endif
} fState;
// bypass handling
bool fWasBypassed;
@ -481,6 +488,9 @@ public:
fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f;
fWindowParameters[kWindowParameterLockModulePositions] = 0.0f;
fWindowParameters[kWindowParameterUpdateRateLimit] = 0.0f;
fWindowParameters[kWindowParameterBrowserSort] = 3.0f;
fWindowParameters[kWindowParameterBrowserZoom] = 50.0f;
fWindowParameters[kWindowParameterInvertZoom] = 0.0f;
#endif
// create unique temporary path for this instance
@ -758,6 +768,63 @@ protected:
parameter.enumValues.values[2].label = "4x";
parameter.enumValues.values[2].value = 2.0f;
break;
case kWindowParameterBrowserSort:
parameter.name = "Browser sort";
parameter.symbol = "browserSort";
parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
parameter.ranges.def = 3.0f;
parameter.ranges.min = 0.0f;
parameter.ranges.max = 5.0f;
parameter.enumValues.count = 6;
parameter.enumValues.restrictedMode = true;
parameter.enumValues.values = new ParameterEnumerationValue[6];
parameter.enumValues.values[0].label = "Updated";
parameter.enumValues.values[0].value = 0.0f;
parameter.enumValues.values[1].label = "Last used";
parameter.enumValues.values[1].value = 1.0f;
parameter.enumValues.values[2].label = "Most used";
parameter.enumValues.values[2].value = 2.0f;
parameter.enumValues.values[3].label = "Brand";
parameter.enumValues.values[3].value = 3.0f;
parameter.enumValues.values[4].label = "Name";
parameter.enumValues.values[4].value = 4.0f;
parameter.enumValues.values[5].label = "Random";
parameter.enumValues.values[5].value = 5.0f;
break;
case kWindowParameterBrowserZoom:
parameter.name = "Browser zoom";
parameter.symbol = "browserZoom";
parameter.hints = kParameterIsAutomatable;
parameter.unit = "%";
parameter.ranges.def = 50.0f;
parameter.ranges.min = 25.0f;
parameter.ranges.max = 200.0f;
parameter.enumValues.count = 7;
parameter.enumValues.restrictedMode = true;
parameter.enumValues.values = new ParameterEnumerationValue[7];
parameter.enumValues.values[0].label = "25";
parameter.enumValues.values[0].value = 25.0f;
parameter.enumValues.values[1].label = "35";
parameter.enumValues.values[1].value = 35.0f;
parameter.enumValues.values[2].label = "50";
parameter.enumValues.values[2].value = 50.0f;
parameter.enumValues.values[3].label = "71";
parameter.enumValues.values[3].value = 71.0f;
parameter.enumValues.values[4].label = "100";
parameter.enumValues.values[4].value = 100.0f;
parameter.enumValues.values[5].label = "141";
parameter.enumValues.values[5].value = 141.0f;
parameter.enumValues.values[6].label = "200";
parameter.enumValues.values[6].value = 200.0f;
break;
case kWindowParameterInvertZoom:
parameter.name = "Invert zoom";
parameter.symbol = "invertZoom";
parameter.hints = kParameterIsAutomatable|kParameterIsInteger|kParameterIsBoolean;
parameter.ranges.def = 0.0f;
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
break;
}
#endif
}
@ -782,6 +849,11 @@ protected:
state.label = "Comment";
break;
case 3:
state.hints = kStateIsOnlyForUI;
state.key = "moduleInfos";
state.label = "moduleInfos";
break;
case 4:
state.hints = kStateIsOnlyForUI;
state.key = "windowSize";
state.label = "Window size";
@ -844,14 +916,57 @@ protected:
String getState(const char* const key) const override
{
#ifndef HEADLESS
if (std::strcmp(key, "moduleInfos") == 0)
{
json_t* const rootJ = json_object();
DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, String());
for (const auto& pluginPair : rack::settings::moduleInfos)
{
json_t* const pluginJ = json_object();
DISTRHO_SAFE_ASSERT_CONTINUE(pluginJ != nullptr);
for (const auto& modulePair : pluginPair.second)
{
json_t* const moduleJ = json_object();
DISTRHO_SAFE_ASSERT_CONTINUE(moduleJ != nullptr);
const rack::settings::ModuleInfo& m(modulePair.second);
// To make setting.json smaller, only set properties if not default values.
if (m.favorite)
json_object_set_new(moduleJ, "favorite", json_boolean(m.favorite));
if (m.added > 0)
json_object_set_new(moduleJ, "added", json_integer(m.added));
if (std::isfinite(m.lastAdded))
json_object_set_new(moduleJ, "lastAdded", json_real(m.lastAdded));
if (json_object_size(moduleJ))
json_object_set_new(pluginJ, modulePair.first.c_str(), moduleJ);
else
json_decref(moduleJ);
}
if (json_object_size(pluginJ))
json_object_set_new(rootJ, pluginPair.first.c_str(), pluginJ);
else
json_decref(pluginJ);
}
const String info(json_dumps(rootJ, JSON_COMPACT), false);
json_decref(rootJ);
return info;
}
if (std::strcmp(key, "windowSize") == 0)
return fWindowSize;
return fState.windowSize;
#endif
if (std::strcmp(key, "comment") == 0)
return fStateComment;
return fState.comment;
if (std::strcmp(key, "screenshot") == 0)
return fStateScreenshot;
return fState.screenshot;
if (std::strcmp(key, "patch") != 0)
return String();
@ -879,22 +994,56 @@ protected:
void setState(const char* const key, const char* const value) override
{
#ifndef HEADLESS
if (std::strcmp(key, "moduleInfos") == 0)
{
json_error_t error;
json_t* const rootJ = json_loads(value, 0, &error);
DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr,);
const char* pluginSlug;
json_t* pluginJ;
json_object_foreach(rootJ, pluginSlug, pluginJ)
{
const char* moduleSlug;
json_t* moduleJ;
json_object_foreach(pluginJ, moduleSlug, moduleJ)
{
rack::settings::ModuleInfo m;
if (json_t* const favoriteJ = json_object_get(moduleJ, "favorite"))
m.favorite = json_boolean_value(favoriteJ);
if (json_t* const addedJ = json_object_get(moduleJ, "added"))
m.added = json_integer_value(addedJ);
if (json_t* const lastAddedJ = json_object_get(moduleJ, "lastAdded"))
m.lastAdded = json_number_value(lastAddedJ);
rack::settings::moduleInfos[pluginSlug][moduleSlug] = m;
}
}
json_decref(rootJ);
return;
}
if (std::strcmp(key, "windowSize") == 0)
{
fWindowSize = value;
fState.windowSize = value;
return;
}
#endif
if (std::strcmp(key, "comment") == 0)
{
fStateComment = value;
fState.comment = value;
return;
}
if (std::strcmp(key, "screenshot") == 0)
{
fStateScreenshot = value;
fState.screenshot = value;
#if defined(HAVE_LIBLO) && !defined(HEADLESS)
patchUtils::sendScreenshotToRemote(value);
#endif