quint32 FunctionManager::createFunction(int type, QStringList fileList) { Function* f = NULL; QString name; switch(type) { case Function::SceneType: { f = new Scene(m_doc); name = tr("New Scene"); m_sceneCount++; emit sceneCountChanged(); } break; case Function::ChaserType: { f = new Chaser(m_doc); name = tr("New Chaser"); if (f != NULL) { /* give the Chaser a meaningful common duration, to avoid * that awful effect of playing steps with 0 duration */ Chaser *chaser = qobject_cast<Chaser*>(f); chaser->setDuration(1000); } m_chaserCount++; emit chaserCountChanged(); } break; case Function::SequenceType: { /* a Sequence depends on a Scene, so let's create * a new hidden Scene first */ Function *scene = new Scene(m_doc); scene->setVisible(false); if (m_doc->addFunction(scene) == true) { f = new Sequence(m_doc); name = tr("New Sequence"); Sequence *sequence = qobject_cast<Sequence *>(f); sequence->setBoundSceneID(scene->id()); m_sequenceCount++; emit sequenceCountChanged(); } else delete scene; } break; case Function::EFXType: { f = new EFX(m_doc); name = tr("New EFX"); m_efxCount++; emit efxCountChanged(); } break; case Function::CollectionType: { f = new Collection(m_doc); name = tr("New Collection"); if (m_selectedIDList.count()) { Collection *collection = qobject_cast<Collection *>(f); for (QVariant fID : m_selectedIDList) collection->addFunction(fID.toUInt()); } m_collectionCount++; emit collectionCountChanged(); } break; case Function::RGBMatrixType: { f = new RGBMatrix(m_doc); name = tr("New RGB Matrix"); m_rgbMatrixCount++; emit rgbMatrixCountChanged(); } break; case Function::ScriptType: { f = new Script(m_doc); name = tr("New Script"); m_scriptCount++; emit scriptCountChanged(); } break; case Function::ShowType: { f = new Show(m_doc); name = tr("New Show"); m_showCount++; emit showCountChanged(); } break; case Function::AudioType: { name = tr("New Audio"); if (fileList.isEmpty()) { f = new Audio(m_doc); m_audioCount++; emit audioCountChanged(); } else { quint32 lastFuncID = Function::invalidId(); for (QString filePath : fileList) { filePath = filePath.replace("file://", ""); f = new Audio(m_doc); lastFuncID = addFunctiontoDoc(f, name, fileList.count() == 1 ? true : false); if (lastFuncID != Function::invalidId()) { Audio *audio = qobject_cast<Audio *>(f); audio->setSourceFileName(filePath); } m_audioCount++; } emit audioCountChanged(); return lastFuncID; } } break; case Function::VideoType: { name = tr("New Video"); if (fileList.isEmpty()) { f = new Video(m_doc); m_videoCount++; emit videoCountChanged(); } else { quint32 lastFuncID = Function::invalidId(); for (QString filePath : fileList) { filePath = filePath.replace("file://", ""); f = new Video(m_doc); lastFuncID = addFunctiontoDoc(f, name, fileList.count() == 1 ? true : false); if (lastFuncID != Function::invalidId()) { Video *video = qobject_cast<Video *>(f); video->setSourceUrl(filePath); } m_videoCount++; } emit videoCountChanged(); return lastFuncID; } } break; default: break; } return addFunctiontoDoc(f, name, true); }