1 // SPDX-License-Identifier: GPL-2.0-or-later
3 // Text-matching filter
5 #ifndef _TEXTMATCHINGFILTER_H_
6 #define _TEXTMATCHINGFILTER_H_
8 #include <glibmm/refptr.h>
9 #include <glibmm/ustring.h>
10 #include <gtkmm/boolfilter.h>
11 #include <gtkmm/filter.h>
13 namespace Inkscape::UI
{
15 class TextMatchingFilter
{
17 TextMatchingFilter(std::function
<Glib::ustring (const Glib::RefPtr
<Glib::ObjectBase
>& item
)> get_text_to_match
):
18 _get_text(std::move(get_text_to_match
)) {
20 auto expression
= Gtk::ClosureExpression
<bool>::create([this](auto& item
){
21 if (_search_text
.empty()) return true;
23 auto text
= _get_text(item
).lowercase();
24 return text
.find(_search_text
) != Glib::ustring::npos
;
27 _filter
= Gtk::BoolFilter::create(expression
);
30 void refilter(const Glib::ustring
& search
) {
31 _search_text
= search
.lowercase();
32 Gtk::Filter
* f
= _filter
.get();
33 gtk_filter_changed(f
->gobj(), GtkFilterChange::GTK_FILTER_CHANGE_DIFFERENT
);
36 Glib::RefPtr
<Gtk::Filter
> get_filter() const {
41 std::function
<Glib::ustring (const Glib::RefPtr
<Glib::ObjectBase
>& item
)> _get_text
;
42 Glib::RefPtr
<Gtk::BoolFilter
> _filter
;
43 Glib::ustring _search_text
;