diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp index c337f01c78..b6e393542c 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp @@ -10,12 +10,18 @@ namespace wxutil { +namespace +{ + constexpr const int APPLY_FILTER_TEXT_DELAY_MSEC = 400; +} + ResourceTreeViewToolbar::ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeView* treeView) : wxPanel(parent, wxID_ANY), _treeView(nullptr), _filterEntry(nullptr), _showAll(nullptr), - _showFavourites(nullptr) + _showFavourites(nullptr), + _applyFilterTimer(this) { auto* grid = new wxFlexGridSizer(2); grid->AddGrowableCol(1); @@ -74,6 +80,8 @@ ResourceTreeViewToolbar::ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeV grid->Add(_rightSizer, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, 6); AssociateToTreeView(treeView); + + Bind(wxEVT_TIMER, &ResourceTreeViewToolbar::_onFilterTimeoutReached, this); } wxSizer* ResourceTreeViewToolbar::GetLeftSizer() @@ -106,6 +114,7 @@ void ResourceTreeViewToolbar::AssociateToTreeView(ResourceTreeView* treeView) void ResourceTreeViewToolbar::ClearFilter() { + _applyFilterTimer.Stop(); _filterEntry->SetValue(""); if (_treeView != nullptr) @@ -166,20 +175,8 @@ void ResourceTreeViewToolbar::HandleFilterEntryChanged() return; } - auto filterText = _filterEntry->GetValue(); - bool filterResult = _treeView->SetFilterText(filterText); - - if (!filterText.empty() && !filterResult) - { - // No match, set the text to red for user feedback - _filterEntry->SetForegroundColour(wxColor(220, 0, 0)); - } - else - { - _filterEntry->SetForegroundColour(wxNullColour); - } - - _filterEntry->Refresh(); + // Put in a slight delay before actually firing off the search (#5745) + _applyFilterTimer.Start(APPLY_FILTER_TEXT_DELAY_MSEC, true); } void ResourceTreeViewToolbar::_onFilterButtonToggled(wxCommandEvent& ev) @@ -198,6 +195,7 @@ void ResourceTreeViewToolbar::_onTreeViewFilterTextCleared(wxCommandEvent& ev) { // Tree view cleared the filter, clear our entry box _filterEntry->Clear(); + _applyFilterTimer.Stop(); ev.Skip(); } @@ -210,4 +208,22 @@ void ResourceTreeViewToolbar::UpdateFromTreeView() _showFavourites->SetValue(mode == ResourceTreeView::TreeMode::ShowFavourites); } +void ResourceTreeViewToolbar::_onFilterTimeoutReached(wxTimerEvent& ev) +{ + auto filterText = _filterEntry->GetValue(); + bool filterResult = _treeView->SetFilterText(filterText); + + if (!filterText.empty() && !filterResult) + { + // No match, set the text to red for user feedback + _filterEntry->SetForegroundColour(wxColor(220, 0, 0)); + } + else + { + _filterEntry->SetForegroundColour(wxNullColour); + } + + _filterEntry->Refresh(); +} + } diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.h b/libs/wxutil/dataview/ResourceTreeViewToolbar.h index 404e78c2de..da02603163 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.h +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "ResourceTreeView.h" @@ -29,6 +30,8 @@ class ResourceTreeViewToolbar : wxSizer* _leftSizer; wxSizer* _rightSizer; + wxTimer _applyFilterTimer; + public: ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeView* treeView = nullptr); @@ -52,7 +55,8 @@ class ResourceTreeViewToolbar : void _onEntryText(wxCommandEvent& ev); void _onFilterButtonToggled(wxCommandEvent& ev); void _onTreeViewFilterTextCleared(wxCommandEvent& ev); - + void _onFilterTimeoutReached(wxTimerEvent& ev); + void HandleFilterEntryChanged(); void UpdateFromTreeView(); };