From 770880b74bef0763708501d8a70b0eab9a7f7233 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 26 Jul 2023 12:32:55 +0400 Subject: [PATCH] Version 4.8.9: Add hiding X button to stories tooltip. --- Telegram/SourceFiles/dialogs/dialogs.style | 5 +- .../dialogs/ui/dialogs_stories_list.cpp | 58 +++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index 0e877db816..88e1239bee 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -562,6 +562,9 @@ dialogsStoriesListInfo: DialogsStoriesList(dialogsStoriesList) { dialogsStoriesListMine: DialogsStoriesList(dialogsStoriesListInfo) { readOpacity: 1.; } -dialogsStoriesTooltip: defaultImportantTooltip; +dialogsStoriesTooltip: ImportantTooltip(defaultImportantTooltip) { + padding: margins(0px, 0px, 0px, 0px); +} dialogsStoriesTooltipLabel: defaultImportantTooltipLabel; dialogsStoriesTooltipMaxWidth: 200px; +dialogsStoriesTooltipHide: size(14px, 14px); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index 83b73ec7d1..d71e8663d6 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -16,11 +16,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/labels.h" #include "ui/widgets/popup_menu.h" #include "ui/widgets/tooltip.h" +#include "ui/abstract_button.h" #include "ui/painter.h" #include "styles/style_dialogs.h" #include #include +#include #include "base/debug_log.h" @@ -34,6 +36,7 @@ constexpr auto kCollapseAfterRatio = 0.68; constexpr auto kFrictionRatio = 0.15; constexpr auto kExpandCatchUpDuration = crl::time(200); constexpr auto kMaxTooltipNames = 3; +constexpr auto kStoriesTooltipHideBgOpacity = 0.2; [[nodiscard]] int AvailableNameWidth(const style::DialogsStoriesList &st) { const auto &full = st.full; @@ -42,6 +45,55 @@ constexpr auto kMaxTooltipNames = 3; return full.photoLeft * 2 + full.photo - 2 * skip; } +[[nodiscard]] object_ptr MakeTooltipContent( + not_null parent, + rpl::producer text, + Fn hide) { + const auto size = st::dialogsStoriesTooltipHide; + const auto buttonw = size.width(); + const auto skip = st::defaultImportantTooltip.padding.right(); + auto result = object_ptr>( + parent, + Ui::MakeNiceTooltipLabel( + parent, + std::move(text), + st::dialogsStoriesTooltipMaxWidth, + st::dialogsStoriesTooltipLabel), + (st::defaultImportantTooltip.padding + + QMargins(0, 0, skip + buttonw, 0))); + const auto button = Ui::CreateChild(result.data()); + result->sizeValue( + ) | rpl::start_with_next([=](QSize size) { + const auto buttonh = button->height(); + button->resize(skip * 2 + buttonw, size.height()); + button->moveToRight(0, 0, size.width()); + }, button->lifetime()); + button->setClickedCallback(std::move(hide)); + button->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(button); + auto hq = PainterHighQualityEnabler(p); + p.setPen(Qt::NoPen); + p.setBrush(st::importantTooltipFg); + p.setOpacity(kStoriesTooltipHideBgOpacity); + const auto rect = style::centerrect( + button->rect(), + QRect(QPoint(), size)); + const auto center = QRectF(rect).center(); + const auto half = QSizeF(rect.size()) / 6.; + const auto phalf = QPointF(half.width(), half.height()); + const auto mhalf = QPointF(-half.width(), half.height()); + p.drawEllipse(rect); + p.setOpacity(1.); + auto pen = st::importantTooltipFg->p; + pen.setWidthF(style::ConvertScaleExact(sqrtf(2.))); + p.setPen(pen); + p.drawLine(center - phalf, center + phalf); + p.drawLine(center - mhalf, center + mhalf); + }, button->lifetime()); + return result; +} + } // namespace struct List::Layout { @@ -876,15 +928,13 @@ void List::setShowTooltip(rpl::producer shown, Fn hide) { }; _tooltip = std::make_unique( window, - Ui::MakeNiceTooltipLabel( + MakeTooltipContent( window, _tooltipText.value() | rpl::filter(notEmpty), - st::dialogsStoriesTooltipMaxWidth, - st::dialogsStoriesTooltipLabel), + _tooltipHide), st::dialogsStoriesTooltip); const auto tooltip = _tooltip.get(); const auto weak = QPointer(tooltip); - tooltip->setAttribute(Qt::WA_TransparentForMouseEvents); tooltip->toggleFast(false); updateTooltipGeometry();