Merge pull request #3291 from foralost/3280_Selection_shifts_MMap

#3280: Selection shifts when MemoryMap is updated
This commit is contained in:
Duncan Ogilvie 2024-08-24 19:57:00 +02:00 committed by GitHub
commit ab1f2938a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 71 additions and 8 deletions

View File

@ -1032,7 +1032,13 @@ void AbstractStdTable::headerButtonPressedSlot(duint col)
{
if(!mIsColumnSortingAllowed)
return;
if(mSort.column != col)
if(mSort.column == -1 && col == mAddressColumn)
{
mSort.column = col;
mSort.ascending = false;
}
else if(mSort.column != col)
{
mSort.column = col;
mSort.ascending = true;
@ -1040,6 +1046,8 @@ void AbstractStdTable::headerButtonPressedSlot(duint col)
else
mSort.ascending = !mSort.ascending;
reloadData();
emit sortChangedSignal();
}
void AbstractStdTable::reloadData()

View File

@ -76,6 +76,7 @@ signals:
void keyPressedSignal(QKeyEvent* event);
void doubleClickedSignal();
void contextMenuSignal(const QPoint & pos);
void sortChangedSignal();
public slots:
void copyLineSlot();

View File

@ -19,14 +19,14 @@ MemoryMapView::MemoryMapView(StdTable* parent)
{
setDrawDebugOnly(true);
enableMultiSelection(true);
setAddressColumn(ColAddress);
int charwidth = getCharWidth();
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 * 9, 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 * 2 * sizeof(duint), tr("Address"), true, tr("Address"), SortBy::AsHex); //addr
addColumnAt(8 + charwidth * 2 * sizeof(duint), tr("Size"), true, tr("Size"), SortBy::AsHex); //size
addColumnAt(charwidth * 9, tr("Party"), true); // party
addColumnAt(8 + charwidth * 32, tr("Info"), true, tr("Page Information")); //page information
addColumnAt(8 + charwidth * 28, tr("Content"), true, 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
@ -41,6 +41,8 @@ MemoryMapView::MemoryMapView(StdTable* parent)
connect(Bridge::getBridge(), SIGNAL(disassembleAt(duint, duint)), this, SLOT(disassembleAtSlot(duint, duint)));
connect(Bridge::getBridge(), SIGNAL(focusMemmap()), this, SLOT(setFocus()));
connect(this, SIGNAL(contextMenuSignal(QPoint)), this, SLOT(contextMenuSlot(QPoint)));
connect(this, SIGNAL(selectionChanged(duint)), this, SLOT(selectionChangedSlot(duint)));
connect(this, SIGNAL(sortChangedSignal()), this, SLOT(fixSelectionRangeSlot()));
setupContextMenu();
}
@ -196,6 +198,50 @@ void MemoryMapView::setupContextMenu()
connect(Config(), SIGNAL(shortcutsUpdated()), this, SLOT(refreshShortcutsSlot()));
}
void MemoryMapView::selectionChangedSlot(duint index)
{
Q_UNUSED(index);
mSelectionStart = getCellUserdata(mSelection.firstSelectedIndex, ColAddress);
mSelectionEnd = mSelectionStart + getCellUserdata(mSelection.firstSelectedIndex, ColSize);
mSelectionCount = mSelection.toIndex - mSelection.fromIndex;
mSelectionSort = mSort.column;
}
void MemoryMapView::fixSelectionRangeSlot()
{
for(duint row = 0; row < getRowCount(); row++)
{
auto start = getCellUserdata(row, ColAddress);
auto end = start + getCellUserdata(row, ColSize);
if(start == mSelectionStart && end == mSelectionEnd)
{
// Restore the selection
mSelection.firstSelectedIndex = row;
mSelection.fromIndex = mSelection.toIndex = row;
if(mSelectionSort == mSort.column)
{
mSelection.toIndex += mSelectionCount;
updateViewport();
}
else
{
// Scroll to the selected range when the sort changes
auto rangefrom = getTableOffset();
auto rangeto = rangefrom + getViewableRowsCount() - 1;
if(mSelection.fromIndex < rangefrom) //offset lays before the current view
setTableOffset(mSelection.fromIndex);
else if(mSelection.toIndex > (rangeto - 1)) //offset lays after the current view
setTableOffset(mSelection.toIndex - getViewableRowsCount() + 1);
else
updateViewport();
}
break;
}
}
}
void MemoryMapView::refreshShortcutsSlot()
{
mMemoryExecuteSingleshoot->setShortcut(ConfigShortcut("ActionToggleBreakpoint"));
@ -526,7 +572,9 @@ void MemoryMapView::refreshMapSlot()
}
if(memoryMap.page != 0)
BridgeFree(memoryMap.page);
reloadData(); //refresh memory map
fixSelectionRangeSlot();
}
void MemoryMapView::stateChangedSlot(DBGSTATE state)

View File

@ -16,6 +16,8 @@ signals:
void showReferences();
public slots:
void selectionChangedSlot(duint index);
void fixSelectionRangeSlot();
void refreshShortcutsSlot();
void stateChangedSlot(DBGSTATE state);
void followDumpSlot();
@ -105,5 +107,9 @@ private:
QAction* mReferences;
QMenu* mPluginMenu;
duint mCipBase;
duint mCipBase = 0;
duint mSelectionStart = 0;
duint mSelectionEnd = 0;
duint mSelectionCount = 0;
duint mSelectionSort = -1;
};