123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- /******************************************************************************
- Copyright (C) 2014 by Ruwen Hahn <[email protected]>
- 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 2 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 <http://www.gnu.org/licenses/>.
- ******************************************************************************/
- #include "RemuxQueueModel.hpp"
- #include <OBSApp.hpp>
- #include <QDir>
- #include <QStyle>
- #include "moc_RemuxQueueModel.cpp"
- int RemuxQueueModel::rowCount(const QModelIndex &) const
- {
- return queue.length() + (isProcessing ? 0 : 1);
- }
- int RemuxQueueModel::columnCount(const QModelIndex &) const
- {
- return RemuxEntryColumn::Count;
- }
- QVariant RemuxQueueModel::data(const QModelIndex &index, int role) const
- {
- QVariant result = QVariant();
- if (index.row() >= queue.length()) {
- return QVariant();
- } else if (role == Qt::DisplayRole) {
- switch (index.column()) {
- case RemuxEntryColumn::InputPath:
- result = queue[index.row()].sourcePath;
- break;
- case RemuxEntryColumn::OutputPath:
- result = queue[index.row()].targetPath;
- break;
- }
- } else if (role == Qt::DecorationRole && index.column() == RemuxEntryColumn::State) {
- result = getIcon(queue[index.row()].state);
- } else if (role == RemuxEntryRole::EntryStateRole) {
- result = queue[index.row()].state;
- }
- return result;
- }
- QVariant RemuxQueueModel::headerData(int section, Qt::Orientation orientation, int role) const
- {
- QVariant result = QVariant();
- if (role == Qt::DisplayRole && orientation == Qt::Orientation::Horizontal) {
- switch (section) {
- case RemuxEntryColumn::State:
- result = QString();
- break;
- case RemuxEntryColumn::InputPath:
- result = QTStr("Remux.SourceFile");
- break;
- case RemuxEntryColumn::OutputPath:
- result = QTStr("Remux.TargetFile");
- break;
- }
- }
- return result;
- }
- Qt::ItemFlags RemuxQueueModel::flags(const QModelIndex &index) const
- {
- Qt::ItemFlags flags = QAbstractTableModel::flags(index);
- if (index.column() == RemuxEntryColumn::InputPath) {
- flags |= Qt::ItemIsEditable;
- } else if (index.column() == RemuxEntryColumn::OutputPath && index.row() != queue.length()) {
- flags |= Qt::ItemIsEditable;
- }
- return flags;
- }
- bool RemuxQueueModel::setData(const QModelIndex &index, const QVariant &value, int role)
- {
- bool success = false;
- if (role == RemuxEntryRole::NewPathsToProcessRole) {
- QStringList pathList = value.toStringList();
- if (pathList.size() == 0) {
- if (index.row() < queue.size()) {
- beginRemoveRows(QModelIndex(), index.row(), index.row());
- queue.removeAt(index.row());
- endRemoveRows();
- }
- } else {
- if (pathList.size() >= 1 && index.row() < queue.length()) {
- queue[index.row()].sourcePath = pathList[0];
- checkInputPath(index.row());
- pathList.removeAt(0);
- success = true;
- }
- if (pathList.size() > 0) {
- int row = index.row();
- int lastRow = row + pathList.size() - 1;
- beginInsertRows(QModelIndex(), row, lastRow);
- for (QString path : pathList) {
- RemuxQueueEntry entry;
- entry.sourcePath = path;
- entry.state = RemuxEntryState::Empty;
- queue.insert(row, entry);
- row++;
- }
- endInsertRows();
- for (row = index.row(); row <= lastRow; row++) {
- checkInputPath(row);
- }
- success = true;
- }
- }
- } else if (index.row() == queue.length()) {
- QString path = value.toString();
- if (!path.isEmpty()) {
- RemuxQueueEntry entry;
- entry.sourcePath = path;
- entry.state = RemuxEntryState::Empty;
- beginInsertRows(QModelIndex(), queue.length() + 1, queue.length() + 1);
- queue.append(entry);
- endInsertRows();
- checkInputPath(index.row());
- success = true;
- }
- } else {
- QString path = value.toString();
- if (path.isEmpty()) {
- if (index.column() == RemuxEntryColumn::InputPath) {
- beginRemoveRows(QModelIndex(), index.row(), index.row());
- queue.removeAt(index.row());
- endRemoveRows();
- }
- } else {
- switch (index.column()) {
- case RemuxEntryColumn::InputPath:
- queue[index.row()].sourcePath = value.toString();
- checkInputPath(index.row());
- success = true;
- break;
- case RemuxEntryColumn::OutputPath:
- queue[index.row()].targetPath = value.toString();
- emit dataChanged(index, index);
- success = true;
- break;
- }
- }
- }
- return success;
- }
- QVariant RemuxQueueModel::getIcon(RemuxEntryState state)
- {
- QVariant icon;
- QStyle *style = QApplication::style();
- switch (state) {
- case RemuxEntryState::Complete:
- icon = style->standardIcon(QStyle::SP_DialogApplyButton);
- break;
- case RemuxEntryState::InProgress:
- icon = style->standardIcon(QStyle::SP_ArrowRight);
- break;
- case RemuxEntryState::Error:
- icon = style->standardIcon(QStyle::SP_DialogCancelButton);
- break;
- case RemuxEntryState::InvalidPath:
- icon = style->standardIcon(QStyle::SP_MessageBoxWarning);
- break;
- default:
- break;
- }
- return icon;
- }
- void RemuxQueueModel::checkInputPath(int row)
- {
- RemuxQueueEntry &entry = queue[row];
- if (entry.sourcePath.isEmpty()) {
- entry.state = RemuxEntryState::Empty;
- } else {
- entry.sourcePath = QDir::toNativeSeparators(entry.sourcePath);
- QFileInfo fileInfo(entry.sourcePath);
- if (fileInfo.exists())
- entry.state = RemuxEntryState::Ready;
- else
- entry.state = RemuxEntryState::InvalidPath;
- QString newExt = ".mp4";
- QString suffix = fileInfo.suffix();
- if (suffix.contains("mov", Qt::CaseInsensitive) || suffix.contains("mp4", Qt::CaseInsensitive)) {
- newExt = ".remuxed." + suffix;
- }
- if (entry.state == RemuxEntryState::Ready)
- entry.targetPath = QDir::toNativeSeparators(fileInfo.path() + QDir::separator() +
- fileInfo.completeBaseName() + newExt);
- }
- if (entry.state == RemuxEntryState::Ready && isProcessing)
- entry.state = RemuxEntryState::Pending;
- emit dataChanged(index(row, 0), index(row, RemuxEntryColumn::Count));
- }
- QFileInfoList RemuxQueueModel::checkForOverwrites() const
- {
- QFileInfoList list;
- for (const RemuxQueueEntry &entry : queue) {
- if (entry.state == RemuxEntryState::Ready) {
- QFileInfo fileInfo(entry.targetPath);
- if (fileInfo.exists()) {
- list.append(fileInfo);
- }
- }
- }
- return list;
- }
- bool RemuxQueueModel::checkForErrors() const
- {
- bool hasErrors = false;
- for (const RemuxQueueEntry &entry : queue) {
- if (entry.state == RemuxEntryState::Error) {
- hasErrors = true;
- break;
- }
- }
- return hasErrors;
- }
- void RemuxQueueModel::clearAll()
- {
- beginRemoveRows(QModelIndex(), 0, queue.size() - 1);
- queue.clear();
- endRemoveRows();
- }
- void RemuxQueueModel::clearFinished()
- {
- int index = 0;
- for (index = 0; index < queue.size(); index++) {
- const RemuxQueueEntry &entry = queue[index];
- if (entry.state == RemuxEntryState::Complete) {
- beginRemoveRows(QModelIndex(), index, index);
- queue.removeAt(index);
- endRemoveRows();
- index--;
- }
- }
- }
- bool RemuxQueueModel::canClearFinished() const
- {
- bool canClearFinished = false;
- for (const RemuxQueueEntry &entry : queue)
- if (entry.state == RemuxEntryState::Complete) {
- canClearFinished = true;
- break;
- }
- return canClearFinished;
- }
- void RemuxQueueModel::beginProcessing()
- {
- for (RemuxQueueEntry &entry : queue)
- if (entry.state == RemuxEntryState::Ready)
- entry.state = RemuxEntryState::Pending;
- // Signal that the insertion point no longer exists.
- beginRemoveRows(QModelIndex(), queue.length(), queue.length());
- endRemoveRows();
- isProcessing = true;
- emit dataChanged(index(0, RemuxEntryColumn::State), index(queue.length(), RemuxEntryColumn::State));
- }
- void RemuxQueueModel::endProcessing()
- {
- for (RemuxQueueEntry &entry : queue) {
- if (entry.state == RemuxEntryState::Pending) {
- entry.state = RemuxEntryState::Ready;
- }
- }
- // Signal that the insertion point exists again.
- isProcessing = false;
- if (!autoRemux) {
- beginInsertRows(QModelIndex(), queue.length(), queue.length());
- endInsertRows();
- }
- emit dataChanged(index(0, RemuxEntryColumn::State), index(queue.length(), RemuxEntryColumn::State));
- }
- bool RemuxQueueModel::beginNextEntry(QString &inputPath, QString &outputPath)
- {
- bool anyStarted = false;
- for (int row = 0; row < queue.length(); row++) {
- RemuxQueueEntry &entry = queue[row];
- if (entry.state == RemuxEntryState::Pending) {
- entry.state = RemuxEntryState::InProgress;
- inputPath = entry.sourcePath;
- outputPath = entry.targetPath;
- QModelIndex index = this->index(row, RemuxEntryColumn::State);
- emit dataChanged(index, index);
- anyStarted = true;
- break;
- }
- }
- return anyStarted;
- }
- void RemuxQueueModel::finishEntry(bool success)
- {
- for (int row = 0; row < queue.length(); row++) {
- RemuxQueueEntry &entry = queue[row];
- if (entry.state == RemuxEntryState::InProgress) {
- if (success)
- entry.state = RemuxEntryState::Complete;
- else
- entry.state = RemuxEntryState::Error;
- QModelIndex index = this->index(row, RemuxEntryColumn::State);
- emit dataChanged(index, index);
- break;
- }
- }
- }
|