Added animation for spoilers.
This commit is contained in:
parent
2c1e6b458d
commit
db871a87f5
1 changed files with 41 additions and 2 deletions
|
|
@ -1807,8 +1807,15 @@ private:
|
||||||
(glyphX + st::emojiPadding).toInt(),
|
(glyphX + st::emojiPadding).toInt(),
|
||||||
_y + _yDelta + emojiY);
|
_y + _yDelta + emojiY);
|
||||||
}
|
}
|
||||||
if (hasSpoiler && _background.inFront) {
|
if ((hasSpoiler && _background.inFront)
|
||||||
|
|| _background.startMs) {
|
||||||
|
const auto opacity = _p->opacity();
|
||||||
|
const auto fillOpacity = fillSpoilerOpacity();
|
||||||
|
if (fillOpacity != opacity) {
|
||||||
|
_p->setOpacity(fillOpacity);
|
||||||
|
}
|
||||||
fillSpoilerRange(fillSpoiler.from, fillSpoiler.width, blockIndex);
|
fillSpoilerRange(fillSpoiler.from, fillSpoiler.width, blockIndex);
|
||||||
|
_p->setOpacity(opacity);
|
||||||
}
|
}
|
||||||
// } else if (_p && currentBlock->type() == TextBlockSkip) { // debug
|
// } else if (_p && currentBlock->type() == TextBlockSkip) { // debug
|
||||||
// _p->fillRect(QRect(x.toInt(), _y, currentBlock->width(), static_cast<SkipBlock*>(currentBlock)->height()), QColor(0, 0, 0, 32));
|
// _p->fillRect(QRect(x.toInt(), _y, currentBlock->width(), static_cast<SkipBlock*>(currentBlock)->height()), QColor(0, 0, 0, 32));
|
||||||
|
|
@ -1982,8 +1989,14 @@ private:
|
||||||
_p->drawTextItem(QPointF(x.toReal(), textY), gf);
|
_p->drawTextItem(QPointF(x.toReal(), textY), gf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_background.inFront) {
|
if (_background.inFront || _background.startMs) {
|
||||||
|
const auto opacity = _p->opacity();
|
||||||
|
const auto fillOpacity = fillSpoilerOpacity();
|
||||||
|
if (fillOpacity != opacity) {
|
||||||
|
_p->setOpacity(fillOpacity);
|
||||||
|
}
|
||||||
fillSpoilerRange(x, si.width, blockIndex);
|
fillSpoilerRange(x, si.width, blockIndex);
|
||||||
|
_p->setOpacity(opacity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1997,6 +2010,21 @@ private:
|
||||||
_p->fillRect(left, _y + _yDelta, width, _fontHeight, _textPalette->selectBg);
|
_p->fillRect(left, _y + _yDelta, width, _fontHeight, _textPalette->selectBg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float fillSpoilerOpacity() {
|
||||||
|
if (!_background.startMs) {
|
||||||
|
return 1.;
|
||||||
|
}
|
||||||
|
const auto progress = float64(crl::now() - _background.startMs)
|
||||||
|
/ st::fadeWrapDuration;
|
||||||
|
if ((progress > 1.) && _background.spoilerIndex) {
|
||||||
|
const auto link = _t->_spoilers.at(_background.spoilerIndex - 1);
|
||||||
|
if (link) {
|
||||||
|
link->setStartMs(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1. - std::min(progress, 1.));
|
||||||
|
}
|
||||||
|
|
||||||
void fillSpoilerRange(QFixed x, QFixed width, int currentBlockIndex) {
|
void fillSpoilerRange(QFixed x, QFixed width, int currentBlockIndex) {
|
||||||
if (!_background.color) {
|
if (!_background.color) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -2839,6 +2867,8 @@ private:
|
||||||
_background.color = inBack
|
_background.color = inBack
|
||||||
? &_textPalette->spoilerActiveBg
|
? &_textPalette->spoilerActiveBg
|
||||||
: &_textPalette->spoilerBg;
|
: &_textPalette->spoilerBg;
|
||||||
|
_background.startMs = handler ? handler->startMs() : 0;
|
||||||
|
_background.spoilerIndex = block->spoilerIndex();
|
||||||
|
|
||||||
const auto &cache = _background.inFront
|
const auto &cache = _background.inFront
|
||||||
? _t->_spoilerCache
|
? _t->_spoilerCache
|
||||||
|
|
@ -2888,6 +2918,8 @@ private:
|
||||||
struct {
|
struct {
|
||||||
const style::color *color = nullptr;
|
const style::color *color = nullptr;
|
||||||
bool inFront = false;
|
bool inFront = false;
|
||||||
|
crl::time startMs = 0;
|
||||||
|
uint16 spoilerIndex = 0;
|
||||||
} _background;
|
} _background;
|
||||||
int _yFrom = 0;
|
int _yFrom = 0;
|
||||||
int _yTo = 0;
|
int _yTo = 0;
|
||||||
|
|
@ -3121,6 +3153,13 @@ void String::setLink(uint16 lnkIndex, const ClickHandlerPtr &lnk) {
|
||||||
_links[lnkIndex - 1] = lnk;
|
_links[lnkIndex - 1] = lnk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void String::setSpoiler(
|
||||||
|
uint16 lnkIndex,
|
||||||
|
const std::shared_ptr<SpoilerClickHandler> &lnk) {
|
||||||
|
if (!lnkIndex || lnkIndex > _spoilers.size()) return;
|
||||||
|
_spoilers[lnkIndex - 1] = lnk;
|
||||||
|
}
|
||||||
|
|
||||||
bool String::hasLinks() const {
|
bool String::hasLinks() const {
|
||||||
return !_links.isEmpty();
|
return !_links.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue