diff options
-rw-r--r-- | archiveddelegate.cpp | 8 | ||||
-rw-r--r-- | archiveviewwidget.cpp | 69 | ||||
-rw-r--r-- | archiveviewwidget.h | 6 | ||||
-rw-r--r-- | coverarchiveeditor.cpp | 182 | ||||
-rw-r--r-- | coverarchiveeditor.h | 50 | ||||
-rw-r--r-- | coveritem.cpp | 19 | ||||
-rw-r--r-- | coveritem.h | 11 | ||||
-rw-r--r-- | editarchiveitemdialog.cpp | 9 | ||||
-rw-r--r-- | editarchiveitemdialog.h | 1 | ||||
-rw-r--r-- | helper.cpp | 16 | ||||
-rw-r--r-- | helper.h | 6 | ||||
-rw-r--r-- | listeditor.cpp | 1 | ||||
-rw-r--r-- | listeditor.h | 3 | ||||
-rw-r--r-- | listmodel.cpp | 14 | ||||
-rw-r--r-- | listmodel.h | 1 | ||||
-rw-r--r-- | moviemodel.cpp | 12 | ||||
-rw-r--r-- | moviemodel.h | 1 | ||||
-rw-r--r-- | shemov.cpp | 11 | ||||
-rw-r--r-- | shemov.h | 4 | ||||
-rw-r--r-- | shemov.pro | 8 | ||||
-rw-r--r-- | sizedelegate.cpp | 4 | ||||
-rw-r--r-- | textenterdialog.cpp | 38 | ||||
-rw-r--r-- | textenterdialog.h | 32 |
23 files changed, 490 insertions, 16 deletions
diff --git a/archiveddelegate.cpp b/archiveddelegate.cpp index 6f9a49d..54282b8 100644 --- a/archiveddelegate.cpp +++ b/archiveddelegate.cpp @@ -28,9 +28,13 @@ void ArchivedDelegate::paint(QPainter *p, const QStyleOptionViewItem &option, co } QSize ArchivedDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { - QString text(tr("No")); - if(index.data().toInt() > -1){ + QString text; + if(index.data().toInt() == -1){ text = QString(tr("On DVD # %1")).arg(QString::number(index.data().toInt())); + }else if(index.data().toInt() == -2){ + text = tr("(unknown"); + }else{ + text = tr("No"); } QFontMetrics metrics(option.font); return metrics.size(Qt::TextSingleLine, text); diff --git a/archiveviewwidget.cpp b/archiveviewwidget.cpp index 51a9c91..1353dbb 100644 --- a/archiveviewwidget.cpp +++ b/archiveviewwidget.cpp @@ -12,7 +12,10 @@ #include <QHBoxLayout> #include <QVBoxLayout> #include <QPushButton> +#include <QMessageBox> #include <QApplication> +#include <QSettings> +#include <QProcess> #include "archiveviewwidget.h" #include "archivefileview.h" @@ -22,6 +25,9 @@ #include "editarchiveitemdialog.h" #include "sizedelegate.h" #include "archiveddelegate.h" +#include "coverarchiveeditor.h" +#include "textenterdialog.h" +#include "helper.h" ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListModel *actors, QWidget *parent) : QWidget(parent), mMovieModel(model), mGenreModel(genre), mActorsModel(actors){ //filter bar @@ -30,13 +36,13 @@ ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListMo mGenre = new QComboBox; l1->setBuddy(mGenre); mGenre->setModel(mGenreModel); - connect(mGenre, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(setGenreFilter(const QString &))); + connect(mGenre, SIGNAL(activated(const QString &)), this, SLOT(setGenreFilter(const QString &))); filterLayout->addWidget(l1); filterLayout->addWidget(mGenre); QLabel *l2 = new QLabel(tr("Filter by &actor")); mActors = new QComboBox; mActors->setModel(mActorsModel); - connect(mActors, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(setActorFilter(const QString &))); + connect(mActors, SIGNAL(activated(const QString &)), this, SLOT(setActorFilter(const QString &))); l2->setBuddy(mActors); filterLayout->addWidget(l2); filterLayout->addWidget(mActors); @@ -61,6 +67,7 @@ ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListMo mFileView->setSortingEnabled(true); mFileView->setItemsExpandable(false); mFileView->setRootIsDecorated(false); + mFileView->setColumnHidden(MovieItem::Md5Sum, true); connect(mClearFilter, SIGNAL(clicked()), mProxy, SLOT(clearFilter())); //main layout @@ -69,6 +76,7 @@ ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListMo mainLayout->addWidget(mFileView); connect(mFileView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex)), this, SLOT(rowChanged(const QModelIndex &, const QModelIndex &))); + connect(mFileView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(showMovie(const QModelIndex &))); setLayout(mainLayout); } @@ -85,6 +93,63 @@ void ArchiveViewWidget::editFile(){ } } +void ArchiveViewWidget::editCovers(){ + QModelIndexList selected = mFileView->selectionModel()->selectedRows(); + if(!selected.isEmpty()){ + QModelIndex idx = selected.at(0); + QModelIndex real = mProxy->mapToSource(idx); + mCoverEditDialog->setMovie(real); + mCoverEditDialog->show(); + mCoverEditDialog->raise(); + mCoverEditDialog->activateWindow(); + } +} + +void ArchiveViewWidget::addMovie(){ + TextEnterDialog dlg(tr("Enter movie title"), this); + dlg.exec(); + if(dlg.result() == QDialog::Accepted){ + QString title = dlg.text().toLower().trimmed(); + QModelIndex idx = mMovieModel->index(title); + if(idx != QModelIndex()){ + QString msg = QString(tr("Already have an entry with title %1")).arg(title); + QMessageBox::critical(this, tr("Error"), msg); + return; + } + QList<QVariant> movieData; + movieData << title; + for(int i = 1; i < MovieItem::NumRows; ++i){ + movieData << QVariant(); + } + QString md5(32, '0'); + movieData[MovieItem::Md5Sum] = md5; + movieData[MovieItem::Genre] = mGenreModel->defaultId(); + movieData[MovieItem::Dvd] = -2; + movieData[MovieItem::Filename] = tr("(DVD)"); + movieData[MovieItem::Size] = Q_INT64_C(4707319808); + movieData[MovieItem::Quality] = 0; + mMovieModel->addMovie(movieData, QList<QVariant>(), QList<CoverItem>()); + } +} + +void ArchiveViewWidget::showMovie(const QModelIndex &movie){ + QModelIndex real = mProxy->mapToSource(movie); + QModelIndex dvd = mMovieModel->index(real.row(), MovieItem::Dvd, QModelIndex()); + int dvdno = dvd.data().toInt(); + if(dvdno != -1){ + emit statusbarMessage(tr("Movie is not present on filesystem")); + return; + } + QModelIndex fnIdx = mMovieModel->index(real.row(), MovieItem::Filename, QModelIndex()); + QModelIndex md5Idx = mMovieModel->index(real.row(), MovieItem::Md5Sum, QModelIndex()); + QString path = Helper::createArchivePath(fnIdx.data().toString(), md5Idx.data().toString()); + QSettings s; + QString playerPath = s.value("paths/movieviewer").toString(); + QStringList args = s.value("paths/movieviewerargs").toStringList(); + args << path; + QProcess::startDetached(playerPath, args); +} + void ArchiveViewWidget::setFilter(){ QString filter = mName->text().toLower(); if(filter.isEmpty()){ diff --git a/archiveviewwidget.h b/archiveviewwidget.h index 45bb21f..bbd1ea2 100644 --- a/archiveviewwidget.h +++ b/archiveviewwidget.h @@ -21,6 +21,7 @@ class QModelIndex; class ArchiveFileView; class ArchiveProxy; class EditArchiveItemDialog; +class CoverArchiveEditor; class ArchiveViewWidget : public QWidget { Q_OBJECT @@ -29,9 +30,13 @@ class ArchiveViewWidget : public QWidget { ~ArchiveViewWidget() {}; ArchiveFileView* fileView() { return mFileView; }; void setEditDialog(EditArchiveItemDialog *dlg) { mEditDialog = dlg; }; + void setCoverEditDialog(CoverArchiveEditor *dlg) { mCoverEditDialog = dlg; }; public slots: void editFile(); + void editCovers(); + void addMovie(); + void showMovie(const QModelIndex &movie); signals: void statusbarMessage(const QString &message); @@ -57,6 +62,7 @@ class ArchiveViewWidget : public QWidget { ArchiveFileView *mFileView; ArchiveProxy *mProxy; EditArchiveItemDialog *mEditDialog; + CoverArchiveEditor *mCoverEditDialog; }; #endif diff --git a/coverarchiveeditor.cpp b/coverarchiveeditor.cpp new file mode 100644 index 0000000..f8f21b6 --- /dev/null +++ b/coverarchiveeditor.cpp @@ -0,0 +1,182 @@ +/* + 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 <QGridLayout> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QPushButton> +#include <QComboBox> +#include <QLabel> +#include <QModelIndex> +#include <QApplication> +#include <QFileDialog> +#include <QFileInfo> +#include <QSettings> + +#include <algorithm> + +#include "coverarchiveeditor.h" +#include "moviemodel.h" +#include "coveritem.h" +#include "helper.h" + +CoverArchiveEditor::CoverArchiveEditor(MovieModel *model, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mModel(model){ + QGridLayout *grid = new QGridLayout; + + //front cover + QLabel *l1 = new QLabel(tr("Set &front cover")); + mFront = new QComboBox; + l1->setBuddy(mFront); + grid->addWidget(l1, 0, 0); + grid->addWidget(mFront, 0, 1); + + //back cover + QLabel *l2 = new QLabel(tr("Set &back cover")); + mBack = new QComboBox; + l2->setBuddy(mBack); + grid->addWidget(l2, 1, 0); + grid->addWidget(mBack, 1, 1); + + //general cover + QLabel *l3 = new QLabel(tr("Set &general cover")); + mCovers = new QComboBox; + l3->setBuddy(mCovers); + grid->addWidget(l3, 2, 0); + grid->addWidget(mCovers, 2, 1); + + //buttons + QHBoxLayout *buttonLayout = new QHBoxLayout; + mAddCover = new QPushButton(tr("Add cover...")); + connect(mAddCover, SIGNAL(clicked()), this, SLOT(addCover())); + mUpdate = new QPushButton(tr("Update")); + connect(mUpdate, SIGNAL(clicked()), this, SLOT(accept())); + mClose = new QPushButton(tr("Close")); + connect(mClose, SIGNAL(clicked()), this, SLOT(reject())); + buttonLayout->addStretch(); + buttonLayout->addWidget(mAddCover); + buttonLayout->addWidget(mUpdate); + buttonLayout->addWidget(mClose); + + //main layout + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(grid); + mainLayout->addLayout(buttonLayout); + + setLayout(mainLayout); +} + +void CoverArchiveEditor::setMovie(const QModelIndex &movie){ + mCoverList = mModel->data(movie, MovieModel::CoverRole).toList(); + mMovId = mModel->data(movie, MovieModel::IdRole).toInt(); + QString title = QString(tr("%1 - Cover edit for %2")).arg(qApp->applicationName()).arg(movie.data().toString()); + setWindowTitle(title); + QStringList files("-"); + foreach(QVariant c, mCoverList){ + CoverItem item = c.value<CoverItem>(); + files << item.fileName(); + } + mFront->addItems(files); + QList<QVariant>::const_iterator it; + int idx(-1); + it = std::find_if(mCoverList.constBegin(), mCoverList.constEnd(), std::bind2nd(CoverItem::findType(), "front")); + QString fn; + if(it != mCoverList.constEnd()){ + fn = it->value<CoverItem>().fileName(); + idx = mFront->findText(fn); + if(idx != -1){ + mFront->setCurrentIndex(idx); + } + } + mBack->addItems(files); + it = std::find_if(mCoverList.constBegin(), mCoverList.constEnd(), std::bind2nd(CoverItem::findType(), "back")); + if(it != mCoverList.constEnd()){ + fn = it->value<CoverItem>().fileName(); + idx = mBack->findText(fn); + if(idx != -1){ + mBack->setCurrentIndex(idx); + } + } + mCovers->addItems(files); + it = std::find_if(mCoverList.constBegin(), mCoverList.constEnd(), std::bind2nd(CoverItem::findType(), "general")); + if(it != mCoverList.constEnd()){ + fn = it->value<CoverItem>().fileName(); + idx = mCovers->findText(fn); + if(idx != -1){ + mCovers->setCurrentIndex(idx); + } + } +} + +void CoverArchiveEditor::accept(){ + QList<CoverItem> items; + QString fn; + CoverItem item; + fn = mFront->currentText(); + item = realItem(fn, "front"); + if(item != CoverItem()){ + items << item; + } + fn = mBack->currentText(); + item = realItem(fn, "back"); + if(item != CoverItem()){ + items << item; + } + fn = mCovers->currentText(); + item = realItem(fn, "general"); + if(item != CoverItem()){ + items << item; + } + mModel->setCovers(mMovId, items); +} + +void CoverArchiveEditor::addCover(){ + QSettings s; + QString startDir = s.value("ui/selectstartup").toString(); + QStringList files = QFileDialog::getOpenFileNames(this, "Select covers to add...", startDir); + QStringList addItems; + foreach(QString f, files){ + mAddedCovers << f; + QFileInfo info(f); + addItems << info.fileName(); + } + mFront->addItems(addItems); + mBack->addItems(addItems); + mCovers->addItems(addItems); +} + +CoverItem CoverArchiveEditor::coverItem(const QString &path, const QString &type) const{ + QString md5 = Helper::md5Sum(path); + QString newPath = Helper::moveToArchive(path, md5); + return CoverItem(newPath, type, md5); +} + +CoverItem CoverArchiveEditor::realItem(const QString &filename, const QString &type) const{ + QList<QVariant>::const_iterator initCit = std::find_if(mCoverList.constBegin(), mCoverList.constEnd(), std::bind2nd(CoverItem::findFilename(), filename)); + //got it, have to convert it to the right type + if(initCit != mCoverList.constEnd()){ + CoverItem i = initCit->value<CoverItem>(); + i.setType(type); + return i; + //an added item + }else{ + QList<QString>::const_iterator ait = std::find_if(mAddedCovers.constBegin(), mAddedCovers.constEnd(), std::bind2nd(Helper::StringListContains(), filename)); + //maybe an unset item + if(ait == mAddedCovers.constEnd()){ + QList<QVariant>::const_iterator oit = std::find_if(mCoverList.constBegin(), mCoverList.constEnd(), std::bind2nd(CoverItem::findType(), type)); + if(oit != mCoverList.constEnd()){ + CoverItem oldItem = oit->value<CoverItem>(); + //remove it from fs + Helper::removeFromArchive(oldItem.fileName(), oldItem.md5()); + } + return CoverItem(); + } + CoverItem i = coverItem((*ait), type); + return i; + } + return CoverItem(); +} + diff --git a/coverarchiveeditor.h b/coverarchiveeditor.h new file mode 100644 index 0000000..e30037a --- /dev/null +++ b/coverarchiveeditor.h @@ -0,0 +1,50 @@ +/* + 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 COVERARCHIVEEDITOR_H +#define COVERARCHIVEEDITOR_H + +#include <QDialog> +#include <QList> +#include <QVariant> + +class MovieModel; +class QComboBox; +class QPushButton; +class QModelIndex; +class CoverItem; + +class CoverArchiveEditor : public QDialog { + Q_OBJECT + public: + CoverArchiveEditor(MovieModel *model, QWidget *parent = 0, Qt::WindowFlags f = 0); + ~CoverArchiveEditor() {}; + void setMovie(const QModelIndex &movie); + + public slots: + void accept(); + + private slots: + void addCover(); + + private: + CoverItem coverItem(const QString &path, const QString &type) const; + CoverItem realItem(const QString &filename, const QString &type) const; + MovieModel *mModel; + QComboBox *mFront; + QComboBox *mBack; + QComboBox *mCovers; + QPushButton *mAddCover; + QPushButton *mClose; + QPushButton *mUpdate; + QList<QVariant> mCoverList; + QList<QString> mAddedCovers; + int mMovId; + +}; + +#endif diff --git a/coveritem.cpp b/coveritem.cpp index 4955349..ab72844 100644 --- a/coveritem.cpp +++ b/coveritem.cpp @@ -7,15 +7,34 @@ #include <QString> #include <QFileInfo> +#include <QVariant> #include "coveritem.h" +bool CoverItem::findType::operator()(const QVariant item, const QString type) const{ + CoverItem i = item.value<CoverItem>(); + return (i.type() == type); +} + +bool CoverItem::findFilename::operator()(const QVariant item, const QString filename) const{ + CoverItem i = item.value<CoverItem>(); + return (i.fileName() == filename); +} + CoverItem::CoverItem(const QString &fullPath, const QString &type, const QString &md5) : mFullPath(fullPath), mType(type), mMd5(md5){ setFileName(); } CoverItem::CoverItem() {}; +bool CoverItem::operator==(const CoverItem &i) const{ + return ((mFullPath == i.fullPath()) && (mFilename == i.fileName()) && (mType == i.type()) && (mMd5 == mMd5)); +} + +bool CoverItem::operator!=(const CoverItem &i) const{ + return !(*this == i); +} + void CoverItem::setMd5(const QString &md5){ mMd5 = md5; } diff --git a/coveritem.h b/coveritem.h index a70de74..f20f5e9 100644 --- a/coveritem.h +++ b/coveritem.h @@ -11,12 +11,23 @@ #include <QMetaType> class QString; +class QVariant; class CoverItem { public: + class findType : public std::binary_function<QVariant, QString, bool> { + public: + bool operator()(const QVariant item, const QString type) const; + }; + class findFilename : public std::binary_function<QVariant, QString, bool> { + public: + bool operator()(const QVariant item, const QString filename) const; + }; CoverItem(); CoverItem(const QString &fullPath, const QString &type, const QString &md5); ~CoverItem() {}; + bool operator==(const CoverItem &i) const; + bool operator!=(const CoverItem &i) const; const QString fileName() const { return mFilename; }; const QString fullPath() const { return mFullPath; }; const QString type() const { return mType; }; diff --git a/editarchiveitemdialog.cpp b/editarchiveitemdialog.cpp index 6a77300..998ff97 100644 --- a/editarchiveitemdialog.cpp +++ b/editarchiveitemdialog.cpp @@ -103,6 +103,7 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors ListEditor *genreEditor = new ListEditor(mGenreModel); w2Layout->addWidget(genreEditor); ListEditor *actorsEditor = new ListEditor(mActorsModel); + connect(actorsEditor, SIGNAL(itemAdded(const QString &)), this, SLOT(addActor(const QString &))); w2Layout->addWidget(actorsEditor); w2Layout->addStretch(); w2->setLayout(w2Layout); @@ -197,6 +198,14 @@ void EditArchiveItemDialog::addActor(){ } } +void EditArchiveItemDialog::addActor(const QString &actor){ + int idx = mActors->findText(actor); + if(idx != -1){ + mActors->setCurrentIndex(idx); + addActor(); + } +} + void EditArchiveItemDialog::removeActor(){ QString currentText = mActors->currentText(); if(mActorMap.contains(currentText)){ diff --git a/editarchiveitemdialog.h b/editarchiveitemdialog.h index 92ea8f6..4dd1cdc 100644 --- a/editarchiveitemdialog.h +++ b/editarchiveitemdialog.h @@ -30,6 +30,7 @@ class EditArchiveItemDialog : public QDialog { private slots: void addActor(); + void addActor(const QString &actor); void removeActor(); void updateMovie(); @@ -77,19 +77,23 @@ namespace Helper { return retval; } - bool moveToArchive(const QString &path, const QString &md5){ + const QString moveToArchive(const QString &path, const QString &md5){ QFileInfo info(path); if(!info.exists()){ - return false; + return QString(); } QFileInfo destFile = QFileInfo(createArchivePath(path, md5)); if(destFile.exists()){ destFile = QFileInfo(createArchivePath(path, md5, true)); if(destFile.exists()){ - return false; + return QString(); } } - return QFile::rename(path, destFile.absoluteFilePath()); + bool success = QFile::rename(path, destFile.absoluteFilePath()); + if(success){ + return destFile.absoluteFilePath(); + } + return QString(); } bool removeFromArchive(const QString &fileName, const QString &md5){ @@ -113,5 +117,9 @@ namespace Helper { } return retval; } + + bool StringListContains::operator()(const QString s, const QString &part) const{ + return s.contains(part); + } } @@ -15,9 +15,13 @@ class QString; namespace Helper { const QString mimeType(const QString &path); const QString md5Sum(const QString &path); - bool moveToArchive(const QString &path, const QString &md5); + const QString moveToArchive(const QString &path, const QString &md5); bool removeFromArchive(const QString &filename, const QString &md5); const QString createArchivePath(const QString &path, const QString &md5, bool withMd5 = false); + class StringListContains : public std::binary_function<QString, QString, bool> { + public: + bool operator()(const QString s, const QString &part) const; + }; } #endif diff --git a/listeditor.cpp b/listeditor.cpp index df63e15..ac001c9 100644 --- a/listeditor.cpp +++ b/listeditor.cpp @@ -49,6 +49,7 @@ void ListEditor::addItem(){ QModelIndex idx = mModel->index(newItem); if(idx == QModelIndex()){ mModel->addItem(newItem); + emit itemAdded(newItem); } } diff --git a/listeditor.h b/listeditor.h index a4f61fa..634fb15 100644 --- a/listeditor.h +++ b/listeditor.h @@ -21,6 +21,9 @@ class ListEditor : public QWidget { ListEditor(ListModel *model, QWidget *parent = 0); ListEditor() {}; + signals: + void itemAdded(const QString &); + private slots: void addItem(); void removeItem(); diff --git a/listmodel.cpp b/listmodel.cpp index 437ec3e..71a5040 100644 --- a/listmodel.cpp +++ b/listmodel.cpp @@ -165,10 +165,10 @@ bool ListModel::removeItem(const QVariant &item){ if(rowToDelete == -1){ return false; } - bool success = removeRows(rowToDelete, 1, QModelIndex()); + mDeleteQuery->bindValue(":name", item.toString()); + bool success = mDeleteQuery->exec(); if(success){ - mDeleteQuery->bindValue(":name", item.toString()); - success = mDeleteQuery->exec(); + success = removeRows(rowToDelete, 1, QModelIndex()); } return success; } @@ -185,6 +185,14 @@ bool ListModel::renameItem(const QVariant &oldName, const QVariant &newName){ return success; } +int ListModel::defaultId(){ + if(!mItems.isEmpty()){ + return mItems.at(0)->id(); + } + addItem("(default)"); + return mItems.at(0)->id(); +} + void ListModel::populate(){ QString query = QString("SELECT i%1id, t%1name FROM %1 ORDER BY t%1name").arg(mTable); QSqlQuery q(query); diff --git a/listmodel.h b/listmodel.h index 42f5ff5..edb21ad 100644 --- a/listmodel.h +++ b/listmodel.h @@ -35,6 +35,7 @@ class ListModel : public QAbstractItemModel { bool addItem(const QVariant &item); bool removeItem(const QVariant &item); bool renameItem(const QVariant &oldName, const QVariant &newName); + int defaultId(); private: void populate(); diff --git a/moviemodel.cpp b/moviemodel.cpp index 8bfa846..7fbac31 100644 --- a/moviemodel.cpp +++ b/moviemodel.cpp @@ -81,6 +81,18 @@ QModelIndex MovieModel::index(int movieId, int column) const{ return retval; } +QModelIndex MovieModel::index(const QString &movieTitle) const { + QModelIndex retval = QModelIndex(); + for(int i = 0; i < rowCount(QModelIndex()); ++i){ + MovieItem *item = mItems.at(i); + if(item->dataAt(MovieItem::Title).toString() == movieTitle){ + retval = createIndex(i, 0, item); + break; + } + } + return retval; +} + QVariant MovieModel::data(const QModelIndex &index, int role) const{ if(!index.isValid()){ return QVariant(); diff --git a/moviemodel.h b/moviemodel.h index 6367583..a3bfa34 100644 --- a/moviemodel.h +++ b/moviemodel.h @@ -25,6 +25,7 @@ class MovieModel : public QAbstractItemModel { ~MovieModel(); QModelIndex index(int row, int column, const QModelIndex &parent) const; QModelIndex index(int movieId, int column = 0) const; + QModelIndex index(const QString &movieTitle) const; QModelIndex parent(const QModelIndex &) const { return QModelIndex(); }; int columnCount(const QModelIndex &) const { return MovieItem::NumRows; }; int rowCount(const QModelIndex &) const { return mItems.size(); }; @@ -30,6 +30,7 @@ #include "listmodel.h" #include "archiveviewwidget.h" #include "editarchiveitemdialog.h" +#include "coverarchiveeditor.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) { qApp->setWindowIcon(QIcon(":/shemov.png")); @@ -67,6 +68,8 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla mAItemEdit = new EditArchiveItemDialog(mGenreModel, mActorModel, mMovieModel, this); mAVWidget->setEditDialog(mAItemEdit); + mCEdit = new CoverArchiveEditor(mMovieModel, this); + mAVWidget->setCoverEditDialog(mCEdit); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); @@ -82,6 +85,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla connect(mFSWidget->fileView(), SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &))); connect(mFSWidget, SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &))); connect(mFSWidget, SIGNAL(newTemplate(const QString &)), this, SLOT(setTemplate(const QString &))); + connect(mAVWidget, SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &))); connect(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); QWidget *centralWidget = new QWidget; @@ -220,6 +224,12 @@ void SheMov::createActions(){ mEditArchiveFileA->setShortcut(tr("CTRL+e")); mAVWidget->fileView()->addAction(mEditArchiveFileA); connect(mEditArchiveFileA, SIGNAL(triggered()), mAVWidget, SLOT(editFile())); + mEditArchiveCoverA = new QAction(tr("Edit covers..."), this); + mAVWidget->fileView()->addAction(mEditArchiveCoverA); + connect(mEditArchiveCoverA, SIGNAL(triggered()), mAVWidget, SLOT(editCovers())); + mAddMovieManuallyA = new QAction(tr("Add movie manually..."), this); + mAVWidget->fileView()->addAction(mAddMovieManuallyA); + connect(mAddMovieManuallyA, SIGNAL(triggered()), mAVWidget, SLOT(addMovie())); } void SheMov::createMenus(){ @@ -253,6 +263,7 @@ void SheMov::createMenus(){ mEditArchiveMenu = new QMenu(tr("&Edit archive"), this); mEditArchiveMenu->addAction(mEditArchiveFileA); + mEditArchiveMenu->addAction(mEditArchiveCoverA); menuBar()->addMenu(fileMenu); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); @@ -24,6 +24,7 @@ class MovieModel; class ListModel; class ArchiveViewWidget; class EditArchiveItemDialog; +class CoverArchiveEditor; class SheMov : public QMainWindow { Q_OBJECT @@ -67,6 +68,8 @@ class SheMov : public QMainWindow { QAction *mConfigA; QAction *mArchiveA; QAction *mEditArchiveFileA; + QAction *mEditArchiveCoverA; + QAction *mAddMovieManuallyA; QList<QAction*> mExtractToA; //EndActions @@ -84,6 +87,7 @@ class SheMov : public QMainWindow { ArchiveViewWidget *mAVWidget; ArchiveEditDialog *mAEdit; EditArchiveItemDialog *mAItemEdit; + CoverArchiveEditor *mCEdit; MovieModel *mMovieModel; ListModel *mGenreModel; ListModel *mActorModel; @@ -26,7 +26,9 @@ archivefileview.cpp \ archiveproxy.cpp \ editarchiveitemdialog.cpp \ sizedelegate.cpp \ -archiveddelegate.cpp +archiveddelegate.cpp \ +coverarchiveeditor.cpp \ +textenterdialog.cpp HEADERS = listitem.h \ listmodel.h \ movieitem.h \ @@ -51,7 +53,9 @@ archivefileview.h \ archiveproxy.h \ editarchiveitemdialog.h \ sizedelegate.h \ -archiveddelegate.h +archiveddelegate.h \ +coverarchiveeditor.h \ +textenterdialog.h LIBS += -lmagic LIBS += -lcryptopp INCLUDEPATH += /usr/include/cryptopp diff --git a/sizedelegate.cpp b/sizedelegate.cpp index c6b3ae0..804670f 100644 --- a/sizedelegate.cpp +++ b/sizedelegate.cpp @@ -16,7 +16,7 @@ SizeDelegate::SizeDelegate(QObject *parent) : QAbstractItemDelegate(parent) {}; void SizeDelegate::paint(QPainter *p, const QStyleOptionViewItem &option, const QModelIndex &index) const{ p->save(); - qint64 size = index.data().toInt(); + qint64 size = index.data().toLongLong(); qint64 maxSize = Q_INT64_C(2147483648); QColor c(QColor(Qt::darkGreen)); if(size > maxSize){ @@ -35,7 +35,7 @@ QSize SizeDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelInd QFont font = option.font; QFontMetrics metrics(font); QLocale l; - QString size = l.toString(index.data().toInt()); + QString size = l.toString(index.data().toLongLong()); return metrics.size(Qt::TextSingleLine, size); } diff --git a/textenterdialog.cpp b/textenterdialog.cpp new file mode 100644 index 0000000..dae7a48 --- /dev/null +++ b/textenterdialog.cpp @@ -0,0 +1,38 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QPushButton> +#include <QLabel> +#include <QApplication> + +#include "textenterdialog.h" + +TextEnterDialog::TextEnterDialog(const QString &text, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ + QVBoxLayout *mainLayout = new QVBoxLayout; + QLabel *l1 = new QLabel(text); + mainLayout->addWidget(l1); + mText = new QLineEdit; + mainLayout->addWidget(mText); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + mOk = new QPushButton(tr("Ok")); + connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); + buttonLayout->addStretch(); + buttonLayout->addWidget(mOk); + mClose = new QPushButton(tr("Close")); + connect(mClose, SIGNAL(clicked()), this, SLOT(reject())); + buttonLayout->addWidget(mClose); + + mainLayout->addLayout(buttonLayout); + + QString title = QString(tr("%1 - Enter text")).arg(qApp->applicationName()); + setWindowTitle(title); + + setLayout(mainLayout); +} diff --git a/textenterdialog.h b/textenterdialog.h new file mode 100644 index 0000000..f555b85 --- /dev/null +++ b/textenterdialog.h @@ -0,0 +1,32 @@ +/* + 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 TEXTENTERDIALOG_H +#define TEXTENTERDIALOG_H + +#include <QDialog> +#include <QLineEdit> + +class QLineEdit; +class QPushButton; +class QString; + +class TextEnterDialog : public QDialog { + Q_OBJECT + public: + TextEnterDialog(const QString &text, QWidget *parent = 0, Qt::WindowFlags f = 0); + ~TextEnterDialog() {}; + const QString text() const { return mText->text(); }; + + private: + QPushButton *mOk; + QPushButton *mClose; + QLineEdit *mText; +}; + +#endif + |