Disassembly popup in references
This commit is contained in:
parent
cf1498786c
commit
6705ce1af3
|
|
@ -4,6 +4,7 @@
|
|||
#include <QProgressBar>
|
||||
#include <QLabel>
|
||||
#include "StdSearchListView.h"
|
||||
class DisassemblyPopup;
|
||||
|
||||
class QTabWidget;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue