Provided more context for click handlers.
This commit is contained in:
		
							parent
							
								
									7c8b1cd5b1
								
							
						
					
					
						commit
						93bcd90fd4
					
				
					 10 changed files with 114 additions and 19 deletions
				
			
		|  | @ -7,11 +7,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| */ | ||||
| #include "chat_helpers/bot_keyboard.h" | ||||
| 
 | ||||
| #include "core/click_handler_types.h" | ||||
| #include "history/history.h" | ||||
| #include "history/history_item_components.h" | ||||
| #include "data/data_user.h" | ||||
| #include "data/data_session.h" | ||||
| #include "main/main_session.h" | ||||
| #include "window/window_session_controller.h" | ||||
| #include "ui/cached_round_corners.h" | ||||
| #include "facades.h" | ||||
| #include "styles/style_widgets.h" | ||||
|  | @ -98,9 +100,11 @@ int Style::minButtonWidth(HistoryMessageMarkupButton::Type type) const { | |||
| 
 | ||||
| } // namespace
 | ||||
| 
 | ||||
| BotKeyboard::BotKeyboard(not_null<Main::Session*> session, QWidget *parent) | ||||
| BotKeyboard::BotKeyboard( | ||||
| 	not_null<Window::SessionController*> controller, | ||||
| 	QWidget *parent) | ||||
| : TWidget(parent) | ||||
| , _session(session) | ||||
| , _controller(controller) | ||||
| , _st(&st::botKbButton) { | ||||
| 	setGeometry(0, 0, _st->margin, st::botKbScroll.deltat); | ||||
| 	_height = st::botKbScroll.deltat; | ||||
|  | @ -137,7 +141,12 @@ void BotKeyboard::mouseReleaseEvent(QMouseEvent *e) { | |||
| 	updateSelected(); | ||||
| 
 | ||||
| 	if (ClickHandlerPtr activated = ClickHandler::unpressed()) { | ||||
| 		ActivateClickHandler(window(), activated, e->button()); | ||||
| 		ActivateClickHandler(window(), activated, { | ||||
| 			e->button(), | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.sessionWindow = base::make_weak(_controller.get()), | ||||
| 			}) | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -151,7 +160,8 @@ void BotKeyboard::leaveEventHook(QEvent *e) { | |||
| } | ||||
| 
 | ||||
| bool BotKeyboard::moderateKeyActivate(int key) { | ||||
| 	if (const auto item = _session->data().message(_wasForMsgId)) { | ||||
| 	const auto &data = _controller->session().data(); | ||||
| 	if (const auto item = data.message(_wasForMsgId)) { | ||||
| 		if (const auto markup = item->Get<HistoryMessageReplyMarkup>()) { | ||||
| 			if (key >= Qt::Key_1 && key <= Qt::Key_2) { | ||||
| 				const auto index = int(key - Qt::Key_1); | ||||
|  |  | |||
|  | @ -15,16 +15,18 @@ namespace style { | |||
| struct BotKeyboardButton; | ||||
| } // namespace style
 | ||||
| 
 | ||||
| namespace Main { | ||||
| class Session; | ||||
| } // namespace Main
 | ||||
| namespace Window { | ||||
| class SessionController; | ||||
| } // namespace Window
 | ||||
| 
 | ||||
| class BotKeyboard | ||||
| 	: public TWidget | ||||
| 	, public Ui::AbstractTooltipShower | ||||
| 	, public ClickHandlerHost { | ||||
| public: | ||||
| 	BotKeyboard(not_null<Main::Session*> session, QWidget *parent); | ||||
| 	BotKeyboard( | ||||
| 		not_null<Window::SessionController*> controller, | ||||
| 		QWidget *parent); | ||||
| 
 | ||||
| 	bool moderateKeyActivate(int index); | ||||
| 
 | ||||
|  | @ -78,7 +80,7 @@ private: | |||
| 	void updateStyle(int newWidth); | ||||
| 	void clearSelection(); | ||||
| 
 | ||||
| 	const not_null<Main::Session*> _session; | ||||
| 	const not_null<Window::SessionController*> _controller; | ||||
| 	FullMsgId _wasForMsgId; | ||||
| 	QString _placeholder; | ||||
| 	int _height = 0; | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "data/data_document_media.h" | ||||
| #include "data/stickers/data_stickers.h" | ||||
| #include "chat_helpers/send_context_menu.h" // SendMenu::FillSendMenu
 | ||||
| #include "core/click_handler_types.h" | ||||
| #include "ui/widgets/buttons.h" | ||||
| #include "ui/widgets/input_fields.h" | ||||
| #include "ui/widgets/popup_menu.h" | ||||
|  | @ -415,7 +416,12 @@ void GifsListWidget::mouseReleaseEvent(QMouseEvent *e) { | |||
| 	if (dynamic_cast<InlineBots::Layout::SendClickHandler*>(activated.get())) { | ||||
| 		selectInlineResult(_selected, {}); | ||||
| 	} else { | ||||
| 		ActivateClickHandler(window(), activated, e->button()); | ||||
| 		ActivateClickHandler(window(), activated, { | ||||
| 			e->button(), | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.sessionWindow = base::make_weak(controller().get()), | ||||
| 			}) | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,11 +23,15 @@ class SessionController; | |||
| 
 | ||||
| [[nodiscard]] bool UrlRequiresConfirmation(const QUrl &url); | ||||
| 
 | ||||
| class PeerData; | ||||
| struct ClickHandlerContext { | ||||
| 	FullMsgId itemId; | ||||
| 	// Is filled from sections.
 | ||||
| 	Fn<HistoryView::ElementDelegate*()> elementDelegate; | ||||
| 	base::weak_ptr<Window::SessionController> sessionWindow; | ||||
| 	bool skipBotAutoLogin = false; | ||||
| 	// Is filled from peer info.
 | ||||
| 	PeerData *peer = nullptr; | ||||
| }; | ||||
| Q_DECLARE_METATYPE(ClickHandlerContext); | ||||
| 
 | ||||
|  | @ -169,7 +173,6 @@ private: | |||
| 
 | ||||
| }; | ||||
| 
 | ||||
| class PeerData; | ||||
| class BotCommandClickHandler : public TextClickHandler { | ||||
| public: | ||||
| 	BotCommandClickHandler(const QString &cmd) : _cmd(cmd) { | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "ui/text/text_utilities.h" | ||||
| #include "ui/inactive_press.h" | ||||
| #include "ui/effects/path_shift_gradient.h" | ||||
| #include "core/click_handler_types.h" | ||||
| #include "core/file_utilities.h" | ||||
| #include "lang/lang_keys.h" | ||||
| #include "boxes/peers/edit_participant_box.h" | ||||
|  | @ -1561,7 +1562,17 @@ void InnerWidget::mouseActionFinish(const QPoint &screenPos, Qt::MouseButton but | |||
| 
 | ||||
| 	if (activated) { | ||||
| 		mouseActionCancel(); | ||||
| 		ActivateClickHandler(window(), activated, button); | ||||
| 		ActivateClickHandler(window(), activated, { | ||||
| 			button, | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.elementDelegate = [weak = Ui::MakeWeak(this)] { | ||||
| 					return weak | ||||
| 						? (ElementDelegate*)weak | ||||
| 						: nullptr; | ||||
| 				}, | ||||
| 				.sessionWindow = base::make_weak(_controller.get()), | ||||
| 			}) | ||||
| 		}); | ||||
| 		return; | ||||
| 	} | ||||
| 	if (_mouseAction == MouseAction::PrepareDrag && !_pressWasInactive && button != Qt::RightButton) { | ||||
|  |  | |||
|  | @ -216,7 +216,7 @@ HistoryWidget::HistoryWidget( | |||
| 	tr::lng_message_ph()) | ||||
| , _kbScroll(this, st::botKbScroll) | ||||
| , _keyboard(_kbScroll->setOwnedWidget(object_ptr<BotKeyboard>( | ||||
| 	&session(), | ||||
| 	controller, | ||||
| 	this))) | ||||
| , _membersDropdownShowTimer([=] { showMembersDropdown(); }) | ||||
| , _scrollTimer([=] { scrollByTimer(); }) | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "styles/style_overview.h" | ||||
| #include "styles/style_info.h" | ||||
| #include "base/platform/base_platform_info.h" | ||||
| #include "base/weak_ptr.h" | ||||
| #include "media/player/media_player_instance.h" | ||||
| #include "boxes/peer_list_controllers.h" | ||||
| #include "boxes/confirm_box.h" | ||||
|  | @ -2290,7 +2291,18 @@ void ListWidget::mouseActionFinish( | |||
| 	_wasSelectedText = false; | ||||
| 	if (activated) { | ||||
| 		mouseActionCancel(); | ||||
| 		ActivateClickHandler(window(), activated, button); | ||||
| 		const auto found = findItemById(pressState.itemId); | ||||
| 		const auto fullId = found | ||||
| 			? found->layout->getItem()->fullId() | ||||
| 			: FullMsgId(); | ||||
| 		ActivateClickHandler(window(), activated, { | ||||
| 			button, | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.itemId = fullId, | ||||
| 				.sessionWindow = base::make_weak( | ||||
| 					_controller->parentController().get()), | ||||
| 			}) | ||||
| 		}); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "mainwindow.h" // MainWindow::controller.
 | ||||
| #include "main/main_session.h" | ||||
| #include "core/application.h" | ||||
| #include "core/click_handler_types.h" | ||||
| #include "apiwrap.h" | ||||
| #include "facades.h" | ||||
| #include "styles/style_info.h" | ||||
|  | @ -189,9 +190,46 @@ DetailsFiller::DetailsFiller( | |||
| , _wrap(_parent) { | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| bool SetClickContext( | ||||
| 		const ClickHandlerPtr &handler, | ||||
| 		const ClickContext &context) { | ||||
| 	if (const auto casted = dynamic_pointer_cast<T>(handler)) { | ||||
| 		casted->T::onClick(context); | ||||
| 		return true; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| object_ptr<Ui::RpWidget> DetailsFiller::setupInfo() { | ||||
| 	auto result = object_ptr<Ui::VerticalLayout>(_wrap); | ||||
| 	auto tracker = Ui::MultiSlideTracker(); | ||||
| 
 | ||||
| 	// Fill context for a mention / hashtag / bot command link.
 | ||||
| 	const auto infoClickFilter = [=, | ||||
| 		peer = _peer.get(), | ||||
| 		window = _controller->parentController()]( | ||||
| 			const ClickHandlerPtr &handler, | ||||
| 			Qt::MouseButton button) { | ||||
| 		const auto context = ClickContext{ | ||||
| 			button, | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.sessionWindow = base::make_weak(window.get()), | ||||
| 				.peer = peer, | ||||
| 			}) | ||||
| 		}; | ||||
| 		if (SetClickContext<BotCommandClickHandler>(handler, context)) { | ||||
| 			return false; | ||||
| 		} else if (SetClickContext<MentionClickHandler>(handler, context)) { | ||||
| 			return false; | ||||
| 		} else if (SetClickContext<HashtagClickHandler>(handler, context)) { | ||||
| 			return false; | ||||
| 		} else if (SetClickContext<CashtagClickHandler>(handler, context)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		return true; | ||||
| 	}; | ||||
| 
 | ||||
| 	auto addInfoLineGeneric = [&]( | ||||
| 			rpl::producer<QString> &&label, | ||||
| 			rpl::producer<TextWithEntities> &&text, | ||||
|  | @ -203,6 +241,8 @@ object_ptr<Ui::RpWidget> DetailsFiller::setupInfo() { | |||
| 			textSt, | ||||
| 			st::infoProfileLabeledPadding); | ||||
| 		tracker.track(result->add(std::move(line.wrap))); | ||||
| 
 | ||||
| 		line.text->setClickHandlerFilter(infoClickFilter); | ||||
| 		return line.text; | ||||
| 	}; | ||||
| 	auto addInfoLine = [&]( | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "api/api_common.h" | ||||
| #include "chat_helpers/gifs_list_widget.h" // ChatHelpers::AddGifAction
 | ||||
| #include "chat_helpers/send_context_menu.h" // SendMenu::FillSendMenu
 | ||||
| #include "core/click_handler_types.h" | ||||
| #include "data/data_file_origin.h" | ||||
| #include "data/data_user.h" | ||||
| #include "data/data_changes.h" | ||||
|  | @ -237,7 +238,12 @@ void Inner::mouseReleaseEvent(QMouseEvent *e) { | |||
| 	if (dynamic_cast<SendClickHandler*>(activated.get()) || open) { | ||||
| 		selectInlineResult(_selected, {}, !!open); | ||||
| 	} else { | ||||
| 		ActivateClickHandler(window(), activated, e->button()); | ||||
| 		ActivateClickHandler(window(), activated, { | ||||
| 			e->button(), | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.sessionWindow = base::make_weak(_controller.get()), | ||||
| 			}) | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | |||
| #include "mainwidget.h" | ||||
| #include "mainwindow.h" | ||||
| #include "core/application.h" | ||||
| #include "core/click_handler_types.h" | ||||
| #include "core/file_utilities.h" | ||||
| #include "core/mime_type.h" | ||||
| #include "core/ui_integration.h" | ||||
|  | @ -4299,10 +4300,14 @@ void OverlayWidget::handleMouseRelease( | |||
| 		} | ||||
| 		// There may be a mention / hashtag / bot command link.
 | ||||
| 		// For now activate account for all activated links.
 | ||||
| 		if (_session) { | ||||
| 			Core::App().domain().activate(&_session->account()); | ||||
| 		} | ||||
| 		ActivateClickHandler(_widget, activated, button); | ||||
| 		// findWindow() will activate account.
 | ||||
| 		ActivateClickHandler(_widget, activated, { | ||||
| 			button, | ||||
| 			QVariant::fromValue(ClickHandlerContext{ | ||||
| 				.itemId = _msgid, | ||||
| 				.sessionWindow = base::make_weak(findWindow()), | ||||
| 			}) | ||||
| 		}); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 23rd
						23rd