diff --git a/ui/widgets/fields/input_field.cpp b/ui/widgets/fields/input_field.cpp index b8c94b8..83c86aa 100644 --- a/ui/widgets/fields/input_field.cpp +++ b/ui/widgets/fields/input_field.cpp @@ -14,6 +14,7 @@ #include "base/invoke_queued.h" #include "base/random.h" #include "base/platform/base_platform_info.h" +#include "base/qt_signal_producer.h" #include "emoji_suggestions_helper.h" #include "base/qthelp_regex.h" #include "base/qt/qt_common_adapters.h" @@ -1210,13 +1211,42 @@ InputField::InputField( _touchTimer.setCallback([=] { _touchRightButton = true; }); - connect(_inner->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(onDocumentContentsChange(int,int,int))); - connect(_inner.get(), SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool))); - connect(_inner.get(), SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool))); - connect(_inner.get(), SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged())); - connect(_inner.get(), &Inner::selectionChanged, [] { + base::qt_signal_producer( + _inner->document(), + &QTextDocument::contentsChange + ) | rpl::start_with_next([=](int position, int removed, int added) { + documentContentsChanged(position, removed, added); + }, lifetime()); + base::qt_signal_producer( + _inner.get(), + &QTextEdit::undoAvailable + ) | rpl::start_with_next([=](bool undoAvailable) { + _undoAvailable = undoAvailable; Integration::Instance().textActionsUpdated(); - }); + }, lifetime()); + base::qt_signal_producer( + _inner.get(), + &QTextEdit::redoAvailable + ) | rpl::start_with_next([=](bool redoAvailable) { + _redoAvailable = redoAvailable; + Integration::Instance().textActionsUpdated(); + }, lifetime()); + base::qt_signal_producer( + _inner.get(), + &QTextEdit::cursorPositionChanged + ) | rpl::start_with_next([=] { + auto cursor = textCursor(); + if (!cursor.hasSelection() && !cursor.position()) { + cursor.setCharFormat(_defaultCharFormat); + setTextCursor(cursor); + } + }, lifetime()); + base::qt_signal_producer( + _inner.get(), + &Inner::selectionChanged + ) | rpl::start_with_next([] { + Integration::Instance().textActionsUpdated(); + }, lifetime()); const auto bar = _inner->verticalScrollBar(); _scrollTop = bar->value(); @@ -1757,12 +1787,16 @@ void InputField::focusInEvent(QFocusEvent *e) { _borderAnimationStart = (e->reason() == Qt::MouseFocusReason) ? mapFromGlobal(QCursor::pos()).x() : (width() / 2); - InvokeQueued(this, [=] { if (hasFocus()) onFocusInner(); }); + InvokeQueued(this, [=] { + if (hasFocus()) { + focusInner(); + } + }); } void InputField::mousePressEvent(QMouseEvent *e) { _borderAnimationStart = e->pos().x(); - InvokeQueued(this, [=] { onFocusInner(); }); + InvokeQueued(this, [=] { focusInner(); }); } void InputField::mousePressEventInner(QMouseEvent *e) { @@ -1788,7 +1822,7 @@ void InputField::mouseMoveEventInner(QMouseEvent *e) { _inner->QTextEdit::mouseMoveEvent(e); } -void InputField::onFocusInner() { +void InputField::focusInner() { auto borderStart = _borderAnimationStart; _inner->setFocus(); _borderAnimationStart = borderStart; @@ -2271,7 +2305,7 @@ void InputField::processFormatting(int insertPosition, int insertEnd) { } } -void InputField::onDocumentContentsChange( +void InputField::documentContentsChanged( int position, int charsRemoved, int charsAdded) { @@ -2339,14 +2373,6 @@ void InputField::onDocumentContentsChange( } } -void InputField::onCursorPositionChanged() { - auto cursor = textCursor(); - if (!cursor.hasSelection() && !cursor.position()) { - cursor.setCharFormat(_defaultCharFormat); - setTextCursor(cursor); - } -} - void InputField::chopByMaxLength(int insertPosition, int insertLength) { Expects(_correcting); @@ -2445,16 +2471,6 @@ void InputField::highlightMarkdown() { } } -void InputField::onUndoAvailable(bool avail) { - _undoAvailable = avail; - Integration::Instance().textActionsUpdated(); -} - -void InputField::onRedoAvailable(bool avail) { - _redoAvailable = avail; - Integration::Instance().textActionsUpdated(); -} - void InputField::setDisplayFocused(bool focused) { setFocused(focused); finishAnimating(); diff --git a/ui/widgets/fields/input_field.h b/ui/widgets/fields/input_field.h index 854fe73..0e49f71 100644 --- a/ui/widgets/fields/input_field.h +++ b/ui/widgets/fields/input_field.h @@ -103,8 +103,6 @@ private: }; class InputField : public RpWidget { - Q_OBJECT - public: enum class Mode { SingleLine, @@ -324,16 +322,6 @@ public: ~InputField(); -private Q_SLOTS: - - void onDocumentContentsChange(int position, int charsRemoved, int charsAdded); - void onCursorPositionChanged(); - - void onUndoAvailable(bool avail); - void onRedoAvailable(bool avail); - - void onFocusInner(); - protected: void startPlaceholderAnimation(); void startBorderAnimation(); @@ -378,6 +366,12 @@ private: void insertFromMimeDataInner(const QMimeData *source); TextWithTags getTextWithTagsSelected() const; + void documentContentsChanged( + int position, + int charsRemoved, + int charsAdded); + void focusInner(); + // "start" and "end" are in coordinates of text where emoji are replaced // by ObjectReplacementCharacter. If "end" = -1 means get text till the end. QString getTextPart(