/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2007-10-09 * Description : a widget to filter album contents by rating * * Copyright (C) 2007 by Gilles Caulier * Copyright (C) 2007 by Arnd Baecker * * 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 #include #include // KDE includes. #include #include #include #include #include // Local includes. #include "constants.h" #include "ddebug.h" #include "dcursortracker.h" #include "themeengine.h" #include "ratingfilter.h" #include "ratingfilter.moc" namespace Digikam { class RatingFilterPriv { public: RatingFilterPriv() { dirty = false; ratingTracker = 0; filterCond = AlbumLister::GreaterEqualCondition; } bool dirty; DTipTracker *ratingTracker; AlbumLister::RatingCondition filterCond; }; RatingFilter::RatingFilter(TQWidget* parent) : RatingWidget(parent) { d = new RatingFilterPriv; d->ratingTracker = new DTipTracker("", this); updateRatingTooltip(); setMouseTracking(true); TQWhatsThis::add(this, i18n("Select the rating value used to filter " "albums contents. Use contextual pop-up menu to " "set rating filter condition.")); // To dispatch signal from parent widget with filter condition. connect(this, TQ_SIGNAL(signalRatingChanged(int)), this, TQ_SLOT(slotRatingChanged())); } RatingFilter::~RatingFilter() { delete d->ratingTracker; delete d; } void RatingFilter::slotRatingChanged() { emit signalRatingFilterChanged(rating(), d->filterCond); } void RatingFilter::setRatingFilterCondition(AlbumLister::RatingCondition cond) { d->filterCond = cond; updateRatingTooltip(); slotRatingChanged(); } AlbumLister::RatingCondition RatingFilter::ratingFilterCondition() { return d->filterCond; } void RatingFilter::mouseMoveEvent(TQMouseEvent* e) { // This method have been re-implemented to display and update the famous TipTracker contents. if ( d->dirty ) { int pos = e->x() / regPixmapWidth() +1; if (rating() != pos) setRating(pos); updateRatingTooltip(); } } void RatingFilter::mousePressEvent(TQMouseEvent* e) { // This method must be re-implemented to handle witch mousse button is pressed // and show the rating filter settings pop-up menu with right mouse button. // NOTE: Left and Middle Mouse buttons continue to change rating filter value. d->dirty = false; if ( e->button() == TQt::LeftButton || e->button() == TQt::MidButton ) { d->dirty = true; int pos = e->x() / regPixmapWidth() +1; if (rating() == pos) setRating(rating()-1); else setRating(pos); updateRatingTooltip(); } else if (e->button() == TQt::RightButton) { // Show pop-up menu about Rating Filter condition settings TDEPopupMenu popmenu(this); popmenu.insertTitle(SmallIcon("digikam"), i18n("Rating Filter")); popmenu.setCheckable(true); popmenu.insertItem(i18n("Greater Equal Condition"), AlbumLister::GreaterEqualCondition); popmenu.insertItem(i18n("Equal Condition"), AlbumLister::EqualCondition); popmenu.insertItem(i18n("Less Equal Condition"), AlbumLister::LessEqualCondition); popmenu.setItemChecked(d->filterCond, true); int choice = popmenu.exec((TQCursor::pos())); switch(choice) { case AlbumLister::GreaterEqualCondition: case AlbumLister::EqualCondition: case AlbumLister::LessEqualCondition: { setRatingFilterCondition((AlbumLister::RatingCondition)choice); break; } default: break; } } } void RatingFilter::mouseReleaseEvent(TQMouseEvent*) { d->dirty = false; } void RatingFilter::updateRatingTooltip() { // Adapt tip message with rating filter condition settings. switch(d->filterCond) { case AlbumLister::GreaterEqualCondition: { d->ratingTracker->setText(i18n("Rating >= %1").arg(rating())); break; } case AlbumLister::EqualCondition: { d->ratingTracker->setText(i18n("Rating = %1").arg(rating())); break; } case AlbumLister::LessEqualCondition: { d->ratingTracker->setText(i18n("Rating <= %1").arg(rating())); break; } default: break; } } } // namespace Digikam