Copy&Paste source DUPLICATE content (not clone)

This commit is contained in:
Bruno Herbelin
2023-03-19 06:19:52 +01:00
parent 43270c7763
commit 9b4ef00278
3 changed files with 17 additions and 12 deletions

View File

@@ -531,7 +531,7 @@ bool Mixer::recreateSource(Source *s)
// actually create the source with SessionLoader using xml description // actually create the source with SessionLoader using xml description
SessionLoader loader( session_ ); SessionLoader loader( session_ );
Source *replacement = loader.createSource(sourceNode, SessionLoader::DUPLICATE); // not clone Source *replacement = loader.createSource(sourceNode, SessionLoader::REPLACE); // not clone
if (replacement == nullptr) { if (replacement == nullptr) {
g_printerr("replacement failed \n"); g_printerr("replacement failed \n");
return false; return false;
@@ -1543,11 +1543,15 @@ void Mixer::paste(const std::string& clipboard)
for( ; sourceNode ; sourceNode = sourceNode->NextSiblingElement()) for( ; sourceNode ; sourceNode = sourceNode->NextSiblingElement())
{ {
Source *s = loader.createSource(sourceNode); Source *s = loader.createSource(sourceNode, SessionLoader::DUPLICATE);
if (s) { if (s) {
// Add source to Session // // avoid name duplicates
session_->addSource(s); // renameSource(s);
// Add source to Mixer // // Add source to Session
// session_->addSource(s);
// // Add source to Mixer
// attach(s);
addSource(s); addSource(s);
} }
} }

View File

@@ -22,8 +22,6 @@
#include "Log.h" #include "Log.h"
#include "defines.h" #include "defines.h"
#include "Scene.h" #include "Scene.h"
#include "Primitives.h"
#include "Mesh.h"
#include "Source.h" #include "Source.h"
#include "SourceCallback.h" #include "SourceCallback.h"
#include "CloneSource.h" #include "CloneSource.h"
@@ -551,14 +549,17 @@ Source *SessionLoader::createSource(tinyxml2::XMLElement *sourceNode, Mode mode)
uint64_t id__ = 0; uint64_t id__ = 0;
xmlCurrent_->QueryUnsigned64Attribute("id", &id__); xmlCurrent_->QueryUnsigned64Attribute("id", &id__);
// check if a source with the given id exists in the session // for CLONE, find the source with the given id in the session
SourceList::iterator sit = session_->end(); SourceList::iterator sit = session_->end();
if (mode == CLONE) { if (mode == CLONE)
sit = session_->find(id__); sit = session_->find(id__);
}
// no source with this id exists or Mode DUPLICATE // no source with this id exists or Mode DUPLICATE
if ( sit == session_->end() ) { if ( sit == session_->end() ) {
// for DUPLICATE, a new id should be given
if (mode == DUPLICATE)
id__ = 0;
// create a new source depending on type // create a new source depending on type
const char *pType = xmlCurrent_->Attribute("type"); const char *pType = xmlCurrent_->Attribute("type");
if (pType) { if (pType) {
@@ -619,8 +620,7 @@ Source *SessionLoader::createSource(tinyxml2::XMLElement *sourceNode, Mode mode)
// apply config to source // apply config to source
if (load_source) { if (load_source) {
load_source->accept(*this); load_source->accept(*this);
// increment depth for clones (avoid supperposition) if (mode != REPLACE)
if (is_clone)
load_source->group(View::LAYER)->translation_.z += 0.2f; load_source->group(View::LAYER)->translation_.z += 0.2f;
} }

View File

@@ -25,6 +25,7 @@ public:
typedef enum { typedef enum {
CLONE, CLONE,
REPLACE,
DUPLICATE DUPLICATE
} Mode; } Mode;
Source *createSource(tinyxml2::XMLElement *sourceNode, Mode mode = CLONE); Source *createSource(tinyxml2::XMLElement *sourceNode, Mode mode = CLONE);