File indexing completed on 2025-02-16 04:47:58

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2004 Till Adam <adam@kde.org>
0005   SPDX-FileCopyrightText: 2005 Rafal Rzepecki <divide@users.sourceforge.net>
0006   SPDX-FileCopyrightText: 2008 Thomas Thrainer <tom_t@gmx.at>
0007 
0008   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0009 */
0010 
0011 #include "todoviewquicksearch.h"
0012 #include <CalendarSupport/KCalPrefs>
0013 
0014 #include <Akonadi/TagSelectionComboBox>
0015 
0016 #include <Libkdepim/KCheckComboBox>
0017 
0018 #include <CalendarSupport/CategoryHierarchyReader>
0019 
0020 #include <KCalendarCore/CalFilter>
0021 
0022 #include <KLocalizedString>
0023 #include <QLineEdit>
0024 
0025 #include <QHBoxLayout>
0026 
0027 TodoViewQuickSearch::TodoViewQuickSearch(QWidget *parent)
0028     : QWidget(parent)
0029     , mSearchLine(new QLineEdit(this))
0030     , mCategoryCombo(new Akonadi::TagSelectionComboBox(this))
0031     , mPriorityCombo(new KPIM::KCheckComboBox(this))
0032 {
0033     auto layout = new QHBoxLayout(this);
0034     // no special margin because it is added by the view
0035     layout->setContentsMargins(0, 0, 0, 0);
0036 
0037     mSearchLine->setToolTip(i18nc("@info:tooltip", "Filter on matching summaries"));
0038     mSearchLine->setWhatsThis(i18nc("@info:whatsthis", "Enter text here to filter the to-dos that are shown by matching summaries."));
0039     mSearchLine->setPlaceholderText(i18nc("@label in QuickSearchLine", "Search Summaries..."));
0040     mSearchLine->setClearButtonEnabled(true);
0041     connect(mSearchLine, &QLineEdit::textChanged, this, &TodoViewQuickSearch::searchTextChanged);
0042 
0043     layout->addWidget(mSearchLine, 3);
0044 
0045     mCategoryCombo->setCheckable(true);
0046     mCategoryCombo->setToolTip(i18nc("@info:tooltip", "Filter on these tags"));
0047     mCategoryCombo->setWhatsThis(i18nc("@info:whatsthis",
0048                                        "Use this combobox to filter the to-dos that are shown by "
0049                                        "a list of selected tags."));
0050     const QString defaultText = i18nc("@item:inlistbox", "Select Tags");
0051     mCategoryCombo->lineEdit()->setPlaceholderText(defaultText);
0052 
0053     connect(mCategoryCombo, &Akonadi::TagSelectionComboBox::selectionChanged, this, [this]() {
0054         Q_EMIT filterCategoryChanged(mCategoryCombo->selectionNames());
0055     });
0056 
0057     layout->addWidget(mCategoryCombo, 1);
0058 
0059     {
0060         // Make the combo big enough so that "Select Categories" fits.
0061         QFontMetrics fm = mCategoryCombo->lineEdit()->fontMetrics();
0062 
0063         // QLineEdit::sizeHint() returns a nice size to fit 17 'x' chars.
0064         const int currentPreferedWidth = mCategoryCombo->lineEdit()->sizeHint().width();
0065 
0066         // Calculate a nice size for "Select Categories"
0067         const int newPreferedWidth = currentPreferedWidth - fm.boundingRect(QLatin1Char('x')).width() * 17 + fm.boundingRect(defaultText).width();
0068 
0069         const int pixelsToAdd = newPreferedWidth - mCategoryCombo->lineEdit()->width();
0070         mCategoryCombo->setMinimumWidth(mCategoryCombo->width() + pixelsToAdd);
0071     }
0072 
0073     mPriorityCombo->setToolTip(i18nc("@info:tooltip", "Filter on these priorities"));
0074     mPriorityCombo->setWhatsThis(i18nc("@info:whatsthis",
0075                                        "Use this combobox to filter the to-dos that are shown by "
0076                                        "a list of selected priorities."));
0077     mPriorityCombo->lineEdit()->setPlaceholderText(i18nc("@item:inlistbox", "Select Priority"));
0078     connect(mPriorityCombo, &KPIM::KCheckComboBox::checkedItemsChanged, this, [this]() {
0079         Q_EMIT filterPriorityChanged(mPriorityCombo->checkedItems(Qt::UserRole));
0080     });
0081 
0082     layout->addWidget(mPriorityCombo, 1);
0083     fillPriorities();
0084 }
0085 
0086 void TodoViewQuickSearch::reset()
0087 {
0088     mSearchLine->clear();
0089     mCategoryCombo->setCurrentIndex(0);
0090     mPriorityCombo->setCurrentIndex(0);
0091 }
0092 
0093 void TodoViewQuickSearch::fillPriorities()
0094 {
0095     QStringList priorityValues;
0096     priorityValues.append(i18nc("@action:inmenu priority is unspecified", "unspecified"));
0097     priorityValues.append(i18nc("@action:inmenu highest priority", "%1 (highest)", 1));
0098     for (int p = 2; p < 10; ++p) {
0099         if (p == 5) {
0100             priorityValues.append(i18nc("@action:inmenu medium priority", "%1 (medium)", p));
0101         } else if (p == 9) {
0102             priorityValues.append(i18nc("@action:inmenu lowest priority", "%1 (lowest)", p));
0103         } else {
0104             priorityValues.append(i18nc("@action:inmenu", "%1", p));
0105         }
0106     }
0107     // TODO: Using the same method as for categories to fill mPriorityCombo
0108     CalendarSupport::CategoryHierarchyReaderQComboBox(mPriorityCombo).read(priorityValues);
0109 }
0110 
0111 #include "moc_todoviewquicksearch.cpp"