Added: Minimum lines option to multiline text

This commit is contained in:
Nimetu 2016-06-12 10:22:22 +03:00
parent 4ba63dba14
commit ce5d7e5e59
2 changed files with 54 additions and 3 deletions

View file

@ -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

View file

@ -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)