mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Highlight text in bottom of a long bubble.
This commit is contained in:
parent
3565215c81
commit
4701badb2a
1 changed files with 43 additions and 0 deletions
|
@ -1433,6 +1433,49 @@ int HistoryWidget::itemTopForHighlight(
|
||||||
const auto heightLeft = (visibleAreaHeight - viewHeight);
|
const auto heightLeft = (visibleAreaHeight - viewHeight);
|
||||||
if (heightLeft >= 0) {
|
if (heightLeft >= 0) {
|
||||||
return std::max(itemTop - (heightLeft / 2), 0);
|
return std::max(itemTop - (heightLeft / 2), 0);
|
||||||
|
} else if (const auto sel = itemHighlight(item).range; !sel.empty()) {
|
||||||
|
auto request = HistoryView::StateRequest();
|
||||||
|
request.flags = Ui::Text::StateRequest::Flag::LookupSymbol;
|
||||||
|
const auto single = st::messageTextStyle.font->height;
|
||||||
|
const auto findy = [&](int symbol, int yfrom = 0) {
|
||||||
|
const auto fory = [&](int y) {
|
||||||
|
return view->textState(QPoint(0, y), request).symbol;
|
||||||
|
};
|
||||||
|
auto ytill = view->height() - 1;
|
||||||
|
auto symbolfrom = fory(yfrom);
|
||||||
|
auto symboltill = fory(ytill);
|
||||||
|
if ((yfrom >= ytill) || (symbolfrom >= symbol)) {
|
||||||
|
return yfrom;
|
||||||
|
} else if (symboltill <= symbol) {
|
||||||
|
return ytill;
|
||||||
|
}
|
||||||
|
while (ytill - yfrom >= 2 * single) {
|
||||||
|
const auto middle = (yfrom + ytill) / 2;
|
||||||
|
const auto found = fory(middle);
|
||||||
|
if (found == symbol
|
||||||
|
|| symbolfrom > found
|
||||||
|
|| symboltill < found) {
|
||||||
|
return middle;
|
||||||
|
} else if (found < symbol) {
|
||||||
|
yfrom = middle;
|
||||||
|
symbolfrom = found;
|
||||||
|
} else {
|
||||||
|
ytill = middle;
|
||||||
|
symboltill = found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (yfrom + ytill) / 2;
|
||||||
|
};
|
||||||
|
const auto begin = findy(sel.from) - single;
|
||||||
|
const auto end = findy(sel.to, begin + single) + 2 * single;
|
||||||
|
auto result = itemTop;
|
||||||
|
if (end > visibleAreaHeight) {
|
||||||
|
result = std::max(result, itemTop + end - visibleAreaHeight);
|
||||||
|
}
|
||||||
|
if (itemTop + begin < result) {
|
||||||
|
result = itemTop + begin;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
} else if (reactionCenter >= 0) {
|
} else if (reactionCenter >= 0) {
|
||||||
const auto maxSize = st::reactionInlineImage;
|
const auto maxSize = st::reactionInlineImage;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue