summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivetreeview.cpp321
-rw-r--r--archivetreeview.h75
-rw-r--r--filestreemodel.cpp655
-rw-r--r--filestreemodel.h100
-rw-r--r--filestreewidget.cpp611
-rw-r--r--filestreewidget.h121
-rw-r--r--newmoviewizard.cpp2
-rw-r--r--seriestreemodel.cpp668
-rw-r--r--seriestreemodel.h101
-rw-r--r--seriestreewidget.cpp710
-rw-r--r--seriestreewidget.h185
-rw-r--r--shemov.cpp418
-rw-r--r--shemov.h66
-rw-r--r--shemov.pro10
-rw-r--r--smglobals.cpp16
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
diff --git a/shemov.cpp b/shemov.cpp
index 78097f1..7a905c4 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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();
}
diff --git a/shemov.h b/shemov.h
index d8f7eef..aab035a 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;
diff --git a/shemov.pro b/shemov.pro
index 95d0278..e909328 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -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");