diff options
-rw-r--r-- | archivemodel.cpp | 52 | ||||
-rw-r--r-- | archivemodel.h | 8 | ||||
-rw-r--r-- | archiveview.cpp | 37 | ||||
-rw-r--r-- | archiveview.h | 10 | ||||
-rw-r--r-- | shemov.cpp | 5 | ||||
-rw-r--r-- | shemov.h | 5 | ||||
-rw-r--r-- | smtreeview.cpp | 17 | ||||
-rw-r--r-- | smtreeview.h | 3 |
8 files changed, 130 insertions, 7 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index de95328..0c16c21 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -5,6 +5,7 @@ 2 of the License, or (at your option) any later version. */ +#include <QSqlError> #include <QSqlQuery> #include "smtreeitem.h" @@ -54,9 +55,54 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ return QColor(Qt::darkGreen); } } + if(role == NameRole){ + return item->data(Name); + } + if(role == TypeRole){ + return item->data(Type); + } return SmTreeModel::data(index, role); } +bool ArchiveModel::setData(const QModelIndex &idx, const QVariant &value, int role){ + if(role != Qt::EditRole){ + return false; + } + SmTreeItem *item = itemAt(idx); + int nodeType = item->data(Type).toInt(); + QSqlQuery updateQuery(mDb); + if(nodeType == GenreNode){ + updateQuery.prepare("UPDATE genres SET tgenrename = :value WHERE igenres_id = :id"); + }else if(nodeType == ActorNode){ + updateQuery.prepare("UPDATE actors SET tactorname = :value WHERE iactors_id = :id"); + }else if(nodeType == SeriesNode){ + updateQuery.prepare("UPDATE series SET tseries_name = :value WHERE iseries_id = :id"); + }else{ + return false; + } + QVariant id = item->data(GenericId); + updateQuery.bindValue(":value", value); + updateQuery.bindValue(":id", id); + if(updateQuery.exec()){ + if(nodeType == GenreNode || nodeType == ActorNode){ + item->setData(Name, value); + emit dataChanged(idx, idx); + return true; + }else if(nodeType == SeriesNode){ + item->setData(Name, value); + emit needRefresh(); + return true; + } + }else{ + QSqlError e = updateQuery.lastError(); + QString databaseText = e.databaseText().isEmpty() ? tr("(none)") : e.databaseText(); + QString driverText = e.driverText().isEmpty() ? tr("(none)") : e.driverText(); + QString errormsg = QString(tr("<b>Database errors:</b><br/><ul><li>driverText(): %1</li><li>databaseText(): %2</li></ul>")).arg(driverText).arg(databaseText); + emit databaseError(errormsg); + } + return false; +} + QStringList ArchiveModel::indexToPath(const QModelIndex &idx) const { QStringList retval; SmTreeItem *item = itemAt(idx); @@ -96,6 +142,10 @@ void ArchiveModel::setOrder(const QString &order){ setOrder(orderNum); } +void ArchiveModel::refresh(){ + setOrder(mOrder); +} + void ArchiveModel::collectorFinished(){ SmTreeItem *item = mCollector->rootItem(); setRoot(item); @@ -151,7 +201,7 @@ void ArchiveCollector::populateByActor(){ QSqlQuery actorIdQuery = QSqlQuery("SELECT iactors_id, tactorname FROM actors ORDER BY tactorname", mDb); while(actorIdQuery.next()){ QList<QVariant> actorIdData; - actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::GenreNode << false << QVariant() << QVariant() << QVariant(); + actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::ActorNode << false << QVariant() << QVariant() << QVariant(); SmTreeItem *actorIdItem = new SmTreeItem(actorIdData, mRootItem); mRootItem->appendChild(actorIdItem); } diff --git a/archivemodel.h b/archivemodel.h index 0f2eea7..946bb3c 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -19,7 +19,7 @@ class ArchiveCollector; class ArchiveModel : 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, CountRole = Qt::UserRole + 8 }; + enum CustomRoles { NameRole = Qt::UserRole + 1, GenericIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 }; enum Fields { Name = 0, GenericId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 }; enum Order { SeriesName, Actor, Genre, NoOrder }; enum { NumFields = 8 }; @@ -29,12 +29,18 @@ class ArchiveModel : public SmTreeModel { const QHash<QString, int> availableOrdersHash() const { return mAvailableOrders; } ArchiveCollector *collector() { return mCollector; } virtual QVariant data(const QModelIndex &index, int role) const; + virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); QStringList indexToPath(const QModelIndex &idx) const; QModelIndexList pathToIndex(const QStringList &path) const; + signals: + void needRefresh(); + void databaseError(const QString &error); + public slots: void setOrder(int order); void setOrder(const QString &order); + void refresh(); private slots: void collectorFinished(); diff --git a/archiveview.cpp b/archiveview.cpp index 9edfd0b..2e649f1 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -8,8 +8,10 @@ #include <QComboBox> #include <QDialog> #include <QHBoxLayout> +#include <QInputDialog> #include <QLabel> #include <QLineEdit> +#include <QMessageBox> #include <QPushButton> #include <QSettings> #include <QSplitter> @@ -23,6 +25,8 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent), mConstructing(true) mArchiveModel = static_cast<ArchiveModel*>(SmGlobals::instance()->model("ArchiveModel")); connect(mArchiveModel->collector(), SIGNAL(started()), this, SLOT(collectorStarted())); connect(mArchiveModel->collector(), SIGNAL(finished()), this, SLOT(collectorFinished())); + connect(mArchiveModel, SIGNAL(needRefresh()), this, SLOT(refreshArchive())); + connect(mArchiveModel, SIGNAL(databaseError(QString)), this, SLOT(showDatabaseError(QString))); mProgress = new ArchiveProgressDialog(this); mProgress->setHidden(true); connect(mArchiveModel->collector(), SIGNAL(message(QString)), mProgress, SLOT(setMessage(QString))); @@ -39,6 +43,7 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent), mConstructing(true) mTree->setColumnHidden(ArchiveModel::Subtitle, true); mTree->setColumnHidden(ArchiveModel::Count, true); mTree->resizeColumnToContents(ArchiveModel::Name); + mTree->setEditTriggers(QAbstractItemView::NoEditTriggers); connect(mTree, SIGNAL(expanded(QModelIndex)), this, SLOT(expandItem(QModelIndex))); connect(mTree, SIGNAL(collapsed(QModelIndex)), this, SLOT(collapseItem(QModelIndex))); @@ -103,6 +108,11 @@ QWidget *ArchiveView::progressDialog(){ return qobject_cast<QWidget *>(mProgress); } +void ArchiveView::refreshArchive(){ + writeSettings(); + mArchiveModel->refresh(); +} + void ArchiveView::setExpanded(){ QSettings s; QVariantList expanded = s.value("archivemodel/expandeditems").toList(); @@ -139,6 +149,10 @@ void ArchiveView::collectorFinished(){ setExpanded(); } +void ArchiveView::showDatabaseError(const QString &errorMsg){ + QMessageBox::critical(this, tr("Database Error"), errorMsg); +} + void ArchiveView::expandItem(const QModelIndex &idx){ mExpandedItems << QPersistentModelIndex(idx); } @@ -147,7 +161,28 @@ void ArchiveView::collapseItem(const QModelIndex &idx){ mExpandedItems.removeAll(QPersistentModelIndex(idx)); } -ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) { +ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) {} + +void ArchiveTree::setModel(ArchiveProxy *model){ + mProxy = model; + mModel = qobject_cast<ArchiveModel*>(mProxy->sourceModel()); + QTreeView::setModel(model); +} + +void ArchiveTree::rename(){ + QModelIndex idx = currentIndex(); + int nodeType = idx.data(ArchiveModel::TypeRole).toInt(); + if(nodeType == ArchiveModel::SeriesPartNode){ + QMessageBox::critical(this, tr("Error"), tr("This function is not possible. Rename the Series instead!")); + return; + } + QString currentName = idx.data(ArchiveModel::NameRole).toString(); + QString question = QString(tr("Rename %1 to:")).arg(currentName); + QString newName = QInputDialog::getText(this, tr("Rename"), question, QLineEdit::Normal, currentName); + if(!newName.isEmpty()){ + QModelIndex realIdx = mProxy->mapToSource(idx); + mModel->setData(realIdx, newName, Qt::EditRole); + } } ArchiveProgressDialog::ArchiveProgressDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ diff --git a/archiveview.h b/archiveview.h index 33969d9..850794c 100644 --- a/archiveview.h +++ b/archiveview.h @@ -36,9 +36,11 @@ class ArchiveView : public QWidget { // center of the main window... void setConstructingDone() { mConstructing = false; } ArchiveModel *archiveModel() { return mArchiveModel; } + ArchiveTree *archiveTree() { return mTree; } QWidget *progressDialog(); public slots: + void refreshArchive(); void setExpanded(); private slots: @@ -46,6 +48,7 @@ class ArchiveView : public QWidget { void clearFilter(); void collectorStarted(); void collectorFinished(); + void showDatabaseError(const QString &errorMsg); void expandItem(const QModelIndex &idx); void collapseItem(const QModelIndex &idx); @@ -62,11 +65,16 @@ class ArchiveView : public QWidget { }; class ArchiveTree : public SmTreeView { + Q_OBJECT public: explicit ArchiveTree(QWidget *parent = 0); + virtual void setModel(ArchiveProxy *model); + + public slots: + void rename(); private: - QSortFilterProxyModel *mProxy; + ArchiveProxy *mProxy; ArchiveModel *mModel; }; @@ -737,6 +737,11 @@ void SheMov::createActions(){ /* picView(er) END Actions! */ + // ArchiveView actions + mArchiveViewRenameA = new QAction(tr("Rename..."), this); + connect(mArchiveViewRenameA, SIGNAL(triggered()), mArchive->archiveTree(), SLOT(rename())); + mArchive->archiveTree()->addAction(mArchiveViewRenameA); + //don't add actions with checkable(true) unless you know what you're doing! mPicActionGroup = new QActionGroup(this); mPicActionGroup->addAction(mPWDeletePicFromA); @@ -184,7 +184,10 @@ class SheMov : public QMainWindow { QAction *mPVAddToNPA; QActionGroup *mPicActionGroup; //EndActions - + + //ArchiveView actions + QAction *mArchiveViewRenameA; + QSignalMapper *mOpenWithMapperFS; QSignalMapper *mOpenWithMapperAV; QSignalMapper *mFilterMapper; diff --git a/smtreeview.cpp b/smtreeview.cpp index 405f6a0..d4faab8 100644 --- a/smtreeview.cpp +++ b/smtreeview.cpp @@ -5,10 +5,12 @@ 2 of the License, or (at your option) any later version. */ -#include <QSettings> -#include <QHeaderView> #include <QAction> #include <QActionGroup> +#include <QHeaderView> +#include <QMenu> +#include <QContextMenuEvent> +#include <QSettings> #include "smtreeview.h" #include "smglobals.h" @@ -58,3 +60,14 @@ void SmTreeView::toggleHeader(QObject *action){ QHeaderView *hv = header(); hv->setSectionHidden(logicalIndex, !a->isChecked()); } + +void SmTreeView::contextMenuEvent(QContextMenuEvent *e){ + if(actions().isEmpty()){ + return; + } + QMenu contextMenu(this); + foreach(QAction *a, actions()){ + contextMenu.addAction(a); + } + contextMenu.exec(e->globalPos()); +} diff --git a/smtreeview.h b/smtreeview.h index 67ba844..6d30917 100644 --- a/smtreeview.h +++ b/smtreeview.h @@ -24,6 +24,9 @@ class SmTreeView : public QTreeView { void writeHeaderConfig(); void toggleHeader(QObject *action); + protected: + virtual void contextMenuEvent(QContextMenuEvent *e); + private: const QString mHeaderSetting; QActionGroup *mHeaderGroup; |