summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--picfilesmodel.cpp41
-rw-r--r--picfilesmodel.h4
-rw-r--r--pictureviewer2.cpp66
-rw-r--r--pictureviewer2.h17
-rw-r--r--shemov.cpp2
5 files changed, 125 insertions, 5 deletions
diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp
index 482af09..11d8f43 100644
--- a/picfilesmodel.cpp
+++ b/picfilesmodel.cpp
@@ -301,6 +301,47 @@ QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{
return retval;
}
+void PicFilesModel::selectFromAll(){
+ mAllPics.clear();
+ QSqlQuery q("SELECT tfilename, cmd5sum, ipicsid FROM pics", mDb);
+ while(q.next()){
+ QList<QVariant> cur;
+ cur << q.value(0) << q.value(1) << q.value(2);
+ mAllPics << cur;
+ }
+ mCurrentPics = &mAllPics;
+}
+
+void PicFilesModel::selectFromRecent(int days){
+ mAllPics.clear();
+ QString qTempl = QString("SELECT tfilename, cmd5sum, ipicsid FROM pics WHERE dtadded > now() - interval '%1 days'").arg(QString::number(days));
+ QSqlQuery q(qTempl, mDb);
+ while(q.next()){
+ QList<QVariant> cur;
+ cur << q.value(0) << q.value(1) << q.value(2);
+ mAllPics << cur;
+ }
+ mCurrentPics = &mAllPics;
+}
+
+void PicFilesModel::selectFromSelection(QList<QVariant> ids){
+ mAllPics.clear();
+ QStringList idQS;
+ foreach (QVariant i, ids){
+ idQS << QString::number(i.toInt());
+ }
+ QString inPart = idQS.join(',');
+ QString qTempl = QString("SELECT tfilename, cmd5sum, ipicsid FROM pics, pics_mappings WHERE pics_mappings.imappings_parents_id IN (%1) AND pics_mappings.ipics_id = pics.ipicsid").arg(inPart);
+ QSqlQuery q(qTempl, mDb);
+ while(q.next()){
+ QList<QVariant> cur;
+ cur << q.value(0) << q.value(1) << q.value(2);
+ mAllPics << cur;
+ }
+ mCurrentPics = &mAllPics;
+}
+
+// delete this func once the one above works
void PicFilesModel::allPicIds(){
mAllPics.clear();
mCurrentBatch = 0;
diff --git a/picfilesmodel.h b/picfilesmodel.h
index 8af7bda..6e68a74 100644
--- a/picfilesmodel.h
+++ b/picfilesmodel.h
@@ -33,9 +33,13 @@ class PicFilesModel : public SmTreeModel {
SmTreeItem *mappingTreeFromFile(int fileId) const;
SmTreeItem *findRecursive(SmTreeItem *start, const QVariant &name, const QVariant id) const;
QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const;
+ void selectFromAll();
+ void selectFromRecent(int days);
+ void selectFromSelection(QList<QVariant> ids);
void allPicIds();
void recentPicIds();
QList<QList<QVariant> > getNextBatch();
+ QList<QList<QVariant> > allPics() const { return mAllPics; }
public slots:
void populate();
diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp
index ead82ea..d95602a 100644
--- a/pictureviewer2.cpp
+++ b/pictureviewer2.cpp
@@ -32,16 +32,17 @@
#include <QFile>
#include <QTemporaryFile>
#include <QMessageBox>
-#include <QCheckBox>
#include <QRadioButton>
#include <QGroupBox>
-#include <QSpinBox>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QGridLayout>
+#include <random>
+#include <chrono>
+
#include "pictureviewer2.h"
#include "picfilesmodel.h"
#include "pictureswidget.h"
@@ -59,6 +60,8 @@ PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0)
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setWindowState(Qt::WindowMaximized);
+ mSlideDlg = new PictureViewerSlideDlg(this);
+ connect(mSlideDlg, SIGNAL(accepted()), this, SLOT(doSlide()));
//initial file list
PicData initialData;
@@ -69,11 +72,13 @@ PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0)
mFiles << initialData;
//picture show
+ mTimer = new QTimer(this);
mSlideTimer = new QTimer(this);
mSlideTimerAll = new QTimer(this);
mSlideTimerRecent = new QTimer(this);
mCurTimer = mSlideTimer;
mSlideTimerAllRestart = true;
+ connect(mTimer, SIGNAL(timeout()), this, SLOT(nextSlide()));
connect(mSlideTimer, SIGNAL(timeout()), this, SLOT(next()));
connect(mSlideTimerAll, SIGNAL(timeout()), this, SLOT(nextFromAll()));
connect(mSlideTimerRecent, SIGNAL(timeout()), this, SLOT(nextFromRecent()));
@@ -493,9 +498,42 @@ void PictureViewer2::doControl(QGraphicsItem *item){
}
}
+void PictureViewer2::showSlide(){
+ mSlideTimer->stop();
+ mSlideDlg->show();
+}
+
void PictureViewer2::doSlide(){
- PictureViewerSlideDlg dlg(this);
- dlg.exec();
+ int result = mSlideDlg->result();
+ if(result == PictureViewerSlideDlg::NoSlide){
+ mTimer->stop();
+ return;
+ }
+ mNextSlideCtr = 0;
+ if(result == PictureViewerSlideDlg::SlideAll){
+ mPicFilesModel->selectFromAll();
+ }else if (result == PictureViewerSlideDlg::SlideRecent){
+ int days = mSlideDlg->days();
+ mPicFilesModel->selectFromRecent(days);
+ }else if (result == PictureViewerSlideDlg::SlideSelection){
+ MappingEditWidget *editWidget = mSlideDlg->mappingEditWidget();
+ QList<QVariant> mappingParentsIds = editWidget->model()->getMappings(editWidget->model()->root());
+ mPicFilesModel->selectFromSelection(mappingParentsIds);
+ }
+ mPicData = mPicFilesModel->allPics();
+ if(mSlideDlg->shuffle()){
+ unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
+ std::shuffle(mPicData.begin(), mPicData.end(), std::default_random_engine(seed));
+ }
+ auto picDataOld = mPicData;
+ mPicData.clear();
+ foreach(auto pd, picDataOld){
+ QList<QVariant> tmp;
+ tmp << Helper::createArchivePath(pd.value(0).toString(), pd.value(1).toString()) << pd.value(2);
+ mPicData << tmp;
+ }
+ mTotal = mPicData.count();
+ mTimer->start(5000);
}
void PictureViewer2::wheelEvent(QWheelEvent *event){
@@ -589,6 +627,26 @@ void PictureViewer2::resizeEvent(QResizeEvent *event){
showFile(mCurPicData);
}
+void PictureViewer2::nextSlide(){
+ if(mPicData.isEmpty()){
+ return;
+ }
+ if(mNextSlideCtr < mPicData.count()){
+ QString fullPath = mPicData.at(mNextSlideCtr).at(0).toString();
+ int fId = mPicData.at(mNextSlideCtr).at(1).toInt();
+ PicData pd = picData(fullPath, fId);
+ setFile(pd);
+ ++mNextSlideCtr;
+ }else{
+ mNextSlideCtr = 0;
+ QString fullPath = mPicData.at(mNextSlideCtr).at(0).toString();
+ int fId = mPicData.at(mNextSlideCtr).at(1).toInt();
+ PicData pd = picData(fullPath, fId);
+ setFile(pd);
+ ++mNextSlideCtr;
+ }
+}
+
void PictureViewer2::showFile(const PicData &file){
if(file.isEmpty()){
return;
diff --git a/pictureviewer2.h b/pictureviewer2.h
index 730296f..f8e7a06 100644
--- a/pictureviewer2.h
+++ b/pictureviewer2.h
@@ -14,6 +14,8 @@
#include <QGraphicsItem>
#include <QStaticText>
#include <QDialog>
+#include <QSpinBox>
+#include <QCheckBox>
class PictureViewerGraphicsScene;
class BoundingRectItem;
@@ -36,6 +38,7 @@ class QLabel;
class QPushButton;
class QSpinBox;
class MappingEditWidget;
+class PictureViewerSlideDlg;
typedef QList<QVariant> PicData;
typedef QList<QList<QVariant> > PicDataList;
@@ -83,6 +86,7 @@ class PictureViewer2 : public QGraphicsView {
void markCurrent();
void clearMarks();
void doControl(QGraphicsItem *item);
+ void showSlide();
void doSlide();
protected:
@@ -94,6 +98,7 @@ class PictureViewer2 : public QGraphicsView {
virtual void resizeEvent(QResizeEvent *event);
private slots:
+ void nextSlide();
void showFile(const PicData &data);
void constructInfoItem(const PicData &file, QSize picSize, bool converted = false);
void constructMappingItem(const PicData &file);
@@ -104,6 +109,7 @@ class PictureViewer2 : public QGraphicsView {
private:
void constructControlItem();
void setGradient(const QPixmap &pic);
+ void showNext();
void setNextBatch();
QTextDocument *treeToString(const SmTreeItem *root) const;
void treeToStringRecursive(const SmTreeItem *parent, QTextCursor *cursor, int indent) const;
@@ -113,10 +119,17 @@ class PictureViewer2 : public QGraphicsView {
PicDataList mMarkedFiles;
PictureViewerGraphicsScene *mScene;
QGraphicsPixmapItem *mCur;
+ PictureViewerSlideDlg *mSlideDlg;
+ QList<QList<QVariant> > mPicData;
+ //QStringList mFullPaths;
+ int mTotal;
+ int mNextSlideCtr;
+
int mCurPos;
int mConfigInfoPos;
int mConfigMapPos;
int mCursorOffset;
+ QTimer *mTimer;
QTimer *mSlideTimer;
QTimer *mSlideTimerAll;
QTimer *mSlideTimerRecent;
@@ -162,6 +175,10 @@ class PictureViewerSlideDlg : public QDialog {
public:
enum SlideResult { SlideAll, SlideRecent, SlideSelection, NoSlide };
explicit PictureViewerSlideDlg(QWidget *parent = 0, Qt::WindowFlags f = 0);
+ int result() const { return mSlideResult; }
+ int days() const { return mRecentDays->value(); }
+ bool shuffle() const { return mShuffle->isChecked(); }
+ MappingEditWidget *mappingEditWidget() const { return mMappingEditWidget; }
private slots:
void slideAllToggled(bool checked);
diff --git a/shemov.cpp b/shemov.cpp
index eaa85c7..0aa87fd 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -516,7 +516,7 @@ void SheMov::createActions(){
mPVSlideDlgA = new QAction(QIcon(":/hourglass_figure.png"), tr("Show slide dialog..."), this);
mPVSlideDlgA->setData(PictureViewer2::SlideAction);
mPicWidget->picView()->addAction(mPVSlideDlgA);
- connect(mPVSlideDlgA, SIGNAL(triggered()), picViewer, SLOT(doSlide()));
+ connect(mPVSlideDlgA, SIGNAL(triggered()), picViewer, SLOT(showSlide()));
mPicWidget->picView()->addAction(createSeparator());
// Show/Hide Picture Viewer