|
@@ -393,13 +393,14 @@ void RackWidget::fromJson(json_t* rootJ) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
struct PasteJsonReturn { |
|
|
|
|
|
std::map<int64_t, int64_t> newModuleIds; |
|
|
|
|
|
|
|
|
struct PasteJsonResult { |
|
|
|
|
|
/** Old module ID -> new module */ |
|
|
|
|
|
std::map<int64_t, ModuleWidget*> newModules; |
|
|
}; |
|
|
}; |
|
|
static PasteJsonReturn RackWidget_pasteJson(RackWidget* that, json_t* rootJ, history::ComplexAction* complexAction) { |
|
|
|
|
|
|
|
|
static PasteJsonResult RackWidget_pasteJson(RackWidget* that, json_t* rootJ, history::ComplexAction* complexAction) { |
|
|
that->deselectAll(); |
|
|
that->deselectAll(); |
|
|
|
|
|
|
|
|
std::map<int64_t, int64_t> newModuleIds; |
|
|
|
|
|
|
|
|
std::map<int64_t, ModuleWidget*> newModules; |
|
|
|
|
|
|
|
|
// modules |
|
|
// modules |
|
|
json_t* modulesJ = json_object_get(rootJ, "modules"); |
|
|
json_t* modulesJ = json_object_get(rootJ, "modules"); |
|
@@ -440,7 +441,7 @@ static PasteJsonReturn RackWidget_pasteJson(RackWidget* that, json_t* rootJ, his |
|
|
that->internal->moduleContainer->addChild(mw); |
|
|
that->internal->moduleContainer->addChild(mw); |
|
|
that->select(mw); |
|
|
that->select(mw); |
|
|
|
|
|
|
|
|
newModuleIds[id] = mw->module->id; |
|
|
|
|
|
|
|
|
newModules[id] = mw; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// This calls updateExpanders() |
|
|
// This calls updateExpanders() |
|
@@ -462,23 +463,25 @@ static PasteJsonReturn RackWidget_pasteJson(RackWidget* that, json_t* rootJ, his |
|
|
json_array_foreach(cablesJ, cableIndex, cableJ) { |
|
|
json_array_foreach(cablesJ, cableIndex, cableJ) { |
|
|
engine::Cable::jsonStripIds(cableJ); |
|
|
engine::Cable::jsonStripIds(cableJ); |
|
|
|
|
|
|
|
|
// Remap old module IDs to new IDs |
|
|
|
|
|
|
|
|
// Overwrite old module IDs with new module IDs |
|
|
json_t* inputModuleIdJ = json_object_get(cableJ, "inputModuleId"); |
|
|
json_t* inputModuleIdJ = json_object_get(cableJ, "inputModuleId"); |
|
|
if (!inputModuleIdJ) |
|
|
if (!inputModuleIdJ) |
|
|
continue; |
|
|
continue; |
|
|
int64_t inputModuleId = json_integer_value(inputModuleIdJ); |
|
|
int64_t inputModuleId = json_integer_value(inputModuleIdJ); |
|
|
inputModuleId = get(newModuleIds, inputModuleId, -1); |
|
|
|
|
|
if (inputModuleId < 0) |
|
|
|
|
|
|
|
|
auto inputModuleIdIt = newModules.find(inputModuleId); |
|
|
|
|
|
if (inputModuleIdIt == newModules.end()) |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
inputModuleId = inputModuleIdIt->second->module->id; |
|
|
json_object_set(cableJ, "inputModuleId", json_integer(inputModuleId)); |
|
|
json_object_set(cableJ, "inputModuleId", json_integer(inputModuleId)); |
|
|
|
|
|
|
|
|
json_t* outputModuleIdJ = json_object_get(cableJ, "outputModuleId"); |
|
|
json_t* outputModuleIdJ = json_object_get(cableJ, "outputModuleId"); |
|
|
if (!outputModuleIdJ) |
|
|
if (!outputModuleIdJ) |
|
|
continue; |
|
|
continue; |
|
|
int64_t outputModuleId = json_integer_value(outputModuleIdJ); |
|
|
int64_t outputModuleId = json_integer_value(outputModuleIdJ); |
|
|
outputModuleId = get(newModuleIds, outputModuleId, -1); |
|
|
|
|
|
if (outputModuleId < 0) |
|
|
|
|
|
|
|
|
auto outputModuleIdIt = newModules.find(outputModuleId); |
|
|
|
|
|
if (outputModuleIdIt == newModules.end()) |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
outputModuleId = outputModuleIdIt->second->module->id; |
|
|
json_object_set(cableJ, "outputModuleId", json_integer(outputModuleId)); |
|
|
json_object_set(cableJ, "outputModuleId", json_integer(outputModuleId)); |
|
|
|
|
|
|
|
|
// Create Cable |
|
|
// Create Cable |
|
@@ -506,7 +509,7 @@ static PasteJsonReturn RackWidget_pasteJson(RackWidget* that, json_t* rootJ, his |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return {newModuleIds}; |
|
|
|
|
|
|
|
|
return {newModules}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void RackWidget::pasteJsonAction(json_t* rootJ) { |
|
|
void RackWidget::pasteJsonAction(json_t* rootJ) { |
|
@@ -1163,16 +1166,15 @@ void RackWidget::cloneSelectionAction(bool cloneCables) { |
|
|
// Clone cables attached to inputs of selected modules but outputs of non-selected modules |
|
|
// Clone cables attached to inputs of selected modules but outputs of non-selected modules |
|
|
if (cloneCables) { |
|
|
if (cloneCables) { |
|
|
for (CableWidget* cw : getCompleteCables()) { |
|
|
for (CableWidget* cw : getCompleteCables()) { |
|
|
auto inputIt = p.newModuleIds.find(cw->getCable()->inputModule->id); |
|
|
|
|
|
if (inputIt == p.newModuleIds.end()) |
|
|
|
|
|
|
|
|
auto inputIt = p.newModules.find(cw->getCable()->inputModule->id); |
|
|
|
|
|
if (inputIt == p.newModules.end()) |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
|
|
|
auto outputIt = p.newModuleIds.find(cw->getCable()->outputModule->id); |
|
|
|
|
|
if (outputIt != p.newModuleIds.end()) |
|
|
|
|
|
|
|
|
auto outputIt = p.newModules.find(cw->getCable()->outputModule->id); |
|
|
|
|
|
if (outputIt != p.newModules.end()) |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
|
|
|
int64_t clonedInputModuleId = inputIt->second; |
|
|
|
|
|
engine::Module* clonedInputModule = APP->engine->getModule(clonedInputModuleId); |
|
|
|
|
|
|
|
|
engine::Module* clonedInputModule = inputIt->second->module; |
|
|
|
|
|
|
|
|
// Create cable attached to cloned ModuleWidget's input |
|
|
// Create cable attached to cloned ModuleWidget's input |
|
|
engine::Cable* clonedCable = new engine::Cable; |
|
|
engine::Cable* clonedCable = new engine::Cable; |
|
|