From 5cfaa2c755c52c2ccbdd88ea3239dafb120a179b Mon Sep 17 00:00:00 2001
From: Arno
Date: Sat, 27 Jul 2013 11:31:08 +0200
Subject: Get rid of old archive
Yeah, finally it's gone! Lot's of useless, unneeded code vanished :)
---
archivetreeview.cpp | 321 -----------------------
archivetreeview.h | 75 ------
filestreemodel.cpp | 655 -----------------------------------------------
filestreemodel.h | 100 --------
filestreewidget.cpp | 611 --------------------------------------------
filestreewidget.h | 121 ---------
newmoviewizard.cpp | 2 -
seriestreemodel.cpp | 668 ------------------------------------------------
seriestreemodel.h | 101 --------
seriestreewidget.cpp | 710 ---------------------------------------------------
seriestreewidget.h | 185 --------------
shemov.cpp | 418 ++----------------------------
shemov.h | 66 +----
shemov.pro | 10 -
smglobals.cpp | 16 +-
15 files changed, 18 insertions(+), 4041 deletions(-)
delete mode 100644 archivetreeview.cpp
delete mode 100644 archivetreeview.h
delete mode 100644 filestreemodel.cpp
delete mode 100644 filestreemodel.h
delete mode 100644 filestreewidget.cpp
delete mode 100644 filestreewidget.h
delete mode 100644 seriestreemodel.cpp
delete mode 100644 seriestreemodel.h
delete mode 100644 seriestreewidget.cpp
delete mode 100644 seriestreewidget.h
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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#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(SmGlobals::instance()->model("actors"));
- mGenresModel = static_cast(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(SmGlobals::instance()->model("SeriesModel"));
- connect(mSeriesModel, SIGNAL(localsChanged()), this, SLOT(invalidateSorting()));
- SmGlobals::instance()->setSeriesTreeWidget(mSeriesWidget);
-
- // files view
- mFilesWidget = new FilesTreeWidget;
- mFilesModel = qobject_cast(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 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 zeroUsers = model->zeroUsers();
- if(zeroUsers.isEmpty()){
- QMessageBox::information(this, tr("Message"), tr("Nothing to clean up!"));
- return;
- }
- QString message = QString(tr("Really delete these items from %1?
")).arg(table);
- message.append("
");
- QStringList userNames = zeroUsers.keys();
- qSort(userNames);
- foreach(QString s, userNames){
- message.append(QString("- %1
").arg(s));
- }
- message.append("
");
- int answer = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No);
- if(answer == QMessageBox::Yes){
- QList 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 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 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 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(QListseriesPartIds, MappingTableModel *model, MappingTableWidget *widget){
- QStringList items;
- foreach(int id, seriesPartIds){
- QList 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 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
-
-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 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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#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(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 &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(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 files = filesBySeriesPartId(seriesPartId);
- QString retval = QString(tr("%1 %2
")).arg(seriesPartIdx.data(SeriesTreeModel::NameRole).toString()).arg(QString::number(seriesPartIdx.data(SeriesTreeModel::SeriesPartRole).toInt()));
- retval.append(QString(tr("Files:
")));
- retval.append(tr(""));
- QHash::const_iterator it = files.constBegin();
- while(it != files.constEnd()){
- retval.append(QString("- %1
").arg(it.key()));
- ++it;
- }
- retval.append(tr("
"));
- 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(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(retval);
-}
-
-QHash FilesTreeModel::filesBySeriesPartId(int seriesPartId) const{
- mFilesQuery->bindValue(":id", seriesPartId);
- QHash retval;
- if(mFilesQuery->exec()){
- while(mFilesQuery->next()){
- retval.insert(mFilesQuery->value(0).toString(), mFilesQuery->value(1).toString());
- }
- }
- return retval;
-}
-
-QList > FilesTreeModel::streamInfo(const QString &path) const{
- QList > 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 lines = ffData.split('\n');
- QMap 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 > FilesTreeModel::streamInfo(const QModelIndex &idx) const{
- return streamInfo(idx.data(FullPathRole).toString());
-}
-
-QMap FilesTreeModel::pictureInfo(const QString &path) const{
- QMap 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 FilesTreeModel::pictureInfo(const QModelIndex &idx) const{
- return pictureInfo(idx.data(FullPathRole).toString());
-}
-
-QMap FilesTreeModel::pictureMetaInfo(const QModelIndex &idx){
- QMap 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 &files){
- foreach(QPersistentModelIndex i, files){
- bool retval = deleteFile(i);
- if(!retval){
- return false;
- }
- }
- return true;
-}
-
-bool FilesTreeModel::updateSeries(int newSeries, QList 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::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();
- QVariant archived = s.value("ui/archivedcolor", QVariant(QColor(Qt::black)));
- mArchivedColor = archived.value();
- QVariant favorite = s.value("ui/favoritecolor", QVariant(QColor(Qt::red)));
- mFavoriteColor = favorite.value();
-}
-
-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 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 > 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 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
-#include
-#include
-#include
-#include
-#include
-
-#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 fileTypes() const { return mFileTypes; }
- const QHash coverTypes() const { return mCoverTypes; }
- const QHash 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 &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 filesBySeriesPartId(int seriesPartId) const;
- QList > streamInfo(const QModelIndex &idx) const;
- QList > streamInfo(const QString &path) const;
- QMap pictureInfo(const QString &path) const;
- QMap pictureInfo(const QModelIndex &idx) const;
- QMap 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 &files);
- bool updateSeries(int newSeries, QList 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 mFileTypes;
- QHash mCoverTypes;
- QHash mPicsDurationCache;
- QHash mEditableColumns;
- SeriesTreeModel *mSeriesModel;
- int mMode;
- const int mMagic;
- QColor mLocalColor;
- QColor mArchivedColor;
- QColor mFavoriteColor;
- qint64 mDvdSize;
- QList 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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#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(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(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 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("Really delete these file(s):
"));
- foreach(QModelIndex i, selected){
- message.append(QString(tr("- %1
")).arg(i.data(FilesTreeModel::FileNameRole).toString()));
- }
- message.append("
");
- int retval = QMessageBox::critical(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No);
- if(retval == QMessageBox::Yes){
- QList 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 > fileData = mModel->streamInfo(real);
- mPropDlg->setFileName(real.data(FilesTreeModel::FileNameRole).toString());
- mPropDlg->setStreamData(fileData);
- }else if(mimeType.startsWith("image")){
- QMap imageData = mModel->pictureInfo(real);
- mPropDlg->addData("Image data", imageData);
- QMap 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 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();
- 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 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 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(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(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(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(SmGlobals::instance()->model("FilesModel"));
- QHash 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("%1
")).arg(seriesPartIdx.data().toString());
- retval.append(QString(tr("Files:
")));
- retval.append(tr(""));
- QHash::const_iterator it = files.constBegin();
- while(it != files.constEnd()){
- retval.append(QString("- %1
").arg(it.key()));
- ++it;
- }
- retval.append(tr("
"));
- return retval;
-}
-
-const QString FilesTreeView::metaDataText(const QModelIndex &idx) const{
- if(!idx.isValid()){
- return QString();
- }
- SeriesMetadataModel *metaDataModel = qobject_cast(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 metaData = metaDataModel->dataList(mdIdx);
- QString retval("Metadata
");
- retval.append(QString(tr("Release Year | %1 |
")).arg(QString::number(metaData.at(SeriesMetadataModel::ReleaseYear).toInt())));
- retval.append(QString(tr("Encoding Passes | %1 |
")).arg(QString::number(metaData.at(SeriesMetadataModel::Passes).toInt())));
- retval.append(QString(tr("Release Group | %1 |
")).arg(metaData.at(SeriesMetadataModel::ReleaseGroup).toString()));
- retval.append(QString(tr("Source Medium | %1 |
")).arg(metaData.at(SeriesMetadataModel::SourceMedium).toString()));
- retval.append(QString(tr("Usenet Subject | %1 |
")).arg(metaData.at(SeriesMetadataModel::Subject).toString()));
- retval.append(QString(tr("Encoder Options | %1 |
")).arg(metaData.at(SeriesMetadataModel::EncoderOpts).toString()));
- QDate dateAdded = metaData.at(SeriesMetadataModel::Added).toDate();
- retval.append(QString(tr("Added | %1 |
")).arg(dateAdded.toString(Qt::ISODate)));
- retval.append(QString(tr("Comment | %1 |
")).arg(metaData.at(SeriesMetadataModel::Comment).toString()));
- retval.append("
");
- 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 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(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(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
-#include
-#include
-#include
-
-#include "smtreeview.h"
-
-typedef QList 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 files, QWidget *parent = 0, Qt::WindowFlags f = 0);
-
- public slots:
- virtual void accept();
-
- private:
- QPushButton *mOk;
- QPushButton *mCancel;
- SmTreeView *mTree;
- SeriesTreeModel *mModel;
- QList 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
-#include
-#include
-#include
-#include
-#include
-#include
-
-#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(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 SeriesTreeModel::childrenColumnList(const QModelIndex &parent, int column) const{
- if(!parent.isValid()){
- return QList();
- }
- SmTreeItem *item = static_cast(parent.internalPointer());
- QList 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(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 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 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 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 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 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 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 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 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();
- 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(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 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 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(from.internalPointer());
- SmTreeItem *newParent = static_cast(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 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(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(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(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(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
-#include
-#include
-#include
-
-#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 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 mSeriesPartSeriesMap;
- QHash 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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#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(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 series;
- QList 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 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("This operation will delete %1 file(s) permanently:
")).arg(files.count());
- message.append(tr(""));
- int ctr = 0;
- foreach(QFileInfo f, files){
- ++ctr;
- QString li = QString(tr("- %1
")).arg(f.absoluteFilePath());
- message.append(li);
- if(ctr == 20){
- QString elide = QString(tr("- (%1 more files)
")).arg(files.count() - ctr);
- message.append(elide);
- break;
- }
- }
- message.append(tr("
"));
- message.append(tr("Continue?
"));
- }else{
- message = QString(tr("This operation will delete no files. Continue?
"));
- }
- 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(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(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() << 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(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(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(SmGlobals::instance()->model("FilesModel"));
- QHash 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::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(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
-#include
-#include
-
-#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 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
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
#include
#include
-#include
+#include
#include
-#include
-#include
+#include
+#include
#include
@@ -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(SmGlobals::instance()->model("FilesModel"));
- const QHash editableColumns = filesModel->editableColumns();
- mEditGroup = new QActionGroup(this);
- for(QHash::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(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);
- //
+ //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(SmGlobals::instance()->model("FilesModel"));
- s.setValue("ui/filestreemode", filesModel->mode());
- QList 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(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 &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(SmGlobals::instance()->model("actors"));
- break;
- case DbAnalyzerDialog::Genres:
- model = qobject_cast(SmGlobals::instance()->model("genres"));
- break;
- default:
- ;
- }
- Q_ASSERT(model);
- model->deleteItems(ids);
- mDbAnalyzerDialog->refresh();
-}*/
-
void SheMov::toggleHover(QObject *object){
QAction *action = qobject_cast(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
#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");
--
cgit v1.2.3-70-g09d2