diff options
author | Arno <am@disconnect.de> | 2013-07-27 11:31:08 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-07-27 11:31:08 +0200 |
commit | 5cfaa2c755c52c2ccbdd88ea3239dafb120a179b (patch) | |
tree | ba0386df4e1ed60bb0d5be3090bba1a6622437cc | |
parent | fa4f4952b11b94ffa899e40c4f22070280a4a399 (diff) | |
download | SheMov-5cfaa2c755c52c2ccbdd88ea3239dafb120a179b.tar.gz SheMov-5cfaa2c755c52c2ccbdd88ea3239dafb120a179b.tar.bz2 SheMov-5cfaa2c755c52c2ccbdd88ea3239dafb120a179b.zip |
Get rid of old archive
Yeah, finally it's gone! Lot's of useless, unneeded code vanished :)
-rw-r--r-- | archivetreeview.cpp | 321 | ||||
-rw-r--r-- | archivetreeview.h | 75 | ||||
-rw-r--r-- | filestreemodel.cpp | 655 | ||||
-rw-r--r-- | filestreemodel.h | 100 | ||||
-rw-r--r-- | filestreewidget.cpp | 611 | ||||
-rw-r--r-- | filestreewidget.h | 121 | ||||
-rw-r--r-- | newmoviewizard.cpp | 2 | ||||
-rw-r--r-- | seriestreemodel.cpp | 668 | ||||
-rw-r--r-- | seriestreemodel.h | 101 | ||||
-rw-r--r-- | seriestreewidget.cpp | 710 | ||||
-rw-r--r-- | seriestreewidget.h | 185 | ||||
-rw-r--r-- | shemov.cpp | 418 | ||||
-rw-r--r-- | shemov.h | 66 | ||||
-rw-r--r-- | shemov.pro | 10 | ||||
-rw-r--r-- | smglobals.cpp | 16 |
15 files changed, 18 insertions, 4041 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp deleted file mode 100644 index c9155f9..0000000 --- a/archivetreeview.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* - 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 <QtWidgets/QSplitter> -#include <QSettings> -#include <QtWidgets/QAction> -#include <QtWidgets/QHBoxLayout> -#include <QProcess> -#include <QtWidgets/QMessageBox> -#include <QClipboard> -#include <QtWidgets/QApplication> -#include <QtWidgets/QHeaderView> - -#include "archivetreeview.h" -#include "smglobals.h" -#include "seriestreewidget.h" -#include "filestreewidget.h" -#include "filestreemodel.h" -#include "seriestreemodel.h" -#include "mappingtablewidget.h" -#include "mappingtablemodel.h" -#include "seriesmetadatamodel.h" -#include "helper.h" - -ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent), mShowAllFiles(false){ - // models - mActorsModel = static_cast<MappingTableModel*>(SmGlobals::instance()->model("actors")); - mGenresModel = static_cast<MappingTableModel*>(SmGlobals::instance()->model("genres")); - - // series view - mSeriesWidget = new SeriesTreeWidget(this); - QItemSelectionModel *selModel = mSeriesWidget->seriesTree()->selectionModel(); - connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(currentChanged(QItemSelection,QItemSelection))); - connect(mSeriesWidget->seriesTree(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(playSelected())); - mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - connect(mSeriesModel, SIGNAL(localsChanged()), this, SLOT(invalidateSorting())); - SmGlobals::instance()->setSeriesTreeWidget(mSeriesWidget); - - // files view - mFilesWidget = new FilesTreeWidget; - mFilesModel = qobject_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - connect(mSeriesWidget, SIGNAL(filesReload()), mFilesWidget->filesTree(), SLOT(expandAll())); - - // actors and genre - QWidget *genreActorWidget = new QWidget; - QHBoxLayout *genreActorLayout = new QHBoxLayout; - mActorsWidget = new MappingTableWidget("actors"); - mGenresWidget = new MappingTableWidget("genres"); - mMetaData = new MetadataDisplay; - genreActorLayout->addWidget(mActorsWidget); - genreActorLayout->addWidget(mGenresWidget); - genreActorLayout->addWidget(mMetaData); - genreActorWidget->setLayout(genreActorLayout); - - // fileview, actors and genres - QSplitter *verticalSplitter = new QSplitter(Qt::Vertical); - verticalSplitter->addWidget(mFilesWidget); - verticalSplitter->addWidget(genreActorWidget); - verticalSplitter->setStretchFactor(0, 3); - verticalSplitter->setStretchFactor(1, 1); - - // layout - QHBoxLayout *mainLayout = new QHBoxLayout; - QSplitter *splitter = new QSplitter; - splitter->addWidget(mSeriesWidget); - splitter->addWidget(verticalSplitter); - splitter->setStretchFactor(0, 2); - splitter->setStretchFactor(1, 3); - mainLayout->addWidget(splitter); - setLayout(mainLayout); - - constructWindowTitle(); -} - -void ArchiveTreeView::setFileViewMode(int mode){ - mSeriesModel->setRowFilter(mode); - mSeriesWidget->seriesProxy()->invalidate(); - mFilesModel->setMode(mode); - showAllFiles(mShowAllFiles); - constructWindowTitle(); - mSeriesWidget->expandItems(); -} - -void ArchiveTreeView::showAllFiles(bool toggled){ - mShowAllFiles = toggled; - if(mShowAllFiles){ - mFilesWidget->resetSize(); - int seriesRow = 0; - QModelIndex series = mSeriesModel->index(seriesRow, 0, QModelIndex()); - QList<int> ids; - while(series.isValid()){ - int childRow = 0; - QModelIndex child = mSeriesModel->index(childRow, 0, series); - while(child.isValid()){ - if(mSeriesWidget->seriesProxy()->acceptedByFilter(child.row(), child.parent())){ - ids << child.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - } - child = mSeriesModel->index(++childRow, 0, child.parent()); - } - series = mSeriesModel->index(++seriesRow, 0, series.parent()); - } - mFilesModel->setIds(ids); - mFilesWidget->filesTree()->expandAll(); - mFilesWidget->filesTree()->resizeColumnToContents(0); - }else{ - QModelIndexList selectedSeries = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); - QModelIndex selected; - if(selectedSeries.isEmpty()){ - selected = mSeriesWidget->seriesProxy()->index(0, 0); - }else{ - selected = selectedSeries.at(0); - } - mSeriesWidget->seriesTree()->selectionModel()->setCurrentIndex(selected, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); - currentChanged(QItemSelection(), QItemSelection()); - } -} - -void ArchiveTreeView::showForBurn(bool toggled){ - if(toggled){ - mFilesModel->setForBurn(); - mFilesWidget->filesTree()->expandAll(); - mFilesWidget->filesTree()->resizeColumnToContents(0); - mFilesWidget->filesTree()->resizeColumnToContents(2); - } -} - -void ArchiveTreeView::cleanDatabase(const QString &table){ - MappingTableModel *model = 0; - if(table == "genres"){ - model = mGenresModel; - }else if(table == "actors"){ - model = mActorsModel; - } - Q_ASSERT(model); - QHash<QString, int> zeroUsers = model->zeroUsers(); - if(zeroUsers.isEmpty()){ - QMessageBox::information(this, tr("Message"), tr("Nothing to clean up!")); - return; - } - QString message = QString(tr("<p>Really delete these items from %1?<p>")).arg(table); - message.append("<ul>"); - QStringList userNames = zeroUsers.keys(); - qSort(userNames); - foreach(QString s, userNames){ - message.append(QString("<li>%1</li>").arg(s)); - } - message.append("</ul>"); - int answer = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); - if(answer == QMessageBox::Yes){ - QList<int> ids = zeroUsers.values(); - model->deleteItems(ids); - } -} - -void ArchiveTreeView::copyPath(int type){ - QModelIndexList selected = mFilesWidget->filesTree()->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QString fullPath = selected.at(0).data(FilesTreeModel::FullPathRole).toString(); - QFileInfo fi(fullPath); - if(!fi.exists()){ - int dvdNo = selected.at(0).data(FilesTreeModel::DvdNoRole).toInt(); - QString msg = QString(tr("File not found. File is archived on DVD #%1")).arg(QString::number(dvdNo)); - QMessageBox::critical(this, tr("Error"), msg); - return; - } - QClipboard *clipBoard = QApplication::clipboard(); - if(type == UnixFullPath){ - clipBoard->setText(fi.absoluteFilePath()); - } - if(type == UnixDir){ - clipBoard->setText(fi.absolutePath()); - } - if(type == WindowsFullPath){ - clipBoard->setText(createWindowsPath(fi.absoluteFilePath())); - } - if(type == WindowsDir){ - clipBoard->setText(createWindowsPath(fi.absolutePath())); - } -} - -void ArchiveTreeView::readSettings(){ - seriesWidget()->readSettings(); - seriesWidget()->seriesTree()->readSettings(); - filesWidget()->filesTree()->readSettings(); - mFilesModel->readSettings(); - QSettings s; - QString iconName = s.value("ui/foldericon", "Dildo").toString(); - const QHash<QString, QString> icons = SmGlobals::instance()->icons(); - QIcon decorationIcon = QIcon(icons.value(iconName)); - mFilesModel->setDecorationIcon(decorationIcon); - mSeriesModel->setDecorationIcon(decorationIcon); - MappingTableItemModel *actorsModel = mActorsWidget->model(); - actorsModel->setDecorationIcon(decorationIcon); - MappingTableItemModel *genreModel = mGenresWidget->model(); - genreModel->setDecorationIcon(decorationIcon); -} - -void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){ - Q_UNUSED(selected); - Q_UNUSED(deselected); - - if(mFilesModel->displayMode() == FilesTreeModel::Burn){ - mFilesModel->setDisplayMode(FilesTreeModel::Ids); - mNormalViewA->trigger(); - } - QModelIndexList selectedSeries = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); - mFilesWidget->resetSize(); - if(selectedSeries.isEmpty()){ - return; - } - - QList<int> selectedPartIds; - SeriesTreeSortModel *proxy = mSeriesWidget->seriesProxy(); - foreach(QModelIndex i, selectedSeries){ - QModelIndex real = proxy->mapToSource(i); - if(real.isValid()){ - int type = real.data(SeriesTreeModel::TypeRole).toInt(); - if(type == SeriesTreeModel::Series){ - QList<QVariant> childIds = mSeriesModel->childrenColumnList(real, SeriesTreeModel::SeriesPartId); - foreach(QVariant id, childIds){ - int realId = id.toInt(); - if(!selectedPartIds.contains(realId)){ - selectedPartIds << realId; - } - } - }else if(type == SeriesTreeModel::Part){ - int realId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - if(!selectedPartIds.contains(realId)){ - selectedPartIds << realId; - } - } - } - } - - mFilesModel->setIds(selectedPartIds); - mFilesWidget->filesTree()->expandAll(); - mFilesWidget->filesTree()->header()->resizeSections(QHeaderView::ResizeToContents); - setMappingItems(selectedPartIds, mActorsModel, mActorsWidget); - setMappingItems(selectedPartIds, mGenresModel, mGenresWidget); - if(!selectedPartIds.isEmpty()){ - mMetaData->setSeriesPartId(selectedPartIds.at(0)); - } -} - -void ArchiveTreeView::setMappingItems(QList<int>seriesPartIds, MappingTableModel *model, MappingTableWidget *widget){ - QStringList items; - foreach(int id, seriesPartIds){ - QList<QVariant> actorNames = model->mappings(id); - foreach(QVariant v, actorNames){ - if(!items.contains(v.toString())){ - items << v.toString(); - } - } - } - qSort(items); - widget->setStringList(items); - widget->setEditEnabled(seriesPartIds.count() == 1); - if(seriesPartIds.count() == 1){ - widget->setCurrentId(seriesPartIds.at(0)); - }else{ - widget->setCurrentId(-1); - } -} - -void ArchiveTreeView::playSelected(const QString &preferred){ - QModelIndexList selected = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QStringList files; - foreach(QModelIndex idx, selected){ - QModelIndex real = mSeriesWidget->seriesProxy()->mapToSource(idx); - QFileInfoList movies = mSeriesModel->findSortedMovies(real); - foreach(QFileInfo fi, movies){ - if(!files.contains(fi.absoluteFilePath())){ - files << fi.absoluteFilePath(); - } - } - } - QPair<QString, QStringList> progData = Helper::programData("movieviewer", preferred); - QString program = progData.first; - QStringList args = progData.second; - args << files; - QProcess::startDetached(program, args); -} - -void ArchiveTreeView::invalidateSorting(){ - mSeriesWidget->seriesProxy()->invalidate(); -} - -void ArchiveTreeView::constructWindowTitle(){ - int rowFilter = mSeriesModel->rowFilter(); - mWindowTitle = QString(tr("Movie Archive")); - switch(rowFilter){ - case SeriesTreeModel::Archived: - mWindowTitle.append(tr(" - [Archived]")); - break; - case SeriesTreeModel::Local: - mWindowTitle.append(tr(" - [Local]")); - break; - default: - ; - } - emit needWindowTitleChange(mWindowTitle); -} - -const QString ArchiveTreeView::createWindowsPath(const QString &path) const{ - QString retval = path; - QSettings s; - const QString strip = s.value("paths/strippath").toString(); - retval.remove(strip); - retval.replace('/', '\\'); - retval = QString("%1\\%2").arg(s.value("paths/windowsdrive").toString()).arg(retval); - return retval; -} diff --git a/archivetreeview.h b/archivetreeview.h deleted file mode 100644 index ad23bc1..0000000 --- a/archivetreeview.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - 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. -*/ - -#ifndef ARCHIVETREEVIEW_H -#define ARCHIVETREEVIEW_H - -#include <QtWidgets/QWidget> - -class SeriesTreeWidget; -class FilesTreeWidget; -class FilesTreeModel; -class SeriesTreeModel; -class MappingTableWidget; -class MappingTableModel; -class NoCoverMovieDialog; -class MetadataDisplay; -class QItemSelection; - -class ArchiveTreeView : public QWidget { - Q_OBJECT - public: - enum CopyType { WindowsDir, WindowsFullPath, UnixDir, UnixFullPath }; - explicit ArchiveTreeView(QWidget *parent = 0); - virtual ~ArchiveTreeView() {} - SeriesTreeWidget *seriesWidget() { return mSeriesWidget; } - FilesTreeWidget *filesWidget() { return mFilesWidget; } - const QString windowTitle() { return mWindowTitle; } - void setNormalViewAction(QAction* a) { mNormalViewA = a; } - - signals: - void needWindowTitleChange(QString); - - public slots: - void setFileViewMode(int mode); - void showAllFiles(bool toggled); - void showForBurn(bool toggled); - void cleanDatabase(const QString &table); - void copyPath(int type); - void readSettings(); - - private slots: - void currentChanged(const QItemSelection &selected, const QItemSelection &deselected); - void setMappingItems(const QList<int> seriesPartIds, MappingTableModel *model, MappingTableWidget *widget); - void playSelected(const QString &preferred = QString()); - void invalidateSorting(); - - private: - //functions - void constructWindowTitle(); - const QString createWindowsPath(const QString &path) const; - - //widgets - SeriesTreeWidget *mSeriesWidget; - FilesTreeWidget *mFilesWidget; - MappingTableWidget *mActorsWidget; - MappingTableWidget *mGenresWidget; - MetadataDisplay *mMetaData; - - //models - FilesTreeModel *mFilesModel; - SeriesTreeModel *mSeriesModel; - MappingTableModel *mActorsModel; - MappingTableModel *mGenresModel; - - //misc - QString mWindowTitle; - NoCoverMovieDialog *mNoCoverDialog; - QAction *mNormalViewA; - bool mShowAllFiles; -}; -#endif diff --git a/filestreemodel.cpp b/filestreemodel.cpp deleted file mode 100644 index 2b4ad6d..0000000 --- a/filestreemodel.cpp +++ /dev/null @@ -1,655 +0,0 @@ -/* - 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 <QSqlQuery> -#include <QLocale> -#include <QIcon> -#include <QFileInfo> -#include <QFile> -#include <QSettings> -#include <QProcess> -#include <QImage> -#include <QDataStream> -#include <QStandardPaths> -#include <QDir> -#include <QFont> -#include <QSettings> - -#include "filestreemodel.h" -#include "smtreeitem.h" -#include "helper.h" -#include "seriestreemodel.h" -#include "smglobals.h" - -FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mMagic(0xAABBCCDD), mDisplayMode(Ids){ - //database setup - mDb = QSqlDatabase::database("treedb"); - mUpdateDvdQuery = new QSqlQuery(mDb); - mUpdateDvdQuery->prepare("UPDATE files SET idvd = :dvd WHERE ifiles_id = :id"); - mUpdateQualityQuery = new QSqlQuery(mDb); - mUpdateQualityQuery->prepare("UPDATE files SET siquality = :quality WHERE ifiles_id = :id"); - mUpdatePartNoQuery = new QSqlQuery(mDb); - mUpdatePartNoQuery->prepare("UPDATE files SET sifileno = :partno WHERE ifiles_id = :id"); - mUpdateFileTypeQuery = new QSqlQuery(mDb); - mUpdateFileTypeQuery->prepare("UPDATE files SET sifiletype = :filetype WHERE ifiles_id = :id"); - mInsertFileQuery = new QSqlQuery(mDb); - mInsertFileQuery->prepare("INSERT INTO files(iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality) VALUES(:seriespartid, :fname, :md5, :size, :dvd, :type, :fileno, :quality)"); - mFilesQuery = new QSqlQuery(mDb); - mFilesQuery->prepare("SELECT tfilename, cmd5sum FROM files WHERE iseriespart_id = :id"); - mDeleteFileQuery = new QSqlQuery(mDb); - mDeleteFileQuery->prepare("DELETE FROM files WHERE ifiles_id = :id"); - mFileTypeQuery = new QSqlQuery(mDb); - mFileTypeQuery->prepare("SELECT sifiletype FROM files WHERE cmd5sum = :md5"); - mUpdateSeriesPartQuery = new QSqlQuery(mDb); - mUpdateSeriesPartQuery->prepare("UPDATE files SET iseriespart_id = :partid WHERE ifiles_id = :fileid"); - - //file types - mFileTypes.insert(1, tr("Movie")); - mFileTypes.insert(2, tr("Front cover")); - mFileTypes.insert(3, tr("Back cover")); - mFileTypes.insert(4, tr("General cover")); - - //cover types - mCoverTypes = mFileTypes; - mCoverTypes.remove(1); - - //misc - mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - readCache(); - mEditableColumns.insert(tr("Set part no."), PartNo); - mEditableColumns.insert(tr("Set quality"), Quality); - mEditableColumns.insert(tr("Set file type"), FileType); - mEditableColumns.insert(tr("Set dvd no."), DvdNo); - mDvdSize = SmGlobals::instance()->dvdSize(); -} - -void FilesTreeModel::setIds(const QList<int> &seriesPartIds){ - mDisplayMode = Ids; - mCurrentIds = seriesPartIds; - QStringList ids; - foreach(int s, seriesPartIds){ - ids << QString::number(s); - } - QString query = QString("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id, series.tseries_name, seriesparts.iseriespart, seriesparts.bfavorite FROM files, seriesparts, series WHERE iseriespart_id IN (%1) AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY tfilename, sifileno ASC").arg(ids.join(",")); - QSqlQuery filesQuery(mDb); - filesQuery.prepare(query); - populate(filesQuery); -} - -void FilesTreeModel::setForBurn(){ - mDisplayMode = Burn; - mCurrentIds.clear(); - QString query = QString("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id, series.tseries_name, seriesparts.iseriespart, seriesparts.bfavorite FROM files, seriesparts, series WHERE iseriespart_id IN (SELECT iseriesparts_id from seriesparts where bfavorite = false) AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id AND sifiletype = 1 AND idvd < 0 ORDER BY iseriespart_id, sifileno ASC"); - QSqlQuery filesQuery(mDb); - filesQuery.prepare(query); - populate(filesQuery); -} - -QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{ - if(!index.isValid()){ - return QVariant(); - } - - SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); - - if(role == Qt::DisplayRole){ - if(index.column() == DvdNo){ - if(index.data(FileTypeRole) == QVariant()){ - return QVariant(); - } - if(item->data(DvdNo).toInt() == -1){ - return QString(tr("(local)")); - }else{ - QString retval = QString(tr("DVD #%1")).arg(item->data(DvdNo).toInt()); - return retval; - } - } - if(index.column() == PartNo){ - if(item->data(PartNo).toInt() < 1 && item->parent() != root()){ - return "(none)"; - } - } - if(index.column() == Quality){ - if(item->data(Quality).toInt() < 1){ - return QVariant(); - } - return item->data(Quality); - } - if(index.column() == FileType){ - return mFileTypes.value(item->data(FileType).toInt()); - } - if(index.column() == FullPath){ - if(item->data(DvdNo).toInt() > 0){ - return QString("(not available)"); - } - } - return item->data(index.column()); - } - if(role == Qt::ToolTipRole){ - if((mMode == SeriesTreeModel::Archived) && (item->data(FileType) == Movie)){ - int seriesPartId = item->data(SeriesPartId).toInt(); - int seriesId = mSeriesModel->seriesIdByPartId(seriesPartId); - if(seriesId != -1){ - QModelIndex seriesIdx = mSeriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId); - if(seriesIdx.isValid()){ - QModelIndex seriesPartIdx = mSeriesModel->findValue(seriesPartId, seriesIdx, SeriesTreeModel::SeriesPartId); - QHash<QString, QString> files = filesBySeriesPartId(seriesPartId); - QString retval = QString(tr("<p style=\"text-decoration: underline; font-weight: bold\">%1 %2</p>")).arg(seriesPartIdx.data(SeriesTreeModel::NameRole).toString()).arg(QString::number(seriesPartIdx.data(SeriesTreeModel::SeriesPartRole).toInt())); - retval.append(QString(tr("<p style=\"margin-bottom: 0px; padding-bottom: 0px\">Files:</p>"))); - retval.append(tr("<ul style=\"margin-top: 0px\">")); - QHash<QString, QString>::const_iterator it = files.constBegin(); - while(it != files.constEnd()){ - retval.append(QString("<li style=\"margin-left: -10px\">%1</li>").arg(it.key())); - ++it; - } - retval.append(tr("</ul>")); - return retval; - } - } - } - } - if(role == Qt::EditRole){ - return item->data(index.column()); - } - if(role == Qt::DecorationRole){ - if(index.column() == 0){ - return decorationIcon(); - } - } - if(role == Qt::TextAlignmentRole){ - if(index.column() > 0 && index.column() < 4){ - int retval = Qt::AlignRight | Qt::AlignVCenter; - return retval; - } - } - if(role == Qt::ForegroundRole){ - if(index.column() == SizeDisplay){ - if(item->data(Size).toLongLong() > mDvdSize){ - return QColor(Qt::red); - } - return QColor(Qt::green); - } - if(index.column() == FileName){ - if(item->data(Favorite).toBool() == true){ - return mFavoriteColor; - }else if(item->data(DvdNo) == -1){ - return mLocalColor; - }else if(item->data(DvdNo).toInt() > 0){ - return mArchivedColor; - } - } - } - if(role == Qt::FontRole){ - if(index.column() == Md5Sum){ - return QFont("courier"); - } - } - if(role == FileNameRole){ - return item->data(FileName); - } - if(role == FullPathRole){ - return item->data(FullPath); - } - if(role == SizeRole){ - return item->data(Size); - } - if(role == DvdNoRole){ - return item->data(DvdNo); - } - if(role == SizeDisplay){ - return item->data(SizeDisplay); - } - if(role == FileTypeRole){ - return item->data(FileType); - } - if(role == Md5SumRole){ - return item->data(Md5Sum); - } - if(role == PartNoRole){ - return item->data(PartNo); - } - if(role == SeriesPartIdRole){ - return item->data(SeriesPartId); - } - if(role == QualityRole){ - return item->data(Quality); - } - if(role == FilesIdRole){ - return item->data(FilesId); - } - if(role == SeriesPartRole){ - return item->data(SeriesPart); - } - if(role == DisplayNameRole){ - return item->data(DisplayName); - } - if(role == SeriesNameRole){ - return item->data(SeriesName); - } - if(role == FavoriteRole){ - return item->data(Favorite); - } - return QVariant(); -} - -bool FilesTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ - if(!index.isValid()){ - return false; - } - if(role == Qt::EditRole){ - SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); - if(index.column() == DvdNo){ - mUpdateDvdQuery->bindValue(":id", index.data(FilesIdRole)); - mUpdateDvdQuery->bindValue(":dvd", value); - if(mUpdateDvdQuery->exec()){ - item->setData(DvdNo, value); - return true; - }else{ - return false; - } - } - if(index.column() == Quality){ - if(value.toInt() > 10 || value.toInt() < 0){ - return false; - } - mUpdateQualityQuery->bindValue(":id", index.data(FilesIdRole)); - mUpdateQualityQuery->bindValue(":quality", value); - if(mUpdateQualityQuery->exec()){ - item->setData(Quality, value); - return true; - } - } - if(index.column() == PartNo){ - mUpdatePartNoQuery->bindValue(":id", index.data(FilesIdRole)); - mUpdatePartNoQuery->bindValue(":partno", value); - if(mUpdatePartNoQuery->exec()){ - item->setData(PartNo, value); - return true; - } - } - if(index.column() == FileType){ - mUpdateFileTypeQuery->bindValue(":id", index.data(FilesIdRole)); - mUpdateFileTypeQuery->bindValue(":filetype", value); - if(mUpdateFileTypeQuery->exec()){ - int oldFileType = index.data(FileTypeRole).toInt(); - item->setData(FileType, value); - QModelIndex newParent = QModelIndex(); - if((oldFileType == 1) && (value.toInt() != 1)){ - newParent = find("Covers"); - } - if((oldFileType > 1) && (value.toInt() == 1)){ - newParent = find("Movies"); - } - if(newParent.isValid()){ - reparent(index, newParent); - } - return true; - } - } - } - return false; -} - -Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{ - if(!index.isValid()){ - return 0; - } - if(index.data(FileTypeRole) == QVariant()){ - return Qt::ItemIsEnabled; - } - int retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if(mEditableColumns.values().contains(index.column())){ - retval |= Qt::ItemIsEditable; - } - if(mode() == SeriesTreeModel::Local){ - if(index.data(FavoriteRole).toBool() == true){ - int inverse = ~Qt::ItemIsSelectable; - retval &= inverse; - } - } - return static_cast<Qt::ItemFlags>(retval); -} - -QHash<QString, QString> FilesTreeModel::filesBySeriesPartId(int seriesPartId) const{ - mFilesQuery->bindValue(":id", seriesPartId); - QHash<QString, QString> retval; - if(mFilesQuery->exec()){ - while(mFilesQuery->next()){ - retval.insert(mFilesQuery->value(0).toString(), mFilesQuery->value(1).toString()); - } - } - return retval; -} - -QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QString &path) const{ - QList<QMap<QString, QString> > retval; - QSettings s; - QString ffProbe = s.value("paths/ffprobe").toString(); - QStringList args; - args << "-show_streams" << path; - QProcess ffproc; - ffproc.start(ffProbe, args); - if(!ffproc.waitForStarted()){ - return retval; - } - ffproc.waitForFinished(); - QByteArray ffData = ffproc.readAllStandardOutput(); - QList<QByteArray> lines = ffData.split('\n'); - QMap<QString, QString> current; - foreach(QString l, lines){ - if(l.startsWith("[STREAM]")){ - continue; - } - if(l.startsWith("[/STREAM]")){ - retval << current; - current.clear(); - continue; - } - QStringList parts = l.split('='); - if(parts.size() == 2){ - current.insert(parts.at(0), parts.at(1)); - } - } - return retval; -} - -QList<QMap<QString, QString> > FilesTreeModel::streamInfo(const QModelIndex &idx) const{ - return streamInfo(idx.data(FullPathRole).toString()); -} - -QMap<QString, QString> FilesTreeModel::pictureInfo(const QString &path) const{ - QMap<QString, QString> retval; - QImage img(path); - if(img.isNull()){ - return retval; - } - retval.insert("Width", QString::number(img.width())); - retval.insert("Height", QString::number(img.height())); - retval.insert("Colors", QString::number(img.colorCount())); - retval.insert("Color depth", QString::number(img.depth())); - retval.insert("Byte count", QString::number(img.byteCount())); - retval.insert("Bytes per line", QString::number(img.bytesPerLine())); - retval.insert("Alpha channel", img.hasAlphaChannel() ? tr("yes") : tr("no")); - retval.insert("Gray scale", img.isGrayscale() ? tr("yes") : tr("no")); - return retval; -} - -QMap<QString, QString> FilesTreeModel::pictureInfo(const QModelIndex &idx) const{ - return pictureInfo(idx.data(FullPathRole).toString()); -} - -QMap<QString, QString> FilesTreeModel::pictureMetaInfo(const QModelIndex &idx){ - QMap<QString, QString> retval; - if(!idx.isValid()){ - return retval; - } - QString fullPath = idx.data(FullPathRole).toString(); - QImage img(fullPath); - if(img.isNull()){ - return retval; - } - foreach(QString v, img.textKeys()){ - retval.insert(v, img.text(v)); - } - return retval; -} - -QModelIndex FilesTreeModel::fileSizeLessThan(quint64 size) const { - QModelIndex retval; - //bodly assume that movies is the first child... - QModelIndex movies = index(0, 0, QModelIndex()); - QModelIndex cur = index(0, 0, movies); - quint64 best = 0; - while(cur.isValid()){ - quint64 curSize = cur.data(FilesTreeModel::SizeRole).toLongLong(); - if(curSize < size){ - if(curSize > best){ - best = curSize; - retval = cur; - } - } - cur = index(cur.row() + 1, 0, movies); - } - return retval; -} - -int FilesTreeModel::fileType(const QString &md5sum) const{ - if(md5sum == "00000000000000000000000000000000"){ - return -1; - } - mFileTypeQuery->bindValue(":md5", md5sum); - int retval = -1; - mFileTypeQuery->exec(); - while(mFileTypeQuery->next()){ - retval = mFileTypeQuery->value(0).toInt(); - } - return retval; -} - -bool FilesTreeModel::addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd){ - QFileInfo fi(fullPath); - qint64 size = fi.size(); - QString md5Sum = Helper::md5Sum(fullPath); - if(!fi.exists()){ - //should be a dvd - size = mDvdSize; - md5Sum = QString(32, '0'); - } - - //prepare query - mDb.transaction(); - mInsertFileQuery->bindValue(":seriespartid", seriesPartId); - mInsertFileQuery->bindValue(":fname", fi.fileName()); - mInsertFileQuery->bindValue(":md5", md5Sum); - mInsertFileQuery->bindValue(":size", size); - mInsertFileQuery->bindValue(":dvd", dvd); - mInsertFileQuery->bindValue(":type", type); - mInsertFileQuery->bindValue(":fileno", filePart); - if(type == Movie){ - mInsertFileQuery->bindValue(":quality", quality); - }else{ - mInsertFileQuery->bindValue(":quality", QVariant(QVariant::Int)); - } - - //insert item - if(mInsertFileQuery->exec()){ - mDb.commit(); - return true; - } - mDb.rollback(); - return false; -} - -bool FilesTreeModel::deleteFile(const QModelIndex &file){ - QVariant fileId = file.data(FilesIdRole); - mDb.transaction(); - mDeleteFileQuery->bindValue(":id", fileId); - if(!mDeleteFileQuery->exec()){ - mDb.rollback(); - return false; - } - removeRows(file.row(), 1, file.parent()); - mDb.commit(); - return true; -} - -bool FilesTreeModel::deleteFiles(const QList<QPersistentModelIndex> &files){ - foreach(QPersistentModelIndex i, files){ - bool retval = deleteFile(i); - if(!retval){ - return false; - } - } - return true; -} - -bool FilesTreeModel::updateSeries(int newSeries, QList<QPersistentModelIndex> files){ - if(files.isEmpty()){ - return false; - } - mDb.transaction(); - foreach(QPersistentModelIndex idx, files){ - mUpdateSeriesPartQuery->bindValue(":partid", newSeries); - mUpdateSeriesPartQuery->bindValue(":fileid", idx.data(FilesTreeModel::FilesIdRole)); - if(!mUpdateSeriesPartQuery->exec()){ - mDb.rollback(); - return false; - } - } - mDb.commit(); - refresh(); - return true; -} - - -void FilesTreeModel::readCache(){ - QString settingsDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation); - QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); - QFileInfo fi(cacheFile); - if(!fi.exists()){ - return; - } - QFile cache(cacheFile); - cache.open(QIODevice::ReadOnly); - QDataStream stream(&cache); - qint32 magic; - stream >> magic; - if(magic != mMagic){ - QFile::remove(cacheFile); - return; - } - while(!stream.atEnd()){ - QString key, value; - stream >> key; - stream >> value; - mPicsDurationCache.insert(key, value); - } -} - -void FilesTreeModel::writeCache(){ - QString settingsDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation); - QFileInfo fi(settingsDir); - if(!fi.exists()){ - QDir root = QDir::root(); - root.mkpath(settingsDir); - } - QString cacheFile = QString("%1/%2").arg(settingsDir).arg("sizeduration.cache"); - QFile cache(cacheFile); - cache.open(QIODevice::WriteOnly); - QDataStream stream(&cache); - stream << mMagic; - QHash<QString, QString>::const_iterator it = mPicsDurationCache.constBegin(); - while(it != mPicsDurationCache.constEnd()){ - stream << it.key() << it.value(); - ++it; - } -} - -void FilesTreeModel::readSettings(){ - QSettings s; - QVariant local = s.value("ui/localcolor", QVariant(QColor(Qt::darkBlue))); - mLocalColor = local.value<QColor>(); - QVariant archived = s.value("ui/archivedcolor", QVariant(QColor(Qt::black))); - mArchivedColor = archived.value<QColor>(); - QVariant favorite = s.value("ui/favoritecolor", QVariant(QColor(Qt::red))); - mFavoriteColor = favorite.value<QColor>(); -} - -void FilesTreeModel::refresh(){ - switch(mDisplayMode){ - case Ids: - setIds(mCurrentIds); - break; - case Burn: - setForBurn(); - break; - default: - ; - } -} - -void FilesTreeModel::populate(QSqlQuery &filesQuery){ - SmTreeItem *root = new SmTreeItem(16); - SmTreeItem *files = new SmTreeItem(16, root); - files->setData(FileName, tr("Movies")); - root->appendChild(files); - SmTreeItem *covers = new SmTreeItem(16, root); - covers->setData(FileName, tr("Covers")); - root->appendChild(covers); - QLocale l; - filesQuery.exec(); - while(filesQuery.next()){ - QList<QVariant> data; - data << filesQuery.value(1); //filename - data << filesQuery.value(6); //partno - data << l.toString(filesQuery.value(3).toLongLong()); //displaysize - data << filesQuery.value(7); //quality - data << filesQuery.value(4); //dvdno - data << Helper::createArchivePath(filesQuery.value(1).toString(), filesQuery.value(2).toString()); //fullpath - data << filesQuery.value(3); //size - data << filesQuery.value(5); //filetype - data << filesQuery.value(2); //md5sum - data << filesQuery.value(0); //seriesparts_id - data << filesQuery.value(8); //files_id - data << filesQuery.value(10); //seriespart - QString displayName = QString("%1 %2").arg(filesQuery.value(9).toString()).arg(filesQuery.value(10).toString()); - data << displayName; - data << tr("N/A"); // duration or size - data << filesQuery.value(9).toString(); // series name - data << filesQuery.value(11); - QString fullPath = data.at(FullPath).toString(); - QFileInfo fi(fullPath); - switch(filesQuery.value(5).toInt()){ - case Movie:{ - if(fi.exists()){ - if(mPicsDurationCache.contains(fullPath)){ - data[SizeDuration] = mPicsDurationCache.value(fullPath); - SmTreeItem *item = new SmTreeItem(data, files); - files->appendChild(item); - break; - } - QList<QMap<QString, QString> > sInfo = streamInfo(fullPath); - for(int i = 0; i < sInfo.size(); ++i){ - QString duration = sInfo.at(i).value("duration"); - if(!duration.isEmpty() && (duration != "N/A")){ - QString durFromSeconds = Helper::durationFromSecs(duration.toFloat()); - mPicsDurationCache.insert(fullPath, durFromSeconds); - data[SizeDuration] = durFromSeconds; - } - } - } - SmTreeItem *item = new SmTreeItem(data, files); - files->appendChild(item); - break; - } - case FrontCover: - case BackCover: - case GeneralCover:{ - if(fi.exists()){ - if(mPicsDurationCache.contains(fullPath)){ - data[SizeDuration] = mPicsDurationCache.value(fullPath); - SmTreeItem *item = new SmTreeItem(data, files); - covers->appendChild(item); - break; - } - } - QMap<QString, QString> pInfo = pictureInfo(fullPath); - if(!pInfo.isEmpty()){ - QString setVal = QString("%1x%2").arg(pInfo.value("Width")).arg(pInfo.value("Height")); - mPicsDurationCache.insert(fullPath, setVal); - data[SizeDuration] = setVal; - } - SmTreeItem *item = new SmTreeItem(data, covers); - covers->appendChild(item); - break; - } - default: - ; - } - } - setRoot(root); -} diff --git a/filestreemodel.h b/filestreemodel.h deleted file mode 100644 index 3b7924b..0000000 --- a/filestreemodel.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - 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. -*/ - -#ifndef FILESTREEMODEL_H -#define FILESTREEMODEL_H - -#include <QSqlDatabase> -#include <QList> -#include <QHash> -#include <QMap> -#include <QColor> -#include <QIcon> - -#include "smtreemodel.h" - -class QSqlQuery; -class SeriesTreeModel; - -class FilesTreeModel : public SmTreeModel { - Q_OBJECT - public: - enum CustomRoles { FileNameRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, SizeRole = Qt::UserRole + 3, DvdNoRole = Qt::UserRole + 4, SizeDisplayRole = Qt::UserRole + 5, FileTypeRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, SeriesPartIdRole = Qt::UserRole + 9, QualityRole = Qt::UserRole + 10, FilesIdRole = Qt::UserRole + 11, SeriesPartRole = Qt::UserRole + 12, DisplayNameRole = Qt::UserRole + 13, SizeDurationRole = Qt::UserRole + 14, SeriesNameRole = Qt::UserRole + 15, FavoriteRole = Qt::UserRole + 16 }; - enum FileTypes { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4 }; - enum Fields { FileName = 0, PartNo = 1, SizeDisplay = 2, Quality = 3, DvdNo = 4, FullPath = 5, Size = 6, FileType = 7, Md5Sum = 8, SeriesPartId = 9, FilesId = 10, SeriesPart = 11, DisplayName = 12, SizeDuration = 13, SeriesName = 14, Favorite = 15 }; - enum Mode { Ids, Burn }; - explicit FilesTreeModel(QStringList &headers, QObject *parent = 0); - const QHash<int, QString> fileTypes() const { return mFileTypes; } - const QHash<int, QString> coverTypes() const { return mCoverTypes; } - const QHash<QString, int> editableColumns() const { return mEditableColumns; } - int mode() const { return mMode; } - void setMode(int mode) { mMode = mode; } - int displayMode() const { return mDisplayMode; } - void setDisplayMode(int mode) { mDisplayMode = mode; } - - //data + flags - void setIds(const QList<int> &seriesPartIds); - void setForBurn(); - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - Qt::ItemFlags flags(const QModelIndex &index) const; - QHash<QString, QString> filesBySeriesPartId(int seriesPartId) const; - QList<QMap<QString, QString> > streamInfo(const QModelIndex &idx) const; - QList<QMap<QString, QString> > streamInfo(const QString &path) const; - QMap<QString, QString> pictureInfo(const QString &path) const; - QMap<QString, QString> pictureInfo(const QModelIndex &idx) const; - QMap<QString, QString> pictureMetaInfo(const QModelIndex &idx); - int fileType(const QString &md5sum) const; - QModelIndex fileSizeLessThan(quint64 size) const; - - //file manipulation - bool addFile(const QString &fullPath, int type, int quality, int filePart, int seriesPartId, int dvd = -1); - bool deleteFile(const QModelIndex &file); - bool deleteFiles(const QList<QPersistentModelIndex> &files); - bool updateSeries(int newSeries, QList<QPersistentModelIndex> files); - - //misc - void readCache(); - void writeCache(); - - public slots: - void readSettings(); - void refresh(); - - private: - //functions - void populate(QSqlQuery &filesQuery); - - //database - QSqlDatabase mDb; - QSqlQuery *mUpdateDvdQuery; - QSqlQuery *mUpdateQualityQuery; - QSqlQuery *mUpdatePartNoQuery; - QSqlQuery *mUpdateFileTypeQuery; - QSqlQuery *mInsertFileQuery; - QSqlQuery *mFilesQuery; - QSqlQuery *mDeleteFileQuery; - QSqlQuery *mFileTypeQuery; - QSqlQuery *mUpdateSeriesPartQuery; - - //misc - QHash<int, QString> mFileTypes; - QHash<int, QString> mCoverTypes; - QHash<QString, QString> mPicsDurationCache; - QHash<QString, int> mEditableColumns; - SeriesTreeModel *mSeriesModel; - int mMode; - const int mMagic; - QColor mLocalColor; - QColor mArchivedColor; - QColor mFavoriteColor; - qint64 mDvdSize; - QList<int> mCurrentIds; - int mDisplayMode; -}; - -#endif // FILESTREEMODEL_H diff --git a/filestreewidget.cpp b/filestreewidget.cpp deleted file mode 100644 index e5af54d..0000000 --- a/filestreewidget.cpp +++ /dev/null @@ -1,611 +0,0 @@ -/* - 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 <QHBoxLayout> -#include <QVBoxLayout> -#include <QSettings> -#include <QMessageBox> -#include <QFile> -#include <QDir> -#include <QContextMenuEvent> -#include <QMenu> -#include <QLabel> -#include <QSpinBox> -#include <QPushButton> -#include <QProcess> -#include <QFileDialog> -#include <QSettings> -#include <QEvent> -#include <QSettings> -#include <QHeaderView> -#include <QInputDialog> -#include <QPainter> -#include <QTextDocument> -#include <QImage> -#include <QHash> -#include <QBrush> -#include <QColor> -#include <QPen> -#include <QDate> - -#include "filestreewidget.h" -#include "filepropertiesdialog.h" -#include "smglobals.h" -#include "filestreemodel.h" -#include "seriestreewidget.h" -#include "seriestreemodel.h" -#include "helper.h" -#include "pictureviewer2.h" -#include "filepropertiesdialog.h" -#include "hoverwindow.h" -#include "seriestreemodel.h" -#include "seriesmetadatamodel.h" -#include "framecache.h" - -FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent), mSelectedSize(0){ - //the view - mView = new FilesTreeView; - mView->setSelectionMode(QAbstractItemView::ExtendedSelection); - mView->setEditTriggers(QAbstractItemView::NoEditTriggers); - mModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - mProxy = new FilesTreeSortModel(this); - mProxy->setSourceModel(mModel); - mView->setModel(mProxy); - mView->setSortingEnabled(true); - mPropDlg = new FilePropertiesDialog(this); - QItemSelectionModel *selModel = mView->selectionModel(); - connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged())); - connect(mView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(itemDoubleClicked(QModelIndex))); - - //layout - QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addWidget(mView); - setLayout(mainLayout); - - //globals - mSeriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - mPictureViewer = SmGlobals::instance()->pictureViewer(); -} - -void FilesTreeWidget::resetSize(){ - mSelectedSize = 0; - emit selectedSize(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 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()){ - //create target dir acc. to seriesName - QString seriesName = seriesIdx.data(SeriesTreeModel::NameRole).toString(); - QString dirName = seriesName.replace(' ', "."); - QDir target(burnDir); - target.mkdir(dirName); - //move selected file - QString selSource = i.data(FilesTreeModel::FullPathRole).toString(); - QString selTarget = QString("%1/%2/%3").arg(burnDir).arg(dirName).arg(i.data(FilesTreeModel::FileNameRole).toString()); - QFile::rename(selSource, selTarget); - //copy covers - const QHash<QString, QString> 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); - int fileType = mModel->fileType(files.value(name)); - switch(fileType){ - case FilesTreeModel::FrontCover: - case FilesTreeModel::BackCover: - case FilesTreeModel::GeneralCover: - QFile::copy(sourceFile, targetFile); - break; - default: - ; - } - } - } - } - } -} - -void FilesTreeWidget::removeFiles(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QString message = QString(tr("<p>Really delete these file(s):</p><ul>")); - foreach(QModelIndex i, selected){ - message.append(QString(tr("<li>%1</li>")).arg(i.data(FilesTreeModel::FileNameRole).toString())); - } - message.append("</ul>"); - int retval = QMessageBox::critical(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); - if(retval == QMessageBox::Yes){ - QList<QPersistentModelIndex> realSelected; - foreach(QModelIndex i, selected){ - realSelected << mProxy->mapToSource(i); - } - mModel->deleteFiles(realSelected); - } -} - -void FilesTreeWidget::moveToDirectory(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QSettings s; - QString startDir = s.value("paths/selecteddir", QDir::homePath()).toString(); - QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), startDir); - if(!dir.isEmpty()){ - foreach(QModelIndex i, selected){ - QString source = i.data(FilesTreeModel::FullPathRole).toString(); - QString destination = QString("%1/%2").arg(dir).arg(i.data(FilesTreeModel::FileNameRole).toString()); - QFile::rename(source, destination); - } - } -} - -void FilesTreeWidget::fileProperties(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QModelIndex real = mProxy->mapToSource(selected.at(0)); - if(real.isValid()){ - int dvd = real.data(FilesTreeModel::DvdNoRole).toInt(); - if(dvd != -1){ - QMessageBox::critical(this, tr("Error"), tr("File is not available!")); - return; - } - QString fullPath = real.data(FilesTreeModel::FullPathRole).toString(); - QString mimeType = Helper::mimeType(fullPath); - mPropDlg->metaWidget()->setSeriesPartId(real.data(FilesTreeModel::SeriesPartIdRole).toInt()); - if(mimeType.startsWith("video")){ - QList<QMap<QString, QString> > fileData = mModel->streamInfo(real); - mPropDlg->setFileName(real.data(FilesTreeModel::FileNameRole).toString()); - mPropDlg->setStreamData(fileData); - }else if(mimeType.startsWith("image")){ - QMap<QString, QString> imageData = mModel->pictureInfo(real); - mPropDlg->addData("Image data", imageData); - QMap<QString, QString> textData = mModel->pictureMetaInfo(real); - if(!textData.isEmpty()){ - mPropDlg->addData("Meta data", textData); - } - int fileType = real.data(FilesTreeModel::FileTypeRole).toInt(); - QString fileTypeName = mModel->fileTypes().value(fileType); - QString seriesName = real.data(FilesTreeModel::SeriesNameRole).toString(); - QString seriesPart = QString::number(real.data(FilesTreeModel::SeriesPartRole).toInt()); - QString label = QString(tr("%1\n%2 for %3 %4")).arg(real.data(FilesTreeModel::FileNameRole).toString()).arg(fileTypeName).arg(seriesName).arg(seriesPart); - mPropDlg->setFileName(label); - } - mPropDlg->exec(); - } -} - -void FilesTreeWidget::edit(int column){ - QModelIndexList currentSel = mView->selectionModel()->selectedRows(); - if(currentSel.isEmpty()){ - return; - } - const QHash<QString, int> cols = mModel->editableColumns(); - if(!cols.values().contains(column)){ - return; - } - PersistenModelIndexList sIdxes; - foreach(QModelIndex idx, currentSel){ - QModelIndex pIdx = filesTree()->model()->index(idx.row(), column, idx.parent()); - if(pIdx.isValid()){ - sIdxes << mProxy->mapToSource(pIdx); - } - } - QString msg = cols.key(column); - if(column == FilesTreeModel::FileType){ - QStringList fileTypes = mModel->fileTypes().values(); - qSort(fileTypes); - int inputIdx = fileTypes.indexOf(sIdxes.first().data().toString()); - QString item = QInputDialog::getItem(this, msg, msg, fileTypes, inputIdx, false); - if(!item.isEmpty()){ - int fileTypeInt = mModel->fileTypes().key(item); - foreach(QModelIndex curIdx, sIdxes){ - mModel->setData(curIdx, fileTypeInt, Qt::EditRole); - } - } - return; - } - bool dialogOk = false; - int value = -1; - if(column == FilesTreeModel::PartNo){ - value = QInputDialog::getInt(this, msg, msg, sIdxes.first().data().toInt(), -1, 2147483647, 1, &dialogOk); - } - if(column == FilesTreeModel::Quality){ - value = QInputDialog::getInt(this, msg, msg, sIdxes.first().data().toInt(), -1, 10, 1, &dialogOk); - } - if(column == FilesTreeModel::DvdNo){ - int nextDvdNo = mSeriesModel->findNextDvdNo(); - value = QInputDialog::getInt(this, msg, msg, nextDvdNo, -1, 2147483647, 1, &dialogOk); - } - if(dialogOk){ - foreach(QModelIndex curIdx, sIdxes){ - mModel->setData(curIdx, value, Qt::EditRole); - } - mModel->refresh(); - mView->expandAll(); - } -} - -void FilesTreeWidget::suggest(){ - QModelIndexList currentSel = mView->selectionModel()->selectedRows(); - if(currentSel.isEmpty()){ - return; - } - qint64 size = 0; - foreach(QModelIndex curIdx, currentSel){ - qint64 curSize = curIdx.data(FilesTreeModel::SizeRole).value<qint64>(); - size += curSize; - } - qint64 dvdSize = SmGlobals::instance()->dvdSize(); - if(size > dvdSize){ - QMessageBox::critical(this, tr("Error"), tr("File too big for a single DVD")); - return; - } - qint64 neededSize = dvdSize - size; - QModelIndex candidate = mModel->fileSizeLessThan(neededSize); - QModelIndex real = mProxy->mapFromSource(candidate); - if(!real.isValid() || mView->selectionModel()->isSelected(real)){ - QMessageBox::critical(this, tr("Error"), tr("Out of suggestions!")); - return; - } - mView->selectionModel()->select(real, QItemSelectionModel::Select | QItemSelectionModel::Rows); - mView->scrollTo(real, QAbstractItemView::PositionAtCenter); -} - -void FilesTreeWidget::playSelected(){ - QStringList fullPaths; - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - foreach(QModelIndex idx, selected){ - fullPaths << idx.data(FilesTreeModel::FullPathRole).toString(); - } - playItems(fullPaths); -} - -void FilesTreeWidget::moveToSeries(){ - SeriesTreeWidget *vWidget = SmGlobals::instance()->seriesTreeWidget(); - QModelIndex sel = vWidget->seriesTree()->selectionModel()->currentIndex(); - QModelIndex real = vWidget->seriesProxy()->mapToSource(sel); - QModelIndexList nfiles = mView->selectionModel()->selectedRows(); - QList<QPersistentModelIndex> files; - foreach (QModelIndex i, nfiles){ - files << i; - } - FileMoveDialog fmd(real, files, 0, 0); - fmd.exec(); -} - -void FilesTreeWidget::fileSelectionChanged(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - qint64 selSize = 0; - QStringList selectedSeries; - foreach(QModelIndex idx, selected){ - selSize += idx.data(FilesTreeModel::SizeRole).toLongLong(); - int seriesPartId = idx.data(FilesTreeModel::SeriesPartIdRole).toInt(); - int seriesId = mSeriesModel->seriesIdByPartId(seriesPartId); - QModelIndex seriesIdx = mSeriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId); - if(seriesIdx.isValid()){ - QModelIndex seriesPartIdx = mSeriesModel->findValue(seriesPartId, seriesIdx, SeriesTreeModel::SeriesPartId, SeriesTreeModel::Name); - QString seriesString = seriesPartIdx.data().toString(); - if(!selectedSeries.contains(seriesString)){ - selectedSeries << seriesString; - } - } - } - emit selectedSize(selSize); - emit numSelected(selected.size()); - emit statusMessage(QString(tr("Series: %1")).arg(selectedSeries.join(","))); -} - -void FilesTreeWidget::itemDoubleClicked(const QModelIndex &index){ - QString file = index.data(FilesTreeModel::FullPathRole).toString(); - QFileInfo fi(file); - if(fi.exists()){ - QString mimeType = Helper::mimeType(file); - if(mimeType.startsWith("image")){ - mPictureViewer->setFile(file); - mPictureViewer->show(); - return; - }else if(mimeType.startsWith("video")){ - playItems(QStringList() << file); - } - }else{ - QString msg = QString(tr("File %1 not found!")).arg(file); - QMessageBox::critical(this, tr("Error"), msg); - } -} - -void FilesTreeWidget::playItems(const QStringList &paths){ - if(paths.isEmpty()){ - return; - } - QStringList existing; - foreach(QString p, paths){ - QFileInfo fi(p); - if(fi.exists()){ - existing << p; - } - } - if(existing.isEmpty()){ - return; - } - QPair<QString, QStringList> pData = Helper::programData("movieviewer", QString()); - QString prog = pData.first; - QStringList args = pData.second; - args << existing; - QProcess::startDetached(prog, args); -} - -FilesTreeView::FilesTreeView(QWidget *parent) : SmTreeView("ui/headerpos", parent), mHoverPics(false){ - setAttribute(Qt::WA_Hover); - mHoverWin = new HoverWindow(this); -} - -void FilesTreeView::readSettings(){ - QSettings s; - mHoverPics = s.value("ui/hoverpics", true).toBool(); - mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); - mHoverMovies = s.value("ui/hovermovies", true).toBool(); - mCursorOffest = s.value("ui/cursoroffset").toInt(); - readHeaderConfig(); -} - -void FilesTreeView::writeSettings(){ - writeHeaderConfig(); -} - -void FilesTreeView::contextMenuEvent(QContextMenuEvent *event){ - mHoverWin->hide(); - QMenu ctxMenu; - foreach(QAction *a, actions()){ - ctxMenu.addAction(a); - } - ctxMenu.exec(event->globalPos()); -} - -bool FilesTreeView::event(QEvent *e){ - QHoverEvent *hEvent = static_cast<QHoverEvent*>(e); - if(!hEvent){ - return SmTreeView::event(e); - } - QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() + mCursorOffest); - QModelIndex curIdx = indexAt(hotSpot); - /* - The whole point of this if/then/else mess is to exit as early as possible - for performance reasons. We don't want the cpu to spin at 100% only - because something _could_ happen... - */ - if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ - if(!curIdx.isValid() || (!curIdx.column() == 0)){ - return exitHover(); - } - bool toInt; - int fileType = curIdx.data(FilesTreeModel::FileTypeRole).toInt(&toInt); - if(!toInt){ - return exitHover(); - } - if(fileType == FilesTreeModel::Movie){ - if(!mHoverMovies){ - return exitHover(); - } - }else{ - if(!mHoverPics){ - return exitHover(); - } - } - } - if(e->type() == QEvent::HoverEnter){ - doHover(curIdx); - return true; - } - if(e->type() == QEvent::HoverMove){ - if(curIdx != mCurHover){ - doHover(curIdx); - return true; - }else{ - mHoverWin->setPos(); - return true; - } - } - if(e->type() == QEvent::HoverLeave){ - return exitHover(); - } - return SmTreeView::event(e); -} - -bool FilesTreeView::exitHover(bool exitVal){ - mHoverWin->setVisible(false); - mCurHover = QModelIndex(); - return exitVal; -} - -void FilesTreeView::doHover(const QModelIndex &idx){ - QPixmap pm; - bool scale = true; - mCurHover = idx; - if(idx.data(FilesTreeModel::FileTypeRole).toInt() == FilesTreeModel::Movie){ - pm = SmGlobals::instance()->frameCache()->entry(idx.data(FilesTreeModel::FullPathRole).toString()); - if(pm.isNull()){ - return; - } - scale = false; - FilesTreeModel *filesModel = qobject_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - if(filesModel->displayMode() == FilesTreeModel::Burn){ - QString filesData = fileNameText(idx); - pm = annotateHover(pm, filesData); - } - QString metaData = metaDataText(idx); - if(!metaData.isEmpty()){ - pm = annotateHover(pm, metaData); - } - scale = false; - }else{ - if(!pm.load(idx.data(FilesTreeModel::FullPathRole).toString())){ - return; - } - } - mHoverWin->setPixmap(pm, scale); - mHoverWin->setCaption(idx.data(FilesTreeModel::FileNameRole).toString()); - mHoverWin->setPos(); - mHoverWin->setVisible(true); -} - -const QString FilesTreeView::fileNameText(const QModelIndex &idx) const{ - SeriesTreeModel *seriesModel = qobject_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - int seriesId = seriesModel->seriesIdByPartId(idx.data(FilesTreeModel::SeriesPartIdRole).toInt()); - if(seriesId == -1){ - return QString(); - } - QModelIndex seriesIdx = seriesModel->findValue(seriesId, QModelIndex(), SeriesTreeModel::SeriesId); - if(!seriesIdx.isValid()){ - return QString(); - } - FilesTreeModel *filesModel = qobject_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - QHash<QString, QString> files = filesModel->filesBySeriesPartId(idx.data(FilesTreeModel::SeriesPartIdRole).toInt()); - QModelIndex seriesPartIdx = seriesModel->findValue(idx.data(FilesTreeModel::SeriesPartIdRole), seriesIdx, SeriesTreeModel::SeriesPartId, SeriesTreeModel::Name); - QString retval = QString(tr("<p style=\"text-decoration: underline; font-weight: bold\">%1</p>")).arg(seriesPartIdx.data().toString()); - retval.append(QString(tr("<p style=\"margin-bottom: 0px; padding-bottom: 0px\">Files:</p>"))); - retval.append(tr("<ul style=\"margin-top: 0px\">")); - QHash<QString, QString>::const_iterator it = files.constBegin(); - while(it != files.constEnd()){ - retval.append(QString("<li style=\"margin-left: -10px\">%1</li>").arg(it.key())); - ++it; - } - retval.append(tr("</ul>")); - return retval; -} - -const QString FilesTreeView::metaDataText(const QModelIndex &idx) const{ - if(!idx.isValid()){ - return QString(); - } - SeriesMetadataModel *metaDataModel = qobject_cast<SeriesMetadataModel*>(SmGlobals::instance()->model("SeriesMetadata")); - int seriesPartId = idx.data(FilesTreeModel::SeriesPartIdRole).toInt(); - if(!metaDataModel->hasRecord(seriesPartId)){ - return QString(); - } - metaDataModel->populate(seriesPartId); - QModelIndex mdIdx = metaDataModel->index(0, 0, QModelIndex()); - QList<QVariant> metaData = metaDataModel->dataList(mdIdx); - QString retval("<p style=\"text-decoration: underline; font-weight: bold; margin-bottom: 10px\">Metadata</p><p style=\"margin-left: 20px\"><table>"); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Release Year</span></td><td>%1</td></tr>")).arg(QString::number(metaData.at(SeriesMetadataModel::ReleaseYear).toInt()))); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Encoding Passes</span></td><td>%1</td></tr>")).arg(QString::number(metaData.at(SeriesMetadataModel::Passes).toInt()))); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Release Group</span></td><td>%1</td></tr>")).arg(metaData.at(SeriesMetadataModel::ReleaseGroup).toString())); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Source Medium</span></td><td>%1</td></tr>")).arg(metaData.at(SeriesMetadataModel::SourceMedium).toString())); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Usenet Subject</span></td><td>%1</td></tr>")).arg(metaData.at(SeriesMetadataModel::Subject).toString())); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Encoder Options</span></td><td>%1</td></tr>")).arg(metaData.at(SeriesMetadataModel::EncoderOpts).toString())); - QDate dateAdded = metaData.at(SeriesMetadataModel::Added).toDate(); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Added</span></td><td>%1</td></tr>")).arg(dateAdded.toString(Qt::ISODate))); - retval.append(QString(tr("<tr><td style=\"padding-right: 20px\"><span style=\"font-style: italic;\">Comment</span></td><td>%1</td></tr>")).arg(metaData.at(SeriesMetadataModel::Comment).toString())); - retval.append("</table></p>"); - return retval; -} - -const QPixmap FilesTreeView::annotateHover(const QPixmap &hoverImage, const QString &text) const{ - QTextDocument doc; - doc.setHtml(text); - doc.setTextWidth(hoverImage.width()); - QSize newPicSize(hoverImage.width(), hoverImage.height() + doc.size().height()); - QImage retImg(newPicSize, QImage::Format_ARGB32_Premultiplied); - retImg.fill(0); - QPainter p(&retImg); - p.drawPixmap(0, 0, hoverImage); - p.setRenderHint(QPainter::Antialiasing, false); - p.setRenderHint(QPainter::TextAntialiasing, true); - QColor bgColor(Qt::white); - bgColor.setAlpha(70); - QBrush brush(bgColor); - p.setPen(QPen(Qt::NoPen)); - p.setBrush(brush); - QRect annotateRect(0, hoverImage.height(), hoverImage.width(), doc.size().height()); - p.drawRect(annotateRect); - p.setPen(QPen(Qt::black)); - p.translate(0, hoverImage.height()); - doc.drawContents(&p); - return QPixmap::fromImage(retImg); -} - - -FilesTreeSortModel::FilesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {} - -// left + right are from the sourceModel() !!!! -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(); - } - if(left.column() == FilesTreeModel::DisplayName){ - if(left.data(FilesTreeModel::SeriesNameRole) == right.data(FilesTreeModel::SeriesNameRole)){ - return left.data(FilesTreeModel::SeriesPartRole).toInt() < right.data(FilesTreeModel::SeriesPartRole).toInt(); - } - } - return QSortFilterProxyModel::lessThan(left, right); -} - -FileMoveDialog::FileMoveDialog(QPersistentModelIndex selected, QList<QPersistentModelIndex> files, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mFiles(files){ - QLabel *l1 = new QLabel(tr("Select destination")); - QVBoxLayout *selectionLayout = new QVBoxLayout; - selectionLayout->addWidget(l1); - mTree = new SmTreeView; - mModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - mTree->setModel(mModel); - selectionLayout->addWidget(mTree); - for(int i = 1; i < SeriesTreeModel::NumFields; ++i){ - mTree->setColumnHidden(i, true); - } - mTree->resizeColumnToContents(0); - mTree->setAlternatingRowColors(true); - mTree->expand(selected); - mTree->scrollTo(selected, QAbstractItemView::PositionAtTop); - QHBoxLayout *buttonLayout = new QHBoxLayout; - mOk = new QPushButton(tr("Ok")); - connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); - mCancel = new QPushButton(tr("Cancel")); - connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); - buttonLayout->setAlignment(Qt::AlignRight); - buttonLayout->addWidget(mOk); - buttonLayout->addWidget(mCancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(selectionLayout); - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); -} - -void FileMoveDialog::accept(){ - if(mFiles.isEmpty()){ - return; - } - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - int newSeriesIdx = mTree->selectionModel()->currentIndex().data(SeriesTreeModel::SeriesPartIdRole).toInt(); - filesModel->updateSeries(newSeriesIdx, mFiles); - QDialog::accept(); -} diff --git a/filestreewidget.h b/filestreewidget.h deleted file mode 100644 index abb2872..0000000 --- a/filestreewidget.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - 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. -*/ - -#ifndef FILESTREEWIDGET_H -#define FILESTREEWIDGET_H - -#include <QtWidgets/QWidget> -#include <QtWidgets/QDialog> -#include <QPersistentModelIndex> -#include <QSortFilterProxyModel> - -#include "smtreeview.h" - -typedef QList<QPersistentModelIndex> PersistenModelIndexList; - -class FilesTreeView; -class FilesTreeModel; -class FilePropertiesDialog; -class FilesTreeSortModel; -class SeriesTreeModel; -class PictureViewer2; -class HoverWindow; -class QContextMenuEvent; -class QSpinBox; -class QPushButton; -class QEvent; - -class FilesTreeWidget : public QWidget { - Q_OBJECT - public: - explicit FilesTreeWidget(QWidget *parent = 0); - FilesTreeView *filesTree() { return mView; } - void resetSize(); - - public slots: - void moveToBurn(); - void removeFiles(); - void moveToDirectory(); - void fileProperties(); - void edit(int column); - void suggest(); - void playSelected(); - void moveToSeries(); - - private slots: - void fileSelectionChanged(); - void itemDoubleClicked(const QModelIndex &index); - - signals: - void selectedSize(qint64); - void numSelected(int); - void statusMessage(QString); - - private: - void playItems(const QStringList &paths); - FilesTreeView *mView; - FilesTreeModel *mModel; - FilesTreeSortModel *mProxy; - SeriesTreeModel *mSeriesModel; - PictureViewer2 *mPictureViewer; - QModelIndexList mSelectedFiles; - FilePropertiesDialog *mPropDlg; - qint64 mSelectedSize; -}; - -class FilesTreeView : public SmTreeView { - Q_OBJECT - public: - explicit FilesTreeView(QWidget *parent = 0); - - public slots: - void readSettings(); - void writeSettings(); - - protected: - virtual void contextMenuEvent(QContextMenuEvent *event); - virtual bool event(QEvent *event); - - private: - bool exitHover(bool exitVal = true); - void doHover(const QModelIndex &idx); - const QString fileNameText(const QModelIndex &idx) const; - const QString metaDataText(const QModelIndex &idx) const; - const QPixmap annotateHover(const QPixmap &hoverImage, const QString &text) const; - QModelIndex mCurHover; - HoverWindow *mHoverWin; - bool mHoverPics; - bool mHoverMovies; - qint16 mCursorOffest; -}; - -class FilesTreeSortModel : public QSortFilterProxyModel { - Q_OBJECT - public: - FilesTreeSortModel(QObject *parent = 0); - ~FilesTreeSortModel() {} - - protected: - virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; -}; - -class FileMoveDialog : public QDialog { - Q_OBJECT - public: - explicit FileMoveDialog(QPersistentModelIndex selected, QList<QPersistentModelIndex> files, QWidget *parent = 0, Qt::WindowFlags f = 0); - - public slots: - virtual void accept(); - - private: - QPushButton *mOk; - QPushButton *mCancel; - SmTreeView *mTree; - SeriesTreeModel *mModel; - QList<QPersistentModelIndex> mFiles; -}; -#endif diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp index 11d87c4..f537fff 100644 --- a/newmoviewizard.cpp +++ b/newmoviewizard.cpp @@ -26,11 +26,9 @@ #include "newmoviewizard.h" #include "smtreeitem.h" -#include "seriestreemodel.h" #include "smglobals.h" #include "mappingtablemodel.h" #include "seriesmetadatamodel.h" -#include "filestreemodel.h" #include "delegates.h" #include "helper.h" #include "pictureviewer2.h" diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp deleted file mode 100644 index ac1a381..0000000 --- a/seriestreemodel.cpp +++ /dev/null @@ -1,668 +0,0 @@ -/* - 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 <QSqlQuery> -#include <QSqlError> -#include <QIcon> -#include <QFile> -#include <QFileInfo> -#include <QRegExp> -#include <QSettings> - -#include "seriestreemodel.h" -#include "smtreeitem.h" -#include "helper.h" - -SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mRowFilter(All) { - mDb = QSqlDatabase::database("treedb"); - mSeriesPartsQuery = new QSqlQuery(mDb); - mSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); - mUpdateSeriesIdQuery = new QSqlQuery(mDb); - mUpdateSeriesIdQuery->prepare("UPDATE seriesparts SET iseries_id = :newid WHERE iseries_id = :oldid"); - mUpdateSeriesNameQuery = new QSqlQuery(mDb); - mUpdateSeriesNameQuery->prepare("UPDATE series SET tseries_name = :newname WHERE iseries_id = :id"); - mDeleteSeriesQuery = new QSqlQuery(mDb); - mDeleteSeriesQuery->prepare("DELETE FROM series where iseries_id = :id"); - mDeleteSeriesPartQuery = new QSqlQuery(mDb); - mDeleteSeriesPartQuery->prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id"); - mSeriesInsertQuery = new QSqlQuery(mDb); - mSeriesInsertQuery->prepare("INSERT INTO series(tseries_name) VALUES(:name)"); - mSeriesFilesQuery = new QSqlQuery(mDb); - mSeriesFilesQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM series, seriesparts, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id"); - mSeriesPartFilesQuery = new QSqlQuery(mDb); - mSeriesPartFilesQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM seriesparts, files WHERE seriesparts.iseriesparts_id = :id AND seriesparts.iseriesparts_id = files.iseriespart_id"); - mSeriesPartInsertQuery = new QSqlQuery(mDb); - mSeriesPartInsertQuery->prepare("INSERT INTO seriesparts(iseriespart, iseries_id, tsubtitle) VALUES(:part, :id, :subtitle)"); - mSortedMovieListQuery = new QSqlQuery(mDb); - mSortedMovieListQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM series, seriesparts, files WHERE series.iseries_id = :id AND seriesparts.iseries_id = series.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.sifiletype = 1 ORDER BY seriesparts.iseriespart, files.sifileno"); - mNextDvdNoQuery = new QSqlQuery(mDb); - mNextDvdNoQuery->prepare("SELECT MAX(idvd) FROM files"); - mGenreFilterQuery = new QSqlQuery(mDb); - mGenreFilterQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_genremap, genres where tgenrename LIKE :pat AND genres.igenres_id = seriesparts_genremap.igenres_id AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id"); - mFavoriteSeriesIdQuery = new QSqlQuery(mDb); - mFavoriteSeriesIdQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts WHERE seriesparts.bfavorite = true and seriesparts.iseries_id = series.iseries_id"); - mFavoriteSeriesPartsQuery = new QSqlQuery(mDb); - mFavoriteSeriesPartsQuery->prepare("SELECT iseriesparts_id, iseriespart, tsubtitle FROM seriesparts WHERE iseries_id = :id AND bfavorite = true"); - mUpdateGenericTemplate = QString("UPDATE seriesparts SET %1 = :value WHERE iseriesparts_id = :id"); - mIsLocalQuery = new QSqlQuery(mDb); - mIsLocalQuery->prepare("SELECT COUNT(*) FROM files WHERE iseriespart_id = :id AND sifiletype = 1 AND idvd = -1"); - mUpdateGenericMap.insert(Favorite, "bfavorite"); - mUpdateGenericMap.insert(Subtitle, "tsubtitle"); - mUpdateGenericMap.insert(SeriesPart, "iseriespart"); - populate(); -} - -Qt::ItemFlags SeriesTreeModel::flags(const QModelIndex &index) const{ - if(!index.isValid()){ - return 0; - } - Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if(index.data(TypeRole).toInt() == Series || index.data(TypeRole).toInt() == NewSeries){ - return retval | Qt::ItemIsEditable; - } - return retval; -} - -QVariant SeriesTreeModel::data(const QModelIndex &index, int role) const{ - if(!index.isValid()){ - return QVariant(); - } - - SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); - - if(role == Qt::DisplayRole){ - if(index.column() == Name){ - int type = index.data(TypeRole).toInt(); - if(type == Series || type == NewSeries){ - return item->data(Name); - }else if(type == Part){ - QString retval = item->data(Name).toString(); - if(item->data(SeriesPart).toInt() > 0){ - retval = QString("%1 %2").arg(retval).arg(item->data(SeriesPart).toInt()); - } - QString subtitle = item->data(Subtitle).toString(); - if(!subtitle.isEmpty()){ - retval = QString("%1 - %2").arg(retval).arg(subtitle); - } - return retval; - }else{ - return QVariant(); - } - }else{ - return item->data(index.column()); - } - } - if(role == Qt::DecorationRole){ - if(index.column() == 0){ - return decorationIcon(); - } - } - if(role == Qt::ForegroundRole){ - if(item->data(Favorite).toBool()){ - return mFavoriteColor; - } - } - if(role == Qt::EditRole){ - if(index.data(TypeRole) == Series || index.data(TypeRole) == NewSeries){ - if(index.column() == 0){ - return item->data(Name); - } - } - } - if(role == NameRole){ - return item->data(Name); - } - if(role == SeriesIdRole){ - return item->data(SeriesId); - } - if(role == SeriesPartIdRole){ - return item->data(SeriesPartId); - } - if(role == SeriesPartRole){ - return item->data(SeriesPart); - } - if(role == TypeRole){ - return item->data(Type); - } - if(role == FavoriteRole){ - return item->data(Favorite); - } - if(role == SubtitleRole){ - return item->data(Subtitle); - } - if(role == IsLocalRole){ - return item->data(IsLocal); - } - return QVariant(); -} - -bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ - if(!index.isValid()){ - return false; - } - if(role == Qt::EditRole){ - if(index.column() == Name){ - if(index.data(TypeRole).toInt() == Series){ - //change of series name - if(index.column() == Name){ - QModelIndex newSeries = findValue(value, index.parent(), index.column()); - if(newSeries == index){ - //no change made, exit gracefully - return false; - } - if(newSeries != QModelIndex()){ - //series already exists, merge - return mergeSeries(index, newSeries); - }else{ - //rename series - return renameSeries(index, value); - } - } - } - }else if(index.column() == IsLocal){ - setLocal(index, value); - }else if(index.data(TypeRole).toInt() == NewSeries){ - return setNewSeries(index, value); - }else{ - return updateGeneric(index, value); - } - } - return false; -} - -QList<QVariant> SeriesTreeModel::childrenColumnList(const QModelIndex &parent, int column) const{ - if(!parent.isValid()){ - return QList<QVariant>(); - } - SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer()); - QList<QVariant> retval; - for(int i = 0; i < item->childCount(); ++i){ - SmTreeItem *child = item->child(i); - retval << child->data(column); - } - return retval; -} - -QModelIndex SeriesTreeModel::findValue(const QVariant &value, const QModelIndex &parent, int searchColumn, int indexColumn) const{ - SmTreeItem *parentItem = root(); - if(parent != QModelIndex()){ - parentItem = static_cast<SmTreeItem*>(parent.internalPointer()); - } - for(int i = 0; i < parentItem->childCount(); ++i){ - SmTreeItem *childItem = parentItem->child(i); - if(value == childItem->data(searchColumn)){ - if(indexColumn == -1){ - return createIndex(i, searchColumn, childItem); - }else{ - return createIndex(i, indexColumn, childItem); - } - } - } - return QModelIndex(); -} - -QFileInfoList SeriesTreeModel::findFiles(const QModelIndex &where) const{ - int type = where.data(TypeRole).toInt(); - QFileInfoList retval; - - QSqlQuery *query = 0; - if(type == Series){ - query = mSeriesFilesQuery; - query->bindValue(":id", where.data(SeriesIdRole)); - }else if(type == Part){ - query = mSeriesPartFilesQuery; - query->bindValue(":id", where.data(SeriesPartIdRole)); - } - - if(query){ - if(query->exec()){ - while(query->next()){ - QString path = Helper::createArchivePath(query->value(0).toString(), query->value(1).toString()); - retval << QFileInfo(path); - } - } - } - - return retval; -} - -QFileInfoList SeriesTreeModel::findMovies(const QModelIndexList &from) const{ - if(from.isEmpty()){ - return QFileInfoList(); - } - QFileInfoList retval; - foreach(QModelIndex idx, from){ - QFileInfoList files = findFiles(idx); - foreach(QFileInfo fi, files){ - QString mime = Helper::mimeType(fi.absoluteFilePath()); - if(mime.startsWith("video")){ - if(!retval.contains(fi)){ - retval << fi; - } - } - } - } - return retval; -} - -QFileInfoList SeriesTreeModel::findSortedMovies(const QModelIndex &from) const{ - if(!from.isValid()){ - return QFileInfoList(); - } - QFileInfoList retval; - int seriesId = from.data(SeriesIdRole).toInt(); - mSortedMovieListQuery->bindValue(":id", seriesId); - if(mSortedMovieListQuery->exec()){ - while(mSortedMovieListQuery->next()){ - QString path = Helper::createArchivePath(mSortedMovieListQuery->value(0).toString(), mSortedMovieListQuery->value(1).toString()); - retval << QFileInfo(path); - } - } - return retval; -} - -bool SeriesTreeModel::hasLocals(int sPartId) const { - bool retval = false; - mIsLocalQuery->bindValue(":id", sPartId); - mIsLocalQuery->exec(); - while(mIsLocalQuery->next()){ - retval = mIsLocalQuery->value(0).toBool(); - } - return retval; -} - -int SeriesTreeModel::seriesIdByPartId(int partId){ - if(mSeriesPartSeriesMap.contains(partId)){ - return mSeriesPartSeriesMap.value(partId); - } - return -1; -} - -int SeriesTreeModel::findNextDvdNo() const{ - int dvdno = 0; - mNextDvdNoQuery->exec(); - while(mNextDvdNoQuery->next()){ - dvdno = mNextDvdNoQuery->value(0).toInt(); - } - return ++dvdno; -} - -bool SeriesTreeModel::deleteFromSeries(const QModelIndex &what){ - int nodeType = what.data(TypeRole).toInt(); - QSqlQuery *query = 0; - if(nodeType == Series || nodeType == NewSeries){ - query = mDeleteSeriesQuery; - query->bindValue(":id", what.data(SeriesIdRole)); - }else if(nodeType == Part){ - query = mDeleteSeriesPartQuery; - query->bindValue(":id", what.data(SeriesPartIdRole)); - } - if(query){ - QFileInfoList files = findFiles(what); - if(query->exec()){ - foreach(QFileInfo fi, files){ - QFile::remove(fi.absoluteFilePath()); - } - removeRows(what.row(), 1, what.parent()); - return true; - } - } - return false; -} - -bool SeriesTreeModel::addSeries(const QVariant &seriesName, const QModelIndex &parent){ - const QString name = seriesName.toString().toLower().trimmed(); - if(name.isEmpty()){ - return false; - } - mDb.transaction(); - mSeriesInsertQuery->bindValue(":name", name); - if(mSeriesInsertQuery->exec()){ - QSqlQuery lastId("SELECT currval('series_iseries_id__seq')", mDb); - if(lastId.next()){ - int id = lastId.value(0).toInt(); - QList<QVariant> seriesData; - seriesData << name << id << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - if(addRow(seriesData, parent)){ - mDb.commit(); - return true; - } - } - } - mDb.rollback(); - return false; -} - -bool SeriesTreeModel::addSeriesPart(int seriesPart, const QModelIndex &parent, const QString &subTitle){ - if(!parent.isValid() || parent.data(TypeRole) != Series){ - return false; - } - int seriesId = parent.data(SeriesIdRole).toInt(); - mDb.transaction(); - if(seriesPart > 0){ - mSeriesPartInsertQuery->bindValue(":part", seriesPart); - }else{ - QSqlQuery nextNegValQuery("SELECT nextval('seriesparts_iseriespart__seq')", mDb); - if(nextNegValQuery.next()){ - seriesPart = nextNegValQuery.value(0).toInt(); - mSeriesPartInsertQuery->bindValue(":part", seriesPart); - } - } - mSeriesPartInsertQuery->bindValue(":id", seriesId); - mSeriesPartInsertQuery->bindValue(":subtitle", subTitle.toLower()); - if(mSeriesPartInsertQuery->exec()){ - QSqlQuery lastId("SELECT currval('seriesparts_seriesparts_id__seq')", mDb); - if(lastId.next()){ - int id = lastId.value(0).toInt(); - QList<QVariant> partData; - partData << parent.data(NameRole) << seriesId << id << seriesPart << Part << false << subTitle << true; - if(addRow(partData, parent)){ - mDb.commit(); - mSeriesPartSeriesMap.insert(id, seriesId); - return true; - } - } - } - mDb.rollback(); - return false; -} - -void SeriesTreeModel::clearFilter(){ - populate(); -} - -void SeriesTreeModel::setMappingFilter(const QString &filter, const QString &table){ - QString pattern = QString("%%1%").arg(filter); - QString tableIdTemplate = QString("SELECT i%1s_id FROM %1s WHERE t%1name LIKE :pat").arg(table); - QSqlQuery tableIdQuery(mDb); - tableIdQuery.prepare(tableIdTemplate); - tableIdQuery.bindValue(":pat", pattern); - if(tableIdQuery.exec()){ - mSeriesPartSeriesMap.clear(); - QStringList ids; - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(tableIdQuery.next()){ - ids << QString::number(tableIdQuery.value(0).toInt()); - } - if(ids.isEmpty()){ - return; - } - QString seriesPartsTemplate("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, seriesparts_%1map WHERE seriesparts.iseries_id = :id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts_%1map.i%1s_id IN (%2) ORDER BY iseriespart"); - QString seriesIdTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_%1map, %1s WHERE %1s.i%1s_id IN (%2) AND %1s.i%1s_id = seriesparts_%1map.i%1s_id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(table).arg(ids.join(",")); - QSqlQuery seriesIdQuery(seriesIdTemplate, mDb); - while(seriesIdQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - QString partsQueryString = seriesPartsTemplate.arg(table).arg(ids.join(",")); - QSqlQuery partsQuery(mDb); - partsQuery.prepare(partsQueryString); - partsQuery.bindValue(":id", seriesIdQuery.value(0)); - partsQuery.exec(); - while(partsQuery.next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2) << partsQuery.value(3); - partData << hasLocals(partsQuery.value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column, int queryType){ - QSqlQuery seriesIdQuery(mDb); - QString partsQueryTemplate; - QString op("="); - QVariant value = filter; - if(queryType == TextQuery){ - QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 LIKE :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column); - seriesIdQuery.prepare(idQueryTemplate); - value = QString("%%1%").arg(filter); - seriesIdQuery.bindValue(":value", value); - partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 LIKE :value"); - }else if(queryType == NumericQuery){ - QRegExp valRe("([<>=]?)\\s*(\\d+)\\s*(\\w*)"); - (void)valRe.indexIn(value.toString()); - QStringList capText = valRe.capturedTexts(); - op = capText.at(1).isEmpty() ? op : capText.at(1); - value = Helper::bytesFromUnit(capText.at(2), capText.at(3)); - QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 %2 :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column).arg(op); - seriesIdQuery.prepare(idQueryTemplate); - seriesIdQuery.bindValue(":value", value); - partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 %2 :value"); - }else{ - return; - } - if(seriesIdQuery.exec()){ - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(seriesIdQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - QString partsQueryString; - if(queryType == TextQuery){ - partsQueryString = partsQueryTemplate.arg(column); - value = QString("%%1%").arg(value.toString()); - }else{ - partsQueryString = partsQueryTemplate.arg(column).arg(op); - } - QSqlQuery partsQuery(mDb); - partsQuery.prepare(partsQueryString); - partsQuery.bindValue(":id", seriesIdQuery.value(0)); - partsQuery.bindValue(":value", value); - if(partsQuery.exec()){ - while(partsQuery.next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part << partsQuery.value(2) << partsQuery.value(3); - partData << hasLocals(partsQuery.value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); - } - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::setFavoriteFilter(){ - if(mFavoriteSeriesIdQuery->exec()){ - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(mFavoriteSeriesIdQuery->next()){ - QList<QVariant> seriesData; - seriesData << mFavoriteSeriesIdQuery->value(1) << mFavoriteSeriesIdQuery->value(0) << QVariant() << QVariant() << Series << false << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - mFavoriteSeriesPartsQuery->bindValue(":id", seriesData.at(1)); - if(mFavoriteSeriesPartsQuery->exec()){ - while(mFavoriteSeriesPartsQuery->next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << mFavoriteSeriesPartsQuery->value(0) << mFavoriteSeriesPartsQuery->value(1) << Part << true << mFavoriteSeriesPartsQuery->value(2); - partData << hasLocals(mFavoriteSeriesPartsQuery->value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(mFavoriteSeriesPartsQuery->value(0).toInt(), seriesData.at(1).toInt()); - } - } - } - setRoot(rootItem); - } -} - -void SeriesTreeModel::readSettings(){ - QSettings s; - QVariant fc = s.value("ui/favoritecolor"); - mFavoriteColor = fc.value<QColor>(); - conditionalUpdate(index(0, 0, QModelIndex()), Favorite, true); -} - -void SeriesTreeModel::conditionalUpdate(const QModelIndex &parent, int field, const QVariant &value){ - if(!parent.isValid()){ - return; - } - SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer()); - if(item->childCount() > 0){ - //series - for(int i = 0; i < item->childCount(); ++i){ - QModelIndex newParent = parent.child(i, field); - if(newParent.isValid()){ - conditionalUpdate(newParent, field, value); - } - } - }else{ - //seriespart - if(item->data(field) == value){ - QModelIndex start = index(parent.row(), 0, parent.parent()); - emit dataChanged(start, parent); - } - } -} - -void SeriesTreeModel::populate(){ - QSqlQuery seriesQuery = QSqlQuery("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name", mDb); - mSeriesPartSeriesMap.clear(); - SmTreeItem *rootItem = new SmTreeItem(NumFields); - while(seriesQuery.next()){ - QList<QVariant> seriesData; - seriesData << seriesQuery.value(1) << seriesQuery.value(0) << QVariant() << QVariant() << Series << false << QVariant() << QVariant(); - SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); - rootItem->appendChild(seriesItem); - mSeriesPartsQuery->bindValue(":id", seriesData.at(1)); - mSeriesPartsQuery->exec(); - while(mSeriesPartsQuery->next()){ - QList<QVariant> partData; - partData << seriesData.at(Name) << seriesData.at(SeriesId) << mSeriesPartsQuery->value(0) << mSeriesPartsQuery->value(1) << Part << mSeriesPartsQuery->value(2) << mSeriesPartsQuery->value(3); - partData << hasLocals(mSeriesPartsQuery->value(0).toInt()); - SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); - seriesItem->appendChild(partItem); - mSeriesPartSeriesMap.insert(mSeriesPartsQuery->value(0).toInt(), seriesData.at(1).toInt()); - } - } - setRoot(rootItem); -} - -bool SeriesTreeModel::mergeSeries(const QModelIndex &from, const QModelIndex &to){ - //new series name already exists - int oldSeriesId = from.data(SeriesIdRole).toInt(); - int newSeriesId = to.data(SeriesIdRole).toInt(); - mUpdateSeriesIdQuery->bindValue(":oldid", oldSeriesId); - mUpdateSeriesIdQuery->bindValue(":newid", newSeriesId); - if(mUpdateSeriesIdQuery->exec()){ - beginResetModel(); - SmTreeItem *oldParent = static_cast<SmTreeItem*>(from.internalPointer()); - SmTreeItem *newParent = static_cast<SmTreeItem*>(to.internalPointer()); - //reparent items to new series - for(int i = oldParent->childCount() - 1; i > -1; --i){ - SmTreeItem *curItem = oldParent->child(i); - curItem->setParent(newParent); - curItem->setData(Name, to.data(NameRole)); - newParent->appendChild(curItem); - oldParent->removeChild(i, false); - } - mDeleteSeriesQuery->bindValue(":id", oldSeriesId); - if(mDeleteSeriesQuery->exec()){ - //series has to be empty - root()->removeChild(from.row()); - } - //update seriespartmap - QList<int> seriesPartIds = mSeriesPartSeriesMap.keys(oldSeriesId); - foreach(int seriesPartId, seriesPartIds){ - mSeriesPartSeriesMap.remove(seriesPartId); - mSeriesPartSeriesMap.insert(seriesPartId, newSeriesId); - } - endResetModel(); - return true; - } - return false; -} - -bool SeriesTreeModel::renameSeries(const QModelIndex &source, const QVariant &value){ - int oldSeriesId = source.data(SeriesIdRole).toInt(); - mUpdateSeriesNameQuery->bindValue(":newname", value); - mUpdateSeriesNameQuery->bindValue(":id", oldSeriesId); - if(mUpdateSeriesNameQuery->exec()){ - SmTreeItem *curItem = static_cast<SmTreeItem*>(source.internalPointer()); - curItem->setData(Name, value); - emit dataChanged(source, source); - for(int i = 0; i < curItem->childCount(); ++i){ - SmTreeItem *child = curItem->child(i); - child->setData(Name, value); - } - if(curItem->childCount()){ - QModelIndex start = source.child(0, 0); - QModelIndex end = source.child(curItem->childCount() - 1, 0); - emit dataChanged(start, end); - } - emit needResort(); - return true; - } - return false; -} - -bool SeriesTreeModel::setNewSeries(const QModelIndex &source, const QVariant &value){ - QString newName = value.toString(); - if(newName.isEmpty()){ - return false; - } - SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); - mDb.transaction(); - mSeriesInsertQuery->bindValue(":name", value); - if(mSeriesInsertQuery->exec()){ - QSqlQuery lastId("SELECT currval('series_iseries_id__seq')", mDb); - if(lastId.next()){ - int newId = lastId.value(0).toInt(); - item->setData(Name, value); - item->setData(SeriesId, newId); - item->setData(Type, Series); - QModelIndex end = index(source.row(), item->childCount() - 1, source.parent()); - emit dataChanged(source, end); - emit needResort(); - mDb.commit(); - return true; - } - } - mDb.rollback(); - return false; -} - -bool SeriesTreeModel::updateGeneric(const QModelIndex &source, const QVariant &value){ - int column = source.column(); - if(!mUpdateGenericMap.contains(column)){ - return false; - } - SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); - QString table = mUpdateGenericMap.value(column); - QString queryString = QString(mUpdateGenericTemplate).arg(table); - mDb.transaction(); - QSqlQuery query(mDb); - query.prepare(queryString); - query.bindValue(":id", item->data(SeriesPartId)); - query.bindValue(":value", value); - if(query.exec()){ - item->setData(column, value); - emit dataChanged(source, source); - mDb.commit(); - return true; - } - mDb.rollback(); - return false; -} - -bool SeriesTreeModel::setLocal(const QModelIndex &source, const QVariant &value){ - SmTreeItem *item = static_cast<SmTreeItem*>(source.internalPointer()); - item->setData(IsLocal, value); - emit dataChanged(source, source); - emit localsChanged(); - return true; -} diff --git a/seriestreemodel.h b/seriestreemodel.h deleted file mode 100644 index 19b496f..0000000 --- a/seriestreemodel.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - 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. -*/ - -#ifndef SERIESTREEMODEL_H -#define SERIESTREEMODEL_H - -#include <QSqlDatabase> -#include <QFileInfoList> -#include <QList> -#include <QHash> - -#include "smtreemodel.h" - -class QSqlQuery; - -class SeriesTreeModel : public SmTreeModel { - Q_OBJECT - public: - enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, IsLocalRole = Qt::UserRole + 8 }; - enum Fields { Name = 0, SeriesId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, IsLocal = 7 }; - enum Types { Series, Part, NewSeries }; - enum QueryType { NumericQuery, TextQuery }; - enum { NumFields = 8 }; - enum RowFilter { All = 0, Archived = 1, Local = 2 }; - explicit SeriesTreeModel(QStringList &headers, QObject *parent = 0); - - //data + flags - Qt::ItemFlags flags(const QModelIndex &index) const; - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - QList<QVariant> childrenColumnList(const QModelIndex &parent, int column) const; - int rowFilter() const { return mRowFilter; } - void setRowFilter(int rowFilter) { mRowFilter = rowFilter; } - - //find - QModelIndex findValue(const QVariant &value, const QModelIndex &parent = QModelIndex(), int searchColumn = 0, int indexColumn = -1) const; - QFileInfoList findFiles(const QModelIndex &where) const; - QFileInfoList findMovies(const QModelIndexList &from) const; - QFileInfoList findSortedMovies(const QModelIndex &from) const; - bool hasLocals(int sPartId) const; - int seriesIdByPartId(int partId); - int findNextDvdNo() const; - - //series data manipulation - bool deleteFromSeries(const QModelIndex &what); - bool addSeries(const QVariant &seriesName, const QModelIndex &parent); - bool addSeriesPart(int seriesPart, const QModelIndex &parent, const QString &subTitle); - - //filter - void clearFilter(); - void setMappingFilter(const QString &filter, const QString &table); - void setFileFilter(const QString &filter, const QString &column, int queryType); - void setFavoriteFilter(); - - signals: - void needResort(); - void consistencyMsg(const QString &msg); - void localsChanged(); - - public slots: - void readSettings(); - void conditionalUpdate(const QModelIndex &parent, int field, const QVariant &value); - - private: - void populate(); - bool mergeSeries(const QModelIndex &from, const QModelIndex &to); - bool renameSeries(const QModelIndex &source, const QVariant &value); - bool setNewSeries(const QModelIndex &source, const QVariant &value); - bool updateGeneric(const QModelIndex &source, const QVariant &value); - bool setLocal(const QModelIndex &source, const QVariant &value); - QString archivePath(const QString &fileName, const QString &md5sum) const; - QSqlDatabase mDb; - QSqlQuery *mSeriesPartsQuery; - QSqlQuery *mUpdateSeriesIdQuery; - QSqlQuery *mUpdateSeriesNameQuery; - QSqlQuery *mUpdateFavoriteQuery; - QSqlQuery *mUpdateSubtitleQuery; - QSqlQuery *mDeleteSeriesQuery; - QSqlQuery *mDeleteSeriesPartQuery; - QSqlQuery *mSeriesInsertQuery; - QSqlQuery *mSeriesFilesQuery; - QSqlQuery *mSeriesPartFilesQuery; - QSqlQuery *mSeriesPartInsertQuery; - QSqlQuery *mSortedMovieListQuery; - QSqlQuery *mNextDvdNoQuery; - QSqlQuery *mGenreFilterQuery; - QSqlQuery *mFavoriteSeriesIdQuery; - QSqlQuery *mFavoriteSeriesPartsQuery; - QSqlQuery *mIsLocalQuery; - QHash<int, int> mSeriesPartSeriesMap; - QHash<int, QString> mUpdateGenericMap; - QColor mFavoriteColor; - QString mUpdateGenericTemplate; - int mRowFilter; -}; - -#endif // SERIESTREEMODEL_H diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp deleted file mode 100644 index 096d814..0000000 --- a/seriestreewidget.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* - 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 <QtWidgets/QPushButton> -#include <QtWidgets/QLabel> -#include <QtWidgets/QMenu> -#include <QtWidgets/QMessageBox> -#include <QtWidgets/QFileDialog> -#include <QSettings> -#include <QtWidgets/QComboBox> -#include <QtWidgets/QInputDialog> -#include <QHoverEvent> -#include <QtWidgets/QCompleter> -#include <QStringListModel> -#include <QSqlQuery> -#include <QThread> -#include <QtWidgets/QGroupBox> -#include <QtWidgets/QFormLayout> -#include <QtWidgets/QCheckBox> -#include <QtWidgets/QSpinBox> -#include <QtWidgets/QApplication> - -#include "seriestreewidget.h" -#include "smglobals.h" -#include "seriestreemodel.h" -#include "filestreemodel.h" -#include "helper.h" -#include "hoverwindow.h" - -SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){ - //filter bar - QLabel *l1 = new QLabel(tr("&Filter:")); - mFilterEdit = new QLineEdit; - l1->setBuddy(mFilterEdit); - mFilter = new QPushButton(tr("Filter")); - mClear = new QPushButton(tr("Clear")); - QHBoxLayout *filterLayout = new QHBoxLayout; - connect(mFilter, SIGNAL(clicked()), this, SLOT(filter())); - connect(mFilterEdit, SIGNAL(returnPressed()), this, SLOT(filter())); - connect(mClear, SIGNAL(clicked()), this, SLOT(clearFilter())); - filterLayout->addWidget(l1); - filterLayout->addWidget(mFilterEdit); - filterLayout->addWidget(mFilter); - filterLayout->addWidget(mClear); - mFilterCompleter = new QCompleter(this); - mFilterEdit->setCompleter(mFilterCompleter); - - //the view - mView = new SeriesTreeView; - mProxy = new SeriesTreeSortModel(this); - mModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - mProxy->setSourceModel(mModel); - mView->setModel(mProxy); - mView->setSortingEnabled(true); - for(int i = 1; i < SeriesTreeModel::NumFields; ++i){ - mView->setColumnHidden(i, true); - } - mView->resizeColumnToContents(0); - mView->setSelectionMode(QAbstractItemView::ExtendedSelection); - mView->setEditTriggers(QAbstractItemView::NoEditTriggers); - mView->setExpandsOnDoubleClick(false); - connect(mModel, SIGNAL(needResort()), this, SLOT(resort())); - connect(mView, SIGNAL(expanded(QModelIndex)), this, SLOT(itemExpanded(QModelIndex))); - connect(mView, SIGNAL(collapsed(QModelIndex)), this, SLOT(itemCollaped(QModelIndex))); - - //cover dialog - mCoverDialog = new AddCoverDialog(this); - - //layout - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(filterLayout); - mainLayout->addWidget(mView); - setLayout(mainLayout); - - //misc - mCompleterProducerThread = new QThread(this); - mCompleterProducer = new CompleterProducer; - mCompleterProducer->moveToThread(mCompleterProducerThread); - connect(mCompleterProducerThread, SIGNAL(started()), mCompleterProducer, SLOT(produce())); - connect(mCompleterProducer, SIGNAL(done(QStringListModel*)), this, SLOT(producerFinished(QStringListModel*))); -} - -SeriesTreeWidget::~SeriesTreeWidget(){ - if(mCompleterProducerThread->isRunning()){ - mCompleterProducerThread->terminate(); - } - delete mCompleterProducerThread; - delete mCompleterProducer; -} - -void SeriesTreeWidget::seriesAdded(QString seriesName, int seriesPart, bool resort){ - if(resort){ - mProxy->invalidate(); - foreach(QString e, mExpandedItems){ - QModelIndex idx = mProxy->mapFromSource(mModel->findValue(e)); - mView->expand(idx); - } - } - QModelIndex destIdx = mModel->findValue(seriesName); - if(destIdx.isValid()){ - QModelIndex proxySeries = mProxy->mapFromSource(destIdx); - mView->expand(proxySeries); - mView->scrollTo(proxySeries, QAbstractItemView::PositionAtCenter); - QModelIndex seriesPartIdx = mModel->findValue(seriesPart, destIdx, SeriesTreeModel::SeriesPart); - if(seriesPartIdx.isValid()){ - destIdx = seriesPartIdx; - } - } - if(destIdx.isValid()){ - QModelIndex proxyIndex = mProxy->mapFromSource(destIdx); - mView->selectionModel()->select(proxyIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current | QItemSelectionModel::Rows); - } -} - -void SeriesTreeWidget::toggleFavorite(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - foreach(QModelIndex idx, selected){ - if(idx.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ - bool curFav = idx.data(SeriesTreeModel::FavoriteRole).toBool(); - QModelIndex source = mProxy->mapToSource(idx); - if(source.isValid()){ - source = mModel->index(source.row(), SeriesTreeModel::Favorite, source.parent()); - } - mModel->setData(source, !curFav, Qt::EditRole); - } - } -} - -void SeriesTreeWidget::deleteFromSeries(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QList<QPersistentModelIndex> series; - QList<QPersistentModelIndex> parts; - foreach(QModelIndex s, selected){ - QModelIndex real = mProxy->mapToSource(s); - if(real.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series || real.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::NewSeries){ - series << QPersistentModelIndex(real); - } - if(real.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ - parts << QPersistentModelIndex(real); - } - } - QList<QPersistentModelIndex> removeParts; - foreach(QPersistentModelIndex s, parts){ - if(series.contains(s.parent())){ - removeParts << s; - } - } - foreach(QPersistentModelIndex s, removeParts){ - parts.removeAll(s); - } - QFileInfoList files; - foreach(QPersistentModelIndex s, series){ - files.append(mModel->findFiles(s)); - } - foreach(QPersistentModelIndex p, parts){ - files.append(mModel->findFiles(p)); - } - - QString message; - if(!files.isEmpty()){ - message = QString(tr("<p>This operation will delete %1 file(s) permanently:</p>")).arg(files.count()); - message.append(tr("<ul>")); - int ctr = 0; - foreach(QFileInfo f, files){ - ++ctr; - QString li = QString(tr("<li>%1</li>")).arg(f.absoluteFilePath()); - message.append(li); - if(ctr == 20){ - QString elide = QString(tr("<li>(%1 more files)</li>")).arg(files.count() - ctr); - message.append(elide); - break; - } - } - message.append(tr("</ul>")); - message.append(tr("<p>Continue?</p>")); - }else{ - message = QString(tr("<p>This operation will delete no files. Continue?</p>")); - } - int retval = QMessageBox::critical(this, tr("Delete Series"), message, QMessageBox::Yes | QMessageBox::No, QMessageBox::No); - if(retval == QMessageBox::Yes){ - foreach(QPersistentModelIndex s, series){ - mModel->deleteFromSeries(s); - } - foreach(QPersistentModelIndex s, parts){ - mModel->deleteFromSeries(s); - } - } -} - -void SeriesTreeWidget::readSettings(){ - QSettings s; - QStringList expanded = s.value("archive/expanded").toStringList(); - expanded.removeDuplicates(); - expandItems(expanded); - int sortOrder = s.value("archive/sortorder", Qt::DescendingOrder).toInt(); - mView->sortByColumn(0, static_cast<Qt::SortOrder>(sortOrder)); - QString selectedSeries = s.value("archive/selectedseries").toString(); - QModelIndex seriesIdx = mModel->findValue(selectedSeries); - if(seriesIdx.isValid()){ - QModelIndex real = mProxy->mapFromSource(seriesIdx); - mView->scrollTo(real, QAbstractItemView::PositionAtCenter); - mView->selectionModel()->select(real, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current | QItemSelectionModel::Rows); - mView->setCurrentIndex(real); - } - mFilterEdit->setText(s.value("archive/filtertext").toString()); - mModel->readSettings(); -} - -void SeriesTreeWidget::writeSettings(){ - QSettings s; - s.setValue("archive/expanded", mExpandedItems); - s.setValue("archive/sortorder", mProxy->sortOrder()); - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(!selected.isEmpty()){ - s.setValue("archive/selectedseries", selected.at(0).data(SeriesTreeModel::NameRole).toString()); - } - s.setValue("archive/filtermode", mFilterMode); - s.setValue("archive/filtertext", mFilterEdit->text()); -} - -void SeriesTreeWidget::expandCurrent(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QModelIndex idx = selected.at(0); - mView->expand(idx); -} - -void SeriesTreeWidget::filter(){ - QString filterText = mFilterEdit->text(); - if(filterText.isEmpty()){ - clearFilter(); - return; - } - switch(mFilterMode){ - case FilterActor: - mModel->setMappingFilter(filterText, "actor"); - break; - case FilterGenre: - mModel->setMappingFilter(filterText, "genre"); - break; - case FilterQuality: - mModel->setFileFilter(filterText, "siquality", SeriesTreeModel::NumericQuery); - break; - case FilterFileName: - mModel->setFileFilter(filterText, "tfilename", SeriesTreeModel::TextQuery); - break; - case FilterDvdNo: - mModel->setFileFilter(filterText, "idvd", SeriesTreeModel::NumericQuery); - break; - case FilterSize: - mModel->setFileFilter(filterText, "bisize", SeriesTreeModel::NumericQuery); - break; - default: - mProxy->setFilterRegExp(mFilterEdit->text()); - } - seriesTree()->expand(QModelIndex()); - expandItems(mExpandedItems); -} - -void SeriesTreeWidget::filterFavorites(bool checked){ - if(checked){ - mOldFilterText = mFilterEdit->text(); - clearFilter(); - mModel->setFavoriteFilter(); - expandItems(mExpandedItems); - }else{ - mFilterEdit->setText(mOldFilterText); - filter(); - } - mFilterEdit->setEnabled(!checked); - mFilter->setEnabled(!checked); - mClear->setEnabled(!checked); -} - -void SeriesTreeWidget::clearFilter(){ - mModel->clearFilter(); - mProxy->setFilterRegExp(QString()); - mFilterEdit->clear(); - expandItems(mExpandedItems); -} - -void SeriesTreeWidget::resort(){ - mView->sortByColumn(0, mProxy->sortOrder()); - mView->scrollTo(mView->selectionModel()->currentIndex(), QAbstractItemView::PositionAtCenter); -} - -void SeriesTreeWidget::itemExpanded(const QModelIndex &what){ - if(!mExpandedItems.contains(what.data(SeriesTreeModel::NameRole).toString())){ - mExpandedItems << what.data(SeriesTreeModel::NameRole).toString(); - } -} - -void SeriesTreeWidget::itemCollaped(const QModelIndex &what){ - QString itemName = what.data(SeriesTreeModel::NameRole).toString(); - if(mExpandedItems.contains(itemName)){ - mExpandedItems.removeAll(itemName); - } -} - -void SeriesTreeWidget::expandItems(const QStringList &items){ - QStringList expand = items; - if(items.isEmpty()){ - expand = mExpandedItems; - } - foreach(QString s, expand){ - QModelIndex idx = mProxy->mapFromSource(mModel->findValue(s)); - mView->expand(idx); - } -} - -void SeriesTreeWidget::editItem(){ - QModelIndex current = mView->selectionModel()->currentIndex(); - if(current.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){ - seriesTree()->edit(current); - return; - } - if(current.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ - int currentPart = current.data(SeriesTreeModel::SeriesPartRole).toInt(); - bool dlgOk = false; - int newPart = QInputDialog::getInt(this, tr("Enter new series part"), tr("New series part"), currentPart, 1, 1000, 1, &dlgOk); - if(dlgOk){ - QModelIndex real = mProxy->mapToSource(current); - QModelIndex part = mModel->index(real.row(), SeriesTreeModel::SeriesPart, real.parent()); - mModel->setData(part, newPart, Qt::EditRole); - } - } -} - -void SeriesTreeWidget::producerFinished(QStringListModel *model){ - mFilterCompleter->setModel(model); - mCompleterProducerThread->quit(); -} - -void SeriesTreeWidget::addCover(){ - QModelIndexList selected = mView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - if(selected.count() > 1){ - QMessageBox::critical(this, tr("Error"), tr("Please don't select more than one item when adding covers.")); - return; - } - QModelIndex real = mProxy->mapToSource(selected.at(0)); - if(real.data(SeriesTreeModel::TypeRole).toInt() != SeriesTreeModel::Part){ - QMessageBox::critical(this, tr("Error"), tr("Please select a series part when adding covers.")); - return; - } - int retval = mCoverDialog->exec(); - if(retval == QDialog::Accepted){ - QString fileName = mCoverDialog->file(); - QFileInfo fi(fileName); - if(fi.exists()){ - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - int seriesPartId = real.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - int type = mCoverDialog->fileType(); - if(filesModel->addFile(fileName, type, 0, -1, seriesPartId, -1)){ - QString md5sum = Helper::md5Sum(fileName); - Helper::moveToArchive(fileName, md5sum); - filesModel->setIds(QList<int>() << seriesPartId); - emit filesReload(); - } - } - } -} - -void SeriesTreeWidget::setFilterMode(int mode){ - mFilterMode = mode; - mCompleterProducer->setMode(mode); - mCompleterProducerThread->start(); -} - -SeriesTreeView::SeriesTreeView(QWidget *parent) : SmTreeView(parent), mHover(false) { - setAttribute(Qt::WA_Hover); - mHoverWin = new HoverWindow(this); - readSettings(); -} - -void SeriesTreeView::readSettings(){ - QSettings s; - mHover = s.value("ui/hoverarchive", true).toBool(); - mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); - mCursorOffset = s.value("ui/cursoroffset").toInt(); -} - -void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){ - QMenu contextMenu(this); - foreach(QAction *a, actions()){ - contextMenu.addAction(a); - } - contextMenu.exec(e->globalPos()); -} - -bool SeriesTreeView::event(QEvent *e){ - QHoverEvent *hEvent = dynamic_cast<QHoverEvent*>(e); - if(!hEvent){ - return SmTreeView::event(e); - } - if(!mHover){ - return true; - } - QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() + mCursorOffset); - QModelIndex curIdx = indexAt(hotSpot); - if((e->type() == QEvent::HoverEnter) || (e->type() == QEvent::HoverMove)){ - if(!curIdx.isValid() || (curIdx.parent() != QModelIndex())){ - return exitHover(); - } - } - if(e->type() == QEvent::HoverEnter){ - mCurHover = curIdx; - mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); - mHoverWin->setPos(); - mHoverWin->setVisible(true); - return true; - } - if(e->type() == QEvent::HoverMove){ - if(curIdx != mCurHover){ - mCurHover = curIdx; - mHoverWin->setContent(curIdx.data(Qt::DisplayRole).toString(), children(curIdx)); - mHoverWin->setPos(); - mHoverWin->setVisible(true); - return true; - }else{ - mHoverWin->setPos(); - return true; - } - } - if(e->type() == QEvent::HoverLeave){ - return exitHover(); - } - return SmTreeView::event(e); -} - -bool SeriesTreeView::exitHover(bool exitVal){ - mHoverWin->setVisible(false); - mCurHover = QModelIndex(); - return exitVal; -} - -QStringList SeriesTreeView::children(const QModelIndex &idx) const{ - if(!idx.isValid()){ - return QStringList(); - } - QStringList retval; - QModelIndex curIdx = idx.child(0,0); - while(curIdx.isValid()){ - retval << curIdx.data(Qt::DisplayRole).toString(); - curIdx = idx.model()->index(curIdx.row() + 1, curIdx.column(), curIdx.parent()); - } - return retval; -} - -SeriesTreeSortModel::SeriesTreeSortModel(QObject *parent) : QSortFilterProxyModel(parent) {} - -bool SeriesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const{ - if(left.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part && right.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ - if(left.data(SeriesTreeModel::SubtitleRole).isValid()){ - return left.data(SeriesTreeModel::SubtitleRole).toString() < right.data(SeriesTreeModel::SubtitleRole).toString(); - } - return left.data(SeriesTreeModel::SeriesPartRole).toInt() < right.data(SeriesTreeModel::SeriesPartRole).toInt(); - } - return QSortFilterProxyModel::lessThan(left, right); -} - -bool SeriesTreeSortModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { - SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(sourceModel()); - int rowFilter = seriesModel->rowFilter(); - QModelIndex curIdx = sourceModel()->index(source_row, 0, source_parent); - QString name = curIdx.data(SeriesTreeModel::NameRole).toString(); - QRegExp filterRe = filterRegExp(); - if(rowFilter == SeriesTreeModel::All){ - if(filterRe.isEmpty()){ - return true; - }else{ - return (filterRe.indexIn(name) != -1); - } - } - if(!curIdx.isValid()){ - return true; - } - int type = curIdx.data(SeriesTreeModel::TypeRole).toInt(); - bool filterLocal = (rowFilter == SeriesTreeModel::Local); - if(type == SeriesTreeModel::Series){ - int row = 0; - QModelIndex child = curIdx.child(row, 0); - while(child.isValid()){ - bool hasLocals = child.data(SeriesTreeModel::IsLocalRole).toBool(); - if(hasLocals == filterLocal){ - return (filterRe.indexIn(name) != -1); - } - child = curIdx.child(++row, 0); - } - }else if(type == SeriesTreeModel::Part){ - bool accept = ((curIdx.data(SeriesTreeModel::IsLocalRole).toBool() == filterLocal)); // && (curIdx.data(SeriesTreeModel::FavoriteRole).toBool() == false)); - if(accept){ - return (filterRe.indexIn(name) != -1); - } - } - return false; -} - -AddCoverDialog::AddCoverDialog(QWidget *parent, Qt::WindowFlags f) : SmDialog(parent, f){ - //File selection - QLabel *l1 = new QLabel(tr("Select file")); - mFile = new QLineEdit; - QPushButton *mSelectFile = new QPushButton(tr("Browse...")); - connect(mSelectFile, SIGNAL(clicked()), this, SLOT(selectFile())); - QHBoxLayout *fileLayout = new QHBoxLayout; - fileLayout->addWidget(l1); - fileLayout->addWidget(mFile); - fileLayout->addWidget(mSelectFile); - - //file type - mFilesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - QHash<int, QString> coverTypes = mFilesModel->coverTypes(); - mFileType = new QComboBox; - QStringList types; - foreach(QString t, coverTypes.values()){ - types << t; - } - connect(mFileType, SIGNAL(currentIndexChanged(QString)), this, SLOT(typeChanged(QString))); - mFileType->addItems(types); - QHBoxLayout *typesLayout = new QHBoxLayout; - typesLayout->setAlignment(Qt::AlignCenter); - typesLayout->addWidget(mFileType); - - //buttons - mOk = new QPushButton(tr("Ok")); - connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); - mCancel = new QPushButton(tr("Cancel")); - connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); - QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addStretch(); - buttonLayout->addWidget(mOk); - buttonLayout->addWidget(mCancel); - - //main layout - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(fileLayout); - mainLayout->addLayout(typesLayout); - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); -} - -const QString AddCoverDialog::file() const { - return mFile->text(); -} - -void AddCoverDialog::selectFile(){ - QString startDir = mLastOpenedDir; - if(startDir.isEmpty()){ - QSettings s; - startDir = s.value("paths/selecteddir").toString(); - } - QString file = QFileDialog::getOpenFileName(this, tr("Select cover"), startDir); - mFile->setText(file); - QFileInfo fi(file); - mLastOpenedDir = fi.absolutePath(); -} - -void AddCoverDialog::typeChanged(const QString &type){ - QHash<int, QString>::const_iterator it = mFilesModel->coverTypes().constBegin(); - while(it != mFilesModel->coverTypes().constEnd()){ - if(it.value() == type){ - mCurrentType = it.key(); - return; - } - ++it; - } -} - -EditSeriesDialog::EditSeriesDialog(const QModelIndex &idx, QWidget *parent) : QDialog(parent), mIdx(idx) { - //title + subtitle - QGroupBox *seriesTitleBox = new QGroupBox(tr("Title")); - mTitle = new QLineEdit; - QString title = mIdx.data(SeriesTreeModel::NameRole).toString(); - QFontMetrics fm(qApp->font()); - int titleWidth = fm.width(title); - mTitle->setMinimumWidth(titleWidth + fm.maxWidth()); - mTitle->setText(title); - QFormLayout *titleLayout = new QFormLayout; - titleLayout->addRow(tr("&Title"), mTitle); - mSubtitle = new QLineEdit; - mSubtitle->setEnabled(false); - int type = mIdx.data(SeriesTreeModel::TypeRole).toInt(); - if(type == SeriesTreeModel::Part){ - titleLayout->addRow(tr("&Subtitle"), mSubtitle); - mSubtitle->setEnabled(true); - mSubtitle->setText(mIdx.data(SeriesTreeModel::SubtitleRole).toString()); - mTitle->setEnabled(false); - } - seriesTitleBox->setLayout(titleLayout); - - //seriespart + favorite - QGroupBox *partDataBox = new QGroupBox(tr("Other data")); - QHBoxLayout *partNoLayout = new QHBoxLayout; - mPartNo = new QSpinBox; - mPartNo->setMinimum(1); - mPartNo->setValue(mIdx.data(SeriesTreeModel::SeriesPartRole).toInt()); - mHasPartNo = new QCheckBox(tr("Element has Part no.")); - connect(mHasPartNo, SIGNAL(stateChanged(int)), this, SLOT(hasPartNoStateChanged(int))); - mHasPartNo->setChecked(mIdx.data(SeriesTreeModel::SeriesPartRole).toInt()); - partNoLayout->addWidget(mHasPartNo); - partNoLayout->addStretch(); - partNoLayout->addWidget(mPartNo); - mFavorite = new QCheckBox(tr("Favorite")); - mFavorite->setChecked(mIdx.data(SeriesTreeModel::FavoriteRole).toBool()); - QVBoxLayout *partDataLayout = new QVBoxLayout; - partDataLayout->addLayout(partNoLayout); - partDataLayout->addWidget(mFavorite); - partDataBox->setLayout(partDataLayout); - - //buttons - QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addStretch(); - mOk = new QPushButton(tr("Ok")); - connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); - 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->addWidget(seriesTitleBox); - mainLayout->addWidget(partDataBox); - partDataBox->setVisible(type == SeriesTreeModel::Part); - mainLayout->addLayout(buttonLayout); - setLayout(mainLayout); -} - -void EditSeriesDialog::accept(){ - SeriesTreeModel *model = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - QModelIndex favoriteIdx = model->index(mIdx.row(), SeriesTreeModel::Favorite, mIdx.parent()); - model->setData(favoriteIdx, (mFavorite->checkState() == Qt::Checked), Qt::EditRole); - QModelIndex titleIdx = model->index(mIdx.row(), SeriesTreeModel::Name, mIdx.parent()); - model->setData(titleIdx, mTitle->text().toLower().trimmed(), Qt::EditRole); - QModelIndex subtitleIdx = model->index(mIdx.row(), SeriesTreeModel::Subtitle, mIdx.parent()); - model->setData(subtitleIdx, mSubtitle->text().toLower().trimmed(), Qt::EditRole); - bool hasPartNo = mHasPartNo->isChecked(); - int partNo = hasPartNo ? mPartNo->value() : 0; - QModelIndex partNoIdx = model->index(mIdx.row(), SeriesTreeModel::SeriesPart, mIdx.parent()); - model->setData(partNoIdx, partNo, Qt::EditRole); - QDialog::accept(); -} - -void EditSeriesDialog::hasPartNoStateChanged(int state){ - mPartNo->setEnabled(state == Qt::Checked); -} - -CompleterProducer::CompleterProducer(int Mode, QObject *parent) : QObject(parent), mMode(Mode){ - mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "complprod"); - mDb.open(); - mSeriesQuery = new QSqlQuery(mDb); - mSeriesQuery->prepare("SELECT DISTINCT(tseries_name) FROM series"); - mQueryHash.insert(SeriesTreeWidget::FilterSeries, mSeriesQuery); - mActorsQuery = new QSqlQuery(mDb); - mActorsQuery->prepare("SELECT DISTINCT(tactorname) FROM actors"); - mQueryHash.insert(SeriesTreeWidget::FilterActor, mActorsQuery); - mGenresQuery = new QSqlQuery(mDb); - mGenresQuery->prepare("SELECT DISTINCT(tgenrename) FROM genres"); - mQueryHash.insert(SeriesTreeWidget::FilterGenre, mGenresQuery); - mFileNameQuery = new QSqlQuery(mDb); - mFileNameQuery->prepare("SELECT DISTINCT(tfilename) FROM files"); - mQueryHash.insert(SeriesTreeWidget::FilterFileName, mFileNameQuery); - mSizeQuery = new QSqlQuery(mDb); - mSizeQuery->prepare("SELECT DISTINCT(bisize) FROM files"); - mQueryHash.insert(SeriesTreeWidget::FilterSize, mSizeQuery); - mQualityQuery = new QSqlQuery(mDb); - mQualityQuery->prepare("SELECT DISTINCT(siquality) FROM files"); - mQueryHash.insert(SeriesTreeWidget::FilterQuality, mQualityQuery); - mDvdNoQuery = new QSqlQuery(mDb); - mDvdNoQuery->prepare("SELECT DISTINCT(siquality) FROM files"); - mQueryHash.insert(SeriesTreeWidget::FilterDvdNo, mDvdNoQuery); - mModel = new QStringListModel; -} - -CompleterProducer::~CompleterProducer(){ - delete mSeriesQuery; - delete mActorsQuery; - delete mGenresQuery; - delete mFileNameQuery; - delete mSizeQuery; - delete mQualityQuery; - delete mDvdNoQuery; - mDb.close(); - mDb = QSqlDatabase(); -} - -void CompleterProducer::produce(){ - QSqlQuery *query = mQueryHash.value(mMode); - QStringList values; - query->exec(); - while(query->next()){ - values << query->value(0).toString(); - } - mModel->setStringList(values); - emit done(mModel); -} diff --git a/seriestreewidget.h b/seriestreewidget.h deleted file mode 100644 index 9740c02..0000000 --- a/seriestreewidget.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - 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. -*/ - -#ifndef SERIESTREEWIDGET_H -#define SERIESTREEWIDGET_H - -#include <QtWidgets/QWidget> -#include <QSortFilterProxyModel> -#include <QSqlDatabase> - -#include "smdialog.h" -#include "smtreeview.h" - -class QComboBox; -class QCompleter; -class QStringListModel; -class QCheckBox; -class QSpinBox; -class SeriesTreeModel; -class SeriesTreeView; -class SeriesTreeSortModel; -class FilesTreeModel; -class AddCoverDialog; -class HoverWindow; -class CompleterProducer; - -class SeriesTreeWidget : public QWidget { - Q_OBJECT - public: - enum FilterMode { FilterSeries = 1, FilterActor = 2, FilterGenre = 3, FilterSize = 4, FilterQuality = 5, FilterFileName = 6, FilterDvdNo = 7 }; - explicit SeriesTreeWidget(QWidget *parent = 0); - virtual ~SeriesTreeWidget(); - SeriesTreeView *seriesTree() { return mView; } - SeriesTreeSortModel *seriesProxy() { return mProxy; } - - public slots: - void seriesAdded(const QString seriesName, int seriesPart, bool resort = true); - void toggleFavorite(); - void deleteFromSeries(); - void readSettings(); - void writeSettings(); - void expandCurrent(); - void addCover(); - void setFilterMode(int mode); - void filter(); - void filterFavorites(bool checked); - void expandItems(const QStringList &items = QStringList()); - - private slots: - void clearFilter(); - void resort(); - void itemExpanded(const QModelIndex &); - void itemCollaped(const QModelIndex &); - void editItem(); - void producerFinished(QStringListModel *model); - - signals: - void filesReload(); - - private: - QLineEdit *mFilterEdit; - QPushButton *mFilter; - QPushButton *mClear; - SeriesTreeView *mView; - SeriesTreeSortModel *mProxy; - SeriesTreeModel *mModel; - AddCoverDialog *mCoverDialog; - QStringList mExpandedItems; - int mFilterMode; - QCompleter *mFilterCompleter; - QThread *mCompleterProducerThread; - CompleterProducer *mCompleterProducer; - QString mOldFilterText; -}; - -class SeriesTreeView : public SmTreeView { - Q_OBJECT - public: - explicit SeriesTreeView(QWidget *parent = 0); - - public slots: - void readSettings(); - - protected: - virtual void contextMenuEvent(QContextMenuEvent *e); - virtual bool event(QEvent *event); - - private: - bool exitHover(bool exitVal = true); - QStringList children(const QModelIndex &idx) const; - QModelIndex mCurHover; - HoverWindow *mHoverWin; - bool mHover; - qint16 mCursorOffset; -}; - - -class SeriesTreeSortModel : public QSortFilterProxyModel { - Q_OBJECT - public: - SeriesTreeSortModel(QObject *parent = 0); - ~SeriesTreeSortModel() {} - bool acceptedByFilter(int source_row, const QModelIndex &parent) const { return filterAcceptsRow(source_row, parent); } - - protected: - virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; - virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; -}; - -class AddCoverDialog : public SmDialog { - Q_OBJECT - public: - explicit AddCoverDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); - const QString file() const; - int fileType() const { return mCurrentType; } - - private slots: - void selectFile(); - void typeChanged(const QString &type); - - private: - QLineEdit *mFile; - QComboBox *mFileType; - QPushButton *mSelectFile; - QPushButton *mOk; - QPushButton *mCancel; - QString mLastOpenedDir; - int mCurrentType; - FilesTreeModel *mFilesModel; -}; - -class EditSeriesDialog : public QDialog { - Q_OBJECT - public: - explicit EditSeriesDialog(const QModelIndex &idx, QWidget *parent = 0); - - public slots: - void accept(); - - private slots: - void hasPartNoStateChanged(int state); - - private: - QLineEdit *mTitle; - QLineEdit *mSubtitle; - QCheckBox *mFavorite; - QCheckBox *mHasPartNo; - QSpinBox *mPartNo; - QPushButton *mOk; - QPushButton *mCancel; - const QPersistentModelIndex mIdx; -}; - -class CompleterProducer : public QObject { - Q_OBJECT - public: - CompleterProducer(int Mode = SeriesTreeWidget::FilterSeries, QObject *parent = 0); - ~CompleterProducer(); - - public slots: - void produce(); - void setMode(int mode) { mMode = mode; } - - signals: - void done(QStringListModel *model); - - private: - QStringListModel *mModel; - int mMode; - QSqlDatabase mDb; - QSqlQuery *mSeriesQuery; - QSqlQuery *mActorsQuery; - QSqlQuery *mGenresQuery; - QSqlQuery *mSizeQuery; - QSqlQuery *mQualityQuery; - QSqlQuery *mFileNameQuery; - QSqlQuery *mDvdNoQuery; - QHash<int, QSqlQuery*> mQueryHash; -}; - -#endif @@ -5,17 +5,17 @@ 2 of the License, or (at your option) any later version. */ -#include <QtWidgets/QApplication> -#include <QtWidgets/QVBoxLayout> -#include <QtWidgets/QMenuBar> -#include <QtWidgets/QStatusBar> -#include <QtWidgets/QLabel> +#include <QApplication> +#include <QVBoxLayout> +#include <QMenuBar> +#include <QStatusBar> +#include <QLabel> #include <QSignalMapper> #include <QSettings> -#include <QtWidgets/QMessageBox> +#include <QMessageBox> #include <QCloseEvent> -#include <QtWidgets/QToolBar> -#include <QtWidgets/QSplashScreen> +#include <QToolBar> +#include <QSplashScreen> #include <sys/vfs.h> @@ -24,13 +24,8 @@ #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" -#include "archivetreeview.h" #include "smglobals.h" -#include "seriestreewidget.h" -#include "seriestreemodel.h" #include "newmoviewizard.h" -#include "filestreewidget.h" -#include "filestreemodel.h" #include "consistencycheck.h" #include "mappingtableeditor.h" #include "mappingtablemodel.h" @@ -63,23 +58,11 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla mTab->addTab(mFSWidget, tr("Filemanager")); connect(this, SIGNAL(configChanged()), mFSWidget, SLOT(configChanged())); - //ArchiveTreeView - splash.showMessage(tr("Creating Archive..."), Qt::AlignHCenter, Qt::yellow); - qApp->processEvents(); - mATree = new ArchiveTreeView; - mTab->addTab(mATree, "Archive"); - connect(mATree->filesWidget(), SIGNAL(statusMessage(QString)), this, SLOT(statusbarMessage(QString))); - connect(mATree, SIGNAL(needWindowTitleChange(QString)), this, SLOT(setWindowTitle(QString))); - connect(mATree->filesWidget(), SIGNAL(numSelected(int)), this, SLOT(updateSelectedCount(int))); - connect(mATree->filesWidget(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); - connect(mATree->filesWidget(), SIGNAL(statusMessage(QString)), this, SLOT(statusbarMessage(QString))); - connect(this, SIGNAL(configChanged()), mATree, SLOT(readSettings())); - //experimental - splash.showMessage(tr("Creating experimental"), Qt::AlignHCenter, Qt::yellow); + splash.showMessage(tr("Creating Movie archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mArchive = new ArchiveView; - mTab->addTab(mArchive, "Experimental"); + mTab->addTab(mArchive, "Movies"); connect(mArchive->archiveModel(), SIGNAL(message(QString)), this, SLOT(statusbarMessage(QString))); //pictures @@ -131,7 +114,6 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla connect(mFSWidget->dirModel(), SIGNAL(layoutChanged()), this, SLOT(setFsFree())); connect(mFSWidget->dirModel(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(setFsFree())); connect(this, SIGNAL(configChanged()), mFSWidget->fileView(), SLOT(readConfig())); - connect(this, SIGNAL(configChanged()), mATree->seriesWidget(), SLOT(readSettings())); connect(this, SIGNAL(configChanged()), picViewer, SLOT(readSettings())); connect(this, SIGNAL(configChanged()), c->archiveTreeModel(), SLOT(readConfig())); connect(mFSWidget, SIGNAL(mounted(bool)), this, SLOT(checkMount(bool))); @@ -142,7 +124,6 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla show(); splash.finish(this); - mATree->readSettings(); mFSWidget->readSettings(); mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); mPicWidget->readSettings(); @@ -154,8 +135,6 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla void SheMov::closeEvent(QCloseEvent *event){ mFSWidget->writeSettings(); mFSWidget->pictureViewer()->close(); - mATree->seriesWidget()->writeSettings(); - mATree->filesWidget()->filesTree()->writeSettings(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); mArchive->writeSettings(); @@ -178,27 +157,20 @@ void SheMov::configure(){ ConfigurationDialog dlg(this); dlg.exec(); createOpenWithMenuFS(); - createOpenWithMenuAV(); createPalette(); emit configChanged(); } void SheMov::tabChanged(int newTab){ mEditFSMenuA->setVisible(newTab == FileManager); - mEditAVMenuA->setVisible(newTab == Archive); mEditPicMenuA->setVisible(newTab == Pictures); mViewFSMenuA->setVisible(newTab == FileManager); - mViewAVMenuA->setVisible(newTab == Archive); mViewPicMenuA->setVisible(newTab == Pictures); - mArchiveViewMenuA->setVisible(newTab == Experimental); - mArchiveMenuA->setVisible(newTab == Experimental); + mArchiveViewMenuA->setVisible(newTab == Movies); + mArchiveMenuA->setVisible(newTab == Movies); mCdupA->setEnabled(newTab == FileManager); mBackDirA->setEnabled(newTab == FileManager); - mFilesTreeHeadersGroup->setEnabled(newTab == Archive); - mFilterGroup->setEnabled(newTab == Archive); - mShowTreeGroup->setEnabled(newTab == Archive); mPicActionGroup->setEnabled(newTab == Pictures); - mFilterFavoritesA->setEnabled(newTab == Archive); mPVSelectAllA->disconnect(); mPVShowNPDialogA->setEnabled(newTab == FileManager); mPVAddToNPA->setEnabled(newTab == FileManager); @@ -210,7 +182,7 @@ void SheMov::tabChanged(int newTab){ mFSWidget->fileView()->selectedFilesChanged(); mFSWidget->setWindowTitle(); break; - case Experimental: + case Movies: c->fileSelectionChanged(QItemSelection(), QItemSelection()); c->archiveTreeModel()->setWindowTitle(); break; @@ -464,31 +436,6 @@ void SheMov::createActions(){ mRefreshA = new QAction(tr("Refresh"), this); connect(mRefreshA, SIGNAL(triggered()), mFSWidget->fileModel(), SLOT(refresh())); - //Edit menu (AV) - QSignalMapper *editMapper = new QSignalMapper(this); - FilesTreeModel *filesModel = qobject_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - const QHash<QString, int> editableColumns = filesModel->editableColumns(); - mEditGroup = new QActionGroup(this); - for(QHash<QString, int>::const_iterator it = editableColumns.constBegin(); it != editableColumns.constEnd(); ++it){ - QAction *a = new QAction(it.key(), this); - connect(a, SIGNAL(triggered()), editMapper, SLOT(map())); - a->setData(it.key()); - mEditGroup->addAction(a); - editMapper->setMapping(a, it.value()); - } - connect(editMapper, SIGNAL(mapped(int)), mATree->filesWidget(), SLOT(edit(int))); - mToggleFavoriteA = new QAction(tr("Toggle as favorite"), this); - mToggleFavoriteA->setShortcut(tr("CTRL+m")); - connect(mToggleFavoriteA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(toggleFavorite())); - QSignalMapper *mappingMapper = new QSignalMapper(this); - mEditGenresA = new QAction(tr("Edit genres..."), this); - mappingMapper->setMapping(mEditGenresA, "genre"); - connect(mEditGenresA, SIGNAL(triggered()), mappingMapper, SLOT(map())); - mEditActorsA = new QAction(tr("Edit actors..."), this); - mappingMapper->setMapping(mEditActorsA, "actor"); - connect(mEditActorsA, SIGNAL(triggered()), mappingMapper, SLOT(map())); - connect(mappingMapper, SIGNAL(mapped(QString)), this, SLOT(editMappings(QString))); - //Help menu QString aboutLabel = QString(tr("About %1...")).arg(qApp->applicationName()); mAboutShemovA = new QAction(aboutLabel, this); @@ -498,52 +445,7 @@ void SheMov::createActions(){ mStatisticsA = new QAction(tr("Some statistics..."), this); connect(mStatisticsA, SIGNAL(triggered()), this, SLOT(showStatistics())); - //Tree series context menu - mDeleteFromSeriesA = new QAction(tr("Delete entries..."), this); - connect(mDeleteFromSeriesA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(deleteFromSeries())); - mPlaySelectedAVA = new QAction(tr("Play selected movies..."), this); - connect(mPlaySelectedAVA, SIGNAL(triggered()), mATree, SLOT(playSelected())); - mExpandAllSeriesA = new QAction(tr("Expand all"), this); - connect(mExpandAllSeriesA, SIGNAL(triggered()), mATree->seriesWidget()->seriesTree(), SLOT(expandAll())); - mCollapseAllSeriesA = new QAction(tr("Collapse all"), this); - connect(mCollapseAllSeriesA, SIGNAL(triggered()), mATree->seriesWidget()->seriesTree(), SLOT(collapseAll())); - mExpandCurrentA = new QAction(tr("Expand"), this); - connect(mExpandCurrentA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(expandCurrent())); - mAddCoverA = new QAction(tr("Add cover..."), this); - connect(mAddCoverA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(addCover())); - mEditItemA = new QAction(tr("Edit..."), this); - connect(mEditItemA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(editItem())); - - //Tree view menu - mShowTreeGroup = new QActionGroup(this); - QSignalMapper *viewMapper = new QSignalMapper(this); - mShowArchivedA = new QAction(QIcon(":/gaping_ass.png"), tr("Show archived movies"), this); - mShowTreeGroup->addAction(mShowArchivedA); - viewMapper->setMapping(mShowArchivedA, SeriesTreeModel::Archived); - connect(mShowArchivedA, SIGNAL(triggered()), viewMapper, SLOT(map())); - mShowArchivedA->setCheckable(true); - mShowLocalA = new QAction(QIcon(":/clitoris.png"), tr("Show local movies"), this); - mShowTreeGroup->addAction(mShowLocalA); - viewMapper->setMapping(mShowLocalA, SeriesTreeModel::Local); - connect(mShowLocalA, SIGNAL(triggered()), viewMapper, SLOT(map())); - mShowLocalA->setCheckable(true); - mShowNormalA = new QAction(QIcon(":/nipple_up.png"), tr("Normal view"), this); - mATree->setNormalViewAction(mShowNormalA); - mShowTreeGroup->addAction(mShowNormalA); - viewMapper->setMapping(mShowNormalA, SeriesTreeModel::All); - connect(mShowNormalA, SIGNAL(triggered()), viewMapper, SLOT(map())); - mShowNormalA->setCheckable(true); - mShowNormalA->setChecked(true); - mShowBurnFilesA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Show Files to Burn"), this); - mShowBurnFilesA->setCheckable(true); - mShowTreeGroup->addAction(mShowBurnFilesA); - connect(mShowBurnFilesA, SIGNAL(toggled(bool)), mATree, SLOT(showForBurn(bool))); - //headers - mFilesTreeHeadersGroup = new QActionGroup(this); - QSignalMapper *fileTreeHeaderMapper = createHeaderMapper(filesModel, mFilesTreeHeadersGroup); - connect(fileTreeHeaderMapper, SIGNAL(mapped(QObject*)), mATree->filesWidget()->filesTree(), SLOT(toggleHeader(QObject*))); - mATree->filesWidget()->filesTree()->setHeaderGroup(mFilesTreeHeadersGroup); mFileSysHeaderGroup = new QActionGroup(this); QSignalMapper *fileSysHeaderMapper = createHeaderMapper(qobject_cast<SmTreeModel*>(mFSWidget->fileModel()), mFileSysHeaderGroup); connect(fileSysHeaderMapper, SIGNAL(mapped(QObject*)), mFSWidget->fileView(), SLOT(toggleHeader(QObject*))); @@ -560,117 +462,14 @@ void SheMov::createActions(){ connect(aFilesMapper, SIGNAL(mapped(QObject*)), controller->archiveFiles(), SLOT(toggleHeader(QObject*))); controller->archiveFiles()->setHeaderGroup(mArchiveFilesAG); - //Tree view hover - mHoverTreeGroup = new QActionGroup(this); - mHoverTreeGroup->setExclusive(false); - QSignalMapper *hoverMapper = new QSignalMapper(this); - mHoverPicsA = new QAction(QIcon(":/bald_pussy.png"), tr("Hover over pictures"), this); - mHoverPicsA->setData("ui/hoverpics"); - mHoverPicsA->setCheckable(true); - hoverMapper->setMapping(mHoverPicsA, mHoverPicsA); - connect(mHoverPicsA, SIGNAL(triggered()), hoverMapper, SLOT(map())); - mHoverTreeGroup->addAction(mHoverPicsA); - mHoverArchiveA = new QAction(QIcon(":/prince_albert.png"), tr("Hover over archive tree"), this); - mHoverArchiveA->setData("ui/hoverarchive"); - mHoverArchiveA->setCheckable(true); - hoverMapper->setMapping(mHoverArchiveA, mHoverArchiveA); - connect(mHoverArchiveA, SIGNAL(triggered()), hoverMapper, SLOT(map())); - mHoverTreeGroup->addAction(mHoverArchiveA); - mHoverMoviesA = new QAction(QIcon(":/ball_gag.png"), tr("Hover over movies"), this); - mHoverMoviesA->setData("ui/hovermovies"); - mHoverMoviesA->setCheckable(true); - hoverMapper->setMapping(mHoverMoviesA, mHoverMoviesA); - connect(mHoverMoviesA, SIGNAL(triggered()), hoverMapper, SLOT(map())); - mHoverTreeGroup->addAction(mHoverMoviesA); - - //Tree view filter - mFilterGroup = new QActionGroup(this); - mFilterMapper = new QSignalMapper(this); - mFilterBySeriesA = new QAction(QIcon(":/butt_plug.png"), tr("Series name"), this); - mFilterBySeriesA->setCheckable(true); - mFilterMapper->setMapping(mFilterBySeriesA, SeriesTreeWidget::FilterSeries); - connect(mFilterBySeriesA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterBySeriesA); - mFilterByActorA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Actor"), this); - mFilterByActorA->setCheckable(true); - mFilterMapper->setMapping(mFilterByActorA, SeriesTreeWidget::FilterActor); - connect(mFilterByActorA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterByActorA); - mFilterByGenreA = new QAction(QIcon(":/spreadingpants.png"), tr("Genre"), this); - mFilterByGenreA->setCheckable(true); - mFilterMapper->setMapping(mFilterByGenreA, SeriesTreeWidget::FilterGenre); - connect(mFilterByGenreA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterByGenreA); - mFilterByQualityA = new QAction(QIcon(":/shackles.png"), tr("Quality"), this); - mFilterByQualityA->setCheckable(true); - mFilterMapper->setMapping(mFilterByQualityA, SeriesTreeWidget::FilterQuality); - connect(mFilterByQualityA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterByQualityA); - mFilterByFilenameA = new QAction(QIcon(":/steel_collar.png"), tr("Filename"), this); - mFilterByFilenameA->setCheckable(true); - mFilterMapper->setMapping(mFilterByFilenameA, SeriesTreeWidget::FilterFileName); - connect(mFilterByFilenameA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterByFilenameA); - mFilterByDvdNoA = new QAction(QIcon(":/big_ass.png"), tr("Dvd No."), this); - mFilterByDvdNoA->setCheckable(true); - mFilterMapper->setMapping(mFilterByDvdNoA, SeriesTreeWidget::FilterDvdNo); - connect(mFilterByDvdNoA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterByDvdNoA); - mFilterBySizeA = new QAction(QIcon(":/hourglass_figure.png"), tr("Size"), this); - mFilterBySizeA->setCheckable(true); - mFilterMapper->setMapping(mFilterBySizeA, SeriesTreeWidget::FilterSize); - connect(mFilterBySizeA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); - mFilterGroup->addAction(mFilterBySizeA); - connect(mFilterMapper, SIGNAL(mapped(int)), mATree->seriesWidget(), SLOT(setFilterMode(int))); - mFilterFavoritesA = new QAction(QIcon(":/dog_hood.png"), tr("Favorites only"), this); - mFilterFavoritesA->setCheckable(true); - connect(mFilterFavoritesA, SIGNAL(triggered(bool)), this, SLOT(toggleFilterGroup(bool))); - connect(mFilterFavoritesA, SIGNAL(triggered(bool)), mATree->seriesWidget(), SLOT(filterFavorites(bool))); - //file view hover mFSHoverGroup = new QActionGroup(this); mFSHoverGroup->setExclusive(false); mHoverDirectoriesA = new QAction(QIcon(":/french_maid_dress.png"), tr("Hover over directories"), this); mHoverDirectoriesA->setData("ui/hoverdirs"); mHoverDirectoriesA->setCheckable(true); - hoverMapper->setMapping(mHoverDirectoriesA, mHoverDirectoriesA); - connect(mHoverDirectoriesA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mFSHoverGroup->addAction(mHoverDirectoriesA); - //connect hovermapper - connect(hoverMapper, SIGNAL(mapped(QObject*)), this, SLOT(toggleHover(QObject*))); - - //Tree FileWidget actions - mMoveToBurnA = new QAction(tr("Move to burn directory"), this); - connect(mMoveToBurnA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToBurn())); - mMoveToSeriesA = new QAction(tr("Move to series..."), this); - connect(mMoveToSeriesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToSeries())); - mMoveFilesA = new QAction(tr("Move to directory..."), this); - connect(mMoveFilesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToDirectory())); - mDeleteFilesFromTreeA = new QAction(tr("Delete file(s)..."), this); - connect(mDeleteFilesFromTreeA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(removeFiles())); - mFilePropertiesA = new QAction(tr("Properties..."), this); - connect(mFilePropertiesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(fileProperties())); - QSignalMapper *copyMapper = new QSignalMapper(this); - mCopyUnixFullPathA = new QAction(tr("Copy unix file"), this); - copyMapper->setMapping(mCopyUnixFullPathA, ArchiveTreeView::UnixFullPath); - connect(mCopyUnixFullPathA, SIGNAL(triggered()), copyMapper, SLOT(map())); - mCopyUnixDirA = new QAction(tr("Copy unix directory"), this); - copyMapper->setMapping(mCopyUnixDirA, ArchiveTreeView::UnixDir); - connect(mCopyUnixDirA, SIGNAL(triggered()), copyMapper, SLOT(map())); - mCopyWindowsFullPathA = new QAction(tr("Copy windows file"), this); - copyMapper->setMapping(mCopyWindowsFullPathA, ArchiveTreeView::WindowsFullPath); - connect(mCopyWindowsFullPathA, SIGNAL(triggered()), copyMapper, SLOT(map())); - mCopyWindowsDirA = new QAction(tr("Copy windows directory"), this); - copyMapper->setMapping(mCopyWindowsDirA, ArchiveTreeView::WindowsDir); - connect(mCopyWindowsDirA, SIGNAL(triggered()), copyMapper, SLOT(map())); - connect(copyMapper, SIGNAL(mapped(int)), mATree, SLOT(copyPath(int))); - mSuggestFileA = new QAction(QIcon(":/analstretcher.png"), tr("Suggest file for burning"), this); - connect(mSuggestFileA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(suggest())); - mShowTreeGroup->addAction(mSuggestFileA); - mPlaySelectedArchiveFilesA = new QAction(tr("Play selected...."), this); - connect(mPlaySelectedArchiveFilesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(playSelected())); - /* very unfortunate naming of variables: * picViewer: the actual PictureViewer2 window * picView: the picture files TreeView @@ -820,10 +619,7 @@ void SheMov::createActions(){ // misc mOpenWithMapperFS = new QSignalMapper(this); - mOpenWithMapperAV = new QSignalMapper(this); connect(mOpenWithMapperFS, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); - connect(mOpenWithMapperAV, SIGNAL(mapped(QString)), mATree, SLOT(playSelected(QString))); - connect(viewMapper, SIGNAL(mapped(int)), mATree, SLOT(setFileViewMode(int))); } void SheMov::createMenus(){ @@ -873,16 +669,6 @@ void SheMov::createMenus(){ mEditFSMenu->addAction(mConfigA); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); - //TreeView edit menu - mEditAVMenu = new QMenu(tr("&Edit"), this); - foreach(QAction *a, mEditGroup->actions()){ - mEditAVMenu->addAction(a); - } - mEditAVMenuA = menuBar()->addMenu(mEditAVMenu); - mEditAVMenu->addSeparator(); - mEditAVMenu->addAction(mEditActorsA); - mEditAVMenu->addAction(mEditGenresA); - //Pictures edit menu mEditPicMenu = new QMenu(tr("&Edit"), this); mEditPicMenu->addAction(mPWDeletePicFromA); @@ -893,33 +679,6 @@ void SheMov::createMenus(){ mArchiveEditMenu = new QMenu(tr("&Edit"), this); mArchiveMenuA = menuBar()->addMenu(mArchiveEditMenu); - //TreeView view menu - mTreeViewMenu = new QMenu(tr("&View"), this); - mTreeViewMenu->addAction(mShowNormalA); - mTreeViewMenu->addAction(mShowLocalA); - mTreeViewMenu->addAction(mShowArchivedA); - mTreeViewMenu->addAction(mShowBurnFilesA); - mTreeViewMenu->addAction(mSuggestFileA); - mTreeViewMenu->addSeparator(); - - mTreeHeaderMenu = new QMenu(tr("Show headers"), this); - mTreeHeaderMenu->addActions(mFilesTreeHeadersGroup->actions()); - mTreeViewMenu->addMenu(mTreeHeaderMenu); - mTreeViewMenu->addSeparator(); - - mTreeHoverMenu = new QMenu(tr("Hover over"), this); - mTreeHoverMenu->addActions(mHoverTreeGroup->actions()); - mTreeViewMenu->addMenu(mTreeHoverMenu); - mViewAVMenuA = menuBar()->addMenu(mTreeViewMenu); - mTreeViewMenu->addSeparator(); - - mTreeFilterMenu = new QMenu(tr("Filter by"), this); - mTreeFilterMenu->addActions(mFilterGroup->actions()); - mTreeViewMenu->addMenu(mTreeFilterMenu); - mTreeViewMenu->addSeparator(); - - mTreeViewMenu->addAction(mFilterFavoritesA); - //FileSystem view menu mFSViewMenu = new QMenu(tr("&View"), this); mFSHoverMenu = new QMenu(tr("Hover over"), this); @@ -947,7 +706,7 @@ void SheMov::createMenus(){ mPicViewMenu->addAction(mPWRefreshA); mViewPicMenuA = menuBar()->addMenu(mPicViewMenu); - //<delete me when fin> + //Movie archive QMenu *archiveHeaderMenu = new QMenu(tr("Show headers"), this); archiveHeaderMenu->addActions(mArchiveFilesAG->actions()); mArchiveViewMenu = new QMenu(tr("&View"), this); @@ -998,50 +757,7 @@ void SheMov::createMenus(){ mFSWidget->fileView()->addAction(mArchiveSelectedPicsA); mFSWidget->fileView()->addAction(mArchiveSelectedMovsA); - //ArchiveTreeView context menu - mATree->seriesWidget()->seriesTree()->addAction(mEditItemA); - mATree->seriesWidget()->seriesTree()->addAction(createSeparator()); - mATree->seriesWidget()->seriesTree()->addAction(mDeleteFromSeriesA); - mATree->seriesWidget()->seriesTree()->addAction(createSeparator()); - - mOpenWithMenuAV = new QMenu(tr("Open with"), this); - mATree->seriesWidget()->seriesTree()->addAction(mPlaySelectedAVA); - createOpenWithMenuAV(); - mOpenWithMenuAVA = new QAction(tr("Open with"), this); - mOpenWithMenuAVA->setMenu(mOpenWithMenuAV); - mATree->seriesWidget()->seriesTree()->addAction(mOpenWithMenuAVA); - mATree->seriesWidget()->seriesTree()->addAction(createSeparator()); - - mATree->seriesWidget()->seriesTree()->addAction(mExpandCurrentA); - mATree->seriesWidget()->seriesTree()->addAction(mExpandAllSeriesA); - mATree->seriesWidget()->seriesTree()->addAction(mCollapseAllSeriesA); - mATree->seriesWidget()->seriesTree()->addAction(createSeparator()); - - mATree->seriesWidget()->seriesTree()->addAction(mAddCoverA); - mATree->seriesWidget()->seriesTree()->addAction(createSeparator()); - - mATree->seriesWidget()->seriesTree()->addAction(mToggleFavoriteA); - - //ArchiveTreeView fileWidget context menu - mATree->filesWidget()->filesTree()->addAction(mPlaySelectedArchiveFilesA); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - mATree->filesWidget()->filesTree()->addAction(mMoveToBurnA); - mATree->filesWidget()->filesTree()->addAction(mMoveFilesA); - mATree->filesWidget()->filesTree()->addAction(mMoveToSeriesA); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - mATree->filesWidget()->filesTree()->addActions(mEditGroup->actions()); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - mATree->filesWidget()->filesTree()->addAction(mShowBurnFilesA); - mATree->filesWidget()->filesTree()->addAction(mSuggestFileA); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - mATree->filesWidget()->filesTree()->addAction(mDeleteFilesFromTreeA); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - // Archive tree (exp.) + // Movie archive ArchiveController *c = SmGlobals::instance()->archiveController(); c->addActionForTree(mArchiveViewRenameA); c->addActionForTree(createSeparator()); @@ -1064,23 +780,6 @@ void SheMov::createMenus(){ mArchiveEditMenu->addMenu(archiveTreeM); mArchiveEditMenu->addMenu(archiveFilesM); - /*mArchiveEditMenu->addActions(c->archiveTree()->actions()); - mArchiveEditMenu->addAction(createSeparator()); - mArchiveEditMenu->addActions(c->archiveFiles()->actions());*/ - - QMenu *copyMenu = new QMenu(this); - copyMenu->addAction(mCopyUnixFullPathA); - copyMenu->addAction(mCopyUnixDirA); - copyMenu->addSeparator(); - copyMenu->addAction(mCopyWindowsFullPathA); - copyMenu->addAction(mCopyWindowsDirA); - - QAction *copyAction = new QAction(tr("Copy to clipboard"), this); - copyAction->setMenu(copyMenu); - mATree->filesWidget()->filesTree()->addAction(copyAction); - mATree->filesWidget()->filesTree()->addAction(createSeparator()); - - mATree->filesWidget()->filesTree()->addAction(mFilePropertiesA); } void SheMov::createOpenWithMenuFS(){ @@ -1113,25 +812,6 @@ void SheMov::createOpenWithMenuFS(){ } } -void SheMov::createOpenWithMenuAV(){ - if(mOpenWithGroupAV){ - foreach(QAction *a, mOpenWithGroupAV->actions()){ - mOpenWithMenuAV->removeAction(a); - } - //this deletes all actions in the group also! - mOpenWithGroupAV->deleteLater(); - } - mOpenWithGroupAV = new QActionGroup(this); - QSettings s; - QStringList players = s.value("programs_movieviewer/data").toHash().keys(); - foreach(QString p, players){ - QAction *a = new QAction(p, mOpenWithGroupAV); - mOpenWithMenuAV->addAction(a); - mOpenWithMapperAV->setMapping(a, p); - connect(a, SIGNAL(triggered()), mOpenWithMapperAV, SLOT(map())); - } -} - void SheMov::createToolBar(){ QToolBar *toolBar = new QToolBar(this); toolBar->addAction(mBackDirA); @@ -1139,22 +819,10 @@ void SheMov::createToolBar(){ toolBar->addSeparator(); toolBar->addAction(mConfigA); toolBar->addSeparator(); - toolBar->addAction(mShowNormalA); - toolBar->addAction(mShowArchivedA); - toolBar->addAction(mShowLocalA); - toolBar->addAction(mShowBurnFilesA); - toolBar->addAction(mSuggestFileA); - toolBar->addSeparator(); - toolBar->addActions(mFilterGroup->actions()); - toolBar->addAction(mFilterFavoritesA); - toolBar->addSeparator(); toolBar->addActions(mPicActionGroup->actions()); toolBar->addAction(mPVToggleA); toolBar->addSeparator(); - toolBar->addAction(mHoverPicsA); - toolBar->addAction(mHoverArchiveA); toolBar->addAction(mHoverDirectoriesA); - toolBar->addAction(mHoverMoviesA); toolBar->addSeparator(); toolBar->addAction(mMountDvdA); addToolBar(Qt::LeftToolBarArea, toolBar); @@ -1163,17 +831,6 @@ void SheMov::createToolBar(){ void SheMov::writeSettings(){ QSettings s; s.setValue("ui/selectedtab", mTab->currentIndex()); - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - s.setValue("ui/filestreemode", filesModel->mode()); - QList<QVariant> visibleHeaders; - foreach(QAction *a, mFilesTreeHeadersGroup->actions()){ - if(a->isChecked()){ - visibleHeaders << a->data(); - } - } - s.setValue("ui/visibleheaders", visibleHeaders); - mATree->filesWidget()->filesTree()->writeHeaderConfig(); - s.setValue("ui/showallfiles", mShowBurnFilesA->isChecked()); } void SheMov::readSettings(){ @@ -1183,10 +840,7 @@ void SheMov::readSettings(){ mTab->setCurrentIndex(currentTab); } tabChanged(currentTab); - mHoverPicsA->setChecked(s.value("ui/hoverpics").toBool()); - mHoverArchiveA->setChecked(s.value("ui/hoverarchive").toBool()); mHoverDirectoriesA->setChecked(s.value("ui/hoverdirs").toBool()); - mHoverMoviesA->setChecked(s.value("ui/hovermovies").toBool()); QString dvdMount = s.value("paths/dvdmount").toString(); if(dvdMount.isEmpty()){ mMountDvdA->setEnabled(false); @@ -1197,17 +851,6 @@ void SheMov::readSettings(){ mMountDvdA->setChecked(false); } } - - int seriesFilterMode = s.value("archive/filtermode").toInt(); - QAction *filterAction = qobject_cast<QAction*>(mFilterMapper->mapping(seriesFilterMode)); - if(filterAction){ - filterAction->trigger(); - mATree->seriesWidget()->filter(); - } - bool showAllFiles = s.value("ui/showallfiles").toBool(); - if(showAllFiles){ - mShowBurnFilesA->trigger(); - } createPalette(); } @@ -1268,28 +911,6 @@ void SheMov::checkConsistency(){ c.exec(); } -/*void SheMov::analyzeDelete(int mode, QList<int> &ids){ - QString message = QString(tr("Really delete %1 items?")).arg(QString::number(ids.count())); - int res = QMessageBox::question(this, tr("Delete items"), message, QMessageBox::Yes | QMessageBox::No); - if(res != QMessageBox::Yes){ - return; - } - MappingTableModel *model = 0; - switch(mode){ - case DbAnalyzerDialog::Actors: - model = qobject_cast<MappingTableModel*>(SmGlobals::instance()->model("actors")); - break; - case DbAnalyzerDialog::Genres: - model = qobject_cast<MappingTableModel*>(SmGlobals::instance()->model("genres")); - break; - default: - ; - } - Q_ASSERT(model); - model->deleteItems(ids); - mDbAnalyzerDialog->refresh(); -}*/ - void SheMov::toggleHover(QObject *object){ QAction *action = qobject_cast<QAction*>(object); if(action){ @@ -1305,15 +926,6 @@ void SheMov::checkMount(bool mounted){ mMountDvdA->setChecked(mounted); } -void SheMov::toggleFilterGroup(bool checked){ - mFilterGroup->setEnabled(!checked); -} - -void SheMov::editMappings(QString table){ - MappingTableEditor ed(table, this); - ed.exec(); -} - void SheMov::newPicsDialog(){ mNewPicsDialog->exec(); } @@ -16,7 +16,7 @@ class FilesystemWidget; class QLabel; class QSignalMapper; class QActionGroup; -class ArchiveTreeView; +//class ArchiveTreeView; class NewMovieWizard; class PicturesWidget; class SmTreeModel; @@ -27,7 +27,7 @@ class SheMov : public QMainWindow { Q_OBJECT public: SheMov(QWidget *parent = 0, Qt::WindowFlags flags = 0); - enum TabNum { FileManager = 0, Archive = 1, Experimental = 2, Pictures = 3 }; + enum TabNum { FileManager = 0, Movies = 1, Pictures = 2 }; virtual ~SheMov() {} protected: @@ -49,8 +49,6 @@ class SheMov : public QMainWindow { void checkConsistency(); void toggleHover(QObject *object); void checkMount(bool mounted); - void toggleFilterGroup(bool checked); - void editMappings(QString table); void newPicsDialog(); void newPicsDialogWithFiles(); void rebuildFrameCache(); @@ -70,7 +68,6 @@ class SheMov : public QMainWindow { void createActions(); void createMenus(); void createOpenWithMenuFS(); - void createOpenWithMenuAV(); void createToolBar(); void writeSettings(); void readSettings(); @@ -86,7 +83,6 @@ class SheMov : public QMainWindow { //Actions QAction *mQuitA; QAction *mMarkFilesA; - QAction *mToggleFavoriteA; QAction *mUnmarkFilesA; QAction *mCreateFolderA; QAction *mDeleteFilesA; @@ -103,60 +99,14 @@ class SheMov : public QMainWindow { QAction *mAboutQtA; QAction *mStatisticsA; QAction *mPlaySelectedFSA; - QAction *mPlaySelectedAVA; QAction *mOpenWithMenuFSA; - QAction *mOpenWithMenuAVA; QAction *mArchiveSelectedMovsA; QAction *mArchiveSelectedPicsA; QAction *mConsistencyA; QAction *mNewPicsA; QAction *mHoverDirectoriesA; QAction *mRebuildFrameCacheA; - - //TreeView Actions - //Series Actions - QAction *mDeleteFromSeriesA; - QAction *mExpandAllSeriesA; - QAction *mCollapseAllSeriesA; - QAction *mExpandCurrentA; QAction *mNewMovieWizardA; - QAction *mAddCoverA; - QAction *mEditItemA; - - //TreeView View Actions - QAction *mShowLocalA; - QAction *mShowArchivedA; - QAction *mShowNormalA; - QAction *mShowBurnFilesA; - QActionGroup *mShowTreeGroup; - QAction *mHoverPicsA; - QAction *mHoverArchiveA; - QAction *mHoverMoviesA; - QActionGroup *mHoverTreeGroup; - QAction *mFilterBySeriesA; - QAction *mFilterByActorA; - QAction *mFilterByGenreA; - QAction *mFilterByQualityA; - QAction *mFilterByFilenameA; - QAction *mFilterByDvdNoA; - QAction *mFilterBySizeA; - QActionGroup *mFilterGroup; - QAction *mFilterFavoritesA; - QAction *mEditGenresA; - QAction *mEditActorsA; - - //TreeView FileWidget Actions - QAction *mMoveToBurnA; - QAction *mMoveToSeriesA; - QAction *mMoveFilesA; - QAction *mDeleteFilesFromTreeA; - QAction *mFilePropertiesA; - QAction *mCopyUnixFullPathA; - QAction *mCopyUnixDirA; - QAction *mCopyWindowsFullPathA; - QAction *mCopyWindowsDirA; - QAction *mSuggestFileA; - QAction *mPlaySelectedArchiveFilesA; QAction *mMoveToArchiveA; //Filesystem View Actions @@ -164,10 +114,8 @@ class SheMov : public QMainWindow { QActionGroup *mOpenWithGroupFS; QActionGroup *mOpenWithGroupAV; - QActionGroup *mFilesTreeHeadersGroup; QActionGroup *mFileSysHeaderGroup; QActionGroup *mPicsTreeHeaderGroup; - QActionGroup *mEditGroup; //PictureWidget Actions //PW = mPicWidget @@ -210,35 +158,25 @@ class SheMov : public QMainWindow { QAction *mAnalyzePartsA; QSignalMapper *mOpenWithMapperFS; - QSignalMapper *mOpenWithMapperAV; - QSignalMapper *mFilterMapper; QMenu *mEditFSMenu; QMenu *mEditAVMenu; QMenu *mEditPicMenu; QMenu *mArchiveEditMenu; QMenu *mOpenWithMenuFS; - QMenu *mOpenWithMenuAV; - QMenu *mTreeViewMenu; QMenu *mFSViewMenu; QMenu *mPicViewMenu; QMenu *mArchiveViewMenu; - QMenu *mTreeHeaderMenu; - QMenu *mTreeHoverMenu; - QMenu *mTreeFilterMenu; QMenu *mFSHoverMenu; QAction *mEditFSMenuA; - QAction *mEditAVMenuA; QAction *mEditPicMenuA; QAction *mViewFSMenuA; - QAction *mViewAVMenuA; QAction *mViewPicMenuA; QAction *mArchiveViewMenuA; //widgets + dialogs QTabWidget *mTab; FilesystemWidget *mFSWidget; - ArchiveTreeView *mATree; NewMovieWizard *mNewMovieWizard; NewPicsDialog *mNewPicsDialog; PicturesWidget *mPicWidget; @@ -19,11 +19,6 @@ SOURCES = main.cpp \ smtreeitem.cpp \ smtreemodel.cpp \ smglobals.cpp \ - archivetreeview.cpp \ - seriestreewidget.cpp \ - seriestreemodel.cpp \ - filestreemodel.cpp \ - filestreewidget.cpp \ mappingtablemodel.cpp \ mappingtablewidget.cpp \ newmoviewizard.cpp \ @@ -62,11 +57,6 @@ HEADERS = \ smtreeitem.h \ smtreemodel.h \ smglobals.h \ - archivetreeview.h \ - seriestreewidget.h \ - seriestreemodel.h \ - filestreemodel.h \ - filestreewidget.h \ mappingtablemodel.h \ mappingtablewidget.h \ newmoviewizard.h \ diff --git a/smglobals.cpp b/smglobals.cpp index 7fb928f..2ed698c 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -21,9 +21,7 @@ #include <X11/extensions/Xfixes.h> #include "smglobals.h" -#include "seriestreemodel.h" #include "archivemodel.h" -#include "filestreemodel.h" #include "mappingtablemodel.h" #include "seriesmetadatamodel.h" #include "mappingtreemodel.h" @@ -65,19 +63,7 @@ SmGlobals *SmGlobals::instance(){ } QAbstractItemModel *SmGlobals::model(const QString &which){ - if(which == "SeriesModel"){ - if(!mModels.contains(which)){ - QStringList headers = QStringList() << tr("Series") << tr("Series ID") << tr("Series part ID") << tr("Part") << tr("Type") << tr("Favorite") << tr("Subtitle") << tr("Is Local"); - SeriesTreeModel *model = new SeriesTreeModel(headers); - mModels.insert(which, model); - } - }else if(which == "FilesModel"){ - if(!mModels.contains(which)){ - QStringList headers = QStringList() << tr("Name") << tr("Part") << tr("Size") << tr("Qual.") << tr("Dvd") << tr("Full Path") << tr("Size (int)") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID") << tr("Seriespart") << tr("Display name") << tr("Dur./Size") << tr("Series name") << tr("Favorite"); - FilesTreeModel *model = new FilesTreeModel(headers); - mModels.insert(which, model); - } - }else if(which == "actors"){ + if(which == "actors"){ if(!mModels.contains(which)){ QStringList headers = QStringList() << tr("Actor") << tr("Id"); MappingTableModel *model = new MappingTableModel(headers, "actors"); |