From 11ea5e61cf197e7dd651395f717263779d1a7161 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Fri, 24 Nov 2023 22:11:40 +0400
Subject: [PATCH] Show repost header in stories.

---
 .../stories/media_stories_caption_full_view.cpp  | 16 +++++++++++++++-
 .../media/stories/media_stories_controller.cpp   |  7 +++----
 .../media/stories/media_stories_controller.h     |  2 +-
 .../media/stories/media_stories_view.cpp         |  4 ++--
 .../media/stories/media_stories_view.h           |  2 +-
 .../media/view/media_view_overlay_widget.cpp     | 14 ++++++++------
 6 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/Telegram/SourceFiles/media/stories/media_stories_caption_full_view.cpp b/Telegram/SourceFiles/media/stories/media_stories_caption_full_view.cpp
index 4cc32c23d..d15f13368 100644
--- a/Telegram/SourceFiles/media/stories/media_stories_caption_full_view.cpp
+++ b/Telegram/SourceFiles/media/stories/media_stories_caption_full_view.cpp
@@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "ui/widgets/elastic_scroll.h"
 #include "ui/widgets/labels.h"
 #include "ui/click_handler.h"
+#include "ui/painter.h"
 #include "styles/style_media_view.h"
 
 namespace Media::Stories {
@@ -100,6 +101,18 @@ CaptionFullView::CaptionFullView(not_null<Controller*> controller)
 		}
 	}, _scroll->lifetime());
 
+	_wrap->paintRequest() | rpl::start_with_next([=] {
+		if (_controller->repost()) {
+			auto p = Painter(_wrap.get());
+			_controller->drawRepostInfo(
+				p,
+				st::mediaviewCaptionPadding.left(),
+				(_wrap->padding().top()
+					- _controller->repostCaptionPadding().top()),
+				_wrap->width());
+		}
+	}, _wrap->lifetime());
+
 	_scroll->show();
 	_scroll->setOverscrollBg(QColor(0, 0, 0, 0));
 	_scroll->setOverscrollTypes(Type::Real, Type::Real);
@@ -131,7 +144,8 @@ void CaptionFullView::updateGeometry() {
 		return;
 	}
 	const auto lineHeight = st::mediaviewCaptionStyle.font->height;
-	const auto padding = st::mediaviewCaptionPadding;
+	const auto padding = st::mediaviewCaptionPadding
+		+ _controller->repostCaptionPadding();
 	_text->resizeToWidth(_outer.width() - padding.left() - padding.right());
 	const auto add = padding.top() + padding.bottom();
 	const auto maxShownHeight = lineHeight * kMaxShownCaptionLines;
diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp
index 80beb06a8..939891fa0 100644
--- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp
+++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp
@@ -604,9 +604,8 @@ int Controller::repostSkipTop() const {
 		: 0;
 }
 
-QRect Controller::captionWithRepostGeometry(QRect caption) const {
-	return caption.marginsAdded(st::mediaviewCaptionPadding).marginsAdded(
-		{ 0, repostSkipTop(), 0, 0 });
+QMargins Controller::repostCaptionPadding() const {
+	return { 0, repostSkipTop(), 0, 0 };
 }
 
 void Controller::drawRepostInfo(
@@ -616,7 +615,7 @@ void Controller::drawRepostInfo(
 		int availableWidth) const {
 	Expects(_repostView != nullptr);
 
-	_repostView->draw(p, x, y - repostSkipTop(), availableWidth);
+	_repostView->draw(p, x, y, availableWidth);
 }
 
 void Controller::toggleLiked() {
diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.h b/Telegram/SourceFiles/media/stories/media_stories_controller.h
index 073428a05..7916808b2 100644
--- a/Telegram/SourceFiles/media/stories/media_stories_controller.h
+++ b/Telegram/SourceFiles/media/stories/media_stories_controller.h
@@ -128,7 +128,7 @@ public:
 	void captionClosing();
 	void captionClosed();
 
-	[[nodiscard]] QRect captionWithRepostGeometry(QRect caption) const;
+	[[nodiscard]] QMargins repostCaptionPadding() const;
 	void drawRepostInfo(Painter &p, int x, int y, int availableWidth) const;
 
 	[[nodiscard]] std::shared_ptr<ChatHelpers::Show> uiShow() const;
diff --git a/Telegram/SourceFiles/media/stories/media_stories_view.cpp b/Telegram/SourceFiles/media/stories/media_stories_view.cpp
index 795304f3c..21eccb5e0 100644
--- a/Telegram/SourceFiles/media/stories/media_stories_view.cpp
+++ b/Telegram/SourceFiles/media/stories/media_stories_view.cpp
@@ -150,8 +150,8 @@ bool View::repost() const {
 	return _controller->repost();
 }
 
-QRect View::captionWithRepostGeometry(QRect caption) const {
-	return _controller->captionWithRepostGeometry(caption);
+QMargins View::repostCaptionPadding() const {
+	return _controller->repostCaptionPadding();
 }
 
 void View::drawRepostInfo(
diff --git a/Telegram/SourceFiles/media/stories/media_stories_view.h b/Telegram/SourceFiles/media/stories/media_stories_view.h
index b37742341..785877413 100644
--- a/Telegram/SourceFiles/media/stories/media_stories_view.h
+++ b/Telegram/SourceFiles/media/stories/media_stories_view.h
@@ -81,7 +81,7 @@ public:
 	[[nodiscard]] bool repost() const;
 	void showFullCaption();
 
-	[[nodiscard]] QRect captionWithRepostGeometry(QRect caption) const;
+	[[nodiscard]] QMargins repostCaptionPadding() const;
 	void drawRepostInfo(Painter &p, int x, int y, int availableWidth) const;
 
 	void updatePlayback(const Player::TrackState &state);
diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
index ea94341b4..341812298 100644
--- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
+++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
@@ -5020,11 +5020,12 @@ void OverlayWidget::paintCaptionContent(
 		QRect outer,
 		QRect clip,
 		float64 opacity) {
-	auto inner = outer.marginsRemoved(st::mediaviewCaptionPadding);
-	inner.setTop(inner.top() + inner.height() - _captionRect.height());
+	const auto full = outer.marginsRemoved(st::mediaviewCaptionPadding);
+	const auto inner = full.marginsRemoved(
+		_stories ? _stories->repostCaptionPadding() : QMargins());
 	if (_stories) {
 		if (_stories->repost()) {
-			_stories->drawRepostInfo(p, inner.x(), inner.y(), inner.width());
+			_stories->drawRepostInfo(p, full.x(), full.y(), full.width());
 		}
 	} else {
 		p.setOpacity(opacity);
@@ -5073,9 +5074,10 @@ void OverlayWidget::paintCaptionContent(
 }
 
 QRect OverlayWidget::captionGeometry() const {
-	return (_stories && _stories->repost())
-		? _stories->captionWithRepostGeometry(_captionRect)
-		: _captionRect.marginsAdded(st::mediaviewCaptionPadding);
+	return _captionRect.marginsAdded(
+		st::mediaviewCaptionPadding
+	).marginsAdded(
+		_stories ? _stories->repostCaptionPadding() : QMargins());
 }
 
 void OverlayWidget::paintGroupThumbsContent(