Fix drawTextRalign(): avoid wobbling when DSEG italic font is used

This commit is contained in:
Ulrich Meine
2026-08-12 23:02:49 +02:00
parent aebc18a75d
commit 50dc5955a0
3 changed files with 148 additions and 143 deletions
+22 -6
View File
@@ -572,16 +572,32 @@ void drawButtonCenter(int16_t cx, int16_t cy, int8_t sx, int8_t sy, String text,
}
// Draw right aligned text
void drawTextRalign(int16_t x, int16_t y, String text) {
int16_t x1, y1;
uint16_t w, h;
// int16_t x - upper right x position for text to start printing
// int16_t y - upper right y position for text to start printing
// const String& text - text to be printed
// bool dsegAdjust = false - optional, for adjustment of DSEG italic font
void drawTextRalign(int16_t x, int16_t y, const String& text, bool dsegAdjust)
{
int16_t x1 = 0, y1 = 0;
uint16_t w = 0, h = 0;
String str = text;
// make sure that we always have a char with max size at last position for boundary test
// to avoid text wobbling of DSEG italic font
if (dsegAdjust && str.length() > 0 && isDigit(str[str.length() - 1])) {
str.setCharAt(str.length() - 1, '8');
}
#ifdef TFT_DISPLAY
w = getdisplay().textWidth(text);
w = getdisplay().textWidth(str);
h = getdisplay().fontHeight();
#else
getdisplay().getTextBounds(text, 0, 150, &x1, &y1, &w, &h);
getdisplay().getTextBounds(str, 0, y, &x1, &y1, &w, &h);
#endif
getdisplay().setCursor(x - w - 1, y); // '-1' required since some strings wrap around w/o it
int16_t cursorX = x - x1 - w;
getdisplay().setCursor(cursorX, y);
// getdisplay().setCursor(x - w - 1, y); // '-1' required since some strings wrap around w/o it
getdisplay().print(text);
}
+1 -1
View File
@@ -734,7 +734,7 @@ String xdrDelete(String input); // Delete xdr prefix from string
void drawTextCenter(int16_t cx, int16_t cy, String text);
void drawButtonCenter(int16_t cx, int16_t cy, int8_t sx, int8_t sy, String text, uint16_t fg, uint16_t bg, bool inverted);
void drawTextRalign(int16_t x, int16_t y, String text);
void drawTextRalign(int16_t x, int16_t y, const String& text, bool dsegAdjust = false);
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border);
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
+16 -27
View File
@@ -6,21 +6,21 @@
const int SixValues_x1 = 5;
const int SixValues_DeltaX = 200;
// const int SixValues_y1 = 23;
const int SixValues_y1 = 22;
const int SixValues_DeltaY = 83;
const int HowManyValues = 6;
class PageSixValues : public Page
{
class PageSixValues : public Page {
public:
PageSixValues(CommonData &common){
PageSixValues(CommonData& common)
{
commonData = &common;
common.logger->logDebug(GwLog::LOG, "Instantiate PageSixValues");
}
virtual int handleKey(int key){
virtual int handleKey(int key)
{
// Code for keylock
if (key == 11) {
commonData->keylock = !commonData->keylock;
@@ -29,18 +29,17 @@ class PageSixValues : public Page
return key;
}
int displayPage(PageData &pageData){
int displayPage(PageData& pageData)
{
GwConfigHandler* config = commonData->config;
GwLog* logger = commonData->logger;
// Old values for hold function
static String OldDataText[HowManyValues] = { "", "", "", "", "", "" };
static String OldDataUnits[HowManyValues] = { "", "", "", "", "", "" };
// Get config data
String lengthformat = config->getString(config->lengthFormat);
// bool simulation = config->getBool(config->useSimuData);
bool holdvalues = config->getBool(config->holdvalues);
String flashLED = config->getString(config->flashLED);
String backlightMode = config->getString(config->backlight);
@@ -70,7 +69,8 @@ class PageSixValues : public Page
setFlashLED(false);
}
if (bvalue == NULL) return PAGE_OK; // WTF why this statement?
if (bvalue == NULL)
return PAGE_OK;
// Draw page
//***********************************************************
@@ -99,44 +99,33 @@ class PageSixValues : public Page
getdisplay().setFont(&Ubuntu_Bold8pt8b);
if (holdvalues == false) {
drawTextRalign(x0 + 187, y0 + 19, DataUnits[ValueIndex]); // Unit
}
else{
} else {
drawTextRalign(x0 + 187, y0 + 19, OldDataUnits[ValueIndex]);
}
// Switch font depending on data type
if (DataFormat[ValueIndex] == "formatLatitude" || DataFormat[ValueIndex] == "formatLongitude") {
getdisplay().setFont(&Ubuntu_Bold12pt8b);
getdisplay().setCursor(x0+21, y0+60);
}
else if(DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate"){
} else if (DataFormat[ValueIndex] == "formatTime" || DataFormat[ValueIndex] == "formatDate") {
getdisplay().setFont(&Ubuntu_Bold16pt8b);
getdisplay().setCursor(x0+23,y0+55);
}
// pressure in hPa
else if (DataFormat[ValueIndex] == "formatXdr:P:P") {
getdisplay().setFont(&DSEG7Classic_BoldItalic26pt7b);
getdisplay().setCursor(x0+23, y0+79);
}
// RPM
else if (DataFormat[ValueIndex] == "formatXdr:T:R") {
getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b);
getdisplay().setCursor(x0+23, y0+79);
}
else {
getdisplay().setFont(&DSEG7Classic_BoldItalic26pt7b);
if ( DataText[ValueIndex][0] == '-' )
getdisplay().setCursor(x0+23, y0+79);
else
getdisplay().setCursor(x0+65, y0+79);
}
// Show bus data
if (holdvalues == false) {
getdisplay().print(DataText[ValueIndex]); // Real value as formated string
}
else{
getdisplay().print(OldDataText[ValueIndex]); // Old value as formated string
drawTextRalign(x0 + 187, y0 + 79, DataText[ValueIndex], true); // Real value as formatted string
} else {
drawTextRalign(x0 + 187, y0 + 79, OldDataText[ValueIndex], true); // Old value as formatted string
}
if (DataValid[ValueIndex] == true) {
OldDataText[ValueIndex] = DataText[ValueIndex]; // Save the old value
@@ -149,9 +138,9 @@ class PageSixValues : public Page
return PAGE_UPDATE;
};
};
static Page *createPage(CommonData &common){
static Page* createPage(CommonData& common)
{
return new PageSixValues(common);
} /**
* with the code below we make this page known to the PageTask