/* 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 #include #include #include #include #include #include #include #include "filestreewidget.h" #include "smglobals.h" #include "filestreemodel.h" #include "seriestreemodel.h" #include "helper.h" #include "pictureviewer.h" FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent), mSelectedSize(0){ //the view mView = new FilesTreeView; mView->setSelectionMode(QAbstractItemView::ExtendedSelection); mModel = static_cast(SmGlobals::instance()->model("FilesModel")); mProxy = new FilesTreeSortModel(this); mProxy->setSourceModel(mModel); mView->setModel(mProxy); mView->setSortingEnabled(true); QItemSelectionModel *selModel = mView->selectionModel(); connect(selModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(fileSelectionChanged(QModelIndex,QModelIndex))); connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); connect(mView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(itemDoubleClicked(QModelIndex))); //layout QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(mView); setLayout(mainLayout); //globals mSeriesModel = static_cast(SmGlobals::instance()->model("SeriesModel")); mPictureViewer = SmGlobals::instance()->pictureViewer(); } void FilesTreeWidget::resetSize(){ mSelectedSize = 0; emit sizeChanged(mSelectedSize); } void FilesTreeWidget::moveToBurn(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } QSettings s; QString burnDir = s.value("paths/burn").toString(); if(burnDir.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No target directory configured.")); return; } foreach(QModelIndex i, selected){ int type = i.data(FilesTreeModel::FileTypeRole).toInt(); if(type == FilesTreeModel::BackCover || type == FilesTreeModel::FrontCover || type == FilesTreeModel::GeneralCover){ continue; } int seriesPartId = i.data(FilesTreeModel::SeriesPartIdRole).toInt(); int seriesId = mSeriesModel->seriesIdByPartId(seriesPartId); if(seriesId != -1){ QModelIndex seriesIdx = mSeriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId); if(seriesIdx.isValid()){ QString seriesName = seriesIdx.data(SeriesTreeModel::NameRole).toString(); QString dirName = seriesName.replace(' ', "."); QDir target(burnDir); target.mkdir(dirName); const QHash files = mModel->filesBySeriesPartId(seriesPartId); foreach(QString name, files.keys()){ QString sourceFile = Helper::createArchivePath(name, files.value(name)); QString targetFile = QString("%1/%2/%3").arg(burnDir).arg(dirName).arg(name); if(name == i.data(FilesTreeModel::FileNameRole).toString()){ QFile::rename(sourceFile, targetFile); }else{ QFile::copy(sourceFile, targetFile); } } } } } } void FilesTreeWidget::setDvdNo(){ DvdNoDialog dlg(this); int retval = dlg.exec(); if(retval == QDialog::Accepted){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } int dvdNo = dlg.dvdNo(); foreach(QModelIndex i, selected){ int type = i.data(FilesTreeModel::FileTypeRole).toInt(); if(type != FilesTreeModel::Movie){ continue; } QModelIndex real = mProxy->mapToSource(i); if(real.isValid()){ QModelIndex dvdColumn = mModel->index(real.row(), FilesTreeModel::DvdNo, real.parent()); mModel->setData(dvdColumn, dvdNo, Qt::EditRole); } } } } void FilesTreeWidget::removeFiles(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } QString message = QString(tr("

Really delete these file(s):

    ")); foreach(QModelIndex i, selected){ message.append(QString(tr("
  • %1
  • ")).arg(i.data(FilesTreeModel::FileNameRole).toString())); } message.append("
"); int retval = QMessageBox::critical(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); if(retval == QMessageBox::Yes){ QModelIndexList realSelected; foreach(QModelIndex i, selected){ realSelected << mProxy->mapToSource(i); } mModel->deleteFiles(realSelected); } } void FilesTreeWidget::fileSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous){ Q_UNUSED(previous); int seriesPartId = current.data(FilesTreeModel::SeriesPartIdRole).toInt(); int seriesId = mSeriesModel->seriesIdByPartId(seriesPartId); int filePart = current.data(FilesTreeModel::PartNoRole).toInt(); QModelIndex seriesIdx = mSeriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId); if(seriesIdx.isValid()){ QModelIndex seriesPartIdx = mSeriesModel->findValue(seriesPartId, seriesIdx, SeriesTreeModel::SeriesPartId); QString seriesNumber = QString::number(seriesPartIdx.data(SeriesTreeModel::SeriesPartRole).toInt()); QString msg; if(filePart > 0){ msg = QString(tr("%1 %2 (%3)")).arg(seriesIdx.data(SeriesTreeModel::NameRole).toString()).arg(seriesNumber).arg(filePart); }else{ msg = QString(tr("%1 %2")).arg(seriesIdx.data(SeriesTreeModel::NameRole).toString()).arg(seriesNumber); } emit statusMessage(msg); } } void FilesTreeWidget::itemDoubleClicked(const QModelIndex &index){ int dvdNo = index.data(FilesTreeModel::DvdNoRole).toInt(); if(dvdNo != -1){ QString msg = QString(tr("%1 is archived on DVD %2.")).arg(index.data().toString()).arg(QString::number(index.data(FilesTreeModel::DvdNoRole).toInt())); QMessageBox::critical(this, tr("Error"), msg); return; } QString file = index.data(FilesTreeModel::FullPathRole).toString(); QString mimeType = Helper::mimeType(file); if(mimeType.startsWith("image")){ mPictureViewer->showPic(file); return; }else{ QPair data = Helper::programData("movieviewer", QString()); if(data.first.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No viedeo viewer configured.")); return; } QString program = data.first; QStringList args = data.second; args << file; QProcess::startDetached(program, args); } } void FilesTreeWidget::fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ QModelIndexList sel = selected.indexes(); QModelIndexList desel = deselected.indexes(); foreach(QModelIndex i, sel){ if(i.column() == 0){ mSelectedSize += i.data(FilesTreeModel::SizeRole).toLongLong(); } } foreach(QModelIndex i, desel){ if(i.column() == 0){ mSelectedSize -= i.data(FilesTreeModel::SizeRole).toLongLong(); } } emit sizeChanged(mSelectedSize); } FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent){} void FilesTreeView::contextMenuEvent(QContextMenuEvent *event){ QMenu ctxMenu; foreach(QAction *a, actions()){ ctxMenu.addAction(a); } ctxMenu.exec(event->globalPos()); } FilesTreeSortModel::FilesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {} bool FilesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const{ if(left.parent() == QModelIndex()){ return false; } if(left.column() == FilesTreeModel::SizeDisplay){ return left.data(FilesTreeModel::SizeRole).toLongLong() < right.data(FilesTreeModel::SizeRole).toLongLong(); } if(left.column() == FilesTreeModel::DvdNoRole){ return left.data(FilesTreeModel::DvdNoRole).toInt() < right.data(FilesTreeModel::DvdNoRole).toInt(); } return QSortFilterProxyModel::lessThan(left, right); } DvdNoDialog::DvdNoDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ //spin box QHBoxLayout *spinBoxLayout = new QHBoxLayout; QLabel *l1 = new QLabel(tr("Select &Dvd no.")); mDvdNo = new QSpinBox; l1->setBuddy(mDvdNo); spinBoxLayout->addWidget(l1); spinBoxLayout->addWidget(mDvdNo); mDvdNo->setMinimum(-1); SeriesTreeModel *seriesModel = static_cast(SmGlobals::instance()->model("SeriesModel")); int nextDvdNo = seriesModel->findNextDvdNo(); mDvdNo->setValue(nextDvdNo); //buttons QHBoxLayout *buttonLayout = new QHBoxLayout; mOk = new QPushButton(tr("Ok")); connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); buttonLayout->addStretch(); buttonLayout->addWidget(mOk); mCancel = new QPushButton(tr("Cancel")); connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); buttonLayout->addWidget(mCancel); //main layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(spinBoxLayout); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("Select Dvd no.")); } int DvdNoDialog::dvdNo() const { return mDvdNo->value(); }