/* 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. */ #include #include #include #include #include #include "archivecontroller.h" #include "archivemodel.h" #include "archiveview.h" #include "pictureviewer2.h" #include "smglobals.h" #include "helper.h" ArchiveController::ArchiveController(QObject *parent) : QObject(parent) { if(parent){ mParentWidget = qobject_cast(this->parent()); } } void ArchiveController::setArchiveView(ArchiveView *view){ mArchiveView = view; } void ArchiveController::setArchiveTree(ArchiveTree *atree, ArchiveProxy *aproxy){ mArchiveTree = atree; mArchiveProxy = aproxy; mArchiveSelection = mArchiveTree->selectionModel(); } void ArchiveController::setArchiveFiles(ArchiveFiles *afiles, ArchiveFilesProxy *afilesproxy){ mArchiveFiles = afiles; mArchiveFilesProxy = afilesproxy; mFileSelection = mArchiveFiles->selectionModel(); } void ArchiveController::setModels(ArchiveModel *amodel, ArchiveFilesModel *afilesmodel){ mArchiveModel = amodel; mArchiveFilesModel = afilesmodel; } void ArchiveController::init(){ connect(mArchiveSelection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeSelectionChanged(QItemSelection,QItemSelection))); connect(mArchiveFiles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(fileDoubleClicked(QModelIndex))); } void ArchiveController::playSelectedFiles(){ QModelIndexList sel = mFileSelection->selectedRows(); QStringList files; foreach(QModelIndex i, sel){ if(i.data(ArchiveFilesModel::FileTypeRole).toInt() == ArchiveFilesModel::Movie){ QString fullPath = i.data(ArchiveFilesModel::FullPathRole).toString(); QFileInfo fi(fullPath); if(fi.exists()){ files << fullPath; } } } if(!files.isEmpty()){ QPair playerData = Helper::programData("movieviewer"); QStringList args = playerData.second; args << files; QProcess::startDetached(playerData.first, args); } } void ArchiveController::editQuality(){ QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::Quality); if(sel.isEmpty()){ return; } bool ok; int quality = QInputDialog::getInt(mParentWidget, tr("Set Quality"), tr("Quality"), 7, 1, 10, 1, &ok); if(ok){ foreach(QModelIndex i, sel){ QModelIndex real = mArchiveFilesProxy->mapToSource(i); if(mArchiveFilesModel->isMovie(real)){ mArchiveFilesModel->setData(real, quality, ArchiveFilesModel::QualityRole); } } } } void ArchiveController::editDvdNo(){ QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::DvdNo); if(sel.isEmpty()){ return; } bool ok; int dvdNo = QInputDialog::getInt(mParentWidget, tr("Set DVD no."), tr("Number (-1 for local)"), mArchiveFilesModel->nextDvd(), -1, 1024 * 1024, 1, &ok); if(ok){ foreach(QModelIndex i, sel){ QModelIndex real = mArchiveFilesProxy->mapToSource(i); if(mArchiveFilesModel->isMovie(real)){ mArchiveFilesModel->setData(real, dvdNo, ArchiveFilesModel::DvdNoRole); } } } } void ArchiveController::editFileType(){ QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::FileType); if(sel.isEmpty()){ return; } bool ok; QStringList types = QStringList() << tr("Movie") << tr("Front Cover") << tr("Back Cover") << tr("General Cover"); QString item = QInputDialog::getItem(mParentWidget, tr("Set file type"), tr("Type:"), types, 0, false, &ok); if(ok && !item.isEmpty()){ int newType = 0; if(item == tr("Movie")){ newType = ArchiveFilesModel::Movie; }else if(item == tr("Front Cover")){ newType = ArchiveFilesModel::FrontCover; }else if(item == tr("Back Cover")){ newType = ArchiveFilesModel::BackCover; }else if(item == tr("General Cover")){ newType = ArchiveFilesModel::GeneralCover; } if(newType){ foreach(QModelIndex i, sel){ QModelIndex real = mArchiveFilesProxy->mapToSource(i); mArchiveFilesModel->setData(real, newType, ArchiveFilesModel::FileTypeRole); } mArchiveFilesModel->refresh(); mArchiveFiles->expandAll(); } } } void ArchiveController::editFileNo(){ QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::FileNumber); if(sel.isEmpty()){ return; } bool ok; int fileNo = QInputDialog::getInt(mParentWidget, tr("Set DVD no."), tr("Number (-1 for none)"), -1, -1, 1024 * 1024, 1, &ok); if(ok){ foreach(QModelIndex i, sel){ QModelIndex real = mArchiveFilesProxy->mapToSource(i); if(mArchiveFilesModel->isMovie(real)){ mArchiveFilesModel->setData(real, fileNo, ArchiveFilesModel::FileNumberRole); } } } } void ArchiveController::treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ Q_UNUSED(selected); Q_UNUSED(deselected); QModelIndexList sel = mapToSource(mArchiveProxy, mArchiveSelection->selectedRows()); if(sel.isEmpty()){ return; } QSet ids; foreach(QModelIndex idx, sel){ ids.unite(mArchiveModel->seriesPartIds(idx)); } mArchiveFilesModel->populate(ids); mArchiveFiles->expandAll(); mArchiveView->setCurrentArchivePath(mArchiveModel->indexToPath(sel.first())); } void ArchiveController::fileDoubleClicked(const QModelIndex &idx){ if(!idx.isValid()){ return; } int type = idx.data(ArchiveFilesModel::FileTypeRole).toInt(); if(type == ArchiveFilesModel::Movie){ QString fullPath = idx.data(ArchiveFilesModel::FullPathRole).toString(); QFileInfo fi(fullPath); if(!fi.exists()){ QString msg = QString(tr("%1 not available!")).arg(idx.data(ArchiveFilesModel::FilenameRole).toString()); QMessageBox::critical(mParentWidget, tr("Error"), msg); return; } QPair playerData = Helper::programData("movieviewer"); QStringList args = playerData.second; args << idx.data(ArchiveFilesModel::FullPathRole).toString(); QProcess::startDetached(playerData.first, args); return; } PictureViewer2 *pv = SmGlobals::instance()->pictureViewer(); pv->setFile(idx.data(ArchiveFilesModel::FullPathRole).toString()); pv->show(); } QModelIndexList ArchiveController::mapToSource(const QSortFilterProxyModel *proxy, const QModelIndexList idxs) const{ QModelIndexList retval; foreach(QModelIndex idx, idxs){ retval << proxy->mapToSource(idx); } return retval; }