Moved important tooltip for stories in dialogs to MainWidget.
This commit is contained in:
parent
ebbef70d42
commit
73373e373f
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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.;
|
||||||
|
|
Loading…
Reference in New Issue