Moved important tooltip for stories in dialogs to MainWidget.

This commit is contained in:
23rd 2023-07-26 22:23:45 +03:00
parent ebbef70d42
commit 73373e373f
4 changed files with 57 additions and 29 deletions

View File

@ -802,6 +802,9 @@ public:
[[nodiscard]] std::optional<uint64> macRoundIconDigest() const { [[nodiscard]] std::optional<uint64> macRoundIconDigest() const {
return _macRoundIconDigest; return _macRoundIconDigest;
} }
[[nodiscard]] bool storiesClickTooltipHidden() const {
return _storiesClickTooltipHidden.current();
}
[[nodiscard]] rpl::producer<bool> storiesClickTooltipHiddenValue() const { [[nodiscard]] rpl::producer<bool> storiesClickTooltipHiddenValue() const {
return _storiesClickTooltipHidden.value(); return _storiesClickTooltipHidden.value();
} }

View File

@ -798,16 +798,21 @@ void Widget::setupStories() {
_scroll->viewportEvent(e); _scroll->viewportEvent(e);
}, _stories->lifetime()); }, _stories->lifetime());
const auto hideTooltip = [=] { if (!Core::App().settings().storiesClickTooltipHidden()) {
Core::App().settings().setStoriesClickTooltipHidden(true); // Don't create tooltip
Core::App().saveSettingsDelayed(); // until storiesClickTooltipHidden can be returned to false.
}; const auto hideTooltip = [=] {
_stories->setShowTooltip( Core::App().settings().setStoriesClickTooltipHidden(true);
rpl::combine( Core::App().saveSettingsDelayed();
Core::App().settings().storiesClickTooltipHiddenValue(), };
shownValue(), _stories->setShowTooltip(
!rpl::mappers::_1 && rpl::mappers::_2), parentWidget(),
hideTooltip); rpl::combine(
Core::App().settings().storiesClickTooltipHiddenValue(),
shownValue(),
!rpl::mappers::_1 && rpl::mappers::_2),
hideTooltip);
}
_storiesContents.fire(Stories::ContentForSession( _storiesContents.fire(Stories::ContentForSession(
&controller()->session(), &controller()->session(),

View File

@ -916,19 +916,21 @@ TextWithEntities List::computeTooltipText() const {
Ui::Text::WithEntities); Ui::Text::WithEntities);
} }
void List::setShowTooltip(rpl::producer<bool> shown, Fn<void()> hide) { void List::setShowTooltip(
not_null<QWidget*> tooltipParent,
rpl::producer<bool> shown,
Fn<void()> hide) {
_tooltip = nullptr; _tooltip = nullptr;
_tooltipHide = std::move(hide); _tooltipHide = std::move(hide);
_tooltipNotHidden = std::move(shown); _tooltipNotHidden = std::move(shown);
_tooltipText = computeTooltipText(); _tooltipText = computeTooltipText();
const auto window = this->window();
const auto notEmpty = [](const TextWithEntities &text) { const auto notEmpty = [](const TextWithEntities &text) {
return !text.empty(); return !text.empty();
}; };
_tooltip = std::make_unique<Ui::ImportantTooltip>( _tooltip = std::make_unique<Ui::ImportantTooltip>(
window, tooltipParent,
MakeTooltipContent( MakeTooltipContent(
window, tooltipParent,
_tooltipText.value() | rpl::filter(notEmpty), _tooltipText.value() | rpl::filter(notEmpty),
_tooltipHide), _tooltipHide),
st::dialogsStoriesTooltip); st::dialogsStoriesTooltip);
@ -937,7 +939,7 @@ void List::setShowTooltip(rpl::producer<bool> shown, Fn<void()> hide) {
tooltip->toggleFast(false); tooltip->toggleFast(false);
updateTooltipGeometry(); updateTooltipGeometry();
const auto handle = window->windowHandle(); const auto handle = tooltipParent->window()->windowHandle();
auto windowActive = rpl::single( auto windowActive = rpl::single(
handle->isActive() handle->isActive()
) | rpl::then(base::qt_signal_producer( ) | rpl::then(base::qt_signal_producer(
@ -947,16 +949,29 @@ void List::setShowTooltip(rpl::producer<bool> shown, Fn<void()> hide) {
return handle->isActive(); return handle->isActive();
})) | rpl::distinct_until_changed(); })) | rpl::distinct_until_changed();
for (auto parent = parentWidget() {
; parent != window const auto recompute = [=] {
; parent = parent->parentWidget()) { updateTooltipGeometry();
tooltip->raise();
};
using namespace base; using namespace base;
install_event_filter(parent, tooltip, [=](not_null<QEvent*> e) { using Event = not_null<QEvent*>;
if (e->type() == QEvent::Move) { install_event_filter(tooltip, tooltipParent, [=](Event e) {
updateTooltipGeometry(); if ((e->type() == QEvent::Move)
|| (e->type() == QEvent::ChildAdded)
|| (e->type() == QEvent::ChildRemoved)) {
recompute();
} }
return EventFilterResult::Continue; return EventFilterResult::Continue;
}); });
for (const auto &child : tooltipParent->children()) {
install_event_filter(tooltip, child, [=](Event e) {
if (e->type() == QEvent::ZOrderChange) {
recompute();
}
return EventFilterResult::Continue;
});
}
} }
rpl::combine( rpl::combine(
@ -985,14 +1000,16 @@ void List::toggleTooltip(bool fast) {
&& _tooltipNotHidden.current() && _tooltipNotHidden.current()
&& !_tooltipText.current().empty() && !_tooltipText.current().empty()
&& window()->windowHandle()->isActive(); && window()->windowHandle()->isActive();
if (_tooltip) {
if (fast) {
_tooltip->toggleFast(shown);
} else {
_tooltip->toggleAnimated(shown);
}
}
if (shown) { if (shown) {
updateTooltipGeometry(); updateTooltipGeometry();
} }
if (fast) {
_tooltip->toggleFast(shown);
} else {
_tooltip->toggleAnimated(shown);
}
} }
void List::updateTooltipGeometry() { void List::updateTooltipGeometry() {
@ -1001,7 +1018,7 @@ void List::updateTooltipGeometry() {
} }
const auto collapsed = collapsedGeometryCurrent(); const auto collapsed = collapsedGeometryCurrent();
const auto geometry = Ui::MapFrom( const auto geometry = Ui::MapFrom(
window(), _tooltip->parentWidget(),
parentWidget(), parentWidget(),
QRect( QRect(
collapsed.geometry.x(), collapsed.geometry.x(),
@ -1012,7 +1029,7 @@ void List::updateTooltipGeometry() {
const auto countPosition = [=](QSize size) { const auto countPosition = [=](QSize size) {
const auto left = geometry.x() const auto left = geometry.x()
+ (geometry.width() - size.width()) / 2; + (geometry.width() - size.width()) / 2;
const auto right = window()->width() const auto right = _tooltip->parentWidget()->width()
- st::dialogsStoriesTooltip.padding.right(); - st::dialogsStoriesTooltip.padding.right();
return QPoint( return QPoint(
std::max(std::min(left, right - size.width()), 0), std::max(std::min(left, right - size.width()), 0),

View File

@ -73,7 +73,10 @@ public:
QPoint positionSmall, QPoint positionSmall,
style::align alignSmall, style::align alignSmall,
QRect geometryFull = QRect()); QRect geometryFull = QRect());
void setShowTooltip(rpl::producer<bool> shown, Fn<void()> hide); void setShowTooltip(
not_null<QWidget*> tooltipParent,
rpl::producer<bool> shown,
Fn<void()> hide);
struct CollapsedGeometry { struct CollapsedGeometry {
QRect geometry; QRect geometry;
float64 expanded = 0.; float64 expanded = 0.;