Allow better InputField content restriction.

This commit is contained in:
John Preston 2023-11-14 12:17:00 +04:00
parent fee301f941
commit e3eabf8eff
2 changed files with 25 additions and 12 deletions

View file

@ -51,7 +51,6 @@ constexpr auto kReplaceTagId = QTextFormat::UserProperty + 3;
constexpr auto kTagProperty = QTextFormat::UserProperty + 4; constexpr auto kTagProperty = QTextFormat::UserProperty + 4;
constexpr auto kCustomEmojiText = QTextFormat::UserProperty + 5; constexpr auto kCustomEmojiText = QTextFormat::UserProperty + 5;
constexpr auto kCustomEmojiLink = QTextFormat::UserProperty + 6; constexpr auto kCustomEmojiLink = QTextFormat::UserProperty + 6;
constexpr auto kCustomEmojiId = QTextFormat::UserProperty + 7;
const auto kObjectReplacementCh = QChar(QChar::ObjectReplacementCharacter); const auto kObjectReplacementCh = QChar(QChar::ObjectReplacementCharacter);
const auto kObjectReplacement = QString::fromRawData( const auto kObjectReplacement = QString::fromRawData(
&kObjectReplacementCh, &kObjectReplacementCh,
@ -65,6 +64,7 @@ const auto &kTagPre = InputField::kTagPre;
const auto &kTagBlockquote = InputField::kTagBlockquote; const auto &kTagBlockquote = InputField::kTagBlockquote;
const auto &kTagSpoiler = InputField::kTagSpoiler; const auto &kTagSpoiler = InputField::kTagSpoiler;
const auto &kCustomEmojiFormat = InputField::kCustomEmojiFormat; const auto &kCustomEmojiFormat = InputField::kCustomEmojiFormat;
const auto &kCustomEmojiId = InputField::kCustomEmojiId;
const auto kTagCheckLinkMeta = u"^:/:/:^"_q; const auto kTagCheckLinkMeta = u"^:/:/:^"_q;
const auto kNewlineChars = QString("\r\n") const auto kNewlineChars = QString("\r\n")
+ QChar(0xfdd0) // QTextBeginningOfFrame + QChar(0xfdd0) // QTextBeginningOfFrame
@ -711,14 +711,6 @@ QTextImageFormat PrepareEmojiFormat(EmojiPtr emoji, const QFont &font) {
return result; return result;
} }
// Optimization: with null page size document does not re-layout
// on each insertText / mergeCharFormat.
void PrepareFormattingOptimization(not_null<QTextDocument*> document) {
if (!document->pageSize().isNull()) {
document->setPageSize(QSizeF(0, 0));
}
}
void RemoveDocumentTags( void RemoveDocumentTags(
const style::InputField &st, const style::InputField &st,
not_null<QTextDocument*> document, not_null<QTextDocument*> document,
@ -954,8 +946,8 @@ const QString InputField::kTagPre = u"```"_q;
const QString InputField::kTagSpoiler = u"||"_q; const QString InputField::kTagSpoiler = u"||"_q;
const QString InputField::kTagBlockquote = u">"_q; const QString InputField::kTagBlockquote = u">"_q;
const QString InputField::kCustomEmojiTagStart = u"custom-emoji://"_q; const QString InputField::kCustomEmojiTagStart = u"custom-emoji://"_q;
const int InputField::kCustomEmojiFormat const int InputField::kCustomEmojiFormat = QTextFormat::UserObject + 1;
= QTextFormat::UserObject + 1; const int InputField::kCustomEmojiId = QTextFormat::UserProperty + 7;
class InputField::Inner final : public QTextEdit { class InputField::Inner final : public QTextEdit {
public: public:
@ -2353,6 +2345,12 @@ void InputField::processFormatting(int insertPosition, int insertEnd) {
} }
} }
void InputField::forceProcessContentsChanges() {
PostponeCall(this, [=] {
handleContentsChanged();
});
}
void InputField::documentContentsChanged( void InputField::documentContentsChanged(
int position, int position,
int charsRemoved, int charsRemoved,
@ -3982,4 +3980,12 @@ rpl::producer<Qt::KeyboardModifiers> InputField::submits() const {
InputField::~InputField() = default; InputField::~InputField() = default;
// Optimization: with null page size document does not re-layout
// on each insertText / mergeCharFormat.
void PrepareFormattingOptimization(not_null<QTextDocument*> document) {
if (!document->pageSize().isNull()) {
document->setPageSize(QSizeF(0, 0));
}
}
} // namespace Ui } // namespace Ui

View file

@ -14,6 +14,9 @@
#include "ui/text/text_custom_emoji.h" #include "ui/text/text_custom_emoji.h"
#include <QtGui/QTextObjectInterface> #include <QtGui/QTextObjectInterface>
#include <QtGui/qtextlayout.h>
#include <QtGui/qtextdocument.h>
#include <QtGui/qtextcursor.h>
#include <rpl/variable.h> #include <rpl/variable.h>
@ -136,7 +139,8 @@ public:
static const QString kTagSpoiler; static const QString kTagSpoiler;
static const QString kTagBlockquote; static const QString kTagBlockquote;
static const QString kCustomEmojiTagStart; static const QString kCustomEmojiTagStart;
static const int kCustomEmojiFormat; static const int kCustomEmojiFormat; // QTextFormat::ObjectTypes
static const int kCustomEmojiId; // QTextFormat::Property
InputField( InputField(
QWidget *parent, QWidget *parent,
@ -323,6 +327,7 @@ public:
[[nodiscard]] rpl::producer<> cancelled() const; [[nodiscard]] rpl::producer<> cancelled() const;
[[nodiscard]] rpl::producer<> changes() const; [[nodiscard]] rpl::producer<> changes() const;
[[nodiscard]] rpl::producer<Qt::KeyboardModifiers> submits() const; [[nodiscard]] rpl::producer<Qt::KeyboardModifiers> submits() const;
void forceProcessContentsChanges();
~InputField(); ~InputField();
@ -565,4 +570,6 @@ private:
}; };
void PrepareFormattingOptimization(not_null<QTextDocument*> document);
} // namespace Ui } // namespace Ui