1
0
Fork 0

GUI: fix negative zero floating point display (#2058)

* GUI: make StringUtil void* buffer functions const-correct

* GUI: add precision support to ToFloatString and ToDoubleString

* GUI: fix -0.0 float display by converting with STL instead of QString::number
This commit is contained in:
Bálint Faragó 2018-11-02 16:35:13 +01:00 committed by Torusrxxx
parent de678aec21
commit eef5d07c30
5 changed files with 22 additions and 20 deletions

View File

@ -363,7 +363,7 @@ void EditFloatRegister::reloadFloatData(QLineEdit & txtbox, char* Data)
{ {
if(mutex != &txtbox) if(mutex != &txtbox)
{ {
txtbox.setText(QString().number(*(float*)Data)); txtbox.setText(ToFloatString(Data));
} }
} }
@ -371,7 +371,7 @@ void EditFloatRegister::reloadDoubleData(QLineEdit & txtbox, char* Data)
{ {
if(mutex != &txtbox) if(mutex != &txtbox)
{ {
txtbox.setText(QString().number(*(double*)Data)); txtbox.setText(ToDoubleString(Data));
} }
} }

View File

@ -1662,18 +1662,20 @@ static QString composeRegTextXMM(const char* value, RegistersView::SIMD_REG_DISP
{ {
const double* dbl_values = reinterpret_cast<const double*>(value); const double* dbl_values = reinterpret_cast<const double*>(value);
if(bFpuRegistersLittleEndian) if(bFpuRegistersLittleEndian)
valueText = QString::number(dbl_values[0]) + ' ' + QString::number(dbl_values[1]); valueText = ToDoubleString(&dbl_values[0]) + ' ' + ToDoubleString(&dbl_values[1]);
else // Big Endian else // Big Endian
valueText = QString::number(dbl_values[1]) + ' ' + QString::number(dbl_values[0]); valueText = ToDoubleString(&dbl_values[1]) + ' ' + ToDoubleString(&dbl_values[0]);
} }
break; break;
case RegistersView::SIMD_REG_DISP_FLOAT: case RegistersView::SIMD_REG_DISP_FLOAT:
{ {
const float* flt_values = reinterpret_cast<const float*>(value); const float* flt_values = reinterpret_cast<const float*>(value);
if(bFpuRegistersLittleEndian) if(bFpuRegistersLittleEndian)
valueText = QString::number(flt_values[0]) + ' ' + QString::number(flt_values[1]) + ' ' + QString::number(flt_values[2]) + ' ' + QString::number(flt_values[3]); valueText = ToFloatString(&flt_values[0]) + ' ' + ToFloatString(&flt_values[1]) + ' '
+ ToFloatString(&flt_values[2]) + ' ' + ToFloatString(&flt_values[3]);
else // Big Endian else // Big Endian
valueText = QString::number(flt_values[3]) + ' ' + QString::number(flt_values[2]) + ' ' + QString::number(flt_values[1]) + ' ' + QString::number(flt_values[0]); valueText = ToFloatString(&flt_values[3]) + ' ' + ToFloatString(&flt_values[2]) + ' '
+ ToFloatString(&flt_values[1]) + ' ' + ToFloatString(&flt_values[0]);
} }
break; break;
case RegistersView::SIMD_REG_DISP_WORD_HEX: case RegistersView::SIMD_REG_DISP_WORD_HEX:

View File

@ -51,7 +51,7 @@ void WatchView::updateWatch()
break; break;
case WATCHVARTYPE::TYPE_FLOAT: case WATCHVARTYPE::TYPE_FLOAT:
setCellContent(i, 3, "FLOAT"); setCellContent(i, 3, "FLOAT");
setCellContent(i, 2, QString::number(*(float*)&WatchList[i].value)); setCellContent(i, 2, ToFloatString(&WatchList[i].value));
break; break;
case WATCHVARTYPE::TYPE_ASCII: case WATCHVARTYPE::TYPE_ASCII:
setCellContent(i, 3, "ASCII"); setCellContent(i, 3, "ASCII");

View File

@ -4,7 +4,7 @@
#include "MiscUtil.h" #include "MiscUtil.h"
#include "ldconvert.h" #include "ldconvert.h"
QString ToLongDoubleString(void* buffer) QString ToLongDoubleString(const void* buffer)
{ {
char str[32]; char str[32];
ld2str(buffer, str); ld2str(buffer, str);
@ -40,7 +40,7 @@ QString EscapeCh(QChar ch)
} }
} }
QString GetDataTypeString(void* buffer, duint size, ENCODETYPE type) QString GetDataTypeString(const void* buffer, duint size, ENCODETYPE type)
{ {
switch(type) switch(type)
{ {

View File

@ -71,36 +71,36 @@ inline QString ToWordString(unsigned short Value)
} }
template<typename T> template<typename T>
inline QString ToFloatingString(void* buffer) inline QString ToFloatingString(const void* buffer, int precision)
{ {
auto value = *(T*)buffer; auto value = *(const T*)buffer;
std::stringstream wFloatingStr; std::stringstream wFloatingStr;
wFloatingStr << std::setprecision(std::numeric_limits<T>::digits10) << value; wFloatingStr << std::setprecision(precision) << value;
return QString::fromStdString(wFloatingStr.str()); return QString::fromStdString(wFloatingStr.str());
} }
template<typename T> template<typename T>
inline QString ToIntegralString(void* buffer) inline QString ToIntegralString(const void* buffer)
{ {
auto value = *(T*)buffer; auto value = *(const T*)buffer;
return ToLongLongHexString(value); return ToLongLongHexString(value);
} }
inline QString ToFloatString(void* buffer) inline QString ToFloatString(const void* buffer, int precision = std::numeric_limits<float>::digits10)
{ {
return ToFloatingString<float>(buffer); return ToFloatingString<float>(buffer, precision);
} }
inline QString ToDoubleString(void* buffer) inline QString ToDoubleString(const void* buffer, int precision = std::numeric_limits<double>::digits10)
{ {
return ToFloatingString<double>(buffer); return ToFloatingString<double>(buffer, precision);
} }
QString ToLongDoubleString(void* buffer); QString ToLongDoubleString(const void* buffer);
QString ToDateString(const QDate & date); QString ToDateString(const QDate & date);
QString GetDataTypeString(void* buffer, duint size, ENCODETYPE type); QString GetDataTypeString(const void* buffer, duint size, ENCODETYPE type);
inline QDate GetCompileDate() inline QDate GetCompileDate()
{ {