diff --git a/src/app/ModuleWidget.cpp b/src/app/ModuleWidget.cpp index bdd5e0d8..cab832b7 100644 --- a/src/app/ModuleWidget.cpp +++ b/src/app/ModuleWidget.cpp @@ -89,6 +89,12 @@ json_t *ModuleWidget::toJson() { } void ModuleWidget::fromJson(json_t *rootJ) { + // legacy + int legacy = 0; + json_t *legacyJ = json_object_get(rootJ, "legacy"); + if (legacyJ) + legacy = json_integer_value(legacyJ); + // pos json_t *posJ = json_object_get(rootJ, "pos"); double x, y; @@ -97,11 +103,30 @@ void ModuleWidget::fromJson(json_t *rootJ) { // params json_t *paramsJ = json_object_get(rootJ, "params"); - size_t paramId; + size_t i; json_t *paramJ; - json_array_foreach(paramsJ, paramId, paramJ) { - if (paramId < params.size()) { - params[paramId]->fromJson(paramJ); + json_array_foreach(paramsJ, i, paramJ) { + if (legacy && legacy <= 1) { + // The index in the array we're iterating is the index of the ParamWidget in the params vector. + if (i < params.size()) { + // Create upgraded version of param JSON object + json_t *newParamJ = json_object(); + json_object_set(newParamJ, "value", paramJ); + params[i]->fromJson(newParamJ); + json_decref(newParamJ); + } + } + else { + // Get paramId + json_t *paramIdJ = json_object_get(paramJ, "paramId"); + if (!paramIdJ) + continue; + int paramId = json_integer_value(paramIdJ); + // Find ParamWidget(s) with paramId + for (ParamWidget *paramWidget : params) { + if (paramWidget->paramId == paramId) + paramWidget->fromJson(paramJ); + } } } diff --git a/src/app/ParamWidget.cpp b/src/app/ParamWidget.cpp index dcfde25f..c3ee57d1 100644 --- a/src/app/ParamWidget.cpp +++ b/src/app/ParamWidget.cpp @@ -6,12 +6,16 @@ namespace rack { json_t *ParamWidget::toJson() { - json_t *paramJ = json_real(value); - return paramJ; + json_t *rootJ = json_object(); + json_object_set_new(rootJ, "paramId", json_integer(paramId)); + json_object_set_new(rootJ, "value", json_real(value)); + return rootJ; } void ParamWidget::fromJson(json_t *rootJ) { - setValue(json_number_value(rootJ)); + json_t *valueJ = json_object_get(rootJ, "value"); + if (valueJ) + setValue(json_number_value(valueJ)); } void ParamWidget::randomize() { diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index 9a51193a..c252b72c 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -184,13 +184,8 @@ json_t *RackWidget::toJson() { int inputModuleId = moduleIds[inputModuleWidget]; // Get output/input ports - auto outputIt = std::find(outputModuleWidget->outputs.begin(), outputModuleWidget->outputs.end(), wireWidget->outputPort); - assert(outputIt != outputModuleWidget->outputs.end()); - int outputId = outputIt - outputModuleWidget->outputs.begin(); - - auto inputIt = std::find(inputModuleWidget->inputs.begin(), inputModuleWidget->inputs.end(), wireWidget->inputPort); - assert(inputIt != inputModuleWidget->inputs.end()); - int inputId = inputIt - inputModuleWidget->inputs.begin(); + int outputId = wireWidget->outputPort->portId; + int inputId = wireWidget->inputPort->portId; json_object_set_new(wire, "outputModuleId", json_integer(outputModuleId)); json_object_set_new(wire, "outputId", json_integer(outputId)); @@ -218,9 +213,12 @@ void RackWidget::fromJson(json_t *rootJ) { // Detect old patches with ModuleWidget::params/inputs/outputs indices. // (We now use Module::params/inputs/outputs indices.) - bool legacy1 = (startsWith(version, "0.3.") || startsWith(version, "0.4.") || startsWith(version, "0.5.") || version == "" || version == "dev"); - if (legacy1) { - info("Converting patch using legacy1 loader"); + int legacy = 0; + if (startsWith(version, "0.3.") || startsWith(version, "0.4.") || startsWith(version, "0.5.") || version == "" || version == "dev") { + legacy = 1; + } + if (legacy) { + info("Loading patch using legacy mode %d", legacy); } // modules @@ -230,6 +228,10 @@ void RackWidget::fromJson(json_t *rootJ) { size_t moduleId; json_t *moduleJ; json_array_foreach(modulesJ, moduleId, moduleJ) { + // Set legacy property + if (legacy) + json_object_set_new(moduleJ, "legacy", json_integer(legacy)); + json_t *pluginSlugJ = json_object_get(moduleJ, "plugin"); if (!pluginSlugJ) continue; json_t *modelSlugJ = json_object_get(moduleJ, "model"); @@ -285,15 +287,37 @@ void RackWidget::fromJson(json_t *rootJ) { "outputModuleId", &outputModuleId, "outputId", &outputId, "inputModuleId", &inputModuleId, "inputId", &inputId); if (err) continue; - // Get ports + + // Get module widgets ModuleWidget *outputModuleWidget = moduleWidgets[outputModuleId]; if (!outputModuleWidget) continue; - Port *outputPort = outputModuleWidget->outputs[outputId]; - if (!outputPort) continue; ModuleWidget *inputModuleWidget = moduleWidgets[inputModuleId]; if (!inputModuleWidget) continue; - Port *inputPort = inputModuleWidget->inputs[inputId]; - if (!inputPort) continue; + + // Get port widgets + Port *outputPort = NULL; + Port *inputPort = NULL; + if (legacy && legacy <= 1) { + outputPort = outputModuleWidget->outputs[outputId]; + inputPort = inputModuleWidget->inputs[inputId]; + } + else { + for (Port *port : outputModuleWidget->outputs) { + if (port->portId == outputId) { + outputPort = port; + break; + } + } + for (Port *port : inputModuleWidget->inputs) { + if (port->portId == inputId) { + inputPort = port; + break; + } + } + } + if (!outputPort || !inputPort) + continue; + // Create WireWidget WireWidget *wireWidget = new WireWidget(); wireWidget->outputPort = outputPort;