diff options
Diffstat (limited to 'qt-ui')
-rw-r--r-- | qt-ui/mainwindow.cpp | 6 | ||||
-rw-r--r-- | qt-ui/starwidget.cpp | 102 | ||||
-rw-r--r-- | qt-ui/starwidget.h | 42 |
3 files changed, 150 insertions, 0 deletions
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 46ce076d4..bb4bda1af 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -13,6 +13,7 @@ #include <QDateTime> #include "divelistview.h" +#include "starwidget.h" #include "glib.h" #include "../dive.h" @@ -25,6 +26,11 @@ MainWindow::MainWindow() : ui(new Ui::MainWindow()), { ui->setupUi(this); ui->ListWidget->setModel(model); + // Just to test the star widgets, can be safely removed. + StarWidget *star = new StarWidget(0); + star->setMaximumStars(10); + star->setCurrentStars(3); + star->show(); } void MainWindow::on_actionNew_triggered() diff --git a/qt-ui/starwidget.cpp b/qt-ui/starwidget.cpp new file mode 100644 index 000000000..457946feb --- /dev/null +++ b/qt-ui/starwidget.cpp @@ -0,0 +1,102 @@ +#include "starwidget.h" +#include <QSvgRenderer> +#include <QPainter> +#include <QPaintEvent> +#include <QDebug> +#include <QMouseEvent> + +int StarWidget::currentStars() const +{ + return current; +} + +void StarWidget::enableHalfStars(bool enabled) +{ + halfStar = enabled; + update(); +} + +bool StarWidget::halfStarsEnabled() const +{ + return halfStar; +} + +int StarWidget::maxStars() const +{ + return stars; +} + +void StarWidget::mouseReleaseEvent(QMouseEvent* event) +{ + int starClicked = event->pos().x() / IMG_SIZE + 1; + if (starClicked > stars) + starClicked = stars; + + if (current == starClicked) + current -= 1; + else + current = starClicked; + + update(); +} + +void StarWidget::paintEvent(QPaintEvent* event) +{ + QPainter p(this); + + for(int i = 0; i < current; i++) + p.drawPixmap(i * IMG_SIZE + SPACING, 0, activeStar); + + for(int i = current; i < stars; i++) + p.drawPixmap(i * IMG_SIZE + SPACING, 0, inactiveStar); +} + +void StarWidget::setCurrentStars(int value) +{ + current = value; + update(); + Q_EMIT valueChanged(current); +} + +void StarWidget::setMaximumStars(int maximum) +{ + stars = maximum; + update(); +} + +StarWidget::StarWidget(QWidget* parent, Qt::WindowFlags f): + QWidget(parent, f), + stars(5), + current(0), + halfStar(false) +{ + QSvgRenderer render(QString("star.svg")); + QPixmap renderedStar(IMG_SIZE, IMG_SIZE); + + renderedStar.fill(Qt::transparent); + QPainter painter(&renderedStar); + + render.render(&painter, QRectF(0, 0, IMG_SIZE, IMG_SIZE)); + activeStar = renderedStar; + inactiveStar = grayImage(&renderedStar); +} + +QPixmap StarWidget::grayImage(QPixmap* coloredImg) +{ + QImage img = coloredImg->toImage(); + for (int i = 0; i < img.width(); ++i) { + for (int j = 0; j < img.height(); ++j) { + QRgb col = img.pixel(i, j); + if (!col) + continue; + int gray = QColor(Qt::darkGray).rgb(); + img.setPixel(i, j, qRgb(gray, gray, gray)); + } + } + return QPixmap::fromImage(img); +} + +QSize StarWidget::sizeHint() const +{ + return QSize(IMG_SIZE * stars + SPACING * (stars-1), IMG_SIZE); +} diff --git a/qt-ui/starwidget.h b/qt-ui/starwidget.h new file mode 100644 index 000000000..cdbb3ab5c --- /dev/null +++ b/qt-ui/starwidget.h @@ -0,0 +1,42 @@ +#ifndef STARWIDGET_H +#define STARWIDGET_H + +#include <QWidget> + + +class StarWidget : public QWidget +{ + Q_OBJECT +public: + explicit StarWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); + + int maxStars() const; + int currentStars() const; + bool halfStarsEnabled() const; + + /*reimp*/ QSize sizeHint() const; + + enum {SPACING = 2, IMG_SIZE = 16}; + +Q_SIGNALS: + void valueChanged(int stars); + +public Q_SLOTS: + void setCurrentStars(int value); + void setMaximumStars(int maximum); + void enableHalfStars(bool enabled); + +protected: + /*reimp*/ void mouseReleaseEvent(QMouseEvent* ); + /*reimp*/ void paintEvent(QPaintEvent* ); + +private: + int stars; + int current; + bool halfStar; + QPixmap activeStar; + QPixmap inactiveStar; + QPixmap grayImage(QPixmap *coloredImg); +}; + +#endif // STARWIDGET_H |