From 09d19fe065125ccc6e406fa325d675387788ab3c Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 26 Aug 2009 12:39:25 +0200 Subject: [PATCH] Make multiline input configurable You can now switch this off to get a single line with paste protection as it used to be. This makes mostly sense for people using a Qt style with buggy layouting, screwing up dynamic resize. --- src/qtui/inputwidget.cpp | 14 ++++-- src/qtui/inputwidget.h | 3 +- .../settingspages/inputwidgetsettingspage.ui | 9 ++++ src/uisupport/multilineedit.cpp | 47 +++++++++++++++++-- src/uisupport/multilineedit.h | 5 ++ 5 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 11e3ec35..22e0602b 100644 --- a/src/qtui/inputwidget.cpp +++ b/src/qtui/inputwidget.cpp @@ -54,6 +54,7 @@ InputWidget::InputWidget(QWidget *parent) ui.inputEdit->setMinHeight(1); ui.inputEdit->setMaxHeight(5); ui.inputEdit->setMode(MultiLineEdit::MultiLine); + ui.inputEdit->setPasteProtectionEnabled(true); new TabCompleter(ui.inputEdit); @@ -74,8 +75,11 @@ InputWidget::InputWidget(QWidget *parent) s.notify("MaxNumLines", this, SLOT(setMaxLines(QVariant))); setMaxLines(s.value("MaxNumLines", 5)); - s.notify("EnableScrollBars", this, SLOT(setEnableScrollBars(QVariant))); - setEnableScrollBars(s.value("EnableScrollBars", true)); + s.notify("EnableScrollBars", this, SLOT(setScrollBarsEnabled(QVariant))); + setScrollBarsEnabled(s.value("EnableScrollBars", true)); + + s.notify("EnableMultiLine", this, SLOT(setMultiLineEnabled(QVariant))); + setMultiLineEnabled(s.value("EnableMultiLine", true)); ActionCollection *coll = QtUi::actionCollection(); @@ -107,10 +111,14 @@ void InputWidget::setMaxLines(const QVariant &v) { ui.inputEdit->setMaxHeight(v.toInt()); } -void InputWidget::setEnableScrollBars(const QVariant &v) { +void InputWidget::setScrollBarsEnabled(const QVariant &v) { ui.inputEdit->setScrollBarsEnabled(v.toBool()); } +void InputWidget::setMultiLineEnabled(const QVariant &v) { + ui.inputEdit->setMode(v.toBool()? MultiLineEdit::MultiLine : MultiLineEdit::SingleLine); +} + bool InputWidget::eventFilter(QObject *watched, QEvent *event) { if(event->type() != QEvent::KeyPress) return false; diff --git a/src/qtui/inputwidget.h b/src/qtui/inputwidget.h index 7ba90464..6e785095 100644 --- a/src/qtui/inputwidget.h +++ b/src/qtui/inputwidget.h @@ -55,7 +55,8 @@ private slots: void setEnableSpellCheck(const QVariant &); void setShowNickSelector(const QVariant &); void setMaxLines(const QVariant &); - void setEnableScrollBars(const QVariant &); + void setMultiLineEnabled(const QVariant &); + void setScrollBarsEnabled(const QVariant &); void sendText(const QString &text) const; void changeNick(const QString &newNick) const; diff --git a/src/qtui/settingspages/inputwidgetsettingspage.ui b/src/qtui/settingspages/inputwidgetsettingspage.ui index 92aea269..a4dedc46 100644 --- a/src/qtui/settingspages/inputwidgetsettingspage.ui +++ b/src/qtui/settingspages/inputwidgetsettingspage.ui @@ -78,6 +78,15 @@ Multi-Line Editing + + true + + + EnableMultiLine + + + true + diff --git a/src/uisupport/multilineedit.cpp b/src/uisupport/multilineedit.cpp index 96fd43f5..699d4ec8 100644 --- a/src/uisupport/multilineedit.cpp +++ b/src/uisupport/multilineedit.cpp @@ -166,6 +166,10 @@ void MultiLineEdit::setWordWrapEnabled(bool enable) { updateSizeHint(); } +void MultiLineEdit::setPasteProtectionEnabled(bool enable, QWidget *) { + _pasteProtectionEnabled = enable; +} + void MultiLineEdit::historyMoveBack() { addToHistory(text(), true); @@ -293,8 +297,12 @@ void MultiLineEdit::keyPressEvent(QKeyEvent *event) { } void MultiLineEdit::on_returnPressed() { - if(!text().isEmpty()) { - foreach(const QString &line, text().split('\n', QString::SkipEmptyParts)) { + on_returnPressed(text()); +} + +void MultiLineEdit::on_returnPressed(const QString & text) { + if(!text.isEmpty()) { + foreach(const QString &line, text.split('\n', QString::SkipEmptyParts)) { if(line.isEmpty()) continue; addToHistory(line); @@ -309,8 +317,39 @@ void MultiLineEdit::on_textChanged() { QString newText = text(); newText.replace("\r\n", "\n"); newText.replace('\r', '\n'); - if(_mode == SingleLine) - newText.replace('\n', ' '); + if(_mode == SingleLine) { + if(!pasteProtectionEnabled()) + newText.replace('\n', ' '); + else if(newText.contains('\n')) { + QStringList lines = newText.split('\n', QString::SkipEmptyParts); + clear(); + + if(lines.count() >= 4) { + QString msg = tr("Do you really want to paste %n lines?", "", lines.count()); + msg += "

"; + for(int i = 0; i < 4; i++) { + msg += Qt::escape(lines[i].left(40)); + if(lines[i].count() > 40) + msg += "..."; + msg += "
"; + } + msg += "...

"; + QMessageBox question(QMessageBox::NoIcon, tr("Paste Protection"), msg, QMessageBox::Yes|QMessageBox::No); + question.setDefaultButton(QMessageBox::No); +#ifdef Q_WS_MAC + question.setWindowFlags(question.windowFlags() | Qt::Sheet); +#endif + if(question.exec() != QMessageBox::Yes) + return; + } + + foreach(QString line, lines) { + clear(); + insert(line); + on_returnPressed(); + } + } + } _singleLine = (newText.indexOf('\n') < 0); diff --git a/src/uisupport/multilineedit.h b/src/uisupport/multilineedit.h index 0a527b9e..d12dfe6d 100644 --- a/src/uisupport/multilineedit.h +++ b/src/uisupport/multilineedit.h @@ -58,7 +58,9 @@ public: inline void insert(const QString &newText) { insertPlainText(newText); } inline void backspace() { keyPressEvent(new QKeyEvent(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier)); } inline bool hasSelectedText() { return textCursor().hasSelection(); } + inline bool isSingleLine() const { return _singleLine; } + inline bool pasteProtectionEnabled() const { return _pasteProtectionEnabled; } virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; @@ -69,6 +71,7 @@ public slots: void setMaxHeight(int numLines); void setScrollBarsEnabled(bool enable = true); void setSpellCheckEnabled(bool enable = true); + void setPasteProtectionEnabled(bool enable = true, QWidget *msgBoxParent = 0); // Note: Enabling wrap will make isSingleLine() not work correctly, so only use this if minHeight() > 1! void setWordWrapEnabled(bool enable = true); @@ -82,6 +85,7 @@ protected: private slots: void on_returnPressed(); + void on_returnPressed(const QString &text); void on_textChanged(); void on_documentHeightChanged(qreal height); @@ -98,6 +102,7 @@ private: int _minHeight; int _maxHeight; bool _scrollBarsEnabled; + bool _pasteProtectionEnabled; QSize _sizeHint; qreal _lastDocumentHeight; -- 2.20.1