Added ability to show content from Controller for inline results.

This commit is contained in:
23rd 2021-06-14 09:21:56 +03:00 committed by John Preston
parent 583c3d3429
commit 7885be4a94
12 changed files with 60 additions and 43 deletions

View file

@ -1265,7 +1265,16 @@ void HistoryWidget::applyInlineBotQuery(UserData *bot, const QString &query) {
_inlineResults.create(this, controller()); _inlineResults.create(this, controller());
_inlineResults->setResultSelectedCallback([=]( _inlineResults->setResultSelectedCallback([=](
InlineBots::ResultSelected result) { InlineBots::ResultSelected 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); sendInlineResult(result);
}
}); });
_inlineResults->setCurrentDialogsEntryState( _inlineResults->setCurrentDialogsEntryState(
computeDialogsEntryState()); computeDialogsEntryState());

View file

@ -2394,7 +2394,16 @@ void ComposeControls::applyInlineBotQuery(
_currentDialogsEntryState); _currentDialogsEntryState);
_inlineResults->setResultSelectedCallback([=]( _inlineResults->setResultSelectedCallback([=](
InlineBots::ResultSelected result) { InlineBots::ResultSelected 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); _inlineResultChosen.fire_copy(result);
}
}); });
_inlineResults->setSendMenuType([=] { return sendMenuType(); }); _inlineResults->setSendMenuType([=] { return sendMenuType(); });
_inlineResults->requesting( _inlineResults->requesting(

View file

@ -812,10 +812,6 @@ void Video::prepareThumbnail(QSize size) const {
} }
} }
void OpenFileClickHandler::onClickImpl() const {
_result->openFile();
}
void CancelFileClickHandler::onClickImpl() const { void CancelFileClickHandler::onClickImpl() const {
_result->cancelFile(); _result->cancelFile();
} }
@ -824,7 +820,6 @@ File::File(not_null<Context*> context, not_null<Result*> result)
: FileBase(context, result) : FileBase(context, result)
, _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineFileSize - st::inlineThumbSkip) , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineFileSize - st::inlineThumbSkip)
, _description(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<OpenFileClickHandler>(result))
, _cancel(std::make_shared<CancelFileClickHandler>(result)) , _cancel(std::make_shared<CancelFileClickHandler>(result))
, _document(getShownDocument()) { , _document(getShownDocument()) {
Expects(getResultDocument() != nullptr); Expects(getResultDocument() != nullptr);

View file

@ -246,19 +246,6 @@ private:
}; };
class OpenFileClickHandler : public LeftButtonClickHandler {
public:
OpenFileClickHandler(not_null<Result*> result) : _result(result) {
}
protected:
void onClickImpl() const override;
private:
not_null<Result*> _result;
};
class CancelFileClickHandler : public LeftButtonClickHandler { class CancelFileClickHandler : public LeftButtonClickHandler {
public: public:
CancelFileClickHandler(not_null<Result*> result) : _result(result) { CancelFileClickHandler(not_null<Result*> result) : _result(result) {
@ -328,7 +315,7 @@ private:
mutable std::unique_ptr<AnimationData> _animation; mutable std::unique_ptr<AnimationData> _animation;
Ui::Text::String _title, _description; Ui::Text::String _title, _description;
ClickHandlerPtr _open, _cancel; ClickHandlerPtr _cancel;
// >= 0 will contain download / upload string, _statusSize = loaded bytes // >= 0 will contain download / upload string, _statusSize = loaded bytes
// < 0 will contain played string, _statusSize = -(seconds + 1) played // < 0 will contain played string, _statusSize = -(seconds + 1) played

View file

@ -199,10 +199,9 @@ ClickHandlerPtr ItemBase::getResultPreviewHandler() const {
false); false);
} else if (const auto document = _result->_document } else if (const auto document = _result->_document
&& _result->_document->createMediaView()->canBePlayed()) { && _result->_document->createMediaView()->canBePlayed()) {
return std::make_shared<DocumentOpenClickHandler>( return std::make_shared<OpenFileClickHandler>();
_result->_document);
} else if (_result->_photo) { } else if (_result->_photo) {
return std::make_shared<PhotoOpenClickHandler>(_result->_photo); return std::make_shared<OpenFileClickHandler>();
} }
return ClickHandlerPtr(); return ClickHandlerPtr();
} }

View file

@ -42,6 +42,12 @@ public:
} }
}; };
class OpenFileClickHandler : public ClickHandler {
public:
void onClick(ClickContext context) const override {
}
};
class Context { class Context {
public: public:
virtual void inlineItemLayoutChanged(const ItemBase *layout) = 0; virtual void inlineItemLayoutChanged(const ItemBase *layout) = 0;
@ -131,6 +137,7 @@ protected:
PhotoData *_photo = nullptr; PhotoData *_photo = nullptr;
ClickHandlerPtr _send = ClickHandlerPtr{ new SendClickHandler() }; ClickHandlerPtr _send = ClickHandlerPtr{ new SendClickHandler() };
ClickHandlerPtr _open = ClickHandlerPtr{ new OpenFileClickHandler() };
int _position = 0; // < 0 means removed from layout int _position = 0; // < 0 means removed from layout

View file

@ -331,12 +331,13 @@ bool Result::onChoose(Layout::ItemBase *layout) {
return true; return true;
} }
void Result::openFile() { Media::View::OpenRequest Result::openRequest() {
if (_document) { if (_document) {
DocumentOpenClickHandler(_document).onClick({}); return Media::View::OpenRequest(_document, nullptr);
} else if (_photo) { } else if (_photo) {
PhotoOpenClickHandler(_photo).onClick({}); return Media::View::OpenRequest(_photo, nullptr);
} }
return {};
} }
void Result::cancelFile() { void Result::cancelFile() {

View file

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_cloud_file.h" #include "data/data_cloud_file.h"
#include "api/api_common.h" #include "api/api_common.h"
#include "media/view/media_view_open_common.h"
class FileLoader; class FileLoader;
class History; class History;
@ -54,7 +55,7 @@ public:
// inline bot result. If it returns true you need to send this result. // inline bot result. If it returns true you need to send this result.
bool onChoose(Layout::ItemBase *layout); bool onChoose(Layout::ItemBase *layout);
void openFile(); Media::View::OpenRequest openRequest();
void cancelFile(); void cancelFile();
bool hasThumbDisplay() const; bool hasThumbDisplay() const;
@ -131,6 +132,8 @@ struct ResultSelected {
not_null<Result*> result; not_null<Result*> result;
not_null<UserData*> bot; not_null<UserData*> bot;
Api::SendOptions options; Api::SendOptions options;
// Open in OverlayWidget;
bool open = false;
}; };
} // namespace InlineBots } // namespace InlineBots

View file

@ -236,22 +236,22 @@ void Inner::mouseReleaseEvent(QMouseEvent *e) {
return; return;
} }
if (dynamic_cast<InlineBots::Layout::SendClickHandler*>(activated.get())) { using namespace InlineBots::Layout;
int row = _selected / MatrixRowShift, column = _selected % MatrixRowShift; const auto open = dynamic_cast<OpenFileClickHandler*>(activated.get());
selectInlineResult(row, column); if (dynamic_cast<SendClickHandler*>(activated.get()) || open) {
const auto row = int(_selected / MatrixRowShift);
const auto column = int(_selected % MatrixRowShift);
selectInlineResult(row, column, {}, !!open);
} else { } else {
ActivateClickHandler(window(), activated, e->button()); ActivateClickHandler(window(), activated, e->button());
} }
} }
void Inner::selectInlineResult(int row, int column) {
selectInlineResult(row, column, Api::SendOptions());
}
void Inner::selectInlineResult( void Inner::selectInlineResult(
int row, int row,
int column, int column,
Api::SendOptions options) { Api::SendOptions options,
bool open) {
if (row >= _rows.size() || column >= _rows.at(row).items.size()) { if (row >= _rows.size() || column >= _rows.at(row).items.size()) {
return; return;
} }
@ -262,7 +262,8 @@ void Inner::selectInlineResult(
_resultSelectedCallback({ _resultSelectedCallback({
.result = inlineResult, .result = inlineResult,
.bot = _inlineBot, .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<Ui::PopupMenu>(this); _menu = base::make_unique_q<Ui::PopupMenu>(this);
const auto send = [=](Api::SendOptions options) { const auto send = [=](Api::SendOptions options) {
selectInlineResult(row, column, options); selectInlineResult(row, column, options, false);
}; };
SendMenu::FillSendMenu( SendMenu::FillSendMenu(
_menu, _menu,

View file

@ -147,8 +147,11 @@ private:
void deleteUnusedInlineLayouts(); void deleteUnusedInlineLayouts();
int validateExistingInlineRows(const Results &results); int validateExistingInlineRows(const Results &results);
void selectInlineResult(int row, int column); void selectInlineResult(
void selectInlineResult(int row, int column, Api::SendOptions options); int row,
int column,
Api::SendOptions options,
bool open);
not_null<Window::SessionController*> _controller; not_null<Window::SessionController*> _controller;

View file

@ -18,6 +18,9 @@ namespace Media::View {
struct OpenRequest { struct OpenRequest {
public: public:
OpenRequest() {
}
OpenRequest(not_null<PhotoData*> photo, HistoryItem *item) OpenRequest(not_null<PhotoData*> photo, HistoryItem *item)
: _photo(photo) : _photo(photo)
, _item(item) { , _item(item) {

View file

@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_replies_section.h" #include "history/view/history_view_replies_section.h"
#include "media/player/media_player_instance.h" #include "media/player/media_player_instance.h"
#include "media/view/media_view_open_common.h" #include "media/view/media_view_open_common.h"
#include "data/data_document_resolver.h"
#include "data/data_media_types.h" #include "data/data_media_types.h"
#include "data/data_session.h" #include "data/data_session.h"
#include "data/data_folder.h" #include "data/data_folder.h"
@ -1235,9 +1236,8 @@ void SessionController::openPhoto(
void SessionController::openDocument( void SessionController::openDocument(
not_null<DocumentData*> document, not_null<DocumentData*> document,
FullMsgId contextId) { FullMsgId contextId) {
_window->openInMediaView(Media::View::OpenRequest( // TEMP.
document, Data::ResolveDocument(document, session().data().message(contextId));
session().data().message(contextId)));
} }
SessionController::~SessionController() = default; SessionController::~SessionController() = default;