From e8c7cdbb32c4bcae6f8d55f745a038765e4e14f4 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Sun, 12 Jun 2016 10:22:22 +0300 Subject: [PATCH] Added: Minimum lines option to multiline text --HG-- branch : develop --- code/nel/include/nel/gui/view_text.h | 4 +++ code/nel/src/gui/view_text.cpp | 53 ++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/code/nel/include/nel/gui/view_text.h b/code/nel/include/nel/gui/view_text.h index 35069a9ea..95507ffe3 100644 --- a/code/nel/include/nel/gui/view_text.h +++ b/code/nel/include/nel/gui/view_text.h @@ -94,6 +94,7 @@ namespace NLGUI void setMultiLineClipEndSpace (bool state); // use it for multiline edit box for instance void setFirstLineX (uint firstLineX); void setMultiMaxLine(uint l) { _MultiMaxLine = l; } + void setMultiMinLine(uint l) { _MultiMinLine = l; } // Force only a subset of letter to be displayed. Default is 0/0xFFFFFFFF void enableStringSelection(uint start, uint end); @@ -114,6 +115,8 @@ namespace NLGUI sint getMultiLineSpace() const { return _MultiLineSpace; } bool getMultiLineMaxWOnly() const { return _MultiLineMaxWOnly; } uint32 getMultiMaxLine() const { return _MultiMaxLine; } + uint32 getMultiMinLine() const { return _MultiMinLine; } + uint32 getMultiMinOffsetY() const; // get current Hint font width, in pixels uint getFontWidth() const; @@ -259,6 +262,7 @@ namespace NLGUI sint _MultiLineSpace; sint _LastMultiLineMaxW; uint32 _MultiMaxLine; + uint32 _MultiMinLine; /// FormatTag handling diff --git a/code/nel/src/gui/view_text.cpp b/code/nel/src/gui/view_text.cpp index 1ccd0ec71..022347525 100644 --- a/code/nel/src/gui/view_text.cpp +++ b/code/nel/src/gui/view_text.cpp @@ -75,6 +75,7 @@ namespace NLGUI _MultiLineMaxWOnly = false; _MultiLineClipEndSpace = false; _LastMultiLineMaxW = 0; + _MultiMinLine = 0; _MultiMaxLine = 0; _Index = 0xFFFFFFFF; @@ -305,6 +306,11 @@ namespace NLGUI return toString( _MultiMaxLine ); } else + if( name == "multi_min_line" ) + { + return toString( _MultiMinLine ); + } + else if( name == "underlined" ) { return toString( _Underlined ); @@ -479,6 +485,14 @@ namespace NLGUI return true; } else + if( name == "multi_min_line" ) + { + uint32 i; + if( fromString( value, i ) ) + _MultiMinLine = i; + return true; + } + else if( name == "underlined" ) { bool b; @@ -621,6 +635,7 @@ namespace NLGUI xmlSetProp( node, BAD_CAST "multi_line_space", BAD_CAST toString( _MultiLineSpace ).c_str() ); xmlSetProp( node, BAD_CAST "multi_line_maxw_only", BAD_CAST toString( _MultiLineMaxWOnly ).c_str() ); xmlSetProp( node, BAD_CAST "multi_max_line", BAD_CAST toString( _MultiMaxLine ).c_str() ); + xmlSetProp( node, BAD_CAST "multi_min_line", BAD_CAST toString( _MultiMinLine ).c_str() ); xmlSetProp( node, BAD_CAST "underlined", BAD_CAST toString( _Underlined ).c_str() ); xmlSetProp( node, BAD_CAST "strikethrough", BAD_CAST toString( _StrikeThrough ).c_str() ); xmlSetProp( node, BAD_CAST "case_mode", BAD_CAST toString( uint32( _CaseMode ) ).c_str() ); @@ -741,6 +756,11 @@ namespace NLGUI if (prop) fromString((const char*)prop, _MultiMaxLine); + prop = (char*) xmlGetProp( cur, (xmlChar*)"multi_min_line" ); + _MultiMinLine = 0; + if (prop) + fromString((const char*)prop, _MultiMinLine); + prop = (char*) xmlGetProp( cur, (xmlChar*)"underlined" ); _Underlined = false; if (prop) @@ -981,6 +1001,13 @@ namespace NLGUI sint y_line = _YReal+_FontLegHeight-2; + if (_MultiMinLine > _Lines.size()) + { + uint dy = getMultiMinOffsetY(); + y += dy * ooh; + y_line += dy; + } + // special selection code if(_TextSelection) { @@ -1360,6 +1387,19 @@ namespace NLGUI return _FontLegHeight; } + // *************************************************************************** + uint CViewText::getMultiMinOffsetY() const + { + uint dy = 0; + if (_MultiMinLine > _Lines.size()) + { + // first line is always present even if _Lines is empty + uint nbLines = _MultiMinLine - std::max((sint)1, (sint)_Lines.size()); + dy = nbLines * _FontHeight + (nbLines - 1) * _MultiLineSpace; + } + return dy; + } + // *************************************************************************** void CViewText::flushWordInLine(ucstring &ucCurrentWord, bool &linePushed, const CFormatInfo &wordFormat) { @@ -1836,6 +1876,10 @@ namespace NLGUI _W = (sint)rTotalW; _H = std::max(_FontHeight, uint(_FontHeight * _Lines.size() + std::max(0, sint(_Lines.size()) - 1) * _MultiLineSpace)); + // See if we should pretend to have at least X lines + if (_MultiMinLine > 1) + _H = std::max(_H, sint(_FontHeight * _MultiMinLine + (_MultiMinLine - 1) * _MultiLineSpace)); + // Compute tooltips size if (_Tooltips.size() > 0) for (uint i=0 ; i<_Lines.size() ; ++i) @@ -2118,11 +2162,13 @@ namespace NLGUI // if (_MultiLine) { + uint dy = getMultiMinOffsetY(); + uint charIndex = 0; // special case for end of text if (index == (sint) _Text.length()) { - y = 0; + y = dy; if (_Lines.empty()) { x = 0; @@ -2142,7 +2188,7 @@ namespace NLGUI { // should display the character at the end of previous line CLine &currLine = *_Lines[i - 1]; - y = (sint) ((_FontHeight + _MultiLineSpace) * (_Lines.size() - i)); + y = (sint) ((_FontHeight + _MultiLineSpace) * (_Lines.size() - i) + dy); x = (sint) (currLine.getWidth() + currLine.getEndSpaces() * currLine.getSpaceWidth()); sint nMaxWidth = getCurrentMultiLineMaxW(); x = std::min(x, nMaxWidth); @@ -2153,7 +2199,7 @@ namespace NLGUI if ((sint) newCharIndex > index) { // ok, this line contains the character, now, see which word contains it. - y = (sint) ((_FontHeight + _MultiLineSpace) * (_Lines.size() - 1 - i)); + y = (sint) ((_FontHeight + _MultiLineSpace) * (_Lines.size() - 1 - i) + dy); // see if the index is in the spaces at the end of line if (index - charIndex >= currLine.getNumChars()) { @@ -2252,6 +2298,7 @@ namespace NLGUI uint charPos = 0; if (_MultiLine) { + y -= getMultiMinOffsetY(); // seek the line float py = 0.f; if (py > y)