From 7885be4a9491b2598c914620d5794453e54e7073 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 14 Jun 2021 09:21:56 +0300 Subject: [PATCH] Added ability to show content from Controller for inline results. --- .../SourceFiles/history/history_widget.cpp | 11 +++++++++- .../history_view_compose_controls.cpp | 11 +++++++++- .../inline_bot_layout_internal.cpp | 5 ----- .../inline_bots/inline_bot_layout_internal.h | 15 +------------ .../inline_bots/inline_bot_layout_item.cpp | 5 ++--- .../inline_bots/inline_bot_layout_item.h | 7 +++++++ .../inline_bots/inline_bot_result.cpp | 7 ++++--- .../inline_bots/inline_bot_result.h | 5 ++++- .../inline_bots/inline_results_inner.cpp | 21 ++++++++++--------- .../inline_bots/inline_results_inner.h | 7 +++++-- .../media/view/media_view_open_common.h | 3 +++ .../window/window_session_controller.cpp | 6 +++--- 12 files changed, 60 insertions(+), 43 deletions(-) diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index d65668e43c..920429a3e7 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -1265,7 +1265,16 @@ void HistoryWidget::applyInlineBotQuery(UserData *bot, const QString &query) { _inlineResults.create(this, controller()); _inlineResults->setResultSelectedCallback([=]( InlineBots::ResultSelected result) { - sendInlineResult(result); + if (result.open) { + const auto request = result.result->openRequest(); + if (const auto photo = request.photo()) { + controller()->openPhoto(photo, FullMsgId()); + } else if (const auto document = request.document()) { + controller()->openDocument(document, FullMsgId()); + } + } else { + sendInlineResult(result); + } }); _inlineResults->setCurrentDialogsEntryState( computeDialogsEntryState()); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 62554d451e..01809184b7 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -2394,7 +2394,16 @@ void ComposeControls::applyInlineBotQuery( _currentDialogsEntryState); _inlineResults->setResultSelectedCallback([=]( InlineBots::ResultSelected result) { - _inlineResultChosen.fire_copy(result); + if (result.open) { + const auto request = result.result->openRequest(); + if (const auto photo = request.photo()) { + _window->openPhoto(photo, FullMsgId()); + } else if (const auto document = request.document()) { + _window->openDocument(document, FullMsgId()); + } + } else { + _inlineResultChosen.fire_copy(result); + } }); _inlineResults->setSendMenuType([=] { return sendMenuType(); }); _inlineResults->requesting( diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp index ca2af7d374..0eb54d3d0e 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp @@ -812,10 +812,6 @@ void Video::prepareThumbnail(QSize size) const { } } -void OpenFileClickHandler::onClickImpl() const { - _result->openFile(); -} - void CancelFileClickHandler::onClickImpl() const { _result->cancelFile(); } @@ -824,7 +820,6 @@ File::File(not_null context, not_null result) : FileBase(context, result) , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineFileSize - st::inlineThumbSkip) , _description(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineFileSize - st::inlineThumbSkip) -, _open(std::make_shared(result)) , _cancel(std::make_shared(result)) , _document(getShownDocument()) { Expects(getResultDocument() != nullptr); diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h index 4cdda986f5..e9ab8b87b1 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.h @@ -246,19 +246,6 @@ private: }; -class OpenFileClickHandler : public LeftButtonClickHandler { -public: - OpenFileClickHandler(not_null result) : _result(result) { - } - -protected: - void onClickImpl() const override; - -private: - not_null _result; - -}; - class CancelFileClickHandler : public LeftButtonClickHandler { public: CancelFileClickHandler(not_null result) : _result(result) { @@ -328,7 +315,7 @@ private: mutable std::unique_ptr _animation; Ui::Text::String _title, _description; - ClickHandlerPtr _open, _cancel; + ClickHandlerPtr _cancel; // >= 0 will contain download / upload string, _statusSize = loaded bytes // < 0 will contain played string, _statusSize = -(seconds + 1) played diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.cpp index 30b656e3cc..84593fa814 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.cpp @@ -199,10 +199,9 @@ ClickHandlerPtr ItemBase::getResultPreviewHandler() const { false); } else if (const auto document = _result->_document && _result->_document->createMediaView()->canBePlayed()) { - return std::make_shared( - _result->_document); + return std::make_shared(); } else if (_result->_photo) { - return std::make_shared(_result->_photo); + return std::make_shared(); } return ClickHandlerPtr(); } diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h index 2295af96f0..a2ada30ffc 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_item.h @@ -42,6 +42,12 @@ public: } }; +class OpenFileClickHandler : public ClickHandler { +public: + void onClick(ClickContext context) const override { + } +}; + class Context { public: virtual void inlineItemLayoutChanged(const ItemBase *layout) = 0; @@ -131,6 +137,7 @@ protected: PhotoData *_photo = nullptr; ClickHandlerPtr _send = ClickHandlerPtr{ new SendClickHandler() }; + ClickHandlerPtr _open = ClickHandlerPtr{ new OpenFileClickHandler() }; int _position = 0; // < 0 means removed from layout diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp index a605a7122d..24d9b3d14d 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp @@ -331,12 +331,13 @@ bool Result::onChoose(Layout::ItemBase *layout) { return true; } -void Result::openFile() { +Media::View::OpenRequest Result::openRequest() { if (_document) { - DocumentOpenClickHandler(_document).onClick({}); + return Media::View::OpenRequest(_document, nullptr); } else if (_photo) { - PhotoOpenClickHandler(_photo).onClick({}); + return Media::View::OpenRequest(_photo, nullptr); } + return {}; } void Result::cancelFile() { diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_result.h b/Telegram/SourceFiles/inline_bots/inline_bot_result.h index 4969959ddd..5d243f49db 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_result.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_result.h @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_cloud_file.h" #include "api/api_common.h" +#include "media/view/media_view_open_common.h" class FileLoader; class History; @@ -54,7 +55,7 @@ public: // inline bot result. If it returns true you need to send this result. bool onChoose(Layout::ItemBase *layout); - void openFile(); + Media::View::OpenRequest openRequest(); void cancelFile(); bool hasThumbDisplay() const; @@ -131,6 +132,8 @@ struct ResultSelected { not_null result; not_null bot; Api::SendOptions options; + // Open in OverlayWidget; + bool open = false; }; } // namespace InlineBots diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp index fd9b1f9df2..9055f493a2 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp @@ -236,22 +236,22 @@ void Inner::mouseReleaseEvent(QMouseEvent *e) { return; } - if (dynamic_cast(activated.get())) { - int row = _selected / MatrixRowShift, column = _selected % MatrixRowShift; - selectInlineResult(row, column); + using namespace InlineBots::Layout; + const auto open = dynamic_cast(activated.get()); + if (dynamic_cast(activated.get()) || open) { + const auto row = int(_selected / MatrixRowShift); + const auto column = int(_selected % MatrixRowShift); + selectInlineResult(row, column, {}, !!open); } else { ActivateClickHandler(window(), activated, e->button()); } } -void Inner::selectInlineResult(int row, int column) { - selectInlineResult(row, column, Api::SendOptions()); -} - void Inner::selectInlineResult( int row, int column, - Api::SendOptions options) { + Api::SendOptions options, + bool open) { if (row >= _rows.size() || column >= _rows.at(row).items.size()) { return; } @@ -262,7 +262,8 @@ void Inner::selectInlineResult( _resultSelectedCallback({ .result = inlineResult, .bot = _inlineBot, - .options = std::move(options) + .options = std::move(options), + .open = open, }); } } @@ -300,7 +301,7 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { _menu = base::make_unique_q(this); const auto send = [=](Api::SendOptions options) { - selectInlineResult(row, column, options); + selectInlineResult(row, column, options, false); }; SendMenu::FillSendMenu( _menu, diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.h b/Telegram/SourceFiles/inline_bots/inline_results_inner.h index a8932e7668..cf54bf8a78 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.h +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.h @@ -147,8 +147,11 @@ private: void deleteUnusedInlineLayouts(); int validateExistingInlineRows(const Results &results); - void selectInlineResult(int row, int column); - void selectInlineResult(int row, int column, Api::SendOptions options); + void selectInlineResult( + int row, + int column, + Api::SendOptions options, + bool open); not_null _controller; diff --git a/Telegram/SourceFiles/media/view/media_view_open_common.h b/Telegram/SourceFiles/media/view/media_view_open_common.h index 9a034ffb75..d7aeae127b 100644 --- a/Telegram/SourceFiles/media/view/media_view_open_common.h +++ b/Telegram/SourceFiles/media/view/media_view_open_common.h @@ -18,6 +18,9 @@ namespace Media::View { struct OpenRequest { public: + OpenRequest() { + } + OpenRequest(not_null photo, HistoryItem *item) : _photo(photo) , _item(item) { diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 80e7ca9483..05b0d28191 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_replies_section.h" #include "media/player/media_player_instance.h" #include "media/view/media_view_open_common.h" +#include "data/data_document_resolver.h" #include "data/data_media_types.h" #include "data/data_session.h" #include "data/data_folder.h" @@ -1235,9 +1236,8 @@ void SessionController::openPhoto( void SessionController::openDocument( not_null document, FullMsgId contextId) { - _window->openInMediaView(Media::View::OpenRequest( - document, - session().data().message(contextId))); + // TEMP. + Data::ResolveDocument(document, session().data().message(contextId)); } SessionController::~SessionController() = default;