diff options
author | Arno <am@disconnect.de> | 2013-10-12 15:35:24 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-10-12 15:35:24 +0200 |
commit | 89662ce745c1eee152e7bc2200be5f08caee78a8 (patch) | |
tree | 8d1e1de7d33c9a2ba78ba4cecb5683cf8db0f587 | |
parent | f4d47b31976bf0b95c8ee3e4c1f010ffe1d2fd21 (diff) | |
download | SheMov-89662ce745c1eee152e7bc2200be5f08caee78a8.tar.gz SheMov-89662ce745c1eee152e7bc2200be5f08caee78a8.tar.bz2 SheMov-89662ce745c1eee152e7bc2200be5f08caee78a8.zip |
Improve PictureViewer2
* implement Mark Files
* always show all pictures from context
* change navigation:
N -> next
P -> previous
M -> mark/unmark file
-rw-r--r-- | archivecontroller.cpp | 14 | ||||
-rw-r--r-- | filesystemwidget.cpp | 1 | ||||
-rw-r--r-- | pictureswidget.cpp | 1 | ||||
-rw-r--r-- | pictureviewer2.cpp | 79 | ||||
-rw-r--r-- | pictureviewer2.h | 13 | ||||
-rw-r--r-- | shemov.cpp | 12 | ||||
-rw-r--r-- | shemov.h | 2 |
7 files changed, 108 insertions, 14 deletions
diff --git a/archivecontroller.cpp b/archivecontroller.cpp index 84e714c..574b9c1 100644 --- a/archivecontroller.cpp +++ b/archivecontroller.cpp @@ -311,7 +311,19 @@ void ArchiveController::fileDoubleClicked(const QModelIndex &idx){ return; } PictureViewer2 *pv = SmGlobals::instance()->pictureViewer(); - pv->setFile(idx.data(ArchiveFilesModel::FullPathRole).toString()); + QModelIndex parent = idx.parent(); + QStringList paths; + if(parent.isValid()){ + int row = 0; + QModelIndex child = parent.child(row, ArchiveFilesModel::FullPath); + while(child.isValid()){ + paths << child.data().toString(); + ++row; + child = parent.child(row, ArchiveFilesModel::FullPath); + } + } + pv->setShowMarkItem(false); + pv->addFiles(paths); pv->show(); } diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 71dfa68..3f550a4 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -211,6 +211,7 @@ void FilesystemWidget::fileViewActivated(const QModelIndex &idx){ mPicViewer->setVisible(true); } mPicViewer->setShowMappingItem(false); + mPicViewer->setShowMarkItem(true); selectAllPV(); mPicViewer->selectPic(path); return; diff --git a/pictureswidget.cpp b/pictureswidget.cpp index c93f72e..d043e1c 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -124,6 +124,7 @@ void PicturesWidget::showInPicViewer(const QModelIndex &idx){ PicData pData = mPictureView->filesModel()->dataList(real); mPicViewer->setShowInfoItem(true); mPicViewer->setShowMappingItem(true); + mPicViewer->setShowMarkItem(false); mPicViewer->setFile(pData); mPictureView->setPVAll(); if(mPicViewerA){ diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp index 1251c6f..cc7357f 100644 --- a/pictureviewer2.cpp +++ b/pictureviewer2.cpp @@ -41,7 +41,7 @@ const QString PictureViewer2::mDefaultFile = ":/picgone.png"; -PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0), mCurPos(0), mFnItem(0), mMappingItem(0), mShowInfoItem(true), mShowMappingItem(true) { +PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0), mCurPos(0), mFnItem(0), mMappingItem(0), mShowInfoItem(true), mShowMappingItem(true), mShowMarkItem(false) { //behave like QDialog, but don't be one... setWindowFlags(QFlags<Qt::WindowType>(0x1|0x2|0x1000|0x2000|0x10000|0x8000000)); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -81,7 +81,6 @@ void PictureViewer2::addFiles(const PicDataList &files, bool clear){ QVariant curMd5 = mFiles.at(mCurPos).at(PicFilesModel::Md5Sum); if(clear){ mFiles = files; - }else{ foreach(const PicData &f, files){ if(!mFiles.contains(f)){ @@ -103,6 +102,17 @@ void PictureViewer2::addFiles(const PicDataList &files, bool clear){ } } +void PictureViewer2::addFiles(const QStringList &files, bool clear){ + if(files.isEmpty()){ + return; + } + PicDataList pd; + foreach(QString f, files){ + pd << picData(f); + } + addFiles(pd, clear); +} + void PictureViewer2::addFiles(const QString &dir, bool clear){ QFileInfo fi(dir); if(!fi.isDir()){ @@ -165,6 +175,7 @@ void PictureViewer2::next(){ }else{ ++mCurPos; } + mMarkA->setChecked(mMarkedFiles.contains(mFiles.at(mCurPos))); showFile(mFiles.at(mCurPos)); } @@ -174,6 +185,7 @@ void PictureViewer2::previous(){ }else{ --mCurPos; } + mMarkA->setChecked(mMarkedFiles.contains(mFiles.at(mCurPos))); showFile(mFiles.at(mCurPos)); } @@ -238,6 +250,9 @@ void PictureViewer2::initActions(){ if(a->data().toInt() == SlideAction){ mSlideA = a; } + if(a->data().toInt() == MarkAction){ + mMarkA = a; + } } } @@ -267,6 +282,23 @@ void PictureViewer2::addToNewPics(){ mNewPicsDlg->setFile(mCurPicData.at(PicFilesModel::FullPath).toString()); } +void PictureViewer2::markCurrent(){ + if(!mMarkedFiles.contains(mCurPicData)){ + mMarkedFiles << mCurPicData; + mMarkA->setChecked(true); + next(); + }else{ + mMarkedFiles.removeAll(mCurPicData); + mMarkA->setChecked(false); + } + constructInfoItem(mCurPicData, QSize()); +} + +void PictureViewer2::clearMarks(){ + mMarkedFiles.clear(); + constructInfoItem(mCurPicData, QSize()); +} + void PictureViewer2::wheelEvent(QWheelEvent *event){ int steps = event->delta() / 8 / 15; if(steps < 0){ @@ -291,6 +323,15 @@ void PictureViewer2::keyPressEvent(QKeyEvent *e){ if(e->key() == Qt::Key_Space){ mSlideA->toggle(); } + if(e->key() == Qt::Key_M){ + markCurrent(); + } + if(e->key() == Qt::Key_N){ + next(); + } + if(e->key() == Qt::Key_P){ + previous(); + } e->accept(); } @@ -361,7 +402,18 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){ mScene->removeItem(mFnItem); delete mFnItem; } + if(!picSize.isValid()){ + QPixmap pm = QPixmap(data.at(PicFilesModel::FullPath).toString()); + picSize = pm.size(); + } mFnItem = new PictureViewer2Item(data, mFiles.size(), picSize); + if(mShowMarkItem){ + if(mMarkedFiles.contains(data)){ + mFnItem->appendText("<span style=\"color:green\">marked</span>"); + }else{ + mFnItem->appendText("<span style=\"color:red\">not marked</span>"); + } + } mFnItem->setPos(getPos(mFnItem, mConfigInfoPos, mInfoPos)); mScene->addItem(mFnItem); } @@ -468,14 +520,13 @@ PictureViewer2Item::PictureViewer2Item(const PicData &data, const int numSelecte QStringList textList; //prevent QStaticText from wrapping filesnames with spaces //we shouldn't allow this in the first place - textList << data.at(PicFilesModel::FileName).toString().replace(' ', '_'); - textList << QString("%1x%2").arg(QString::number(picSize.width())).arg(QString::number(picSize.height())); + mTextList << data.at(PicFilesModel::FileName).toString().replace(' ', '_'); + mTextList << QString("%1x%2").arg(QString::number(picSize.width())).arg(QString::number(picSize.height())); QLocale l; - textList << QString(QObject::tr("%1 bytes")).arg(l.toString(data.at(PicFilesModel::Size).toInt())); - textList << l.toString(data.at(PicFilesModel::Added).toDate()); - textList << data.at(PicFilesModel::MimeType).toString(); - textList << QString(QObject::tr("%1 files selected")).arg(QString::number(numSelected)); - mText = QStaticText(textList.join("<br/>")); + mTextList << QString(QObject::tr("%1 bytes")).arg(l.toString(data.at(PicFilesModel::Size).toInt())); + mTextList << l.toString(data.at(PicFilesModel::Added).toDate()); + mTextList << data.at(PicFilesModel::MimeType).toString(); + mTextList << QString(QObject::tr("%1 files selected")).arg(QString::number(numSelected)); setZValue(1); } @@ -492,7 +543,8 @@ QRectF PictureViewer2Item::boundingRect() const { if(mDoc){ size = mDoc->size(); }else{ - size = mText.size(); + QStaticText text = QStaticText(mTextList.join("<br/>")); + size = text.size(); size += QSize(10, 10); } QRectF retval; @@ -501,6 +553,10 @@ QRectF PictureViewer2Item::boundingRect() const { return retval; } +void PictureViewer2Item::appendText(const QString &text){ + mTextList << text; +} + void PictureViewer2Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ Q_UNUSED(option); Q_UNUSED(widget); @@ -518,7 +574,8 @@ void PictureViewer2Item::paint(QPainter *painter, const QStyleOptionGraphicsItem if(mDoc){ mDoc->drawContents(painter); }else{ - painter->drawStaticText(5, 5, mText); + QStaticText text = QStaticText(mTextList.join("<br/>")); + painter->drawStaticText(5, 5, text); } painter->restore(); } diff --git a/pictureviewer2.h b/pictureviewer2.h index 622397a..2e879d1 100644 --- a/pictureviewer2.h +++ b/pictureviewer2.h @@ -34,15 +34,18 @@ typedef QList<QList<QVariant> > PicDataList; class PictureViewer2 : public QGraphicsView { Q_OBJECT public: - enum AssocActions { SlideAction, HideAction }; + enum AssocActions { SlideAction, HideAction, MarkAction }; explicit PictureViewer2(QWidget *parent = 0); void addFiles(const PicDataList &files, bool clear = true); void addFiles(const QString &dir, bool clear = true); + void addFiles(const QStringList &files, bool clear = true); void setFile(const PicData &file); void setFile(QString fullPath = mDefaultFile); void setPixmap(const QPixmap &pm); void setShowInfoItem(bool show) { mShowInfoItem = show; } void setShowMappingItem(bool show) { mShowMappingItem = show; } + void setShowMarkItem(bool show) { mShowMarkItem = show; } + const PicDataList marked() { return mMarkedFiles; } PicData picData(const QString &fullPath); virtual QSize sizeHint() const; @@ -58,6 +61,8 @@ class PictureViewer2 : public QGraphicsView { void copyCurrent(); void showNewPicsDialog(); void addToNewPics(); + void markCurrent(); + void clearMarks(); protected: virtual void wheelEvent(QWheelEvent *event); @@ -79,6 +84,7 @@ class PictureViewer2 : public QGraphicsView { QPointF getPos(PictureViewer2Item *item, int pos, const QPointF &movPos); QString constructWindowTitle() const; PicDataList mFiles; + PicDataList mMarkedFiles; QGraphicsScene *mScene; QSize mSize; QGraphicsPixmapItem *mCur; @@ -95,12 +101,14 @@ class PictureViewer2 : public QGraphicsView { QPointF mMappingPos; QAction *mSlideA; QAction *mHideA; + QAction *mMarkA; MappingTreeModel *mMappingTreeModel; PicFilesModel *mPicFilesModel; PicData mCurPicData; NewPicsDialog *mNewPicsDlg; bool mShowInfoItem; bool mShowMappingItem; + bool mShowMarkItem; }; class PictureViewer2Item : public QGraphicsItem { @@ -109,10 +117,11 @@ class PictureViewer2Item : public QGraphicsItem { explicit PictureViewer2Item(QTextDocument *doc, QGraphicsItem *parent = 0); ~PictureViewer2Item(); QRectF boundingRect() const; + void appendText(const QString &text); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private: - QStaticText mText; + QStringList mTextList; QTextDocument *mDoc; }; @@ -518,6 +518,18 @@ void SheMov::createActions(){ mPVSelectAllA = new QAction(QIcon(":/blue_syringe.png"), tr("Select all pics"), this); picViewer->addAction(mPVSelectAllA); + // PictureViewer mark Action + picViewer->addAction(createSeparator()); + mPVMarkA = new QAction(QIcon(":/higheels.png"), tr("(Un-)Mark"), this); + mPVMarkA->setCheckable(true); + mPVMarkA->setData(PictureViewer2::MarkAction); + connect(mPVMarkA, SIGNAL(triggered()), picViewer, SLOT(markCurrent())); + picViewer->addAction(mPVMarkA); + mPVClearMarksA = new QAction(tr("Clear marks"), this); + connect(mPVClearMarksA, SIGNAL(triggered()), picViewer, SLOT(clearMarks())); + picViewer->addAction(mPVClearMarksA); + picViewer->addAction(createSeparator()); + // Slide mPVSlideA = new QAction(QIcon(":/chastity_belt_with_cuffs.png"), tr("Slide"), this); mPVSlideA->setCheckable(true); @@ -122,6 +122,8 @@ class SheMov : public QMainWindow { QAction *mPWRefreshA; QAction *mPVToggleA; QAction *mPVAddA; + QAction *mPVMarkA; + QAction *mPVClearMarksA; QAction *mPVReplaceA; QAction *mPVSelectAllA; QAction *mPVSlideA; |