You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digikam/digikam/digikam/ratingfilter.cpp

206 lines
5.4 KiB

/* ============================================================
*
* 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 <caulier dot gilles at gmail dot com>
* Copyright (C) 2007 by Arnd Baecker <arnd dot baecker at web dot de>
*
* 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 <tqpainter.h>
#include <tqpalette.h>
#include <tqpixmap.h>
#include <tqcursor.h>
#include <tqwhatsthis.h>
// KDE includes.
#include <kiconloader.h>
#include <tdelocale.h>
#include <tdeglobal.h>
#include <kstandarddirs.h>
#include <tdepopupmenu.h>
// 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, TQT_SIGNAL(signalRatingChanged(int)),
this, TQT_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