Allow spoilers and custom emoji in toasts.

This commit is contained in:
John Preston 2022-10-04 09:13:57 +04:00
parent 89ae115a87
commit eafd7dc818
3 changed files with 21 additions and 15 deletions

View file

@ -37,6 +37,7 @@ struct Config {
bool dark = false;
RectPart slideSide = RectPart::None;
ClickHandlerFilter filter;
Fn<std::any(not_null<QWidget*>)> textContext;
};
void SetDefaultParent(not_null<QWidget*> parent);

View file

@ -38,9 +38,15 @@ Widget::Widget(QWidget *parent, const Config &config)
_text.setMarkedText(
_st->style,
_multiline ? config.text : TextUtilities::SingleLine(config.text),
toastOptions);
toastOptions,
config.textContext ? config.textContext(this) : std::any());
const auto weak = Ui::MakeWeak(this);
_text.setSpoilerLinkFilter([=](const ClickContext &context) {
return (weak != nullptr);
});
if (_text.hasLinks()) {
_processMouse = _text.hasLinks() || _text.hasSpoilers();
if (_processMouse) {
setMouseTracking(true);
} else {
setAttribute(Qt::WA_TransparentForMouseEvents);
@ -51,9 +57,7 @@ Widget::Widget(QWidget *parent, const Config &config)
}
void Widget::setInputUsed(bool used) {
setAttribute(
Qt::WA_TransparentForMouseEvents,
!used && !_text.hasLinks());
setAttribute(Qt::WA_TransparentForMouseEvents, !used && !_processMouse);
}
void Widget::onParentResized() {
@ -147,16 +151,16 @@ void Widget::paintEvent(QPaintEvent *e) {
const auto lines = _maxTextHeight / _st->style.font->height;
p.setPen(st::toastFg);
_text.drawElided(
p,
_st->padding.left(),
_textTop,
_textWidth + 1,
lines);
_text.draw(p, {
.position = { _st->padding.left(), _textTop },
.availableWidth = _textWidth + 1,
.spoiler = Ui::Text::DefaultSpoilerCache(),
.elisionLines = lines,
});
}
void Widget::leaveEventHook(QEvent *e) {
if (!_text.hasLinks()) {
if (!_processMouse) {
return;
}
if (ClickHandler::getActive()) {
@ -167,7 +171,7 @@ void Widget::leaveEventHook(QEvent *e) {
}
void Widget::mouseMoveEvent(QMouseEvent *e) {
if (!_text.hasLinks()) {
if (!_processMouse) {
return;
}
const auto point = e->pos()
@ -184,14 +188,14 @@ void Widget::mouseMoveEvent(QMouseEvent *e) {
}
void Widget::mousePressEvent(QMouseEvent *e) {
if (!_text.hasLinks() || e->button() != Qt::LeftButton) {
if (!_processMouse || e->button() != Qt::LeftButton) {
return;
}
ClickHandler::pressed();
}
void Widget::mouseReleaseEvent(QMouseEvent *e) {
if (!_text.hasLinks() || e->button() != Qt::LeftButton) {
if (!_processMouse || e->button() != Qt::LeftButton) {
return;
}
if (const auto handler = ClickHandler::unpressed()) {

View file

@ -44,6 +44,7 @@ private:
float64 _shownLevel = 0;
bool _multiline = false;
bool _dark = false;
bool _processMouse = false;
int _maxTextWidth = 0;
int _maxTextHeight = 0;