diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index 71e0ed10ec9de89295f0b1ac8629758cb9c6b0ee..278d8f2ef7ab54078424a364693e312980d3fd28 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -97,13 +97,11 @@ public: QWeakPointer<SubComponentManager> subComponentManager; QWeakPointer<Internal::ViewLogger> viewLogger; - QWeakPointer<QProcess> previewProcess; - QWeakPointer<QProcess> previewWithDebugProcess; - QString fileName; QUrl searchPath; bool documentLoaded; bool syncBlocked; + QWeakPointer<ComponentAction> componentAction; }; @@ -117,39 +115,20 @@ DesignDocumentController::DesignDocumentController(QObject *parent) : QObject(parent), m_d(new DesignDocumentControllerPrivate) { - m_d->itemLibrary = new ItemLibrary; - m_d->navigator = new NavigatorView(this); - m_d->allPropertiesBox = new AllPropertiesBox; - m_d->statesEditorWidget = new StatesEditorWidget; - m_d->stackedWidget = new QStackedWidget; - m_d->documentLoaded = false; m_d->syncBlocked = false; } DesignDocumentController::~DesignDocumentController() -{ - delete m_d->formEditorView.data(); - - // deleting the widgets should be safe because these are QWeakPointer's - delete m_d->itemLibrary.data(); - delete m_d->allPropertiesBox.data(); - delete m_d->statesEditorWidget.data(); - delete m_d->stackedWidget.data(); - +{ delete m_d->model.data(); delete m_d->subComponentModel.data(); delete m_d->rewriterView.data(); - // m_d->textEdit is child of stackedWidget or owned by external widget - delete m_d->textModifier; if (m_d->componentTextModifier) //componentTextModifier might not be created delete m_d->componentTextModifier; - delete m_d->previewProcess.data(); - delete m_d->previewWithDebugProcess.data(); - delete m_d; } @@ -163,76 +142,11 @@ Model *DesignDocumentController::masterModel() const return m_d->masterModel.data(); } -QWidget *DesignDocumentController::documentWidget() const -{ - return m_d->stackedWidget.data(); -} - -void DesignDocumentController::togglePreview(bool visible) -{ - if (!m_d->documentLoaded) - return; - - if (visible) { - Q_ASSERT(!m_d->previewProcess); - - QString directory; - if (!m_d->fileName.isEmpty()) { - directory = QFileInfo(m_d->fileName).absoluteDir().path(); - } else { - directory = QDir::tempPath(); - } - m_d->previewProcess = createPreviewProcess(directory); - connect(m_d->previewProcess.data(), SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(emitPreviewVisibilityChanged())); - } else { - Q_ASSERT(m_d->previewProcess); - - delete m_d->previewProcess.data(); - } -} - -void DesignDocumentController::toggleWithDebugPreview(bool visible) -{ - if (!m_d->documentLoaded) - return; - - if (visible) { - Q_ASSERT(!m_d->previewWithDebugProcess); - - QString directory; - if (!m_d->fileName.isEmpty()) { - directory = QFileInfo(m_d->fileName).absoluteDir().path(); - } else { - directory = QDir::tempPath(); - } - m_d->previewWithDebugProcess = createPreviewWithDebugProcess(directory); - connect(m_d->previewWithDebugProcess.data(), SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(emitPreviewWithDebugVisibilityChanged())); - } else { - Q_ASSERT(m_d->previewWithDebugProcess); - - delete m_d->previewWithDebugProcess.data(); - } -} - -bool DesignDocumentController::previewVisible() const -{ - if (!m_d->documentLoaded) - return false; - - return m_d->previewProcess; -} - -bool DesignDocumentController::previewWithDebugVisible() const +QWidget *DesignDocumentController::widget() const { - if (!m_d->documentLoaded) - return false; - - return m_d->previewWithDebugProcess; + return qobject_cast<QWidget*>(parent()); } - /*! Returns whether the model is automatically updated if the text editor changes. */ @@ -272,14 +186,29 @@ QList<RewriterView::Error> DesignDocumentController::qmlErrors() const return m_d->rewriterView->errors(); } -void DesignDocumentController::emitPreviewVisibilityChanged() +void DesignDocumentController::setItemLibrary(ItemLibrary* itemLibrary) +{ + m_d->itemLibrary = itemLibrary; +} + +void DesignDocumentController::setNavigator(NavigatorView* navigatorView) +{ + m_d->navigator = navigatorView; +} + +void DesignDocumentController::setAllPropertiesBox(AllPropertiesBox* allPropertiesBox) +{ + m_d->allPropertiesBox = allPropertiesBox; +} + +void DesignDocumentController::setStatesEditorWidget(StatesEditorWidget* statesEditorWidget) { - emit previewVisibilityChanged(false); + m_d->statesEditorWidget = statesEditorWidget; } -void DesignDocumentController::emitPreviewWithDebugVisibilityChanged() +void DesignDocumentController::setFormEditorView(FormEditorView *formEditorView) { - emit previewWithDebugVisibilityChanged(false); + m_d->formEditorView = formEditorView; } QString DesignDocumentController::displayName() const @@ -411,21 +340,21 @@ void DesignDocumentController::loadCurrentModel() Q_ASSERT(m_d->model); m_d->model->setMasterModel(m_d->masterModel.data()); - m_d->allPropertiesBox->setModel(m_d->model.data()); - m_d->model->attachView(m_d->navigator.data()); m_d->itemLibrary->setMetaInfo(m_d->model->metaInfo()); - if (m_d->formEditorView.isNull()) { - m_d->formEditorView = new FormEditorView(this); - m_d->stackedWidget->addWidget(m_d->formEditorView->widget()); - ComponentAction *componentAction = new ComponentAction(m_d->formEditorView->widget()); - componentAction->setModel(m_d->model.data()); - // TODO: Enable again - //m_d->formEditorView->widget()->lowerToolBox()->addAction(componentAction); - connect(componentAction, SIGNAL(currentComponentChanged(ModelNode)), SLOT(changeCurrentModelTo(ModelNode))); //TODO component action - connect(m_d->itemLibrary.data(), SIGNAL(itemActivated(const QString&)), m_d->formEditorView.data(), SLOT(activateItemCreator(const QString&))); + if (!m_d->componentAction) { + m_d->componentAction = new ComponentAction(m_d->formEditorView->widget()); + m_d->componentAction->setModel(m_d->model.data()); + connect(m_d->componentAction.data(), SIGNAL(currentComponentChanged(ModelNode)), SLOT(changeCurrentModelTo(ModelNode))); + m_d->formEditorView->widget()->lowerToolBox()->addAction(m_d->componentAction.data()); } + foreach (QAction *action , m_d->formEditorView->widget()->lowerToolBox()->actions()) + if (qobject_cast<ComponentAction*>(action)) + action->setVisible(false); + m_d->componentAction->setVisible(true); + + connect(m_d->itemLibrary.data(), SIGNAL(itemActivated(const QString&)), m_d->formEditorView.data(), SLOT(activateItemCreator(const QString&))); m_d->model->attachView(m_d->formEditorView.data()); @@ -436,6 +365,8 @@ void DesignDocumentController::loadCurrentModel() // Will call setCurrentState (formEditorView etc has to be constructed first) m_d->statesEditorWidget->setup(m_d->model.data()); + m_d->allPropertiesBox->setModel(m_d->model.data()); + m_d->documentLoaded = true; Q_ASSERT(m_d->masterModel); } @@ -461,13 +392,13 @@ void DesignDocumentController::doRealSaveAs(const QString &fileName) QFileInfo fileInfo(fileName); if (fileInfo.exists() && !fileInfo.isWritable()) { - QMessageBox msgBox(documentWidget()); + QMessageBox msgBox(widget()); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Cannot save to file \"%1\": permission denied.").arg(fileInfo.baseName())); msgBox.exec(); return; } else if (!fileInfo.exists() && !fileInfo.dir().exists()) { - QMessageBox msgBox(documentWidget()); + QMessageBox msgBox(widget()); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Parent folder \"%1\" for file \"%2\" does not exist.") .arg(fileInfo.dir().dirName()) @@ -477,28 +408,7 @@ void DesignDocumentController::doRealSaveAs(const QString &fileName) } setFileName(fileName); - save(documentWidget()); -} - -bool DesignDocumentController::save(QWidget *parent) -{ -// qDebug() << "Saving document to file \"" << m_d->fileName << "\"..."; -// - if (m_d->fileName.isEmpty()) { - saveAs(parent); - return true; - } - QFile file(m_d->fileName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - showError(tr("Cannot write file: \"%1\".").arg(m_d->fileName), parent); - return false; - } - - QString errorMessage; - bool result = save(&file, &errorMessage); - if (!result) - showError(errorMessage, parent); - return result; + save(widget()); } bool DesignDocumentController::isDirty() const @@ -511,17 +421,21 @@ bool DesignDocumentController::isDirty() const bool DesignDocumentController::isUndoAvailable() const { - return m_d->textEdit->document()->isUndoAvailable(); + + if (m_d->textEdit) + return m_d->textEdit->document()->isUndoAvailable(); + return false; } bool DesignDocumentController::isRedoAvailable() const { - return m_d->textEdit->document()->isRedoAvailable(); + if (m_d->textEdit) + return m_d->textEdit->document()->isRedoAvailable(); + return false; } void DesignDocumentController::close() { - documentWidget()->close(); m_d->documentLoaded = false; emit designDocumentClosed(); } @@ -752,26 +666,6 @@ void DesignDocumentController::showError(const QString &message, QWidget *parent msgBox.exec(); } -QWidget *DesignDocumentController::itemLibrary() const -{ - return m_d->itemLibrary.data(); -} - -QWidget *DesignDocumentController::navigator() const -{ - return m_d->navigator->widget(); -} - -QWidget *DesignDocumentController::allPropertiesBox() const -{ - return m_d->allPropertiesBox.data(); -} - -QWidget *DesignDocumentController::statesEditorWidget() const -{ - return m_d->statesEditorWidget.data(); -} - RewriterView *DesignDocumentController::rewriterView() const { return m_d->rewriterView.data(); @@ -803,79 +697,26 @@ void DesignDocumentController::showForm() } #endif // ENABLE_TEXT_VIEW -QProcess *DesignDocumentController::createPreviewProcess(const QString &dirPath) -{ - Q_ASSERT(QDir(dirPath).exists()); - - QProcess *previewProcess = new QProcess(this); - previewProcess->setWorkingDirectory(dirPath); - - QTemporaryFile *temporaryFile = new QTemporaryFile(QDir(dirPath).absoluteFilePath("bauhaus_tmp")); - temporaryFile->setParent(previewProcess); - - temporaryFile->open(); - - m_d->textModifier->save(temporaryFile); - - QStringList qmlViewerArgumentList; -// qmlViewerArgumentList.append("-L"); -// qmlViewerArgumentList.append(dirPath); - previewProcess->setWorkingDirectory(dirPath); - qmlViewerArgumentList.append(temporaryFile->fileName()); - - temporaryFile->close(); - - previewProcess->start(QString("%1/qml").arg(QCoreApplication::applicationDirPath()), qmlViewerArgumentList); - if (!previewProcess->waitForStarted()) - previewProcess->start("qml", qmlViewerArgumentList); - if (!previewProcess->waitForStarted()) - QMessageBox::warning(documentWidget(), "qml runtime not found", "qml runtime should be in the PATH or in the same directory like the bauhaus binary."); - - return previewProcess; -} - -QProcess *DesignDocumentController::createPreviewWithDebugProcess(const QString &dirPath) +bool DesignDocumentController::save(QWidget *parent) { - Q_ASSERT(QDir(dirPath).exists()); - - QProcess *previewProcess = new QProcess(this); - previewProcess->setWorkingDirectory(dirPath); - - QProcess *debugger = new QProcess(previewProcess); - - QTemporaryFile *temporaryFile = new QTemporaryFile(QDir(dirPath).absoluteFilePath("bauhaus_tmp")); - temporaryFile->setParent(previewProcess); - - temporaryFile->open(); - - m_d->textModifier->save(temporaryFile); - - QStringList environmentList = QProcess::systemEnvironment(); - environmentList.append("QML_DEBUG_SERVER_PORT=3768"); - previewProcess->setEnvironment(environmentList); - - QStringList qmlViewerArgumentList; -// qmlViewerArgumentList.append("-L"); -// qmlViewerArgumentList.append(libraryPath); - qmlViewerArgumentList.append(temporaryFile->fileName()); - - temporaryFile->close(); - - debugger->setWorkingDirectory(dirPath); - debugger->start(QString("%1/qmldebugger").arg(QCoreApplication::applicationDirPath())); - if (!debugger->waitForStarted()) - debugger->start("qmldebugger", qmlViewerArgumentList); - if (!debugger->waitForStarted()) - QMessageBox::warning(documentWidget(), "qmldebugger not found", "qmldebugger should in the PATH or in the same directory like the bauhaus binary."); - - previewProcess->setWorkingDirectory(dirPath); - previewProcess->start(QString("%1/qml").arg(QCoreApplication::applicationDirPath()), qmlViewerArgumentList); - if (!previewProcess->waitForStarted()) - previewProcess->start("qml", qmlViewerArgumentList); - if (!previewProcess->waitForStarted()) - QMessageBox::warning(documentWidget(), "qml runtime not found", "qml runtime should in the PATH or in the same directory like the bauhaus binary."); + // qDebug() << "Saving document to file \"" << m_d->fileName << "\"..."; + // + if (m_d->fileName.isEmpty()) { + saveAs(parent); + return true; + } + QFile file(m_d->fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + showError(tr("Cannot write file: \"%1\".").arg(m_d->fileName), parent); + return false; + } - return previewProcess; + QString errorMessage; + bool result = save(&file, &errorMessage); + if (!result) + showError(errorMessage, parent); + return result; + save(widget()); } bool DesignDocumentController::save(QIODevice *device, QString * /*errorMessage*/) @@ -884,12 +725,11 @@ bool DesignDocumentController::save(QIODevice *device, QString * /*errorMessage* QByteArray data = m_d->textEdit->toPlainText().toLatin1(); device->write(data); m_d->textEdit->setPlainText(data); // clear undo/redo history - return true; - } else { - return false; } + return false; } + QString DesignDocumentController::contextHelpId() const { DesignDocumentControllerView view; diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h index 311861fc112e5a0197feea1c27de9fa2033cb893..0d464ee9de5b1e457e6903481350c01bc1262960 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h @@ -51,6 +51,11 @@ class ModelNode; class TextModifier; class QmlObjectNode; class RewriterView; +class ItemLibrary; +class NavigatorView; +class AllPropertiesBox; +class StatesEditorWidget; +class FormEditorView; class DesignDocumentController: public QObject { @@ -72,20 +77,12 @@ public: bool isDirty() const; bool isUndoAvailable() const; bool isRedoAvailable() const; + QWidget *widget() const; Model *model() const; - Model *masterModel() const; + Model *masterModel() const; - QWidget *documentWidget() const; - QWidget *itemLibrary() const; - QWidget *navigator() const; - QWidget *allPropertiesBox() const; - QWidget *statesEditorWidget() const; - - RewriterView *rewriterView() const; - - bool previewVisible() const; - bool previewWithDebugVisible() const; + RewriterView *rewriterView() const; bool isModelSyncBlocked() const; void blockModelSync(bool block); @@ -93,14 +90,18 @@ public: QString contextHelpId() const; QList<RewriterView::Error> qmlErrors() const; + void setItemLibrary(ItemLibrary* itemLibrary); + void setNavigator(NavigatorView* navigatorView); + void setAllPropertiesBox(AllPropertiesBox* allPropertiesBox); + void setStatesEditorWidget(StatesEditorWidget* statesEditorWidget); + void setFormEditorView(FormEditorView *formEditorView); + signals: void displayNameChanged(const QString &newFileName); void dirtyStateChanged(bool newState); void undoAvailable(bool isAvailable); void redoAvailable(bool isAvailable); - void previewVisibilityChanged(bool visible); - void previewWithDebugVisibilityChanged(bool visible); void designDocumentClosed(); void qmlErrorsChanged(const QList<RewriterView::Error> &errors); @@ -108,18 +109,12 @@ signals: public slots: bool save(QWidget *parent = 0); - void saveAs(QWidget *parent = 0); + void saveAs(QWidget *parent = 0); void deleteSelected(); void copySelected(); void cutSelected(); void paste(); void selectAll(); - - void togglePreview(bool visible); - void toggleWithDebugPreview(bool visible); - - void emitPreviewVisibilityChanged(); - void emitPreviewWithDebugVisibilityChanged(); void undo(); void redo(); @@ -134,11 +129,8 @@ private slots: void changeCurrentModelTo(const ModelNode &node); private: - QProcess *createPreviewProcess(const QString &dirPath); - QProcess *createPreviewWithDebugProcess(const QString &dirPath); - bool save(QIODevice *device, QString *errorMessage); - class DesignDocumentControllerPrivate *m_d; + bool save(QIODevice *device, QString *errorMessage); }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 499095bf102f659aee3249a9c335486493bfa636..ffdf74c35db1cbebd596d31ed7c25165c22daf8b 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -32,6 +32,7 @@ #include <model.h> #include <rewriterview.h> +#include <formeditorwidget.h> #include <coreplugin/icore.h> #include <coreplugin/minisplitter.h> @@ -41,6 +42,8 @@ #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/modemanager.h> #include <coreplugin/editortoolbar.h> +#include <coreplugin/inavigationwidgetfactory.h> +#include <extensionsystem/pluginmanager.h> #include <utils/parameteraction.h> #include <utils/qtcassert.h> @@ -57,6 +60,7 @@ #include <QtGui/QMenu> #include <QtGui/QClipboard> #include <QtGui/QLabel> +#include <QtGui/QProgressDialog> using Core::MiniSplitter; using Core::IEditor; @@ -73,11 +77,11 @@ enum { namespace QmlDesigner { namespace Internal { -DocumentWarningWidget::DocumentWarningWidget(DocumentWidget *documentWidget, QWidget *parent) : +DocumentWarningWidget::DocumentWarningWidget(DesignModeWidget *parent) : QFrame(parent), m_errorMessage(new QLabel("Placeholder", this)), m_goToError(new QLabel(this)), - m_documentWidget(documentWidget) + m_designModeWidget(parent) { setFrameStyle(QFrame::Panel | QFrame::Raised); setLineWidth(1); @@ -108,264 +112,20 @@ void DocumentWarningWidget::setError(const RewriterView::Error &error) void DocumentWarningWidget::goToError() { - m_documentWidget->textEditor()->gotoLine(m_error.line(), m_error.column()); + m_designModeWidget->textEditor()->gotoLine(m_error.line(), m_error.column()); Core::EditorManager::instance()->ensureEditorManagerVisible(); } -DocumentWidget::DocumentWidget(TextEditor::ITextEditor *textEditor, QPlainTextEdit *textEdit, QmlDesigner::DesignDocumentController *document, DesignModeWidget *mainWidget) : - QWidget(), - m_textEditor(textEditor), - m_textBuffer(textEdit), - m_document(document), - m_mainWidget(mainWidget), - m_mainSplitter(0), - m_leftSideBar(0), - m_rightSideBar(0), - m_designToolBar(new QToolBar), - m_fakeToolBar(Core::EditorManager::createToolBar(this)), - m_isDisabled(false), - m_warningWidget(0) -{ - setup(); -} - -DocumentWidget::~DocumentWidget() -{ - // Make sure component widgets are deleted first in SideBarItem::~SideBarItem - // before the DesignDocumentController runs (and deletes them again). - m_document->deleteLater(); -} - -QmlDesigner::DesignDocumentController *DocumentWidget::document() const -{ - return m_document; -} - -TextEditor::ITextEditor *DocumentWidget::textEditor() const -{ - return m_textEditor; -} - -void DocumentWidget::setAutoSynchronization(bool sync) -{ - if (debug) - qDebug() << Q_FUNC_INFO << sync; - - document()->blockModelSync(!sync); - - if (sync) { - // text editor -> visual editor - if (!document()->model()) { - document()->loadMaster(m_textBuffer.data()); - } - - QList<RewriterView::Error> errors = document()->qmlErrors(); - if (errors.isEmpty()) { - // set selection to text cursor - RewriterView *rewriter = document()->rewriterView(); - const int cursorPos = m_textBuffer->textCursor().position(); - ModelNode node = nodeForPosition(cursorPos); - if (node.isValid()) { - rewriter->setSelectedModelNodes(QList<ModelNode>() << node); - } - enable(); - } else { - disable(errors); - } - - connect(document(), SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>)), - this, SLOT(updateErrorStatus(QList<RewriterView::Error>))); - - } else { - if (document()->model() && document()->qmlErrors().isEmpty()) { - RewriterView *rewriter = document()->rewriterView(); - // visual editor -> text editor - ModelNode selectedNode; - if (!rewriter->selectedModelNodes().isEmpty()) - selectedNode = rewriter->selectedModelNodes().first(); - - if (selectedNode.isValid()) { - const int nodeOffset = rewriter->nodeOffset(selectedNode); - if (nodeOffset > 0) { - const ModelNode currentSelectedNode - = nodeForPosition(m_textBuffer->textCursor().position()); - if (currentSelectedNode != selectedNode) { - int line, column; - textEditor()->convertPosition(nodeOffset, &line, &column); - textEditor()->gotoLine(line, column); - } - } - } - } - - disconnect(document(), SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>)), - this, SLOT(updateErrorStatus(QList<RewriterView::Error>))); - } -} - -void DocumentWidget::enable() -{ - if (debug) - qDebug() << Q_FUNC_INFO; - m_warningWidget->setVisible(false); - m_document->documentWidget()->setEnabled(true); - m_document->statesEditorWidget()->setEnabled(true); - m_leftSideBar->setEnabled(true); - m_rightSideBar->setEnabled(true); - m_isDisabled = false; -} - -void DocumentWidget::disable(const QList<RewriterView::Error> &errors) -{ - if (debug) - qDebug() << Q_FUNC_INFO; - Q_ASSERT(!errors.isEmpty()); - m_warningWidget->setError(errors.first()); - m_warningWidget->setVisible(true); - m_document->documentWidget()->setEnabled(false); - m_document->statesEditorWidget()->setEnabled(false); - m_leftSideBar->setEnabled(false); - m_rightSideBar->setEnabled(false); - m_isDisabled = true; -} - -void DocumentWidget::updateErrorStatus(const QList<RewriterView::Error> &errors) -{ - if (debug) - qDebug() << Q_FUNC_INFO << errors.count(); - - if (m_isDisabled && errors.isEmpty()) { - enable(); - } else if (!errors.isEmpty()) { - disable(errors); - } -} - -void DocumentWidget::readSettings() -{ - QSettings *settings = Core::ICore::instance()->settings(); - - settings->beginGroup("Bauhaus"); - m_leftSideBar->readSettings(settings, QLatin1String("LeftSideBar")); - m_rightSideBar->readSettings(settings, QLatin1String("RightSideBar")); - if (settings->contains("MainSplitter")) { - const QByteArray splitterState = settings->value("MainSplitter").toByteArray(); - m_mainSplitter->restoreState(splitterState); - } - settings->endGroup(); -} - -void DocumentWidget::saveSettings() -{ - QSettings *settings = Core::ICore::instance()->settings(); - - settings->beginGroup("Bauhaus"); - m_leftSideBar->saveSettings(settings, QLatin1String("LeftSideBar")); - m_rightSideBar->saveSettings(settings, QLatin1String("RightSideBar")); - settings->setValue("MainSplitter", m_mainSplitter->saveState()); - settings->endGroup(); -} - - -void DocumentWidget::resizeEvent(QResizeEvent *event) -{ - m_warningWidget->move(QPoint(event->size().width() / 2, - event->size().height() / 2)); - QWidget::resizeEvent(event); -} - -void DocumentWidget::setup() -{ - m_mainSplitter = new MiniSplitter(this); - m_mainSplitter->setObjectName("mainSplitter"); - - // warning frame should be not in layout, but still child of the widget - m_warningWidget = new DocumentWarningWidget(this, this); - m_warningWidget->setVisible(false); - - // Left area: - Core::SideBarItem *navigatorItem = new Core::SideBarItem(m_document->navigator()); - Core::SideBarItem *libraryItem = new Core::SideBarItem(m_document->itemLibrary()); - Core::SideBarItem *propertiesItem = new Core::SideBarItem(m_document->allPropertiesBox()); - - QList<Core::SideBarItem*> leftSideBarItems, rightSideBarItems; - leftSideBarItems << navigatorItem << libraryItem; - rightSideBarItems << propertiesItem; - - m_leftSideBar = new Core::SideBar(leftSideBarItems, QList<Core::SideBarItem*>() << navigatorItem << libraryItem); - m_rightSideBar = new Core::SideBar(rightSideBarItems, QList<Core::SideBarItem*>() << propertiesItem); - - m_designToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored); - - m_fakeToolBar->setToolbarCreationFlags(Core::EditorToolBar::FlagsStandalone); - m_fakeToolBar->addEditor(textEditor()); - m_fakeToolBar->addCenterToolBar(m_designToolBar); - m_fakeToolBar->setNavigationVisible(false); - - // right area: - QWidget *centerWidget = new QWidget; - { - QVBoxLayout *rightLayout = new QVBoxLayout(centerWidget); - rightLayout->setMargin(0); - rightLayout->setSpacing(0); - rightLayout->addWidget(m_fakeToolBar); - rightLayout->addWidget(m_document->statesEditorWidget()); - rightLayout->addWidget(m_document->documentWidget()); - } - - // m_mainSplitter area: - m_mainSplitter->addWidget(m_leftSideBar); - m_mainSplitter->addWidget(centerWidget); - m_mainSplitter->addWidget(m_rightSideBar); - - // Finishing touches: - m_mainSplitter->setOpaqueResize(false); - m_mainSplitter->setStretchFactor(1, 1); - m_mainSplitter->setSizes(QList<int>() << 150 << 300 << 150); - - QLayout *mainLayout = new QBoxLayout(QBoxLayout::RightToLeft, this); - mainLayout->setMargin(0); - mainLayout->setSpacing(0); - mainLayout->addWidget(m_mainSplitter); -} - -bool DocumentWidget::isInNodeDefinition(int nodeOffset, int nodeLength, int cursorPos) const { - return (nodeOffset <= cursorPos) && (nodeOffset + nodeLength > cursorPos); -} - -ModelNode DocumentWidget::nodeForPosition(int cursorPos) const -{ - RewriterView *rewriter = m_document->rewriterView(); - QList<ModelNode> nodes = rewriter->allModelNodes(); - - ModelNode bestNode; - int bestNodeOffset = -1; - - foreach (const ModelNode &node, nodes) { - const int nodeOffset = rewriter->nodeOffset(node); - const int nodeLength = rewriter->nodeLength(node); - if (isInNodeDefinition(nodeOffset, nodeLength, cursorPos) - && (nodeOffset > bestNodeOffset)) { - bestNode = node; - bestNodeOffset = nodeOffset; - } - } - - return bestNode; -} - // ---------- DesignModeWidget DesignModeWidget::DesignModeWidget(QWidget *parent) : QWidget(parent), - m_documentWidgetStack(new QStackedWidget), - m_currentDocumentWidget(0), - m_currentTextEdit(0), - m_syncWithTextEdit(false) + m_syncWithTextEdit(false), + m_mainSplitter(0), + m_leftSideBar(0), + m_rightSideBar(0), + m_setup(false), + m_warningWidget(0) { - QVBoxLayout *layout = new QVBoxLayout(this); - layout->setMargin(0); - layout->addWidget(m_documentWidgetStack); - m_undoAction = new QAction(tr("&Undo"), this); connect(m_undoAction, SIGNAL(triggered()), this, SLOT(undo())); m_redoAction = new QAction(tr("&Redo"), this); @@ -380,11 +140,6 @@ DesignModeWidget::DesignModeWidget(QWidget *parent) : connect(m_pasteAction, SIGNAL(triggered()), this, SLOT(paste())); m_selectAllAction = new Utils::ParameterAction(tr("Select &All"), tr("Select All \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); connect(m_selectAllAction, SIGNAL(triggered()), this, SLOT(selectAll())); - - QLabel *defaultBackground = new QLabel(tr("Loading ...")); - defaultBackground->setAlignment(Qt::AlignCenter); - - m_documentWidgetStack->addWidget(defaultBackground); } DesignModeWidget::~DesignModeWidget() @@ -393,6 +148,9 @@ DesignModeWidget::~DesignModeWidget() void DesignModeWidget::showEditor(Core::IEditor *editor) { + show(); + setup(); + QString fileName; QPlainTextEdit *textEdit = 0; TextEditor::ITextEditor *textEditor = 0; @@ -401,49 +159,52 @@ void DesignModeWidget::showEditor(Core::IEditor *editor) fileName = editor->file()->fileName(); textEdit = qobject_cast<QPlainTextEdit*>(editor->widget()); textEditor = qobject_cast<TextEditor::ITextEditor*>(editor); + m_fakeToolBar->addEditor(textEditor); } if (debug) qDebug() << Q_FUNC_INFO << fileName; - m_currentTextEdit = textEdit; - DocumentWidget *documentWidget = 0; + if (textEdit) + m_currentTextEdit = textEdit; + + if (textEditor) + m_textEditor = textEditor; + DesignDocumentController *document = 0; if (textEdit && textEditor && fileName.endsWith(QLatin1String(".qml"))) { if (m_documentHash.contains(textEdit)) { - documentWidget = m_documentHash.value(textEdit); + document = m_documentHash.value(textEdit).data(); } else { - DesignDocumentController *newDocument = new DesignDocumentController(0); + DesignDocumentController *newDocument = new DesignDocumentController(this); + + newDocument->setAllPropertiesBox(m_allPropertiesBox.data()); + newDocument->setNavigator(m_navigator.data()); + newDocument->setStatesEditorWidget(m_statesEditorWidget.data()); + newDocument->setItemLibrary(m_itemLibrary.data()); + newDocument->setFormEditorView(m_formEditorView.data()); + newDocument->setFileName(fileName); - documentWidget = new DocumentWidget(textEditor, textEdit, newDocument, this); - connect(documentWidget->document(), SIGNAL(undoAvailable(bool)), - this, SLOT(undoAvailable(bool))); - connect(documentWidget->document(), SIGNAL(redoAvailable(bool)), - this, SLOT(redoAvailable(bool))); -// connect(documentWidget->document(), SIGNAL(deleteAvailable(bool)), -// this, SLOT(deleteAvailable(bool))); + document = newDocument; - m_documentHash.insert(textEdit, documentWidget); - m_documentWidgetStack->addWidget(documentWidget); + m_documentHash.insert(textEdit, document); } } - - setCurrentDocumentWidget(documentWidget); + setCurrentDocument(document); } void DesignModeWidget::closeEditors(QList<Core::IEditor*> editors) { foreach (Core::IEditor* editor, editors) { if (QPlainTextEdit *textEdit = qobject_cast<QPlainTextEdit*>(editor->widget())) { - if (m_currentTextEdit == textEdit) { - setCurrentDocumentWidget(0); + if (m_currentTextEdit.data() == textEdit) { + setCurrentDocument(0); } if (m_documentHash.contains(textEdit)) { if (debug) qDebug() << Q_FUNC_INFO << editor->file()->fileName(); - DocumentWidget *document = m_documentHash.take(textEdit); - m_documentWidgetStack->removeWidget(document); + DesignDocumentController *document = m_documentHash.take(textEdit).data(); delete document; } } @@ -485,53 +246,82 @@ QAction *DesignModeWidget::selectAllAction() const return m_selectAllAction; } +void DesignModeWidget::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup("Bauhaus"); + m_leftSideBar->readSettings(settings, QLatin1String("LeftSideBar")); + m_rightSideBar->readSettings(settings, QLatin1String("RightSideBar")); + if (settings->contains("MainSplitter")) { + const QByteArray splitterState = settings->value("MainSplitter").toByteArray(); + m_mainSplitter->restoreState(splitterState); + } + settings->endGroup(); +} + +void DesignModeWidget::saveSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup("Bauhaus"); + m_leftSideBar->saveSettings(settings, QLatin1String("LeftSideBar")); + m_rightSideBar->saveSettings(settings, QLatin1String("RightSideBar")); + settings->setValue("MainSplitter", m_mainSplitter->saveState()); + settings->endGroup(); +} + void DesignModeWidget::undo() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->undo(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->undo(); } void DesignModeWidget::redo() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->redo(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->redo(); } void DesignModeWidget::deleteSelected() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->deleteSelected(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->deleteSelected(); } void DesignModeWidget::cutSelected() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->cutSelected(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->cutSelected(); } void DesignModeWidget::copySelected() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->copySelected(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->copySelected(); } void DesignModeWidget::paste() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->paste(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->paste(); } void DesignModeWidget::selectAll() { - if (m_currentDocumentWidget) - m_currentDocumentWidget->document()->selectAll(); + if (m_currentDesignDocumentController) + m_currentDesignDocumentController->selectAll(); +} + +void DesignModeWidget::closeCurrentEditor() +{ } void DesignModeWidget::undoAvailable(bool isAvailable) { DesignDocumentController *documentController = qobject_cast<DesignDocumentController*>(sender()); - if (m_currentDocumentWidget && - m_currentDocumentWidget->document() == documentController) { + if (m_currentDesignDocumentController && + m_currentDesignDocumentController.data() == documentController) { m_undoAction->setEnabled(isAvailable); } } @@ -539,44 +329,333 @@ void DesignModeWidget::undoAvailable(bool isAvailable) void DesignModeWidget::redoAvailable(bool isAvailable) { DesignDocumentController *documentController = qobject_cast<DesignDocumentController*>(sender()); - if (m_currentDocumentWidget && - m_currentDocumentWidget->document() == documentController) { + if (m_currentDesignDocumentController && + m_currentDesignDocumentController.data() == documentController) { m_redoAction->setEnabled(isAvailable); } } -void DesignModeWidget::setCurrentDocumentWidget(DocumentWidget *newDocumentWidget) + +void DesignModeWidget::enable() { if (debug) - qDebug() << Q_FUNC_INFO << newDocumentWidget; + qDebug() << Q_FUNC_INFO; + m_warningWidget->setVisible(false); + m_formEditorView->widget()->setEnabled(true); + m_statesEditorWidget->setEnabled(true); + m_leftSideBar->setEnabled(true); + m_rightSideBar->setEnabled(true); + m_isDisabled = false; +} - if (m_currentDocumentWidget == newDocumentWidget) - return; +void DesignModeWidget::disable(const QList<RewriterView::Error> &errors) +{ + if (debug) + qDebug() << Q_FUNC_INFO; + Q_ASSERT(!errors.isEmpty()); + m_warningWidget->setError(errors.first()); + m_warningWidget->setVisible(true); + m_warningWidget->move(width() / 2, height() / 2); + m_formEditorView->widget()->setEnabled(false); + m_statesEditorWidget->setEnabled(false); + m_leftSideBar->setEnabled(false); + m_rightSideBar->setEnabled(false); + m_isDisabled = true; +} - if (m_currentDocumentWidget) { - m_currentDocumentWidget->setAutoSynchronization(false); - m_currentDocumentWidget->saveSettings(); +void DesignModeWidget::updateErrorStatus(const QList<RewriterView::Error> &errors) +{ + if (debug) + qDebug() << Q_FUNC_INFO << errors.count(); + + if (m_isDisabled && errors.isEmpty()) { + enable(); + } else if (!errors.isEmpty()) { + disable(errors); } +} - m_currentDocumentWidget = newDocumentWidget; +void DesignModeWidget::setAutoSynchronization(bool sync) +{ + if (debug) + qDebug() << Q_FUNC_INFO << sync; + + m_currentDesignDocumentController->blockModelSync(!sync); + + if (sync) { + // text editor -> visual editor + if (!m_currentDesignDocumentController->model()) { + m_currentDesignDocumentController->loadMaster(m_currentTextEdit.data()); + } else { + m_currentDesignDocumentController->loadCurrentModel(); + } + + QList<RewriterView::Error> errors = m_currentDesignDocumentController->qmlErrors(); + if (errors.isEmpty()) { + // set selection to text cursor + RewriterView *rewriter = m_currentDesignDocumentController->rewriterView(); + const int cursorPos = m_currentTextEdit->textCursor().position(); + ModelNode node = nodeForPosition(cursorPos); + if (node.isValid()) { + rewriter->setSelectedModelNodes(QList<ModelNode>() << node); + } + enable(); + } else { + disable(errors); + } + + connect(m_currentDesignDocumentController.data(), SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>)), + this, SLOT(updateErrorStatus(QList<RewriterView::Error>))); - if (m_currentDocumentWidget) { - m_currentDocumentWidget->setAutoSynchronization(true); - m_documentWidgetStack->setCurrentWidget(m_currentDocumentWidget); - m_currentDocumentWidget->readSettings(); - m_undoAction->setEnabled(m_currentDocumentWidget->document()->isUndoAvailable()); - m_redoAction->setEnabled(m_currentDocumentWidget->document()->isRedoAvailable()); } else { - m_documentWidgetStack->setCurrentIndex(0); + if (m_currentDesignDocumentController->model() && m_currentDesignDocumentController->qmlErrors().isEmpty()) { + RewriterView *rewriter = m_currentDesignDocumentController->rewriterView(); + // visual editor -> text editor + ModelNode selectedNode; + if (!rewriter->selectedModelNodes().isEmpty()) + selectedNode = rewriter->selectedModelNodes().first(); + + if (selectedNode.isValid()) { + const int nodeOffset = rewriter->nodeOffset(selectedNode); + if (nodeOffset > 0) { + const ModelNode currentSelectedNode + = nodeForPosition(m_currentTextEdit->textCursor().position()); + if (currentSelectedNode != selectedNode) { + int line, column; + m_textEditor->convertPosition(nodeOffset, &line, &column); + m_textEditor->gotoLine(line, column); + } + } + } + } + + disconnect(m_currentDesignDocumentController.data(), SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>)), + this, SLOT(updateErrorStatus(QList<RewriterView::Error>))); + } +} + +void DesignModeWidget::setCurrentDocument(DesignDocumentController *newDesignDocumentController) +{ + if (debug) + qDebug() << Q_FUNC_INFO << newDesignDocumentController; + + if (m_currentDesignDocumentController.data() == newDesignDocumentController) + return; + if (m_currentDesignDocumentController) { + setAutoSynchronization(false); + saveSettings(); + } + + disconnect(currentDesignDocumentController(), SIGNAL(undoAvailable(bool)), + this, SLOT(undoAvailable(bool))); + disconnect(currentDesignDocumentController(), SIGNAL(redoAvailable(bool)), + this, SLOT(redoAvailable(bool))); + disconnect(currentDesignDocumentController(), SIGNAL(deleteAvailable(bool)), + this, SLOT(deleteAvailable(bool))); + + m_currentDesignDocumentController = newDesignDocumentController; + + connect(currentDesignDocumentController(), SIGNAL(undoAvailable(bool)), + this, SLOT(undoAvailable(bool))); + connect(currentDesignDocumentController(), SIGNAL(redoAvailable(bool)), + this, SLOT(redoAvailable(bool))); + connect(currentDesignDocumentController(), SIGNAL(deleteAvailable(bool)), + this, SLOT(deleteAvailable(bool))); + + if (m_currentDesignDocumentController) { + + setAutoSynchronization(true); + m_undoAction->setEnabled(m_currentDesignDocumentController->isUndoAvailable()); + m_redoAction->setEnabled(m_currentDesignDocumentController->isRedoAvailable()); + } else { + //detach all views m_undoAction->setEnabled(false); m_redoAction->setEnabled(false); } } +void DesignModeWidget::setup() +{ + if (m_setup) + return; + m_setup = true; + + QList<Core::INavigationWidgetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Core::INavigationWidgetFactory>(); + + QWidget *openDocumentsWidget = 0; + QWidget *projectsExplorer = 0; + QWidget *fileSystemExplorer = 0; + + + foreach(Core::INavigationWidgetFactory *factory, factories) + { + Core::NavigationView navigationView; + navigationView.widget = 0; + if (factory->displayName() == QLatin1String("Projects")) { + navigationView = factory->createWidget(); + projectsExplorer = navigationView.widget; + projectsExplorer->setWindowTitle(tr("Projects")); + } + if (factory->displayName() == QLatin1String("File System")) { + navigationView = factory->createWidget(); + fileSystemExplorer = navigationView.widget; + fileSystemExplorer->setWindowTitle(tr("File System")); + } + if (factory->displayName() == QLatin1String("Open Documents")) { + navigationView = factory->createWidget(); + openDocumentsWidget = navigationView.widget; + openDocumentsWidget->setWindowTitle(tr("Open Documents")); + } + + if (navigationView.widget) + { + QFile file(":/qmldesigner/stylesheet.css"); + file.open(QFile::ReadOnly); + QFile file2(":/qmldesigner/scrollbar.css"); + file2.open(QFile::ReadOnly); + + QString labelStyle = QLatin1String("QLabel { background-color: #707070; }"); + + QString styleSheet = file.readAll() + file2.readAll() + labelStyle; + navigationView.widget->setStyleSheet(styleSheet); + } + } + + m_navigator = new NavigatorView(this); + + m_allPropertiesBox = new AllPropertiesBox(this); + m_statesEditorWidget = new StatesEditorWidget(this); + + m_formEditorView = new FormEditorView(this); + + m_itemLibrary = new ItemLibrary(this); + + m_designToolBar = new QToolBar; + m_fakeToolBar = Core::EditorManager::createToolBar(this); + + + m_mainSplitter = new MiniSplitter(this); + m_mainSplitter->setObjectName("mainSplitter"); + + // warning frame should be not in layout, but still child of the widget + m_warningWidget = new DocumentWarningWidget(this); + m_warningWidget->setVisible(false); + + // Left area: + + Core::SideBarItem *navigatorItem = new Core::SideBarItem(m_navigator->widget()); + Core::SideBarItem *libraryItem = new Core::SideBarItem(m_itemLibrary.data()); + Core::SideBarItem *propertiesItem = new Core::SideBarItem(m_allPropertiesBox.data()); + + + QList<Core::SideBarItem*> leftSideBarItems, rightSideBarItems; + leftSideBarItems << navigatorItem << libraryItem; + rightSideBarItems << propertiesItem; + + if (projectsExplorer) { + Core::SideBarItem *projectExplorerItem = new Core::SideBarItem(projectsExplorer); + rightSideBarItems << projectExplorerItem; + } + + if (fileSystemExplorer) { + Core::SideBarItem *fileSystemExplorerItem = new Core::SideBarItem(fileSystemExplorer); + rightSideBarItems << fileSystemExplorerItem; + } + + if (openDocumentsWidget) { + Core::SideBarItem *openDocumentsItem = new Core::SideBarItem(openDocumentsWidget); + rightSideBarItems << openDocumentsItem; + } + + m_leftSideBar = new Core::SideBar(leftSideBarItems, QList<Core::SideBarItem*>() << navigatorItem << libraryItem); + m_rightSideBar = new Core::SideBar(rightSideBarItems, QList<Core::SideBarItem*>() << propertiesItem); + + m_designToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored); + + m_fakeToolBar->setToolbarCreationFlags(Core::EditorToolBar::FlagsStandalone); + //m_fakeToolBar->addEditor(textEditor()); ### what does this mean? + m_fakeToolBar->addCenterToolBar(m_designToolBar); + m_fakeToolBar->setNavigationVisible(false); + + connect(m_fakeToolBar, SIGNAL(closeClicked()), this, SLOT(closeCurrentEditor())); + + // right area: + QWidget *centerWidget = new QWidget; + { + QVBoxLayout *rightLayout = new QVBoxLayout(centerWidget); + rightLayout->setMargin(0); + rightLayout->setSpacing(0); + rightLayout->addWidget(m_fakeToolBar); + //### we now own these here + rightLayout->addWidget(m_statesEditorWidget.data()); + rightLayout->addWidget(m_formEditorView->widget()); + } + + // m_mainSplitter area: + m_mainSplitter->addWidget(m_leftSideBar); + m_mainSplitter->addWidget(centerWidget); + m_mainSplitter->addWidget(m_rightSideBar); + + // Finishing touches: + m_mainSplitter->setOpaqueResize(false); + m_mainSplitter->setStretchFactor(1, 1); + m_mainSplitter->setSizes(QList<int>() << 150 << 300 << 150); + + QLayout *mainLayout = new QBoxLayout(QBoxLayout::RightToLeft, this); + mainLayout->setMargin(0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_mainSplitter); + + m_warningWidget->setVisible(false); + m_statesEditorWidget->setEnabled(true); + m_leftSideBar->setEnabled(true); + m_rightSideBar->setEnabled(true); + + readSettings(); + + show(); + QApplication::processEvents(); +} + +void DesignModeWidget::resizeEvent(QResizeEvent *event) +{ + if (m_warningWidget) + m_warningWidget->move(QPoint(event->size().width() / 2, event->size().height() / 2)); + QWidget::resizeEvent(event); +} + + +bool DesignModeWidget::isInNodeDefinition(int nodeOffset, int nodeLength, int cursorPos) const { + return (nodeOffset <= cursorPos) && (nodeOffset + nodeLength > cursorPos); +} + + +ModelNode DesignModeWidget::nodeForPosition(int cursorPos) const +{ + RewriterView *rewriter = m_currentDesignDocumentController->rewriterView(); + QList<ModelNode> nodes = rewriter->allModelNodes(); + + ModelNode bestNode; + int bestNodeOffset = -1; + + foreach (const ModelNode &node, nodes) { + const int nodeOffset = rewriter->nodeOffset(node); + const int nodeLength = rewriter->nodeLength(node); + if (isInNodeDefinition(nodeOffset, nodeLength, cursorPos) + && (nodeOffset > bestNodeOffset)) { + bestNode = node; + bestNodeOffset = nodeOffset; + } + } + + return bestNode; +} + + QString DesignModeWidget::contextHelpId() const { - if (m_currentDocumentWidget) - return m_currentDocumentWidget->document()->contextHelpId(); + if (m_currentDesignDocumentController) + return m_currentDesignDocumentController->contextHelpId(); return QString(); } diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index ec4eb3c5a8f41b4fc931675cbb23120a3d970c99..934ec7b08ea33ea22eebe20795057d2a09e366df 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -40,8 +40,10 @@ #include <designdocumentcontroller.h> #include <itemlibrary.h> #include <navigatorwidget.h> +#include <navigatorview.h> #include <stateseditorwidget.h> #include <modelnode.h> +#include <formeditorview.h> #include <QWeakPointer> @@ -78,7 +80,7 @@ class DocumentWarningWidget : public QFrame Q_OBJECT Q_DISABLE_COPY(DocumentWarningWidget) public: - explicit DocumentWarningWidget(DocumentWidget *documentWidget, QWidget *parent = 0); + explicit DocumentWarningWidget(DesignModeWidget *parent = 0); void setError(const RewriterView::Error &error); @@ -88,52 +90,8 @@ private slots: private: QLabel *m_errorMessage; QLabel *m_goToError; - DocumentWidget *m_documentWidget; RewriterView::Error m_error; -}; - -class DocumentWidget : public QWidget -{ - Q_OBJECT - Q_DISABLE_COPY(DocumentWidget) -public: - explicit DocumentWidget(TextEditor::ITextEditor *textEditor, QPlainTextEdit *textEdit, QmlDesigner::DesignDocumentController *document, DesignModeWidget *mainWidget); - ~DocumentWidget(); - - QmlDesigner::DesignDocumentController *document() const; - TextEditor::ITextEditor *textEditor() const; - - void setAutoSynchronization(bool sync); - - void readSettings(); - void saveSettings(); - -protected: - void resizeEvent(QResizeEvent *event); - -private slots: - void enable(); - void disable(const QList<RewriterView::Error> &errors); - void updateErrorStatus(const QList<RewriterView::Error> &errors); - -private: - void setup(); - bool isInNodeDefinition(int nodeOffset, int nodeLength, int cursorPos) const; - QmlDesigner::ModelNode nodeForPosition(int cursorPos) const; - - TextEditor::ITextEditor *m_textEditor; - QWeakPointer<QPlainTextEdit> m_textBuffer; - QmlDesigner::DesignDocumentController *m_document; - DesignModeWidget *m_mainWidget; - QSplitter *m_mainSplitter; - Core::SideBar *m_leftSideBar; - Core::SideBar *m_rightSideBar; - - QToolBar *m_designToolBar; - Core::EditorToolBar *m_fakeToolBar; - - bool m_isDisabled; - DocumentWarningWidget *m_warningWidget; + DesignModeWidget *m_designModeWidget; }; class DesignModeWidget : public QWidget @@ -144,8 +102,6 @@ public: explicit DesignModeWidget(QWidget *parent = 0); ~DesignModeWidget(); -// void syncWithTextEdit(bool sync); - void showEditor(Core::IEditor *editor); void closeEditors(const QList<Core::IEditor*> editors); QString contextHelpId() const; @@ -158,6 +114,12 @@ public: QAction *pasteAction() const; QAction *selectAllAction() const; + void readSettings(); + void saveSettings(); + void setAutoSynchronization(bool sync); + + TextEditor::ITextEditor *textEditor() const {return m_textEditor; } + private slots: void undo(); void redo(); @@ -166,17 +128,26 @@ private slots: void copySelected(); void paste(); void selectAll(); + void closeCurrentEditor(); void undoAvailable(bool isAvailable); void redoAvailable(bool isAvailable); + void enable(); + void disable(const QList<RewriterView::Error> &errors); + void updateErrorStatus(const QList<RewriterView::Error> &errors); + +protected: + void resizeEvent(QResizeEvent *event); + private: - void setCurrentDocumentWidget(DocumentWidget *newDocumentWidget); + DesignDocumentController *currentDesignDocumentController() const {return m_currentDesignDocumentController.data(); } + void setCurrentDocument(DesignDocumentController *newDesignDocumentController); - QStackedWidget *m_documentWidgetStack; - QHash<QPlainTextEdit*,DocumentWidget*> m_documentHash; - DocumentWidget *m_currentDocumentWidget; - QPlainTextEdit *m_currentTextEdit; + //QStackedWidget *m_documentWidgetStack; + QHash<QPlainTextEdit*,QWeakPointer<DesignDocumentController> > m_documentHash; + QWeakPointer<DesignDocumentController> m_currentDesignDocumentController; + QWeakPointer<QPlainTextEdit> m_currentTextEdit; QAction *m_undoAction; QAction *m_redoAction; @@ -186,7 +157,30 @@ private: QAction *m_pasteAction; QAction *m_selectAllAction; + QWeakPointer<ItemLibrary> m_itemLibrary; + QWeakPointer<NavigatorView> m_navigator; + QWeakPointer<AllPropertiesBox> m_allPropertiesBox; + QWeakPointer<StatesEditorWidget> m_statesEditorWidget; + QWeakPointer<FormEditorView> m_formEditorView; + bool m_syncWithTextEdit; + + void setup(); + bool isInNodeDefinition(int nodeOffset, int nodeLength, int cursorPos) const; + QmlDesigner::ModelNode nodeForPosition(int cursorPos) const; + + TextEditor::ITextEditor *m_textEditor; + + QSplitter *m_mainSplitter; + Core::SideBar *m_leftSideBar; + Core::SideBar *m_rightSideBar; + + QToolBar *m_designToolBar; + Core::EditorToolBar *m_fakeToolBar; + + bool m_isDisabled; + bool m_setup; + DocumentWarningWidget *m_warningWidget; }; } // namespace Internal