diff options
-rw-r--r-- | archiveddelegate.cpp | 38 | ||||
-rw-r--r-- | archiveddelegate.h | 23 | ||||
-rw-r--r-- | archiveviewwidget.cpp | 17 | ||||
-rw-r--r-- | archiveviewwidget.h | 8 | ||||
-rw-r--r-- | covereditor.cpp | 29 | ||||
-rw-r--r-- | covereditor.h | 10 | ||||
-rw-r--r-- | coveritem.cpp | 34 | ||||
-rw-r--r-- | coveritem.h | 9 | ||||
-rw-r--r-- | editarchiveitemdialog.cpp | 63 | ||||
-rw-r--r-- | editarchiveitemdialog.h | 12 | ||||
-rw-r--r-- | filesystemwidget.cpp | 2 | ||||
-rw-r--r-- | helper.cpp | 38 | ||||
-rw-r--r-- | helper.h | 3 | ||||
-rw-r--r-- | movieitem.cpp | 14 | ||||
-rw-r--r-- | moviemodel.cpp | 17 | ||||
-rw-r--r-- | moviemodel.h | 1 | ||||
-rw-r--r-- | shemov.cpp | 65 | ||||
-rw-r--r-- | shemov.h | 8 | ||||
-rw-r--r-- | shemov.pro | 8 | ||||
-rw-r--r-- | sizedelegate.cpp | 41 | ||||
-rw-r--r-- | sizedelegate.h | 23 |
21 files changed, 323 insertions, 140 deletions
diff --git a/archiveddelegate.cpp b/archiveddelegate.cpp new file mode 100644 index 0000000..6f9a49d --- /dev/null +++ b/archiveddelegate.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 <QFontMetrics> +#include <QPainter> +#include <QApplication> + +#include "archiveddelegate.h" + +ArchivedDelegate::ArchivedDelegate(QObject *parent) : QAbstractItemDelegate(parent) {}; + +void ArchivedDelegate::paint(QPainter *p, const QStyleOptionViewItem &option, const QModelIndex &index) const{ + p->save(); + qApp->style()->drawControl(QStyle::CE_ItemViewItem, &option, p); + QColor c(QColor(Qt::darkGreen)); + QString text(tr("No")); + if(index.data().toInt() > -1){ + c = QColor(Qt::red); + text = QString(tr("On DVD # %1")).arg(QString::number(index.data().toInt())); + } + p->setPen(QPen(c)); + p->drawText(option.rect, Qt::AlignLeft | Qt::AlignVCenter, text); + p->restore(); +} + +QSize ArchivedDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { + QString text(tr("No")); + if(index.data().toInt() > -1){ + text = QString(tr("On DVD # %1")).arg(QString::number(index.data().toInt())); + } + QFontMetrics metrics(option.font); + return metrics.size(Qt::TextSingleLine, text); +} + diff --git a/archiveddelegate.h b/archiveddelegate.h new file mode 100644 index 0000000..a7a4c09 --- /dev/null +++ b/archiveddelegate.h @@ -0,0 +1,23 @@ +/* + 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 ARCHIVEDDELEGATE_H +#define ARCHIVEDDELEGATE_H + +#include <QAbstractItemDelegate> + +class ArchivedDelegate : public QAbstractItemDelegate { + Q_OBJECT + public: + ArchivedDelegate(QObject *parent = 0); + ~ArchivedDelegate() {}; + void paint(QPainter *p, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; +}; + +#endif + diff --git a/archiveviewwidget.cpp b/archiveviewwidget.cpp index 9a0e76e..51a9c91 100644 --- a/archiveviewwidget.cpp +++ b/archiveviewwidget.cpp @@ -19,6 +19,9 @@ #include "moviemodel.h" #include "listmodel.h" #include "archiveproxy.h" +#include "editarchiveitemdialog.h" +#include "sizedelegate.h" +#include "archiveddelegate.h" ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListModel *actors, QWidget *parent) : QWidget(parent), mMovieModel(model), mGenreModel(genre), mActorsModel(actors){ //filter bar @@ -50,6 +53,8 @@ ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListMo //treeview mFileView = new ArchiveFileView; + mFileView->setItemDelegateForColumn(MovieItem::Size, new SizeDelegate(this)); + mFileView->setItemDelegateForColumn(MovieItem::Dvd, new ArchivedDelegate(this)); mProxy = new ArchiveProxy(this); mProxy->setSourceModel(mMovieModel); mFileView->setModel(mProxy); @@ -68,6 +73,18 @@ ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListMo setLayout(mainLayout); } +void ArchiveViewWidget::editFile(){ + QModelIndexList selected = mFileView->selectionModel()->selectedRows(); + if(!selected.isEmpty()){ + QModelIndex idx = selected.at(0); + QModelIndex real = mProxy->mapToSource(idx); + mEditDialog->setMovie(real); + mEditDialog->show(); + mEditDialog->raise(); + mEditDialog->activateWindow(); + } +} + void ArchiveViewWidget::setFilter(){ QString filter = mName->text().toLower(); if(filter.isEmpty()){ diff --git a/archiveviewwidget.h b/archiveviewwidget.h index ea90a6f..45bb21f 100644 --- a/archiveviewwidget.h +++ b/archiveviewwidget.h @@ -10,6 +10,8 @@ #include <QWidget> +#include "archivefileview.h" + class MovieModel; class ListModel; class QComboBox; @@ -18,6 +20,7 @@ class QPushButton; class QModelIndex; class ArchiveFileView; class ArchiveProxy; +class EditArchiveItemDialog; class ArchiveViewWidget : public QWidget { Q_OBJECT @@ -25,6 +28,10 @@ class ArchiveViewWidget : public QWidget { ArchiveViewWidget(MovieModel *model, ListModel *genre, ListModel *actors, QWidget *parent = 0); ~ArchiveViewWidget() {}; ArchiveFileView* fileView() { return mFileView; }; + void setEditDialog(EditArchiveItemDialog *dlg) { mEditDialog = dlg; }; + + public slots: + void editFile(); signals: void statusbarMessage(const QString &message); @@ -49,6 +56,7 @@ class ArchiveViewWidget : public QWidget { ListModel *mActorsModel; ArchiveFileView *mFileView; ArchiveProxy *mProxy; + EditArchiveItemDialog *mEditDialog; }; #endif diff --git a/covereditor.cpp b/covereditor.cpp index 5472f23..1c872a0 100644 --- a/covereditor.cpp +++ b/covereditor.cpp @@ -15,7 +15,7 @@ #include "covereditor.h" -CoverEditor::CoverEditor(Mode mode, QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f), mMode(mode){ +CoverEditor::CoverEditor(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f){ QGridLayout *mainLayout = new QGridLayout; QLabel *l1 = new QLabel(tr("Front cover")); mFrontCover = new QComboBox; @@ -33,15 +33,6 @@ CoverEditor::CoverEditor(Mode mode, QWidget *parent, Qt::WindowFlags f) : QWidge mMovie = new QComboBox; mainLayout->addWidget(l4, 3, 0); mainLayout->addWidget(mMovie, 3, 1); - mAddFile = new QPushButton(tr("Add cover")); - if(mode == Archive){ - mAddFile->setVisible(false); - }else{ - l4->setVisible(false); - mMovie->setVisible(false); - } - connect(mAddFile, SIGNAL(clicked()), this, SLOT(addFile())); - mainLayout->addWidget(mAddFile, 4, 1); setLayout(mainLayout); } @@ -127,24 +118,6 @@ const QString CoverEditor::movie() const{ } -void CoverEditor::addFile(){ - QSettings s; - QString startDir = s.value("ui/selectstartup").toString(); - QStringList files = QFileDialog::getOpenFileNames(this, "Select covers to add to list", startDir); - foreach(QString f, files){ - if(!mCoverPaths.contains(f)){ - files << f; - int idx(-1); - if((idx = f.lastIndexOf('/')) != -1){ - f.remove(0, idx + 1); - mFrontCover->addItem(f); - mBackCover->addItem(f); - mCovers->addItem(f); - } - } - } -} - const QString CoverEditor::findPath(const QString &name) const{ QString retval; foreach(QString s, mCoverPaths){ diff --git a/covereditor.h b/covereditor.h index 1c0fb93..c702ef8 100644 --- a/covereditor.h +++ b/covereditor.h @@ -12,14 +12,11 @@ class QComboBox; class QStringList; -class QPushButton; class CoverEditor : public QWidget { Q_OBJECT - Q_ENUMS(Mode); public: - enum Mode { Archive, Update }; - CoverEditor(Mode mode = Archive, QWidget *parent = 0, Qt::WindowFlags f = 0); + CoverEditor(QWidget *parent = 0, Qt::WindowFlags f = 0); ~CoverEditor() {}; void setCovers(const QStringList &covers); const QString frontCover() const; @@ -27,17 +24,12 @@ class CoverEditor : public QWidget { const QString covers() const; const QString movie() const; - private slots: - void addFile(); - private: const QString findPath(const QString &name) const; QComboBox *mFrontCover; QComboBox *mBackCover; QComboBox *mCovers; QComboBox *mMovie; - QPushButton *mAddFile; - Mode mMode; QStringList mCoverPaths; }; diff --git a/coveritem.cpp b/coveritem.cpp index f42afc5..4955349 100644 --- a/coveritem.cpp +++ b/coveritem.cpp @@ -6,45 +6,27 @@ */ #include <QString> -#include <QSettings> +#include <QFileInfo> #include "coveritem.h" -CoverItem::CoverItem(const QString &filename, const QString &type, const QString &md5) : mFilename(filename), mType(type), mMd5(md5){ - setPath(); +CoverItem::CoverItem(const QString &fullPath, const QString &type, const QString &md5) : mFullPath(fullPath), mType(type), mMd5(md5){ + setFileName(); } CoverItem::CoverItem() {}; -void CoverItem::setFileName(const QString &filename){ - mFilename = filename; - setPath(); -} - void CoverItem::setMd5(const QString &md5){ mMd5 = md5; - setPath(); } void CoverItem::setFullPath(const QString &fullPath){ - if(fullPath.contains('/')){ - mFullPath = fullPath; - QString wc = fullPath; - int idx = fullPath.lastIndexOf('/') + 1; - mFilename = wc.remove(0, idx); - } + mFullPath = fullPath; + setFileName(); } -void CoverItem::setPath(){ - if(mFilename.isEmpty() || mMd5.isEmpty()){ - return; - } - // assume it's the full path - if(mFilename.contains('/')){ - return; - } - QSettings s; - QString archive = s.value("paths/archivedir").toString(); - mFullPath = QString("%1/%2/%3/%4").arg(archive).arg(mMd5[0]).arg(mMd5[1]).arg(mFilename); +void CoverItem::setFileName(){ + QFileInfo info(mFullPath); + mFilename = info.fileName(); } diff --git a/coveritem.h b/coveritem.h index 0abccfa..a70de74 100644 --- a/coveritem.h +++ b/coveritem.h @@ -8,28 +8,29 @@ #ifndef COVERITEM_H #define COVERITEM_H +#include <QMetaType> + class QString; class CoverItem { public: CoverItem(); - CoverItem(const QString &filename, const QString &type, const QString &md5); + CoverItem(const QString &fullPath, const QString &type, const QString &md5); ~CoverItem() {}; const QString fileName() const { return mFilename; }; const QString fullPath() const { return mFullPath; }; const QString type() const { return mType; }; const QString md5() const { return mMd5; }; - void setFileName(const QString &filename); void setType(const QString &type) { mType = type; }; void setMd5(const QString &md5); void setFullPath(const QString &fullPath); private: - void setPath(); + void setFileName(); + QString mFullPath; QString mFilename; QString mType; QString mMd5; - QString mFullPath; }; Q_DECLARE_METATYPE(CoverItem) diff --git a/editarchiveitemdialog.cpp b/editarchiveitemdialog.cpp index 333c410..6a77300 100644 --- a/editarchiveitemdialog.cpp +++ b/editarchiveitemdialog.cpp @@ -94,6 +94,8 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors titleLayout->addWidget(l6); titleLayout->addWidget(mTitle); w1Layout->addLayout(titleLayout); + w1->setLayout(w1Layout); + w1->setMinimumWidth(500); //list editors QWidget *w2 = new QWidget; @@ -102,8 +104,8 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors w2Layout->addWidget(genreEditor); ListEditor *actorsEditor = new ListEditor(mActorsModel); w2Layout->addWidget(actorsEditor); - mCoverEditor = new CoverEditor(CoverEditor::Update); - w2Layout->addWidget(mCoverEditor); + w2Layout->addStretch(); + w2->setLayout(w2Layout); //splitter QSplitter *splitter = new QSplitter; @@ -116,7 +118,7 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors mUpdate = new QPushButton(tr("Update")); connect(mUpdate, SIGNAL(clicked()), this, SLOT(updateMovie())); mClose = new QPushButton(tr("Close")); - connect(mClose, SIGNAL(triggered()), this, SLOT(reject())); + connect(mClose, SIGNAL(clicked()), this, SLOT(reject())); buttonLayout->addWidget(mUpdate); buttonLayout->addWidget(mClose); @@ -139,7 +141,6 @@ void EditArchiveItemDialog::setMovie(const QModelIndex &movie){ mCovers = movie.data(MovieModel::CoverRole).toList(); setActors(); setMovieInfo(movie); - setCovers(movie); } void EditArchiveItemDialog::setActors(){ @@ -156,44 +157,34 @@ void EditArchiveItemDialog::setActors(){ void EditArchiveItemDialog::setMovieInfo(const QModelIndex &movie){ QString html("<html><body style=\"color:#CD0003\"><ul>"); QModelIndex idx = mMovieModel->index(movie.row(), MovieItem::Title, QModelIndex()); - html.append(tr("<li>Title: %1</li>")).arg(idx.data().toString()); + html.append(QString(tr("<li>Title: %1</li>")).arg(idx.data().toString())); mTitle->setText(idx.data().toString()); idx = mMovieModel->index(movie.row(), MovieItem::Filename, QModelIndex()); - html.append(tr("<li>Filename: %1</li>")).arg(idx.data().toString()); + html.append(QString(tr("<li>Filename: %1</li>")).arg(idx.data().toString())); idx = mMovieModel->index(movie.row(), MovieItem::Md5Sum, QModelIndex()); - html.append(tr("<li>Md5-Sum: %1</li>")).arg(idx.data().toString()); + html.append(QString(tr("<li>Md5-Sum: %1</li>")).arg(idx.data().toString())); idx = mMovieModel->index(movie.row(), MovieItem::Size, QModelIndex()); QLocale l; - html.append(tr("<li>Size: %1</li>")).arg(l.toString(idx.data().toLongLong())); + html.append(QString(tr("<li>Size: %1</li>")).arg(l.toString(idx.data().toLongLong()))); idx = mMovieModel->index(movie.row(), MovieItem::Genre, QModelIndex()); - html.append(tr("<li>Genre: %1</li>")).arg(idx.data().toString()); + html.append(QString(tr("<li>Genre: %1</li>")).arg(idx.data().toString())); int genreIndex = mGenre->findText(idx.data().toString()); if(genreIndex != -1){ mGenre->setCurrentIndex(genreIndex); } idx = mMovieModel->index(movie.row(), MovieItem::Quality, QModelIndex()); - html.append(tr("<li>Quality: %1</li>")).arg(l.toString(idx.data().toInt())); + html.append(QString(tr("<li>Quality: %1</li>")).arg(l.toString(idx.data().toInt()))); mQuality->setValue(idx.data().toInt()); idx = mMovieModel->index(movie.row(), MovieItem::Dvd, QModelIndex()); int dvd = idx.data().toInt(); if(dvd != -1){ - html.append(tr("<li>On DVD %1</li>")).arg(l.toString(dvd)); + html.append(QString(tr("<li>On DVD %1</li>")).arg(l.toString(dvd))); }else{ - html.append(tr("<li>Not on DVD</li>)")); + html.append(QString(tr("<li>Not on DVD</li>"))); } mDvd->setValue(dvd); -} - -void EditArchiveItemDialog::setCovers(const QModelIndex &movie){ - mCovers.clear(); - QList<QVariant> covers = movie.data(MovieModel::CoverRole).toList(); - QStringList coverNames; - foreach(QVariant v, covers){ - CoverItem i = v.value<CoverItem>(); - coverNames << i.fileName(); - //mModelCovers << i.fileName(); - } - mCoverEditor->setCovers(coverNames); + html.append("</ul></body></html>"); + mMovieInfo->setHtml(html); } void EditArchiveItemDialog::addActor(){ @@ -222,14 +213,20 @@ void EditArchiveItemDialog::updateMovie(){ ++it; } mMovieModel->setActors(mMovieId, actors); - + QString genreName = mGenre->currentText(); + QModelIndex genreIdx = mGenreModel->index(genreName); + QModelIndex genreMovieIndex = mMovieModel->index(mMovieId, MovieItem::Genre); + QVariant genreId = genreIdx.data(ListModel::IdRole); + mMovieModel->setDataAt(genreMovieIndex, genreId); + QModelIndex dvdIdx = mMovieModel->index(mMovieId, MovieItem::Dvd); + mMovieModel->setDataAt(dvdIdx, mDvd->value()); + QModelIndex qualityIdx = mMovieModel->index(mMovieId, MovieItem::Quality); + mMovieModel->setDataAt(qualityIdx, mQuality->value()); + QString title = mTitle->text().trimmed().toLower(); + QModelIndex titleIdx = mMovieModel->index(mMovieId, MovieItem::Title); + if(!title.isEmpty()){ + mMovieModel->setDataAt(titleIdx, title); + } + setMovieInfo(titleIdx); } -void EditArchiveItemDialog::updateCovers(){ - QString front = mCoverEditor->frontCover(); - QString back = mCoverEditor->backCover(); - QString covers = mCoverEditor->covers(); - QList<CoverItem> coverList; - ///if(front - -} diff --git a/editarchiveitemdialog.h b/editarchiveitemdialog.h index 529b446..92ea8f6 100644 --- a/editarchiveitemdialog.h +++ b/editarchiveitemdialog.h @@ -20,7 +20,6 @@ class QSpinBox; class QTextEdit; class QPushButton; class QModelIndex; -class CoverEditor; class EditArchiveItemDialog : public QDialog { Q_OBJECT @@ -29,14 +28,14 @@ class EditArchiveItemDialog : public QDialog { ~EditArchiveItemDialog() {}; void setMovie(const QModelIndex &movie); - private: - void setActors(); - void setMovieInfo(const QModelIndex &movie); - void setCovers(const QModelIndex &movie); + private slots: void addActor(); void removeActor(); void updateMovie(); - void updateCovers(); + + private: + void setActors(); + void setMovieInfo(const QModelIndex &movie); ListModel *mGenreModel; ListModel *mActorsModel; MovieModel *mMovieModel; @@ -53,7 +52,6 @@ class EditArchiveItemDialog : public QDialog { QLineEdit *mTitle; QHash<QString, QVariant> mActorMap; QList<QVariant> mCovers; - CoverEditor *mCoverEditor; int mMovieId; }; diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index d72d175..d15feeb 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -32,7 +32,7 @@ #include "helper.h" #include "messagedialog.h" #include "extractordialog.h" -#include "archiveeditwidget.h" +#include "archiveeditdialog.h" FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) { mModel = new QDirModel; @@ -9,6 +9,7 @@ #include <QByteArray> #include <QFileInfo> #include <QFile> +#include <QSettings> #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 #include <md5.h> @@ -75,5 +76,42 @@ namespace Helper { } return retval; } + + bool moveToArchive(const QString &path, const QString &md5){ + QFileInfo info(path); + if(!info.exists()){ + return false; + } + QFileInfo destFile = QFileInfo(createArchivePath(path, md5)); + if(destFile.exists()){ + destFile = QFileInfo(createArchivePath(path, md5, true)); + if(destFile.exists()){ + return false; + } + } + return QFile::rename(path, destFile.absoluteFilePath()); + } + + bool removeFromArchive(const QString &fileName, const QString &md5){ + QString file = createArchivePath(fileName, md5); + QFileInfo info(file); + if(!info.exists()){ + return false; + } + return QFile::remove(file); + } + + const QString createArchivePath(const QString &path, const QString &md5, bool withMd5){ + QSettings s; + QString archiveDir = s.value("paths/archivedir").toString(); + QFileInfo info(path); + QString retval; + if(withMd5){ + retval = QString("%1/%2/%3/%4_%5.%6").arg(archiveDir).arg(md5[0]).arg(md5[1]).arg(info.completeBaseName()).arg(md5).arg(info.suffix()); + }else{ + retval = QString("%1/%2/%3/%4").arg(archiveDir).arg(md5[0]).arg(md5[1]).arg(info.fileName()); + } + return retval; + } } @@ -15,6 +15,9 @@ class QString; namespace Helper { const QString mimeType(const QString &path); const QString md5Sum(const QString &path); + bool 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); } #endif diff --git a/movieitem.cpp b/movieitem.cpp index 7e8d379..4b05900 100644 --- a/movieitem.cpp +++ b/movieitem.cpp @@ -9,6 +9,7 @@ #include "movieitem.h" #include "coveritem.h" +#include "helper.h" MovieItem::MovieItem(int id, QObject *parent) : QObject(parent), mNumRows(7), mId(id), mGenreId(-1) { for(int i = 0; i < mNumRows; ++i){ @@ -18,7 +19,7 @@ MovieItem::MovieItem(int id, QObject *parent) : QObject(parent), mNumRows(7), m populate(); setGenreName(); setActors(); - setSize(); + //setSize(); setCovers(); } } @@ -28,7 +29,7 @@ void MovieItem::setId(int id){ populate(); setGenreName(); setActors(); - setSize(); + //setSize(); setCovers(); } @@ -42,6 +43,9 @@ bool MovieItem::setData(const QList<QVariant> &data){ void MovieItem::setDataAt(int column, const QVariant &data){ mRows[column] = data; + if(column == Genre){ + setGenreName(); + } } const QList<QVariant> MovieItem::data() const { @@ -100,7 +104,11 @@ void MovieItem::setCovers(){ coverQuery.bindValue(":id", mId); coverQuery.exec(); while(coverQuery.next()){ - CoverItem item(coverQuery.value(0).toString(), coverQuery.value(1).toString(), coverQuery.value(2).toString()); + QString filename = coverQuery.value(0).toString(); + QString md5 = coverQuery.value(2).toString(); + QString coverType = coverQuery.value(1).toString(); + QString fullPath = Helper::createArchivePath(filename, md5); + CoverItem item(fullPath, coverType, md5); QVariant i; i.setValue(item); mCovers << i; diff --git a/moviemodel.cpp b/moviemodel.cpp index d34113a..8bfa846 100644 --- a/moviemodel.cpp +++ b/moviemodel.cpp @@ -69,6 +69,18 @@ QModelIndex MovieModel::index(int row, int column, const QModelIndex &parent) co return createIndex(row, column, internal); } +QModelIndex MovieModel::index(int movieId, int column) const{ + QModelIndex retval = QModelIndex(); + for(int i = 0; i < rowCount(QModelIndex()); ++i){ + MovieItem *item = mItems.at(i); + if(item->id() == movieId){ + retval = createIndex(i, column, item); + break; + } + } + return retval; +} + QVariant MovieModel::data(const QModelIndex &index, int role) const{ if(!index.isValid()){ return QVariant(); @@ -76,11 +88,6 @@ QVariant MovieModel::data(const QModelIndex &index, int role) const{ MovieItem *item = static_cast<MovieItem*>(index.internalPointer()); Q_ASSERT(item != 0); if(role == Qt::DisplayRole){ - switch (index.column()){ - case MovieItem::Dvd: - return QVariant(QString(tr("DVD %1")).arg(QString::number(item->dataAt(MovieItem::Dvd).toInt()))); - break; - } return item->dataAt(index.column()); } if(role == ActorsRole){ diff --git a/moviemodel.h b/moviemodel.h index d2cbe50..6367583 100644 --- a/moviemodel.h +++ b/moviemodel.h @@ -24,6 +24,7 @@ class MovieModel : public QAbstractItemModel { MovieModel(QObject *parent = 0); ~MovieModel(); QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex index(int movieId, int column = 0) const; QModelIndex parent(const QModelIndex &) const { return QModelIndex(); }; int columnCount(const QModelIndex &) const { return MovieItem::NumRows; }; int rowCount(const QModelIndex &) const { return mItems.size(); }; @@ -29,6 +29,7 @@ #include "moviemodel.h" #include "listmodel.h" #include "archiveviewwidget.h" +#include "editarchiveitemdialog.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) { qApp->setWindowIcon(QIcon(":/shemov.png")); @@ -64,6 +65,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla mAEdit->setMovieModel(mMovieModel); mFSWidget->setArchiveDialog(mAEdit); + mAItemEdit = new EditArchiveItemDialog(mGenreModel, mActorModel, mMovieModel, this); + mAVWidget->setEditDialog(mAItemEdit); + QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); @@ -78,6 +82,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(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); @@ -108,6 +113,11 @@ void SheMov::configure(){ createExtractMenu(); } +void SheMov::tabChanged(int newTab){ + mEditFSMenuA->setVisible(newTab == 0); + mEditArchiveMenuA->setVisible(newTab == 1); +} + void SheMov::createStatusbar(){ QLabel *selCountL = new QLabel(tr("Sel. Items")); mSelectedItems = new QLabel("0"); @@ -126,7 +136,7 @@ void SheMov::createActions(){ mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); - //Edit menu + //Edit menu (FS) mCdupA = new QAction(tr("Go up"), this); connect(mCdupA, SIGNAL(triggered()), mFSWidget, SLOT(parentDir())); mFSWidget->fileView()->addAction(mCdupA); @@ -204,39 +214,50 @@ void SheMov::createActions(){ connect(mExtractMapper, SIGNAL(mapped(const QString &)), mFSWidget, SLOT(extract(const QString &))); mExtractMenu = new QMenu(tr("E&xtract to..."), this); createExtractMenu(); + + //Edit menu (archive) + mEditArchiveFileA = new QAction(tr("Edit file..."), this); + mEditArchiveFileA->setShortcut(tr("CTRL+e")); + mAVWidget->fileView()->addAction(mEditArchiveFileA); + connect(mEditArchiveFileA, SIGNAL(triggered()), mAVWidget, SLOT(editFile())); } void SheMov::createMenus(){ QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(mQuitA); - QMenu *editMenu = new QMenu(tr("&Edit"), this); - editMenu->addAction(mCdupA); - editMenu->addSeparator(); - editMenu->addAction(mMarkFilesA); - editMenu->addAction(mUnmarkFilesA); - editMenu->addSeparator(); - editMenu->addAction(mCreateFolderA); - editMenu->addAction(mDeleteFilesA); - editMenu->addSeparator(); - editMenu->addAction(mCopyA); - editMenu->addAction(mMoveA); - editMenu->addAction(mRenameA); - editMenu->addAction(mArchiveA); + mEditFSMenu = new QMenu(tr("&Edit"), this); + mEditFSMenu->addAction(mCdupA); + mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mMarkFilesA); + mEditFSMenu->addAction(mUnmarkFilesA); + mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mCreateFolderA); + mEditFSMenu->addAction(mDeleteFilesA); + mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mCopyA); + mEditFSMenu->addAction(mMoveA); + mEditFSMenu->addAction(mRenameA); + mEditFSMenu->addAction(mArchiveA); QMenu *renameMenu = new QMenu(tr("&Rename..."), this); renameMenu->addAction(mTemplateA); renameMenu->addAction(mRenameCoverFA); renameMenu->addAction(mRenameCoverBA); renameMenu->addAction(mRenameCoverCA); - editMenu->addMenu(renameMenu); - editMenu->addSeparator(); - editMenu->addMenu(mExtractMenu); - editMenu->addSeparator(); - editMenu->addAction(mRefreshA); - editMenu->addSeparator(); - editMenu->addAction(mConfigA); + mEditFSMenu->addMenu(renameMenu); + mEditFSMenu->addSeparator(); + mEditFSMenu->addMenu(mExtractMenu); + mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mRefreshA); + mEditFSMenu->addSeparator(); + mEditFSMenu->addAction(mConfigA); + + mEditArchiveMenu = new QMenu(tr("&Edit archive"), this); + mEditArchiveMenu->addAction(mEditArchiveFileA); menuBar()->addMenu(fileMenu); - menuBar()->addMenu(editMenu); + mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); + mEditArchiveMenuA = menuBar()->addMenu(mEditArchiveMenu); + mEditArchiveMenuA->setVisible(false); } void SheMov::createExtractMenu(){ @@ -23,6 +23,7 @@ class ArchiveEditDialog; class MovieModel; class ListModel; class ArchiveViewWidget; +class EditArchiveItemDialog; class SheMov : public QMainWindow { Q_OBJECT @@ -36,6 +37,7 @@ class SheMov : public QMainWindow { void statusbarMessage(const QString &message); void setTemplate(const QString &newTemplate); void configure(); + void tabChanged(int newTab); private: void createStatusbar(); @@ -64,6 +66,7 @@ class SheMov : public QMainWindow { QAction *mTemplateA; QAction *mConfigA; QAction *mArchiveA; + QAction *mEditArchiveFileA; QList<QAction*> mExtractToA; //EndActions @@ -71,11 +74,16 @@ class SheMov : public QMainWindow { QSignalMapper *mExtractMapper; QMenu *mExtractMenu; + QMenu *mEditFSMenu; + QMenu *mEditArchiveMenu; + QAction *mEditFSMenuA; + QAction *mEditArchiveMenuA; QTabWidget *mTab; FilesystemWidget *mFSWidget; ArchiveViewWidget *mAVWidget; ArchiveEditDialog *mAEdit; + EditArchiveItemDialog *mAItemEdit; MovieModel *mMovieModel; ListModel *mGenreModel; ListModel *mActorModel; @@ -24,7 +24,9 @@ archivefilewidget.cpp \ archiveviewwidget.cpp \ archivefileview.cpp \ archiveproxy.cpp \ -editarchiveitemdialog.cpp +editarchiveitemdialog.cpp \ +sizedelegate.cpp \ +archiveddelegate.cpp HEADERS = listitem.h \ listmodel.h \ movieitem.h \ @@ -47,7 +49,9 @@ archivefilewidget.h \ archiveviewwidget.h \ archivefileview.h \ archiveproxy.h \ -editarchiveitemdialog.h +editarchiveitemdialog.h \ +sizedelegate.h \ +archiveddelegate.h LIBS += -lmagic LIBS += -lcryptopp INCLUDEPATH += /usr/include/cryptopp diff --git a/sizedelegate.cpp b/sizedelegate.cpp new file mode 100644 index 0000000..c6b3ae0 --- /dev/null +++ b/sizedelegate.cpp @@ -0,0 +1,41 @@ +/* + 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 <QFontMetrics> +#include <QLocale> +#include <QPainter> +#include <QApplication> + +#include "sizedelegate.h" + +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 maxSize = Q_INT64_C(2147483648); + QColor c(QColor(Qt::darkGreen)); + if(size > maxSize){ + c = QColor(Qt::red); + } + qApp->style()->drawControl(QStyle::CE_ItemViewItem, &option, p); + p->setPen(QPen(c)); + p->setFont(option.font); + QLocale l; + QString text = l.toString(size); + p->drawText(option.rect, Qt::AlignRight | Qt::AlignCenter | Qt::AlignVCenter, text); + p->restore(); +} + +QSize SizeDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { + QFont font = option.font; + QFontMetrics metrics(font); + QLocale l; + QString size = l.toString(index.data().toInt()); + return metrics.size(Qt::TextSingleLine, size); +} + diff --git a/sizedelegate.h b/sizedelegate.h new file mode 100644 index 0000000..a1c1d47 --- /dev/null +++ b/sizedelegate.h @@ -0,0 +1,23 @@ +/* + 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 SIZEDELEGATE_H +#define SIZEDELEGATE_H + +#include <QAbstractItemDelegate> + +class SizeDelegate : public QAbstractItemDelegate { + Q_OBJECT + public: + SizeDelegate(QObject *parent = 0); + ~SizeDelegate() {}; + void paint(QPainter *p, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; +}; + +#endif + |