summaryrefslogtreecommitdiffstats
path: root/archivetreeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivetreeview.cpp')
-rw-r--r--archivetreeview.cpp190
1 files changed, 190 insertions, 0 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp
index b00737e..3529b01 100644
--- a/archivetreeview.cpp
+++ b/archivetreeview.cpp
@@ -17,10 +17,25 @@
#include <QHash>
#include <QProcess>
#include <QMessageBox>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QMenu>
+#include <QAction>
+#include <QContextMenuEvent>
+#include <QLabel>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QProcess>
+#include <QUrl>
+#include <QMessageBox>
+#include <QClipboard>
+#include <QApplication>
#include "archivetreeview.h"
#include "smglobals.h"
#include "smtreemodel.h"
+#include "smtreeitem.h"
#include "seriestreewidget.h"
#include "filestreewidget.h"
#include "filestreemodel.h"
@@ -67,6 +82,11 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){
verticalSplitter->setStretchFactor(0, 3);
verticalSplitter->setStretchFactor(1, 1);
+ // misc
+ mNoCoverDialog = new NoCoverMovieDialog(this);
+ mNoCoverDialog->setHidden(true);
+ connect(mNoCoverDialog->view(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(selectMovie(QModelIndex)));
+
// layout
QHBoxLayout *mainLayout = new QHBoxLayout;
QSplitter *splitter = new QSplitter;
@@ -132,6 +152,28 @@ void ArchiveTreeView::cleanDatabase(const QString &table){
}
}
+void ArchiveTreeView::showNoCoverDialog(){
+ mNoCoverDialog->show();
+}
+
+void ArchiveTreeView::selectMovie(const QModelIndex &idx){
+ if(!idx.isValid()){
+ return;
+ }
+ QVariant movieName = idx.data(NoCoverMovieModel::SeriesNameRole);
+ QVariant part = idx.data(NoCoverMovieModel::SeriesPartRole);
+ QModelIndex movieIdx = mSeriesModel->findValue(movieName, QModelIndex(), SeriesTreeModel::Name);
+ if(!movieIdx.isValid()){
+ return;
+ }
+ QModelIndex partIdx = mSeriesModel->findValue(part, movieIdx, SeriesTreeModel::SeriesPart, 0);
+ QModelIndex toSelect = partIdx.isValid() ? mSeriesWidget->seriesProxy()->mapFromSource(partIdx) : mSeriesWidget->seriesProxy()->mapFromSource(movieIdx);
+ mSeriesWidget->seriesTree()->expand(mSeriesWidget->seriesProxy()->mapFromSource(movieIdx));
+ mSeriesWidget->seriesTree()->selectionModel()->select(toSelect, QItemSelectionModel::Clear | QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
+ mSeriesWidget->seriesTree()->scrollTo(toSelect, QAbstractItemView::PositionAtCenter);
+ mNoCoverDialog->hide();
+}
+
void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){
Q_UNUSED(selected);
Q_UNUSED(deselected);
@@ -224,3 +266,151 @@ void ArchiveTreeView::constructWindowTitle(){
mWindowTitle = QString("Movie Archive - [%1]").arg(modeString);
emit needWindowTitleChange(mWindowTitle);
}
+
+//NoCoverMovieModel
+
+NoCoverMovieModel::NoCoverMovieModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){
+ mDb = QSqlDatabase::database("treedb");
+ mDataQuery = new QSqlQuery(mDb);
+ mDataQuery->prepare("SELECT files.iseriespart_id, series.tseries_name, seriesparts.iseriespart FROM files, series, seriesparts WHERE files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id GROUP BY files.iseriespart_id,series.tseries_name,seriesparts.iseriespart HAVING COUNT(iseriespart_id) = 1 ORDER BY series.tseries_name");
+ refresh();
+}
+
+QVariant NoCoverMovieModel::data(const QModelIndex &index, int role) const{
+ if(!index.isValid()){
+ return QVariant();
+ }
+ SmTreeItem *item = itemAt(index);
+ if(role == SeriesNameRole){
+ return item->data(SeriesName);
+ }
+ if(role == SeriesPartRole){
+ return item->data(SeriesPart);
+ }
+ if(role == SeriesIdRole){
+ return item->data(SeriesId);
+ }
+ return SmTreeModel::data(index, role);
+} void populate();
+
+
+void NoCoverMovieModel::refresh(){
+ SmTreeItem *rootItem = new SmTreeItem(4);
+ mDataQuery->exec();
+ while(mDataQuery->next()){
+ QString displayName = QString("%1 %2").arg(mDataQuery->value(1).toString()).arg(QString::number(mDataQuery->value(2).toInt()));
+ QList<QVariant> data;
+ data << displayName << mDataQuery->value(1) << mDataQuery->value(2) << mDataQuery->value(0);
+ SmTreeItem *child = new SmTreeItem(data, rootItem);
+ rootItem->appendChild(child);
+ }
+ setRoot(rootItem);
+ emit refreshed();
+}
+
+Qt::ItemFlags NoCoverMovieModel::flags(const QModelIndex &index) const{
+ if(!index.isValid()){
+ return 0;
+ }
+ return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
+}
+
+//NoCoverMovieView
+
+NoCoverMovieView::NoCoverMovieView(QWidget *parent) : QTreeView(parent) {}
+
+void NoCoverMovieView::contextMenuEvent(QContextMenuEvent *e){
+ QMenu ctxMenu;
+ foreach(QAction *a, actions()){
+ ctxMenu.addAction(a);
+ }
+ ctxMenu.exec(e->globalPos());
+}
+
+//NoCoverMovieDialog
+
+NoCoverMovieDialog::NoCoverMovieDialog(QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags){
+ //model + view
+ mView = new NoCoverMovieView;
+ QStringList headers = QStringList() << "Movie" << "Name" << "Part" << "Id";
+ mModel = new NoCoverMovieModel(headers);
+ mView->setModel(mModel);
+ connect(mModel, SIGNAL(refreshed()), this, SLOT(updateLabel()));
+ mView->setColumnHidden(1, true);
+ mView->setColumnHidden(2, true);
+ mView->setColumnHidden(3, true);
+ mView->resizeColumnToContents(0);
+
+ //actions
+ mBrowserA = new QAction(tr("Search with google..."), this);
+ connect(mBrowserA, SIGNAL(triggered()), this, SLOT(openInBrowser()));
+ mView->addAction(mBrowserA);
+ mCopyA = new QAction(tr("Copy name"), this);
+ connect(mCopyA, SIGNAL(triggered()), this, SLOT(copyToClipboard()));
+ mView->addAction(mCopyA);
+
+ //buttons
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ mClose = new QPushButton(tr("Close"));
+ connect(mClose, SIGNAL(clicked()), this, SLOT(hide()));
+ mRefresh = new QPushButton(tr("Refresh"));
+ connect(mRefresh, SIGNAL(clicked()), mModel, SLOT(refresh()));
+ buttonLayout->addWidget(mRefresh);
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(mClose);
+
+ //label
+ mMovieLabel = new QLabel(labelText());
+
+ //main
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(mMovieLabel);
+ mainLayout->addWidget(mView);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+}
+
+void NoCoverMovieDialog::openInBrowser(){
+ QString selText = selectedText();
+ if(selText.isEmpty()){
+ return;
+ }
+ selText.append(" covers");
+ QByteArray searchString = QUrl::toPercentEncoding(selText);
+ QString url = QString("http://www.google.com/search?hl=en&q=%1").arg(QString(searchString));
+ QStringList args = QStringList() << "openURL" << url;
+ bool success = QProcess::startDetached("kfmclient", args);
+ if(!success){
+ QMessageBox::critical(this, tr("Error"), tr("Launching browser failed. Most likely kfmclient is not installed"));
+ }
+}
+
+void NoCoverMovieDialog::copyToClipboard(){
+ QString selText = selectedText();
+ if(selText.isEmpty()){
+ return;
+ }
+ QClipboard *clip = QApplication::clipboard();
+ clip->setText(selText);
+}
+
+void NoCoverMovieDialog::updateLabel(){
+ mMovieLabel->setText(labelText());
+}
+
+const QString NoCoverMovieDialog::selectedText() const{
+ QModelIndexList selected = mView->selectionModel()->selectedRows();
+ if(selected.isEmpty()){
+ return QString();
+ }
+ QModelIndex real = mModel->index(selected.at(0).row(), 0, selected.at(0).parent());
+ if(!real.isValid()){
+ return QString();
+ }
+ return real.data().toString();
+}
+
+const QString NoCoverMovieDialog::labelText() const{
+ QString retval = QString(tr("Movies without covers (%1)")).arg(QString::number(mModel->rowCount(QModelIndex())));
+ return retval;
+}