Color code editing
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 3 Aug 2015 16:24:24 +0000 (16:24 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 3 Aug 2015 16:24:24 +0000 (16:24 +0000)
Console edit line: make the color code visible when the cursor is inside it and r_font_disable_freetype is 0

From: terencehill <piuntn@gmail.com>

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12216 d7cf8633-e32d-0410-b094-e92efae38249

console.c
keys.c

index 1f5b30d..4337a73 100644 (file)
--- a/console.c
+++ b/console.c
@@ -1506,12 +1506,11 @@ The input line scrolls horizontally if typing goes beyond the right edge
 Modified by EvilTypeGuy eviltypeguy@qeradiant.com
 ================
 */
-extern cvar_t r_font_disable_freetype;
 static void Con_DrawInput (void)
 {
        int             y;
        int             i;
-       char editlinecopy[MAX_INPUTLINE+1], *text;
+       char text[sizeof(key_line)+5+1]; // space for ^^xRGB too
        float x, xo;
        size_t len_out;
        int col_out;
@@ -1519,48 +1518,46 @@ static void Con_DrawInput (void)
        if (!key_consoleactive)
                return;         // don't draw anything
 
-       strlcpy(editlinecopy, key_line, sizeof(editlinecopy));
-       text = editlinecopy;
+       strlcpy(text, key_line, sizeof(text));
 
        // Advanced Console Editing by Radix radix@planetquake.com
        // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
-       // use strlen of edit_line instead of key_linepos to allow editing
-       // of early characters w/o erasing
 
        y = (int)strlen(text);
 
-       // append enoug nul-bytes to cover the utf8-versions of the cursor too
-       for (i = y; i < y + 4 && i < (int)sizeof(editlinecopy); ++i)
-               text[i] = 0;
-
-       // add the cursor frame
-       if (r_font_disable_freetype.integer)
+       // make the color code visible when the cursor is inside it
+       if(text[key_linepos] != 0)
        {
-               // this code is freetype incompatible!
-               if ((int)(realtime*con_cursorspeed) & 1)                // cursor is visible
-               {
-                       if (!utf8_enable.integer)
-                               text[key_linepos] = 11 + 130 * key_insert;      // either solid or triangle facing right
-                       else if (y + 3 < (int)sizeof(editlinecopy)-1)
+               for(i=1; i < 5 && key_linepos - i > 0; ++i)
+                       if(text[key_linepos-i] == STRING_COLOR_TAG)
                        {
-                               int ofs = (int)u8_bytelen(text + key_linepos, 1);
-                               size_t len;
-                               const char *curbuf;
-                               char charbuf16[16];
-                               curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16);
-
-                               if (curbuf)
+                               int caret_pos, ofs = 0;
+                               caret_pos = key_linepos - i;
+                               if(i == 1 && text[caret_pos+1] == STRING_COLOR_TAG)
+                                       ofs = 1;
+                               else if(i == 1 && isdigit(text[caret_pos+1]))
+                                       ofs = 2;
+                               else if(text[caret_pos+1] == STRING_COLOR_RGB_TAG_CHAR && isxdigit(text[caret_pos+2]) && isxdigit(text[caret_pos+3]) && isxdigit(text[caret_pos+4]))
+                                       ofs = 5;
+                               if(ofs && (size_t)(y + ofs + 1) < sizeof(text))
                                {
-                                       memmove(text + key_linepos + len, text + key_linepos + ofs, sizeof(editlinecopy) - key_linepos - len);
-                                       memcpy(text + key_linepos, curbuf, len);
+                                       int carets = 1;
+                                       while(caret_pos - carets >= 1 && text[caret_pos - carets] == STRING_COLOR_TAG)
+                                               ++carets;
+                                       if(carets & 1)
+                                       {
+                                               // str^2ing (displayed as string) --> str^2^^2ing (displayed as str^2ing)
+                                               // str^^ing (displayed as str^ing) --> str^^^^ing (displayed as str^^ing)
+                                               memmove(&text[caret_pos + ofs + 1], &text[caret_pos], y - caret_pos);
+                                               text[caret_pos + ofs] = STRING_COLOR_TAG;
+                                               y += ofs + 1;
+                                               text[y] = 0;
+                                       }
                                }
-                       } else
-                               text[key_linepos] = '-' + ('+' - '-') * key_insert;
-               }
+                               break;
+                       }
        }
 
-//     text[key_linepos + 1] = 0;
-
        len_out = key_linepos;
        col_out = -1;
        xo = DrawQ_TextWidth_UntilWidth_TrackColors(text, &len_out, con_textsize.value, con_textsize.value, &col_out, false, FONT_CONSOLE, 1000000000);
@@ -1571,31 +1568,25 @@ static void Con_DrawInput (void)
        // draw it
        DrawQ_String(x, con_vislines - con_textsize.value*2, text, y + 3, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, FONT_CONSOLE );
 
-       // add a cursor on top of this (when using freetype)
-       if (!r_font_disable_freetype.integer)
+       // draw a cursor on top of this
+       if ((int)(realtime*con_cursorspeed) & 1)                // cursor is visible
        {
-               if ((int)(realtime*con_cursorspeed) & 1)                // cursor is visible
+               if (!utf8_enable.integer)
                {
-                       if (!utf8_enable.integer)
-                       {
-                               text[0] = 11 + 130 * key_insert;        // either solid or triangle facing right
-                               text[1] = 0;
-                       }
-                       else
-                       {
-                               size_t len;
-                               const char *curbuf;
-                               char charbuf16[16];
-                               curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16);
-                               memcpy(text, curbuf, len);
-                               text[len] = 0;
-                       }
-                       DrawQ_String(x + xo, con_vislines - con_textsize.value*2, text, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &col_out, false, FONT_CONSOLE);
+                       text[0] = 11 + 130 * key_insert;        // either solid or triangle facing right
+                       text[1] = 0;
                }
+               else
+               {
+                       size_t len;
+                       const char *curbuf;
+                       char charbuf16[16];
+                       curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16);
+                       memcpy(text, curbuf, len);
+                       text[len] = 0;
+               }
+               DrawQ_String(x + xo, con_vislines - con_textsize.value*2, text, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &col_out, false, FONT_CONSOLE);
        }
-
-       // remove cursor
-//     key_line[key_linepos] = 0;
 }
 
 typedef struct
diff --git a/keys.c b/keys.c
index 62db167..6022f6b 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -753,21 +753,6 @@ Key_Console (int key, int unicode)
                                i= MAX_INPUTLINE - key_linepos - 1;
                        if (i > 0)
                        {
-                               // terencehill: insert the clipboard text between the characters of the line
-                               /*
-                               char *temp = (char *) Z_Malloc(MAX_INPUTLINE);
-                               cbd[i]=0;
-                               temp[0]=0;
-                               if ( key_linepos < (int)strlen(key_line) )
-                                       strlcpy(temp, key_line + key_linepos, (int)strlen(key_line) - key_linepos +1);
-                               key_line[key_linepos] = 0;
-                               strlcat(key_line, cbd, sizeof(key_line));
-                               if (temp[0])
-                                       strlcat(key_line, temp, sizeof(key_line));
-                               Z_Free(temp);
-                               key_linepos += i;
-                               */
-                               // blub: I'm changing this to use memmove() like the rest of the code does.
                                cbd[i] = 0;
                                memmove(key_line + key_linepos + i, key_line + key_linepos, sizeof(key_line) - key_linepos - i);
                                memcpy(key_line + key_linepos, cbd, i);
@@ -1050,7 +1035,6 @@ Key_Console (int key, int unicode)
                Key_History_Down();
                return;
        }
-       // ~1.0795 = 82/76  using con_textsize 64 76 is height of the char, 6 is the distance between 2 lines
 
        if (keydown[K_CTRL])
        {
@@ -1186,24 +1170,21 @@ Key_Console (int key, int unicode)
                // check insert mode, or always insert if at end of line
                if (key_insert || len == 0)
                {
+                       if (key_linepos + len + blen >= MAX_INPUTLINE)
+                               return;
                        // can't use strcpy to move string to right
                        len++;
-                       //memmove(&key_line[key_linepos + u8_bytelen(key_line + key_linepos, 1)], &key_line[key_linepos], len);
                        if (key_linepos + blen + len >= MAX_INPUTLINE)
                                return;
                        memmove(&key_line[key_linepos + blen], &key_line[key_linepos], len);
                }
-               // FIXME: This is not proper overwriting with utf8.
-               if (key_linepos + blen >= MAX_INPUTLINE)
+               else if (key_linepos + len + blen - u8_bytelen(key_line + key_linepos, 1) >= MAX_INPUTLINE)
                        return;
                memcpy(key_line + key_linepos, buf, blen);
                if (blen > len)
                        key_line[key_linepos + blen] = 0;
                // END OF FIXME
                key_linepos += blen;
-               //key_linepos += u8_fromchar(unicode, key_line + key_linepos, sizeof(key_line) - key_linepos - 1);
-               //key_line[key_linepos] = ascii;
-               //key_linepos++;
        }
 }