|
|
@@ -86,8 +86,10 @@ void RackWidget::savePatch(std::string filename) { |
|
|
|
void RackWidget::loadPatch(std::string filename) { |
|
|
|
printf("Loading patch %s\n", filename.c_str()); |
|
|
|
FILE *file = fopen(filename.c_str(), "r"); |
|
|
|
if (!file) |
|
|
|
if (!file) { |
|
|
|
// Exit silently |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
json_error_t error; |
|
|
|
json_t *rootJ = json_loadf(file, 0, &error); |
|
|
@@ -97,7 +99,8 @@ void RackWidget::loadPatch(std::string filename) { |
|
|
|
json_decref(rootJ); |
|
|
|
} |
|
|
|
else { |
|
|
|
printf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text); |
|
|
|
std::string message = stringf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text); |
|
|
|
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
fclose(file); |
|
|
@@ -168,12 +171,14 @@ json_t *RackWidget::toJson() { |
|
|
|
} |
|
|
|
|
|
|
|
void RackWidget::fromJson(json_t *rootJ) { |
|
|
|
std::string message; |
|
|
|
|
|
|
|
// version |
|
|
|
json_t *versionJ = json_object_get(rootJ, "version"); |
|
|
|
if (versionJ) { |
|
|
|
const char *version = json_string_value(versionJ); |
|
|
|
if (gApplicationVersion != version) |
|
|
|
printf("JSON version mismatch, attempting to convert JSON version %s to %s\n", version, gApplicationVersion.c_str()); |
|
|
|
message += stringf("This patch was created with Rack %s. Saving it will convert it to a Rack %s patch.\n\n", version, gApplicationVersion.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
// modules |
|
|
@@ -183,10 +188,14 @@ void RackWidget::fromJson(json_t *rootJ) { |
|
|
|
size_t moduleId; |
|
|
|
json_t *moduleJ; |
|
|
|
json_array_foreach(modulesJ, moduleId, moduleJ) { |
|
|
|
// Get plugin |
|
|
|
json_t *pluginSlugJ = json_object_get(moduleJ, "plugin"); |
|
|
|
if (!pluginSlugJ) continue; |
|
|
|
json_t *modelSlugJ = json_object_get(moduleJ, "model"); |
|
|
|
if (!modelSlugJ) continue; |
|
|
|
const char *pluginSlug = json_string_value(pluginSlugJ); |
|
|
|
const char *modelSlug = json_string_value(modelSlugJ); |
|
|
|
|
|
|
|
// Search for plugin |
|
|
|
Plugin *plugin = NULL; |
|
|
|
for (Plugin *p : gPlugins) { |
|
|
|
if (p->slug == pluginSlug) { |
|
|
@@ -194,18 +203,23 @@ void RackWidget::fromJson(json_t *rootJ) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!plugin) continue; |
|
|
|
if (!plugin) { |
|
|
|
message += stringf("Could not find plugin \"%s\" for module \"%s\".\n", pluginSlug, modelSlug); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// Get model |
|
|
|
json_t *modelSlug = json_object_get(moduleJ, "model"); |
|
|
|
// Get for model |
|
|
|
Model *model = NULL; |
|
|
|
for (Model *m : plugin->models) { |
|
|
|
if (m->slug == json_string_value(modelSlug)) { |
|
|
|
if (m->slug == modelSlug) { |
|
|
|
model = m; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!model) continue; |
|
|
|
if (!model) { |
|
|
|
message += stringf("Could not find module \"%s\" in plugin \"%s\".\n", modelSlug, pluginSlug); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// Create ModuleWidget |
|
|
|
ModuleWidget *moduleWidget = model->createModuleWidget(); |
|
|
@@ -244,6 +258,11 @@ void RackWidget::fromJson(json_t *rootJ) { |
|
|
|
// Add wire to rack |
|
|
|
wireContainer->addChild(wireWidget); |
|
|
|
} |
|
|
|
|
|
|
|
// Display a message if we have something to say |
|
|
|
if (!message.empty()) { |
|
|
|
osdialog_message(OSDIALOG_INFO, OSDIALOG_OK, message.c_str()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void RackWidget::addModule(ModuleWidget *m) { |
|
|
|