diff options
-rw-r--r-- | archivebrowser.cpp | 35 | ||||
-rw-r--r-- | archivebrowser.h | 34 | ||||
-rw-r--r-- | archivebrowsermodel.cpp | 120 | ||||
-rw-r--r-- | archivebrowsermodel.h | 31 | ||||
-rw-r--r-- | archiveview.cpp | 1 | ||||
-rw-r--r-- | shemov.cpp | 7 | ||||
-rw-r--r-- | shemov.h | 2 | ||||
-rw-r--r-- | shemov.pro | 8 | ||||
-rw-r--r-- | smglobals.cpp | 5 |
9 files changed, 241 insertions, 2 deletions
diff --git a/archivebrowser.cpp b/archivebrowser.cpp new file mode 100644 index 0000000..5eda9d6 --- /dev/null +++ b/archivebrowser.cpp @@ -0,0 +1,35 @@ +/* + 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 <QVBoxLayout> +#include <QSortFilterProxyModel> + +#include "archivebrowser.h" +#include "archivebrowsermodel.h" +#include "smtreeview.h" +#include "smglobals.h" +#include "delegates.h" + +ArchiveBrowser::ArchiveBrowser(QWidget *parent) : QWidget(parent){ + //prep + mModel = static_cast<ArchiveBrowserModel*>(SmGlobals::instance()->model("BrowserModel")); + mProxy = new QSortFilterProxyModel; + mProxy->setSourceModel(mModel); + mTree = new SmTreeView; + mTree->setModel(mProxy); + mTree->setColumnHidden(ArchiveBrowserModel::GenericId, true); + mTree->setColumnHidden(ArchiveBrowserModel::NodeType, true); + mTree->setSortingEnabled(true); + mTree->setItemDelegateForColumn(ArchiveBrowserModel::TotalSize, new SizeDelegate(this)); + mTree->setItemDelegateForColumn(ArchiveBrowserModel::FileType, new FileTypeDelegate(this)); + mTree->setSelectionMode(QAbstractItemView::ExtendedSelection); + + //make widget + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(mTree); + setLayout(mainLayout); +} diff --git a/archivebrowser.h b/archivebrowser.h new file mode 100644 index 0000000..cd43415 --- /dev/null +++ b/archivebrowser.h @@ -0,0 +1,34 @@ +/* + 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 ARCHIVEBROWSER_H +#define ARCHIVEBROWSER_H + +#include <QWidget> + +#include "smtreeview.h" + +class ArchiveBrowserModel; +class SmTreeView; +class QSortFilterProxyModel; + +class ArchiveBrowser : public QWidget { + Q_OBJECT + public: + explicit ArchiveBrowser(QWidget *parent = 0); + + signals: + + public slots: + + private: + SmTreeView *mTree; + ArchiveBrowserModel *mModel; + QSortFilterProxyModel *mProxy; +}; + +#endif // ARCHIVEBROWSER_H diff --git a/archivebrowsermodel.cpp b/archivebrowsermodel.cpp new file mode 100644 index 0000000..26dc438 --- /dev/null +++ b/archivebrowsermodel.cpp @@ -0,0 +1,120 @@ +/* + 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 <QSqlDatabase> +#include <QSqlQuery> + +#include "archivebrowsermodel.h" +#include "smtreeitem.h" +#include "helper.h" + +ArchiveBrowserModel::ArchiveBrowserModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mNumFields(7) { + mDb = QSqlDatabase::database("treedb"); + populate(); +} + +QVariant ArchiveBrowserModel::data(const QModelIndex &index, int role) const { + SmTreeItem *item = itemAt(index); + int col = index.column(); + if(role == Qt::DisplayRole && index.column() == 0){ + return item->data(Name); + } + if(role == NameRole){ + return item->data(Name); + } + if(role == GenericIdRole){ + return item->data(GenericId); + } + if(role == NodeTypeRole){ + return item->data(NodeType); + } + if(role == TotalSizeRole){ + return item->data(TotalSize); + } + if(role == QualityRole){ + return item->data(Quality); + } + if(role == FileTypeRole){ + return item->data(FileType); + } + if(role == FullPathRole){ + return item->data(FullPath); + } + if(role == Qt::ForegroundRole){ + if(col == TotalSize){ + qint64 s = item->data(TotalSize).toDouble(); + QColor retval = Qt::green; + if(s > Q_INT64_C(1024 * 1024 * 1024 * 2)){ + retval = Qt::cyan; + } + if(s > Q_INT64_C(1024 * 1024 * 1024 * 4)){ + retval = Qt::red; + } + return retval; + } + if(col == Quality){ + int q = item->data(Quality).toInt(); + QColor retval = Qt::green; + if(q < 8){ + retval = Qt::red; + } + return retval; + } + } + if(role == Qt::TextAlignmentRole){ + if(col == TotalSize || col == Quality){ + int retval = Qt::AlignRight | Qt::AlignVCenter; + return retval; + } + } + return SmTreeModel::data(index, role); +} + +Qt::ItemFlags ArchiveBrowserModel::flags(const QModelIndex &index) const{ + SmTreeItem *item = itemAt(index); + int nt = item->data(NodeType).toInt(); + if(nt == FileNode){ + return Qt::ItemIsEnabled; + } + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +void ArchiveBrowserModel::populate(){ + SmTreeItem *rootItem = new SmTreeItem(mNumFields); + QSqlQuery localFilesQ(mDb); + localFilesQ.prepare("SELECT tfilename, bisize, sifiletype, siquality, cmd5sum FROM files WHERE iseriespart_id = :sid ORDER BY sifiletype"); + QSqlQuery localQ = QSqlQuery("SELECT DISTINCT(series.iseries_id), tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle, seriesparts.iseriesparts_id FROM series LEFT JOIN seriesparts ON series.iseries_id = seriesparts.iseries_id LEFT JOIN files ON seriesparts.iseriesparts_id = files.iseriespart_id WHERE files.sifiletype = 1 AND files.idvd < 1 ORDER BY tseries_name ASC", mDb); + while(localQ.next()){ + QList<QVariant> serPartData; + QString name; + if(localQ.value(2).toInt() > 0){ + name = QString("%1 %2").arg(localQ.value(1).toString()).arg(QString::number(localQ.value(2).toInt())); + }else{ + name = QString("%1 - %2").arg(localQ.value(1).toString()).arg(localQ.value(3).toString()); + } + serPartData << name << localQ.value(4) << SeriesPartNode << QVariant() << QVariant() << QVariant() << QString(); + SmTreeItem *seriesItem = new SmTreeItem(serPartData, rootItem); + rootItem->appendChild(seriesItem); + localFilesQ.bindValue(":sid", localQ.value(4)); + localFilesQ.exec(); + qint64 totalSize = 0; + int quality = -1; + while(localFilesQ.next()){ + QList<QVariant> fileData; + fileData << localFilesQ.value(0) << QVariant() << FileNode << localFilesQ.value(1) << localFilesQ.value(3) << localFilesQ.value(2) << Helper::createArchivePath(localFilesQ.value(0).toString(), localFilesQ.value(4).toString()); + totalSize += localFilesQ.value(1).toDouble(); + if(localFilesQ.value(2) == 1){ //this is a movie file, no need for another enum + quality = localFilesQ.value(3).toInt(); + } + SmTreeItem *fileItem = new SmTreeItem(fileData, seriesItem); + seriesItem->appendChild(fileItem); + } + seriesItem->setData(Quality, quality); + seriesItem->setData(TotalSize, totalSize); + } + setRoot(rootItem); +} diff --git a/archivebrowsermodel.h b/archivebrowsermodel.h new file mode 100644 index 0000000..3b7fc14 --- /dev/null +++ b/archivebrowsermodel.h @@ -0,0 +1,31 @@ +/* + 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 ARCHIVEBROWSERMODEL_H +#define ARCHIVEBROWSERMODEL_H + +#include <QSqlDatabase> + +#include "smtreemodel.h" + +class ArchiveBrowserModel : public SmTreeModel { + Q_OBJECT + public: + enum CustomRoles { NameRole = Qt::UserRole + 1, GenericIdRole = Qt::UserRole + 2, NodeTypeRole = Qt::UserRole + 3, TotalSizeRole = Qt::UserRole + 4, QualityRole = 5, FileTypeRole = Qt::UserRole + 6, FullPathRole = Qt::UserRole + 7 }; + enum Fields { Name = 0, GenericId = 1, NodeType = 2, TotalSize = 3, Quality = 4, FileType = 5, FullPath = 6 }; + enum NodeTypes { SeriesPartNode = 1, FileNode = 2 }; + explicit ArchiveBrowserModel(const QStringList &headers, QObject *parent = 0); + virtual QVariant data(const QModelIndex &index, int role) const; + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + + private: + void populate(); + int mNumFields; + QSqlDatabase mDb; +}; + +#endif // ARCHIVEBROWSERMODEL_H diff --git a/archiveview.cpp b/archiveview.cpp index b551357..8df9bb6 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -31,6 +31,7 @@ #include "delegates.h" #include "smglobals.h" #include "helper.h" +#include "delegates.h" ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { QSettings s; @@ -35,6 +35,7 @@ #include "smdirmodel.h" #include "archiveview.h" #include "archivecontroller.h" +#include "archivebrowser.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon @@ -76,6 +77,12 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla connect(mPicWidget->picView(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); PictureViewer2 *picViewer = SmGlobals::instance()->pictureViewer(); + //archivebrower + splash.showMessage(tr("Creating Archive Browser..."), Qt::AlignHCenter, Qt::yellow); + qApp->processEvents(); + ArchiveBrowser *mArchiveBrowser = new ArchiveBrowser; + mTab->addTab(mArchiveBrowser, tr("Archive Browser")); + //newmoviewizard + dbanalyzer + newpicsdialog splash.showMessage(tr("Creating misc. Dialogs..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); @@ -21,6 +21,7 @@ class PicturesWidget; class SmTreeModel; class NewPicsDialog; class ArchiveView; +class ArchiveBrowser; class SheMov : public QMainWindow { Q_OBJECT @@ -187,5 +188,6 @@ class SheMov : public QMainWindow { NewPicsDialog *mNewPicsDialog; PicturesWidget *mPicWidget; ArchiveView *mArchive; + ArchiveBrowser *mArchiveBrowser; }; #endif @@ -41,7 +41,9 @@ SOURCES = main.cpp \ archivemodel.cpp \ archiveview.cpp \ archivecontroller.cpp \ - delegates.cpp + delegates.cpp \ + archivebrowser.cpp \ + archivebrowsermodel.cpp HEADERS = \ filesystemdirproxy.h \ filesystemwidget.h \ @@ -78,6 +80,8 @@ HEADERS = \ archivemodel.h \ archiveview.h \ archivecontroller.h \ - delegates.h + delegates.h \ + archivebrowser.h \ + archivebrowsermodel.h LIBS += -lmagic -lXfixes -lX11 RESOURCES = shemov.qrc diff --git a/smglobals.cpp b/smglobals.cpp index cd03cc4..58c6d98 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -29,6 +29,7 @@ #include "picfilesmodel.h" #include "configurationdialog.h" #include "archivecontroller.h" +#include "archivebrowsermodel.h" SmGlobals *SmGlobals::mInstance = 0; @@ -95,6 +96,10 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ QStringList headers = QStringList() << tr("Series") << tr("Series ID") << tr("Series part ID") << tr("Part") << tr("Type") << tr("Favorite") << tr("Subtitle") << tr("Count"); ArchiveModel *model = new ArchiveModel(headers); mModels.insert(which, model); + }else if(which == "BrowserModel"){ + QStringList headers = QStringList() << tr("Name") << tr("Generic Id") << tr("Node Type") << tr("Size") << tr("Quality") << tr("File Type") << tr("Full Path"); + ArchiveBrowserModel *model = new ArchiveBrowserModel(headers); + mModels.insert(which, model); } return mModels.contains(which) ? mModels.value(which) : 0; } |