From ee44c5b89e4de77702fc9d1d971d5a6ac07e952e Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 18 Oct 2019 00:28:27 +0300 Subject: [PATCH] Added ability to extend context menu of InputField via rpl. --- ui/widgets/input_fields.cpp | 14 ++++++++++++-- ui/widgets/input_fields.h | 9 ++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ui/widgets/input_fields.cpp b/ui/widgets/input_fields.cpp index 1583ddd..abadd34 100644 --- a/ui/widgets/input_fields.cpp +++ b/ui/widgets/input_fields.cpp @@ -1413,6 +1413,16 @@ void InputField::onTouchTimer() { _touchRightButton = true; } +void InputField::setExtendedContextMenu( + rpl::producer value) { + std::move( + value + ) | rpl::start_with_next([=](auto pair) { + auto &[menu, e] = pair; + contextMenuEventInner(&e, std::move(menu)); + }, lifetime()); +} + void InputField::setInstantReplaces(const InstantReplaces &replaces) { _mutableInstantReplaces = replaces; } @@ -3302,8 +3312,8 @@ bool InputField::revertFormatReplace() { return false; } -void InputField::contextMenuEventInner(QContextMenuEvent *e) { - if (const auto menu = _inner->createStandardContextMenu()) { +void InputField::contextMenuEventInner(QContextMenuEvent *e, QMenu *m) { + if (const auto menu = m ? m : _inner->createStandardContextMenu()) { addMarkdownActions(menu, e); _contextMenu = base::make_unique_q(this, menu); _contextMenu->popup(e->globalPos()); diff --git a/ui/widgets/input_fields.h b/ui/widgets/input_fields.h index 2dc3723..f85cb9a 100644 --- a/ui/widgets/input_fields.h +++ b/ui/widgets/input_fields.h @@ -12,6 +12,7 @@ #include "ui/text/text_entity.h" #include "styles/style_widgets.h" +#include #include #include #include @@ -238,11 +239,17 @@ public: QString link, EditLinkAction action)> callback); + struct ExtendedContextMenu { + QMenu *menu = nullptr; + QContextMenuEvent event; + }; + void setAdditionalMargin(int margin); void setInstantReplaces(const InstantReplaces &replaces); void setInstantReplacesEnabled(rpl::producer enabled); void setMarkdownReplacesEnabled(rpl::producer enabled); + void setExtendedContextMenu(rpl::producer value); void commitInstantReplacement(int from, int till, const QString &with); void commitMarkdownLinkEdit( EditLinkSelection selection, @@ -376,7 +383,7 @@ private: void focusOutEventInner(QFocusEvent *e); void setFocused(bool focused); void keyPressEventInner(QKeyEvent *e); - void contextMenuEventInner(QContextMenuEvent *e); + void contextMenuEventInner(QContextMenuEvent *e, QMenu *m = nullptr); void dropEventInner(QDropEvent *e); void inputMethodEventInner(QInputMethodEvent *e);