From 3dd77ee17f8e89f670db4ad93fc712dbdccd76a8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 11 Jul 2026 01:44:21 +0400 Subject: [PATCH] Open editor for not yet loaded media on click. --- .../iv_markdown_history_view_media.cpp | 77 ++++++++++++------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/Telegram/SourceFiles/iv/markdown/iv_markdown_history_view_media.cpp b/Telegram/SourceFiles/iv/markdown/iv_markdown_history_view_media.cpp index 90912d9e14..68467236e0 100644 --- a/Telegram/SourceFiles/iv/markdown/iv_markdown_history_view_media.cpp +++ b/Telegram/SourceFiles/iv/markdown/iv_markdown_history_view_media.cpp @@ -177,25 +177,36 @@ struct IvHistoryViewHit { std::shared_ptr> &documents, const base::flat_map &indices) { auto result = IvHistoryViewHit(); - if (const auto photoOpen - = std::dynamic_pointer_cast(handler)) { - const auto i = photos.find(photoOpen->photo()->id); + const auto activatesPhoto + = std::dynamic_pointer_cast(handler) + || std::dynamic_pointer_cast(handler); + const auto activatesDocument = !activatesPhoto + && !std::dynamic_pointer_cast(handler) + && (std::dynamic_pointer_cast(handler) + || std::dynamic_pointer_cast( + handler)); + if (activatesPhoto) { + const auto photo = std::dynamic_pointer_cast( + handler)->photo(); + const auto i = photos.find(photo->id); if (i != end(photos)) { result.activation.kind = MediaActivationKind::Photo; result.activation.photo = i->second; - const auto j = indices.find(photoOpen->photo()->id); + const auto j = indices.find(photo->id); if (j != end(indices)) { result.activation.itemIndex = j->second; } return result; } - } else if (const auto documentOpen - = std::dynamic_pointer_cast(handler)) { - const auto i = documents.find(documentOpen->document()->id); + } else if (activatesDocument) { + const auto document + = std::dynamic_pointer_cast( + handler)->document(); + const auto i = documents.find(document->id); if (i != end(documents)) { result.activation.kind = MediaActivationKind::Document; result.activation.document = i->second; - const auto j = indices.find(documentOpen->document()->id); + const auto j = indices.find(document->id); if (j != end(indices)) { result.activation.itemIndex = j->second; } @@ -526,12 +537,12 @@ IvHistoryViewHit IvHistoryViewBlock::classifyHandler( result.link = handler; return result; } - if (std::dynamic_pointer_cast(handler) - || std::dynamic_pointer_cast(handler)) { + if (std::dynamic_pointer_cast(handler)) { result.link = handler; return result; } - if (std::dynamic_pointer_cast(handler) + if ((std::dynamic_pointer_cast(handler) + || std::dynamic_pointer_cast(handler)) && _photoRuntime) { result.activation.kind = MediaActivationKind::Photo; result.activation.photo = _photoRuntime; @@ -572,6 +583,26 @@ IvHistoryViewHit IvHistoryViewBlock::classifyHandler( } } } + if (_kind == IvHistoryViewMediaKind::GroupedMedia) { + auto grouped = ClassifyGroupedHandler( + handler, + _groupedPhotoRuntimes, + _groupedDocumentRuntimes, + _groupedItemIndices); + if (grouped.activation.kind != MediaActivationKind::None + || !IsSupportedInteractionHandler(handler)) { + return grouped; + } + result.link = handler; + return result; + } + if (_kind == IvHistoryViewMediaKind::Document + && _documentRuntime + && std::dynamic_pointer_cast(handler)) { + result.activation.kind = MediaActivationKind::Document; + result.activation.document = _documentRuntime; + return result; + } if (IsSupportedInteractionHandler(handler)) { result.link = handler; return result; @@ -581,13 +612,6 @@ IvHistoryViewHit IvHistoryViewBlock::classifyHandler( result.link = handler; return result; } - if (_kind == IvHistoryViewMediaKind::GroupedMedia) { - return ClassifyGroupedHandler( - handler, - _groupedPhotoRuntimes, - _groupedDocumentRuntimes, - _groupedItemIndices); - } if (std::dynamic_pointer_cast(handler) && _photoRuntime) { result.activation.kind = MediaActivationKind::Photo; @@ -1025,19 +1049,20 @@ IvHistoryViewHit IvHistoryViewSlideshowBlock::classifyState( return result; } } - if (IsSupportedInteractionHandler(handler)) { - result.link = handler; - return result; - } - result = ClassifyGroupedHandler( + auto grouped = ClassifyGroupedHandler( handler, _groupedPhotoRuntimes, _groupedDocumentRuntimes, _groupedItemIndices); - if (result.activation.kind != MediaActivationKind::None) { - result.activation.itemIndex = index; + if (grouped.activation.kind != MediaActivationKind::None) { + grouped.activation.itemIndex = index; + return grouped; } - return result; + if (IsSupportedInteractionHandler(handler)) { + result.link = handler; + return result; + } + return grouped; } IvHistoryViewHit IvHistoryViewSlideshowBlock::resolveHit(QPoint point) const {