DolphinWX: Add ability to filter symbols (by name)

This allows the user to filter symbols by name, instead of having to
scroll through a very, very long listbox…
This commit is contained in:
Léo Lam 2016-12-04 14:47:08 +01:00
parent 827de2ed06
commit 59abfee11d
3 changed files with 32 additions and 8 deletions

View File

@ -78,8 +78,13 @@ CCodeWindow::CCodeWindow(CFrame* parent, wxWindowID id, const wxPoint& position,
wxSearchCtrl* const address_searchctrl = new wxSearchCtrl(m_aui_toolbar, IDM_ADDRBOX);
address_searchctrl->Bind(wxEVT_TEXT, &CCodeWindow::OnAddrBoxChange, this);
address_searchctrl->SetDescriptiveText(_("Search Address"));
m_symbol_filter_ctrl = new wxSearchCtrl(m_aui_toolbar, wxID_ANY);
m_symbol_filter_ctrl->Bind(wxEVT_TEXT, &CCodeWindow::OnSymbolFilterText, this);
m_symbol_filter_ctrl->SetDescriptiveText(_("Filter Symbols"));
m_symbol_filter_ctrl->SetToolTip(_("Filter the symbol list by name. This is case-sensitive."));
m_aui_toolbar->AddControl(address_searchctrl);
m_aui_toolbar->AddControl(m_symbol_filter_ctrl);
m_aui_toolbar->Realize();
m_aui_manager.SetManagedWindow(this);
@ -260,6 +265,11 @@ void CCodeWindow::OnAddrBoxChange(wxCommandEvent& event)
event.Skip();
}
void CCodeWindow::OnSymbolFilterText(wxCommandEvent&)
{
ReloadSymbolListBox();
}
void CCodeWindow::OnCallstackListChange(wxCommandEvent& event)
{
int index = callstack->GetSelection();

View File

@ -28,6 +28,7 @@ class DolphinAuiToolBar;
class wxListBox;
class wxMenu;
class wxMenuBar;
class wxSearchCtrl;
class wxToolBar;
namespace Details
@ -132,6 +133,7 @@ private:
void OnCodeStep(wxCommandEvent& event);
void OnAddrBoxChange(wxCommandEvent& event);
void OnSymbolFilterText(wxCommandEvent& event);
void OnSymbolsMenu(wxCommandEvent& event);
void OnJitMenu(wxCommandEvent& event);
void OnProfilerMenu(wxCommandEvent& event);
@ -153,6 +155,8 @@ private:
void UpdateLists();
void UpdateCallstack();
void ReloadSymbolListBox();
wxPanel* CreateSiblingPanel(int id);
// Sibling debugger panels
@ -161,6 +165,7 @@ private:
CFrame* Parent;
CCodeView* codeview;
wxSearchCtrl* m_symbol_filter_ctrl;
wxListBox* callstack;
wxListBox* symbols;
wxListBox* callers;

View File

@ -14,6 +14,7 @@
#include <wx/listbox.h>
#include <wx/menu.h>
#include <wx/mimetype.h>
#include <wx/srchctrl.h>
#include <wx/textdlg.h>
#include "Common/CommonPaths.h"
@ -398,20 +399,28 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event)
}
}
void CCodeWindow::ReloadSymbolListBox()
{
symbols->Freeze(); // HyperIris: wx style fast filling
symbols->Clear();
const wxString filtering_string = m_symbol_filter_ctrl->GetValue().Trim().Trim(false);
for (const auto& symbol : g_symbolDB.Symbols())
{
if (symbol.second.name.find(filtering_string) == std::string::npos)
continue;
int idx = symbols->Append(StrToWxStr(symbol.second.name));
symbols->SetClientData(idx, (void*)&symbol.second);
}
symbols->Thaw();
}
void CCodeWindow::NotifyMapLoaded()
{
if (!codeview)
return;
g_symbolDB.FillInCallers();
symbols->Freeze(); // HyperIris: wx style fast filling
symbols->Clear();
for (const auto& symbol : g_symbolDB.Symbols())
{
int idx = symbols->Append(StrToWxStr(symbol.second.name));
symbols->SetClientData(idx, (void*)&symbol.second);
}
symbols->Thaw();
ReloadSymbolListBox();
Repopulate();
}