Properly handle nick hilights by only hilighting the first occurance
This commit is contained in:
parent
2cb5b2ccae
commit
b5e0585302
164
src/main.ino
164
src/main.ino
@ -21,8 +21,8 @@
|
||||
#define MAX_LINES ((SCREEN_HEIGHT - INPUT_LINE_HEIGHT - STATUS_BAR_HEIGHT) / (CHAR_HEIGHT + LINE_SPACING))
|
||||
|
||||
#define BOARD_BAT_ADC 4 // Define the ADC pin used for battery reading
|
||||
#define CONV_FACTOR 1.8 // Conversion factor for the ADC to voltage conversion
|
||||
#define READS 20 // Number of readings for averaging
|
||||
#define CONV_FACTOR 1.8 // Conversion factor for the ADC to voltage conversion
|
||||
#define READS 20 // Number of readings for averaging
|
||||
Pangodream_18650_CL BL(BOARD_BAT_ADC, CONV_FACTOR, READS);
|
||||
|
||||
TFT_eSPI tft = TFT_eSPI();
|
||||
@ -89,6 +89,83 @@ void setup() {
|
||||
nick = "ACID_" + String(randomNum);
|
||||
}
|
||||
|
||||
int renderFormattedMessage(String message, int cursorY, int lineHeight, bool highlightNick = false) {
|
||||
uint16_t fgColor = TFT_WHITE;
|
||||
uint16_t bgColor = TFT_BLACK;
|
||||
bool bold = false;
|
||||
bool underline = false;
|
||||
bool nickHighlighted = false; // Track if the nick has been highlighted
|
||||
|
||||
for (unsigned int i = 0; i < message.length(); i++) {
|
||||
char c = message[i];
|
||||
if (c == '\x02') { // Bold
|
||||
bold = !bold;
|
||||
tft.setTextFont(bold ? 2 : 1);
|
||||
} else if (c == '\x1F') { // Underline
|
||||
underline = !underline;
|
||||
// need to add this still
|
||||
} else if (c == '\x03') { // Color
|
||||
fgColor = TFT_WHITE;
|
||||
bgColor = TFT_BLACK;
|
||||
|
||||
if (i + 1 < message.length() && (isdigit(message[i + 1]) || message[i + 1] == ',')) {
|
||||
int colorCode = -1;
|
||||
if (isdigit(message[i + 1])) {
|
||||
colorCode = message[++i] - '0';
|
||||
if (i + 1 < message.length() && isdigit(message[i + 1]))
|
||||
colorCode = colorCode * 10 + (message[++i] - '0');
|
||||
}
|
||||
|
||||
if (colorCode != -1)
|
||||
fgColor = getColorFromCode(colorCode);
|
||||
|
||||
if (i + 1 < message.length() && message[i + 1] == ',') {
|
||||
i++;
|
||||
int bgColorCode = -1;
|
||||
if (isdigit(message[i + 1])) {
|
||||
bgColorCode = message[++i] - '0';
|
||||
if (i + 1 < message.length() && isdigit(message[i + 1]))
|
||||
bgColorCode = bgColorCode * 10 + (message[++i] - '0');
|
||||
}
|
||||
|
||||
if (bgColorCode != -1)
|
||||
bgColor = getColorFromCode(bgColorCode);
|
||||
|
||||
}
|
||||
|
||||
tft.setTextColor(fgColor, bgColor);
|
||||
}
|
||||
} else if (c == '\x0F') { // Reset
|
||||
fgColor = TFT_WHITE;
|
||||
bgColor = TFT_BLACK;
|
||||
bold = false;
|
||||
underline = false;
|
||||
tft.setTextColor(fgColor, bgColor);
|
||||
tft.setTextFont(1);
|
||||
} else {
|
||||
if (highlightNick && !nickHighlighted && message.substring(i).startsWith(nick)) {
|
||||
tft.setTextColor(TFT_YELLOW);
|
||||
for (char nc : nick) {
|
||||
tft.print(nc);
|
||||
i++;
|
||||
}
|
||||
i--; // Adjust for the loop increment
|
||||
tft.setTextColor(TFT_WHITE);
|
||||
nickHighlighted = true;
|
||||
} else {
|
||||
if (tft.getCursorX() + tft.textWidth(String(c)) > SCREEN_WIDTH) {
|
||||
cursorY += lineHeight;
|
||||
tft.setCursor(0, cursorY);
|
||||
}
|
||||
tft.print(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cursorY += lineHeight; // Add line height after printing the message
|
||||
return cursorY; // Return the new cursor Y position for the next line
|
||||
}
|
||||
|
||||
void displayLines() {
|
||||
tft.fillRect(0, STATUS_BAR_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - STATUS_BAR_HEIGHT - INPUT_LINE_HEIGHT, TFT_BLACK);
|
||||
|
||||
@ -179,17 +256,9 @@ void displayLines() {
|
||||
// Check if the message contains the nick and highlight it
|
||||
int nickPos = message.indexOf(nick);
|
||||
if (mention && nickPos != -1) {
|
||||
// Print part before the nick
|
||||
tft.print(message.substring(0, nickPos));
|
||||
// Print the nick in yellow
|
||||
tft.setTextColor(TFT_YELLOW);
|
||||
tft.print(nick);
|
||||
// Print the part after the nick
|
||||
tft.setTextColor(TFT_WHITE);
|
||||
tft.print(message.substring(nickPos + nick.length()));
|
||||
cursorY += CHAR_HEIGHT; // Ensure cursor moves to the next line after the highlighted message
|
||||
cursorY = renderFormattedMessage(message, cursorY, CHAR_HEIGHT, true);
|
||||
} else {
|
||||
cursorY = renderFormattedMessage(message, cursorY, CHAR_HEIGHT);
|
||||
cursorY = renderFormattedMessage(message, cursorY, CHAR_HEIGHT, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -198,9 +267,6 @@ void displayLines() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void addLine(String senderNick, String message, String type, bool mention = false) {
|
||||
if (nickColors.find(senderNick) == nickColors.end())
|
||||
nickColors[senderNick] = generateRandomColor();
|
||||
@ -455,72 +521,6 @@ void displayCenteredText(String text) {
|
||||
tft.drawString(text, SCREEN_WIDTH / 2, (SCREEN_HEIGHT + STATUS_BAR_HEIGHT) / 2);
|
||||
}
|
||||
|
||||
int renderFormattedMessage(String message, int cursorY, int lineHeight) {
|
||||
uint16_t fgColor = TFT_WHITE;
|
||||
uint16_t bgColor = TFT_BLACK;
|
||||
bool bold = false;
|
||||
bool underline = false;
|
||||
|
||||
for (unsigned int i = 0; i < message.length(); i++) {
|
||||
char c = message[i];
|
||||
if (c == '\x02') { // Bold
|
||||
bold = !bold;
|
||||
tft.setTextFont(bold ? 2 : 1);
|
||||
} else if (c == '\x1F') { // Underline
|
||||
underline = !underline;
|
||||
// need to add this still
|
||||
} else if (c == '\x03') { // Color
|
||||
fgColor = TFT_WHITE;
|
||||
bgColor = TFT_BLACK;
|
||||
|
||||
if (i + 1 < message.length() && (isdigit(message[i + 1]) || message[i + 1] == ',')) {
|
||||
int colorCode = -1;
|
||||
if (isdigit(message[i + 1])) {
|
||||
colorCode = message[++i] - '0';
|
||||
if (i + 1 < message.length() && isdigit(message[i + 1]))
|
||||
colorCode = colorCode * 10 + (message[++i] - '0');
|
||||
}
|
||||
|
||||
if (colorCode != -1)
|
||||
fgColor = getColorFromCode(colorCode);
|
||||
|
||||
if (i + 1 < message.length() && message[i + 1] == ',') {
|
||||
i++;
|
||||
int bgColorCode = -1;
|
||||
if (isdigit(message[i + 1])) {
|
||||
bgColorCode = message[++i] - '0';
|
||||
if (i + 1 < message.length() && isdigit(message[i + 1]))
|
||||
bgColorCode = bgColorCode * 10 + (message[++i] - '0');
|
||||
}
|
||||
|
||||
if (bgColorCode != -1)
|
||||
bgColor = getColorFromCode(bgColorCode);
|
||||
|
||||
}
|
||||
|
||||
tft.setTextColor(fgColor, bgColor);
|
||||
}
|
||||
} else if (c == '\x0F') { // Reset
|
||||
fgColor = TFT_WHITE;
|
||||
bgColor = TFT_BLACK;
|
||||
bold = false;
|
||||
underline = false;
|
||||
tft.setTextColor(fgColor, bgColor);
|
||||
tft.setTextFont(1);
|
||||
} else {
|
||||
if (tft.getCursorX() + tft.textWidth(String(c)) > SCREEN_WIDTH) {
|
||||
cursorY += lineHeight;
|
||||
tft.setCursor(0, cursorY);
|
||||
}
|
||||
tft.print(c);
|
||||
}
|
||||
}
|
||||
|
||||
cursorY += lineHeight; // Add line height after printing the message
|
||||
return cursorY; // Return the new cursor Y position for the next line
|
||||
}
|
||||
|
||||
|
||||
int calculateLinesRequired(String message) {
|
||||
int linesRequired = 1;
|
||||
int lineWidth = 0;
|
||||
@ -746,7 +746,7 @@ uint16_t getColorFromPercentage(int rssi) {
|
||||
|
||||
void updateTimeFromNTP() {
|
||||
configTime(-5 * 3600, 0, "pool.ntp.org", "time.nist.gov");
|
||||
delay(2000);
|
||||
delay(2000); // Wait for NTP to sync
|
||||
struct tm timeinfo;
|
||||
if (getLocalTime(&timeinfo)) {
|
||||
Serial.println(&timeinfo, "Time synchronized: %A, %B %d %Y %H:%M:%S");
|
||||
|
Loading…
Reference in New Issue
Block a user