1
0
Fork 0

Disassembly popup in references

This commit is contained in:
torusrxxx 2018-10-12 23:09:36 +08:00
parent cf1498786c
commit 6705ce1af3
No known key found for this signature in database
GPG Key ID: A795C73A0F1CFADD
4 changed files with 91 additions and 8 deletions

View File

@ -4,6 +4,7 @@
#include <QProgressBar>
#include <QLabel>
#include "StdSearchListView.h"
class DisassemblyPopup;
class QTabWidget;

View File

@ -1,16 +1,20 @@
#include "StdSearchListView.h"
#include "StdTable.h"
//#include "CachedFontMetrics.h"
#include "DisassemblyPopup.h"
void StdTableMouseMove::mouseMoveEvent(QMouseEvent* event)
{
emit mouseMoveSignal(event);
}
class StdTableSearchList : public AbstractSearchList
{
public:
friend class StdSearchListView;
StdTableSearchList()
{
mList = new StdTable();
mSearchList = new StdTable();
}
StdTableSearchList() : mList(new StdTableMouseMove()), mSearchList(new StdTableMouseMove()) { }
~StdTableSearchList() {delete mList; delete mSearchList; }
void lock() override { }
void unlock() override { }
@ -38,14 +42,17 @@ public:
}
private:
StdTable* mList;
StdTable* mSearchList;
StdTableMouseMove* mList;
StdTableMouseMove* mSearchList;
};
StdSearchListView::StdSearchListView(QWidget* parent, bool enableRegex, bool enableLock)
: SearchListView(parent, mSearchListData = new StdTableSearchList(), enableRegex, enableLock)
{
setAddressColumn(0);
mDisassemblyPopup = nullptr;
connect(mSearchListData->mList, SIGNAL(mouseMoveSignal(QMouseEvent*)), this, SLOT(mouseMoveSlot(QMouseEvent*)));
connect(mSearchListData->mSearchList, SIGNAL(mouseMoveSignal(QMouseEvent*)), this, SLOT(mouseMoveSlot(QMouseEvent*)));
}
StdSearchListView::~StdSearchListView()
@ -127,3 +134,60 @@ StdTable* StdSearchListView::stdSearchList()
{
return mSearchListData->mSearchList;
}
void StdSearchListView::mouseMoveSlot(QMouseEvent* event)
{
StdTable* that;
that = qobject_cast<StdTable*>(sender());
if(that)
{
int column = that->getColumnIndexFromX(event->x());
int row = that->getIndexOffsetFromY(that->transY(event->y()));
duint addr = 0;
if(row < that->getRowCount())
{
bool ok = false;
QString addrStr = that->getCellContent(row, column);
GuiAddStatusBarMessage((addrStr + "\n").toUtf8().constData());
#ifdef _WIN64
addr = addrStr.toULongLong(&ok, 16);
#else //x86
addr = addrStr.toULong(&ok, 16);
#endif //_WIN64
if(ok && DbgFunctions()->MemIsCodePage(addr, false))
ShowDisassemblyPopup(addr, event->x(), event->y());
else //not a code section, clear addr to reset default behaviour
addr = 0;
}
ShowDisassemblyPopup(addr, event->x(), event->y());
}
else
ShowDisassemblyPopup(0, 0, 0);
}
void StdSearchListView::leaveEvent(QEvent* event)
{
ShowDisassemblyPopup(0, 0, 0);
}
void StdSearchListView::ShowDisassemblyPopup(duint addr, int x, int y)
{
if(!addr)
{
if(mDisassemblyPopup)
mDisassemblyPopup->hide();
return;
}
if(!mDisassemblyPopup)
mDisassemblyPopup = new DisassemblyPopup(this);
if(mDisassemblyPopup->getAddress() == addr)
return;
if(DbgFunctions()->MemIsCodePage(addr, false))
{
mDisassemblyPopup->move(mapToGlobal(QPoint(x + 20, y + stdList()->fontMetrics().height() * 2)));
mDisassemblyPopup->setAddress(addr);
mDisassemblyPopup->show();
}
else
mDisassemblyPopup->hide();
}

View File

@ -3,6 +3,7 @@
#include "SearchListView.h"
#include "StdTable.h"
class DisassemblyPopup;
class StdTableSearchList;
@ -26,15 +27,32 @@ public slots:
void setCellContent(int r, int c, QString s);
void reloadData();
void setSearchStartCol(int col);
void mouseMoveSlot(QMouseEvent* event);
private:
StdTableSearchList* mSearchListData;
DisassemblyPopup* mDisassemblyPopup;
void leaveEvent(QEvent* event);
protected:
friend class SymbolView;
friend class Bridge;
StdTable* stdList();
StdTable* stdSearchList();
void ShowDisassemblyPopup(duint addr, int x, int y);
};
//Hacked class to recieve mouse move event. This class must be placed in a header file, otherwise Qt won't create its internal functions.
class StdTableMouseMove : public StdTable
{
Q_OBJECT
public:
explicit StdTableMouseMove(QWidget* parent = 0) : StdTable(parent) { }
void mouseMoveEvent(QMouseEvent* event);
//int fontHeight() const {return mFontMetrics->height();}
signals:
void mouseMoveSignal(QMouseEvent* event);
};
#endif // STDSEARCHLISTVIEW_H

View File

@ -91,7 +91,7 @@ void CallStackView::updateCallStack()
setCellContent(i, 5, tr("System"));
break;
default:
setCellContent(i, 5, QString("%1").arg(party));
setCellContent(i, 5, QString::number(party));
break;
}
}