summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-07-22 18:44:02 +0000
committeram <am@f440f766-f032-0410-8965-dc7d17de2ca0>2009-07-22 18:44:02 +0000
commit0e3e202c90e3ccb80310087409936c00189f0cea (patch)
treea4a38c32e761f024e2dfad6a59097cff15472b9e
parent84ed109c159dcbd0c9395717d54599e902060b26 (diff)
downloadSheMov-0e3e202c90e3ccb80310087409936c00189f0cea.tar.gz
SheMov-0e3e202c90e3ccb80310087409936c00189f0cea.tar.bz2
SheMov-0e3e202c90e3ccb80310087409936c00189f0cea.zip
-Finished CoverArchiveEditor (finally, don't like that piece of code, too complicated)
-It's now possible to manually add a movie w/o a file -Some usability fixes git-svn-id: file:///var/svn/repos2/shemov/trunk@394 f440f766-f032-0410-8965-dc7d17de2ca0
-rw-r--r--archiveddelegate.cpp8
-rw-r--r--archiveviewwidget.cpp69
-rw-r--r--archiveviewwidget.h6
-rw-r--r--coverarchiveeditor.cpp182
-rw-r--r--coverarchiveeditor.h50
-rw-r--r--coveritem.cpp19
-rw-r--r--coveritem.h11
-rw-r--r--editarchiveitemdialog.cpp9
-rw-r--r--editarchiveitemdialog.h1
-rw-r--r--helper.cpp16
-rw-r--r--helper.h6
-rw-r--r--listeditor.cpp1
-rw-r--r--listeditor.h3
-rw-r--r--listmodel.cpp14
-rw-r--r--listmodel.h1
-rw-r--r--moviemodel.cpp12
-rw-r--r--moviemodel.h1
-rw-r--r--shemov.cpp11
-rw-r--r--shemov.h4
-rw-r--r--shemov.pro8
-rw-r--r--sizedelegate.cpp4
-rw-r--r--textenterdialog.cpp38
-rw-r--r--textenterdialog.h32
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();
diff --git a/helper.cpp b/helper.cpp
index 508e482..de0b54c 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -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);
+ }
}
diff --git a/helper.h b/helper.h
index 639c633..64dc3da 100644
--- a/helper.h
+++ b/helper.h
@@ -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(); };
diff --git a/shemov.cpp b/shemov.cpp
index 6525dd5..f631f3e 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
diff --git a/shemov.h b/shemov.h
index cce3da9..0adb191 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;
diff --git a/shemov.pro b/shemov.pro
index ee1b0a1..32b2f83 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -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
+