diff --git a/libs/wxutil/dataview/ResourceTreeView.cpp b/libs/wxutil/dataview/ResourceTreeView.cpp index 379291cc95..b7e6f41543 100644 --- a/libs/wxutil/dataview/ResourceTreeView.cpp +++ b/libs/wxutil/dataview/ResourceTreeView.cpp @@ -243,6 +243,32 @@ void ResourceTreeView::JumpToFirstFilterMatch() } } +void ResourceTreeView::JumpToNextFilterMatch() +{ + if (_filterText.empty()) return; + + auto selectedItem = GetSelection(); + auto item = _treeModelFilter->FindNextString(_filterText, _colsToSearch, selectedItem); + + if (item.IsOk()) + { + JumpToSearchMatch(item); + } +} + +void ResourceTreeView::JumpToPrevFilterMatch() +{ + if (_filterText.empty()) return; + + auto selectedItem = GetSelection(); + auto item = _treeModelFilter->FindPrevString(_filterText, _colsToSearch, selectedItem); + + if (item.IsOk()) + { + JumpToSearchMatch(item); + } +} + void ResourceTreeView::ClearFilterText() { _filterText.clear(); diff --git a/libs/wxutil/dataview/ResourceTreeView.h b/libs/wxutil/dataview/ResourceTreeView.h index e7e4a67693..8a573ce40c 100644 --- a/libs/wxutil/dataview/ResourceTreeView.h +++ b/libs/wxutil/dataview/ResourceTreeView.h @@ -136,6 +136,10 @@ class ResourceTreeView : // hook as an alternative to this method. void AddCustomMenuItem(const ui::IMenuItemPtr& item); + virtual void JumpToFirstFilterMatch(); + virtual void JumpToNextFilterMatch(); + virtual void JumpToPrevFilterMatch(); + protected: virtual void PopulateContextMenu(wxutil::PopupMenu& popupMenu); @@ -153,7 +157,6 @@ class ResourceTreeView : // Returns true if the given row is filtered (i.e. node and all child nodes are invisible) bool IsTreeModelRowFilteredRecursively(wxutil::TreeModel::Row& row); bool RowContainsSearchString(wxutil::TreeModel::Row& row); - void JumpToFirstFilterMatch(); void _onContextMenu(wxDataViewEvent& ev); void _onTreeStorePopulationProgress(TreeModel::PopulationProgressEvent& ev); diff --git a/libs/wxutil/dataview/ResourceTreeViewToolbar.h b/libs/wxutil/dataview/ResourceTreeViewToolbar.h index d393eb3ba0..2e097f0b86 100644 --- a/libs/wxutil/dataview/ResourceTreeViewToolbar.h +++ b/libs/wxutil/dataview/ResourceTreeViewToolbar.h @@ -1,6 +1,7 @@ #pragma once #include "i18n.h" +#include "iuimanager.h" #include #include #include @@ -24,6 +25,9 @@ class ResourceTreeViewToolbar : wxRadioButton* _showAll; wxRadioButton* _showFavourites; + wxBitmapButton* _findPrevButton; + wxBitmapButton* _findNextButton; + public: ResourceTreeViewToolbar(wxWindow* parent, ResourceTreeView* treeView = nullptr) : wxPanel(parent, wxID_ANY), @@ -61,8 +65,33 @@ class ResourceTreeViewToolbar : _treeView->SetFilterText(ev.GetString().ToStdString()); } }); + filterEntry->Bind(wxEVT_CHAR, &ResourceTreeViewToolbar::_onEntryChar, this); + + auto nextImg = wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "arrow_down.png"); + _findNextButton = new wxBitmapButton(this, wxID_ANY, nextImg); + + auto prevImg = wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "arrow_up.png"); + _findPrevButton = new wxBitmapButton(this, wxID_ANY, prevImg); + + _findNextButton->SetSize(wxSize(16, 16)); + _findPrevButton->SetSize(wxSize(16, 16)); + + _findNextButton->SetToolTip(_("Go to next match")); + _findPrevButton->SetToolTip(_("Go to previous match")); + + _findNextButton->Bind(wxEVT_BUTTON, [this](wxCommandEvent& ev) + { + jumpToNextFilterMatch(); + }); + _findPrevButton->Bind(wxEVT_BUTTON, [this](wxCommandEvent& ev) + { + jumpToPrevFilterMatch(); + }); + filterBox->Add(filterImage, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); - filterBox->Add(filterEntry, 0, wxALIGN_CENTER_VERTICAL, 6); + filterBox->Add(filterEntry, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + filterBox->Add(_findPrevButton, 0, wxEXPAND | wxRIGHT, 3); + filterBox->Add(_findNextButton, 0, wxEXPAND, 6); grid->Add(favourites, 0, wxALIGN_CENTER_VERTICAL| wxALIGN_LEFT | wxRIGHT, 6); grid->Add(filterBox, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, 6); @@ -77,6 +106,38 @@ class ResourceTreeViewToolbar : } private: + void jumpToNextFilterMatch() + { + if (_treeView != nullptr) + { + _treeView->JumpToNextFilterMatch(); + } + } + + void jumpToPrevFilterMatch() + { + if (_treeView != nullptr) + { + _treeView->JumpToPrevFilterMatch(); + } + } + + void _onEntryChar(wxKeyEvent& ev) + { + if (ev.GetKeyCode() == WXK_UP) + { + jumpToPrevFilterMatch(); + } + else if (ev.GetKeyCode() == WXK_DOWN) + { + jumpToNextFilterMatch(); + } + else + { + ev.Skip(); + } + } + void _onFilterButtonToggled(wxCommandEvent& ev) { if (_treeView == nullptr) return;