Collapse stories on chat open.

This commit is contained in:
John Preston 2023-06-27 13:36:25 +04:00
parent bc7da9309d
commit aa2cf2f6ca
5 changed files with 34 additions and 20 deletions

View File

@ -473,8 +473,10 @@ int InnerWidget::dialogsOffset() const {
- skipTopHeight();
}
rpl::producer<> InnerWidget::scrollToVeryTopRequests() const {
return _stories->expandRequests();
rpl::producer<bool> InnerWidget::storiesExpandedRequests() const {
return rpl::merge(
_stories->toggleExpandedRequests(),
_storiesExpandedRequests.events());
}
int InnerWidget::defaultScrollTop() const {
@ -623,11 +625,6 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
if (_controller->contentOverlapped(this, e)) {
return;
}
const auto fillGuard = gsl::finally([&] {
// We translate painter down, but it'll be cropped below rect.
p.fillRect(rect(), st::dialogsBg);
});
const auto activeEntry = _controller->activeChatEntryCurrent();
const auto videoPaused = _controller->isGifPausedAtLeastFor(
Window::GifPauseReason::Any);
@ -648,6 +645,11 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
.paused = videoPaused,
.narrow = (fullWidth < st::columnMinimalWidthLeft / 2),
};
_stories->setBgOverride(context.currentBg);
const auto fillGuard = gsl::finally([&] {
// We translate painter down, but it'll be cropped below rect.
p.fillRect(rect(), context.currentBg);
});
const auto paintRow = [&](
not_null<Row*> row,
bool selected,
@ -3408,6 +3410,7 @@ ChosenRow InnerWidget::computeChosenRow() const {
bool InnerWidget::chooseRow(
Qt::KeyboardModifiers modifiers,
MsgId pressedTopicRootId) {
_storiesExpandedRequests.fire(false);
if (chooseCollapsedRow()) {
return true;
} else if (chooseHashtag()) {

View File

@ -104,7 +104,7 @@ public:
const QVector<MTPPeer> &my,
const QVector<MTPPeer> &result);
[[nodiscard]] rpl::producer<> scrollToVeryTopRequests() const;
[[nodiscard]] rpl::producer<bool> storiesExpandedRequests() const;
[[nodiscard]] int defaultScrollTop() const;
void setViewportHeight(int viewportHeight);
@ -408,6 +408,7 @@ private:
const not_null<Window::SessionController*> _controller;
const std::unique_ptr<Stories::List> _stories;
rpl::event_stream<bool> _storiesExpandedRequests;
int _viewportHeight = 0;
not_null<IndexedList*> _shownList;

View File

@ -261,9 +261,11 @@ Widget::Widget(
}
}, lifetime());
_inner->scrollToVeryTopRequests(
) | rpl::start_with_next([=] {
scrollToDefaultChecked(true);
_inner->storiesExpandedRequests(
) | rpl::start_with_next([=](bool expanded) {
if (expanded || _scroll->scrollTop() < _inner->defaultScrollTop()) {
scrollToDefaultChecked(expanded);
}
}, lifetime());
_inner->mustScrollTo(
@ -1123,7 +1125,7 @@ void Widget::scrollToDefault(bool verytop) {
_scrollToAnimation.stop();
auto scrollTop = _scroll->scrollTop();
const auto scrollTo = verytop ? 0 : _inner->defaultScrollTop();
if (scrollTop <= scrollTo) {
if (scrollTop == scrollTo) {
return;
}
const auto maxAnimatedDelta = _scroll->height();
@ -2017,6 +2019,7 @@ void Widget::dropEvent(QDropEvent *e) {
void Widget::listScrollUpdated() {
const auto scrollTop = _scroll->scrollTop();
PROFILE_LOG(("SCROLLED: %1").arg(scrollTop));
_inner->setVisibleTopBottom(scrollTop, scrollTop + _scroll->height());
updateScrollUpVisibility();

View File

@ -239,8 +239,8 @@ rpl::producer<ToggleShownRequest> List::toggleShown() const {
return _toggleShown.events();
}
rpl::producer<> List::expandRequests() const {
return _expandRequests.events();
rpl::producer<bool> List::toggleExpandedRequests() const {
return _toggleExpandedRequests.events();
}
rpl::producer<> List::entered() const {
@ -347,7 +347,7 @@ void List::paintEvent(QPaintEvent *e) {
const auto readUserpicAppearingOpacity = lerp(_st.readOpacity, 0.);
auto p = QPainter(this);
p.fillRect(e->rect(), _st.bg);
p.fillRect(e->rect(), _bgOverride.value_or(_st.bg));
p.translate(0, height() - layout.shownHeight);
const auto drawSmall = (ratio < 1.);
@ -670,7 +670,7 @@ void List::wheelEvent(QWheelEvent *e) {
const auto used = now - delta;
const auto next = std::clamp(used, 0, _scrollLeftMax);
if (next != now) {
_expandRequests.fire({});
_toggleExpandedRequests.fire(true);
_scrollLeft = next;
updateSelected();
checkLoadMore();
@ -698,7 +698,7 @@ void List::mouseMoveEvent(QMouseEvent *e) {
if ((_lastMousePosition - *_mouseDownPosition).manhattanLength()
>= QApplication::startDragDistance()) {
if (_shownHeight() < _st.full.height) {
_expandRequests.fire({});
_toggleExpandedRequests.fire(true);
}
_dragging = true;
_startDraggingLeft = _scrollLeft;
@ -742,13 +742,17 @@ void List::mouseReleaseEvent(QMouseEvent *e) {
updateSelected();
if (_selected == pressed) {
if (_selected < 0) {
_expandRequests.fire({});
_toggleExpandedRequests.fire(true);
} else if (_selected < _data.items.size()) {
_clicks.fire_copy(_data.items[_selected].element.id);
}
}
}
void List::setBgOverride(QBrush brush) {
_bgOverride = std::move(brush);
}
void List::contextMenuEvent(QContextMenuEvent *e) {
_menu = nullptr;

View File

@ -67,10 +67,12 @@ public:
rpl::producer<Content> content,
Fn<int()> shownHeight);
void setBgOverride(QBrush brush);
[[nodiscard]] rpl::producer<uint64> clicks() const;
[[nodiscard]] rpl::producer<uint64> showProfileRequests() const;
[[nodiscard]] rpl::producer<ToggleShownRequest> toggleShown() const;
[[nodiscard]] rpl::producer<> expandRequests() const;
[[nodiscard]] rpl::producer<bool> toggleExpandedRequests() const;
[[nodiscard]] rpl::producer<> entered() const;
[[nodiscard]] rpl::producer<> loadMoreRequests() const;
@ -165,10 +167,11 @@ private:
rpl::event_stream<uint64> _clicks;
rpl::event_stream<uint64> _showProfileRequests;
rpl::event_stream<ToggleShownRequest> _toggleShown;
rpl::event_stream<> _expandRequests;
rpl::event_stream<bool> _toggleExpandedRequests;
rpl::event_stream<> _entered;
rpl::event_stream<> _loadMoreRequests;
std::optional<QBrush> _bgOverride;
Ui::Animations::Simple _shownAnimation;
QPoint _lastMousePosition;