1 | /* |
2 | This file is part of the KDE libraries |
3 | SPDX-FileCopyrightText: 2003 Scott Wheeler <wheeler@kde.org> |
4 | SPDX-FileCopyrightText: 2004 Gustavo Sverzut Barbieri <gsbarbieri@users.sourceforge.net> |
5 | |
6 | SPDX-License-Identifier: LGPL-2.0-or-later |
7 | */ |
8 | |
9 | #ifndef KLISTWIDGETSEARCHLINE_H |
10 | #define KLISTWIDGETSEARCHLINE_H |
11 | |
12 | #include <QLineEdit> |
13 | #include <memory> |
14 | |
15 | #include <kitemviews_export.h> |
16 | |
17 | class QListWidget; |
18 | class QListWidgetItem; |
19 | class QModelIndex; |
20 | |
21 | /*! |
22 | * \class KListWidgetSearchLine |
23 | * \inmodule KItemViews |
24 | * |
25 | * \brief This class makes it easy to add a search line for filtering the items in a |
26 | * listwidget based on a simple text search. |
27 | * |
28 | * No changes to the application other than instantiating this class with an |
29 | * appropriate QListWidget should be needed. |
30 | */ |
31 | class KITEMVIEWS_EXPORT KListWidgetSearchLine : public QLineEdit |
32 | { |
33 | Q_OBJECT |
34 | |
35 | public: |
36 | /*! |
37 | * Constructs a KListWidgetSearchLine with \a listWidget being the QListWidget to |
38 | * be filtered. |
39 | * |
40 | * If \a listWidget is null then the widget will be disabled until a listWidget |
41 | * is set with setListWidget(). |
42 | */ |
43 | explicit KListWidgetSearchLine(QWidget *parent = nullptr, QListWidget *listWidget = nullptr); |
44 | |
45 | ~KListWidgetSearchLine() override; |
46 | |
47 | /*! |
48 | * Returns if the search is case sensitive. |
49 | * |
50 | * This defaults to Qt::CaseInsensitive. |
51 | * |
52 | * \sa setCaseSensitivity() |
53 | */ |
54 | Qt::CaseSensitivity caseSensitive() const; |
55 | |
56 | /*! |
57 | * Returns the listWidget that is currently filtered by the search. |
58 | * |
59 | * \sa setListWidget() |
60 | */ |
61 | QListWidget *listWidget() const; |
62 | |
63 | public Q_SLOTS: |
64 | /*! |
65 | * Updates search to only make visible the items that match \a s. |
66 | * |
67 | * If \a s is null then the line edit's text will be used. |
68 | */ |
69 | virtual void updateSearch(const QString &s = QString()); |
70 | |
71 | /*! |
72 | * Make the search case sensitive or case insensitive. |
73 | * |
74 | * \sa caseSensitive() |
75 | */ |
76 | void setCaseSensitivity(Qt::CaseSensitivity cs); |
77 | |
78 | /*! |
79 | * Sets the QListWidget that is filtered by this search line. |
80 | * |
81 | * If \a lv is null then the widget will be disabled. |
82 | * |
83 | * \sa listWidget() |
84 | */ |
85 | void setListWidget(QListWidget *lv); |
86 | |
87 | /*! |
88 | * Clear line edit and empty hiddenItems, returning elements to listWidget. |
89 | */ |
90 | void clear(); |
91 | |
92 | protected: |
93 | /*! |
94 | * Returns true if \a item matches the search \a s. |
95 | * |
96 | * This will be evaluated based on the value of caseSensitive(). |
97 | * |
98 | * This can be overridden in subclasses to implement more complicated matching schemes. |
99 | */ |
100 | virtual bool itemMatches(const QListWidgetItem *item, const QString &s) const; |
101 | |
102 | bool event(QEvent *event) override; |
103 | |
104 | private: |
105 | friend class KListWidgetSearchLinePrivate; |
106 | std::unique_ptr<class KListWidgetSearchLinePrivate> const d; |
107 | |
108 | Q_PRIVATE_SLOT(d, void _k_listWidgetDeleted()) |
109 | Q_PRIVATE_SLOT(d, void _k_queueSearch(const QString &)) |
110 | Q_PRIVATE_SLOT(d, void _k_activateSearch()) |
111 | Q_PRIVATE_SLOT(d, void _k_rowsInserted(const QModelIndex &, int, int)) |
112 | Q_PRIVATE_SLOT(d, void _k_dataChanged(const QModelIndex &, const QModelIndex &)) |
113 | }; |
114 | |
115 | #endif /* KLISTWIDGETSEARCHLINE_H */ |
116 | |