1
0
Fork 0

GUI: make more methods thread safe in AbstractTableView

This commit is contained in:
Duncan Ogilvie 2020-02-10 02:31:48 +01:00
parent 992e6d2374
commit a75cc25710
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
1 changed files with 46 additions and 24 deletions

View File

@ -6,6 +6,7 @@
#include "Bridge.h"
#include "DisassemblyPopup.h"
#include <windows.h>
#include "MethodInvoker.h"
int AbstractTableView::mMouseWheelScrollDelta = 0;
@ -828,8 +829,8 @@ dsint AbstractTableView::scaleFromScrollBarRangeToUint64(int value)
*/
void AbstractTableView::updateScrollBarRange(dsint range)
{
int viewableRowsCount = getViewableRowsCount();
dsint wMax = range - viewableRowsCount + 1;
dsint wMax = range - getViewableRowsCount() + 1;
int rangeMin = 0, rangeMax = wMax;
if(wMax > 0)
{
@ -838,7 +839,8 @@ void AbstractTableView::updateScrollBarRange(dsint range)
{
mScrollBarAttributes.is64 = false;
mScrollBarAttributes.rightShiftCount = 0;
verticalScrollBar()->setRange(0, wMax);
rangeMin = 0;
rangeMax = wMax;
}
else
{
@ -860,16 +862,25 @@ void AbstractTableView::updateScrollBarRange(dsint range)
mScrollBarAttributes.is64 = true;
mScrollBarAttributes.rightShiftCount = 32 - wLeadingZeroCount;
verticalScrollBar()->setRange(0, 0x7FFFFFFF);
rangeMin = 0;
rangeMax = 0x7FFFFFFF;
}
#else
verticalScrollBar()->setRange(0, wMax);
rangeMin = 0;
rangeMax = wMax;
#endif
}
else
verticalScrollBar()->setRange(0, 0);
verticalScrollBar()->setSingleStep(getRowHeight());
verticalScrollBar()->setPageStep(viewableRowsCount * getRowHeight());
{
rangeMin = 0;
rangeMax = 0;
}
MethodInvoker::invokeMethod([this, rangeMin, rangeMax]
{
verticalScrollBar()->setRange(rangeMin, rangeMax);
verticalScrollBar()->setSingleStep(getRowHeight());
verticalScrollBar()->setPageStep(getViewableRowsCount() * getRowHeight());
});
}
/************************************************************************************
@ -1128,16 +1139,20 @@ void AbstractTableView::setColumnHidden(int col, bool hidden)
void AbstractTableView::setColumnWidth(int index, int width)
{
int totalWidth = 0;
for(int i = 0; i < getColumnCount(); i++)
if(!getColumnHidden(i))
totalWidth += getColumnWidth(i);
if(totalWidth > this->viewport()->width())
horizontalScrollBar()->setRange(0, totalWidth - this->viewport()->width());
else
horizontalScrollBar()->setRange(0, 0);
mColumnList[index].width = width;
MethodInvoker::invokeMethod([this]()
{
int totalWidth = 0;
for(int i = 0; i < getColumnCount(); i++)
if(!getColumnHidden(i))
totalWidth += getColumnWidth(i);
if(totalWidth > viewport()->width())
horizontalScrollBar()->setRange(0, totalWidth - viewport()->width());
else
horizontalScrollBar()->setRange(0, 0);
});
}
void AbstractTableView::setColumnOrder(int pos, int index)
@ -1236,14 +1251,18 @@ void AbstractTableView::setTableOffset(dsint val)
emit tableOffsetChanged(val);
MethodInvoker::invokeMethod([this]()
{
#ifdef _WIN64
int wNewValue = scaleFromUint64ToScrollBarRange(mTableOffset);
verticalScrollBar()->setValue(wNewValue);
verticalScrollBar()->setSliderPosition(wNewValue);
int wNewValue = scaleFromUint64ToScrollBarRange(mTableOffset);
verticalScrollBar()->setValue(wNewValue);
verticalScrollBar()->setSliderPosition(wNewValue);
#else
verticalScrollBar()->setValue(val);
verticalScrollBar()->setSliderPosition(val);
verticalScrollBar()->setValue(mTableOffset);
verticalScrollBar()->setSliderPosition(mTableOffset);
#endif
});
}
@ -1254,12 +1273,15 @@ void AbstractTableView::reloadData()
{
mShouldReload = true;
emit tableOffsetChanged(mTableOffset);
this->viewport()->update();
updateViewport();
}
void AbstractTableView::updateViewport()
{
this->viewport()->update();
MethodInvoker::invokeMethod([this]()
{
viewport()->update();
});
}
/**