void SourceFileModel::updateSelectionStatus() { m_nonAppendedSelected = false; m_appendedSelected = false; m_additionalPartSelected = false; auto selectionModel = qobject_cast<QItemSelectionModel *>(QObject::sender()); Q_ASSERT(selectionModel); Util::withSelectedIndexes(selectionModel, [this](QModelIndex const &selectedIndex) { auto sourceFile = fromIndex(selectedIndex); Q_ASSERT(!!sourceFile); if (sourceFile->isRegular()) m_nonAppendedSelected = true; else if (sourceFile->isAppended()) m_appendedSelected = true; else if (sourceFile->isAdditionalPart()) m_additionalPartSelected = true; }); mxinfo(boost::format("file sel changed nonApp %1% app %2% addPart %3%\n") % m_nonAppendedSelected % m_appendedSelected % m_additionalPartSelected); }
bool SourceFileModel::dropSourceFiles(QMimeData const *data, Qt::DropAction action, int row, QModelIndex const &parent) { if (action != Qt::MoveAction) return QAbstractItemModel::dropMimeData(data, action, row, 0, parent); auto encoded = data->data(mtx::gui::MimeTypes::MergeSourceFileModelItem); QDataStream stream{&encoded, QIODevice::ReadOnly}; while (!stream.atEnd()) { quint64 value; stream >> value; auto sourceFile = m_sourceFileMap[value]; auto sourceIdx = indexFromSourceFile(sourceFile.get()); if (!sourceIdx.isValid()) continue; auto sourceParent = sourceIdx.parent(); auto sourceParentItem = sourceParent.isValid() ? itemFromIndex(sourceParent) : invisibleRootItem(); auto rowItems = sourceParentItem->takeRow(sourceIdx.row()); if (!parent.isValid()) { if ((sourceParent == parent) && (sourceIdx.row() < row)) --row; invisibleRootItem()->insertRow(row, rowItems); ++row; } else { auto parentFile = fromIndex(parent); Q_ASSERT(parentFile); if (sourceFile->isAdditionalPart()) row = std::min(row, parentFile->m_additionalParts.size()); else row = std::max(row, parentFile->m_additionalParts.size()); if ((sourceParent == parent) && (sourceIdx.row() < row)) --row; itemFromIndex(parent)->insertRow(row, rowItems); ++row; } updateSourceFileLists(); } return false; }
std::pair<int, int> SourceFileModel::countAppendedAndAdditionalParts(QStandardItem *parentItem) { auto numbers = std::make_pair(0, 0); for (auto row = 0, numRows = parentItem->rowCount(); row < numRows; ++row) { auto sourceFile = fromIndex(parentItem->child(row)->index()); Q_ASSERT(!!sourceFile); if (sourceFile->isAdditionalPart()) ++numbers.first; else ++numbers.second; } return numbers; }
void SourceFile::buildMkvmergeOptions(QStringList &options) const { Q_ASSERT(!isAdditionalPart()); auto opt = MkvmergeOptionBuilder{}; for (auto const &track : m_tracks) track->buildMkvmergeOptions(opt); for (auto const &attachedFile : m_attachedFiles) attachedFile->buildMkvmergeOptions(opt); auto buildTrackIdArg = [&options,&opt](Track::Type type, QString const &enabled, QString const &disabled) { if (!enabled.isEmpty() && !opt.enabledTrackIds[type].isEmpty() && (static_cast<unsigned int>(opt.enabledTrackIds[type].size()) < opt.numTracksOfType[type])) options << enabled << opt.enabledTrackIds[type].join(Q(",")); else if (opt.enabledTrackIds[type].isEmpty() && opt.numTracksOfType[type]) options << disabled; }; buildTrackIdArg(Track::Audio, Q("--audio-tracks"), Q("--no-audio")); buildTrackIdArg(Track::Video, Q("--video-tracks"), Q("--no-video")); buildTrackIdArg(Track::Subtitles, Q("--subtitle-tracks"), Q("--no-subtitles")); buildTrackIdArg(Track::Buttons, Q("--button-tracks"), Q("--no-buttons")); buildTrackIdArg(Track::Attachment, Q("--attachments"), Q("--no-attachments")); buildTrackIdArg(Track::Tags, Q("--track-tags"), Q("--no-track-tags")); buildTrackIdArg(Track::GlobalTags, Q(""), Q("--no-global-tags")); buildTrackIdArg(Track::Chapters, Q(""), Q("--no-chapters")); options += opt.options; if (m_appendedTo) options << Q("+"); options << Q("(") << m_fileName; for (auto const &additionalPart : m_additionalParts) options << additionalPart->m_fileName; options << Q(")"); for (auto const &appendedFile : m_appendedFiles) appendedFile->buildMkvmergeOptions(options); }
void SourceFile::fixAssociations(MuxConfig::Loader &l) { if (isRegular() || isAdditionalPart()) m_appendedTo = nullptr; else { auto appendedToID = reinterpret_cast<qulonglong>(m_appendedTo); if ((0 >= appendedToID) || !l.objectIDToSourceFile.contains(appendedToID)) throw InvalidSettingsX{}; m_appendedTo = l.objectIDToSourceFile.value(appendedToID); } for (auto &track : m_tracks) track->m_file = this; for (auto &attachedFile : m_attachedFiles) attachedFile->m_file = this; fixAssociationsFor("tracks", m_tracks, l); fixAssociationsFor("attachedFiles", m_attachedFiles, l); fixAssociationsFor("additionalParts", m_additionalParts, l); fixAssociationsFor("appendedFiles", m_appendedFiles, l); }
void SourceFileModel::updateSelectionStatus() { m_nonAppendedSelected = false; m_appendedSelected = false; m_additionalPartSelected = false; auto selectionModel = qobject_cast<QItemSelectionModel *>(QObject::sender()); Q_ASSERT(selectionModel); Util::withSelectedIndexes(selectionModel, [this](QModelIndex const &selectedIndex) { auto sourceFile = fromIndex(selectedIndex); if (!sourceFile) return; if (sourceFile->isRegular()) m_nonAppendedSelected = true; else if (sourceFile->isAppended()) m_appendedSelected = true; else if (sourceFile->isAdditionalPart()) m_additionalPartSelected = true; }); }
bool SourceFileModel::dropSourceFiles(QMimeData const *data, Qt::DropAction action, int row, QModelIndex const &parent) { if (action != Qt::MoveAction) return QAbstractItemModel::dropMimeData(data, action, row, 0, parent); mxinfo(boost::format("dropMimeData row %1% parent %2%/%3%\n") % row % parent.row() % parent.column()); auto encoded = data->data(MIME_TYPE); QDataStream stream{&encoded, QIODevice::ReadOnly}; while (!stream.atEnd()) { quint64 value; stream >> value; auto sourceFile = m_sourceFileMap[value]; auto sourceIdx = indexFromSourceFile(sourceFile.get()); if (!sourceIdx.isValid()) continue; mxinfo(boost::format(" val %|1$08x| ptr %2% idx %3%/%4%\n") % value % sourceFile.get() % sourceIdx.row() % sourceIdx.column()); auto sourceParent = sourceIdx.parent(); auto sourceParentItem = sourceParent.isValid() ? itemFromIndex(sourceParent) : invisibleRootItem(); auto priorRow = row; auto rowItems = sourceParentItem->takeRow(sourceIdx.row()); if (!parent.isValid()) { if ((sourceParent == parent) && (sourceIdx.row() < row)) --row; mxinfo(boost::format("tried moving case 1 from %1% row %2% to new parent %3% row %4% new row %5%\n") % dumpIdx(sourceIdx.parent()) % sourceIdx.row() % dumpIdx(parent) % priorRow % (row + 1)); invisibleRootItem()->insertRow(row, rowItems); ++row; } else { auto parentFile = fromIndex(parent); Q_ASSERT(parentFile); if (sourceFile->isAdditionalPart()) row = std::min(row, parentFile->m_additionalParts.size()); else row = std::max(row, parentFile->m_additionalParts.size()); if ((sourceParent == parent) && (sourceIdx.row() < row)) --row; mxinfo(boost::format("tried moving case 2 from %1% row %2% to new parent %3% row %4% new row %5%\n") % dumpIdx(sourceIdx.parent()) % sourceIdx.row() % dumpIdx(parent) % priorRow % (row + 1)); itemFromIndex(parent)->insertRow(row, rowItems); ++row; } updateSourceFileLists(); } return false; }
bool SourceFile::isValid() const { return !container().isEmpty() || isAdditionalPart(); }