Skip to content

Commit

Permalink
Use QFontMetrics::elidedText over manual implementation (#4807)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nerixyz authored Sep 9, 2023
1 parent d4558b5 commit 515c40f
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 36 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unversioned

- Bugfix: Fixed a performance issue when displaying replies to certain messages. (#4807)
- Bugfix: Fixed a data race when disconnecting from Twitch PubSub. (#4771)
- Bugfix: Fixed `/shoutout` command not working with usernames starting with @'s (e.g. `/shoutout @forsen`). (#4800)
- Dev: Fixed UTF16 encoding of `modes` file for the installer. (#4791)
Expand Down
40 changes: 7 additions & 33 deletions src/messages/MessageElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -674,42 +674,16 @@ void SingleLineTextElement::addToContainer(MessageLayoutContainer &container,
auto &parsedWord = parsedWords[0];
if (parsedWord.type() == typeid(QString))
{
int nextWidth =
metrics.horizontalAdvance(currentText + word.text);

// see if the text fits in the current line
if (container.fitsInLine(nextWidth))
if (!currentText.isEmpty())
{
currentText += (word.text + " ");
currentText += ' ';
}
else
currentText += word.text;
QString prev = currentText; // only increments the ref-count
currentText = metrics.elidedText(currentText, Qt::ElideRight,
container.remainingWidth());
if (currentText != prev)
{
// word overflows, try minimum truncation
bool cutSuccess = false;
for (size_t cut = 1; cut < word.text.length(); ++cut)
{
// Cut off n characters and append the ellipsis.
// Try removing characters one by one until the word fits.
QString truncatedWord =
word.text.chopped(cut) + ellipsis;
int newSize = metrics.horizontalAdvance(currentText +
truncatedWord);
if (container.fitsInLine(newSize))
{
currentText += (truncatedWord);

cutSuccess = true;
break;
}
}

if (!cutSuccess)
{
// We weren't able to show any part of the current word, so
// just append the ellipsis.
currentText += ellipsis;
}

break;
}
}
Expand Down
11 changes: 8 additions & 3 deletions src/messages/layouts/MessageLayoutContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -424,11 +424,16 @@ bool MessageLayoutContainer::atStartOfLine()

bool MessageLayoutContainer::fitsInLine(int _width)
{
return this->currentX_ + _width <=
(this->width_ - int(this->margin.left * this->scale_) -
return _width <= this->remainingWidth();
}

int MessageLayoutContainer::remainingWidth() const
{
return (this->width_ - int(this->margin.left * this->scale_) -
int(this->margin.right * this->scale_) -
(this->line_ + 1 == MAX_UNCOLLAPSED_LINES ? this->dotdotdotWidth_
: 0));
: 0)) -
this->currentX_;
}

void MessageLayoutContainer::end()
Expand Down
1 change: 1 addition & 0 deletions src/messages/layouts/MessageLayoutContainer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ struct MessageLayoutContainer {
void breakLine();
bool atStartOfLine();
bool fitsInLine(int width_);
int remainingWidth() const;
// this method is called when a message has an RTL word
// we need to reorder the words to be shown properly
// however we don't we to reorder non-text elements like badges, timestamps, username
Expand Down

0 comments on commit 515c40f

Please sign in to comment.