1 /*
2   This file is part of KOrganizer.
3 
4   SPDX-FileCopyrightText: 2004 Till Adam <adam@kde.org>
5   SPDX-FileCopyrightText: 2005 Rafal Rzepecki <divide@users.sourceforge.net>
6   SPDX-FileCopyrightText: 2008 Thomas Thrainer <tom_t@gmx.at>
7 
8   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
9 */
10 
11 #include "todoviewquicksearch.h"
12 #include <CalendarSupport/KCalPrefs>
13 
14 #include <Akonadi/TagSelectionComboBox>
15 #include <CalendarSupport/CategoryConfig>
16 
17 #include <Libkdepim/KCheckComboBox>
18 
19 #include <CalendarSupport/CategoryHierarchyReader>
20 
21 #include <KCalendarCore/CalFilter>
22 
23 #include <KLocalizedString>
24 #include <QLineEdit>
25 
26 #include <QHBoxLayout>
27 
TodoViewQuickSearch(const Akonadi::ETMCalendar::Ptr & calendar,QWidget * parent)28 TodoViewQuickSearch::TodoViewQuickSearch(const Akonadi::ETMCalendar::Ptr &calendar, QWidget *parent)
29     : QWidget(parent)
30     , mCalendar(calendar)
31 {
32     auto layout = new QHBoxLayout(this);
33     // no special margin because it is added by the view
34     layout->setContentsMargins(0, 0, 0, 0);
35 
36     mSearchLine = new QLineEdit(this);
37     mSearchLine->setToolTip(i18nc("@info:tooltip", "Filter on matching summaries"));
38     mSearchLine->setWhatsThis(i18nc("@info:whatsthis", "Enter text here to filter the to-dos that are shown by matching summaries."));
39     mSearchLine->setPlaceholderText(i18nc("@label in QuickSearchLine", "Search Summaries..."));
40     mSearchLine->setClearButtonEnabled(true);
41     connect(mSearchLine, &QLineEdit::textChanged, this, &TodoViewQuickSearch::searchTextChanged);
42 
43     layout->addWidget(mSearchLine, 3);
44 
45     mCategoryCombo = new Akonadi::TagSelectionComboBox(this);
46     mCategoryCombo->setCheckable(true);
47     mCategoryCombo->setToolTip(i18nc("@info:tooltip", "Filter on these tags"));
48     mCategoryCombo->setWhatsThis(i18nc("@info:whatsthis",
49                                        "Use this combobox to filter the to-dos that are shown by "
50                                        "a list of selected tags."));
51     const QString defaultText = i18nc("@item:inlistbox", "Select Tags");
52     mCategoryCombo->lineEdit()->setPlaceholderText(defaultText);
53 
54     connect(mCategoryCombo, &Akonadi::TagSelectionComboBox::selectionChanged, this, [this]() {
55         Q_EMIT filterCategoryChanged(mCategoryCombo->selectionNames());
56     });
57 
58     layout->addWidget(mCategoryCombo, 1);
59 
60     {
61         // Make the combo big enough so that "Select Categories" fits.
62         QFontMetrics fm = mCategoryCombo->lineEdit()->fontMetrics();
63 
64         // QLineEdit::sizeHint() returns a nice size to fit 17 'x' chars.
65         const int currentPreferedWidth = mCategoryCombo->lineEdit()->sizeHint().width();
66 
67         // Calculate a nice size for "Select Categories"
68         const int newPreferedWidth = currentPreferedWidth - fm.boundingRect(QLatin1Char('x')).width() * 17 + fm.boundingRect(defaultText).width();
69 
70         const int pixelsToAdd = newPreferedWidth - mCategoryCombo->lineEdit()->width();
71         mCategoryCombo->setMinimumWidth(mCategoryCombo->width() + pixelsToAdd);
72     }
73 
74     mPriorityCombo = new KPIM::KCheckComboBox(this);
75     mPriorityCombo->setToolTip(i18nc("@info:tooltip", "Filter on these priorities"));
76     mPriorityCombo->setWhatsThis(i18nc("@info:whatsthis",
77                                        "Use this combobox to filter the to-dos that are shown by "
78                                        "a list of selected priorities."));
79     mPriorityCombo->lineEdit()->setPlaceholderText(i18nc("@item:inlistbox", "Select Priority"));
80     connect(mPriorityCombo, &KPIM::KCheckComboBox::checkedItemsChanged, this, [this]() {
81         Q_EMIT filterPriorityChanged(mPriorityCombo->checkedItems(Qt::UserRole));
82     });
83 
84     layout->addWidget(mPriorityCombo, 1);
85     fillPriorities();
86 }
87 
setCalendar(const Akonadi::ETMCalendar::Ptr & calendar)88 void TodoViewQuickSearch::setCalendar(const Akonadi::ETMCalendar::Ptr &calendar)
89 {
90     if (calendar != mCalendar) {
91         mCalendar = calendar;
92     }
93 }
94 
reset()95 void TodoViewQuickSearch::reset()
96 {
97     mSearchLine->clear();
98     mCategoryCombo->setCurrentIndex(0);
99     mPriorityCombo->setCurrentIndex(0);
100 }
101 
fillPriorities()102 void TodoViewQuickSearch::fillPriorities()
103 {
104     QStringList priorityValues;
105     priorityValues.append(i18nc("@action:inmenu priority is unspecified", "unspecified"));
106     priorityValues.append(i18nc("@action:inmenu highest priority", "%1 (highest)", 1));
107     for (int p = 2; p < 10; ++p) {
108         if (p == 5) {
109             priorityValues.append(i18nc("@action:inmenu medium priority", "%1 (medium)", p));
110         } else if (p == 9) {
111             priorityValues.append(i18nc("@action:inmenu lowest priority", "%1 (lowest)", p));
112         } else {
113             priorityValues.append(i18nc("@action:inmenu", "%1", p));
114         }
115     }
116     // TODO: Using the same method as for categories to fill mPriorityCombo
117     CalendarSupport::CategoryHierarchyReaderQComboBox(mPriorityCombo).read(priorityValues);
118 }
119