Browse Source

Refactor RackWidget_pasteJson() to return ModuleWidget pointers instead of only IDs.

tags/v2.2.3
Andrew Belt 1 year ago
parent
commit
a7492aa412
1 changed files with 19 additions and 17 deletions
  1. +19
    -17
      src/app/RackWidget.cpp

+ 19
- 17
src/app/RackWidget.cpp View File

@@ -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;


Loading…
Cancel
Save