/*** Olive - Non-Linear Video Editor Copyright (C) 2019 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "projectimportmanager.h" #include #include #include "core.h" #include "codec/decoder.h" #include "project/item/footage/footage.h" OLIVE_NAMESPACE_ENTER ProjectImportManager::ProjectImportManager(ProjectViewModel *model, Folder *folder, const QStringList &filenames) : model_(model), folder_(folder) { foreach (const QString& f, filenames) { filenames_.append(f); } file_count_ = Core::CountFilesInFileList(filenames_); SetTitle(tr("Importing %1 files").arg(file_count_)); } const int &ProjectImportManager::GetFileCount() { return file_count_; } void ProjectImportManager::Action() { QUndoCommand* command = new QUndoCommand(); int imported = 0; Import(folder_, filenames_, imported, command); if (IsCancelled()) { delete command; } else { emit ImportComplete(command); } } void ProjectImportManager::Import(Folder *folder, const QFileInfoList &import, int &counter, QUndoCommand* parent_command) { foreach (const QFileInfo& file_info, import) { if (IsCancelled()) { break; } // Check if this file is a directory if (file_info.isDir()) { // QDir::entryList only returns filenames, we can use entryInfoList() to get full paths QFileInfoList entry_list = QDir(file_info.absoluteFilePath()).entryInfoList(); // Strip out "." and ".." (for some reason QDir::NoDotAndDotDot doesn't work with entryInfoList, so we have to // check manually) for (int i=0;i(); f->set_name(file_info.fileName()); // Create undoable command that adds the items to the model new ProjectViewModel::AddItemCommand(model_, folder, f, parent_command); // Recursively follow this path Import(static_cast(f.get()), entry_list, counter, parent_command); } } else { FootagePtr f = std::make_shared(); f->set_filename(file_info.absoluteFilePath()); f->set_name(file_info.fileName()); f->set_timestamp(file_info.lastModified()); // Probe will fail if a project isn't set because ImageStream and its derivatives try to connect to the project's // ColorManager instance // FIXME: Perhaps re-think this approach at some point f->set_project(model_->project()); Decoder::ProbeMedia(f.get(), &IsCancelled()); f->set_project(nullptr); if (f->status() != Footage::kInvalid) { // Create undoable command that adds the items to the model new ProjectViewModel::AddItemCommand(model_, folder, f, parent_command); } counter++; emit ProgressChanged((counter * 100) / file_count_); } } } OLIVE_NAMESPACE_EXIT