/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2005-08-15 * Description : a widget to draw stars rating * * Copyright (C) 2005 by Owen Hirst * Copyright (C) 2006-2007 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // TQt includes. #include #include #include // KDE includes. #include #include // Local includes. #include "constants.h" #include "themeengine.h" #include "ratingwidget.h" #include "ratingwidget.moc" namespace Digikam { class RatingWidgetPriv { public: RatingWidgetPriv() { rating = 0; } int rating; TQString ratingPixPath; TQPixmap disPixmap; TQPixmap selPixmap; TQPixmap regPixmap; }; RatingWidget::RatingWidget(TQWidget* parent) : TQWidget(parent) { d = new RatingWidgetPriv; TDEGlobal::dirs()->addResourceType("digikam_rating", TDEGlobal::dirs()->kde_default("data") + "digikam/data"); d->ratingPixPath = TDEGlobal::dirs()->findResourceDir("digikam_rating", "rating.png"); d->ratingPixPath.append("/rating.png"); slotThemeChanged(); connect(ThemeEngine::instance(), TQ_SIGNAL(signalThemeChanged()), this, TQ_SLOT(slotThemeChanged())); } RatingWidget::~RatingWidget() { delete d; } void RatingWidget::setRating(int val) { if (val < RatingMin || val > RatingMax) return; d->rating = val; emit signalRatingChanged(d->rating); update(); } int RatingWidget::rating() const { return d->rating; } int RatingWidget::regPixmapWidth() const { return d->regPixmap.width(); } void RatingWidget::mouseMoveEvent(TQMouseEvent* e) { int pos = e->x() / d->regPixmap.width() +1; if (d->rating != pos) { if (pos > RatingMax) // B.K.O.: # 151357 pos = RatingMax; if (pos < RatingMin) pos = RatingMin; d->rating = pos; emit signalRatingChanged(d->rating); update(); } } void RatingWidget::mousePressEvent(TQMouseEvent* e) { int pos = e->x() / d->regPixmap.width() +1; if (d->rating == pos) { d->rating--; } else { d->rating = pos; } emit signalRatingChanged(d->rating); update(); } void RatingWidget::paintEvent(TQPaintEvent*) { TQPainter p(this); int x = 0; // Widget is disable : drawing grayed frame. if (!isEnabled()) { for (int i=0; idisPixmap); x += d->disPixmap.width(); } } else { for (int i=0; irating; i++) { p.drawPixmap(x, 0, d->selPixmap); x += d->selPixmap.width(); } for (int i=d->rating; iregPixmap); x += d->regPixmap.width(); } } p.end(); } void RatingWidget::slotThemeChanged() { d->regPixmap = TQPixmap(d->ratingPixPath); d->selPixmap = d->regPixmap; d->disPixmap = d->regPixmap; TQPainter painter(&d->regPixmap); painter.fillRect(0, 0, d->regPixmap.width(), d->regPixmap.height(), colorGroup().dark()); painter.end(); TQPainter painter2(&d->selPixmap); painter2.fillRect(0, 0, d->selPixmap.width(), d->selPixmap.height(), ThemeEngine::instance()->textSpecialRegColor()); painter2.end(); TQPainter painter3(&d->disPixmap); painter3.fillRect(0, 0, d->disPixmap.width(), d->disPixmap.height(), palette().disabled().foreground()); painter3.end(); setFixedSize(TQSize(d->regPixmap.width()*5, d->regPixmap.height())); update(); } } // namespace Digikam