diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | qt-models/divepicturemodel.cpp | 9 | ||||
-rw-r--r-- | qt-models/divepicturemodel.h | 14 | ||||
-rw-r--r-- | qt-models/divesitepicturesmodel.cpp | 45 | ||||
-rw-r--r-- | qt-models/divesitepicturesmodel.h | 15 | ||||
-rw-r--r-- | qt-ui/groupedlineedit.cpp | 7 | ||||
-rw-r--r-- | qt-ui/locationInformation.ui | 2 | ||||
-rw-r--r-- | qt-ui/locationinformation.h | 2 | ||||
-rw-r--r-- | qt-ui/starwidget.cpp | 33 |
9 files changed, 104 insertions, 24 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b7f783b9..9498cab5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,6 +364,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS qt-models/divepicturemodel.cpp qt-models/diveplotdatamodel.cpp qt-models/divelocationmodel.cpp + qt-models/divesitepicturesmodel.cpp ) source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp index 9e60404ed..06051dd28 100644 --- a/qt-models/divepicturemodel.cpp +++ b/qt-models/divepicturemodel.cpp @@ -5,12 +5,7 @@ #include <QtConcurrent> -typedef QList<struct picture *> SPictureList; -typedef struct picture *picturepointer; -typedef QPair<picturepointer, QImage> SPixmap; - - -static SPixmap scaleImages(picturepointer picture) +SPixmap scaleImages(picturepointer picture) { static QHash <QString, QImage > cache; SPixmap ret; @@ -126,4 +121,4 @@ void DivePictureModel::removePicture(const QString &fileUrl) int DivePictureModel::rowCount(const QModelIndex &parent) const { return numberOfPictures; -}
\ No newline at end of file +} diff --git a/qt-models/divepicturemodel.h b/qt-models/divepicturemodel.h index edcddd7a2..d6393e45f 100644 --- a/qt-models/divepicturemodel.h +++ b/qt-models/divepicturemodel.h @@ -12,12 +12,18 @@ public: SHashedImage(struct picture *picture); }; - struct PhotoHelper { QImage image; int offsetSeconds; }; +typedef QList<struct picture *> SPictureList; +typedef struct picture *picturepointer; +typedef QPair<picturepointer, QImage> SPixmap; + +// function that will scale the pixmap, used inside the QtConcurrent thread. +SPixmap scaleImages(picturepointer picture); + class DivePictureModel : public QAbstractTableModel { Q_OBJECT public: @@ -25,11 +31,11 @@ public: virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; - void updateDivePictures(); + virtual void updateDivePictures(); void updateDivePicturesWhenDone(QList<QFuture<void> >); void removePicture(const QString& fileUrl); -private: +protected: DivePictureModel(); int numberOfPictures; // Currently, load the images on the fly @@ -38,4 +44,4 @@ private: QHash<QString, PhotoHelper> stringPixmapCache; }; -#endif
\ No newline at end of file +#endif diff --git a/qt-models/divesitepicturesmodel.cpp b/qt-models/divesitepicturesmodel.cpp new file mode 100644 index 000000000..3777f1d36 --- /dev/null +++ b/qt-models/divesitepicturesmodel.cpp @@ -0,0 +1,45 @@ +#include "divesitepicturesmodel.h" +#include "dive.h" +#include "stdint.h" + +#include <QtConcurrent> +#include <QPixmap> + +DiveSitePicturesModel* DiveSitePicturesModel::instance() { + static DiveSitePicturesModel *self = new DiveSitePicturesModel(); + return self; +} + +DiveSitePicturesModel::DiveSitePicturesModel() { + +} + +void DiveSitePicturesModel::updateDivePictures() { + beginResetModel(); + numberOfPictures = 0; + endResetModel(); + + const uint32_t ds_uuid = displayed_dive_site.uuid; + struct dive *d; + int i; + + stringPixmapCache.clear(); + SPictureList pictures; + + for_each_dive (i, d) { + if (d->dive_site_uuid == ds_uuid && dive_get_picture_count(d)) { + FOR_EACH_PICTURE(d) { + stringPixmapCache[QString(picture->filename)].offsetSeconds = picture->offset.seconds; + pictures.push_back(picture); + } + } + } + + QList<SPixmap> list = QtConcurrent::blockingMapped(pictures, scaleImages); + Q_FOREACH (const SPixmap &pixmap, list) + stringPixmapCache[pixmap.first->filename].image = pixmap.second; + + numberOfPictures = list.count(); + beginInsertRows(QModelIndex(), 0, numberOfPictures - 1); + endInsertRows(); +} diff --git a/qt-models/divesitepicturesmodel.h b/qt-models/divesitepicturesmodel.h new file mode 100644 index 000000000..f19f57cc2 --- /dev/null +++ b/qt-models/divesitepicturesmodel.h @@ -0,0 +1,15 @@ +#ifndef DIVESITEPICTURESMODEL_H +#define DIVESITEPICTURESMODEL_H + +#include "divepicturemodel.h" + +class DiveSitePicturesModel : public DivePictureModel { + Q_OBJECT +public: + static DiveSitePicturesModel *instance(); + void updateDivePictures(); +private: + DiveSitePicturesModel(); +}; + +#endif diff --git a/qt-ui/groupedlineedit.cpp b/qt-ui/groupedlineedit.cpp index ed2428fd7..9ce5e175c 100644 --- a/qt-ui/groupedlineedit.cpp +++ b/qt-ui/groupedlineedit.cpp @@ -31,6 +31,10 @@ #include <QScrollBar> #include <QTextBlock> #include <QPainter> +#include <QApplication> +#include <QStyle> +#include <QStyleOptionFocusRect> +#include <QDebug> struct GroupedLineEdit::Private { struct Block { @@ -159,9 +163,6 @@ void GroupedLineEdit::keyPressEvent(QKeyEvent *e) void GroupedLineEdit::paintEvent(QPaintEvent *e) { - // for reasons we don't understand, touching the painter - // here (even drawing the fill rect) causes the QPlainTextEdit - // paintEvent to not draw the text on Qt4 & MacOS. QTextLine line = document()->findBlock(0).layout()->lineAt(0); QPainter painter(viewport()); diff --git a/qt-ui/locationInformation.ui b/qt-ui/locationInformation.ui index cb9ddb829..ad33b2a90 100644 --- a/qt-ui/locationInformation.ui +++ b/qt-ui/locationInformation.ui @@ -14,7 +14,7 @@ <string>GroupBox</string> </property> <property name="title"> - <string>Dive Site</string> + <string/> </property> <layout class="QGridLayout" name="gridLayout"> <property name="horizontalSpacing"> diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h index 09814e9c0..0a2f66262 100644 --- a/qt-ui/locationinformation.h +++ b/qt-ui/locationinformation.h @@ -51,6 +51,6 @@ signals: void setLineEditText(const QString& text); private: uint32_t last_uuid; - }; + #endif diff --git a/qt-ui/starwidget.cpp b/qt-ui/starwidget.cpp index 508d9a746..d959ed3b9 100644 --- a/qt-ui/starwidget.cpp +++ b/qt-ui/starwidget.cpp @@ -17,6 +17,25 @@ const QImage& StarWidget::starInactive() return inactiveStar; } +QImage focusedImage(const QImage& coloredImg) +{ + QImage img = coloredImg; + for (int i = 0; i < img.width(); ++i) { + for (int j = 0; j < img.height(); ++j) { + QRgb rgb = img.pixel(i, j); + if (!rgb) + continue; + + QColor c(rgb); + c = c.dark(); + img.setPixel(i, j, c.rgb()); + } + } + + return img; +} + + int StarWidget::currentStars() const { return current; @@ -44,13 +63,14 @@ void StarWidget::mouseReleaseEvent(QMouseEvent *event) void StarWidget::paintEvent(QPaintEvent *event) { QPainter p(this); - QPixmap active = QPixmap::fromImage(starActive()); + QImage star = hasFocus() ? focusedImage(starActive()) : starActive(); + QPixmap selected = QPixmap::fromImage(star); QPixmap inactive = QPixmap::fromImage(starInactive()); - const IconMetrics& metrics = defaultIconMetrics(); + for (int i = 0; i < current; i++) - p.drawPixmap(i * metrics.sz_small + metrics.spacing, 0, active); + p.drawPixmap(i * metrics.sz_small + metrics.spacing, 0, selected); for (int i = current; i < TOTALSTARS; i++) p.drawPixmap(i * metrics.sz_small + metrics.spacing, 0, inactive); @@ -132,16 +152,13 @@ void StarWidget::focusOutEvent(QFocusEvent *event) QWidget::focusOutEvent(event); } - void StarWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Right) { - if (currentStars() < TOTALSTARS) { + if (currentStars() < TOTALSTARS) setCurrentStars(currentStars() + 1); - } } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Left) { - if (currentStars() > 0) { + if (currentStars() > 0) setCurrentStars(currentStars() - 1); - } } } |