From e293e467d2dbf55f08ad0dfa36e7d185b3e84da8 Mon Sep 17 00:00:00 2001 From: Marco Bubke <marco.bubke@nokia.com> Date: Wed, 2 Mar 2011 16:20:36 +0100 Subject: [PATCH] QmlDesigner: Larger canvas size Many qml documents have items outside of the root item area. The scene rectangle is now much bigger so you can scroll the items around. --- .../formeditor/formeditorgraphicsview.cpp | 1 + .../components/formeditor/formeditorscene.cpp | 41 ++++++++-- .../components/formeditor/formeditorscene.h | 6 ++ .../components/formeditor/formeditorview.cpp | 4 + .../formeditor/formeditorwidget.cpp | 11 +++ .../components/formeditor/formeditorwidget.h | 4 + src/plugins/qmldesigner/designersettings.cpp | 12 ++- src/plugins/qmldesigner/designersettings.h | 2 + .../qmldesigner/qmldesignerconstants.h | 2 + src/plugins/qmldesigner/settingspage.ui | 82 +++++++++++++++---- 10 files changed, 140 insertions(+), 25 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp index 97d8bb4f583..8e882b059c7 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp @@ -46,6 +46,7 @@ FormEditorGraphicsView::FormEditorGraphicsView(QWidget *parent) : { setTransformationAnchor(QGraphicsView::AnchorUnderMouse); setResizeAnchor(QGraphicsView::AnchorViewCenter); + setAlignment(Qt::AlignCenter); setCacheMode(QGraphicsView::CacheNone); // setCacheMode(QGraphicsView::CacheBackground); setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index ed2ed787745..796aa40fbb0 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -36,6 +36,10 @@ #include "formeditorwidget.h" #include "formeditoritem.h" #include "movemanipulator.h" +#include "qmldesignerplugin.h" +#include "designersettings.h" + + #include <metainfo.h> #include <QGraphicsSceneDragDropEvent> @@ -60,18 +64,13 @@ namespace QmlDesigner { FormEditorScene::FormEditorScene(FormEditorWidget *view, FormEditorView *editorView) : QGraphicsScene(), m_editorView(editorView), - m_formLayerItem(new LayerItem(this)), - m_manipulatorLayerItem(new LayerItem(this)), m_paintMode(NormalMode), m_showBoundingRects(true) { - m_manipulatorLayerItem->setZValue(1.0); - m_formLayerItem->setZValue(0.0); - m_formLayerItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape, false); + setupScene(); view->setScene(this); setItemIndexMethod(QGraphicsScene::NoIndex); - -// setItemIndexMethod(QGraphicsScene::NoIndex); + setSceneRect(-canvasWidth()/2., -canvasHeight()/2., canvasWidth(), canvasHeight()); } FormEditorScene::~FormEditorScene() @@ -81,12 +80,40 @@ FormEditorScene::~FormEditorScene() } +void FormEditorScene::setupScene() +{ + m_formLayerItem = new LayerItem(this); + qDebug() << "formLayerItem" << m_formLayerItem.data(); + m_manipulatorLayerItem = new LayerItem(this); + qDebug() << "manipulatorLayerItem" << m_manipulatorLayerItem.data(); + m_manipulatorLayerItem->setZValue(1.0); + m_formLayerItem->setZValue(0.0); + m_formLayerItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape, false); +} + +void FormEditorScene::resetScene() +{ + foreach(QGraphicsItem *item, m_manipulatorLayerItem->childItems()) + removeItem(item); +} + FormEditorItem* FormEditorScene::itemForQmlItemNode(const QmlItemNode &qmlItemNode) const { Q_ASSERT(hasItemForQmlItemNode(qmlItemNode)); return m_qmlItemNodeItemHash.value(qmlItemNode); } +double FormEditorScene::canvasWidth() const +{ + DesignerSettings settings = Internal::BauhausPlugin::pluginInstance()->settings(); + return settings.canvasWidth; +} + +double FormEditorScene::canvasHeight() const +{ + DesignerSettings settings = Internal::BauhausPlugin::pluginInstance()->settings(); + return settings.canvasHeight; +} QList<FormEditorItem*> FormEditorScene::itemsForQmlItemNodes(const QList<QmlItemNode> &nodeList) const { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h index c30f3950aae..81a607d73c5 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h @@ -76,6 +76,12 @@ public: void updateAllFormEditorItems(); + void setupScene(); + void resetScene(); + + double canvasWidth() const; + double canvasHeight() const; + bool hasItemForQmlItemNode(const QmlItemNode &qmlItemNode) const; void synchronizeTransformation(const QmlItemNode &qmlItemNode); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 777fdfbe94b..1f10304f011 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -147,6 +147,8 @@ void FormEditorView::modelAboutToBeDetached(Model *model) m_dragTool->clear(); m_scene->clearFormEditorItems(); m_formEditorWidget->updateActions(); + m_formEditorWidget->resetView(); + scene()->resetScene(); QmlModelView::modelAboutToBeDetached(model); } @@ -451,6 +453,8 @@ void FormEditorView::instancesCompleted(const QVector<ModelNode> &completedNodeL if (qmlItemNode.isValid() && scene()->hasItemForQmlItemNode(qmlItemNode)) { scene()->synchronizeParent(qmlItemNode); itemNodeList.append(scene()->itemForQmlItemNode(qmlItemNode)); + if (qmlItemNode.isRootModelNode()) + m_formEditorWidget->centerScene(); } } currentTool()->instancesCompleted(itemNodeList); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 755e50b2737..b2f610827ad 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -244,6 +244,17 @@ void FormEditorWidget::updateActions() } } + +void FormEditorWidget::resetView() +{ + setRootItemRect(QRectF()); +} + +void FormEditorWidget::centerScene() +{ + m_graphicsView->centerOn(rootItemRect().center()); +} + ZoomAction *FormEditorWidget::zoomAction() const { return m_zoomAction.data(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h index c77681172e7..7daa794c2dd 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h @@ -80,6 +80,10 @@ public: void updateActions(); + void resetView(); + void centerScene(); + + protected: void enterEvent(QEvent *event); void wheelEvent(QWheelEvent *event); diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 96cdff79554..ae4a43499dc 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -41,7 +41,9 @@ using namespace QmlDesigner; DesignerSettings::DesignerSettings() : openDesignMode(QmlDesigner::Constants::QML_OPENDESIGNMODE_DEFAULT), itemSpacing(0), - snapMargin(0) + snapMargin(0), + canvasWidth(10000), + canvasHeight(10000) {} void DesignerSettings::fromSettings(QSettings *settings) @@ -55,6 +57,8 @@ void DesignerSettings::fromSettings(QSettings *settings) QLatin1String(QmlDesigner::Constants::QML_ITEMSPACING_KEY), QVariant(0)).toInt(); snapMargin = settings->value( QLatin1String(QmlDesigner::Constants::QML_SNAPMARGIN_KEY), QVariant(0)).toInt(); + canvasWidth = settings->value(QLatin1String(QmlDesigner::Constants::QML_CANVASWIDTH_KEY), QVariant(10000)).toInt(); + canvasHeight = settings->value(QLatin1String(QmlDesigner::Constants::QML_CANVASHEIGHT_KEY), QVariant(10000)).toInt(); settings->endGroup(); settings->endGroup(); } @@ -66,7 +70,8 @@ void DesignerSettings::toSettings(QSettings *settings) const settings->setValue(QLatin1String(QmlDesigner::Constants::QML_OPENDESIGNMODE_SETTINGS_KEY), openDesignMode); settings->setValue(QLatin1String(QmlDesigner::Constants::QML_ITEMSPACING_KEY), itemSpacing); settings->setValue(QLatin1String(QmlDesigner::Constants::QML_SNAPMARGIN_KEY), snapMargin); - + settings->setValue(QLatin1String(QmlDesigner::Constants::QML_CANVASWIDTH_KEY), canvasWidth); + settings->setValue(QLatin1String(QmlDesigner::Constants::QML_CANVASHEIGHT_KEY), canvasHeight); settings->endGroup(); settings->endGroup(); } @@ -75,5 +80,6 @@ bool DesignerSettings::equals(const DesignerSettings &other) const { return openDesignMode == other.openDesignMode && snapMargin == other.snapMargin - && itemSpacing == other.itemSpacing; + && canvasWidth == other.canvasWidth + && canvasHeight == other.canvasHeight; } diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index 7c544c0c9f5..d2954101f33 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -54,6 +54,8 @@ public: bool openDesignMode; int itemSpacing; int snapMargin; + int canvasWidth; + int canvasHeight; }; inline bool operator==(const DesignerSettings &s1, const DesignerSettings &s2) diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 120ffc3a403..c5cf13646de 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -66,6 +66,8 @@ const char * const QML_DESIGNER_SETTINGS_GROUP = "Designer"; const char * const QML_OPENDESIGNMODE_SETTINGS_KEY = "OpenDesignMode"; const char * const QML_ITEMSPACING_KEY = "ItemSpacing"; const char * const QML_SNAPMARGIN_KEY = "SnapMargin"; +const char * const QML_CANVASWIDTH_KEY = "CanvasWidth"; +const char * const QML_CANVASHEIGHT_KEY = "CanvasHeight"; const char * const QML_CONTEXTPANE_KEY = "ContextPaneEnabled"; const char * const QML_CONTEXTPANEPIN_KEY = "ContextPanePinned"; enum { QML_OPENDESIGNMODE_DEFAULT = 0 }; // 0 for text mode, 1 for design mode diff --git a/src/plugins/qmldesigner/settingspage.ui b/src/plugins/qmldesigner/settingspage.ui index f66c7db0ac1..aedaf40d9de 100644 --- a/src/plugins/qmldesigner/settingspage.ui +++ b/src/plugins/qmldesigner/settingspage.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>296</width> - <height>132</height> + <width>275</width> + <height>275</height> </rect> </property> <property name="windowTitle"> @@ -21,7 +21,7 @@ </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> - <layout class="QGridLayout" name="gridLayout"> + <layout class="QFormLayout" name="formLayout_2"> <item row="0" column="0"> <widget class="QLabel" name="snapMarginLabel"> <property name="text"> @@ -64,18 +64,70 @@ </item> </layout> </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Canvas</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="canvasWidth"> + <property name="text"> + <string>Width</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="spinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximum"> + <number>100000</number> + </property> + <property name="singleStep"> + <number>100</number> + </property> + <property name="value"> + <number>10000</number> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="canvasHeight"> + <property name="text"> + <string>Height</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="spinBox_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximum"> + <number>100000</number> + </property> + <property name="singleStep"> + <number>100</number> + </property> + <property name="value"> + <number>10000</number> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> @@ -88,7 +140,7 @@ <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>207</height> + <height>40</height> </size> </property> </spacer> -- GitLab