Added nice corners for spoilers.
This commit is contained in:
parent
9c1572564b
commit
6c9d832ad8
2 changed files with 82 additions and 23 deletions
|
|
@ -11,6 +11,8 @@
|
||||||
#include "ui/text/text_isolated_emoji.h"
|
#include "ui/text/text_isolated_emoji.h"
|
||||||
#include "ui/emoji_config.h"
|
#include "ui/emoji_config.h"
|
||||||
#include "ui/integration.h"
|
#include "ui/integration.h"
|
||||||
|
#include "ui/round_rect.h"
|
||||||
|
#include "ui/image/image_prepare.h"
|
||||||
#include "base/platform/base_platform_info.h"
|
#include "base/platform/base_platform_info.h"
|
||||||
#include "base/qt_adapters.h"
|
#include "base/qt_adapters.h"
|
||||||
|
|
||||||
|
|
@ -1777,7 +1779,7 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_background.brush) {
|
if (_background.color) {
|
||||||
const auto from = currentBlock->from();
|
const auto from = currentBlock->from();
|
||||||
const auto to = currentBlock->from() + currentBlock->width();
|
const auto to = currentBlock->from() + currentBlock->width();
|
||||||
if (_localFrom + si.position < to) {
|
if (_localFrom + si.position < to) {
|
||||||
|
|
@ -1986,19 +1988,58 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void fillSpoilerRange(QFixed x, QFixed width, int currentBlockIndex) {
|
void fillSpoilerRange(QFixed x, QFixed width, int currentBlockIndex) {
|
||||||
if (_background.brush) {
|
if (!_background.color) {
|
||||||
const auto elideOffset =
|
return;
|
||||||
(_indexOfElidedBlock == currentBlockIndex)
|
}
|
||||||
|
const auto elideOffset = (_indexOfElidedBlock == currentBlockIndex)
|
||||||
? (_elideRemoveFromEnd + _f->elidew)
|
? (_elideRemoveFromEnd + _f->elidew)
|
||||||
: 0;
|
: 0;
|
||||||
|
const auto rect = QRect(
|
||||||
_p->fillRect(
|
|
||||||
x.toInt(),
|
x.toInt(),
|
||||||
_y + _yDelta,
|
_y + _yDelta,
|
||||||
width.toInt() - elideOffset,
|
width.toInt() - elideOffset,
|
||||||
_fontHeight,
|
_fontHeight);
|
||||||
*_background.brush);
|
if (!rect.isValid()) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto parts = [&] {
|
||||||
|
const auto blockIndex = currentBlockIndex - 1;
|
||||||
|
const auto now = _t->_blocks[blockIndex]->spoilerIndex();
|
||||||
|
const auto was = (blockIndex > 0)
|
||||||
|
? _t->_blocks[blockIndex - 1]->spoilerIndex()
|
||||||
|
: 0;
|
||||||
|
const auto will = (blockIndex < _t->_blocks.size() - 1)
|
||||||
|
? _t->_blocks[blockIndex + 1]->spoilerIndex()
|
||||||
|
: 0;
|
||||||
|
return RectPart::None
|
||||||
|
| ((now != was) ? (RectPart::FullLeft) : RectPart::None)
|
||||||
|
| ((now != will) ? (RectPart::FullRight) : RectPart::None);
|
||||||
|
}();
|
||||||
|
|
||||||
|
const auto &cache = _background.inFront
|
||||||
|
? _t->_spoilerCache
|
||||||
|
: _t->_spoilerShownCache;
|
||||||
|
if (parts != RectPart::None) {
|
||||||
|
DrawRoundedRect(
|
||||||
|
*_p,
|
||||||
|
rect,
|
||||||
|
*_background.color,
|
||||||
|
cache.corners,
|
||||||
|
parts);
|
||||||
|
}
|
||||||
|
const auto hasLeft = (parts & RectPart::Left) != 0;
|
||||||
|
const auto hasRight = (parts & RectPart::Right) != 0;
|
||||||
|
const auto cornerWidth = cache.corners[0].width()
|
||||||
|
/ style::DevicePixelRatio();
|
||||||
|
_p->fillRect(
|
||||||
|
rect.left() + (hasLeft ? cornerWidth : 0),
|
||||||
|
rect.top(),
|
||||||
|
rect.width()
|
||||||
|
- (hasRight ? cornerWidth : 0)
|
||||||
|
- (hasLeft ? cornerWidth : 0),
|
||||||
|
rect.height(),
|
||||||
|
*_background.color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void elideSaveBlock(int32 blockIndex, const AbstractBlock *&_endBlock, int32 elideStart, int32 elideWidth) {
|
void elideSaveBlock(int32 blockIndex, const AbstractBlock *&_endBlock, int32 elideStart, int32 elideWidth) {
|
||||||
|
|
@ -2780,17 +2821,30 @@ private:
|
||||||
void applyBlockProperties(const AbstractBlock *block) {
|
void applyBlockProperties(const AbstractBlock *block) {
|
||||||
eSetFont(block);
|
eSetFont(block);
|
||||||
if (_p) {
|
if (_p) {
|
||||||
const auto handler = !block->spoilerIndex()
|
if (block->spoilerIndex()) {
|
||||||
? nullptr
|
const auto handler
|
||||||
: _t->_spoilers.at(block->spoilerIndex() - 1);
|
= _t->_spoilers.at(block->spoilerIndex() - 1);
|
||||||
if (!block->spoilerIndex()) {
|
|
||||||
_background = {};
|
|
||||||
} else {
|
|
||||||
const auto inBack = (handler && handler->shown());
|
const auto inBack = (handler && handler->shown());
|
||||||
_background.inFront = !inBack;
|
_background.inFront = !inBack;
|
||||||
_background.brush = inBack
|
_background.color = inBack
|
||||||
? &_textPalette->spoilerActiveBg->b
|
? &_textPalette->spoilerActiveBg
|
||||||
: &_textPalette->spoilerBg->b;
|
: &_textPalette->spoilerBg;
|
||||||
|
|
||||||
|
const auto &cache = _background.inFront
|
||||||
|
? _t->_spoilerCache
|
||||||
|
: _t->_spoilerShownCache;
|
||||||
|
if (cache.color != (*_background.color)->c) {
|
||||||
|
auto mutableText = const_cast<String*>(_t);
|
||||||
|
auto &mutableCache = _background.inFront
|
||||||
|
? mutableText->_spoilerCache
|
||||||
|
: mutableText->_spoilerShownCache;
|
||||||
|
mutableCache.corners = Images::PrepareCorners(
|
||||||
|
ImageRoundRadius::Small,
|
||||||
|
*_background.color);
|
||||||
|
mutableCache.color = (*_background.color)->c;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_background = {};
|
||||||
}
|
}
|
||||||
if (block->lnkIndex()) {
|
if (block->lnkIndex()) {
|
||||||
_currentPen = &_textPalette->linkFg->p;
|
_currentPen = &_textPalette->linkFg->p;
|
||||||
|
|
@ -2817,7 +2871,7 @@ private:
|
||||||
const QPen *_currentPen = nullptr;
|
const QPen *_currentPen = nullptr;
|
||||||
const QPen *_currentPenSelected = nullptr;
|
const QPen *_currentPenSelected = nullptr;
|
||||||
struct {
|
struct {
|
||||||
const QBrush *brush = nullptr;
|
const style::color *color = nullptr;
|
||||||
bool inFront = false;
|
bool inFront = false;
|
||||||
} _background;
|
} _background;
|
||||||
int _yFrom = 0;
|
int _yFrom = 0;
|
||||||
|
|
|
||||||
|
|
@ -229,6 +229,11 @@ private:
|
||||||
|
|
||||||
Qt::LayoutDirection _startDir = Qt::LayoutDirectionAuto;
|
Qt::LayoutDirection _startDir = Qt::LayoutDirectionAuto;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
std::array<QImage, 4> corners;
|
||||||
|
QColor color;
|
||||||
|
} _spoilerCache, _spoilerShownCache;
|
||||||
|
|
||||||
friend class Parser;
|
friend class Parser;
|
||||||
friend class Renderer;
|
friend class Renderer;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue