acid-drop

- Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.acid.vegas/-c.git
Log | Files | Refs | Archive | README | LICENSE

commit b5e05853024eaf86eea3a8aace79d6ae238d5155
parent 2cb5b2ccae5f2c7525f3d00f19f1ce5430bf1258
Author: acidvegas <acid.vegas@acid.vegas>
Date: Sat, 25 May 2024 23:49:13 -0400

Properly handle nick hilights by only hilighting the first occurance

Diffstat:
Msrc/main.ino | 164++++++++++++++++++++++++++++++++++++++++----------------------------------------

1 file changed, 82 insertions(+), 82 deletions(-)

diff --git a/src/main.ino b/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");