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