From 29307b7b1591018ffcbade608b47803d57ed6674 Mon Sep 17 00:00:00 2001 From: Tuomo Pelkonen Date: Tue, 23 Feb 2021 11:47:14 +0200 Subject: [PATCH] QmlDesigner: Improve in-place Text element text modification When double-clicking Text -element, check if the text is rich text or not. In case of rich text, show a rich-text editor modal dialog In case of plain text, show a in-place LineEdit with correct font Task-number: QDS-2306 Change-Id: I5206c7d6c869e26ad39979106510d72626dbe800 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../richtexteditor/richtexteditor.cpp | 6 ++ .../richtexteditor/richtexteditor.h | 3 +- .../components/texttool/textedititem.cpp | 3 + .../components/texttool/texttool.cpp | 22 ++++-- src/plugins/qmldesigner/qmldesignerplugin.pri | 6 +- src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 + .../qmldesigner/richtexteditordialog.cpp | 76 +++++++++++++++++++ .../qmldesigner/richtexteditordialog.h | 56 ++++++++++++++ 9 files changed, 166 insertions(+), 9 deletions(-) create mode 100644 src/plugins/qmldesigner/richtexteditordialog.cpp create mode 100644 src/plugins/qmldesigner/richtexteditordialog.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 5681c7f15d7..34ab71154fb 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -30,6 +30,7 @@ add_qtc_plugin(QmlDesigner settingspage.cpp settingspage.h settingspage.ui shortcutmanager.cpp shortcutmanager.h designermcumanager.cpp designermcumanager.h + richtexteditordialog.cpp richtexteditordialog.h EXPLICIT_MOC components/propertyeditor/propertyeditorvalue.h components/connectioneditor/connectionviewwidget.h diff --git a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp index 0732a08ad97..c58bed2995a 100644 --- a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp +++ b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.cpp @@ -132,6 +132,8 @@ RichTextEditor::RichTextEditor(QWidget *parent) this, &RichTextEditor::currentCharFormatChanged); connect(ui->textEdit, &QTextEdit::cursorPositionChanged, this, &RichTextEditor::cursorPositionChanged); + connect(ui->textEdit, &QTextEdit::textChanged, + this, &RichTextEditor::onTextChanged); connect(m_linkDialog, &QDialog::accepted, [this]() { QTextCharFormat oldFormat = ui->textEdit->textCursor().charFormat(); @@ -223,6 +225,10 @@ void RichTextEditor::cursorPositionChanged() tableChanged(ui->textEdit->textCursor()); } +void RichTextEditor::onTextChanged() { + emit textChanged(richText()); +} + void RichTextEditor::mergeFormatOnWordOrSelection(const QTextCharFormat &format) { QTextCursor cursor = ui->textEdit->textCursor(); diff --git a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.h b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.h index a2f44dd0443..39aeb323183 100644 --- a/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.h +++ b/src/plugins/qmldesigner/components/richtexteditor/richtexteditor.h @@ -69,11 +69,12 @@ public: signals: void insertingImage(QString &filePath); + void textChanged(QString text); private slots: void currentCharFormatChanged(const QTextCharFormat &format); void cursorPositionChanged(); - + void onTextChanged(); private: QIcon getIcon(Theme::Icon icon); void mergeFormatOnWordOrSelection(const QTextCharFormat &format); diff --git a/src/plugins/qmldesigner/components/texttool/textedititem.cpp b/src/plugins/qmldesigner/components/texttool/textedititem.cpp index 1ce3244cbc2..d965c4b7fd5 100644 --- a/src/plugins/qmldesigner/components/texttool/textedititem.cpp +++ b/src/plugins/qmldesigner/components/texttool/textedititem.cpp @@ -76,6 +76,9 @@ void TextEditItem::setFormEditorItem(FormEditorItem *formEditorItem) QSize maximumSize = rect.size().toSize(); activateTextEdit(maximumSize); } else { + auto lineEdit = TextEditItemWidget::lineEdit(); + auto node = m_formEditorItem->qmlItemNode(); + lineEdit->setFont(node.instanceValue("font").value()); activateLineEdit(); } diff --git a/src/plugins/qmldesigner/components/texttool/texttool.cpp b/src/plugins/qmldesigner/components/texttool/texttool.cpp index 76dc414c03f..a8b5ac044ae 100644 --- a/src/plugins/qmldesigner/components/texttool/texttool.cpp +++ b/src/plugins/qmldesigner/components/texttool/texttool.cpp @@ -36,6 +36,7 @@ #include "nodemetainfo.h" #include "qmlitemnode.h" +#include "richtexteditordialog.h" #include #include @@ -207,13 +208,22 @@ void TextTool::selectedItemsChanged(const QList &itemList) } if (!itemList.isEmpty()) { FormEditorItem *formEditorItem = itemList.constFirst(); - m_textItem = new TextEditItem(scene()); - textItem()->setParentItem(scene()->manipulatorLayerItem()); - textItem()->setFormEditorItem(formEditorItem); - connect(textItem(), &TextEditItem::returnPressed, [this] { - textItem()->writeTextToProperty(); + auto text = formEditorItem->qmlItemNode().instanceValue("text").toString(); + auto format = formEditorItem->qmlItemNode().instanceValue("format").value(); + if (format == Qt::RichText || Qt::mightBeRichText(text)) { + RichTextEditorDialog* editorDialog = new RichTextEditorDialog(text); + editorDialog->setFormEditorItem(formEditorItem); + editorDialog->show(); view()->changeToSelectionTool(); - }); + } else { + m_textItem = new TextEditItem(scene()); + textItem()->setParentItem(scene()->manipulatorLayerItem()); + textItem()->setFormEditorItem(formEditorItem); + connect(textItem(), &TextEditItem::returnPressed, [this] { + textItem()->writeTextToProperty(); + view()->changeToSelectionTool(); + }); + } } else { view()->changeToSelectionTool(); } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri index b11ff7a53b1..c7d3c1df056 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pri +++ b/src/plugins/qmldesigner/qmldesignerplugin.pri @@ -10,7 +10,8 @@ HEADERS += $$PWD/qmldesignerconstants.h \ $$PWD/documentwarningwidget.h \ $$PWD/qmldesignericons.h \ $$PWD/openuiqmlfiledialog.h \ - $$PWD/designermcumanager.h + $$PWD/designermcumanager.h \ + $$PWD/richtexteditordialog.h SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/shortcutmanager.cpp \ @@ -22,7 +23,8 @@ SOURCES += $$PWD/qmldesignerplugin.cpp \ $$PWD/documentmanager.cpp \ $$PWD/documentwarningwidget.cpp \ $$PWD/openuiqmlfiledialog.cpp \ - $$PWD/designermcumanager.cpp + $$PWD/designermcumanager.cpp \ + $$PWD/richtexteditordialog.cpp FORMS += $$PWD/settingspage.ui \ $$PWD/openuiqmlfiledialog.ui diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index bd6c94cbb62..816c3d65732 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -984,6 +984,8 @@ Project { "shortcutmanager.h", "designermcumanager.cpp", "designermcumanager.h", + "richtexteditordialog.cpp", + "richtexteditordialog.h", ] } } diff --git a/src/plugins/qmldesigner/richtexteditordialog.cpp b/src/plugins/qmldesigner/richtexteditordialog.cpp new file mode 100644 index 00000000000..d51d063718c --- /dev/null +++ b/src/plugins/qmldesigner/richtexteditordialog.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "richtexteditordialog.h" +#include + +namespace QmlDesigner { + +RichTextEditorDialog::RichTextEditorDialog(QString text) +{ + m_editor = new RichTextEditor(this); + m_editor->setRichText(text); + + auto layout = new QVBoxLayout(this); + layout->addWidget(m_editor); + setLayout(layout); + + connect(m_editor, &RichTextEditor::textChanged, + this, &RichTextEditorDialog::onTextChanged); + + connect(this, &QDialog::finished, + this, &RichTextEditorDialog::onFinished); + + setModal(true); +} + +void RichTextEditorDialog::setFormEditorItem(FormEditorItem* formEditorItem) +{ + m_formEditorItem = formEditorItem; +} + +void RichTextEditorDialog::onTextChanged(QString text) +{ + Q_UNUSED(text); + // TODO: try adding following and make it react faster + // setTextToFormEditorItem(text); +} + +void RichTextEditorDialog::onFinished() +{ + setTextToFormEditorItem(m_editor->richText()); +} + +void RichTextEditorDialog::setTextToFormEditorItem(QString text) +{ + if (m_formEditorItem) { + if (text.isEmpty()) + m_formEditorItem->qmlItemNode().removeProperty("text"); + else + m_formEditorItem->qmlItemNode().setVariantProperty("text", text); + } +} + +} //namespace QmlDesigner diff --git a/src/plugins/qmldesigner/richtexteditordialog.h b/src/plugins/qmldesigner/richtexteditordialog.h new file mode 100644 index 00000000000..126be3b6a4b --- /dev/null +++ b/src/plugins/qmldesigner/richtexteditordialog.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#ifndef RICHTEXTEDITORDIALOG_H +#define RICHTEXTEDITORDIALOG_H + +#include +#include "richtexteditor/richtexteditor.h" +#include "formeditor/formeditoritem.h" + +namespace QmlDesigner { + + +class RichTextEditorDialog : public QDialog { + Q_OBJECT +public: + explicit RichTextEditorDialog(const QString text); + void setFormEditorItem(FormEditorItem* formEditorItem); + +signals: + void textChanged(QString text); +private: + RichTextEditor* m_editor; + FormEditorItem* m_formEditorItem; + +private slots: + void onTextChanged(QString text); + void onFinished(); + void setTextToFormEditorItem(QString text); +}; + +} // namespace QmlDesigner + +#endif // RICHTEXTEDITORDIALOG_H