File indexing completed on 2024-04-28 04:21:22

0001 // SPDX-FileCopyrightText: 2019-2022 The KPhotoAlbum Development Team
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include "FilterWidget.h"
0006 
0007 #include <KActionCollection>
0008 #include <KLocalizedString>
0009 #include <KRatingWidget>
0010 #include <QLabel>
0011 
0012 ThumbnailView::FilterWidget::FilterWidget(QWidget *parent)
0013     : KToolBar(parent)
0014 {
0015     setWindowTitle(i18nc("Name/title of the filter toolbar widget", "Filter Toolbar"));
0016     setWindowIcon(QIcon::fromTheme(QLatin1String("view-filter")));
0017 
0018     m_actions = new KActionCollection(this);
0019     m_toggleFilter = addAction(
0020         QIcon::fromTheme(QLatin1String("view-filter")),
0021         i18nc("The action enables/disables filtering of images in the thumbnail view.", "Toggle filter"));
0022     m_toggleFilter->setCheckable(true);
0023     m_toggleFilter->setToolTip(xi18n("Press <shortcut>Escape</shortcut> to clear filter."));
0024     connect(m_toggleFilter, &QAction::toggled, this, &FilterWidget::filterToggled);
0025     m_actions->addAction(QString::fromLatin1("FilterWidget/toggle"), m_toggleFilter);
0026 
0027     m_rating = new KRatingWidget;
0028     addWidget(m_rating);
0029     for (short i = 1; i <= 5; i++) {
0030         QAction *ratingAction = new QAction(i18np("Filter view by rating: %1 star", "Filter view by rating: %1 stars", i));
0031         m_actions->addAction(QString::fromLatin1("FilterWidget/rating/%1").arg(i), ratingAction);
0032         m_actions->setDefaultShortcut(ratingAction, Qt::ALT + (Qt::Key_0 + i));
0033         connect(ratingAction, &QAction::triggered, this, [=]() {
0034             short rating = i * 2;
0035             if (static_cast<short>(m_rating->rating()) == rating)
0036                 rating = -1;
0037             Q_EMIT ratingChanged(rating);
0038         });
0039         m_rating->addAction(ratingAction);
0040     }
0041     m_actions->readSettings();
0042 
0043     m_label = new QLabel;
0044     resetLabelText();
0045     addWidget(m_label);
0046 
0047     connect(m_rating, QOverload<int>::of(&KRatingWidget::ratingChanged), this, &FilterWidget::slotRatingChanged);
0048 }
0049 
0050 void ThumbnailView::FilterWidget::setFilter(const DB::ImageSearchInfo &filter)
0051 {
0052     // prevent ratingChanged signal when the filter has changed
0053     blockSignals(true);
0054     m_rating->setRating(qMax(static_cast<short int>(0), filter.rating()));
0055     if (filter.isNull()) {
0056         m_toggleFilter->setChecked(false);
0057         resetLabelText();
0058     } else {
0059         m_toggleFilter->setChecked(true);
0060         m_label->setText(i18nc("The label gives a textual description of the active filter", "Filter: %1", filter.toString()));
0061     }
0062     blockSignals(false);
0063 }
0064 
0065 void ThumbnailView::FilterWidget::setEnabled(bool enabled)
0066 {
0067     m_toggleFilter->setEnabled(enabled);
0068     m_rating->setEnabled(enabled);
0069     if (enabled)
0070         resetLabelText();
0071     else
0072         m_label->clear();
0073 }
0074 
0075 void ThumbnailView::FilterWidget::slotRatingChanged(int rating)
0076 {
0077     Q_ASSERT(-1 <= rating && rating <= 10);
0078     Q_EMIT ratingChanged((short)rating);
0079 }
0080 
0081 void ThumbnailView::FilterWidget::resetLabelText()
0082 {
0083     m_label->setText(xi18n("Tip: Use <shortcut>Alt+Shift+<placeholder>A-Z</placeholder></shortcut> to toggle a filter for that token."));
0084 }
0085 
0086 KActionCollection *ThumbnailView::FilterWidget::actions() const
0087 {
0088     return m_actions;
0089 }
0090 
0091 #include "moc_FilterWidget.cpp"