diff --git a/src/plugins/qmldesigner/components/texteditor/texteditor.pri b/src/plugins/qmldesigner/components/texteditor/texteditor.pri new file mode 100644 index 00000000000..b683350cd96 --- /dev/null +++ b/src/plugins/qmldesigner/components/texteditor/texteditor.pri @@ -0,0 +1,4 @@ +VPATH += $$PWD +SOURCES += texteditorview.cpp +HEADERS += texteditorview.h +#RESOURCES += texteditor.qrc diff --git a/src/plugins/qmldesigner/components/texteditor/texteditor.qrc b/src/plugins/qmldesigner/components/texteditor/texteditor.qrc new file mode 100644 index 00000000000..03585ec0309 --- /dev/null +++ b/src/plugins/qmldesigner/components/texteditor/texteditor.qrc @@ -0,0 +1,2 @@ + + diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp new file mode 100644 index 00000000000..b160aebbc17 --- /dev/null +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 "texteditorview.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace QmlDesigner { + +class DummyWidget : public QWidget { +public: + DummyWidget(QWidget *parent = nullptr) : QWidget(parent) { + QBoxLayout *layout = new QVBoxLayout(this); + layout->setMargin(0); + } + void showEvent(QShowEvent *event) { + if (m_widget.isNull()) + setWidget(QmlDesignerPlugin::instance()->currentDesignDocument()->textEditor()->duplicate()->widget()); + QWidget::showEvent(event); + } + +private: + void setWidget(QWidget *widget) { + if (m_widget) + m_widget->deleteLater(); + m_widget = widget; + + layout()->addWidget(widget); + } + QPointer m_widget; +}; + + +TextEditorView::TextEditorView(QObject *parent) + : AbstractView(parent) + , m_dummyWidget(new DummyWidget) +{ + // not completely sure that we need this to just call the right help method -> + Internal::TextEditorContext *textEditorContext = new Internal::TextEditorContext(m_dummyWidget); + Core::ICore::addContextObject(textEditorContext); +} + +TextEditorView::~TextEditorView() +{ + m_textEditor->deleteLater(); + m_dummyWidget->deleteLater(); +} + +void TextEditorView::modelAttached(Model *model) +{ + Q_ASSERT(model); + + AbstractView::modelAttached(model); +} + +void TextEditorView::modelAboutToBeDetached(Model *model) +{ + AbstractView::modelAboutToBeDetached(model); +} + +void TextEditorView::importsChanged(const QList &/*addedImports*/, const QList &/*removedImports*/) +{ +} + +void TextEditorView::nodeAboutToBeRemoved(const ModelNode &/*removedNode*/) +{ +} + +void TextEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) +{ +} + +void TextEditorView::propertiesAboutToBeRemoved(const QList& /*propertyList*/) +{ +} + +void TextEditorView::nodeReparented(const ModelNode &/*node*/, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &/*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + +WidgetInfo TextEditorView::widgetInfo() +{ + return createWidgetInfo(m_dummyWidget, 0, "TextEditor", WidgetInfo::CentralPane, 0, tr("Text Editor")); +} + +QString TextEditorView::contextHelpId() const +{ + if (m_textEditor) { + QString contextHelpId = m_textEditor->contextHelpId(); + if (!contextHelpId.isEmpty()) + return m_textEditor->contextHelpId(); + } + return AbstractView::contextHelpId(); +} + +void TextEditorView::nodeIdChanged(const ModelNode& /*node*/, const QString &/*newId*/, const QString &/*oldId*/) +{ +} + +void TextEditorView::selectedNodesChanged(const QList &/*selectedNodeList*/, + const QList &/*lastSelectedNodeList*/) +{ +} + +void TextEditorView::customNotification(const AbstractView * /*view*/, const QString &/*identifier*/, const QList &/*nodeList*/, const QList &/*data*/) +{ +} + +bool TextEditorView::changeToMoveTool() +{ + return true; +} + +void TextEditorView::changeToDragTool() +{ +} + +bool TextEditorView::changeToMoveTool(const QPointF &/*beginPoint*/) +{ + return true; +} + +void TextEditorView::changeToSelectionTool() +{ +} + +void TextEditorView::changeToResizeTool() +{ +} + +void TextEditorView::changeToTransformTools() +{ +} + +void TextEditorView::changeToCustomTool() +{ +} + +void TextEditorView::auxiliaryDataChanged(const ModelNode &/*node*/, const PropertyName &/*name*/, const QVariant &/*data*/) +{ +} + +void TextEditorView::instancesCompleted(const QVector &/*completedNodeList*/) +{ +} + +void TextEditorView::instanceInformationsChanged(const QMultiHash &/*informationChangeHash*/) +{ +} + +void TextEditorView::instancesRenderImageChanged(const QVector &/*nodeList*/) +{ +} + +void TextEditorView::instancesChildrenChanged(const QVector &/*nodeList*/) +{ +} + +void TextEditorView::rewriterBeginTransaction() +{ +} + +void TextEditorView::rewriterEndTransaction() +{ +} + +void TextEditorView::instancePropertyChanged(const QList > &/*propertyList*/) +{ +} +} + diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.h b/src/plugins/qmldesigner/components/texteditor/texteditorview.h new file mode 100644 index 00000000000..fe5587bccb3 --- /dev/null +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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. +** +****************************************************************************/ +#pragma once + +#include + +namespace TextEditor { class BaseTextEditor; } + +namespace Utils { class CrumblePath; } + +namespace QmlDesigner { + +class QMLDESIGNERCORE_EXPORT TextEditorView : public AbstractView +{ + Q_OBJECT + +public: + TextEditorView(QObject *parent = 0); + ~TextEditorView(); + + // AbstractView + void modelAttached(Model *model) override; + void modelAboutToBeDetached(Model *model) override; + + void importsChanged(const QList &addedImports, const QList &removedImports) override; + + void nodeAboutToBeRemoved(const ModelNode &removedNode) override; + void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override; + void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override; + void propertiesAboutToBeRemoved(const QList& propertyList) override; + void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; + + void selectedNodesChanged(const QList &selectedNodeList, + const QList &lastSelectedNodeList) override; + void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) override; + + // TextEditorView + WidgetInfo widgetInfo() override; + QString contextHelpId() const override; + + TextEditor::BaseTextEditor *textEditor(); + + bool changeToMoveTool(); + bool changeToMoveTool(const QPointF &beginPoint); + void changeToDragTool(); + void changeToSelectionTool(); + void changeToResizeTool(); + void changeToTransformTools(); + void changeToCustomTool(); + + void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + + void instancesCompleted(const QVector &completedNodeList) override; + void instanceInformationsChanged(const QMultiHash &informationChangeHash) override; + void instancesRenderImageChanged(const QVector &nodeList) override; + void instancesChildrenChanged(const QVector &nodeList) override; + void instancePropertyChanged(const QList > &propertyList) override; + + void rewriterBeginTransaction() override; + void rewriterEndTransaction() override; + + void deActivateItemCreator(); + +private: + QPointer m_textEditor; + QWidget *m_dummyWidget = 0; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 4dd000e5feb..435335f4404 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -246,7 +246,7 @@ public: virtual bool hasWidget() const; virtual WidgetInfo widgetInfo(); - QString contextHelpId() const; + virtual QString contextHelpId() const; protected: void setModel(Model * model); diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index 5056666456f..5c95899cb04 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -27,23 +27,24 @@ #ifndef QMLDESIGNER_TEST +#include +#include +#include +#include #include #include #include #include #include #include +#include #include #include #include #include #include +#include -#include "componentaction.h" -#include "designmodewidget.h" -#include "crumblebar.h" - -#include #include namespace QmlDesigner { @@ -55,6 +56,7 @@ public: Internal::DebugView debugView; ComponentView componentView; FormEditorView formEditorView; + TextEditorView textEditorView; ItemLibraryView itemLibraryView; NavigatorView navigatorView; PropertyEditorView propertyEditorView; @@ -236,6 +238,7 @@ QList ViewManager::widgetInfos() QList widgetInfoList; widgetInfoList.append(d->formEditorView.widgetInfo()); + widgetInfoList.append(d->textEditorView.widgetInfo()); widgetInfoList.append(d->itemLibraryView.widgetInfo()); widgetInfoList.append(d->navigatorView.widgetInfo()); widgetInfoList.append(d->propertyEditorView.widgetInfo()); diff --git a/src/plugins/qmldesigner/designmodecontext.cpp b/src/plugins/qmldesigner/designmodecontext.cpp index 3158e2dbb31..e2021d3d88e 100644 --- a/src/plugins/qmldesigner/designmodecontext.cpp +++ b/src/plugins/qmldesigner/designmodecontext.cpp @@ -68,6 +68,21 @@ QString NavigatorContext::contextHelpId() const return qobject_cast(m_widget)->contextHelpId(); } +TextEditorContext::TextEditorContext(QWidget *widget) + : IContext(widget) +{ + setWidget(widget); + setContext(Core::Context(Constants::C_QMLTEXTEDITOR, Constants::C_QT_QUICK_TOOLS_MENU)); +} + +QString TextEditorContext::contextHelpId() const +{ + // as TextEditorView::contextHelpId() uses the texteditor directly, + // this should not happen + Q_ASSERT(false); + return "not_implemented"; +} + } } diff --git a/src/plugins/qmldesigner/designmodecontext.h b/src/plugins/qmldesigner/designmodecontext.h index aa89c619f38..db4f7899268 100644 --- a/src/plugins/qmldesigner/designmodecontext.h +++ b/src/plugins/qmldesigner/designmodecontext.h @@ -54,5 +54,12 @@ public: QString contextHelpId() const; }; +class TextEditorContext : public Core::IContext +{ +public: + TextEditorContext(QWidget *widget); + QString contextHelpId() const; +}; + } } diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 648cb3b07f1..6a5c5c8c6a3 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -235,6 +235,11 @@ void DesignModeWidget::disableWidgets() m_isDisabled = true; } +void DesignModeWidget::showTextEdit() +{ + m_centralTabWidget->setCurrentIndex(m_centralTabWidget->currentIndex() == 0 ? 1 : 0); +} + void DesignModeWidget::updateErrorStatus(const QList &errors) { if (debug) diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 06bc08646c4..ff3acb9914e 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -79,6 +79,7 @@ public: void enableWidgets(); void disableWidgets(); + void showTextEdit(); void showErrorMessageBox(const QList &errors); void showWarningMessageBox(const QList &warnings); bool gotoCodeWasClicked(); diff --git a/src/plugins/qmldesigner/qmldesigner_dependencies.pri b/src/plugins/qmldesigner/qmldesigner_dependencies.pri index 3239b075ebe..68b12dc2635 100644 --- a/src/plugins/qmldesigner/qmldesigner_dependencies.pri +++ b/src/plugins/qmldesigner/qmldesigner_dependencies.pri @@ -18,12 +18,13 @@ INCLUDEPATH *= \ $$PWD/../../../share/qtcreator/qml/qmlpuppet/types \ $$PWD/designercore \ $$PWD/designercore/include \ + $$PWD/components/integration \ $$PWD/components/componentcore \ $$PWD/components/importmanager \ - $$PWD/components/formeditor \ $$PWD/components/itemlibrary \ + $$PWD/components/formeditor \ $$PWD/components/navigator \ - $$PWD/components/propertyeditor \ $$PWD/components/stateseditor \ - $$PWD/components/debugview \ - $$PWD/components/integration + $$PWD/components/texteditor \ + $$PWD/components/propertyeditor \ + $$PWD/components/debugview diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index e0e8081d1f5..05ec44c6b20 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -35,6 +35,7 @@ const char C_DELETE[] = "QmlDesigner.Delete"; const char C_QMLDESIGNER[] = "QmlDesigner::QmlDesignerMain"; const char C_QMLFORMEDITOR[] = "QmlDesigner::FormEditor"; const char C_QMLNAVIGATOR[] = "QmlDesigner::Navigator"; +const char C_QMLTEXTEDITOR[] = "QmlDesigner::TextEditor"; // Special context for preview menu, shared b/w designer and text editor const char C_QT_QUICK_TOOLS_MENU[] = "QmlDesigner::ToolsMenu"; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 304555175ef..a9fdeaad102 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -135,7 +135,7 @@ static bool shouldAssertInException() static bool useTextEditInDesignMode() { DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); - return settings.value(DesignerSettingsKey::TEXTEDIT_IN_DESIGNMODE, false).toBool(); + return settings.value(DesignerSettingsKey::TEXTEDIT_IN_DESIGNMODE, true).toBool(); } static bool warningsForQmlFilesInsteadOfUiQmlEnabled() @@ -215,12 +215,13 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e MetaInfo::setPluginPaths(QStringList(pluginPath)); createDesignModeWidget(); - connect(switchTextDesignAction, &QAction::triggered, this, [](){ + connect(switchTextDesignAction, &QAction::triggered, this, [this](){ if (Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN) { - if (useTextEditInDesignMode()) - qDebug() << "not implemented"; - else + if (useTextEditInDesignMode()) { + d->mainWidget->showTextEdit(); + } else { Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); + } } }); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pro b/src/plugins/qmldesigner/qmldesignerplugin.pro index 8499afd913b..460a77a96ef 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pro +++ b/src/plugins/qmldesigner/qmldesignerplugin.pro @@ -8,11 +8,13 @@ unix:!openbsd:!osx: LIBS += -lrt # posix shared memory include(../../qtcreatorplugin.pri) +include(qmldesignerplugin.pri) include(designercore/designercore-lib.pri) include(components/componentcore/componentcore.pri) include(components/integration/integration.pri) include(components/propertyeditor/propertyeditor.pri) include(components/formeditor/formeditor.pri) +include(components/texteditor/texteditor.pri) include(components/itemlibrary/itemlibrary.pri) include(components/navigator/navigator.pri) include(components/stateseditor/stateseditor.pri) @@ -20,7 +22,6 @@ include(components/resources/resources.pri) include(components/debugview/debugview.pri) include(components/importmanager/importmanager.pri) include(qmldesignerextension/qmldesignerextension.pri) -include(qmldesignerplugin.pri) BUILD_PUPPET_IN_CREATOR_BINPATH = $$(BUILD_PUPPET_IN_CREATOR_BINPATH) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index e593a32b3d3..b10ad94aec5 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -397,6 +397,8 @@ Project { "componentcore/selectioncontext.h", "componentcore/qmldesignericonprovider.cpp", "componentcore/qmldesignericonprovider.h", + "texteditor/texteditorview.cpp", + "texteditor/texteditorview.h", "debugview/debugview.cpp", "debugview/debugview.h", "debugview/debugviewwidget.cpp",