QmlDesigner: Remove DesignDocumentControllerPrivate

Change-Id: I760c79eddc2e8abfe9edcda270d3e81df337d51d
Reviewed-by: Alessandro Portale <alessandro.portale@nokia.com>
This commit is contained in:
Marco Bubke
2012-08-23 18:09:21 +02:00
committed by Alessandro Portale
parent d3f0560120
commit 41b03629a0
2 changed files with 261 additions and 274 deletions

View File

@@ -32,25 +32,14 @@
#include "designdocumentcontrollerview.h" #include "designdocumentcontrollerview.h"
#include "xuifiledialog.h" #include "xuifiledialog.h"
#include "componentview.h" #include "componentview.h"
#include "subcomponentmanager.h"
#include "model/viewlogger.h"
#include <itemlibraryview.h>
#include <itemlibrarywidget.h> #include <itemlibrarywidget.h>
#include <navigatorview.h>
#include <stateseditorview.h>
#include <formeditorview.h>
#include <propertyeditor.h>
#include <formeditorwidget.h> #include <formeditorwidget.h>
#include <toolbox.h> #include <toolbox.h>
#include <basetexteditmodifier.h>
#include <componenttextmodifier.h>
#include <metainfo.h> #include <metainfo.h>
#include <invalidargumentexception.h> #include <invalidargumentexception.h>
#include <componentview.h>
#include <componentaction.h> #include <componentaction.h>
#include <qmlobjectnode.h> #include <qmlobjectnode.h>
#include <rewriterview.h>
#include <rewritingexception.h> #include <rewritingexception.h>
#include <nodelistproperty.h> #include <nodelistproperty.h>
#include <variantproperty.h> #include <variantproperty.h>
@@ -96,41 +85,9 @@ enum {
namespace QmlDesigner { namespace QmlDesigner {
class DesignDocumentControllerPrivate {
public:
QWeakPointer<FormEditorView> formEditorView;
QWeakPointer<ItemLibraryView> itemLibraryView; bool DesignDocumentController::s_clearCrumblePath = true;
QWeakPointer<NavigatorView> navigator; bool DesignDocumentController::s_pushCrumblePath = true;
QWeakPointer<PropertyEditor> propertyEditorView;
QWeakPointer<StatesEditorView> statesEditorView;
QWeakPointer<QStackedWidget> stackedWidget;
QWeakPointer<NodeInstanceView> nodeInstanceView;
QWeakPointer<ComponentView> componentView;
QWeakPointer<QmlDesigner::Model> model;
QWeakPointer<QmlDesigner::Model> subComponentModel;
QWeakPointer<QmlDesigner::Model> masterModel;
QWeakPointer<QPlainTextEdit> textEdit;
QWeakPointer<RewriterView> rewriterView;
QmlDesigner::BaseTextEditModifier *textModifier;
QmlDesigner::ComponentTextModifier *componentTextModifier;
QWeakPointer<SubComponentManager> subComponentManager;
QWeakPointer<Internal::ViewLogger> viewLogger;
ModelNode componentNode;
QString fileName;
QUrl searchPath;
bool documentLoaded;
bool syncBlocked;
int qt_versionId;
static bool clearCrumblePath;
static bool pushCrumblePath;
};
bool DesignDocumentControllerPrivate::clearCrumblePath = true;
bool DesignDocumentControllerPrivate::pushCrumblePath = true;
/** /**
@@ -140,11 +97,10 @@ bool DesignDocumentControllerPrivate::pushCrumblePath = true;
and the different views/widgets accessing it. and the different views/widgets accessing it.
*/ */
DesignDocumentController::DesignDocumentController(QObject *parent) : DesignDocumentController::DesignDocumentController(QObject *parent) :
QObject(parent), QObject(parent)
d(new DesignDocumentControllerPrivate)
{ {
d->documentLoaded = false; m_documentLoaded = false;
d->syncBlocked = false; m_syncBlocked = false;
ProjectExplorer::ProjectExplorerPlugin *projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance(); ProjectExplorer::ProjectExplorerPlugin *projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance();
connect(projectExplorer, SIGNAL(currentProjectChanged(ProjectExplorer::Project*)), this, SLOT(activeQtVersionChanged())); connect(projectExplorer, SIGNAL(currentProjectChanged(ProjectExplorer::Project*)), this, SLOT(activeQtVersionChanged()));
@@ -153,58 +109,56 @@ DesignDocumentController::DesignDocumentController(QObject *parent) :
DesignDocumentController::~DesignDocumentController() DesignDocumentController::~DesignDocumentController()
{ {
delete d->model.data(); delete m_model.data();
delete d->subComponentModel.data(); delete m_subComponentModel.data();
delete d->rewriterView.data(); delete m_rewriterView.data();
if (d->componentTextModifier) //componentTextModifier might not be created if (m_componentTextModifier) //componentTextModifier might not be created
delete d->componentTextModifier; delete m_componentTextModifier;
delete d;
} }
Model *DesignDocumentController::model() const Model *DesignDocumentController::model() const
{ {
return d->model.data(); return m_model.data();
} }
Model *DesignDocumentController::masterModel() const Model *DesignDocumentController::masterModel() const
{ {
return d->masterModel.data(); return m_masterModel.data();
} }
void DesignDocumentController::detachNodeInstanceView() void DesignDocumentController::detachNodeInstanceView()
{ {
if (d->nodeInstanceView) if (m_nodeInstanceView)
model()->detachView(d->nodeInstanceView.data()); model()->detachView(m_nodeInstanceView.data());
} }
void DesignDocumentController::attachNodeInstanceView() void DesignDocumentController::attachNodeInstanceView()
{ {
if (d->nodeInstanceView) { if (m_nodeInstanceView) {
model()->attachView(d->nodeInstanceView.data()); model()->attachView(m_nodeInstanceView.data());
} }
if (d->formEditorView) { if (m_formEditorView) {
d->formEditorView->resetView(); m_formEditorView->resetView();
} }
} }
void DesignDocumentController::changeToMasterModel() void DesignDocumentController::changeToMasterModel()
{ {
d->model->detachView(d->rewriterView.data()); m_model->detachView(m_rewriterView.data());
d->rewriterView->setTextModifier(d->textModifier); m_rewriterView->setTextModifier(m_textModifier);
d->model = d->masterModel; m_model = m_masterModel;
d->model->attachView(d->rewriterView.data()); m_model->attachView(m_rewriterView.data());
d->componentNode = d->rewriterView->rootModelNode(); m_componentNode = m_rewriterView->rootModelNode();
} }
QVariant DesignDocumentController::createCrumbleBarInfo() QVariant DesignDocumentController::createCrumbleBarInfo()
{ {
CrumbleBarInfo info; CrumbleBarInfo info;
info.fileName = fileName(); info.fileName = fileName();
info.modelNode = d->componentNode; info.modelNode = m_componentNode;
return QVariant::fromValue<CrumbleBarInfo>(info); return QVariant::fromValue<CrumbleBarInfo>(info);
} }
@@ -215,7 +169,7 @@ QWidget *DesignDocumentController::centralWidget() const
QString DesignDocumentController::pathToQt() const QString DesignDocumentController::pathToQt() const
{ {
QtSupport::BaseQtVersion *activeQtVersion = QtSupport::QtVersionManager::instance()->version(d->qt_versionId); QtSupport::BaseQtVersion *activeQtVersion = QtSupport::QtVersionManager::instance()->version(m_qt_versionId);
if (activeQtVersion && (activeQtVersion->qtVersion().majorVersion > 3) if (activeQtVersion && (activeQtVersion->qtVersion().majorVersion > 3)
&& (activeQtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT) && (activeQtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT)
|| activeQtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT))) || activeQtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT)))
@@ -228,7 +182,7 @@ QString DesignDocumentController::pathToQt() const
*/ */
bool DesignDocumentController::isModelSyncBlocked() const bool DesignDocumentController::isModelSyncBlocked() const
{ {
return d->syncBlocked; return m_syncBlocked;
} }
/*! /*!
@@ -240,35 +194,35 @@ bool DesignDocumentController::isModelSyncBlocked() const
*/ */
void DesignDocumentController::blockModelSync(bool block) void DesignDocumentController::blockModelSync(bool block)
{ {
if (d->syncBlocked == block) if (m_syncBlocked == block)
return; return;
d->syncBlocked = block; m_syncBlocked = block;
if (d->textModifier) { if (m_textModifier) {
if (d->syncBlocked) { if (m_syncBlocked) {
detachNodeInstanceView(); detachNodeInstanceView();
d->textModifier->deactivateChangeSignals(); m_textModifier->deactivateChangeSignals();
} else { } else {
activeQtVersionChanged(); activeQtVersionChanged();
changeToMasterModel(); changeToMasterModel();
QmlModelState state; QmlModelState state;
//We go back to base state (and back again) to avoid side effects from text editing. //We go back to base state (and back again) to avoid side effects from text editing.
if (d->statesEditorView && d->statesEditorView->model()) { if (m_statesEditorView && m_statesEditorView->model()) {
state = d->statesEditorView->currentState(); state = m_statesEditorView->currentState();
d->statesEditorView->setCurrentState(d->statesEditorView->baseState()); m_statesEditorView->setCurrentState(m_statesEditorView->baseState());
} }
d->textModifier->reactivateChangeSignals(); m_textModifier->reactivateChangeSignals();
if (state.isValid() && d->statesEditorView) if (state.isValid() && m_statesEditorView)
d->statesEditorView->setCurrentState(state); m_statesEditorView->setCurrentState(state);
attachNodeInstanceView(); attachNodeInstanceView();
if (d->propertyEditorView) if (m_propertyEditorView)
d->propertyEditorView->resetView(); m_propertyEditorView->resetView();
if (d->formEditorView) if (m_formEditorView)
d->formEditorView->resetView(); m_formEditorView->resetView();
} }
} }
} }
@@ -278,43 +232,43 @@ void DesignDocumentController::blockModelSync(bool block)
*/ */
QList<RewriterView::Error> DesignDocumentController::qmlErrors() const QList<RewriterView::Error> DesignDocumentController::qmlErrors() const
{ {
return d->rewriterView->errors(); return m_rewriterView->errors();
} }
void DesignDocumentController::setItemLibraryView(ItemLibraryView* itemLibraryView) void DesignDocumentController::setItemLibraryView(ItemLibraryView* itemLibraryView)
{ {
d->itemLibraryView = itemLibraryView; m_itemLibraryView = itemLibraryView;
} }
void DesignDocumentController::setNavigator(NavigatorView* navigatorView) void DesignDocumentController::setNavigator(NavigatorView* navigatorView)
{ {
d->navigator = navigatorView; m_navigator = navigatorView;
} }
void DesignDocumentController::setPropertyEditorView(PropertyEditor *propertyEditor) void DesignDocumentController::setPropertyEditorView(PropertyEditor *propertyEditor)
{ {
d->propertyEditorView = propertyEditor; m_propertyEditorView = propertyEditor;
} }
void DesignDocumentController::setStatesEditorView(StatesEditorView* statesEditorView) void DesignDocumentController::setStatesEditorView(StatesEditorView* statesEditorView)
{ {
d->statesEditorView = statesEditorView; m_statesEditorView = statesEditorView;
} }
void DesignDocumentController::setFormEditorView(FormEditorView *formEditorView) void DesignDocumentController::setFormEditorView(FormEditorView *formEditorView)
{ {
d->formEditorView = formEditorView; m_formEditorView = formEditorView;
} }
void DesignDocumentController::setNodeInstanceView(NodeInstanceView *nodeInstanceView) void DesignDocumentController::setNodeInstanceView(NodeInstanceView *nodeInstanceView)
{ {
d->nodeInstanceView = nodeInstanceView; m_nodeInstanceView = nodeInstanceView;
} }
void DesignDocumentController::setComponentView(ComponentView *componentView) void DesignDocumentController::setComponentView(ComponentView *componentView)
{ {
d->componentView = componentView; m_componentView = componentView;
connect(d->componentView->action(), SIGNAL(currentComponentChanged(ModelNode)), SLOT(changeCurrentModelTo(ModelNode))); connect(componentView->action(), SIGNAL(currentComponentChanged(ModelNode)), SLOT(changeCurrentModelTo(ModelNode)));
} }
static inline bool compareCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo1, const CrumbleBarInfo &crumbleBarInfo2) static inline bool compareCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo1, const CrumbleBarInfo &crumbleBarInfo2)
@@ -324,20 +278,20 @@ static inline bool compareCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo1,
void DesignDocumentController::setCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo) void DesignDocumentController::setCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo)
{ {
DesignDocumentControllerPrivate::clearCrumblePath = false; s_clearCrumblePath = false;
DesignDocumentControllerPrivate::pushCrumblePath = false; s_pushCrumblePath = false;
while (!compareCrumbleBarInfo(d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>(), crumbleBarInfo)) while (!compareCrumbleBarInfo(m_formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>(), crumbleBarInfo))
d->formEditorView->crumblePath()->popElement(); m_formEditorView->crumblePath()->popElement();
Core::EditorManager::openEditor(crumbleBarInfo.fileName); Core::EditorManager::openEditor(crumbleBarInfo.fileName);
DesignDocumentControllerPrivate::pushCrumblePath = true; s_pushCrumblePath = true;
Internal::DesignModeWidget::instance()->currentDesignDocumentController()->changeToSubComponent(crumbleBarInfo.modelNode); Internal::DesignModeWidget::instance()->currentDesignDocumentController()->changeToSubComponent(crumbleBarInfo.modelNode);
DesignDocumentControllerPrivate::clearCrumblePath = true; s_clearCrumblePath = true;
} }
void DesignDocumentController::setBlockCrumbleBar(bool b) void DesignDocumentController::setBlockCrumbleBar(bool b)
{ {
DesignDocumentControllerPrivate::clearCrumblePath = !b; s_clearCrumblePath = !b;
DesignDocumentControllerPrivate::pushCrumblePath = !b; s_pushCrumblePath = !b;
} }
QString DesignDocumentController::displayName() const QString DesignDocumentController::displayName() const
@@ -350,14 +304,14 @@ QString DesignDocumentController::displayName() const
QString DesignDocumentController::simplfiedDisplayName() const QString DesignDocumentController::simplfiedDisplayName() const
{ {
if (!d->componentNode.isRootNode()) { if (!m_componentNode.isRootNode()) {
if (d->componentNode.id().isEmpty()) { if (m_componentNode.id().isEmpty()) {
if (d->formEditorView->rootModelNode().id().isEmpty()) { if (m_formEditorView->rootModelNode().id().isEmpty()) {
return d->formEditorView->rootModelNode().simplifiedTypeName(); return m_formEditorView->rootModelNode().simplifiedTypeName();
} }
return d->formEditorView->rootModelNode().id(); return m_formEditorView->rootModelNode().id();
} }
return d->componentNode.id(); return m_componentNode.id();
} }
QStringList list = displayName().split(QLatin1Char('/')); QStringList list = displayName().split(QLatin1Char('/'));
@@ -366,24 +320,24 @@ QString DesignDocumentController::simplfiedDisplayName() const
QString DesignDocumentController::fileName() const QString DesignDocumentController::fileName() const
{ {
return d->fileName; return m_fileName;
} }
void DesignDocumentController::setFileName(const QString &fileName) void DesignDocumentController::setFileName(const QString &fileName)
{ {
d->fileName = fileName; m_fileName = fileName;
if (QFileInfo(fileName).exists()) { if (QFileInfo(fileName).exists()) {
d->searchPath = QUrl::fromLocalFile(fileName); m_searchPath = QUrl::fromLocalFile(fileName);
} else { } else {
d->searchPath = QUrl(fileName); m_searchPath = QUrl(fileName);
} }
if (d->model) if (m_model)
d->model->setFileUrl(d->searchPath); m_model->setFileUrl(m_searchPath);
if (d->itemLibraryView) if (m_itemLibraryView)
d->itemLibraryView->widget()->setResourcePath(QFileInfo(fileName).absolutePath()); m_itemLibraryView->widget()->setResourcePath(QFileInfo(fileName).absolutePath());
emit displayNameChanged(displayName()); emit displayNameChanged(displayName());
} }
@@ -391,7 +345,7 @@ QList<RewriterView::Error> DesignDocumentController::loadMaster(QPlainTextEdit *
{ {
Q_CHECK_PTR(edit); Q_CHECK_PTR(edit);
d->textEdit = edit; m_textEdit = edit;
connect(edit, SIGNAL(undoAvailable(bool)), connect(edit, SIGNAL(undoAvailable(bool)),
this, SIGNAL(undoAvailable(bool))); this, SIGNAL(undoAvailable(bool)));
@@ -400,70 +354,70 @@ QList<RewriterView::Error> DesignDocumentController::loadMaster(QPlainTextEdit *
connect(edit, SIGNAL(modificationChanged(bool)), connect(edit, SIGNAL(modificationChanged(bool)),
this, SIGNAL(dirtyStateChanged(bool))); this, SIGNAL(dirtyStateChanged(bool)));
d->textModifier = new BaseTextEditModifier(dynamic_cast<TextEditor::BaseTextEditorWidget*>(d->textEdit.data())); m_textModifier = new BaseTextEditModifier(dynamic_cast<TextEditor::BaseTextEditorWidget*>(m_textEdit.data()));
d->componentTextModifier = 0; m_componentTextModifier = 0;
//d->masterModel = Model::create(d->textModifier, d->searchPath, errors); //masterModel = Model::create(textModifier, searchPath, errors);
d->masterModel = Model::create("QtQuick.Rectangle", 1, 0); m_masterModel = Model::create("QtQuick.Rectangle", 1, 0);
#if defined(VIEWLOGGER) #if defined(VIEWLOGGER)
d->viewLogger = new Internal::ViewLogger(d->model.data()); m_viewLogger = new Internal::ViewLogger(m_model.data());
d->masterModel->attachView(d->viewLogger.data()); m_masterModel->attachView(m_viewLogger.data());
#endif #endif
d->masterModel->setFileUrl(d->searchPath); m_masterModel->setFileUrl(m_searchPath);
d->subComponentModel = Model::create("QtQuick.Rectangle", 1, 0); m_subComponentModel = Model::create("QtQuick.Rectangle", 1, 0);
d->subComponentModel->setFileUrl(d->searchPath); m_subComponentModel->setFileUrl(m_searchPath);
d->rewriterView = new RewriterView(RewriterView::Amend, d->masterModel.data()); m_rewriterView = new RewriterView(RewriterView::Amend, m_masterModel.data());
d->rewriterView->setTextModifier( d->textModifier); m_rewriterView->setTextModifier( m_textModifier);
connect(d->rewriterView.data(), SIGNAL(errorsChanged(QList<RewriterView::Error>)), connect(m_rewriterView.data(), SIGNAL(errorsChanged(QList<RewriterView::Error>)),
this, SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>))); this, SIGNAL(qmlErrorsChanged(QList<RewriterView::Error>)));
d->masterModel->attachView(d->rewriterView.data()); m_masterModel->attachView(m_rewriterView.data());
d->model = d->masterModel; m_model = m_masterModel;
d->componentNode = d->rewriterView->rootModelNode(); m_componentNode = m_rewriterView->rootModelNode();
d->subComponentManager = new SubComponentManager(d->masterModel.data(), this); m_subComponentManager = new SubComponentManager(m_masterModel.data(), this);
d->subComponentManager->update(d->searchPath, d->model->imports()); m_subComponentManager->update(m_searchPath, m_model->imports());
loadCurrentModel(); loadCurrentModel();
d->masterModel->attachView(d->componentView.data()); m_masterModel->attachView(m_componentView.data());
return d->rewriterView->errors(); return m_rewriterView->errors();
} }
void DesignDocumentController::changeCurrentModelTo(const ModelNode &node) void DesignDocumentController::changeCurrentModelTo(const ModelNode &node)
{ {
if (d->componentNode == node) if (m_componentNode == node)
return; return;
if (Internal::DesignModeWidget::instance()->currentDesignDocumentController() != this) if (Internal::DesignModeWidget::instance()->currentDesignDocumentController() != this)
return; return;
DesignDocumentControllerPrivate::clearCrumblePath = false; s_clearCrumblePath = false;
while (d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isValid() && while (m_formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isValid() &&
!d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isRootNode()) !m_formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isRootNode())
d->formEditorView->crumblePath()->popElement(); m_formEditorView->crumblePath()->popElement();
if (node.isRootNode() && d->formEditorView->crumblePath()->dataForLastIndex().isValid()) if (node.isRootNode() && m_formEditorView->crumblePath()->dataForLastIndex().isValid())
d->formEditorView->crumblePath()->popElement(); m_formEditorView->crumblePath()->popElement();
changeToSubComponent(node); changeToSubComponent(node);
DesignDocumentControllerPrivate::clearCrumblePath = true; s_clearCrumblePath = true;
} }
void DesignDocumentController::changeToSubComponent(const ModelNode &componentNode) void DesignDocumentController::changeToSubComponent(const ModelNode &componentNode)
{ {
Q_ASSERT(d->masterModel); Q_ASSERT(m_masterModel);
QWeakPointer<Model> oldModel = d->model; QWeakPointer<Model> oldModel = m_model;
Q_ASSERT(oldModel.data()); Q_ASSERT(oldModel.data());
if (d->model == d->subComponentModel) { if (m_model == m_subComponentModel) {
changeToMasterModel(); changeToMasterModel();
} }
QString componentText = d->rewriterView->extractText(QList<ModelNode>() << componentNode).value(componentNode); QString componentText = m_rewriterView->extractText(QList<ModelNode>() << componentNode).value(componentNode);
if (componentText.isEmpty()) if (componentText.isEmpty())
return; return;
@@ -473,110 +427,110 @@ void DesignDocumentController::changeToSubComponent(const ModelNode &componentNo
explicitComponent = true; explicitComponent = true;
} }
d->componentNode = componentNode; m_componentNode = componentNode;
if (!componentNode.isRootNode()) { if (!componentNode.isRootNode()) {
Q_ASSERT(d->model == d->masterModel); Q_ASSERT(m_model == m_masterModel);
Q_ASSERT(componentNode.isValid()); Q_ASSERT(componentNode.isValid());
//change to subcomponent model //change to subcomponent model
ModelNode rootModelNode = componentNode.view()->rootModelNode(); ModelNode rootModelNode = componentNode.view()->rootModelNode();
Q_ASSERT(rootModelNode.isValid()); Q_ASSERT(rootModelNode.isValid());
if (d->componentTextModifier) if (m_componentTextModifier)
delete d->componentTextModifier; delete m_componentTextModifier;
int componentStartOffset; int componentStartOffset;
int componentEndOffset; int componentEndOffset;
int rootStartOffset = d->rewriterView->nodeOffset(rootModelNode); int rootStartOffset = m_rewriterView->nodeOffset(rootModelNode);
if (explicitComponent) { //the component is explciit we have to find the first definition inside if (explicitComponent) { //the component is explciit we have to find the first definition inside
componentStartOffset = d->rewriterView->firstDefinitionInsideOffset(componentNode); componentStartOffset = m_rewriterView->firstDefinitionInsideOffset(componentNode);
componentEndOffset = componentStartOffset + d->rewriterView->firstDefinitionInsideLength(componentNode); componentEndOffset = componentStartOffset + m_rewriterView->firstDefinitionInsideLength(componentNode);
} else { //the component is implicit } else { //the component is implicit
componentStartOffset = d->rewriterView->nodeOffset(componentNode); componentStartOffset = m_rewriterView->nodeOffset(componentNode);
componentEndOffset = componentStartOffset + d->rewriterView->nodeLength(componentNode); componentEndOffset = componentStartOffset + m_rewriterView->nodeLength(componentNode);
} }
d->componentTextModifier = new ComponentTextModifier (d->textModifier, componentStartOffset, componentEndOffset, rootStartOffset); m_componentTextModifier = new ComponentTextModifier (m_textModifier, componentStartOffset, componentEndOffset, rootStartOffset);
d->model->detachView(d->rewriterView.data()); m_model->detachView(m_rewriterView.data());
d->rewriterView->setTextModifier(d->componentTextModifier); m_rewriterView->setTextModifier(m_componentTextModifier);
d->subComponentModel->attachView(d->rewriterView.data()); m_subComponentModel->attachView(m_rewriterView.data());
Q_ASSERT(d->rewriterView->rootModelNode().isValid()); Q_ASSERT(m_rewriterView->rootModelNode().isValid());
d->model = d->subComponentModel; m_model = m_subComponentModel;
} }
Q_ASSERT(d->masterModel); Q_ASSERT(m_masterModel);
Q_ASSERT(d->model); Q_ASSERT(m_model);
loadCurrentModel(); loadCurrentModel();
d->componentView->setComponentNode(componentNode); m_componentView->setComponentNode(componentNode);
} }
void DesignDocumentController::changeToExternalSubComponent(const QString &fileName) void DesignDocumentController::changeToExternalSubComponent(const QString &fileName)
{ {
DesignDocumentControllerPrivate::clearCrumblePath = false; s_clearCrumblePath = false;
Core::EditorManager::openEditor(fileName); Core::EditorManager::openEditor(fileName);
DesignDocumentControllerPrivate::clearCrumblePath = true; s_clearCrumblePath = true;
} }
void DesignDocumentController::goIntoComponent() void DesignDocumentController::goIntoComponent()
{ {
if (!d->model) if (!m_model)
return; return;
QList<ModelNode> selectedNodes; QList<ModelNode> selectedNodes;
if (d->formEditorView) if (m_formEditorView)
selectedNodes = d->formEditorView->selectedModelNodes(); selectedNodes = m_formEditorView->selectedModelNodes();
DesignDocumentControllerPrivate::clearCrumblePath = false; s_clearCrumblePath = false;
if (selectedNodes.count() == 1) if (selectedNodes.count() == 1)
ModelNodeAction::goIntoComponent(selectedNodes.first()); ModelNodeAction::goIntoComponent(selectedNodes.first());
DesignDocumentControllerPrivate::clearCrumblePath = true; s_clearCrumblePath = true;
} }
void DesignDocumentController::loadCurrentModel() void DesignDocumentController::loadCurrentModel()
{ {
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
Q_ASSERT(d->masterModel); Q_ASSERT(m_masterModel);
Q_ASSERT(d->model); Q_ASSERT(m_model);
d->model->setMasterModel(d->masterModel.data()); m_model->setMasterModel(m_masterModel.data());
d->masterModel->attachView(d->componentView.data()); m_masterModel->attachView(m_componentView.data());
d->nodeInstanceView->setPathToQt(pathToQt()); m_nodeInstanceView->setPathToQt(pathToQt());
d->model->attachView(d->nodeInstanceView.data()); m_model->attachView(m_nodeInstanceView.data());
d->model->attachView(d->navigator.data()); m_model->attachView(m_navigator.data());
d->itemLibraryView->widget()->setResourcePath(QFileInfo(d->fileName).absolutePath()); m_itemLibraryView->widget()->setResourcePath(QFileInfo(m_fileName).absolutePath());
d->model->attachView(d->formEditorView.data()); m_model->attachView(m_formEditorView.data());
d->model->attachView(d->itemLibraryView.data()); m_model->attachView(m_itemLibraryView.data());
if (!d->textEdit->parent()) // hack to prevent changing owner of external text edit if (!m_textEdit->parent()) // hack to prevent changing owner of external text edit
d->stackedWidget->addWidget(d->textEdit.data()); m_stackedWidget->addWidget(m_textEdit.data());
// Will call setCurrentState (formEditorView etc has to be constructed first) // Will call setCurrentState (formEditorView etc has to be constructed first)
d->model->attachView(d->statesEditorView.data()); m_model->attachView(m_statesEditorView.data());
d->model->attachView(d->propertyEditorView.data()); m_model->attachView(m_propertyEditorView.data());
if (DesignDocumentControllerPrivate::clearCrumblePath) if (s_clearCrumblePath)
d->formEditorView->crumblePath()->clear(); m_formEditorView->crumblePath()->clear();
if (DesignDocumentControllerPrivate::pushCrumblePath && if (s_pushCrumblePath &&
!compareCrumbleBarInfo(d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>(), !compareCrumbleBarInfo(m_formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>(),
createCrumbleBarInfo().value<CrumbleBarInfo>())) createCrumbleBarInfo().value<CrumbleBarInfo>()))
d->formEditorView->crumblePath()->pushElement(simplfiedDisplayName(), createCrumbleBarInfo()); m_formEditorView->crumblePath()->pushElement(simplfiedDisplayName(), createCrumbleBarInfo());
d->documentLoaded = true; m_documentLoaded = true;
d->subComponentManager->update(d->searchPath, d->model->imports()); m_subComponentManager->update(m_searchPath, m_model->imports());
Q_ASSERT(d->masterModel); Q_ASSERT(m_masterModel);
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
} }
@@ -590,7 +544,7 @@ QList<RewriterView::Error> DesignDocumentController::loadMaster(const QByteArray
void DesignDocumentController::saveAs(QWidget *parent) void DesignDocumentController::saveAs(QWidget *parent)
{ {
QFileInfo oldFileInfo(d->fileName); QFileInfo oldFileInfo(m_fileName);
XUIFileDialog::runSaveFileDialog(oldFileInfo.path(), parent, this, SLOT(doRealSaveAs(QString))); XUIFileDialog::runSaveFileDialog(oldFileInfo.path(), parent, this, SLOT(doRealSaveAs(QString)));
} }
@@ -622,8 +576,8 @@ void DesignDocumentController::doRealSaveAs(const QString &fileName)
bool DesignDocumentController::isDirty() const bool DesignDocumentController::isDirty() const
{ {
if (d->textEdit) if (m_textEdit)
return d->textEdit->document()->isModified(); return m_textEdit->document()->isModified();
else else
return false; return false;
} }
@@ -631,33 +585,33 @@ bool DesignDocumentController::isDirty() const
bool DesignDocumentController::isUndoAvailable() const bool DesignDocumentController::isUndoAvailable() const
{ {
if (d->textEdit) if (m_textEdit)
return d->textEdit->document()->isUndoAvailable(); return m_textEdit->document()->isUndoAvailable();
return false; return false;
} }
bool DesignDocumentController::isRedoAvailable() const bool DesignDocumentController::isRedoAvailable() const
{ {
if (d->textEdit) if (m_textEdit)
return d->textEdit->document()->isRedoAvailable(); return m_textEdit->document()->isRedoAvailable();
return false; return false;
} }
void DesignDocumentController::close() void DesignDocumentController::close()
{ {
d->documentLoaded = false; m_documentLoaded = false;
emit designDocumentClosed(); emit designDocumentClosed();
} }
void DesignDocumentController::deleteSelected() void DesignDocumentController::deleteSelected()
{ {
if (!d->model) if (!m_model)
return; return;
try { try {
if (d->formEditorView) { if (m_formEditorView) {
RewriterTransaction transaction(d->formEditorView.data()); RewriterTransaction transaction(m_formEditorView.data());
QList<ModelNode> toDelete = d->formEditorView->selectedModelNodes(); QList<ModelNode> toDelete = m_formEditorView->selectedModelNodes();
foreach (ModelNode node, toDelete) { foreach (ModelNode node, toDelete) {
if (node.isValid() && !node.isRootNode() && QmlObjectNode(node).isValid()) if (node.isValid() && !node.isRootNode() && QmlObjectNode(node).isValid())
QmlObjectNode(node).destroy(); QmlObjectNode(node).destroy();
@@ -670,15 +624,15 @@ void DesignDocumentController::deleteSelected()
void DesignDocumentController::copySelected() void DesignDocumentController::copySelected()
{ {
QScopedPointer<Model> model(Model::create("QtQuick.Rectangle", 1, 0, this->model())); QScopedPointer<Model> copyModel(Model::create("QtQuick.Rectangle", 1, 0, model()));
model->setFileUrl(d->model->fileUrl()); copyModel->setFileUrl(model()->fileUrl());
model->changeImports(d->model->imports(), QList<Import>()); copyModel->changeImports(model()->imports(), QList<Import>());
Q_ASSERT(model); Q_ASSERT(copyModel);
DesignDocumentControllerView view; DesignDocumentControllerView view;
d->model->attachView(&view); copyModel->attachView(&view);
if (view.selectedModelNodes().isEmpty()) if (view.selectedModelNodes().isEmpty())
return; return;
@@ -698,9 +652,9 @@ void DesignDocumentController::copySelected()
if (!selectedNode.isValid()) if (!selectedNode.isValid())
return; return;
d->model->detachView(&view); copyModel->detachView(&view);
model->attachView(&view); copyModel->attachView(&view);
view.replaceModel(selectedNode); view.replaceModel(selectedNode);
Q_ASSERT(view.rootModelNode().isValid()); Q_ASSERT(view.rootModelNode().isValid());
@@ -708,8 +662,8 @@ void DesignDocumentController::copySelected()
view.toClipboard(); view.toClipboard();
} else { //multi items selected } else { //multi items selected
d->model->detachView(&view); copyModel->detachView(&view);
model->attachView(&view); copyModel->attachView(&view);
foreach (ModelNode node, view.rootModelNode().allDirectSubModelNodes()) { foreach (ModelNode node, view.rootModelNode().allDirectSubModelNodes()) {
node.destroy(); node.destroy();
@@ -765,17 +719,17 @@ static void scatterItem(ModelNode pastedNode, const ModelNode targetNode, int of
void DesignDocumentController::paste() void DesignDocumentController::paste()
{ {
QScopedPointer<Model> model(Model::create("empty", 1, 0, this->model())); QScopedPointer<Model> pasteModel(Model::create("empty", 1, 0, model()));
model->setFileUrl(d->model->fileUrl()); pasteModel->setFileUrl(model()->fileUrl());
model->changeImports(d->model->imports(), QList<Import>()); pasteModel->changeImports(model()->imports(), QList<Import>());
Q_ASSERT(model); Q_ASSERT(pasteModel);
if (!d->model) if (!pasteModel)
return; return;
DesignDocumentControllerView view; DesignDocumentControllerView view;
model->attachView(&view); pasteModel->attachView(&view);
view.fromClipboard(); view.fromClipboard();
@@ -788,8 +742,8 @@ void DesignDocumentController::paste()
QList<ModelNode> selectedNodes = rootNode.allDirectSubModelNodes(); QList<ModelNode> selectedNodes = rootNode.allDirectSubModelNodes();
qDebug() << rootNode; qDebug() << rootNode;
qDebug() << selectedNodes; qDebug() << selectedNodes;
model->detachView(&view); pasteModel->detachView(&view);
d->model->attachView(&view); pasteModel->attachView(&view);
ModelNode targetNode; ModelNode targetNode;
@@ -814,7 +768,7 @@ void DesignDocumentController::paste()
QList<ModelNode> pastedNodeList; QList<ModelNode> pastedNodeList;
try { try {
RewriterTransaction transaction(d->formEditorView.data()); RewriterTransaction transaction(m_formEditorView.data());
int offset = double(qrand()) / RAND_MAX * 20 - 10; int offset = double(qrand()) / RAND_MAX * 20 - 10;
@@ -832,10 +786,10 @@ void DesignDocumentController::paste()
} }
} else { } else {
try { try {
RewriterTransaction transaction(d->formEditorView.data()); RewriterTransaction transaction(m_formEditorView.data());
model->detachView(&view); pasteModel->detachView(&view);
d->model->attachView(&view); pasteModel->attachView(&view);
ModelNode pastedNode(view.insertModel(rootNode)); ModelNode pastedNode(view.insertModel(rootNode));
ModelNode targetNode; ModelNode targetNode;
@@ -871,11 +825,11 @@ void DesignDocumentController::paste()
void DesignDocumentController::selectAll() void DesignDocumentController::selectAll()
{ {
if (!d->model) if (!m_model)
return; return;
DesignDocumentControllerView view; DesignDocumentControllerView view;
d->model->attachView(&view); m_model->attachView(&view);
QList<ModelNode> allNodesExceptRootNode(view.allModelNodes()); QList<ModelNode> allNodesExceptRootNode(view.allModelNodes());
@@ -885,21 +839,21 @@ void DesignDocumentController::selectAll()
RewriterView *DesignDocumentController::rewriterView() const RewriterView *DesignDocumentController::rewriterView() const
{ {
return d->rewriterView.data(); return m_rewriterView.data();
} }
void DesignDocumentController::undo() void DesignDocumentController::undo()
{ {
if (d->rewriterView && !d->rewriterView->modificationGroupActive()) if (m_rewriterView && !m_rewriterView->modificationGroupActive())
d->textEdit->undo(); m_textEdit->undo();
d->propertyEditorView->resetView(); m_propertyEditorView->resetView();
} }
void DesignDocumentController::redo() void DesignDocumentController::redo()
{ {
if (d->rewriterView && !d->rewriterView->modificationGroupActive()) if (m_rewriterView && !m_rewriterView->modificationGroupActive())
d->textEdit->redo(); m_textEdit->redo();
d->propertyEditorView->resetView(); m_propertyEditorView->resetView();
} }
static inline QtSupport::BaseQtVersion *getActiveQtVersion(DesignDocumentController *controller) static inline QtSupport::BaseQtVersion *getActiveQtVersion(DesignDocumentController *controller)
@@ -930,48 +884,48 @@ void DesignDocumentController::activeQtVersionChanged()
QtSupport::BaseQtVersion *newQtVersion = getActiveQtVersion(this); QtSupport::BaseQtVersion *newQtVersion = getActiveQtVersion(this);
if (!newQtVersion ) { if (!newQtVersion ) {
d->qt_versionId = -1; m_qt_versionId = -1;
return; return;
} }
if (d->qt_versionId == newQtVersion->uniqueId()) if (m_qt_versionId == newQtVersion->uniqueId())
return; return;
d->qt_versionId = newQtVersion->uniqueId(); m_qt_versionId = newQtVersion->uniqueId();
if (d->nodeInstanceView) if (m_nodeInstanceView)
d->nodeInstanceView->setPathToQt(pathToQt()); m_nodeInstanceView->setPathToQt(pathToQt());
} }
#ifdef ENABLE_TEXT_VIEW #ifdef ENABLE_TEXT_VIEW
void DesignDocumentController::showText() void DesignDocumentController::showText()
{ {
d->stackedWidget->setCurrentWidget(d->textEdit.data()); m_stackedWidget->setCurrentWidget(m_textEdit.data());
} }
#endif // ENABLE_TEXT_VIEW #endif // ENABLE_TEXT_VIEW
#ifdef ENABLE_TEXT_VIEW #ifdef ENABLE_TEXT_VIEW
void DesignDocumentController::showForm() void DesignDocumentController::showForm()
{ {
d->stackedWidget->setCurrentWidget(d->formEditorView->widget()); m_stackedWidget->setCurrentWidget(m_formEditorView->widget());
} }
#endif // ENABLE_TEXT_VIEW #endif // ENABLE_TEXT_VIEW
bool DesignDocumentController::save(QWidget *parent) bool DesignDocumentController::save(QWidget *parent)
{ {
// qDebug() << "Saving document to file \"" << d->fileName << "\"..."; // qDebug() << "Saving document to file \"" << fileName << "\"...";
// //
if (d->fileName.isEmpty()) { if (m_fileName.isEmpty()) {
saveAs(parent); saveAs(parent);
return true; return true;
} }
Utils::FileSaver saver(d->fileName, QIODevice::Text); Utils::FileSaver saver(m_fileName, QIODevice::Text);
if (d->model) if (m_model)
saver.write(d->textEdit->toPlainText().toLatin1()); saver.write(m_textEdit->toPlainText().toLatin1());
if (!saver.finalize(parent ? parent : d->stackedWidget.data())) if (!saver.finalize(parent ? parent : m_stackedWidget.data()))
return false; return false;
if (d->model) if (m_model)
d->textEdit->setPlainText(d->textEdit->toPlainText()); // clear undo/redo history m_textEdit->setPlainText(m_textEdit->toPlainText()); // clear undo/redo history
return true; return true;
} }
@@ -980,7 +934,7 @@ bool DesignDocumentController::save(QWidget *parent)
QString DesignDocumentController::contextHelpId() const QString DesignDocumentController::contextHelpId() const
{ {
DesignDocumentControllerView view; DesignDocumentControllerView view;
d->model->attachView(&view); m_model->attachView(&view);
QList<ModelNode> nodes = view.selectedModelNodes(); QList<ModelNode> nodes = view.selectedModelNodes();
QString helpId; QString helpId;

View File

@@ -33,9 +33,24 @@
#include "rewriterview.h" #include "rewriterview.h"
#include <model.h>
#include <rewriterview.h>
#include <itemlibraryview.h>
#include <navigatorview.h>
#include <stateseditorview.h>
#include <formeditorview.h>
#include <propertyeditor.h>
#include <componentview.h>
#include <basetexteditmodifier.h>
#include <componenttextmodifier.h>
#include <subcomponentmanager.h>
#include <model/viewlogger.h>
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QStackedWidget>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QUndoStack; class QUndoStack;
class QWidget; class QWidget;
@@ -47,23 +62,14 @@ QT_END_NAMESPACE
namespace QmlDesigner { namespace QmlDesigner {
class Model;
class ModelNode; class ModelNode;
class TextModifier; class TextModifier;
class QmlObjectNode; class QmlObjectNode;
class RewriterView;
class ItemLibraryView;
class NavigatorView;
class ComponentView;
class PropertyEditor;
class StatesEditorView;
class FormEditorView;
struct CrumbleBarInfo; struct CrumbleBarInfo;
class DesignDocumentController: public QObject class DesignDocumentController: public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
DesignDocumentController(QObject *parent); DesignDocumentController(QObject *parent);
~DesignDocumentController(); ~DesignDocumentController();
@@ -72,7 +78,7 @@ public:
QString simplfiedDisplayName() const; QString simplfiedDisplayName() const;
QString fileName() const; QString fileName() const;
void setFileName(const QString &fileName); void setFileName(const QString &m_fileName);
QList<RewriterView::Error> loadMaster(QPlainTextEdit *edit); QList<RewriterView::Error> loadMaster(QPlainTextEdit *edit);
QList<RewriterView::Error> loadMaster(const QByteArray &qml); QList<RewriterView::Error> loadMaster(const QByteArray &qml);
@@ -94,13 +100,13 @@ public:
QString contextHelpId() const; QString contextHelpId() const;
QList<RewriterView::Error> qmlErrors() const; QList<RewriterView::Error> qmlErrors() const;
void setItemLibraryView(ItemLibraryView* itemLibraryView); void setItemLibraryView(ItemLibraryView* m_itemLibraryView);
void setNavigator(NavigatorView* navigatorView); void setNavigator(NavigatorView* navigatorView);
void setPropertyEditorView(PropertyEditor *propertyEditor); void setPropertyEditorView(PropertyEditor *propertyEditor);
void setStatesEditorView(StatesEditorView* statesEditorView); void setStatesEditorView(StatesEditorView* m_statesEditorView);
void setFormEditorView(FormEditorView *formEditorView); void setFormEditorView(FormEditorView *m_formEditorView);
void setNodeInstanceView(NodeInstanceView *nodeInstanceView); void setNodeInstanceView(NodeInstanceView *m_nodeInstanceView);
void setComponentView(ComponentView *componentView); void setComponentView(ComponentView *m_componentView);
void setCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo); void setCrumbleBarInfo(const CrumbleBarInfo &crumbleBarInfo);
static void setBlockCrumbleBar(bool); static void setBlockCrumbleBar(bool);
@@ -129,7 +135,7 @@ public slots:
void activeQtVersionChanged(); void activeQtVersionChanged();
void changeCurrentModelTo(const ModelNode &node); void changeCurrentModelTo(const ModelNode &node);
void changeToSubComponent(const ModelNode &node); void changeToSubComponent(const ModelNode &node);
void changeToExternalSubComponent(const QString &fileName); void changeToExternalSubComponent(const QString &m_fileName);
void goIntoComponent(); void goIntoComponent();
#ifdef ENABLE_TEXT_VIEW #ifdef ENABLE_TEXT_VIEW
@@ -138,9 +144,9 @@ public slots:
#endif // ENABLE_TEXT_VIEW #endif // ENABLE_TEXT_VIEW
private slots: private slots:
void doRealSaveAs(const QString &fileName); void doRealSaveAs(const QString &m_fileName);
private: private: // functions
void detachNodeInstanceView(); void detachNodeInstanceView();
void attachNodeInstanceView(); void attachNodeInstanceView();
void changeToMasterModel(); void changeToMasterModel();
@@ -149,8 +155,35 @@ private:
QWidget *centralWidget() const; QWidget *centralWidget() const;
QString pathToQt() const; QString pathToQt() const;
private: // variables
QWeakPointer<FormEditorView> m_formEditorView;
class DesignDocumentControllerPrivate *d; QWeakPointer<ItemLibraryView> m_itemLibraryView;
QWeakPointer<NavigatorView> m_navigator;
QWeakPointer<PropertyEditor> m_propertyEditorView;
QWeakPointer<StatesEditorView> m_statesEditorView;
QWeakPointer<QStackedWidget> m_stackedWidget;
QWeakPointer<NodeInstanceView> m_nodeInstanceView;
QWeakPointer<ComponentView> m_componentView;
QWeakPointer<Model> m_model;
QWeakPointer<Model> m_subComponentModel;
QWeakPointer<Model> m_masterModel;
QWeakPointer<QPlainTextEdit> m_textEdit;
QWeakPointer<RewriterView> m_rewriterView;
BaseTextEditModifier *m_textModifier;
ComponentTextModifier *m_componentTextModifier;
QWeakPointer<SubComponentManager> m_subComponentManager;
QWeakPointer<Internal::ViewLogger> m_viewLogger;
ModelNode m_componentNode;
QString m_fileName;
QUrl m_searchPath;
bool m_documentLoaded;
bool m_syncBlocked;
int m_qt_versionId;
static bool s_clearCrumblePath;
static bool s_pushCrumblePath;
}; };