diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp index 3ef0a53b..9416c404 100644 --- a/src/graphics/engine/text.cpp +++ b/src/graphics/engine/text.cpp @@ -653,16 +653,48 @@ void CText::DrawString(const std::string &text, std::vector::itera break; } + Color c = color; FontHighlight hl = static_cast(format[fmtIndex] & FONT_MASK_HIGHLIGHT); if (hl != FONT_HIGHLIGHT_NONE) { - Math::Point charSize; - charSize.x = GetCharWidth(ch, font, size, offset); - charSize.y = GetHeight(font, size); - DrawHighlight(hl, pos, charSize); + if (hl == FONT_HIGHLIGHT_TOKEN) + { + c = Color(0.612f, 0.475f, 0.208f, 1.0f); // #9C7935 + } + else if (hl == FONT_HIGHLIGHT_TYPE) + { + c = Color(0.365f, 0.498f, 0.251f, 1.0f); // #5D7F40 + } + else if (hl == FONT_HIGHLIGHT_CONST) + { + c = Color(0.882f, 0.176f, 0.176f, 1.0f); // #E12D2D + } + else if (hl == FONT_HIGHLIGHT_THIS) + { + c = Color(0.545f, 0.329f, 0.608f, 1.0f); // #8B549B + } + else if (hl == FONT_HIGHLIGHT_COMMENT) + { + c = Color(0.251f, 0.271f, 0.306f, 1.0f); // #40454E + } + else if (hl == FONT_HIGHLIGHT_KEYWORD) + { + c = Color(0.267f, 0.478f, 0.655f, 1.0f); // #447AA7 + } + else if (hl == FONT_HIGHLIGHT_STRING) + { + c = Color(0.267f, 0.427f, 0.380f, 1.0f); // #446D61 + } + else + { + Math::Point charSize; + charSize.x = GetCharWidth(ch, font, size, offset); + charSize.y = GetHeight(font, size); + DrawHighlight(hl, pos, charSize); + } } - DrawCharAndAdjustPos(ch, font, size, pos, color); + DrawCharAndAdjustPos(ch, font, size, pos, c); // increment fmtIndex for each byte in multibyte character if ( ch.c1 != 0 ) @@ -770,26 +802,6 @@ void CText::DrawHighlight(FontHighlight hl, Math::Point pos, Math::Point size) grad[0] = grad[1] = grad[2] = grad[3] = Color(0.0f, 0.0f, 1.0f, 0.5f); break; - case FONT_HIGHLIGHT_TOKEN: - grad[0] = grad[1] = Color(248.0f / 256.0f, 248.0f / 256.0f, 248.0f / 256.0f, 0.5f); - grad[2] = grad[3] = Color(248.0f / 256.0f, 220.0f / 256.0f, 188.0f / 256.0f, 0.5f); - break; - - case FONT_HIGHLIGHT_TYPE: - grad[0] = grad[1] = Color(248.0f / 256.0f, 248.0f / 256.0f, 248.0f / 256.0f, 0.5f); - grad[2] = grad[3] = Color(169.0f / 256.0f, 234.0f / 256.0f, 169.0f / 256.0f, 0.5f); - break; - - case FONT_HIGHLIGHT_CONST: - grad[0] = grad[1] = Color(248.0f / 256.0f, 248.0f / 256.0f, 248.0f / 256.0f, 0.5f); - grad[2] = grad[3] = Color(248.0f / 256.0f, 176.0f / 256.0f, 169.0f / 256.0f, 0.5f); - break; - - case FONT_HIGHLIGHT_REM: - grad[0] = grad[1] = Color(248.0f / 256.0f, 248.0f / 256.0f, 248.0f / 256.0f, 0.5f); - grad[2] = grad[3] = Color(248.0f / 256.0f, 169.0f / 256.0f, 248.0f / 256.0f, 0.5f); - break; - case FONT_HIGHLIGHT_KEY: grad[0] = grad[1] = grad[2] = grad[3] = Color(192.0f / 256.0f, 192.0f / 256.0f, 192.0f / 256.0f, 0.5f); diff --git a/src/graphics/engine/text.h b/src/graphics/engine/text.h index aa3d519c..8aa8874b 100644 --- a/src/graphics/engine/text.h +++ b/src/graphics/engine/text.h @@ -112,18 +112,21 @@ enum FontTitle * \enum FontHighlight * \brief Type of color highlight for text * - * Bitmask in 3 bits left shifted 6 (mask 0x1c0) + * Bitmask in 4 bits left shifted 6 (mask 0x3c0) */ enum FontHighlight { FONT_HIGHLIGHT_NONE = 0x00 << 6, - FONT_HIGHLIGHT_LINK = 0x01 << 6, - FONT_HIGHLIGHT_TOKEN = 0x02 << 6, - FONT_HIGHLIGHT_TYPE = 0x03 << 6, - FONT_HIGHLIGHT_CONST = 0x04 << 6, - FONT_HIGHLIGHT_REM = 0x05 << 6, - FONT_HIGHLIGHT_KEY = 0x06 << 6, - FONT_HIGHLIGHT_TABLE = 0x07 << 6, + FONT_HIGHLIGHT_LINK = 0x01 << 6, //!< link underline + FONT_HIGHLIGHT_TABLE = 0x02 << 6, //!< code background in SatCom + FONT_HIGHLIGHT_KEY = 0x03 << 6, //!< background for keys in documentation in SatCom + FONT_HIGHLIGHT_TOKEN = 0x04 << 6, //!< keywords in CBot scripts + FONT_HIGHLIGHT_TYPE = 0x05 << 6, //!< types in CBot scripts + FONT_HIGHLIGHT_CONST = 0x06 << 6, //!< constants in CBot scripts + FONT_HIGHLIGHT_THIS = 0x07 << 6, //!< "this" keyword in CBot scripts + FONT_HIGHLIGHT_COMMENT = 0x08 << 6, //!< comments in CBot scripts + FONT_HIGHLIGHT_KEYWORD = 0x09 << 6, //!< builtin keywords in CBot scripts + FONT_HIGHLIGHT_STRING = 0x0A << 6, //!< string literals in CBot scripts }; /** @@ -137,9 +140,9 @@ enum FontMask //! Mask for FontTitle FONT_MASK_TITLE = 0x030, //! Mask for FontHighlight - FONT_MASK_HIGHLIGHT = 0x1c0, + FONT_MASK_HIGHLIGHT = 0x3c0, //! Mask for image bit (TODO: not used?) - FONT_MASK_IMAGE = 0x200 + FONT_MASK_IMAGE = 0x400 }; diff --git a/src/script/script.cpp b/src/script/script.cpp index 5ddf4ccf..4c25d088 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -654,6 +654,7 @@ void CScript::ColorizeScript(Ui::CEdit* edit) Gfx::FontHighlight color; edit->ClearFormat(); + edit->SetFormat(0, edit->GetMaxChar(), Gfx::FONT_HIGHLIGHT_COMMENT); // anything not processed is a comment bt = CBotToken::CompileTokens(edit->GetText(), error); while ( bt != nullptr ) @@ -664,39 +665,45 @@ void CScript::ColorizeScript(Ui::CEdit* edit) cursor1 = bt->GetStart(); cursor2 = bt->GetEnd(); + + if (cursor1 < 0 || cursor2 < 0 || cursor1 == cursor2 || type == 0) { bt = bt->GetNext(); continue; } // seems to be a bug in CBot engine (how does it even still work? D:) + color = Gfx::FONT_HIGHLIGHT_NONE; - if ( type >= TokenKeyWord && type < TokenKeyWord+100 ) - { - color = Gfx::FONT_HIGHLIGHT_TOKEN; - } - if ( type >= TokenKeyDeclare && type < TokenKeyDeclare+100 ) + if ((type == TokenTypVar || (type >= TokenKeyWord && type < TokenKeyWord+100)) && IsType(token)) // types (basic types are TokenKeyWord, classes are TokenTypVar) { color = Gfx::FONT_HIGHLIGHT_TYPE; } - if ( type >= TokenKeyVal && type < TokenKeyVal+100 ) + else if (type == TokenTypVar && IsFunction(token)) // functions + { + color = Gfx::FONT_HIGHLIGHT_TOKEN; + } + else if (type == TokenTypVar && strcmp(token, "this") == 0) // this + { + color = Gfx::FONT_HIGHLIGHT_THIS; + } + else if (type >= TokenKeyWord && type < TokenKeyWord+100) // builtin keywords + { + color = Gfx::FONT_HIGHLIGHT_KEYWORD; + } + else if (type >= TokenKeyDeclare && type < TokenKeyDeclare+100) // TODO: no idea :P seems to never happen + { + color = Gfx::FONT_HIGHLIGHT_TYPE; + } + else if (type >= TokenKeyVal && type < TokenKeyVal+100) // true, false, null, nan { color = Gfx::FONT_HIGHLIGHT_CONST; } - if ( type == TokenTypVar || ( type >= TokenKeyWord && type < TokenKeyWord+100 ) || strcmp(token, "this") == 0 ) + else if (type == TokenTypDef) // constants (object types etc.) { - if ( IsType(token) ) - { - color = Gfx::FONT_HIGHLIGHT_TYPE; - } - else if ( IsFunction(token) || strcmp(token, "this") == 0 ) - { - color = Gfx::FONT_HIGHLIGHT_TOKEN; - } + color = Gfx::FONT_HIGHLIGHT_CONST; } - if ( type == TokenTypDef ) + else if (type == TokenTypString || type == TokenTypNum) // string literals and numbers { - color =Gfx::FONT_HIGHLIGHT_CONST; + color = Gfx::FONT_HIGHLIGHT_STRING; } - if ( cursor1 < cursor2 && color != Gfx::FONT_HIGHLIGHT_NONE ) - { - edit->SetFormat(cursor1, cursor2, color); - } + assert(cursor1 < cursor2); + edit->SetFormat(cursor1, cursor2, color); bt = bt->GetNext(); } diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index 8d77d853..587a8907 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -3158,7 +3158,7 @@ bool CEdit::SetFormat(int cursor1, int cursor2, int format) for ( i=cursor1 ; i