Remove chars one-by-one with wxELLIPSIZE_MIDDLE.
Previously, Ellipsize() would always remove two characters at a time in wxELLIPSIZE_MIDDLE mode. This was clearly a bug: it led to shortening the text more than was strictly necessary. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66822 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -307,11 +307,30 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
|
|||||||
size_t endCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1]
|
size_t endCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1]
|
||||||
|
|
||||||
int removedPx = 0;
|
int removedPx = 0;
|
||||||
|
bool removeFromStart = true;
|
||||||
for ( ; removedPx < excessPx; )
|
for ( ; removedPx < excessPx; )
|
||||||
{
|
{
|
||||||
// try to remove the last character of the first part of the string
|
const bool canRemoveFromStart = initialCharToRemove > 0;
|
||||||
if (initialCharToRemove > 0)
|
const bool canRemoveFromEnd = endCharToRemove < len - 1;
|
||||||
|
|
||||||
|
if ( !canRemoveFromStart && !canRemoveFromEnd )
|
||||||
{
|
{
|
||||||
|
// we need to remove all the characters of the string!
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove from the beginning in even steps and from the end
|
||||||
|
// in odd steps, unless we exhausted one side already:
|
||||||
|
removeFromStart = !removeFromStart;
|
||||||
|
if ( removeFromStart && !canRemoveFromStart )
|
||||||
|
removeFromStart = false;
|
||||||
|
else if ( !removeFromStart && !canRemoveFromEnd )
|
||||||
|
removeFromStart = true;
|
||||||
|
|
||||||
|
if ( removeFromStart )
|
||||||
|
{
|
||||||
|
// try to remove the last character of the first part of the string
|
||||||
|
|
||||||
// width of the (initialCharToRemove-1)-th character
|
// width of the (initialCharToRemove-1)-th character
|
||||||
int widthPx;
|
int widthPx;
|
||||||
if (initialCharToRemove >= 2)
|
if (initialCharToRemove >= 2)
|
||||||
@@ -325,12 +344,13 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
|
|||||||
// mark the (initialCharToRemove-1)-th character as removable
|
// mark the (initialCharToRemove-1)-th character as removable
|
||||||
initialCharToRemove--;
|
initialCharToRemove--;
|
||||||
removedPx += widthPx;
|
removedPx += widthPx;
|
||||||
}
|
|
||||||
|
|
||||||
// try to remove the first character of the last part of the string
|
continue; // don't remove anything else
|
||||||
if (endCharToRemove < len - 1 &&
|
}
|
||||||
removedPx < excessPx)
|
else // !removeFromStart
|
||||||
{
|
{
|
||||||
|
// try to remove the first character of the last part of the string
|
||||||
|
|
||||||
// width of the (endCharToRemove+1)-th character
|
// width of the (endCharToRemove+1)-th character
|
||||||
int widthPx = charOffsetsPx[endCharToRemove+1] -
|
int widthPx = charOffsetsPx[endCharToRemove+1] -
|
||||||
charOffsetsPx[endCharToRemove];
|
charOffsetsPx[endCharToRemove];
|
||||||
@@ -340,12 +360,8 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
|
|||||||
// mark the (endCharToRemove+1)-th character as removable
|
// mark the (endCharToRemove+1)-th character as removable
|
||||||
endCharToRemove++;
|
endCharToRemove++;
|
||||||
removedPx += widthPx;
|
removedPx += widthPx;
|
||||||
}
|
|
||||||
|
|
||||||
if (initialCharToRemove == 0 && endCharToRemove == len-1)
|
continue; // don't remove anything else
|
||||||
{
|
|
||||||
// we need to remove all the characters of the string!
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user