fixed bug with broken text area content when editing envelope text
authorHolger Schemel <info@artsoft.org>
Sat, 11 Jun 2022 10:32:42 +0000 (12:32 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 11 Jun 2022 10:32:42 +0000 (12:32 +0200)
src/libgame/gadgets.c
src/libgame/text.c
src/libgame/text.h
src/tools.c

index a8d3e55c35460abe482e076e4e165a2a5915b7a4..fcfd235e509fa07a37a8ade24c17a3e2e6c90f81 100644 (file)
@@ -423,9 +423,9 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
                                   gi->height - 2 * border_y);
 
        // gadget text value
-       DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value,
-                      font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, 0,
-                      BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE);
+       DrawTextArea(gi->x + border_x, gi->y + border_y, gi->textarea.value,
+                    font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, 0,
+                    BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE);
 
        cursor_letter = gi->textarea.value[gi->textarea.cursor_position];
        cursor_string[0] = (cursor_letter != '\0' ? cursor_letter : ' ');
index eb36ab2285a47c42e0f8394e49a4d7850d419cf2..e198c81033421dfd6dadf55b95083a8b7ce7c42f 100644 (file)
@@ -506,10 +506,11 @@ static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr,
     DrawText(xx, yy, buffer, font_nr);
 }
 
-int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
-                  int line_length, int cut_length, int max_lines,
-                  int line_spacing, int mask_mode, boolean autowrap,
-                  boolean centered, boolean parse_comments)
+static int DrawTextBufferExt(int x, int y, char *text_buffer, int font_nr,
+                            int line_length, int cut_length, int max_lines,
+                            int line_spacing, int mask_mode, boolean autowrap,
+                            boolean centered, boolean parse_comments,
+                            boolean is_text_area)
 {
   char buffer[line_length + 1];
   int buffer_len;
@@ -541,8 +542,16 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
 
     // copy next line from text buffer to line buffer (nearly fgets() style)
     for (i = 0; i < num_line_chars && *text_buffer; i++)
+    {
       if ((line[i] = *text_buffer++) == '\n')
+      {
+       // in text areas, 'line_length' sized lines cause additional empty line
+       if (i == line_length && is_text_area)
+         text_buffer--;
+
        break;
+      }
+    }
     line[i] = '\0';
 
     // prevent 'num_line_chars' sized lines to cause additional empty line
@@ -655,6 +664,28 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
   return current_line;
 }
 
+int DrawTextArea(int x, int y, char *text_buffer, int font_nr,
+                int line_length, int cut_length, int max_lines,
+                int line_spacing, int mask_mode, boolean autowrap,
+                boolean centered, boolean parse_comments)
+{
+  return DrawTextBufferExt(x, y, text_buffer, font_nr,
+                          line_length, cut_length, max_lines,
+                          line_spacing, mask_mode, autowrap,
+                          centered, parse_comments, TRUE);
+}
+
+int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
+                  int line_length, int cut_length, int max_lines,
+                  int line_spacing, int mask_mode, boolean autowrap,
+                  boolean centered, boolean parse_comments)
+{
+  return DrawTextBufferExt(x, y, text_buffer, font_nr,
+                          line_length, cut_length, max_lines,
+                          line_spacing, mask_mode, autowrap,
+                          centered, parse_comments, FALSE);
+}
+
 int DrawTextBufferS(int x, int y, char *text_buffer, int font_nr,
                    int line_length, int cut_length, int max_lines,
                    int line_spacing, int mask_mode, boolean autowrap,
index ff73c714739ccff1cbbdbe265b51c236137da3a2..fff639f65f172df112141bcc544bfb4b38f16dab 100644 (file)
@@ -105,6 +105,8 @@ void DrawText(int, int, char *, int);
 void DrawTextExt(DrawBuffer *, int, int, char *, int, int);
 
 char *GetTextBufferFromFile(char *, int);
+int DrawTextArea(int, int, char *, int, int, int, int, int, int,
+                boolean, boolean, boolean);
 int DrawTextBuffer(int, int, char *, int, int, int, int, int, int,
                   boolean, boolean, boolean);
 int DrawTextBufferS(int, int, char *, int, int, int, int, int, int,
index f3f6a33bee60f968357a43a00d22eccc0db4cdf9..bb6668d132352245bea54c643be154ea6c1b6ed3 100644 (file)
@@ -2925,11 +2925,11 @@ static void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
       for (xx = 0; xx < xsize; xx++)
        DrawEnvelopeBackground(graphic, sx, sy, xx, yy, xsize, ysize, font_nr);
 
-    DrawTextBuffer(sx + font_width, sy + font_height,
-                  level.envelope[envelope_nr].text, font_nr, max_xsize,
-                  xsize - 2, ysize - 2, 0, mask_mode,
-                  level.envelope[envelope_nr].autowrap,
-                  level.envelope[envelope_nr].centered, FALSE);
+    DrawTextArea(sx + font_width, sy + font_height,
+                level.envelope[envelope_nr].text, font_nr, max_xsize,
+                xsize - 2, ysize - 2, 0, mask_mode,
+                level.envelope[envelope_nr].autowrap,
+                level.envelope[envelope_nr].centered, FALSE);
 
     redraw_mask |= REDRAW_FIELD;
     BackToFront();