From 9ffb707d9d9d478b7538a8cd9ef9ef7c6edae25c Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Mon, 22 Apr 2013 16:00:27 -0700 Subject: Initial version of the Star Picker Widget. A very simple to use widget: StarWidget *stars = new StarWidget( windowParent); stars->setMaximumStars(10); stars->setCurrentStars( rand()%10); stars->show(); connect(stars, SIGNAL(valueChanged(int)), someObj, SLOT(starsChangedValue(int))); It currently uses a 'star.svg' file on the same folder as the binary. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- Makefile | 6 +-- qt-ui/mainwindow.cpp | 6 +++ qt-ui/starwidget.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ qt-ui/starwidget.h | 42 +++++++++++++++++++++ resources.qrc | 5 +++ star.svg | 74 +++++++++++++++++++++++++++++++++++++ 6 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 qt-ui/starwidget.cpp create mode 100644 qt-ui/starwidget.h create mode 100644 resources.qrc create mode 100644 star.svg diff --git a/Makefile b/Makefile index 7b7ec0476..076b5f123 100644 --- a/Makefile +++ b/Makefile @@ -104,10 +104,10 @@ LIBUSB = $(shell $(PKGCONFIG) --libs libusb-1.0 2> /dev/null) # Use qmake to find out which Qt version we are building for. QT_VERSION_MAJOR = $(shell $(QMAKE) -query QT_VERSION | cut -d. -f1) ifeq ($(QT_VERSION_MAJOR), 5) - QT_MODULES = Qt5Widgets + QT_MODULES = Qt5Widgets Qt5Svg QT_CORE = Qt5Core else - QT_MODULES = QtGui + QT_MODULES = QtGui QtSvg QT_CORE = QtCore endif @@ -187,7 +187,7 @@ MSGOBJS=$(addprefix share/locale/,$(MSGLANGS:.po=.UTF-8/LC_MESSAGES/subsurface.m QTOBJS = qt-ui/maintab.o qt-ui/mainwindow.o qt-ui/plotareascene.o qt-ui/divelistview.o \ - qt-ui/addcylinderdialog.o qt-ui/models.o + qt-ui/addcylinderdialog.o qt-ui/models.o qt-ui/starwidget.o GTKOBJS = info-gtk.o divelist-gtk.o planner-gtk.o statistics-gtk.o 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 #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 +#include +#include +#include +#include + +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 + + +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 diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 000000000..e257bf8f5 --- /dev/null +++ b/resources.qrc @@ -0,0 +1,5 @@ + + + star.svg + + diff --git a/star.svg b/star.svg new file mode 100644 index 000000000..e4345eb48 --- /dev/null +++ b/star.svg @@ -0,0 +1,74 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + -- cgit v1.2.3-70-g09d2