diff --git a/libs/wxutil/dataview/ResourceTreeView.cpp b/libs/wxutil/dataview/ResourceTreeView.cpp index 77d9c01c31..597f7392f4 100644 --- a/libs/wxutil/dataview/ResourceTreeView.cpp +++ b/libs/wxutil/dataview/ResourceTreeView.cpp @@ -200,7 +200,7 @@ void ResourceTreeView::PopulateContextMenu(wxutil::PopupMenu& popupMenu) ); } -void ResourceTreeView::SetFilterText(const wxString& filterText) +bool ResourceTreeView::SetFilterText(const wxString& filterText) { // We use the lower-case copy of the given filter text _filterText = filterText.Lower(); @@ -218,18 +218,16 @@ void ResourceTreeView::SetFilterText(const wxString& filterText) if (!_filterText.empty() && !TreeModel::RowContainsString(row, _filterText, _colsToSearch, true)) { // The selected row is not relevant anymore - JumpToFirstFilterMatch(); - return; + return JumpToFirstFilterMatch(); } // Try to keep whatever selection we had before Select(item); EnsureVisible(item); + return true; } - else - { - JumpToFirstFilterMatch(); - } + + return JumpToFirstFilterMatch(); } void ResourceTreeView::UpdateTreeVisibility() @@ -241,16 +239,19 @@ void ResourceTreeView::UpdateTreeVisibility() } } -void ResourceTreeView::JumpToFirstFilterMatch() +bool ResourceTreeView::JumpToFirstFilterMatch() { - if (_filterText.empty()) return; + if (_filterText.empty()) return false; auto item = _treeModelFilter->FindNextString(_filterText, _colsToSearch); if (item.IsOk()) { JumpToSearchMatch(item); + return true; } + + return false; } void ResourceTreeView::JumpToNextFilterMatch() diff --git a/libs/wxutil/dataview/ResourceTreeView.h b/libs/wxutil/dataview/ResourceTreeView.h index 923941dd1f..37ca625976 100644 --- a/libs/wxutil/dataview/ResourceTreeView.h +++ b/libs/wxutil/dataview/ResourceTreeView.h @@ -108,7 +108,8 @@ class ResourceTreeView : // this string will match against the default iconAndName column, // all rows not containing the string will be hidden. // Filtering happens case-insensitively. - virtual void SetFilterText(const wxString& filterText); + // As feedback this method returns true if the filter has any matches. + virtual bool SetFilterText(const wxString& filterText); // Removes the string filter virtual void ClearFilterText(); @@ -140,7 +141,8 @@ class ResourceTreeView : // hook as an alternative to this method. void AddCustomMenuItem(const ui::IMenuItemPtr& item); - virtual void JumpToFirstFilterMatch(); + // Returns true if there is a first filter match + virtual bool JumpToFirstFilterMatch(); virtual void JumpToNextFilterMatch(); virtual void JumpToPrevFilterMatch(); diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp index ccec671b04..078e4c9fb1 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.cpp @@ -41,13 +41,7 @@ ResourceTreeViewToolbar::ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeV _filterEntry = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); _filterEntry->SetMinSize(wxSize(100, -1)); - _filterEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent& ev) - { - if (_treeView != nullptr) - { - _treeView->SetFilterText(ev.GetString()); - } - }); + _filterEntry->Bind(wxEVT_TEXT, &ResourceTreeViewToolbar::_onEntryText, this); _filterEntry->Bind(wxEVT_CHAR, &ResourceTreeViewToolbar::_onEntryChar, this); _filterEntry->SetToolTip(_("Enter search text to filter the tree,\nuse arrow keys to navigate")); @@ -139,6 +133,29 @@ void ResourceTreeViewToolbar::_onEntryChar(wxKeyEvent& ev) } } +void ResourceTreeViewToolbar::_onEntryText(wxCommandEvent& ev) +{ + if (_treeView == nullptr) + { + return; + } + + auto filterText = ev.GetString(); + 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(); +} + void ResourceTreeViewToolbar::_onFilterButtonToggled(wxCommandEvent& ev) { if (_treeView == nullptr) return; diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.h b/libs/wxutil/dataview/ResourceTreeViewToolbar.h index 18ce1636af..11f579325c 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.h +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.h @@ -38,6 +38,7 @@ class ResourceTreeViewToolbar : void JumpToPrevFilterMatch(); void _onEntryChar(wxKeyEvent& ev); + void _onEntryText(wxCommandEvent& ev); void _onFilterButtonToggled(wxCommandEvent& ev); void UpdateFromTreeView();