1
0
Fork 0

Use an icon to represent user/system party to reduce column width

This commit is contained in:
torusrxxx 2022-10-17 00:47:01 +08:00
parent 7ade354b04
commit 0c9c2c0fd0
No known key found for this signature in database
GPG Key ID: A795C73A0F1CFADD
7 changed files with 121 additions and 82 deletions

View File

@ -2,6 +2,7 @@
#include "StdTable.h"
// StdIconTable extends StdTable by adding icons to one of the columns
class StdIconTable : public StdTable
{
Q_OBJECT
@ -9,9 +10,9 @@ public:
explicit StdIconTable(QWidget* parent = 0) : StdTable(parent), mIconColumn(0) {};
// Data Management
void setRowIcon(int r, const QIcon & icon);
void setRowIcon(int r, const QIcon & icon); // set the icon for a row
QIcon getRowIcon(int r) const;
void setIconColumn(int c);
void setIconColumn(int c); // set in which column the icons appear
int getIconColumn() const;
void setRowCount(dsint count) override;
void sortRows(int column, bool ascending) override;

View File

@ -2,7 +2,7 @@
#include "CommonActions.h"
#include "Bridge.h"
CallStackView::CallStackView(StdTable* parent) : StdTable(parent)
CallStackView::CallStackView(StdTable* parent) : StdIconTable(parent)
{
int charwidth = getCharWidth();
@ -11,8 +11,9 @@ CallStackView::CallStackView(StdTable* parent) : StdTable(parent)
addColumnAt(8 + charwidth * sizeof(dsint) * 2, tr("To"), false); //return to
addColumnAt(8 + charwidth * sizeof(dsint) * 2, tr("From"), false); //return from
addColumnAt(8 + charwidth * sizeof(dsint) * 2, tr("Size"), false); //size
addColumnAt(2 * charwidth, tr("Party"), false); //party
addColumnAt(50 * charwidth, tr("Comment"), false);
addColumnAt(8 * charwidth, tr("Party"), false); //party
setIconColumn(ColParty);
loadColumnFromConfig("CallStack");
connect(Bridge::getBridge(), SIGNAL(updateCallStack()), this, SLOT(updateCallStack()));
@ -74,28 +75,28 @@ void CallStackView::setupContextMenu()
QString CallStackView::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
QString ret = getCellContent(rowBase + rowOffset, col);
if(isSelected(rowBase, rowOffset))
painter->fillRect(QRect(x, y, w, h), QBrush(mSelectionColor));
bool isSpaceRow = !getCellContent(rowBase + rowOffset, ColThread).isEmpty();
if(!col && !(rowBase + rowOffset) && !ret.isEmpty())
if(col == ColThread && !(rowBase + rowOffset))
{
painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("ThreadCurrentBackgroundColor")));
painter->setPen(QPen(ConfigColor("ThreadCurrentColor")));
painter->drawText(QRect(x + 4, y, w - 4, h), Qt::AlignVCenter | Qt::AlignLeft, ret);
ret = "";
QString ret = getCellContent(rowBase + rowOffset, col);
if(!ret.isEmpty())
{
painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("ThreadCurrentBackgroundColor")));
painter->setPen(QPen(ConfigColor("ThreadCurrentColor")));
painter->drawText(QRect(x + 4, y, w - 4, h), Qt::AlignVCenter | Qt::AlignLeft, ret);
}
return "";
}
else if(col > ColThread && isSpaceRow)
{
auto mid = h / 2.0;
painter->drawLine(QPointF(x, y + mid), QPointF(x + w, y + mid));
}
return ret;
return StdIconTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
}
void CallStackView::updateCallStack()
@ -149,12 +150,15 @@ void CallStackView::updateCallStack()
{
case mod_user:
setCellContent(currentRow, ColParty, tr("User"));
setRowIcon(currentRow, DIcon("markasuser"));
break;
case mod_system:
setCellContent(currentRow, ColParty, tr("System"));
setRowIcon(currentRow, DIcon("markassystem"));
break;
default:
setCellContent(currentRow, ColParty, QString::number(party));
setRowIcon(currentRow, DIcon("markasparty"));
break;
}
}

View File

@ -1,9 +1,9 @@
#pragma once
#include "StdTable.h"
#include "StdIconTable.h"
class CommonActions;
class CallStackView : public StdTable
class CallStackView : public StdIconTable
{
Q_OBJECT
public:
@ -30,8 +30,8 @@ private:
ColTo,
ColFrom,
ColSize,
ColComment,
ColParty
ColParty,
ColComment
};
MenuBuilder* mMenuBuilder;

View File

@ -14,7 +14,7 @@
#include "RichTextPainter.h"
MemoryMapView::MemoryMapView(StdTable* parent)
: StdTable(parent),
: StdIconTable(parent),
mCipBase(0)
{
setDrawDebugOnly(true);
@ -25,12 +25,14 @@ MemoryMapView::MemoryMapView(StdTable* parent)
addColumnAt(8 + charwidth * 2 * sizeof(duint), tr("Address"), true, tr("Address")); //addr
addColumnAt(8 + charwidth * 2 * sizeof(duint), tr("Size"), false, tr("Size")); //size
addColumnAt(charwidth * 2, tr("Party"), false); // party
addColumnAt(8 + charwidth * 32, tr("Info"), false, tr("Page Information")); //page information
addColumnAt(8 + charwidth * 28, tr("Content"), false, tr("Content of section")); //content of section
addColumnAt(8 + charwidth * 5, tr("Type"), true, tr("Allocation Type")); //allocation type
addColumnAt(8 + charwidth * 11, tr("Protection"), true, tr("Current Protection")); //current protection
addColumnAt(8 + charwidth * 8, tr("Initial"), true, tr("Allocation Protection")); //allocation protection
loadColumnFromConfig("MemoryMap");
setIconColumn(ColParty);
connect(Bridge::getBridge(), SIGNAL(updateMemory()), this, SLOT(refreshMap()));
connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(stateChangedSlot(DBGSTATE)));
@ -211,7 +213,7 @@ void MemoryMapView::contextMenuSlot(const QPoint & pos)
if(!DbgIsDebugging())
return;
duint selectedAddr = getCellUserdata(getInitialSelection(), 0);
duint selectedAddr = getSelAddr();
QMenu wMenu(this); //create context menu
wMenu.addAction(mFollowDisassembly);
@ -269,7 +271,7 @@ void MemoryMapView::contextMenuSlot(const QPoint & pos)
wMenu.exec(mapToGlobal(pos)); //execute context menu
}
QString MemoryMapView::getProtectionString(DWORD Protect)
static QString getProtectionString(DWORD Protect)
{
#define RIGHTS_STRING (sizeof("ERWCG") + 1)
char rights[RIGHTS_STRING];
@ -285,11 +287,7 @@ QString MemoryMapView::paintContent(QPainter* painter, dsint rowBase, int rowOff
if(col == 0) //address
{
QString wStr = getCellContent(rowBase + rowOffset, col);
#ifdef _WIN64
duint addr = wStr.toULongLong(0, 16);
#else //x86
duint addr = wStr.toULong(0, 16);
#endif //_WIN64
duint addr = getSelAddr();
QColor color = mTextColor;
QColor backgroundColor = Qt::transparent;
bool isBp = (DbgGetBpxTypeAt(addr) & bp_memory) == bp_memory;
@ -318,10 +316,10 @@ QString MemoryMapView::paintContent(QPainter* painter, dsint rowBase, int rowOff
painter->drawText(QRect(x + 4, y, getColumnWidth(col) - 4, getRowHeight()), Qt::AlignVCenter | Qt::AlignLeft, wStr);
return QString();
}
else if(col == 2) //info
else if(col == ColPageInfo) //info
{
QString wStr = StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
auto addr = getCellUserdata(rowBase + rowOffset, 0);
QString wStr = StdIconTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
auto addr = getCellUserdata(rowBase + rowOffset, ColAddress);
if(wStr.contains(" \""))
{
auto idx = wStr.indexOf(" \"");
@ -350,9 +348,9 @@ QString MemoryMapView::paintContent(QPainter* painter, dsint rowBase, int rowOff
return QString();
}
}
else if(col == 4) //CPROT
else if(col == ColCurProtect) //CPROT
{
QString wStr = StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);;
QString wStr = StdIconTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);;
if(!ConfigBool("Engine", "ListAllPages"))
{
painter->setPen(ConfigColor("MemoryMapSectionTextColor"));
@ -360,7 +358,7 @@ QString MemoryMapView::paintContent(QPainter* painter, dsint rowBase, int rowOff
return QString();
}
}
return StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
return StdIconTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
}
QAction* MemoryMapView::makeCommandAction(QAction* action, const QString & command)
@ -384,7 +382,7 @@ void MemoryMapView::ExecCommand()
for(int i : getSelection())
{
QString specializedCommand = command;
specializedCommand.replace(QChar('$'), ToHexString(getCellUserdata(i, 0))); // $ -> Base address
specializedCommand.replace(QChar('$'), ToHexString(getCellUserdata(i, ColAddress))); // $ -> Base address
DbgCmdExec(specializedCommand);
}
}
@ -411,16 +409,34 @@ void MemoryMapView::refreshMap()
wMbi = (wMemMapStruct.page)[wI].mbi;
// Base address
setCellContent(wI, 0, ToPtrString((duint)wMbi.BaseAddress));
setCellUserdata(wI, 0, (duint)wMbi.BaseAddress);
setCellContent(wI, ColAddress, ToPtrString((duint)wMbi.BaseAddress));
setCellUserdata(wI, ColAddress, (duint)wMbi.BaseAddress);
// Size
setCellContent(wI, 1, ToPtrString((duint)wMbi.RegionSize));
setCellUserdata(wI, 1, (duint)wMbi.RegionSize);
setCellContent(wI, ColSize, ToPtrString((duint)wMbi.RegionSize));
setCellUserdata(wI, ColSize, (duint)wMbi.RegionSize);
// Party
int party = DbgFunctions()->ModGetParty((duint)wMbi.BaseAddress);
switch(party)
{
case mod_user:
setCellContent(wI, ColParty, tr("User"));
setRowIcon(wI, DIcon("markasuser"));
break;
case mod_system:
setCellContent(wI, ColParty, tr("System"));
setRowIcon(wI, DIcon("markassystem"));
break;
default:
setCellContent(wI, ColParty, QString::number(party));
setRowIcon(wI, DIcon("markasparty"));
break;
}
// Information
wS = QString((wMemMapStruct.page)[wI].info);
setCellContent(wI, 2, wS);
setCellContent(wI, ColPageInfo, wS);
// Content, TODO: proper section content analysis in dbg/memory.cpp:MemUpdateMap
char comment_text[MAX_COMMENT_SIZE];
@ -450,7 +466,7 @@ void MemoryMapView::refreshMap()
wS = tr("Exception information");
else
wS = QString("");
setCellContent(wI, 3, std::move(wS));
setCellContent(wI, ColContent, std::move(wS));
// Type
const char* type = "";
@ -469,13 +485,13 @@ void MemoryMapView::refreshMap()
type = "N/A";
break;
}
setCellContent(wI, 4, type);
setCellContent(wI, ColAllocation, type);
// current access protection
setCellContent(wI, 5, getProtectionString(wMbi.Protect));
setCellContent(wI, ColCurProtect, getProtectionString(wMbi.Protect));
// allocation protection
setCellContent(wI, 6, getProtectionString(wMbi.AllocationProtect));
setCellContent(wI, ColAllocProtect, getProtectionString(wMbi.AllocationProtect));
}
if(wMemMapStruct.page != 0)
@ -491,22 +507,22 @@ void MemoryMapView::stateChangedSlot(DBGSTATE state)
void MemoryMapView::followDumpSlot()
{
DbgCmdExecDirect(QString("dump %1").arg(getCellContent(getInitialSelection(), 0)));
DbgCmdExecDirect(QString("dump %1").arg(getSelText()));
}
void MemoryMapView::followDisassemblerSlot()
{
DbgCmdExec(QString("disasm %1").arg(getCellContent(getInitialSelection(), 0)));
DbgCmdExec(QString("disasm %1").arg(getSelText()));
}
void MemoryMapView::followSymbolsSlot()
{
DbgCmdExec(QString("symfollow %1").arg(getCellContent(getInitialSelection(), 0)));
DbgCmdExec(QString("symfollow %1").arg(getSelText()));
}
void MemoryMapView::doubleClickedSlot()
{
auto addr = DbgValFromString(getCellContent(getInitialSelection(), 0).toUtf8().constData());
auto addr = DbgValFromString(getSelText().toUtf8().constData());
if(!addr)
return;
if(DbgFunctions()->MemIsCodePage(addr, false))
@ -522,12 +538,8 @@ void MemoryMapView::memoryExecuteSingleshootToggleSlot()
{
for(int i : getSelection())
{
QString addr_text = getCellContent(i, 0);
#ifdef _WIN64
duint selectedAddr = addr_text.toULongLong(0, 16);
#else //x86
duint selectedAddr = addr_text.toULong(0, 16);
#endif //_WIN64
QString addr_text = getCellContent(i, ColAddress);
duint selectedAddr = getSelAddr();
if((DbgGetBpxTypeAt(selectedAddr) & bp_memory) == bp_memory) //memory breakpoint set
DbgCmdExec(QString("bpmc ") + addr_text);
else
@ -539,9 +551,9 @@ void MemoryMapView::pageMemoryRights()
{
PageMemoryRights PageMemoryRightsDialog(this);
connect(&PageMemoryRightsDialog, SIGNAL(refreshMemoryMap()), this, SLOT(refreshMap()));
duint addr = getCellUserdata(getInitialSelection(), 0);
duint size = getCellUserdata(getInitialSelection(), 1);
PageMemoryRightsDialog.RunAddrSize(addr, size, getCellContent(getInitialSelection(), 3));
duint addr = getSelAddr();
duint size = getCellUserdata(getInitialSelection(), ColSize);
PageMemoryRightsDialog.RunAddrSize(addr, size, getCellContent(getInitialSelection(), ColCurProtect));
}
void MemoryMapView::switchView()
@ -562,12 +574,12 @@ void MemoryMapView::memoryAllocateSlot()
if(mLineEdit.exec() == QDialog::Accepted)
{
duint memsize = mLineEdit.getVal();
if(memsize == 0) // 1GB
if(memsize == 0)
{
SimpleWarningBox(this, tr("Warning"), tr("You're trying to allocate a zero-sized buffer just now."));
return;
}
if(memsize > 1024 * 1024 * 1024)
if(memsize > 1024 * 1024 * 1024) // 1GB
{
SimpleErrorBox(this, tr("Error"), tr("The size of buffer you're trying to allocate exceeds 1GB. Please check your expression to ensure nothing is wrong."));
return;
@ -593,7 +605,7 @@ void MemoryMapView::findPatternSlot()
hexEdit.setWindowTitle(tr("Find Pattern..."));
if(hexEdit.exec() != QDialog::Accepted)
return;
duint addr = getCellContent(getInitialSelection(), 0).toULongLong(0, 16);
duint addr = getSelAddr();
entireBlockEnabled = hexEdit.entireBlock();
BridgeSettingSetUint("Gui", "MemoryMapEntireBlock", entireBlockEnabled);
if(entireBlockEnabled)
@ -608,8 +620,8 @@ void MemoryMapView::dumpMemory()
duint end = 0;
for(auto row : getSelection())
{
auto base = getCellUserdata(row, 0);
auto size = getCellUserdata(row, 1);
auto base = getCellUserdata(row, ColAddress);
auto size = getCellUserdata(row, ColSize);
if(end == 0)
{
start = base;
@ -625,7 +637,7 @@ void MemoryMapView::dumpMemory()
auto modname = mainModuleName();
if(!modname.isEmpty())
modname += '_';
QString defaultFile = QString("%1/%2%3.bin").arg(QDir::currentPath(), modname, getCellContent(getInitialSelection(), 0));
QString defaultFile = QString("%1/%2%3.bin").arg(QDir::currentPath(), modname, getSelText());
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Memory Region"), defaultFile, tr("Binary files (*.bin);;All files (*.*)"));
if(fileName.length())
@ -640,7 +652,7 @@ void MemoryMapView::loadMemory()
auto modname = mainModuleName();
if(!modname.isEmpty())
modname += '_';
auto addr = getCellContent(getInitialSelection(), 0);
auto addr = getSelText();
QString defaultFile = QString("%1/%2%3.bin").arg(QDir::currentPath(), modname, addr);
QString fileName = QFileDialog::getOpenFileName(this, tr("Load Memory Region"), defaultFile, tr("Binary files (*.bin);;All files (*.*)"));
@ -648,7 +660,7 @@ void MemoryMapView::loadMemory()
{
fileName = QDir::toNativeSeparators(fileName);
//TODO: loaddata command (Does ODbgScript support that?)
DbgCmdExec(QString("savedata \"%1\",%2,%3").arg(fileName, addr, getCellContent(getInitialSelection(), 1)));
DbgCmdExec(QString("savedata \"%1\",%2,%3").arg(fileName, addr, getCellContent(getInitialSelection(), ColSize)));
}
}
@ -657,10 +669,9 @@ void MemoryMapView::selectAddress(duint va)
auto base = DbgMemFindBaseAddr(va, nullptr);
if(base)
{
auto baseText = ToPtrString(base);
auto rows = getRowCount();
for(dsint row = 0; row < rows; row++)
if(getCellContent(row, 0) == baseText)
if(getCellUserdata(row, ColAddress) == base)
{
scrollSelect(row);
reloadData();
@ -680,7 +691,7 @@ void MemoryMapView::gotoExpressionSlot()
if(!mGoto)
mGoto = new GotoDialog(this);
mGoto->setWindowTitle(tr("Enter the address to find..."));
mGoto->setInitialExpression(ToPtrString(duint(getCellContent(getInitialSelection(), 0).toULongLong(nullptr, 16))));
mGoto->setInitialExpression(ToPtrString(getSelAddr()));
if(mGoto->exec() == QDialog::Accepted)
{
selectAddress(DbgValFromString(mGoto->expressionText.toUtf8().constData()));
@ -689,8 +700,8 @@ void MemoryMapView::gotoExpressionSlot()
void MemoryMapView::addVirtualModSlot()
{
auto base = getCellUserdata(getInitialSelection(), 0);
auto size = getCellUserdata(getInitialSelection(), 1);
auto base = getSelAddr();
auto size = getCellUserdata(getInitialSelection(), ColSize);
VirtualModDialog mDialog(this);
mDialog.setData("", base, size);
if(mDialog.exec() != QDialog::Accepted)
@ -703,8 +714,8 @@ void MemoryMapView::addVirtualModSlot()
void MemoryMapView::findReferencesSlot()
{
auto base = getCellUserdata(getInitialSelection(), 0);
auto size = getCellUserdata(getInitialSelection(), 1);
auto base = getSelAddr();
auto size = getCellUserdata(getInitialSelection(), ColSize);
DbgCmdExec(QString("reffindrange %1, %2, dis.sel()").arg(ToPtrString(base)).arg(ToPtrString(base + size)));
emit showReferences();
}
@ -712,8 +723,8 @@ void MemoryMapView::findReferencesSlot()
void MemoryMapView::selectionGetSlot(SELECTIONDATA* selection)
{
auto sel = getSelection();
selection->start = getCellUserdata(sel.front(), 0);
selection->end = getCellUserdata(sel.back(), 0) + getCellUserdata(sel.back(), 1) - 1;
selection->start = getCellUserdata(sel.front(), ColAddress);
selection->end = getCellUserdata(sel.back(), ColAddress) + getCellUserdata(sel.back(), ColSize) - 1;
Bridge::getBridge()->setResult(BridgeResult::SelectionGet, 1);
}
@ -725,7 +736,7 @@ void MemoryMapView::disassembleAtSlot(dsint va, dsint cip)
void MemoryMapView::commentSlot()
{
duint wVA = getCellUserdata(getInitialSelection(), 0);
duint wVA = getSelAddr();
LineEditDialog mLineEdit(this);
QString addr_text = ToPtrString(wVA);
char comment_text[MAX_COMMENT_SIZE] = "";

View File

@ -1,10 +1,10 @@
#pragma once
#include "StdTable.h"
#include "StdIconTable.h"
class GotoDialog;
class MemoryMapView : public StdTable
class MemoryMapView : public StdIconTable
{
Q_OBJECT
public:
@ -42,7 +42,25 @@ public slots:
void disassembleAtSlot(dsint va, dsint cip);
private:
QString getProtectionString(DWORD Protect);
enum
{
ColAddress = 0,
ColSize,
ColParty,
ColPageInfo,
ColContent,
ColAllocation,
ColCurProtect,
ColAllocProtect
};
inline duint getSelAddr()
{
return getCellUserdata(getInitialSelection(), ColAddress);
}
inline QString getSelText()
{
return getCellContent(getInitialSelection(), ColAddress);
}
QAction* makeCommandAction(QAction* action, const QString & command);
GotoDialog* mGoto = nullptr;

View File

@ -4,7 +4,7 @@
#include "Configuration.h"
#include "Bridge.h"
#include "BrowseDialog.h"
#include "StdSearchListView.h"
#include "StdIconSearchListView.h"
#include "ZehSymbolTable.h"
#include <QVBoxLayout>
#include <QProcess>
@ -20,17 +20,18 @@ enum
ColStatus,
};
class ModuleStdTable final : public StdTable
class ModuleStdTable final : public StdIconTable
{
public:
ModuleStdTable()
{
Initialize();
setIconColumn(ColParty);
}
void updateColors() override
{
StdTable::updateColors();
StdIconTable::updateColors();
mSymbolUnloadedTextColor = ConfigColor("SymbolUnloadedTextColor");
mSymbolLoadingTextColor = ConfigColor("SymbolLoadingTextColor");
mSymbolLoadedTextColor = ConfigColor("SymbolLoadedTextColor");
@ -174,7 +175,7 @@ SymbolView::SymbolView(QWidget* parent) : QWidget(parent), ui(new Ui::SymbolView
mSymbolList->mSearchStartCol = 1;
// Create module list
mModuleList = new StdSearchListView(this, true, false, new StdTableSearchList(new ModuleStdTable(), new ModuleStdTable()));
mModuleList = new StdIconSearchListView(this, true, false, new StdTableSearchList(new ModuleStdTable(), new ModuleStdTable()));
mModuleList->setSearchStartCol(ColBase);
mModuleList->enableMultiSelection(true);
mModuleList->setAddressColumn(ColBase, true);
@ -182,7 +183,7 @@ SymbolView::SymbolView(QWidget* parent) : QWidget(parent), ui(new Ui::SymbolView
int charwidth = mModuleList->getCharWidth();
mModuleList->addColumnAt(8 + charwidth * 2 * sizeof(dsint), tr("Base"), true);
mModuleList->addColumnAt(300, tr("Module"), true);
mModuleList->addColumnAt(8 + charwidth * 8, tr("Party"), true);
mModuleList->addColumnAt(charwidth * 2, tr("Party"), true); // with icon
mModuleList->addColumnAt(8 + charwidth * 60, tr("Path"), true);
mModuleList->addColumnAt(8 + charwidth * 8, tr("Status"), true);
mModuleList->loadColumnFromConfig("Module");
@ -489,12 +490,15 @@ void SymbolView::updateSymbolList(int module_count, SYMBOLMODULEINFO* modules)
{
case 0:
mModuleList->stdList()->setCellContent(i, ColParty, tr("User"));
mModuleList->setRowIcon(i, DIcon("markasuser"));
break;
case 1:
mModuleList->stdList()->setCellContent(i, ColParty, tr("System"));
mModuleList->setRowIcon(i, DIcon("markassystem"));
break;
default:
mModuleList->stdList()->setCellContent(i, ColParty, tr("Party: %1").arg(party));
mModuleList->setRowIcon(i, DIcon("markasparty"));
break;
}
char szModPath[MAX_PATH] = "";

View File

@ -5,6 +5,7 @@
class QMenu;
class StdSearchListView;
class StdIconSearchListView;
class SearchListView;
class SymbolSearchList;
class QVBoxLayout;
@ -68,7 +69,7 @@ private:
QVBoxLayout* mSymbolLayout;
QWidget* mSymbolPlaceHolder;
SearchListView* mSymbolList;
StdSearchListView* mModuleList;
StdIconSearchListView* mModuleList;
SymbolSearchList* mSymbolSearchList;
QMap<QString, duint> mModuleBaseList;
QAction* mFollowSymbolAction;