From 818a7b226bb79fe6e7e82d25ad329419c931287c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 7 Jan 2010 12:14:35 +0100 Subject: [PATCH] New QmlDesigner plugin & Design mode This adds a new "Design" mode that can be used to manipulate qml files in a visual way. It will only get build if you have the declarativeui module in Qt. This is a squashed import from the Bauhaus project. Share & enjoy :) --- .gitignore | 3 + share/qtcreator/qmldesigner/Button.qml | 86 + share/qtcreator/qmldesigner/gradient.png | Bin 0 -> 340205 bytes .../propertyeditor/Qt/AnchorBox.qml | 199 + .../Qt/BorderImageSpecifics.qml | 69 + .../propertyeditor/Qt/CheckBox.qml | 38 + .../propertyeditor/Qt/ColumnSpecifics.qml | 29 + .../propertyeditor/Qt/DoubleSpinBox.qml | 144 + .../propertyeditor/Qt/Extended.qml | 191 + .../propertyeditor/Qt/ExtendedPane.qml | 30 + .../propertyeditor/Qt/ExtendedSwitches.qml | 60 + .../propertyeditor/Qt/FlickableSpecifics.qml | 111 + .../propertyeditor/Qt/FlipableSpecifics.qml | 135 + .../propertyeditor/Qt/Geometry.qml | 173 + .../propertyeditor/Qt/GridSpecifics.qml | 49 + .../propertyeditor/Qt/GroupBox.qml | 57 + .../propertyeditor/Qt/GroupBoxOption.qml | 21 + .../propertyeditor/Qt/HorizontalLine.qml | 8 + .../propertyeditor/Qt/ImageSpecifics.qml | 26 + .../propertyeditor/Qt/IntEditor.qml | 51 + .../propertyeditor/Qt/ItemPane.qml | 104 + .../qmldesigner/propertyeditor/Qt/Layout.qml | 22 + .../propertyeditor/Qt/LayoutPane.qml | 29 + .../propertyeditor/Qt/ListView.qml | 85 + .../propertyeditor/Qt/ListViewSpecifics.qml | 106 + .../propertyeditor/Qt/Modifiers.qml | 218 + .../propertyeditor/Qt/PropertyFrame.qml | 10 + .../propertyeditor/Qt/RectangleSpecifics.qml | 134 + .../propertyeditor/Qt/ResetPane.qml | 41 + .../propertyeditor/Qt/RowSpecifics.qml | 29 + .../propertyeditor/Qt/ScrollArea.qml | 14 + .../qmldesigner/propertyeditor/Qt/SpinBox.qml | 72 + .../propertyeditor/Qt/Switches.qml | 85 + .../propertyeditor/Qt/TextEditSpecifics.qml | 273 + .../propertyeditor/Qt/TextInputSpecifics.qml | 176 + .../propertyeditor/Qt/TextSpecifics.qml | 172 + .../qmldesigner/propertyeditor/Qt/Type.qml | 94 + .../propertyeditor/Qt/WebViewSpecifics.qml | 96 + .../propertyeditor/Qt/anchorbox.css | 32 + .../propertyeditor/Qt/emptyPane.qml | 45 + .../propertyeditor/Qt/images/behaivour.png | Bin 0 -> 433 bytes .../Qt/images/blended-image-icon.png | Bin 0 -> 340 bytes .../propertyeditor/Qt/images/button.png | Bin 0 -> 687 bytes .../propertyeditor/Qt/images/default-icon.png | Bin 0 -> 341 bytes .../propertyeditor/Qt/images/downArrow.png | Bin 0 -> 855 bytes .../propertyeditor/Qt/images/expression.png | Bin 0 -> 575 bytes .../propertyeditor/Qt/images/extended.png | Bin 0 -> 293 bytes .../propertyeditor/Qt/images/grid-icon.png | Bin 0 -> 369 bytes .../propertyeditor/Qt/images/image-icon.png | Bin 0 -> 292 bytes .../propertyeditor/Qt/images/item-icon.png | Bin 0 -> 293 bytes .../propertyeditor/Qt/images/layout.png | Bin 0 -> 369 bytes .../propertyeditor/Qt/images/leftArrow.png | Bin 0 -> 885 bytes .../propertyeditor/Qt/images/list-icon.png | Bin 0 -> 424 bytes .../Qt/images/mouse-region-icon.png | Bin 0 -> 511 bytes .../propertyeditor/Qt/images/placeholder.png | Bin 0 -> 311 bytes .../propertyeditor/Qt/images/rect-icon.png | Bin 0 -> 237 bytes .../propertyeditor/Qt/images/reset-button.png | Bin 0 -> 741 bytes .../propertyeditor/Qt/images/rightArrow.png | Bin 0 -> 871 bytes .../propertyeditor/Qt/images/standard.png | Bin 0 -> 340 bytes .../propertyeditor/Qt/images/submenu.png | Bin 0 -> 447 bytes .../Qt/images/text-edit-icon.png | Bin 0 -> 368 bytes .../propertyeditor/Qt/images/text-icon.png | Bin 0 -> 582 bytes .../propertyeditor/Qt/images/upArrow.png | Bin 0 -> 849 bytes .../propertyeditor/Qt/layoutWidget.css | 35 + .../propertyeditor/Qt/propertyEditor.css | 397 + .../propertyeditor/Qt/specialCheckBox.css | 20 + .../qmldesigner/propertyeditor/Qt/switch.css | 32 + .../propertyeditor/Qt/typeLabel.css | 8 + share/qtcreator/qmldesigner/welcome-card.png | Bin 0 -> 59043 bytes share/qtcreator/qmldesigner/welcomescreen.qml | 147 + share/qtcreator/static.pro | 3 +- src/plugins/plugins.pro | 7 +- .../qmldesigner/QmlDesigner.pluginspec | 25 + src/plugins/qmldesigner/application.cpp | 46 + src/plugins/qmldesigner/application.h | 40 + .../formeditor/abstractformeditortool.cpp | 190 + .../formeditor/abstractformeditortool.h | 103 + .../components/formeditor/anchor.png | Bin 0 -> 415 bytes .../formeditor/anchorcontroller.cpp | 537 ++ .../components/formeditor/anchorcontroller.h | 117 + .../formeditor/anchorhandleitem.cpp | 212 + .../components/formeditor/anchorhandleitem.h | 91 + .../components/formeditor/anchorindicator.cpp | 116 + .../components/formeditor/anchorindicator.h | 64 + .../formeditor/anchorlinecontroller.cpp | 236 + .../formeditor/anchorlinecontroller.h | 93 + .../formeditor/anchorlinehandleitem.cpp | 148 + .../formeditor/anchorlinehandleitem.h | 86 + .../formeditor/anchorlineindicator.cpp | 131 + .../formeditor/anchorlineindicator.h | 69 + .../formeditor/anchormanipulator.cpp | 144 + .../components/formeditor/anchormanipulator.h | 71 + .../components/formeditor/anchortool.cpp | 226 + .../components/formeditor/anchortool.h | 88 + .../components/formeditor/controlelement.cpp | 66 + .../components/formeditor/controlelement.h | 57 + .../components/formeditor/dragtool.cpp | 315 + .../components/formeditor/dragtool.h | 105 + .../components/formeditor/formeditor.pri | 84 + .../components/formeditor/formeditor.qrc | 12 + .../formeditor/formeditorgraphicsview.cpp | 88 + .../formeditor/formeditorgraphicsview.h | 51 + .../components/formeditor/formeditoritem.cpp | 323 + .../components/formeditor/formeditoritem.h | 131 + .../formeditor/formeditormainview.cpp | 401 + .../formeditor/formeditormainview.h | 123 + .../formeditor/formeditormainwidget.cpp | 156 + .../formeditor/formeditormainwidget.h | 74 + .../formeditor/formeditornodeinstanceview.cpp | 48 + .../formeditor/formeditornodeinstanceview.h | 50 + .../components/formeditor/formeditorscene.cpp | 364 + .../components/formeditor/formeditorscene.h | 133 + .../formeditor/formeditorsubwindow.cpp | 38 + .../formeditor/formeditorsubwindow.h | 45 + .../components/formeditor/formeditorview.cpp | 531 ++ .../components/formeditor/formeditorview.h | 141 + .../formeditor/formeditorwidget.cpp | 221 + .../components/formeditor/formeditorwidget.h | 91 + .../components/formeditor/itemcreatortool.cpp | 191 + .../components/formeditor/itemcreatortool.h | 82 + .../formeditor/itemutilfunctions.cpp | 78 + .../components/formeditor/itemutilfunctions.h | 48 + .../components/formeditor/layeritem.cpp | 73 + .../components/formeditor/layeritem.h | 66 + .../formeditor/manipulatorlayeritem.h | 39 + .../components/formeditor/movemanipulator.cpp | 363 + .../components/formeditor/movemanipulator.h | 114 + .../components/formeditor/movetool.cpp | 345 + .../components/formeditor/movetool.h | 97 + .../formeditor/numberseriesaction.cpp | 88 + .../formeditor/numberseriesaction.h | 66 + .../formeditor/onedimensionalcluster.cpp | 146 + .../formeditor/onedimensionalcluster.h | 70 + .../components/formeditor/resize_handle.png | Bin 0 -> 160 bytes .../formeditor/resizecontroller.cpp | 273 + .../components/formeditor/resizecontroller.h | 104 + .../formeditor/resizehandleitem.cpp | 118 + .../components/formeditor/resizehandleitem.h | 84 + .../components/formeditor/resizeindicator.cpp | 91 + .../components/formeditor/resizeindicator.h | 81 + .../formeditor/resizemanipulator.cpp | 504 ++ .../components/formeditor/resizemanipulator.h | 91 + .../components/formeditor/resizetool.cpp | 177 + .../components/formeditor/resizetool.h | 76 + .../rubberbandselectionmanipulator.cpp | 153 + .../rubberbandselectionmanipulator.h | 83 + .../components/formeditor/scaleitem.cpp | 49 + .../components/formeditor/scaleitem.h | 53 + .../formeditor/scalemanipulator.cpp | 45 + .../components/formeditor/scalemanipulator.h | 63 + .../formeditor/selectionindicator.cpp | 118 + .../formeditor/selectionindicator.h | 65 + .../formeditor/selectionrectangle.cpp | 87 + .../formeditor/selectionrectangle.h | 63 + .../components/formeditor/selectiontool.cpp | 280 + .../components/formeditor/selectiontool.h | 93 + .../formeditor/singleselectionmanipulator.cpp | 132 + .../formeditor/singleselectionmanipulator.h | 72 + .../components/formeditor/snapper.cpp | 626 ++ .../components/formeditor/snapper.h | 112 + .../components/formeditor/snapping.png | Bin 0 -> 359 bytes .../formeditor/snappinglinecreator.cpp | 190 + .../formeditor/snappinglinecreator.h | 102 + .../components/formeditor/toolbox.cpp | 81 + .../components/formeditor/toolbox.h | 52 + .../components/formeditor/transform.png | Bin 0 -> 17296 bytes .../components/formeditor/zoomaction.cpp | 116 + .../components/formeditor/zoomaction.h | 68 + .../allpropertiesviewcontroller.cpp | 64 + .../integration/allpropertiesviewcontroller.h | 54 + .../integration/componentaction.cpp | 74 + .../components/integration/componentaction.h | 66 + .../components/integration/componentview.cpp | 179 + .../components/integration/componentview.h | 105 + .../integration/designdocumentcontroller.cpp | 815 +++ .../integration/designdocumentcontroller.h | 142 + .../designdocumentcontrollerview.cpp | 137 + .../designdocumentcontrollerview.h | 78 + .../components/integration/documentcloser.cpp | 139 + .../components/integration/documentcloser.h | 67 + .../components/integration/integration.pri | 34 + .../integration/integrationcore.cpp | 94 + .../components/integration/integrationcore.h | 61 + .../multipledocumentscontroller.cpp | 353 + .../integration/multipledocumentscontroller.h | 120 + .../integration/navigatorcontroller.cpp | 53 + .../integration/navigatorcontroller.h | 48 + .../stackedutilitypanelcontroller.cpp | 76 + .../stackedutilitypanelcontroller.h | 60 + .../integration/stateseditorcontroller.cpp | 50 + .../integration/stateseditorcontroller.h | 48 + .../integration/utilitypanelcontroller.cpp | 54 + .../integration/utilitypanelcontroller.h | 55 + .../integration/widgetboxcontroller.cpp | 51 + .../integration/widgetboxcontroller.h | 48 + .../components/integration/xuifiledialog.cpp | 91 + .../components/integration/xuifiledialog.h | 65 + .../itemlibrary/customdraganddrop.cpp | 301 + .../itemlibrary/customdraganddrop.h | 127 + .../components/itemlibrary/default-icon.png | Bin 0 -> 341 bytes .../components/itemlibrary/itemlibrary.cpp | 319 + .../components/itemlibrary/itemlibrary.h | 80 + .../components/itemlibrary/itemlibrary.pri | 12 + .../components/itemlibrary/itemlibrary.qrc | 5 + .../components/itemlibrary/itemlibrary.ui | 122 + .../itemlibrary/itemlibrarymodel.cpp | 297 + .../components/itemlibrary/itemlibrarymodel.h | 89 + .../qmldesigner/components/logger/logger.cpp | 171 + .../qmldesigner/components/logger/logger.h | 81 + .../qmldesigner/components/logger/logger.pri | 6 + .../components/navigator/navigator.pri | 9 + .../navigator/navigatortreemodel.cpp | 393 + .../components/navigator/navigatortreemodel.h | 115 + .../components/navigator/navigatorview.cpp | 227 + .../components/navigator/navigatorview.h | 98 + .../components/navigator/navigatorwidget.cpp | 88 + .../components/navigator/navigatorwidget.h | 56 + .../components/pluginmanager/iplugin.cpp | 36 + .../components/pluginmanager/iplugin.h | 56 + .../pluginmanager/pluginmanager.cpp | 174 + .../components/pluginmanager/pluginmanager.h | 75 + .../pluginmanager/pluginmanager.pri | 10 + .../components/pluginmanager/pluginpath.cpp | 193 + .../components/pluginmanager/pluginpath.h | 98 + .../propertyeditor/allpropertiesbox.cpp | 85 + .../propertyeditor/allpropertiesbox.h | 64 + .../propertyeditor/basiclayouts.cpp | 83 + .../components/propertyeditor/basiclayouts.h | 197 + .../propertyeditor/basicwidgets.cpp | 1142 +++ .../components/propertyeditor/basicwidgets.h | 132 + .../propertyeditor/behaviordialog.cpp | 174 + .../propertyeditor/behaviordialog.h | 98 + .../propertyeditor/behaviordialog.ui | 472 ++ .../components/propertyeditor/colorwidget.cpp | 259 + .../components/propertyeditor/colorwidget.h | 108 + .../components/propertyeditor/filewidget.cpp | 87 + .../components/propertyeditor/filewidget.h | 89 + .../components/propertyeditor/fontwidget.cpp | 172 + .../components/propertyeditor/fontwidget.h | 100 + .../genericpropertieswidget.cpp | 380 + .../propertyeditor/genericpropertieswidget.h | 96 + .../propertyeditor/gradientdialog.cpp | 353 + .../propertyeditor/gradientdialog.h | 89 + .../propertyeditor/gradientdialog.ui | 122 + .../propertyeditor/gradienteditor.cpp | 933 +++ .../propertyeditor/gradienteditor.h | 113 + .../propertyeditor/gradienteditor.ui | 1255 ++++ .../propertyeditor/images/button2_hovered.png | Bin 0 -> 898 bytes .../propertyeditor/images/button2_normal.png | Bin 0 -> 898 bytes .../propertyeditor/images/button2_pressed.png | Bin 0 -> 898 bytes .../propertyeditor/images/button_hovered.png | Bin 0 -> 390 bytes .../propertyeditor/images/button_normal.png | Bin 0 -> 379 bytes .../propertyeditor/images/button_pressed.png | Bin 0 -> 1328 bytes .../propertyeditor/images/frame.png | Bin 0 -> 4826 bytes .../propertyeditor/images/gradient.png | Bin 0 -> 604 bytes .../propertyeditor/layoutwidget.cpp | 106 + .../components/propertyeditor/layoutwidget.h | 137 + .../propertyeditor/propertyeditor.cpp | 583 ++ .../propertyeditor/propertyeditor.h | 126 + .../propertyeditor/propertyeditor.pri | 34 + .../propertyeditor/propertyeditor.qrc | 12 + .../propertyeditor/propertyeditorvalue.cpp | 343 + .../propertyeditor/propertyeditorvalue.h | 155 + .../propertyeditor/qlayoutobject.cpp | 57 + .../components/propertyeditor/qlayoutobject.h | 69 + .../propertyeditor/qmlanchorbindingproxy.cpp | 287 + .../propertyeditor/qmlanchorbindingproxy.h | 117 + .../propertyeditor/qproxylayoutitem.cpp | 176 + .../propertyeditor/qproxylayoutitem.h | 107 + .../qtgradienteditor/images/down.png | Bin 0 -> 594 bytes .../qtgradienteditor/images/edit.png | Bin 0 -> 503 bytes .../qtgradienteditor/images/editdelete.png | Bin 0 -> 831 bytes .../qtgradienteditor/images/minus.png | Bin 0 -> 250 bytes .../qtgradienteditor/images/plus.png | Bin 0 -> 462 bytes .../qtgradienteditor/images/spreadpad.png | Bin 0 -> 151 bytes .../qtgradienteditor/images/spreadreflect.png | Bin 0 -> 165 bytes .../qtgradienteditor/images/spreadrepeat.png | Bin 0 -> 156 bytes .../qtgradienteditor/images/typeconical.png | Bin 0 -> 937 bytes .../qtgradienteditor/images/typelinear.png | Bin 0 -> 145 bytes .../qtgradienteditor/images/typeradial.png | Bin 0 -> 583 bytes .../qtgradienteditor/images/up.png | Bin 0 -> 692 bytes .../qtgradienteditor/images/zoomin.png | Bin 0 -> 1208 bytes .../qtgradienteditor/images/zoomout.png | Bin 0 -> 1226 bytes .../qtgradienteditor/qtcolorbutton.cpp | 272 + .../qtgradienteditor/qtcolorbutton.h | 86 + .../qtgradienteditor/qtcolorbutton.pri | 4 + .../qtgradienteditor/qtcolorline.cpp | 1122 +++ .../qtgradienteditor/qtcolorline.h | 124 + .../qtgradienteditor/qtgradientdialog.cpp | 353 + .../qtgradienteditor/qtgradientdialog.h | 87 + .../qtgradienteditor/qtgradientdialog.ui | 121 + .../qtgradienteditor/qtgradienteditor.cpp | 952 +++ .../qtgradienteditor/qtgradienteditor.h | 111 + .../qtgradienteditor/qtgradienteditor.pri | 33 + .../qtgradienteditor/qtgradienteditor.qrc | 18 + .../qtgradienteditor/qtgradienteditor.ui | 1377 ++++ .../qtgradienteditor/qtgradientmanager.cpp | 135 + .../qtgradienteditor/qtgradientmanager.h | 92 + .../qtgradientstopscontroller.cpp | 724 ++ .../qtgradientstopscontroller.h | 106 + .../qtgradienteditor/qtgradientstopsmodel.cpp | 477 ++ .../qtgradienteditor/qtgradientstopsmodel.h | 121 + .../qtgradientstopswidget.cpp | 1154 +++ .../qtgradienteditor/qtgradientstopswidget.h | 115 + .../qtgradienteditor/qtgradientutils.cpp | 420 ++ .../qtgradienteditor/qtgradientutils.h | 66 + .../qtgradienteditor/qtgradientview.cpp | 292 + .../qtgradienteditor/qtgradientview.h | 99 + .../qtgradienteditor/qtgradientview.ui | 135 + .../qtgradienteditor/qtgradientviewdialog.cpp | 89 + .../qtgradienteditor/qtgradientviewdialog.h | 75 + .../qtgradienteditor/qtgradientviewdialog.ui | 121 + .../qtgradienteditor/qtgradientwidget.cpp | 815 +++ .../qtgradienteditor/qtgradientwidget.h | 120 + .../components/propertyeditor/resetwidget.cpp | 129 + .../components/propertyeditor/resetwidget.h | 102 + .../resources/images/checkbox_checked.png | Bin 0 -> 299 bytes .../images/checkbox_checked_hover.png | Bin 0 -> 302 bytes .../images/checkbox_checked_pressed.png | Bin 0 -> 474 bytes .../resources/images/checkbox_unchecked.png | Bin 0 -> 190 bytes .../images/checkbox_unchecked_hover.png | Bin 0 -> 190 bytes .../images/checkbox_unchecked_pressed.png | Bin 0 -> 345 bytes .../resources/images/down_arrow.png | Bin 0 -> 271 bytes .../resources/images/down_arrow_disabled.png | Bin 0 -> 258 bytes .../components/resources/images/frame.png | Bin 0 -> 544 bytes .../resources/images/pushbutton.png | Bin 0 -> 508 bytes .../resources/images/pushbutton_hover.png | Bin 0 -> 503 bytes .../resources/images/pushbutton_pressed.png | Bin 0 -> 485 bytes .../resources/images/radiobutton_checked.png | Bin 0 -> 355 bytes .../images/radiobutton_checked_hover.png | Bin 0 -> 532 bytes .../images/radiobutton_checked_pressed.png | Bin 0 -> 599 bytes .../images/radiobutton_unchecked.png | Bin 0 -> 240 bytes .../images/radiobutton_unchecked_hover.png | Bin 0 -> 492 bytes .../images/radiobutton_unchecked_pressed.png | Bin 0 -> 556 bytes .../components/resources/images/sizegrip.png | Bin 0 -> 129 bytes .../components/resources/images/spindown.png | Bin 0 -> 227 bytes .../resources/images/spindown_hover.png | Bin 0 -> 227 bytes .../resources/images/spindown_off.png | Bin 0 -> 249 bytes .../resources/images/spindown_pressed.png | Bin 0 -> 222 bytes .../components/resources/images/spinup.png | Bin 0 -> 236 bytes .../resources/images/spinup_hover.png | Bin 0 -> 236 bytes .../resources/images/spinup_off.png | Bin 0 -> 274 bytes .../resources/images/spinup_pressed.png | Bin 0 -> 232 bytes .../components/resources/images/up_arrow.png | Bin 0 -> 273 bytes .../resources/images/up_arrow_disabled.png | Bin 0 -> 266 bytes .../components/resources/resources.pri | 3 + .../components/resources/resources.qrc | 37 + .../components/resources/scrollbar.css | 42 + .../components/resources/stylesheet.css | 72 + .../resources/templates/Standard/Form.xml | 10 + .../components/resources/toolbutton.css | 23 + .../components/stateseditor/stateseditor.pri | 10 + .../components/stateseditor/stateseditor.qrc | 5 + .../stateseditor/stateseditormodel.cpp | 147 + .../stateseditor/stateseditormodel.h | 79 + .../stateseditor/stateseditorview.cpp | 438 ++ .../stateseditor/stateseditorview.h | 100 + .../stateseditor/stateseditorwidget.cpp | 218 + .../stateseditor/stateseditorwidget.h | 65 + .../components/stateseditor/stateslist.qml | 337 + .../themeloader/qts60stylethemeio.cpp | 357 + .../themeloader/qts60stylethemeio.h | 58 + .../themeloader/qts60stylethemeio.pri | 6 + src/plugins/qmldesigner/config.pri | 27 + src/plugins/qmldesigner/core/core.pri | 183 + src/plugins/qmldesigner/core/core.qrc | 6 + src/plugins/qmldesigner/core/depend_paths.pri | 1 + .../qmldesigner/core/exceptions/exception.cpp | 192 + .../exceptions/invalidargumentexception.cpp | 75 + .../core/exceptions/invalididexception.cpp | 45 + .../exceptions/invalidmetainfoexception.cpp | 64 + .../exceptions/invalidmodelnodeexception.cpp | 64 + .../exceptions/invalidmodelstateexception.cpp | 65 + .../invalidnodeinstanceexception.cpp | 65 + .../exceptions/invalidnodestateexception.cpp | 65 + .../exceptions/invalidpropertyexception.cpp | 74 + .../exceptions/invalidqmlsourceexception.cpp | 71 + .../invalidreparentingexception.cpp | 62 + .../exceptions/invalidslideindexexception.cpp | 64 + .../exceptions/modificationgroupexception.cpp | 63 + .../noanchoringpossibleexception.cpp | 46 + .../exceptions/notimplementedexception.cpp | 45 + .../exceptions/removebasestateexception.cpp | 64 + .../filemanager/addarraymembervisitor.cpp | 118 + .../core/filemanager/addarraymembervisitor.h | 72 + .../core/filemanager/addobjectvisitor.cpp | 93 + .../core/filemanager/addobjectvisitor.h | 62 + .../core/filemanager/addpropertyvisitor.cpp | 136 + .../core/filemanager/addpropertyvisitor.h | 68 + .../filemanager/astobjecttextextractor.cpp | 75 + .../core/filemanager/astobjecttextextractor.h | 59 + .../core/filemanager/changeimportsvisitor.cpp | 80 + .../core/filemanager/changeimportsvisitor.h | 61 + .../filemanager/changeobjecttypevisitor.cpp | 81 + .../filemanager/changeobjecttypevisitor.h | 60 + .../filemanager/changepropertyvisitor.cpp | 191 + .../core/filemanager/changepropertyvisitor.h | 70 + .../core/filemanager/changeset.cpp | 359 + .../qmldesigner/core/filemanager/changeset.h | 120 + .../core/filemanager/filemanager.pri | 41 + .../filemanager/firstdefinitionfinder.cpp | 98 + .../core/filemanager/firstdefinitionfinder.h | 63 + .../core/filemanager/idcollector.cpp | 93 + .../core/filemanager/idcollector.h | 69 + .../qmldesigner/core/filemanager/indenter.cpp | 90 + .../qmldesigner/core/filemanager/indenter.h | 43 + .../moveobjectbeforeobjectvisitor.cpp | 158 + .../moveobjectbeforeobjectvisitor.h | 79 + .../core/filemanager/moveobjectvisitor.cpp | 293 + .../core/filemanager/moveobjectvisitor.h | 72 + .../filemanager/objectlengthcalculator.cpp | 91 + .../core/filemanager/objectlengthcalculator.h | 60 + .../core/filemanager/parser/parser.pri | 22 + .../core/filemanager/parser/qmljs.g | 3029 ++++++++ .../core/filemanager/parser/qmljsast.cpp | 943 +++ .../core/filemanager/parser/qmljsast_p.h | 2665 +++++++ .../core/filemanager/parser/qmljsastfwd_p.h | 176 + .../filemanager/parser/qmljsastvisitor.cpp | 46 + .../filemanager/parser/qmljsastvisitor_p.h | 323 + .../core/filemanager/parser/qmljsengine_p.cpp | 198 + .../core/filemanager/parser/qmljsengine_p.h | 161 + .../core/filemanager/parser/qmljsglobal_p.h | 43 + .../core/filemanager/parser/qmljsgrammar.cpp | 960 +++ .../core/filemanager/parser/qmljsgrammar_p.h | 207 + .../core/filemanager/parser/qmljslexer.cpp | 1141 +++ .../core/filemanager/parser/qmljslexer_p.h | 237 + .../filemanager/parser/qmljsmemorypool_p.h | 120 + .../core/filemanager/parser/qmljsnodepool_p.h | 127 + .../core/filemanager/parser/qmljsparser.cpp | 1812 +++++ .../core/filemanager/parser/qmljsparser_p.h | 230 + .../core/filemanager/qmldocument.cpp | 165 + .../core/filemanager/qmldocument.h | 109 + .../core/filemanager/qmleditor_global.h | 41 + .../core/filemanager/qmlrefactoring.cpp | 160 + .../core/filemanager/qmlrefactoring.h | 80 + .../core/filemanager/qmlrewriter.cpp | 317 + .../core/filemanager/qmlrewriter.h | 97 + .../core/filemanager/qmlsymbol.cpp | 116 + .../qmldesigner/core/filemanager/qmlsymbol.h | 121 + .../filemanager/removepropertyvisitor.cpp | 108 + .../core/filemanager/removepropertyvisitor.h | 63 + .../removeuiobjectmembervisitor.cpp | 139 + .../filemanager/removeuiobjectmembervisitor.h | 75 + .../core/filemanager/utils_global.h | 37 + .../core/include/abstractproperty.h | 127 + .../qmldesigner/core/include/abstractview.h | 148 + .../qmldesigner/core/include/anchorline.h | 118 + .../core/include/bindingproperty.h | 64 + .../core/include/bytearraymodifier.h | 58 + .../core/include/componenttextmodifier.h | 69 + .../qmldesigner/core/include/corelib_global.h | 56 + .../core/include/customnotifications.h | 42 + .../core/include/enumeratormetainfo.h | 85 + .../qmldesigner/core/include/exception.h | 72 + .../qmldesigner/core/include/forwardview.h | 272 + src/plugins/qmldesigner/core/include/import.h | 76 + .../core/include/invalidargumentexception.h | 55 + .../core/include/invalididexception.h | 50 + .../core/include/invalidmetainfoexception.h | 50 + .../core/include/invalidmodelnodeexception.h | 50 + .../core/include/invalidmodelstateexception.h | 50 + .../include/invalidnodeinstanceexception.h | 48 + .../core/include/invalidnodestateexception.h | 50 + .../core/include/invalidpropertyexception.h | 54 + .../core/include/invalidqmlsourceexception.h | 54 + .../include/invalidreparentingexception.h | 49 + .../core/include/invalidslideindexexception.h | 48 + .../core/include/itemlibraryinfo.h | 100 + .../qmldesigner/core/include/iwidgetplugin.h | 52 + .../qmldesigner/core/include/mathutils.h | 46 + .../qmldesigner/core/include/metainfo.h | 123 + .../qmldesigner/core/include/metainfoparser.h | 77 + src/plugins/qmldesigner/core/include/model.h | 109 + .../qmldesigner/core/include/modelmerger.h | 59 + .../qmldesigner/core/include/modelnode.h | 186 + .../core/include/modelnodepositionstorage.h | 82 + .../qmldesigner/core/include/modelutilities.h | 51 + .../core/include/modificationgroupexception.h | 47 + .../core/include/modificationgrouptoken.h | 75 + .../include/noanchoringpossibleexception.h | 50 + .../core/include/nodeabstractproperty.h | 63 + .../qmldesigner/core/include/nodeanchors.h | 114 + .../qmldesigner/core/include/nodeinstance.h | 166 + .../core/include/nodeinstanceview.h | 153 + .../core/include/nodelistproperty.h | 71 + .../qmldesigner/core/include/nodemetainfo.h | 139 + .../qmldesigner/core/include/nodeproperty.h | 62 + .../core/include/notimplementedexception.h | 50 + .../core/include/objectpropertybinding.h | 55 + .../core/include/plaintexteditmodifier.h | 90 + .../core/include/propertybinding.h | 62 + .../core/include/propertycontainer.h | 82 + .../core/include/propertymetainfo.h | 123 + .../qmldesigner/core/include/propertynode.h | 48 + .../qmldesigner/core/include/qmlanchors.h | 113 + .../qmldesigner/core/include/qmlchangeset.h | 61 + .../qmldesigner/core/include/qmlitemnode.h | 120 + .../core/include/qmlmodelnodefacade.h | 61 + .../qmldesigner/core/include/qmlmodelview.h | 114 + .../qmldesigner/core/include/qmlobjectnode.h | 103 + .../qmldesigner/core/include/qmlstate.h | 82 + .../core/include/removebasestateexception.h | 49 + .../replaceallobjectdefinitionsvisitor.h | 59 + .../qmldesigner/core/include/rewriterview.h | 177 + .../qmldesigner/core/include/stylemanager.h | 68 + .../core/include/subcomponentmanager.h | 68 + .../qmldesigner/core/include/textmodifier.h | 91 + .../core/include/variantproperty.h | 70 + .../core/include/widgetplugin_helper.h | 37 + .../core/include/widgetqueryview.h | 56 + .../core/instances/componentnodeinstance.cpp | 100 + .../core/instances/componentnodeinstance.h | 60 + .../core/instances/dummynodeinstance.cpp | 121 + .../core/instances/dummynodeinstance.h | 73 + .../instances/graphicsobjectnodeinstance.cpp | 226 + .../instances/graphicsobjectnodeinstance.h | 90 + .../instances/graphicsscenenodeinstance.cpp | 158 + .../instances/graphicsscenenodeinstance.h | 75 + .../instances/graphicsviewnodeinstance.cpp | 111 + .../core/instances/graphicsviewnodeinstance.h | 67 + .../instances/graphicswidgetnodeinstance.cpp | 185 + .../instances/graphicswidgetnodeinstance.h | 80 + .../core/instances/nodeinstance.cpp | 589 ++ .../core/instances/nodeinstanceview.cpp | 610 ++ .../core/instances/objectnodeinstance.cpp | 690 ++ .../core/instances/objectnodeinstance.h | 185 + .../instances/proxywidgetnodeinstance.cpp | 82 + .../core/instances/proxywidgetnodeinstance.h | 59 + .../instances/qmlgraphicsitemnodeinstance.cpp | 562 ++ .../instances/qmlgraphicsitemnodeinstance.h | 79 + .../qmlpropertychangesnodeinstance.cpp | 205 + .../qmlpropertychangesnodeinstance.h | 103 + .../core/instances/qmlstatenodeinstance.cpp | 134 + .../core/instances/qmlstatenodeinstance.h | 66 + .../instances/qmltransitionnodeinstance.cpp | 87 + .../instances/qmltransitionnodeinstance.h | 60 + .../core/instances/qmlviewnodeinstance.cpp | 88 + .../core/instances/qmlviewnodeinstance.h | 61 + .../core/instances/widgetnodeinstance.cpp | 154 + .../core/instances/widgetnodeinstance.h | 75 + .../qmldesigner/core/iwidgetplugin.pri | 1 + .../core/metainfo/enumeratormetainfo.cpp | 153 + .../qmldesigner/core/metainfo/gui.metainfo | 184 + .../core/metainfo/itemlibraryinfo.cpp | 208 + .../qmldesigner/core/metainfo/metainfo.cpp | 678 ++ .../core/metainfo/metainfoparser.cpp | 386 + .../core/metainfo/nodemetainfo.cpp | 728 ++ .../core/metainfo/propertymetainfo.cpp | 441 ++ .../core/metainfo/subcomponentmanager.cpp | 442 ++ .../core/model/abstractproperty.cpp | 429 ++ .../qmldesigner/core/model/abstractview.cpp | 354 + .../qmldesigner/core/model/anchorline.cpp | 130 + .../core/model/bindingproperty.cpp | 200 + .../core/model/bytearraymodifier.cpp | 68 + .../core/model/componenttextmodifier.cpp | 127 + .../qmldesigner/core/model/copyhelper.cpp | 89 + .../qmldesigner/core/model/copyhelper.h | 63 + .../qmldesigner/core/model/copypasteutil.cpp | 61 + .../qmldesigner/core/model/copypasteutil.h | 63 + src/plugins/qmldesigner/core/model/import.cpp | 92 + .../core/model/internalbindingproperty.cpp | 77 + .../core/model/internalbindingproperty.h | 65 + .../qmldesigner/core/model/internalnode.cpp | 315 + .../qmldesigner/core/model/internalnode_p.h | 144 + .../model/internalnodeabstractproperty.cpp | 52 + .../core/model/internalnodeabstractproperty.h | 64 + .../core/model/internalnodelistproperty.cpp | 107 + .../core/model/internalnodelistproperty.h | 71 + .../core/model/internalnodeproperty.cpp | 109 + .../core/model/internalnodeproperty.h | 67 + .../core/model/internalproperty.cpp | 175 + .../qmldesigner/core/model/internalproperty.h | 109 + .../core/model/internalvariantproperty.cpp | 77 + .../core/model/internalvariantproperty.h | 64 + src/plugins/qmldesigner/core/model/model.cpp | 918 +++ src/plugins/qmldesigner/core/model/model_p.h | 195 + .../qmldesigner/core/model/modelmerger.cpp | 168 + .../qmldesigner/core/model/modelnode.cpp | 943 +++ .../model/modelnodepositionrecalculator.cpp | 100 + .../model/modelnodepositionrecalculator.h | 71 + .../core/model/modelnodepositionstorage.cpp | 67 + .../qmldesigner/core/model/modelrewriter.cpp | 510 ++ .../qmldesigner/core/model/modelrewriter.h | 125 + .../core/model/modeltotextmerger.cpp | 319 + .../core/model/modeltotextmerger.h | 95 + .../qmldesigner/core/model/modelutilities.cpp | 125 + .../core/model/modificationgrouptoken.cpp | 42 + .../core/model/nodeabstractproperty.cpp | 120 + .../qmldesigner/core/model/nodeanchors.cpp | 373 + .../core/model/nodelistproperty.cpp | 125 + .../qmldesigner/core/model/nodeproperty.cpp | 91 + .../core/model/objectpropertybinding.cpp | 55 + .../core/model/painteventfilter.cpp | 73 + .../core/model/painteventfilter_p.h | 65 + .../qmldesigner/core/model/parsedqml.cpp | 53 + .../qmldesigner/core/model/parsedqml.h | 64 + src/plugins/qmldesigner/core/model/paster.cpp | 307 + src/plugins/qmldesigner/core/model/paster.h | 76 + .../core/model/plaintexteditmodifier.cpp | 186 + .../core/model/propertybinding.cpp | 67 + .../core/model/propertycontainer.cpp | 143 + .../qmldesigner/core/model/propertynode.cpp | 38 + .../qmldesigner/core/model/propertyparser.cpp | 176 + .../qmldesigner/core/model/propertyparser.h | 49 + .../qmldesigner/core/model/qmlanchors.cpp | 411 ++ .../qmldesigner/core/model/qmlchangeset.cpp | 72 + .../qmldesigner/core/model/qmlitemnode.cpp | 330 + .../core/model/qmlmodelnodefacade.cpp | 59 + .../qmldesigner/core/model/qmlmodelview.cpp | 321 + .../qmldesigner/core/model/qmlobjectnode.cpp | 401 + .../qmldesigner/core/model/qmlstate.cpp | 288 + .../core/model/qmltextgenerator.cpp | 178 + .../qmldesigner/core/model/qmltextgenerator.h | 67 + .../qmldesigner/core/model/rewriteaction.cpp | 256 + .../qmldesigner/core/model/rewriteaction.h | 261 + .../core/model/rewriteactioncompressor.cpp | 305 + .../core/model/rewriteactioncompressor.h | 63 + .../qmldesigner/core/model/rewriterview.cpp | 459 ++ .../qmldesigner/core/model/textmodifier.cpp | 36 + .../core/model/texttomodelmerger.cpp | 509 ++ .../core/model/texttomodelmerger.h | 159 + .../qmldesigner/core/model/variantparser.cpp | 149 + .../qmldesigner/core/model/variantparser.h | 65 + .../core/model/variantproperty.cpp | 143 + .../qmldesigner/core/model/viewlogger.cpp | 200 + .../qmldesigner/core/model/viewlogger.h | 85 + .../pluginmanager/widgetpluginmanager.cpp | 103 + .../core/pluginmanager/widgetpluginmanager.h | 76 + .../core/pluginmanager/widgetpluginpath.cpp | 206 + .../core/pluginmanager/widgetpluginpath.h | 102 + .../qmldesigner/core/preview/stylemanager.cpp | 102 + .../qmldesigner/core/rewritertransaction.cpp | 91 + .../qmldesigner/core/rewritertransaction.h | 60 + src/plugins/qmldesigner/designmode.cpp | 287 + src/plugins/qmldesigner/designmode.h | 101 + src/plugins/qmldesigner/designmodewidget.cpp | 675 ++ src/plugins/qmldesigner/designmodewidget.h | 212 + src/plugins/qmldesigner/fxplugin/fx.metainfo | 143 + src/plugins/qmldesigner/fxplugin/fxplugin.cpp | 49 + src/plugins/qmldesigner/fxplugin/fxplugin.h | 58 + src/plugins/qmldesigner/fxplugin/fxplugin.pri | 17 + src/plugins/qmldesigner/fxplugin/fxplugin.pro | 4 + src/plugins/qmldesigner/fxplugin/fxplugin.qrc | 15 + .../fxplugin/images/blended-image-icon.png | Bin 0 -> 340 bytes .../fxplugin/images/default-icon.png | Bin 0 -> 341 bytes .../qmldesigner/fxplugin/images/grid-icon.png | Bin 0 -> 369 bytes .../fxplugin/images/image-icon.png | Bin 0 -> 292 bytes .../qmldesigner/fxplugin/images/item-icon.png | Bin 0 -> 293 bytes .../qmldesigner/fxplugin/images/list-icon.png | Bin 0 -> 424 bytes .../fxplugin/images/mouse-region-icon.png | Bin 0 -> 511 bytes .../qmldesigner/fxplugin/images/rect-icon.png | Bin 0 -> 237 bytes .../fxplugin/images/template_image.png | Bin 0 -> 4652 bytes .../fxplugin/images/text-edit-icon.png | Bin 0 -> 368 bytes .../qmldesigner/fxplugin/images/text-icon.png | Bin 0 -> 582 bytes .../qmldesigner/fxplugin/images/widget.png | Bin 0 -> 716 bytes .../qmldesigner/fxplugin/plugindestdir.pri | 5 + .../qmldesigner/images/mode_Design.png | Bin 0 -> 394 bytes src/plugins/qmldesigner/qmldesigner.pro | 3 + .../qmldesigner/qmldesigner_dependencies.pri | 3 + .../qmldesigner/qmldesignerconstants.h | 58 + src/plugins/qmldesigner/qmldesignerplugin.cpp | 100 + src/plugins/qmldesigner/qmldesignerplugin.h | 68 + src/plugins/qmldesigner/qmldesignerplugin.pro | 29 + src/plugins/qmldesigner/qmldesignerplugin.qrc | 5 + src/plugins/qmleditor/qmleditor.cpp | 1 - src/plugins/qmleditor/qmlhoverhandler.cpp | 10 +- src/plugins/qmleditor/qmllookupcontext.cpp | 2 +- .../qmlprojectmanager/qmlprojectmanager.cpp | 16 + .../qmlprojectmanager/qmltaskmanager.cpp | 2 + .../metatype/QtDeclarativeMetaTypeBackend.cpp | 6 + src/shared/qml/metatype/exception.cpp | 2 +- .../qml/metatype/invalidmetainfoexception.cpp | 2 +- src/shared/qml/metatype/metainfo.cpp | 6 +- src/shared/qml/metatype/nodemetainfo.cpp | 4 +- src/shared/qml/metatype/propertymetainfo.cpp | 4 +- src/shared/qml/qml.pri | 2 +- src/shared/qml/qmlsymbol.cpp | 15 +- src/shared/qml/qmlsymbol.h | 2 + src/tools/qmldesigner/qmldom/main.cpp | 173 + src/tools/qmldesigner/qmldom/qmldom.pro | 21 + .../standalone/128xBauhaus_Logo.png | Bin 0 -> 15545 bytes .../standalone/16xBauhaus_Logo.png | Bin 0 -> 537 bytes .../standalone/256xBauhaus_Logo.png | Bin 0 -> 54353 bytes .../standalone/32xBauhaus_Logo.png | Bin 0 -> 36752 bytes .../standalone/512xBauhaus_Logo.png | Bin 0 -> 154832 bytes .../standalone/64xBauhaus_Logo.png | Bin 0 -> 4512 bytes src/tools/qmldesigner/standalone/Info.plist | 189 + .../qmldesigner/standalone/aboutdialog.cpp | 95 + .../qmldesigner/standalone/aboutdialog.h | 53 + .../qmldesigner/standalone/application.cpp | 43 + .../qmldesigner/standalone/application.h | 40 + .../qmldesigner/standalone/bauhaus-logo.icns | Bin 0 -> 267319 bytes .../qmldesigner/standalone/bauhaus-macos.css | 0 .../standalone/bauhaus-windows.css | 3 + .../qmldesigner/standalone/bauhaus-x11.css | 3 + src/tools/qmldesigner/standalone/bauhaus.css | 28 + src/tools/qmldesigner/standalone/bauhaus.ico | Bin 0 -> 22382 bytes src/tools/qmldesigner/standalone/bauhaus.qrc | 19 + src/tools/qmldesigner/standalone/css.png | Bin 0 -> 4170 bytes src/tools/qmldesigner/standalone/edit.png | Bin 0 -> 3573 bytes src/tools/qmldesigner/standalone/main.cpp | 162 + .../qmldesigner/standalone/mainwindow.cpp | 565 ++ src/tools/qmldesigner/standalone/mainwindow.h | 120 + src/tools/qmldesigner/standalone/preview.png | Bin 0 -> 1681 bytes .../qmldesigner/standalone/standalone.pro | 44 + .../qmldesigner/standalone/templates/fx.qml | 7 + .../standalone/templates/qgraphicsview.qml | 10 + .../standalone/templates/qwidget.qml | 9 + .../standalone/toolbar-cssedit.png | Bin 0 -> 1808 bytes .../qmldesigner/standalone/toolbar-edit.png | Bin 0 -> 1142 bytes .../qmldesigner/standalone/welcomescreen.cpp | 150 + .../qmldesigner/standalone/welcomescreen.h | 77 + tests/auto/auto.pro | 3 +- tests/auto/qml/qml.pro | 3 + .../qmldesigner/bauhaustests/bauhaustests.pro | 18 + .../qmldesigner/bauhaustests/testbauhaus.cpp | 122 + .../qmldesigner/bauhaustests/testbauhaus.h | 51 + .../qml/qmldesigner/common/statichelpers.cpp | 174 + .../qml/qmldesigner/coretests/coretests.pro | 22 + .../qml/qmldesigner/coretests/testcore.cpp | 6485 +++++++++++++++++ .../auto/qml/qmldesigner/coretests/testcore.h | 233 + .../coretests/testrewriterview.cpp | 113 + .../qmldesigner/coretests/testrewriterview.h | 68 + .../qml/qmldesigner/data/fx/attributes.qml | 8 + .../auto/qml/qmldesigner/data/fx/bigtest.qml | 78 + .../qml/qmldesigner/data/fx/components.qml | 26 + tests/auto/qml/qmldesigner/data/fx/empty.qml | 4 + .../qml/qmldesigner/data/fx/helloworld.qml | 76 + tests/auto/qml/qmldesigner/data/fx/image.qml | 10 + .../qml/qmldesigner/data/fx/properties.qml | 5 + .../qml/qmldesigner/data/fx/selectiontest.qml | 39 + tests/auto/qml/qmldesigner/data/fx/states.qml | 59 + .../qmldesigner/data/fx/subitems/SubItem.qml | 14 + .../auto/qml/qmldesigner/data/fx/topitem.qml | 17 + tests/auto/qml/qmldesigner/data/qt-logo.png | Bin 0 -> 23519 bytes .../qml/qmldesigner/data/qwidget/test.qml | 27 + tests/auto/qml/qmldesigner/data/testfiles.qrc | 11 + .../propertyeditortests.pro | 24 + .../testpropertyeditor.cpp | 370 + .../propertyeditortests/testpropertyeditor.h | 57 + tests/auto/qml/qmldesigner/qmldesigner.pro | 5 + tests/auto/qml/qmldesigner/testview.cpp | 213 + tests/auto/qml/qmldesigner/testview.h | 93 + 743 files changed, 102919 insertions(+), 23 deletions(-) create mode 100644 share/qtcreator/qmldesigner/Button.qml create mode 100644 share/qtcreator/qmldesigner/gradient.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/AnchorBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/BorderImageSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/CheckBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ColumnSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Extended.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedSwitches.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/FlickableSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/FlipableSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Geometry.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/GridSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBoxOption.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/HorizontalLine.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ImageSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/IntEditor.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Layout.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ListView.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ListViewSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Modifiers.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ResetPane.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/behaivour.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/blended-image-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/button.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/default-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/downArrow.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/expression.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/extended.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/grid-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/image-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/item-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/layout.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/leftArrow.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/list-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/mouse-region-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/placeholder.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/rect-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/reset-button.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/rightArrow.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/standard.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/submenu.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-edit-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-icon.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/images/upArrow.png create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/layoutWidget.css create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/propertyEditor.css create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/specialCheckBox.css create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/switch.css create mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/typeLabel.css create mode 100644 share/qtcreator/qmldesigner/welcome-card.png create mode 100644 share/qtcreator/qmldesigner/welcomescreen.qml create mode 100644 src/plugins/qmldesigner/QmlDesigner.pluginspec create mode 100644 src/plugins/qmldesigner/application.cpp create mode 100644 src/plugins/qmldesigner/application.h create mode 100644 src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchor.png create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorcontroller.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorhandleitem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorhandleitem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorindicator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlineindicator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchorlineindicator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchormanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchormanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/anchortool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/anchortool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/controlelement.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/controlelement.h create mode 100644 src/plugins/qmldesigner/components/formeditor/dragtool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/dragtool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditor.pri create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditor.qrc create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditoritem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditormainview.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditormainview.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditormainwidget.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditormainwidget.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorscene.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorview.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorview.h create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/formeditorwidget.h create mode 100644 src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/itemcreatortool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/itemutilfunctions.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/itemutilfunctions.h create mode 100644 src/plugins/qmldesigner/components/formeditor/layeritem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/layeritem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/manipulatorlayeritem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/movemanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/movetool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/movetool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/numberseriesaction.h create mode 100644 src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h create mode 100644 src/plugins/qmldesigner/components/formeditor/resize_handle.png create mode 100644 src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/resizecontroller.h create mode 100644 src/plugins/qmldesigner/components/formeditor/resizehandleitem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/resizehandleitem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/resizeindicator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/resizemanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/resizetool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/resizetool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/scaleitem.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/scaleitem.h create mode 100644 src/plugins/qmldesigner/components/formeditor/scalemanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/scalemanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/selectionindicator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/selectionrectangle.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/selectionrectangle.h create mode 100644 src/plugins/qmldesigner/components/formeditor/selectiontool.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/selectiontool.h create mode 100644 src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/snapper.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/snapper.h create mode 100644 src/plugins/qmldesigner/components/formeditor/snapping.png create mode 100644 src/plugins/qmldesigner/components/formeditor/snappinglinecreator.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h create mode 100644 src/plugins/qmldesigner/components/formeditor/toolbox.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/toolbox.h create mode 100644 src/plugins/qmldesigner/components/formeditor/transform.png create mode 100644 src/plugins/qmldesigner/components/formeditor/zoomaction.cpp create mode 100644 src/plugins/qmldesigner/components/formeditor/zoomaction.h create mode 100644 src/plugins/qmldesigner/components/integration/allpropertiesviewcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/allpropertiesviewcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/componentaction.cpp create mode 100644 src/plugins/qmldesigner/components/integration/componentaction.h create mode 100644 src/plugins/qmldesigner/components/integration/componentview.cpp create mode 100644 src/plugins/qmldesigner/components/integration/componentview.h create mode 100644 src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/designdocumentcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp create mode 100644 src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h create mode 100644 src/plugins/qmldesigner/components/integration/documentcloser.cpp create mode 100644 src/plugins/qmldesigner/components/integration/documentcloser.h create mode 100644 src/plugins/qmldesigner/components/integration/integration.pri create mode 100644 src/plugins/qmldesigner/components/integration/integrationcore.cpp create mode 100644 src/plugins/qmldesigner/components/integration/integrationcore.h create mode 100644 src/plugins/qmldesigner/components/integration/multipledocumentscontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/multipledocumentscontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/navigatorcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/navigatorcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/stackedutilitypanelcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/stackedutilitypanelcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/stateseditorcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/stateseditorcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/utilitypanelcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/utilitypanelcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/widgetboxcontroller.cpp create mode 100644 src/plugins/qmldesigner/components/integration/widgetboxcontroller.h create mode 100644 src/plugins/qmldesigner/components/integration/xuifiledialog.cpp create mode 100644 src/plugins/qmldesigner/components/integration/xuifiledialog.h create mode 100644 src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.cpp create mode 100644 src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.h create mode 100644 src/plugins/qmldesigner/components/itemlibrary/default-icon.png create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrary.pri create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrary.ui create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp create mode 100644 src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.h create mode 100644 src/plugins/qmldesigner/components/logger/logger.cpp create mode 100644 src/plugins/qmldesigner/components/logger/logger.h create mode 100644 src/plugins/qmldesigner/components/logger/logger.pri create mode 100644 src/plugins/qmldesigner/components/navigator/navigator.pri create mode 100644 src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp create mode 100644 src/plugins/qmldesigner/components/navigator/navigatortreemodel.h create mode 100644 src/plugins/qmldesigner/components/navigator/navigatorview.cpp create mode 100644 src/plugins/qmldesigner/components/navigator/navigatorview.h create mode 100644 src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp create mode 100644 src/plugins/qmldesigner/components/navigator/navigatorwidget.h create mode 100644 src/plugins/qmldesigner/components/pluginmanager/iplugin.cpp create mode 100644 src/plugins/qmldesigner/components/pluginmanager/iplugin.h create mode 100644 src/plugins/qmldesigner/components/pluginmanager/pluginmanager.cpp create mode 100644 src/plugins/qmldesigner/components/pluginmanager/pluginmanager.h create mode 100644 src/plugins/qmldesigner/components/pluginmanager/pluginmanager.pri create mode 100644 src/plugins/qmldesigner/components/pluginmanager/pluginpath.cpp create mode 100644 src/plugins/qmldesigner/components/pluginmanager/pluginpath.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/allpropertiesbox.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/allpropertiesbox.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/basicwidgets.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/behaviordialog.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/behaviordialog.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/behaviordialog.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/colorwidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/colorwidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/filewidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/filewidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/fontwidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/fontwidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/genericpropertieswidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/genericpropertieswidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradientdialog.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradientdialog.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradientdialog.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradienteditor.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradienteditor.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/gradienteditor.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button2_hovered.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button2_normal.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button2_pressed.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button_hovered.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button_normal.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/button_pressed.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/frame.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/images/gradient.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/layoutwidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/layoutwidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditor.qrc create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qlayoutobject.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qlayoutobject.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qproxylayoutitem.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qproxylayoutitem.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/down.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/edit.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/editdelete.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/minus.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/plus.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/spreadpad.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/spreadreflect.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/spreadrepeat.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/typeconical.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/typelinear.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/typeradial.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/up.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/zoomin.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/images/zoomout.png create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtcolorbutton.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtcolorbutton.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtcolorbutton.pri create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtcolorline.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtcolorline.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientdialog.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientdialog.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientdialog.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradienteditor.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradienteditor.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradienteditor.pri create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradienteditor.qrc create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradienteditor.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientmanager.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientmanager.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopscontroller.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopscontroller.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopsmodel.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopsmodel.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopswidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientstopswidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientutils.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientutils.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientview.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientview.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientview.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientviewdialog.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientviewdialog.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientviewdialog.ui create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientwidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/qtgradienteditor/qtgradientwidget.h create mode 100644 src/plugins/qmldesigner/components/propertyeditor/resetwidget.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/resetwidget.h create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_checked.png create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_checked_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_checked_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_unchecked.png create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_unchecked_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/checkbox_unchecked_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/down_arrow.png create mode 100644 src/plugins/qmldesigner/components/resources/images/down_arrow_disabled.png create mode 100644 src/plugins/qmldesigner/components/resources/images/frame.png create mode 100644 src/plugins/qmldesigner/components/resources/images/pushbutton.png create mode 100644 src/plugins/qmldesigner/components/resources/images/pushbutton_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/pushbutton_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_checked.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_checked_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_checked_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_unchecked.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_unchecked_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/radiobutton_unchecked_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/sizegrip.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spindown.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spindown_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spindown_off.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spindown_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spinup.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spinup_hover.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spinup_off.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spinup_pressed.png create mode 100644 src/plugins/qmldesigner/components/resources/images/up_arrow.png create mode 100644 src/plugins/qmldesigner/components/resources/images/up_arrow_disabled.png create mode 100644 src/plugins/qmldesigner/components/resources/resources.pri create mode 100644 src/plugins/qmldesigner/components/resources/resources.qrc create mode 100644 src/plugins/qmldesigner/components/resources/scrollbar.css create mode 100644 src/plugins/qmldesigner/components/resources/stylesheet.css create mode 100644 src/plugins/qmldesigner/components/resources/templates/Standard/Form.xml create mode 100644 src/plugins/qmldesigner/components/resources/toolbutton.css create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditor.pri create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditor.qrc create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditorview.h create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h create mode 100644 src/plugins/qmldesigner/components/stateseditor/stateslist.qml create mode 100644 src/plugins/qmldesigner/components/themeloader/qts60stylethemeio.cpp create mode 100644 src/plugins/qmldesigner/components/themeloader/qts60stylethemeio.h create mode 100644 src/plugins/qmldesigner/components/themeloader/qts60stylethemeio.pri create mode 100644 src/plugins/qmldesigner/config.pri create mode 100644 src/plugins/qmldesigner/core/core.pri create mode 100644 src/plugins/qmldesigner/core/core.qrc create mode 100644 src/plugins/qmldesigner/core/depend_paths.pri create mode 100644 src/plugins/qmldesigner/core/exceptions/exception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidargumentexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalididexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidmetainfoexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidmodelnodeexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidmodelstateexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidnodeinstanceexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidnodestateexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidpropertyexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidqmlsourceexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidreparentingexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/invalidslideindexexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/modificationgroupexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/noanchoringpossibleexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/notimplementedexception.cpp create mode 100644 src/plugins/qmldesigner/core/exceptions/removebasestateexception.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/addarraymembervisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/addarraymembervisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/addobjectvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/addobjectvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/addpropertyvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/addpropertyvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/astobjecttextextractor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/astobjecttextextractor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/changeimportsvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/changeimportsvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/changeobjecttypevisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/changeobjecttypevisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/changepropertyvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/changepropertyvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/changeset.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/changeset.h create mode 100644 src/plugins/qmldesigner/core/filemanager/filemanager.pri create mode 100644 src/plugins/qmldesigner/core/filemanager/firstdefinitionfinder.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/firstdefinitionfinder.h create mode 100644 src/plugins/qmldesigner/core/filemanager/idcollector.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/idcollector.h create mode 100644 src/plugins/qmldesigner/core/filemanager/indenter.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/indenter.h create mode 100644 src/plugins/qmldesigner/core/filemanager/moveobjectbeforeobjectvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/moveobjectbeforeobjectvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/moveobjectvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/moveobjectvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/parser.pri create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljs.g create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsast.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsast_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsastfwd_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsastvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsastvisitor_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsengine_p.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsengine_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsglobal_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsgrammar.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsgrammar_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljslexer.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljslexer_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsmemorypool_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsnodepool_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsparser.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/parser/qmljsparser_p.h create mode 100644 src/plugins/qmldesigner/core/filemanager/qmldocument.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/qmldocument.h create mode 100644 src/plugins/qmldesigner/core/filemanager/qmleditor_global.h create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlrefactoring.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlrefactoring.h create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlrewriter.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlrewriter.h create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlsymbol.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/qmlsymbol.h create mode 100644 src/plugins/qmldesigner/core/filemanager/removepropertyvisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/removepropertyvisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/removeuiobjectmembervisitor.cpp create mode 100644 src/plugins/qmldesigner/core/filemanager/removeuiobjectmembervisitor.h create mode 100644 src/plugins/qmldesigner/core/filemanager/utils_global.h create mode 100644 src/plugins/qmldesigner/core/include/abstractproperty.h create mode 100644 src/plugins/qmldesigner/core/include/abstractview.h create mode 100644 src/plugins/qmldesigner/core/include/anchorline.h create mode 100644 src/plugins/qmldesigner/core/include/bindingproperty.h create mode 100644 src/plugins/qmldesigner/core/include/bytearraymodifier.h create mode 100644 src/plugins/qmldesigner/core/include/componenttextmodifier.h create mode 100644 src/plugins/qmldesigner/core/include/corelib_global.h create mode 100644 src/plugins/qmldesigner/core/include/customnotifications.h create mode 100644 src/plugins/qmldesigner/core/include/enumeratormetainfo.h create mode 100644 src/plugins/qmldesigner/core/include/exception.h create mode 100644 src/plugins/qmldesigner/core/include/forwardview.h create mode 100644 src/plugins/qmldesigner/core/include/import.h create mode 100644 src/plugins/qmldesigner/core/include/invalidargumentexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalididexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidmetainfoexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidmodelnodeexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidmodelstateexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidnodeinstanceexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidnodestateexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidpropertyexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidqmlsourceexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidreparentingexception.h create mode 100644 src/plugins/qmldesigner/core/include/invalidslideindexexception.h create mode 100644 src/plugins/qmldesigner/core/include/itemlibraryinfo.h create mode 100644 src/plugins/qmldesigner/core/include/iwidgetplugin.h create mode 100644 src/plugins/qmldesigner/core/include/mathutils.h create mode 100644 src/plugins/qmldesigner/core/include/metainfo.h create mode 100644 src/plugins/qmldesigner/core/include/metainfoparser.h create mode 100644 src/plugins/qmldesigner/core/include/model.h create mode 100644 src/plugins/qmldesigner/core/include/modelmerger.h create mode 100644 src/plugins/qmldesigner/core/include/modelnode.h create mode 100644 src/plugins/qmldesigner/core/include/modelnodepositionstorage.h create mode 100644 src/plugins/qmldesigner/core/include/modelutilities.h create mode 100644 src/plugins/qmldesigner/core/include/modificationgroupexception.h create mode 100644 src/plugins/qmldesigner/core/include/modificationgrouptoken.h create mode 100644 src/plugins/qmldesigner/core/include/noanchoringpossibleexception.h create mode 100644 src/plugins/qmldesigner/core/include/nodeabstractproperty.h create mode 100644 src/plugins/qmldesigner/core/include/nodeanchors.h create mode 100644 src/plugins/qmldesigner/core/include/nodeinstance.h create mode 100644 src/plugins/qmldesigner/core/include/nodeinstanceview.h create mode 100644 src/plugins/qmldesigner/core/include/nodelistproperty.h create mode 100644 src/plugins/qmldesigner/core/include/nodemetainfo.h create mode 100644 src/plugins/qmldesigner/core/include/nodeproperty.h create mode 100644 src/plugins/qmldesigner/core/include/notimplementedexception.h create mode 100644 src/plugins/qmldesigner/core/include/objectpropertybinding.h create mode 100644 src/plugins/qmldesigner/core/include/plaintexteditmodifier.h create mode 100644 src/plugins/qmldesigner/core/include/propertybinding.h create mode 100644 src/plugins/qmldesigner/core/include/propertycontainer.h create mode 100644 src/plugins/qmldesigner/core/include/propertymetainfo.h create mode 100644 src/plugins/qmldesigner/core/include/propertynode.h create mode 100644 src/plugins/qmldesigner/core/include/qmlanchors.h create mode 100644 src/plugins/qmldesigner/core/include/qmlchangeset.h create mode 100644 src/plugins/qmldesigner/core/include/qmlitemnode.h create mode 100644 src/plugins/qmldesigner/core/include/qmlmodelnodefacade.h create mode 100644 src/plugins/qmldesigner/core/include/qmlmodelview.h create mode 100644 src/plugins/qmldesigner/core/include/qmlobjectnode.h create mode 100644 src/plugins/qmldesigner/core/include/qmlstate.h create mode 100644 src/plugins/qmldesigner/core/include/removebasestateexception.h create mode 100644 src/plugins/qmldesigner/core/include/replaceallobjectdefinitionsvisitor.h create mode 100644 src/plugins/qmldesigner/core/include/rewriterview.h create mode 100644 src/plugins/qmldesigner/core/include/stylemanager.h create mode 100644 src/plugins/qmldesigner/core/include/subcomponentmanager.h create mode 100644 src/plugins/qmldesigner/core/include/textmodifier.h create mode 100644 src/plugins/qmldesigner/core/include/variantproperty.h create mode 100644 src/plugins/qmldesigner/core/include/widgetplugin_helper.h create mode 100644 src/plugins/qmldesigner/core/include/widgetqueryview.h create mode 100644 src/plugins/qmldesigner/core/instances/componentnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/componentnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/dummynodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/dummynodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/graphicsobjectnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/graphicsobjectnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/graphicsscenenodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/graphicsscenenodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/graphicsviewnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/graphicsviewnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/graphicswidgetnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/graphicswidgetnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/nodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/nodeinstanceview.cpp create mode 100644 src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/objectnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/proxywidgetnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/proxywidgetnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/qmlgraphicsitemnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/qmlgraphicsitemnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/qmlpropertychangesnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/qmlpropertychangesnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/qmlstatenodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/qmlstatenodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/qmltransitionnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/qmltransitionnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/qmlviewnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/qmlviewnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/instances/widgetnodeinstance.cpp create mode 100644 src/plugins/qmldesigner/core/instances/widgetnodeinstance.h create mode 100644 src/plugins/qmldesigner/core/iwidgetplugin.pri create mode 100644 src/plugins/qmldesigner/core/metainfo/enumeratormetainfo.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/gui.metainfo create mode 100644 src/plugins/qmldesigner/core/metainfo/itemlibraryinfo.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/metainfo.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/metainfoparser.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/nodemetainfo.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/propertymetainfo.cpp create mode 100644 src/plugins/qmldesigner/core/metainfo/subcomponentmanager.cpp create mode 100644 src/plugins/qmldesigner/core/model/abstractproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/abstractview.cpp create mode 100644 src/plugins/qmldesigner/core/model/anchorline.cpp create mode 100644 src/plugins/qmldesigner/core/model/bindingproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/bytearraymodifier.cpp create mode 100644 src/plugins/qmldesigner/core/model/componenttextmodifier.cpp create mode 100644 src/plugins/qmldesigner/core/model/copyhelper.cpp create mode 100644 src/plugins/qmldesigner/core/model/copyhelper.h create mode 100644 src/plugins/qmldesigner/core/model/copypasteutil.cpp create mode 100644 src/plugins/qmldesigner/core/model/copypasteutil.h create mode 100644 src/plugins/qmldesigner/core/model/import.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalbindingproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalbindingproperty.h create mode 100644 src/plugins/qmldesigner/core/model/internalnode.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalnode_p.h create mode 100644 src/plugins/qmldesigner/core/model/internalnodeabstractproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalnodeabstractproperty.h create mode 100644 src/plugins/qmldesigner/core/model/internalnodelistproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalnodelistproperty.h create mode 100644 src/plugins/qmldesigner/core/model/internalnodeproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalnodeproperty.h create mode 100644 src/plugins/qmldesigner/core/model/internalproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalproperty.h create mode 100644 src/plugins/qmldesigner/core/model/internalvariantproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/internalvariantproperty.h create mode 100644 src/plugins/qmldesigner/core/model/model.cpp create mode 100644 src/plugins/qmldesigner/core/model/model_p.h create mode 100644 src/plugins/qmldesigner/core/model/modelmerger.cpp create mode 100644 src/plugins/qmldesigner/core/model/modelnode.cpp create mode 100644 src/plugins/qmldesigner/core/model/modelnodepositionrecalculator.cpp create mode 100644 src/plugins/qmldesigner/core/model/modelnodepositionrecalculator.h create mode 100644 src/plugins/qmldesigner/core/model/modelnodepositionstorage.cpp create mode 100644 src/plugins/qmldesigner/core/model/modelrewriter.cpp create mode 100644 src/plugins/qmldesigner/core/model/modelrewriter.h create mode 100644 src/plugins/qmldesigner/core/model/modeltotextmerger.cpp create mode 100644 src/plugins/qmldesigner/core/model/modeltotextmerger.h create mode 100644 src/plugins/qmldesigner/core/model/modelutilities.cpp create mode 100644 src/plugins/qmldesigner/core/model/modificationgrouptoken.cpp create mode 100644 src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/nodeanchors.cpp create mode 100644 src/plugins/qmldesigner/core/model/nodelistproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/nodeproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/objectpropertybinding.cpp create mode 100644 src/plugins/qmldesigner/core/model/painteventfilter.cpp create mode 100644 src/plugins/qmldesigner/core/model/painteventfilter_p.h create mode 100644 src/plugins/qmldesigner/core/model/parsedqml.cpp create mode 100644 src/plugins/qmldesigner/core/model/parsedqml.h create mode 100644 src/plugins/qmldesigner/core/model/paster.cpp create mode 100644 src/plugins/qmldesigner/core/model/paster.h create mode 100644 src/plugins/qmldesigner/core/model/plaintexteditmodifier.cpp create mode 100644 src/plugins/qmldesigner/core/model/propertybinding.cpp create mode 100644 src/plugins/qmldesigner/core/model/propertycontainer.cpp create mode 100644 src/plugins/qmldesigner/core/model/propertynode.cpp create mode 100644 src/plugins/qmldesigner/core/model/propertyparser.cpp create mode 100644 src/plugins/qmldesigner/core/model/propertyparser.h create mode 100644 src/plugins/qmldesigner/core/model/qmlanchors.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlchangeset.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlitemnode.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlmodelnodefacade.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlmodelview.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlobjectnode.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmlstate.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmltextgenerator.cpp create mode 100644 src/plugins/qmldesigner/core/model/qmltextgenerator.h create mode 100644 src/plugins/qmldesigner/core/model/rewriteaction.cpp create mode 100644 src/plugins/qmldesigner/core/model/rewriteaction.h create mode 100644 src/plugins/qmldesigner/core/model/rewriteactioncompressor.cpp create mode 100644 src/plugins/qmldesigner/core/model/rewriteactioncompressor.h create mode 100644 src/plugins/qmldesigner/core/model/rewriterview.cpp create mode 100644 src/plugins/qmldesigner/core/model/textmodifier.cpp create mode 100644 src/plugins/qmldesigner/core/model/texttomodelmerger.cpp create mode 100644 src/plugins/qmldesigner/core/model/texttomodelmerger.h create mode 100644 src/plugins/qmldesigner/core/model/variantparser.cpp create mode 100644 src/plugins/qmldesigner/core/model/variantparser.h create mode 100644 src/plugins/qmldesigner/core/model/variantproperty.cpp create mode 100644 src/plugins/qmldesigner/core/model/viewlogger.cpp create mode 100644 src/plugins/qmldesigner/core/model/viewlogger.h create mode 100644 src/plugins/qmldesigner/core/pluginmanager/widgetpluginmanager.cpp create mode 100644 src/plugins/qmldesigner/core/pluginmanager/widgetpluginmanager.h create mode 100644 src/plugins/qmldesigner/core/pluginmanager/widgetpluginpath.cpp create mode 100644 src/plugins/qmldesigner/core/pluginmanager/widgetpluginpath.h create mode 100644 src/plugins/qmldesigner/core/preview/stylemanager.cpp create mode 100644 src/plugins/qmldesigner/core/rewritertransaction.cpp create mode 100644 src/plugins/qmldesigner/core/rewritertransaction.h create mode 100644 src/plugins/qmldesigner/designmode.cpp create mode 100644 src/plugins/qmldesigner/designmode.h create mode 100644 src/plugins/qmldesigner/designmodewidget.cpp create mode 100644 src/plugins/qmldesigner/designmodewidget.h create mode 100644 src/plugins/qmldesigner/fxplugin/fx.metainfo create mode 100644 src/plugins/qmldesigner/fxplugin/fxplugin.cpp create mode 100644 src/plugins/qmldesigner/fxplugin/fxplugin.h create mode 100644 src/plugins/qmldesigner/fxplugin/fxplugin.pri create mode 100644 src/plugins/qmldesigner/fxplugin/fxplugin.pro create mode 100644 src/plugins/qmldesigner/fxplugin/fxplugin.qrc create mode 100644 src/plugins/qmldesigner/fxplugin/images/blended-image-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/default-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/grid-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/image-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/item-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/list-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/mouse-region-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/rect-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/template_image.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/text-edit-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/text-icon.png create mode 100644 src/plugins/qmldesigner/fxplugin/images/widget.png create mode 100644 src/plugins/qmldesigner/fxplugin/plugindestdir.pri create mode 100644 src/plugins/qmldesigner/images/mode_Design.png create mode 100644 src/plugins/qmldesigner/qmldesigner.pro create mode 100644 src/plugins/qmldesigner/qmldesigner_dependencies.pri create mode 100644 src/plugins/qmldesigner/qmldesignerconstants.h create mode 100644 src/plugins/qmldesigner/qmldesignerplugin.cpp create mode 100644 src/plugins/qmldesigner/qmldesignerplugin.h create mode 100644 src/plugins/qmldesigner/qmldesignerplugin.pro create mode 100644 src/plugins/qmldesigner/qmldesignerplugin.qrc create mode 100644 src/tools/qmldesigner/qmldom/main.cpp create mode 100644 src/tools/qmldesigner/qmldom/qmldom.pro create mode 100644 src/tools/qmldesigner/standalone/128xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/16xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/256xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/32xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/512xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/64xBauhaus_Logo.png create mode 100644 src/tools/qmldesigner/standalone/Info.plist create mode 100644 src/tools/qmldesigner/standalone/aboutdialog.cpp create mode 100644 src/tools/qmldesigner/standalone/aboutdialog.h create mode 100644 src/tools/qmldesigner/standalone/application.cpp create mode 100644 src/tools/qmldesigner/standalone/application.h create mode 100644 src/tools/qmldesigner/standalone/bauhaus-logo.icns create mode 100644 src/tools/qmldesigner/standalone/bauhaus-macos.css create mode 100644 src/tools/qmldesigner/standalone/bauhaus-windows.css create mode 100644 src/tools/qmldesigner/standalone/bauhaus-x11.css create mode 100644 src/tools/qmldesigner/standalone/bauhaus.css create mode 100644 src/tools/qmldesigner/standalone/bauhaus.ico create mode 100644 src/tools/qmldesigner/standalone/bauhaus.qrc create mode 100644 src/tools/qmldesigner/standalone/css.png create mode 100644 src/tools/qmldesigner/standalone/edit.png create mode 100644 src/tools/qmldesigner/standalone/main.cpp create mode 100644 src/tools/qmldesigner/standalone/mainwindow.cpp create mode 100644 src/tools/qmldesigner/standalone/mainwindow.h create mode 100644 src/tools/qmldesigner/standalone/preview.png create mode 100644 src/tools/qmldesigner/standalone/standalone.pro create mode 100644 src/tools/qmldesigner/standalone/templates/fx.qml create mode 100644 src/tools/qmldesigner/standalone/templates/qgraphicsview.qml create mode 100644 src/tools/qmldesigner/standalone/templates/qwidget.qml create mode 100644 src/tools/qmldesigner/standalone/toolbar-cssedit.png create mode 100644 src/tools/qmldesigner/standalone/toolbar-edit.png create mode 100644 src/tools/qmldesigner/standalone/welcomescreen.cpp create mode 100644 src/tools/qmldesigner/standalone/welcomescreen.h create mode 100644 tests/auto/qml/qml.pro create mode 100644 tests/auto/qml/qmldesigner/bauhaustests/bauhaustests.pro create mode 100644 tests/auto/qml/qmldesigner/bauhaustests/testbauhaus.cpp create mode 100644 tests/auto/qml/qmldesigner/bauhaustests/testbauhaus.h create mode 100644 tests/auto/qml/qmldesigner/common/statichelpers.cpp create mode 100644 tests/auto/qml/qmldesigner/coretests/coretests.pro create mode 100644 tests/auto/qml/qmldesigner/coretests/testcore.cpp create mode 100644 tests/auto/qml/qmldesigner/coretests/testcore.h create mode 100644 tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp create mode 100644 tests/auto/qml/qmldesigner/coretests/testrewriterview.h create mode 100644 tests/auto/qml/qmldesigner/data/fx/attributes.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/bigtest.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/components.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/empty.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/helloworld.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/image.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/properties.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/selectiontest.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/states.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/subitems/SubItem.qml create mode 100644 tests/auto/qml/qmldesigner/data/fx/topitem.qml create mode 100644 tests/auto/qml/qmldesigner/data/qt-logo.png create mode 100644 tests/auto/qml/qmldesigner/data/qwidget/test.qml create mode 100644 tests/auto/qml/qmldesigner/data/testfiles.qrc create mode 100644 tests/auto/qml/qmldesigner/propertyeditortests/propertyeditortests.pro create mode 100644 tests/auto/qml/qmldesigner/propertyeditortests/testpropertyeditor.cpp create mode 100644 tests/auto/qml/qmldesigner/propertyeditortests/testpropertyeditor.h create mode 100644 tests/auto/qml/qmldesigner/qmldesigner.pro create mode 100644 tests/auto/qml/qmldesigner/testview.cpp create mode 100644 tests/auto/qml/qmldesigner/testview.h diff --git a/.gitignore b/.gitignore index 85e9a5aca7..15a20a779f 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,6 @@ bin/qtcreator_process_stub* bin/qtcreator.exe share/doc/qtcreator/qtcreator.qch tests/manual/cplusplus/cplusplus0 +tests/auto/qml/qmldesigner/bauhaustests/tst_bauhaus +tests/auto/qml/qmldesigner/coretests/tst_qmldesigner_core +tests/auto/qml/qmldesigner/propertyeditortests/tst_propertyeditor diff --git a/share/qtcreator/qmldesigner/Button.qml b/share/qtcreator/qmldesigner/Button.qml new file mode 100644 index 0000000000..22b2a9c063 --- /dev/null +++ b/share/qtcreator/qmldesigner/Button.qml @@ -0,0 +1,86 @@ +import Qt 4.6 + +Rectangle { + property var label: "Button" + signal clicked + + width: 75 + height: 20 + radius: 10 + color: "grey" + + Rectangle { + anchors.fill: parent; + anchors.leftMargin: 1; + anchors.rightMargin: 1; + anchors.topMargin: 1; + anchors.bottomMargin: 1; + + color: "#2c2c2c"; + radius: 9 + + Rectangle { + id: buttonGradientRectangle + anchors.fill: parent; + anchors.leftMargin: 1; + anchors.rightMargin: 1; + anchors.topMargin: 1; + anchors.bottomMargin: 1; + + color: "black"; + gradient: normalGradient + radius: 8; + + Gradient { + id: pressedGradient + GradientStop { position: 0.0; color: "#686868" } + GradientStop { position: 1.0; color: "#8a8a8a" } + } + + Gradient { + id: normalGradient + GradientStop { position: 0.0; color: "#8a8a8a" } + GradientStop { position: 1.0; color: "#686868" } + } + } + } + + Text { + color: "white" + text: parent.label + style: "Raised"; + anchors.left: parent.left + anchors.top: parent.top + anchors.right: parent.right + anchors.bottom: parent.bottom + horizontalAlignment: "AlignHCenter"; + verticalAlignment: "AlignVCenter"; + } + + MouseRegion { + id: mouseRegion + anchors.fill: parent + onReleased: { parent.clicked.emit(); } + } + + states: [ + State { + name: "released" + when: !mouseRegion.pressed + + PropertyChanges { + target: buttonGradientRectangle + gradient: normalGradient + } + }, + State { + name: "pressed" + when: mouseRegion.pressed + + PropertyChanges { + target: buttonGradientRectangle + gradient: pressedGradient + } + } + ] +} diff --git a/share/qtcreator/qmldesigner/gradient.png b/share/qtcreator/qmldesigner/gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..dd71b4b691e844f7979230a6a8e650d95c363a83 GIT binary patch literal 340205 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%0AJ3SQzy#?6HU5?b=3 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 z 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%0DAEBzKhrxXe%Ry`MuHR4#Zu#7Y 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

Ma;ay({{#Yft^xmy%)GBH*lgvCc|7kBznX1 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Ξ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
B&pS)YXL5D5Zu};a?Ek5 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 180) + RotationDial.value = (backendValue.value - 360); + else + RotationDial.value = backendValue.value; + } + minimum: 0; + maximum: 360; + baseStateFlag: isBaseState; + } + QDial { + id: RotationDial; + wrapping: true; + focusPolicy: "Qt::ClickFocus"; + minimumHeight: 20; + maximumHeight: 50; + minimum: -180; + maximum: 180; + singleStep: 45; + onValueChanged : { + if (value < 0) + RotationSpinBox.backendValue.value = 360 + value; + else + RotationSpinBox.backendValue.value = value; + } + } + } + } + + + + QWidget { + layout: QHBoxLayout { + topMargin: 10; + bottomMargin: 0; + leftMargin: 0; + rightMargin: 0; + DoubleSpinBox { + id: ScaleSpinBox; + objectName: "ScaleSpinBox"; + backendValue: backendValues.scale; + minimumWidth: 60; + minimum: 0.01 + maximum: 10 + singleStep: 0.1 + baseStateFlag: isBaseState; + onBackendValueChanged: { + ScaleSlider.value = backendValue.value * 10; + } + } + QSlider { + id: ScaleSlider; + orientation: "Qt::Horizontal"; + minimum: 1; + maximum: 100; + singleStep: 1; + onValueChanged: { + backendValues.scale.value = value / 10; + } + } + } + } + + QWidget { + layout: QHBoxLayout { + topMargin: 5; + bottomMargin: 5; + leftMargin: 10; + rightMargin: 0; + + QLabel { + text: "Origin: "; + } + QComboBox { + items : { [ + "TopLeft", "Top", "TopRight", "Left", "Center", "Right", "BottomLeft", "Bottom", + "BottomRight" + ] } + + currentText: backendValues.transformOrigin.value; + onItemsChanged: { + currentText = backendValues.transformOrigin.value; + } + onCurrentTextChanged: { + backendValues.transformOrigin.value = currentText; + } + } + + } + } + + QWidget { + layout: QHBoxLayout { + topMargin: 5; + bottomMargin: 10; + leftMargin: 0; + rightMargin: 0; + + DoubleSpinBox { + id: OpacitySpinBox; + backendValue: backendValues.opacity === undefined ? null : backendValues.opacity + minimumWidth: 60; + minimum: 0; + maximum: 1; + singleStep: 0.1 + baseStateFlag: isBaseState; + } + QSlider { + orientation: "Qt::Horizontal"; + minimum: 0 + maximum: 100 + singleStep: 5; + value: backendValues.opacity === undefined ? 0 : (backendValues.opacity.value * 100) + onValueChanged: { + if (backendValues.opacity !== undefined) + backendValues.opacity.value = value / 100; + } + } + } + } + CheckBox { + id: VisibleCheckBox; + text: "item visibilty"; + backendValue: backendValues.visible === undefined ? false : backendValues.visible; + baseStateFlag: isBaseState; + checkable: true; + } + CheckBox { + id: ClipCheckBox; + text: "clipping item"; + backendValue: backendValues.clip === undefined ? false : backendValues.clip; + baseStateFlag: isBaseState; + checkable: true; + } + } + } + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml new file mode 100644 index 0000000000..84e9082fe4 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml @@ -0,0 +1,10 @@ +import Qt 4.6 + +WidgetFrame { + id: PropertyFrame; + + minimumWidth: 300; + //maximumWidth: 300; + styleSheetFile: "propertyEditor.css"; + //visible: isBaseState; +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml new file mode 100644 index 0000000000..a33264ef48 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml @@ -0,0 +1,134 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + + finished: finishedNotify; + caption: "Rect" + + minimumHeight: 340; + maximumHeight: 340; + + layout: QVBoxLayout { + topMargin: 12; + bottomMargin: 20; + leftMargin: 20; + rightMargin: 20; + + QWidget { + layout: QVBoxLayout { + topMargin: 2; + bottomMargin: 20; + leftMargin: 0; + rightMargin: 0; + + QWidget { + layout: QHBoxLayout { + topMargin: 8; + bottomMargin: 20; + leftMargin: 10; + rightMargin: 10; + QLabel { + text: "Radius:" + font.bold: true; + } + SpinBox { + id: RadiusSpinBox; + backendValue: backendValues.radius === undefined ? null : backendValues.radius + minimum: 0; + maximum: 100; + baseStateFlag: isBaseState; + } + QSlider { + orientation: "Qt::Horizontal"; + minimum: 0; + maximum: 100; + singleStep: 1; + value: backendValues.radius === undefined ? null : backendValues.radius.value + onValueChanged: { + backendValues.radius.value = value; + } + } + } + } + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + spacing: 20; + + ColorWidget { + text: "Color:"; + color: backendValues.color === undefined ? null : backendValues.color.value; + onColorChanged: { + backendValues.color.value = strColor; + } + //modelNode: backendValues.color.modelNode; + complexGradientNode: backendValues.color === undefined ? null : backendValues.color.complexNode + + showGradientButton: true; + } + ColorWidget { + text: "Tint color:"; + color: backendValues.tintColor === undefined ? "black" : backendValues.tintColor.value + onColorChanged: { + backendValues.color.value = strColor; + } + } + } + } + HorizontalLine { + } + } + } + QWidget { + minimumHeight: 80; + maximumHeight: 120; + + layout: QHBoxLayout { + topMargin: 2; + topMargin: 0; + bottomMargin: 0; + leftMargin: 0; + rightMargin: 0; + + QWidget { + id: PenGroupBox; + + maximumHeight: 80; + + layout: QVBoxLayout { + topMargin: 10; + bottomMargin: 10; + leftMargin: 20; + rightMargin: 20; + IntEditor { + + id: borderWidth; + backendValue: backendValues.border_width === undefined ? 0 : backendValues.border_width + + caption: "Pen Width:" + baseStateFlag: isBaseState; + + step: 1; + minimumValue: 0; + maximumValue: 100; + } + ColorWidget { + id: PenColor; + text: "Pen Color:"; + minimumHeight: 20; + minimumWidth: 20; + color: backendValues.border_color.value; + onColorChanged: { + backendValues.border_color.value = strColor; + } + } + } + } + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ResetPane.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ResetPane.qml new file mode 100644 index 0000000000..aa164ddda4 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/ResetPane.qml @@ -0,0 +1,41 @@ +import Qt 4.6 +import Bauhaus 1.0 + +QScrollArea { + horizontalScrollBarPolicy: "Qt::ScrollBarAlwaysOff"; + id: ResetPane; + visible: false; + content: ProperyEditorReset; + QFrame { + //minimumHeight: 1800; + id: ProperyEditorReset + layout: QVBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 2; + rightMargin: 2; + + Type { + } + ResetWidget { + id: resetWidget; + //minimumHeight: 2000; + + + height: 500; + width: 200; + backendObject: backendValues; + + QLineEdit { + visible: false; + text: backendValues.id; + onTextChanged: { + resetWidget.resetView(); + } + } + } + + + } + } +} \ No newline at end of file diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml new file mode 100644 index 0000000000..f95f56a101 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml @@ -0,0 +1,29 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + maximumHeight: 200; + + finished: finishedNotify; + caption: "Grid"; + id: GridSpecifics; + + layout: QVBoxLayout { + + topMargin: 18; + bottomMargin: 2; + leftMargin: 8; + rightMargin: 8; + + + IntEditor { + id: spacing; + backendValue: backendValues.spacing; + caption: "Spacing: " + baseStateFlag: isBaseState; + step: 1; + minimumValue: 0; + maximumValue: 2000; + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml new file mode 100644 index 0000000000..19acd3361a --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml @@ -0,0 +1,14 @@ +import Qt 4.6 +import Bauhaus 1.0 + + +QScrollArea { + + property var finished; + + onFinishedChanged: { + setupProperWheelBehaviour(); + } + + +} \ No newline at end of file diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml new file mode 100644 index 0000000000..868236afc1 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml @@ -0,0 +1,72 @@ +import Qt 4.6 +import Bauhaus 1.0 + +QWidget { //This is a special SpinBox that does color coding for states + id: SpinBox; + + property var backendValue; + property var baseStateFlag; + property alias singleStep: box.singleStep; + property alias minimum: box.minimum + property alias maximum: box.maximum + + minimumHeight: 22; + + onBaseStateFlagChanged: { + evaluate(); + } + + onBackendValueChanged: { + evaluate(); + } + + Script { + function evaluate() { + if (baseStateFlag) { + if (backendValue != null && backendValue.isInModel) + SpinBox.setStyleSheet("color: white;"); + else + SpinBox.setStyleSheet("color: gray;"); + } else { + if (backendValue != null && backendValue.isInSubState) + SpinBox.setStyleSheet("color: blue;"); + else + SpinBox.setStyleSheet("color: gray;"); + } + } + } + + layout: QHBoxLayout { + topMargin: 0; + bottomMargin: 0; + leftMargin: 0; + rightMargin: 10; + spacing: 0; + + QSpinBox { + property alias backendValue: SpinBox.backendValue + + keyboardTracking: false; + id: box; + enabled: backendValue === undefined || backendValue.isBound === undefined || backendValue.isBound === null ? false : !backendValue.isBound + value: backendValue == undefined || backendValue.value == undefined || backendValue.value === null ? 0 : backendValue.value; + onValueChanged: { + if (backendValue != undefined && backendValue != null) + backendValue.value = value; + } + onFocusChanged: { + //extendedSwitches.active = focus; + //extendedSwitches.backendValue = backendValue; + } + } + } + + QToolButton { + visible: false; + width: 10; + height: 10; + y: box.y + box.height - 11; + x: box.width - 1; + focusPolicy: "Qt::NoFocus"; + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml new file mode 100644 index 0000000000..84db9bbc25 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml @@ -0,0 +1,85 @@ +import Qt 4.6 + +QFrame { + styleSheetFile: "switch.css"; + property var specialModeIcon; + specialModeIcon: "images/standard.png"; + maximumWidth: 286; + minimumWidth: 286; + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 0; + leftMargin: 4; + rightMargin: 80; + spacing: 0; + + QPushButton { + checkable: true; + checked: true; + id: standardMode; + toolTip: "general item properties"; + iconFromFile: "images/rect-icon.png"; + onClicked: { + extendedMode.checked = false; + layoutMode.checked = false; + specialMode.checked = false; + checked = true; + standardPane.visible = true; + extendedPane.visible = false; + layoutPane.visible = false; + specialPane.visible = false; + } + } + QPushButton { + checkable: true; + checked: false; + id: specialMode; + toolTip: "type specific properties"; + iconFromFile: specialModeIcon; + onClicked: { + extendedMode.checked = false; + standardMode.checked = false; + layoutMode.checked = false; + checked = true; + specialPane.visible = true; + standardPane.visible = false; + extendedPane.visible = false; + layoutPane.visible = false; + } + } + QPushButton { + id: extendedMode; + toolTip: "extended properties"; + checkable: true; + checked: false; + iconFromFile: "images/extended.png"; + onClicked: { + standardMode.checked = false; + layoutMode.checked = false; + specialMode.checked = false; + checked = true; + standardPane.visible = false; + extendedPane.visible = true; + layoutPane.visible = false; + specialPane.visible = false; + } + } + QPushButton { + id: layoutMode; + checkable: true; + checked: false; + toolTip: "layout properties"; + iconFromFile: "images/layout.png"; + onClicked: { + extendedMode.checked = false; + standardMode.checked = false; + specialMode.checked = false; + checked = true; + standardPane.visible = false; + extendedPane.visible = false; + layoutPane.visible = true; + specialPane.visible = false; + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml new file mode 100644 index 0000000000..34fd8168b6 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml @@ -0,0 +1,273 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + maximumHeight: 600; + + finished: finishedNotify; + caption: "Text Edit"; + + layout: QVBoxLayout { + id: textSpecifics; + topMargin: 20; + bottomMargin: 2; + leftMargin: 4; + rightMargin: 4; + QWidget { + layout: QHBoxLayout { + topMargin: 8; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 0; + spacing: 20; + QLabel { + alignment: "AlignTop"; + text: "Text:" + font.bold: true; + } + QTextEdit { + minimumHeight: 80; + property var localText: backendValues.text.value; + onLocalTextChanged: { + if (localText != plainText) + plainText = localText; + } + + onTextChanged: { + backendValues.text.value = plainText; + } + + } + } + } + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + QLabel { + text: "wrap:" + font.bold: true; + } + CheckBox { + text: "isWrapping"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.wrap; + } + } + } + + FontWidget { + text: "Font:"; + + bold: backendValues.font_bold.value; + italic: backendValues.font_italic.value; + family: backendValues.font_family.value; + fontSize: backendValues.font_pointSize.value; + + onDataFontChanged: { + if (bold) + backendValues.font_bold.value = bold; + else + backendValues.font_bold.resetValue(); + + if (italic) + backendValues.font_italic.value = bold; + else + backendValues.font_italic.resetValue(); + + backendValues.font_family.value = family; + backendValues.font_pointSize.value = fontSize; + } + } + + HorizontalLine { + } + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 6; + + } + } + + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 8; + leftMargin: 6; + rightMargin: 6; + QLabel { + text: "Text Format:" + font.bold: true; + } + + QComboBox { + minimumHeight: 22; + items : { ["PlainText", "RichText", "AutoText"] } + currentText: backendValues.textFormat.value; + onItemsChanged: { + currentText = backendValues.textFormat.value; + } + + onCurrentTextChanged: { + if (count == 3) + backendValues.textFormat.value = currentText; + } + } + } + } + + + HorizontalLine { + } + + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 6; + rightMargin: 6; + QLabel { + text: "Horizontal Alignment:" + font.bold: true; + } + + QComboBox { + items : { ["AlignLeft", "AlignRight", "AlignHCenter"] } + currentText: backendValues.horizontalAlignment.value; + onItemsChanged: { + currentText = backendValues.horizontalAlignment.value; + } + + onCurrentTextChanged: { + if (count == 3) + backendValues.horizontalAlignment.value = currentText; + } + } + } + } + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 6; + rightMargin: 6; + QLabel { + text: "Vertical Alignment:" + font.bold: true; + } + + QComboBox { + items : { ["AlignTop", "AlignBottom", "AlignVCenter"] } + currentText: backendValues.verticalAlignment.value; + onItemsChanged: { + currentText = backendValues.verticalAlignment.value; + } + + onCurrentTextChanged: { + if (count == 3) + backendValues.verticalAlignment.value = currentText; + } + } + } + } + + HorizontalLine { + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Color:"; + color: backendValues.color.value; + onColorChanged: { + backendValues.color.value = strColor; + } + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Selection Color:"; + color: backendValues.selectionColor.value; + onColorChanged: { + backendValues.selectionColor.value = strColor; + } + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Selected Text Color:"; + color: backendValues.selectedTextColor.value; + onColorChanged: { + backendValues.selectedTextColor.value = strColor; + } + } + + HorizontalLine { + } + + + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + + CheckBox { + + text: "Read Only"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.readOnly; + } + + CheckBox { + text: "Cursor Visible"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.cursorVisible; + } + } + } + + HorizontalLine { + } + + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + + CheckBox { + text: "Focus On Press"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues. focusOnPress.value; + } + + CheckBox { + text: "Persistent Selection"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.persistentSelection.value; + } + + } + } + + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml new file mode 100644 index 0000000000..82a1cd21fc --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml @@ -0,0 +1,176 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + maximumHeight: 420; + minimumHeight: 420; + + finished: finishedNotify; + caption: "Text Input"; + + layout: QVBoxLayout { + id: textSpecifics; + topMargin: 12; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + QWidget { + layout: QHBoxLayout { + topMargin: 8; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + QLabel { + text: "Text:" + font.bold: true; + } + QLineEdit { + minimumHeight: 24; + text: backendValues.text.value; + onTextChanged: { + backendValues.text.value = text; + } + } + } + } + + FontWidget { + text: "Font:"; + + bold: backendValues.font_bold.value; + italic: backendValues.font_italic.value; + family: backendValues.font_family.value; + fontSize: backendValues.font_pointSize.value; + + onDataFontChanged: { + + if (bold) + backendValues.font_bold.value = bold; + else + backendValues.font_bold.resetValue(); + + if (italic) + backendValues.font_italic.value = bold; + else + backendValues.font_italic.resetValue(); + + backendValues.font_family.value = family; + backendValues.font_pointSize.value = fontSize; + } + } + + HorizontalLine { + } + + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 6; + rightMargin: 6; + QLabel { + text: "Horizontal Alignment:" + font.bold: true; + } + + QComboBox { + items : { ["AlignLeft", "AlignRight", "AlignHCenter"] } + currentText: backendValues.horizontalAlignment.value; + onItemsChanged: { + currentText = backendValues.horizontalAlignment.value; + } + + onCurrentTextChanged: { + if (count == 3) + backendValues.horizontalAlignment.value = currentText; + } + + } + } + } + + HorizontalLine { + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Color:"; + color: backendValues.color.value; + onColorChanged: { + backendValues.color.value = strColor; + } + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Selection Color:"; + color: backendValues.selectionColor.value; + onColorChanged: { + backendValues.selectionColor.value = strColor; + } + } + + ColorWidget { + minimumHeight: 20; + maximumHeight: 20; + text: "Selected Text Color:"; + color: backendValues.selectedTextColor.value; + onColorChanged: { + backendValues.selectedTextColor.value = strColor; + } + } + + HorizontalLine { + } + + + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + + CheckBox { + + text: "Read Only"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.readOnly; + } + + CheckBox { + + text: "Cursor Visible"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues.cursorVisible; + + } + } + } + + HorizontalLine { + } + + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + + CheckBox { + text: "Focus On Press"; + baseStateFlag: isBaseState; + checkable: true; + backendValue: backendValues. focusOnPress; + } + + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml new file mode 100644 index 0000000000..0b0c0cd2ed --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml @@ -0,0 +1,172 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + maximumHeight: 280; + + finished: finishedNotify; + caption: "Text"; + + layout: QVBoxLayout { + id: textSpecifics; + topMargin: 12; + bottomMargin: 2; + leftMargin: 4; + rightMargin: 4; + QWidget { + layout: QHBoxLayout { + topMargin: 8; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + QLabel { + text: "Text:" + font.bold: true; + } + QLineEdit { + minimumHeight: 24; + text: backendValues.text.value; + onTextChanged: { + backendValues.text.value = text; + } + } + } + } + QWidget { + layout: QHBoxLayout { + topMargin: 6; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + QLabel { + text: "wrap:" + font.bold: true; + } + CheckBox { + baseStateFlag: isBaseState; + text: "isWrapping"; + checkable: true; + backendValue: backendValues.wrap; + } + } + } + + FontWidget { + text: "Font:"; + + bold: backendValues.font_bold.value; + italic: backendValues.font_italic.value; + family: backendValues.font_family.value; + fontSize: backendValues.font_pointSize.value; + + onDataFontChanged: { + + if (bold) + backendValues.font_bold.value = bold; + else + backendValues.font_bold.resetValue(); + + if (italic) + backendValues.font_italic.value = bold; + else + backendValues.font_italic.resetValue(); + + backendValues.font_family.value = family; + backendValues.font_pointSize.value = fontSize; + } + } + + HorizontalLine { + } + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 6; + + } + } + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 6; + QLabel { + text: "Horizontal Alignment:" + font.bold: true; + } + + QComboBox { + items : { ["AlignLeft", "AlignRight", "AlignHCenter"] } + currentText: backendValues.horizontalAlignment.value; + onItemsChanged: { + currentText = backendValues.horizontalAlignment.value; + } + + onCurrentTextChanged: { + if (count == 3); + backendValues.horizontalAlignment.value = currentText; + } + + } + } + } + + QWidget { + layout: QHBoxLayout { + topMargin: 4; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 6; + QLabel { + text: "Vertical Alignment:" + font.bold: true; + } + + QComboBox { + items : { ["AlignTop", "AlignBottom", "AlignVCenter"] } + currentText: backendValues.verticalAlignment.value; + onItemsChanged: { + currentText = backendValues.verticalAlignment.value; + } + + onCurrentTextChanged: { + if (count == 3) + backendValues.verticalAlignment.value = currentText; + } + + } + } + } + + HorizontalLine { + } + QWidget { + layout: QHBoxLayout { + topMargin: 2; + bottomMargin: 2; + leftMargin: 10; + rightMargin: 10; + + ColorWidget { + text: "Color:"; + color: backendValues.color.value; + onColorChanged: { + backendValues.color.value = strColor; + } + } + ColorWidget { + text: "Style color:"; + color: backendValues.styleColor.value; + onColorChanged: { + backendValues.styleColor.value = strColor; + } + } + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml new file mode 100644 index 0000000000..aa9b72291d --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml @@ -0,0 +1,94 @@ +import Qt 4.6 + +GroupBox { + id: Type; + finished: finishedNotify; + caption: "Type"; + + maximumHeight: 100; + minimumWidth: 280; + layout: QHBoxLayout { + + topMargin: 2; + bottomMargin: 0; + leftMargin: 10; + rightMargin: 10; + + + + QWidget { + layout: QVBoxLayout { + topMargin: 6; + bottomMargin: 0; + leftMargin: 10; + bottomMargin: 10; + + QLabel { + text: "Type:"; + windowTextColor: isBaseState ? "#000000" : "#FF0000"; + } + + QLabel { + font.bold: true; + text: "Id:"; + } + + QLabel { + text: "state:"; + font.bold: true; + } + + } //QVBoxLayout + } //QWidget + QWidget { + + layout: QVBoxLayout { + topMargin: 6; + bottomMargin: 0; + leftMargin: 10; + bottomMargin: 10; + + QLineEdit { + styleSheetFile: "typeLabel.css" + text: backendValues.className === undefined ? "" : backendValues.className.value; + readOnly :true; + } + + QLineEdit { + id: IdLineEdit; + objectName: "IdLineEdit"; + readOnly: isBaseState != true; + text: backendValues.id === undefined ? "" : backendValues.id.value; + onEditingFinished: { + backendValues.id.value = text; + } + } //LineEdit + + QLineEdit { + visible: isBaseState != true; + textColor: "#ff0000"; + readOnly :true; + text: stateName; + styleSheetFile: "typeLabel.css" + onTextChanged: { + if (!visible) { + IdLineEdit.textColor = "#000000"; + } else { + IdLineEdit.textColor = "#777777"; + } + } + } //LineEdit + + QLineEdit { + visible: isBaseState; + readOnly :true; + text: ""; + styleSheetFile: "typeLabel.css" + } //LineEdit + + } //QVBoxLayout + } //QWidget + + + } //QHBoxLayout +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml new file mode 100644 index 0000000000..925c2bd4f3 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml @@ -0,0 +1,96 @@ +import Qt 4.6 +import Bauhaus 1.0 + +GroupBox { + maximumHeight: 200; + + finished: finishedNotify; + caption: "WebView"; + id: webViewSpecifics; + + layout: QVBoxLayout { + + topMargin: 18; + bottomMargin: 2; + leftMargin: 8; + rightMargin: 8; + QWidget { + layout: QHBoxLayout { + leftMargin: 0; + rightMargin: 0; + QLabel { + minimumHeight: 20; + text: "Url:" + font.bold: true; + } + QLineEdit { + text: backendValues.url.value; + onEditingFinished: { + backendValues.url.value = text; + } + } + } + } + + + + IntEditor { + id: preferredWidth; + backendValue: backendValues.preferredWidth; + caption: "Prefered Width: " + baseStateFlag: isBaseState; + step: 1; + minimumValue: 0; + maximumValue: 2000; + } + + IntEditor { + id: webPageWidth; + backendValue: backendValues.preferredHeight; + caption: "Web Page Height:" + baseStateFlag: isBaseState; + step: 1; + minimumValue: 0; + maximumValue: 2000; + } + + QWidget { + layout: QHBoxLayout { + topMargin: 10; + bottomMargin: 0; + leftMargin: 0; + rightMargin: 0; + spacing: 20; + + QLabel { + minimumHeight: 20; + text: "ZommFactor:" + font.bold: true; + } + DoubleSpinBox { + id: ZoomSpinBox; + objectName: "ZommSpinBox"; + backendValue: backendValues.zoomFactor; + minimumWidth: 60; + minimum: 0.01 + maximum: 10 + singleStep: 0.1 + baseStateFlag: isBaseState; + onBackendValueChanged: { + ZoomSlider.value = backendValue.value * 10; + } + } + QSlider { + id: ZoomSlider; + orientation: "Qt::Horizontal"; + minimum: 1; + maximum: 100; + singleStep: 1; + onValueChanged: { + backendValues.zoomFactor.value = value / 10; + } + } + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css b/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css new file mode 100644 index 0000000000..d93895b1c8 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css @@ -0,0 +1,32 @@ +QPushButton::checked +{ + border: 3px solid #2222aa; + border-radius: 4px; + border-image: none; + background-color: #909090; +} + +QPushButton:pressed +{ + border: 2px solid #000000; +} + +QPushButton:flat { + border: 1px solid #000000; +} + +QPushButton:default { + border-color: 1px solid black; +} + +QPushButton { + border: 2px solid #333333; + color: white; +} + +QFrame{ + border: 2px solid black; + border-radius: 4px; + padding: 2px; + background: #aaabae; + } \ No newline at end of file diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml new file mode 100644 index 0000000000..cb4d9bccb8 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml @@ -0,0 +1,45 @@ +import Qt 4.6 +import Bauhaus 1.0 + +PropertyFrame { + layout: QVBoxLayout { + topMargin: 0; + bottomMargin: 0; + leftMargin: 0; + rightMargin: 0; + spacing: 0; + + Switches { + } + + ScrollArea { + styleSheetFile: ":/qmldesigner/scrollbar.css"; + widgetResizable: true; + content: QFrame { + maximumHeight: 38; + layout: QVBoxLayout { + topMargin: 6; + bottomMargin: 2; + leftMargin: 2; + rightMargin: 2; + QExtGroupBox { + font.bold: true; + maximumHeight: 100; + minimumWidth: 280; + minimumHeight: 32; + layout: QHBoxLayout { + topMargin: 6; + bottomMargin: 2; + QLabel { + minimumHeight: 20; + text: "No Item Selected"; + alignment: "AlignHCenter"; + } + } + } + } + } + } + + } +} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/behaivour.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/behaivour.png new file mode 100644 index 0000000000000000000000000000000000000000..15113bd4d13e85292e1d44c79f1246a54a11d265 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3+9j?LCC){ui6xo&c?uz!xv2~x zrKt+03SNnM3PuKo1`38oRz?O^#s&)7K%PNc+R8mZZR{nUzOL-I7+JYhxH6WnHUbK9 z7I;J!Gca%qfiUBxyLEqnf-LEdzK#qG8~eHcB(gFvFmigjIEGZ*>J73z)$Abh=UaDu zL`26@_X|!Nzj7qKHa&94IHF^2`i3nZxuQ6m*?EbXOi!2 z@VNeU|NU40-Q`3+*93|jEsZ^Fut4(o#>`nZ=NBH-Sj4t~v&liACH>>Bb%iq9bG=t^ zC`t&sPSog{_dGCeT55sbX`!}<20TYrKejlqm?tKJ?R~?ftqH4ABjd#mX+(NYQsD~V zzro-tX;V5cJ#t#S#DYe-#r-j_ceQ=CIp5D_;I&N5HSxCD`Ooj!6!aZDBY291GiE*e z{jYkR=cJO@?eBlPhK82td#qcf)%W;-3CFTbt++)(Z$Cf+z4Qe&@+6H58^(>r56kt$EMnnI@{L>h;W`ec$6a4#rQ@6m8oEmT??C zF-elhE#N1`aU57ZDG+Q^tm}#gR_xO>b%2LqAVwYncv7GcQozC5_q~It>pJ6SS$0t@ z%VH?#`xw8i3n7e2($DkU0dCut@h1fU@aB0o6w?1>CI;{yQJ^FqQ48t2DJY`WA~=gb zXi?X-Y`YLGtbgvSh0MZge%~x)Ye`c|eeF&yCmXydid$g2!L71+)P)YmbDy&|4=j zANYIl(#HR*_fPx3Waq^Hn~p5}zvtxo|7j&rcYR|V!mt|P9BgLPGNJm_`P+y7Z#}u_ z|LOxE%@h7F+}`_t!S-%2UVCu%|K3?m@4TYy+)xYvI*k+PG<6LEB8(Lzj#MK&~{ACvp2Sb@y?U0{zql_ZGjsQ zn;mrQ*wyV={SCr%HnsonUsCgb;^QOVe^jRbPPhSHk+$)>j;{X)(F}3=yse%8J7$;tub-Irzja0lssTsW z{0~fUtwD|jf#ibl`=I!qx25y{gr&9rt9!HmS9WJ&7_fNTr2j?r84rMZq)^fU&=nrt z)0^H^v}OO#t%>_z+>(M}z|1vm|L3oo_Srw)IRPUf0RfY5j8k4tMZ)75OZxuT_U6G2 z=$>2sf6cD>|I3?mp9aLa)C1KrqZj}Z0Afxc7M4>JGYX7%+m)CXcC)-C_f=I}{;R~i z@Y}(O9tRaPC9HvJ#DJI=W(cwi7(uQ8VpbsL0Ae0V1z|}kB@r2@22Q9P$TCKlJ^hhgv-WBa~a zBS3y4AQ30Tx~>Az_r0Mq2mBZ#Ih`w2&jj@&-0AeMNuUDuIr>0d=cXviXRBgj;MQavm>~j(rAI@dH&yYnh*G8I&l_Rmbo4? n3p)|)W3IPWUDqzx?;*ed!{Rpa=`bfP00000NkvXXu0mjfBNC9Q literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/downArrow.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/downArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b92cb987b96dff53705b445144ade2e01770b53e GIT binary patch literal 855 zcmV-d1E~CoP)pF1am@3R0s$N2z&@+hyVZp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10@O)FK~zXft(9#^Q&AYlk2;;rIa{0CMAM~_FPWvH&do|AQfZ+n zQxr7|G|@h2&1qRdAle6s8od}vU!szTASzO`Ec;egMwppIL|RFqDdNnxf9D=`Hk}Y$ zA2^qD?>+bT|3BwE=N<>pAd5ng;XuYG2yqh$iN*4VI64zDcx%b9*{?Xj;_x&OxTg@P zvV`zRC6Lnl<-+C-p##+i#E2|cL0=b$%=$3wtoBDp$r`9Kg^<_*tsFp+D#ZGO5)?E> z!}u^BrU$!FdS?d;uIrF>c@vUO`@<*K719)eO*U2sya3!>1{8{6Y>7eT6D`V{j;|=iL?}n_a!Kiu`gQIO4m|ArB`ul^`L0$uO zaE>~tRU^tMhb(nr9+(5(fRGX?Dj&zuriJNIEL{a1z6`x*4tjpPMt1#X>^&2R#A-FR zRw?1d&BI&`G6%c?TMjE=Y>LOpRz2$4^HFwp8$SJd#~gHjdj*3z6h#e*(ANe-TOo%Z ztq0eD*_B{dUH~zzZ_P0uRJUg1=V%|sC&zH1y&T=&JD5UO-%A{C+=o%i2zvV8BKgz? z1QohN6h7yGH-J+KDwg6V!u!A17Z z9PkGC<-5UfJ_Om9BGB>qDN|b<_g~yVT!n(If>*lGwhnj$lm-DbCMDf%en_tIM|0XSXv|u005}MDpvck$Seqln z#v%zK%VY>G_JA+Fm+f(az?;~p+c;Pe!2IG%Gz6jqdZg){AfkPjbxW1!$J#ygcmwQi hhGiZuf9(DzJ%=P)WdKcYZXh%uN?~pwGB7bPATc&NG&DLjG$1Q5F)%P6w7o$9000McNliru z+5rR*3IHp*VDtb0010qNS#tmY3labT3lag+-G2N4000DMK}|sb0I`n?{9y$E00Eat zL_t(|+HH|bt3gp1hV8vi?w1m_Ff($A3`Hq^fRbNez&}umi83@ZWMpP!U|?XRq$H$} z+kldCQsgdj-p%P;);VA8)%sTNe%JGUi?ZA8yx*l(t93eEx7$sp)3sWyP$)1AgY!4u zp9+V=7K^3d?`ySMgTWw?NNAcq9*+!qLMoTbZ8qEcvm6eG-|ttcRE@oqqtP)2T=#x?ZmoMZHcoo6UGU#)br_*Xs&}!sT)S*W>Y+&1R`o z3fyM1`Ry7E2BC<>Vs5wld_ME}d|X{D7Gb$qEFhrq;Xkohtk>&VmW@WEGMQ{Pn`N`v z{eHh(F5B()YPI@g4TVBZrxTmOV1N~rtyXJ3pGP8*$K&yJEypSp3awTvbg5LTTCIZ5 z>-GA4zEY|5GY0268jZHwE#~}6eY@Q-@X2IC42P2j0s;0}@pv4q$z&>*%lUkska7SB z(d+f_Hpsr)?F0gWMx&`zD);-HbVb1RdW|_84u@PWcRHOwa=Bax*AG|bsXM2L>?{BP N002ovPDHLkV1g}r_7MO8 literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/extended.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/extended.png new file mode 100644 index 0000000000000000000000000000000000000000..82587ae0ecc4d29e2fa6213874d4b32698ccb63f GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1SGw${mubWk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xj(fT|hE&|T6LOpLh=RZ#?r%w~O=mg6o=sO>!f}x6QrE{q zW$8Wf<{!1WXN8uv%{=<%diDQGu|?OkmhS1b?{l6KbfC$(XCiBuS0a1O;jFc-0$j!n zi~^k}EFU+^PKkQ$$$4Nh3xhRlj{vLXtj@sy%Pr1Nb~SvZ&-G%Vwu(;IX%4;v+sXbfBaqj0K?*wmyWp|GX{By!PC{xWt~$(698>GbOZnZ literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/grid-icon.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/grid-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..113e14c00a05aa7e0e13e65ce2b01226dacb6406 GIT binary patch literal 369 zcmV-%0gnEOP)_ja|UbF4zg)O0cvLynv0h=ncGz z-^^x~hk>x!B;*y3o#@P)H!eAsWqJCooNe1&*Zo>#97kte*L~lIVfaGD^E}X%1dO2j zzWy?P8v1V0IX>hZv?L5Ck~vZQF7e z8;Ez51P4yj1Q%f#N)~S+DWE?|G)*HCQ52b>NL;uAFkGQuA7u%-td5hC>@Z>vbrzh@ zUe~q62_ZAoE{==DaV%Nju^D2(3yG?#L?THNGZYCGC%&I7e|wZABsj!w*jAX_`tFZy_m95_z5r-}1oO>MsYCWtk=I_!_zA;ZA2_egRYweLz0?IN1IY)Pm%g$ga7*}Nq@BL9A|S`aIX8&t zD?$E7c<%=hePu&nSI8dmqOYuo(~Gr6?)G8}vFpXx9}z-K9q!f}x6QrE{q zW$8Wf<{!1WXN8uv%{=<%diDQGu|?OkmhS1b?{l6KbfC$(XCiBuS0a1O;jFc-0$j!n zi~^k}EFU+^PKkQ$$$4Nh3xhRlj{vLXtj@sy%Pr1Nb~SvZ&-G%Vwu(;IX%4;v+sXbfBaqj0K?*wmyWp|GX{By!PC{xWt~$(698>GbOZnZ literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/layout.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..113e14c00a05aa7e0e13e65ce2b01226dacb6406 GIT binary patch literal 369 zcmV-%0gnEOP)_ja|UbF4zg)O0cvLynv0h=ncGz z-^^x~hk>x!B;*y3o#@P)H!eAsWqJCooNe1&*Zo>#97kte*L~lIVfaGD^E}X%1dO2j zzWy?P8v1V0IX>hZv?L5Ck~vZQF7e z8;Ez51P4yj1Q%f#N)~S+DWE?|G)*HCQ52b>NL;uAFkGQuA7u%-td5hC>@Z>vbrzh@ zUe~q62_ZAoE{==DaV%Nju^D2(3yG?#L?THNGZYCGC%&I7e|wZABsj!w*jAX_`tFZy_m95_z5r-}1oO>MsYCWtk=I_!_zApF1am@3R0s$N2z&@+hyVZp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10`f^jK~zXfrPX^#Q&AiT@auCnO?stWH5g22o!u0sd8- zh9iuu#0%nU{UP&Y1ZdmiU~^L#L|3i^f2{z#>9vfbvN=PNB_Pb|J>IapD-m?}Q=#Tg z8dUdehLX-i$iEZ|>f>P$ROA7o9j;(^qI?Hk6Sj6Fyxa?Py$WdPS3&KA6u9@c1HMjt zfU52-Px_R}qr2=vVVD}x6YFr7U ztdoMeCB&jR6b9e*0$)?6Nx~GL*#!K+)&bTZ5D{iYh6~sYz;{TsZiGpqshQ*kKS*s1 zgy)|I!C;z#(zbM1n6cH&B{^<{;k@WRK-v8a`3|409AWq%2{mHE@Ilg#h7x9fM>eqK z{ad0=Oc;L+-I6Jx+!?HAZu1UUC-bBGI3v!X8wj6kA)tmbWDDyhs9L5}qqWJpX&zh#`cs%|Y()YbJj^jMfM08#ELzZpZoP>Nq zz=-6I<9wvtZZ|El9*>9QjN7&a<#amju?)!u0uvCE+cb>^xvq=!JH-8dhm!k=FubtH zF`|K6T;Lqc(UVv&H)1`uAT)9q2JETp8XC{@45g$TV+#2O0uyM{b5&KML=Xf4-Wv!p zj~-&*_c6yJW1+CfF%}mW`n(!1vUQ-xUbiq@lw}E76h&(>E2ay5UiR?DD7n|`RfFO< zM*11S{X`gEwr{cisCw;Y3>W-f=$hvwF3)rH&gb){o-#o!=forDBhdwlF3{b2jI^l+g-EQYNP9~En6bdZMzKKBk z4M7?K2>x_BozLgRViBy55pa&jBOF{U%SxqEk|af=(YFw!5o8_?2l{O`n~`$z`TPq6 zGAUxe-}`4a8jZ^3aw3rkL?G)00*05Q9Q4I7OfZ6Ifi5tVCrb$Ps@LltnQsWH#d8Fi zx~}V@DAsB-BmvnXFc;Mx(*=yjP2R1g3zX!C^jlVusL(m$YuQmJGZhHcwW5p@L* zmC8xBJn^YDn@!}Skl}C$N-mf4FD-^F@GwJ=q9}+#N1CQ>w_8uZ!yXAUK@iX&oNP85 zi9|fX4}0W^RVtPHDR>d|$oc8i>h*fR9KTlq1^_E;urd8Sacuwq002ovPDHLkV1h8m B<2L{R literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/placeholder.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..18010a5ee51be87bde66e468f815c9358d667111 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3+9j?LCC){ui6xo&c?uz!xv2~x zrKt+03SNnM3PuKo1`39TRwl+)CPoU{K%T+Uk~JXR>?NMQuI#rMS-EuhFJ9Z<1Qg;d z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCim3JzX3_DsJtaXv@W{DA1a`DMItc z%B2}Qzwd8R-*C}Shjr`53qGQES`VnT>`9V%_WUt#^S9dlv6ufolF4x9_&e{{TE?D@ zL0yK^iun}3+`AvN_1ap~Y+aY+GdCHcTsS;6&srw;ObIHv(ioNfbdGbV7w6B;Uk$Ia z*H2MuVUWJ?;at4$7X}`G4O7=2yZEl?J=k9r?Kz=rjgTS3j3^P6if}E`lc|DEX69YIZL^N80 zIVwc=mQQ8+S%okhJUb4WU#=^QwA56s jdb-EZ?dh+-ED{Xcx@D98J(G(9I*q~8)z4*}Q$iB}?8jRa literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/reset-button.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/reset-button.png new file mode 100644 index 0000000000000000000000000000000000000000..bf53422b9e8db442bfc50c249ca1b0e5fd874871 GIT binary patch literal 741 zcmVOK1~O6o&tqNtiTgGU;Q|NR1UzR|U~paN$C_(H5=fPWNs^LANcXv@5&Njo{Xe zAXq3=1d&oS7{r35(jv4H4c2MXN7`g2P3Aol?+xk1*aK&C@BP1X{(BB12m)kT#!-yM zPlwuiPEGN_;H6-Dw4GrXwp=I`OkMk0%x1?Q@BH>2N25_N{{p7^E)2DI$DiG~{~#&+ z*=5yV5==*fUyQ-*>crgKY<54lJvz3sICBgz(c9O5e)#J9YnQKx)z$AXl?n{YK-IRu z+D@$i7wf>1aadgZuyA{PWoe!Q*m~P79f`!Np^;mnwf+-UMT2cwO=23(-T?+8oo%s1 z_j95V=vfUAhzi$lJbZM9U0DaCC@?ewhGT(o8)6S4|xC{qOlNB|{L$By*51{7rZ{E(l-teF72C3zpj|07Y>=Ris%7t`lLy
    KRNXr^7pF1am@3R0s$N2z&@+hyVZp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10^~_VK~zXfrPXUlQ(+hf@S{#=(`IYBP4cp|@K%zEI;V-1RtfMsLemH7r*>!M;LXPd?;xBCd16})_57%|Mzjven|0=;O zFru#wh4fY(6m=&+#f?-bu*X4i<5tjB$U(`^CBDkz2u+EcksT+LQ1>7cEJOLw^7sHW z4;DaeUnW%E+zqCSaS&A<45}kC@Y<+2z~_YKj>Xr9f@L@hYz`x|KFtNY!wg^NXW;J3 zb5M0V4a%-3fvHmu+VUU}Qu*~cX}R~r91mfn@?H{jJkNr*F#}kKbD;lyH;A>e`kRqU zPa2`@8V|skF7NRI+6{Rp&V#>lm{<941!oo z%L|NH@0+2}u7`acT8QMcK*X7L&%F3!PqT)RtK)U>?#mcVOgrH1l*^mXWAJ*?0jsMk zAlCN=eES4b&X2IdyC>4>9^W} zg>O^bZ*|F)1V)Oxc0$k4S&-J9;VwpuRzCG)?GZ$l$rnb+H@cW%(SQ((V6*@%qi0R zLE5>;J0MLK!Pjx3F69dd7hNTXl#@zGZ&JgqhA@cXV?++)(Z$Cf+z4Qe&@+6H58^(>r56kt$EMnnI@{L>h;W`ec$6a4#rQ@6m8oEmT??C zF-elhE#N1`aU57ZDG+Q^tm}#gR_xO>b%2LqAVwYncv7GcQozC5_q~It>pJ6SS$0t@ z%VH?#`xw8i3n7e2($DkU0dCut@h1fU@aB0o6w?1>CI;{yQJ^FqQ48t2DJY`WA~=gb zXi?X-Y`YLGtbgvSh0MZge%~x)Ye`c|eeF&yCmXydid$g2!L71+WdKxlWgs;mN?~pwGB7bPATcpIGc-CdIUp-AF)%Rb-uUewh?4&8^Lm6(bh^t1x0Tp;_ku0?Snif zGn4niOBly-_I>~QFBpa)pZE~4v4os%S(ZJ|yWMU8!!R^WQXk|3FDlm p3EMo+yRO4SoZkSi^~oPV`~Wyic`D?00DS-e002ovPDHLkV1oWAu$BM- literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-edit-icon.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-edit-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6a064ab07c1fb301161797f48b611106f371fc9c GIT binary patch literal 368 zcmV-$0gwKPP)GS1>}+m59QI~pB~!1Sm4_0!L?EFbrR^nEXi;^q9hu1VK* zK)H;7^bs)(gX1_H#}Pta-+2Fm=lS`hK`+2fMNuY1+qUqC|{8Agr~pZTplpXGNAO(llLFp=lb1wa96jCbD^5 z*NdXqF?g0`hgwLIw4LjMz<8Nv=6Sw@z!;hJkIfUd#}Cz>%abM@2$z_ z^S|C3AD7D|7K^oIk?T;d}9#zN#IXEK?TJSLN=UayZvqi8hBbo*y86>mHqXR}1zScn#nW3^gI z%yc?cS!gsG;KJdsUav=s$z&p~FIr$Ab-&-oP-_+!5U3ak1hDy*N~LDAnNFuA>JCw> z)rP}iDwXp2d{(QqP$;0Q3ZdGHqEIFsQ4`;_;QY|`NF*ZN5edchXwwTsft0Gnodv7- zU`Vx8^w>G<*=*Ksw^^Z5#DeUdg?h9ynM}D{u2!pdyFHOepdW1(7v~CyN~K~j7(5;i zJ5fYjU+#!br^{xu>WP#`L|nOC?%R1)uhqX^v*$PU-OK(To*aI~V)32l_qPB80NSV? U4A;*g`~Uy|07*qoM6N<$f~({b82|tP literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/upArrow.png b/share/qtcreator/qmldesigner/propertyeditor/Qt/images/upArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e689de743eb571040e0bc07bbfe83071796e78a7 GIT binary patch literal 849 zcmV-X1FrmuP)pF1am@3R0s$N2z&@+hyVZp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10?tW9K~zXft(9#^Q&AYlk2;;rIa||hlDegVZz-9ma~jyILWV<` zLsBUvEiEXWb0uYxRv#=-3XC!cDWn&Y3bdjZKUhSWW?&{%ND6(b2y!~Lf9Ia*?CJ#J z`oOvOT<&vz&;NPubMA2iHL}2zxo%{_PKb|0Ol-DE;_gYvk6Vk}9IH6MLJKew_+}BP z^ThBo5XkBCQpS5jsH3(>iufuuG8@BTYKg`6`cOobuYuYmhRg+MrmtI(K z|9vY8uf}0;>@ABrF!CBZ>NIHSY{22m*{lZIf>rQR{8t0P0L@+>7%xWA5zTtua3LH+ zV~!g1e|?3NY9*4Z{GqqdK@|k%i1~dW7@#tWptGpxZqs0Ay$0Lrf-yAO&lJ4-+{2>J zDcE#Gj@9WNdZ9yd#zg>dCu46p(hwHM_0@^} btEtaFzI5;>jRaF%9aB%)Bz`=R6_#F3NNtJ=B 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 literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/welcomescreen.qml b/share/qtcreator/qmldesigner/welcomescreen.qml new file mode 100644 index 0000000000..81a4cc4356 --- /dev/null +++ b/share/qtcreator/qmldesigner/welcomescreen.qml @@ -0,0 +1,147 @@ +import Qt 4.6 + +Image { + id: screen + property var selectedFile + signal openFile + source: "gradient.png" + + width: 1045 + height: 680 + + Image { + source: "welcome-card.png" + + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + transformOrigin: "Center" + smooth: true + scale: 0 + + //Animation + scale: SequentialAnimation { + running: true + NumberAnimation { + to: 1 + duration: 400 + easing: "easeOutCirc" + } + } + Text { + text: "Recent files" + style: "Sunken" + color: "white" + font.pointSize: 14 + x: 70 + y: 160 + } + + Text { + text: "New file" + style: "Sunken" + color: "white" + font.pointSize: 14 + x: 380 + y: 160 + opacity: 0.8 + } + + Item { + id: leftSide + width: 300 + anchors.top: parent.top + anchors.bottom: parent.bottom + + ListView { + id: recentFilesListView + width: 280 + height: 320 + x: 60 + y: 200 + overShoot: false + + model: recentFiles + delegate: fileDelegate + } + } + + Item { + id: rightSide + x: 300 + width: 300 + anchors.top: parent.top + anchors.bottom: parent.bottom + + + + ListView { + id: templatesListView + width: 280 + height: 320 + x: 80 + y: 200 + overShoot: false + + model: templatesList + delegate: fileDelegate + } + } + Button { + id: chooseButton + label: " Choose" + + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.bottomMargin: 13 + anchors.rightMargin: 40 + } + } + + Component { + id: fileDelegate + Item { + width: parent.width + height: fileDelegateText.height + + Text { + id: fileDelegateText + anchors.left: parent.left + color: "white" + text: name + } + + MouseRegion { + anchors.top: fileDelegateText.top + anchors.left: fileDelegateText.left + anchors.right: fileDelegateText.right + anchors.bottom: fileDelegateText.bottom + onClicked: { + screen.selectedFile = fileName; + screen.openFile(); + } + } + } + } +/* + ListModel { + id: recentFiles + ListElement { + fileName: "file1.qml" + } + ListElement { + fileName: "file2.qml" + } + ListElement { + fileName: "file3.qml" + } + } +*/ + + ListModel { + id: templatesList + ListElement { + fileName: ":/qmldesigner/templates/General/Empty Fx" + name: "Fx Rectangle (640x480)" + } + } +} diff --git a/share/qtcreator/static.pro b/share/qtcreator/static.pro index 0256c8ad73..46db15fa93 100644 --- a/share/qtcreator/static.pro +++ b/share/qtcreator/static.pro @@ -28,7 +28,8 @@ DATA_DIRS = \ designer \ schemes \ styles \ - gdbmacros + gdbmacros \ + qmldesigner !isEmpty(copydata) { diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 11060df762..d889f91d21 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -38,7 +38,8 @@ SUBDIRS = plugin_coreplugin \ debugger/dumper.pro contains(QT_CONFIG, declarative) { - SUBDIRS += plugin_qmlinspector + SUBDIRS += plugin_qmlinspector \ + plugin_qmldesigner } plugin_coreplugin.subdir = coreplugin @@ -184,6 +185,10 @@ plugin_qmlprojectmanager.depends += plugin_projectexplorer plugin_qmlprojectmanager.depends += plugin_help plugin_qmlprojectmanager.depends += plugin_qmleditor +plugin_qmldesigner.subdir = qmldesigner +plugin_qmldesigner.depends = plugin_coreplugin +plugin_qmldesigner.depends += plugin_texteditor + plugin_qmlinspector.subdir = qmlinspector plugin_qmlinspector.depends += plugin_projectexplorer plugin_qmlinspector.depends += plugin_coreplugin diff --git a/src/plugins/qmldesigner/QmlDesigner.pluginspec b/src/plugins/qmldesigner/QmlDesigner.pluginspec new file mode 100644 index 0000000000..a7894e6353 --- /dev/null +++ b/src/plugins/qmldesigner/QmlDesigner.pluginspec @@ -0,0 +1,25 @@ + + Nokia Corporation + (C) 2008-2009 Nokia Corporation + +Commercial Usage + +Licensees holding valid Qt Commercial licenses may use this plugin in +accordance with the Qt Commercial License Agreement provided with the +Software or, alternatively, in accordance with the terms contained in +a written agreement between you and Nokia. + +GNU Lesser General Public License Usage + +Alternatively, this plugin may be used under the terms of the GNU Lesser +General Public License version 2.1 as published by the Free Software +Foundation. Please review the following information to +ensure the GNU Lesser General Public License version 2.1 requirements +will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + Editor for QML. + http://qt.nokia.com + + + + + diff --git a/src/plugins/qmldesigner/application.cpp b/src/plugins/qmldesigner/application.cpp new file mode 100644 index 0000000000..223f185c67 --- /dev/null +++ b/src/plugins/qmldesigner/application.cpp @@ -0,0 +1,46 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "application.h" +#include +#include + + +#ifdef Q_OS_MAC +# define SHARE_PATH "/../Resources/qmldesigner" +#else +# define SHARE_PATH "/../share/qtcreator/qmldesigner" +#endif + +QString Application::sharedDirPath() +{ + QString appPath = QCoreApplication::applicationDirPath(); + + return QFileInfo(appPath + SHARE_PATH).absoluteFilePath(); +} diff --git a/src/plugins/qmldesigner/application.h b/src/plugins/qmldesigner/application.h new file mode 100644 index 0000000000..adf7f81001 --- /dev/null +++ b/src/plugins/qmldesigner/application.h @@ -0,0 +1,40 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef APPLICATION_H +#define APPLICATION_H + +#include + +class Application { +public: + static QString sharedDirPath(); +}; + +#endif // APPLICATION_H diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp new file mode 100644 index 0000000000..884ba4c351 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -0,0 +1,190 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "abstractformeditortool.h" +#include "formeditorview.h" +#include "formeditorview.h" + +#include +#include +#include + +namespace QmlDesigner { + +AbstractFormEditorTool::AbstractFormEditorTool(FormEditorView *editorView) : m_view(editorView) +{ +} + + +AbstractFormEditorTool::~AbstractFormEditorTool() +{ + +} + +FormEditorView* AbstractFormEditorTool::view() const +{ + return m_view; +} + +FormEditorScene* AbstractFormEditorTool::scene() const +{ + return view()->scene(); +} + +void AbstractFormEditorTool::setItems(const QList &itemList) +{ + m_itemList = itemList; + selectedItemsChanged(m_itemList); +} + +QList AbstractFormEditorTool::items() const +{ + return m_itemList; +} + +bool AbstractFormEditorTool::topItemIsMovable(const QList & itemList) +{ + QGraphicsItem *firstSelectableItem = topMovableGraphicsItem(itemList); + if (firstSelectableItem == 0) + return false; + + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(firstSelectableItem); + QList selectedNodes = view()->selectedQmlItemNodes(); + + if (formEditorItem != 0 + && selectedNodes.contains(formEditorItem->qmlItemNode())) + return true; + + return false; + +} + +bool AbstractFormEditorTool::topSelectedItemIsMovable(const QList &itemList) +{ + QList selectedNodes = view()->selectedQmlItemNodes(); + + foreach (QGraphicsItem *item, itemList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem + && selectedNodes.contains(formEditorItem->qmlItemNode()) + && !formEditorItem->qmlItemNode().isRootNode() + && (formEditorItem->qmlItemNode().hasShowContent())) + return true; + } + + foreach (QGraphicsItem *item, itemList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem + && !formEditorItem->qmlItemNode().isRootNode() + && selectedNodes.contains(formEditorItem->qmlItemNode())) + return true; + } + + return false; + +} + + +bool AbstractFormEditorTool::topItemIsResizeHandle(const QList &/*itemList*/) +{ + return false; +} + +QGraphicsItem *AbstractFormEditorTool::topMovableGraphicsItem(const QList &itemList) +{ + foreach (QGraphicsItem *item, itemList) { + if (item->flags().testFlag(QGraphicsItem::ItemIsMovable)) + return item; + } + + return 0; +} +FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList &itemList) +{ + foreach (QGraphicsItem *item, itemList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem + && (formEditorItem->qmlItemNode().hasShowContent())) + return formEditorItem; + } + + return 0; +} + +FormEditorItem* AbstractFormEditorTool::topFormEditorItem(const QList & itemList) +{ + foreach (QGraphicsItem *item, itemList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem && !formEditorItem->qmlItemNode().isRootNode()) + return formEditorItem; + } + + return 0; +} + +FormEditorItem* AbstractFormEditorTool::topFormEditorItemWithRootItem(const QList & itemList) +{ + foreach (QGraphicsItem *item, itemList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem) + return formEditorItem; + } + + return 0; +} + +void AbstractFormEditorTool::dropEvent(QGraphicsSceneDragDropEvent * /* event */) +{ + Q_ASSERT(false); +} + +void AbstractFormEditorTool::dragEnterEvent(QGraphicsSceneDragDropEvent * event) +{ + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo") || + event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + event->accept(); + view()->changeToDragTool(); + view()->currentTool()->dragEnterEvent(event); + } else { + event->ignore(); + } +} + +void AbstractFormEditorTool::dragLeaveEvent(QGraphicsSceneDragDropEvent * /* event */) +{ + Q_ASSERT(false); +} + +void AbstractFormEditorTool::dragMoveEvent(QGraphicsSceneDragDropEvent * /* event */) +{ + Q_ASSERT(false); +} + + +} diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h new file mode 100644 index 0000000000..c2e387c696 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h @@ -0,0 +1,103 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ABSTRACTFORMEDITORTOOL_H +#define ABSTRACTFORMEDITORTOOL_H + +#include "formeditoritem.h" + +class QGraphicsItem; + +namespace QmlDesigner { + +class FormEditorView; + +class AbstractFormEditorTool +{ + +public: + AbstractFormEditorTool(FormEditorView* view); + + virtual ~AbstractFormEditorTool(); + + virtual void mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) = 0; + virtual void mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) = 0; + virtual void mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) = 0; + virtual void mouseDoubleClickEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) = 0; + + virtual void hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) = 0; + + virtual void dropEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragEnterEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragMoveEvent(QGraphicsSceneDragDropEvent * event); + + virtual void keyPressEvent(QKeyEvent *event) = 0; + virtual void keyReleaseEvent(QKeyEvent *keyEvent) = 0; + + virtual void itemsAboutToRemoved(const QList &itemList) = 0; + // virtual QVariant itemChange(QList itemList, +// QGraphicsItem::GraphicsItemChange change, +// const QVariant &value ) = 0; +// virtual void update() = 0; + virtual void clear() = 0; + + virtual void formEditorItemsChanged(const QList &itemList) = 0; + + void setItems(const QList &itemList); + QList items() const; + + static QGraphicsItem* topMovableGraphicsItem(const QList &itemList); + static FormEditorItem* topMovableFormEditorItem(const QList &itemList); + bool topItemIsMovable(const QList &itemList); + bool topSelectedItemIsMovable(const QList &itemList); + bool topItemIsResizeHandle(const QList &itemList); + + static FormEditorItem* topFormEditorItem(const QList &itemList); + static FormEditorItem* topFormEditorItemWithRootItem(const QList &itemList); +protected: + + virtual void selectedItemsChanged(const QList &itemList) = 0; + + + FormEditorView *view() const; + FormEditorScene* scene() const; +private: + FormEditorView *m_view; + QList m_itemList; +}; + +} + +#endif // ABSTRACTFORMEDITORTOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchor.png b/src/plugins/qmldesigner/components/formeditor/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..fa59038318e7747072188234147d4d122061a731 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkEN@wuPJ z_icFpdy3(=oLSEp4S5c4(|LWNa85PDjvL`6vESQ*tUND&DcupFv+k44@l87Z0vBIv zDK2u?+ +#include +namespace QmlDesigner { + +AnchorControllerData::AnchorControllerData(LayerItem *layerItem, FormEditorItem *formEditorItem) + : layerItem(layerItem), + formEditorItem(formEditorItem), + topItem(0), + leftItem(0), + rightItem(0), + bottomItem(0) +{ +} + +AnchorControllerData::AnchorControllerData(const AnchorControllerData &other) + : layerItem(other.layerItem), + formEditorItem(other.formEditorItem), + topItem(other.topItem), + leftItem(other.leftItem), + rightItem(other.rightItem), + bottomItem(other.bottomItem) +{ +} + +AnchorControllerData::~AnchorControllerData() +{ + if (layerItem) { + layerItem->scene()->removeItem(topItem); + layerItem->scene()->removeItem(leftItem); + layerItem->scene()->removeItem(rightItem); + layerItem->scene()->removeItem(bottomItem); + } +} + + +AnchorController::AnchorController() + : m_data(new AnchorControllerData(0, 0)) +{ + +} + +AnchorController::AnchorController(const QSharedPointer &data) + : m_data(data) +{ + +} + +AnchorController::AnchorController(LayerItem *layerItem, FormEditorItem *formEditorItem) + : m_data(new AnchorControllerData(layerItem, formEditorItem)) +{ + m_data->topItem = new AnchorHandleItem(layerItem, *this); + m_data->topItem->setZValue(400); + m_data->topItem->setToolTip(m_data->topItem->toolTipString()); + + m_data->leftItem = new AnchorHandleItem(layerItem, *this); + m_data->leftItem->setZValue(400); + m_data->leftItem->setToolTip(m_data->leftItem->toolTipString()); + + m_data->rightItem = new AnchorHandleItem(layerItem, *this); + m_data->rightItem->setZValue(400); + m_data->rightItem->setToolTip(m_data->rightItem->toolTipString()); + + m_data->bottomItem = new AnchorHandleItem(layerItem, *this); + m_data->bottomItem->setZValue(400); + m_data->bottomItem->setToolTip(m_data->bottomItem->toolTipString()); + + m_data->sceneTransform = formEditorItem->sceneTransform(); + + updatePosition(); +} + + +bool AnchorController::isValid() const +{ + return m_data->formEditorItem != 0; +} + +void AnchorController::show() +{ + m_data->topItem->show(); + m_data->leftItem->show(); + m_data->rightItem->show(); + m_data->bottomItem->show(); +} + + + +void AnchorController::hide() +{ + m_data->topItem->hide(); + m_data->leftItem->hide(); + m_data->rightItem->hide(); + m_data->bottomItem->hide(); +} + + +static QPointF topCenter(const QRectF &rect) +{ + return QPointF(rect.center().x(), rect.top()); +} + +static QPointF leftCenter(const QRectF &rect) +{ + return QPointF(rect.left(), rect.center().y()); +} + +static QPointF rightCenter(const QRectF &rect) +{ + return QPointF(rect.right(), rect.center().y()); +} + +static QPointF bottomCenter(const QRectF &rect) +{ + return QPointF(rect.center().x(), rect.bottom()); +} + +static QPainterPath curveToPath(const QPointF &firstPoint, + const QPointF &secondPoint, + const QPointF &thirdPoint, + const QPointF &fourthPoint) +{ + QPainterPath path; + path.moveTo(firstPoint); + path.cubicTo(secondPoint, thirdPoint, fourthPoint); + + return path; +} + +static QPointF anchorPoint(const QRectF &boundingRect, AnchorLine::Type anchorLine, double baseOffset, double innerOffset = 0.0) +{ + switch(anchorLine) { + case AnchorLine::Top : return topCenter(boundingRect) + QPointF(baseOffset, innerOffset); + case AnchorLine::Bottom : return bottomCenter(boundingRect) - QPointF(baseOffset, innerOffset); + case AnchorLine::Left : return leftCenter(boundingRect) + QPointF(innerOffset, baseOffset); + case AnchorLine::Right : return rightCenter(boundingRect) - QPointF(innerOffset, baseOffset); + default: return QPointF(); + } + + return QPointF(); +} + + +static QPainterPath createArrowPath(QPointF arrowCenter, double arrowDegrees) +{ + QRectF arrowRect(0.0, 0.0, 16., 16.); + arrowRect.moveCenter(arrowCenter); + QPainterPath arrowPath; + + + arrowPath.moveTo(arrowCenter); + + arrowPath.arcTo(arrowRect, arrowDegrees + 180 - 20, 40.); + + return arrowPath; +} + +AnchorHandlePathData AnchorController::createPainterPathForAnchor(const QRectF &boundingRect, + AnchorLine::Type anchorLine, + const QPointF &targetPoint) const +{ + + + QPointF firstPointInLayerSpace(m_data->sceneTransform.map(anchorPoint(boundingRect, anchorLine, 0.0, 5.0))); + + QPointF topLeftBoundingBoxInLayerSpace(m_data->sceneTransform.map(boundingRect.topLeft())); + QPointF bottomLeftBoundingBoxInLayerSpace(m_data->sceneTransform.map(boundingRect.bottomLeft())); + QPointF topRightBoundingBoxInLayerSpace(m_data->sceneTransform.map(boundingRect.topRight())); + QPointF bottomRightBoundingBoxInLayerSpace(m_data->sceneTransform.map(boundingRect.bottomRight())); + + AnchorLine::Type secondAnchorLine(AnchorLine::Invalid); + + QPointF secondPointInLayerSpace(targetPoint); + if (targetPoint.isNull()) { + AnchorLine targetAnchorLine(m_data->formEditorItem->qmlItemNode().anchors().instanceAnchor(anchorLine)); + secondAnchorLine = targetAnchorLine.type(); + FormEditorItem *targetItem = m_data->formEditorItem->scene()->itemForQmlItemNode(targetAnchorLine.qmlItemNode());; + bool secondItemIsParent = m_data->formEditorItem->parentItem() == targetItem; + + if (secondItemIsParent) + secondPointInLayerSpace = (targetItem->mapToItem(m_data->layerItem.data(), + anchorPoint(targetItem->qmlItemNode().instanceBoundingRect(), targetAnchorLine.type(), 0.0))); + else + + secondPointInLayerSpace = (targetItem->mapToItem(m_data->layerItem.data(), + anchorPoint(targetItem->qmlItemNode().instanceBoundingRect(), targetAnchorLine.type(), 0.0))); + } + + QPointF firstControlPointInLayerSpace = (3. * firstPointInLayerSpace + 3 * secondPointInLayerSpace) / 6.; + QPointF secondControlPointInLayerSpace = (3 * firstPointInLayerSpace + 3. * secondPointInLayerSpace) / 6.; + + bool showAnchorLine(true); + switch (anchorLine) { + case AnchorLine::Top : + case AnchorLine::Bottom : + firstControlPointInLayerSpace.rx() = firstPointInLayerSpace.x(); + if (qAbs(secondPointInLayerSpace.y() - firstPointInLayerSpace.y()) < 18.0) + showAnchorLine = false; + if (qAbs(secondControlPointInLayerSpace.y() - secondPointInLayerSpace.y()) < 20.0 && + qAbs(secondControlPointInLayerSpace.x() - secondPointInLayerSpace.x()) > 20.0) { + firstControlPointInLayerSpace.ry() = firstPointInLayerSpace.y() + ((firstControlPointInLayerSpace.y() - firstPointInLayerSpace.y() > 0) ? 20 : -20); + } + break; + case AnchorLine::Left : + case AnchorLine::Right : + firstControlPointInLayerSpace.ry() = firstPointInLayerSpace.y(); + if (qAbs(secondPointInLayerSpace.x() - firstPointInLayerSpace.x()) < 18.0) + showAnchorLine = false; + if (qAbs(secondControlPointInLayerSpace.x() - secondPointInLayerSpace.x()) < 20.0 && + qAbs(secondControlPointInLayerSpace.y() - secondPointInLayerSpace.y()) > 20.0) { + firstControlPointInLayerSpace.rx() = firstPointInLayerSpace.x() + ((firstControlPointInLayerSpace.x() - firstPointInLayerSpace.x() > 0) ? 20 : -20); + } + break; + default: break; + } + + switch(secondAnchorLine) { + case AnchorLine::Top : + case AnchorLine::Bottom : + secondControlPointInLayerSpace.rx() = secondPointInLayerSpace.x(); + if (qAbs(secondControlPointInLayerSpace.y() - secondPointInLayerSpace.y()) < 20.0 && + qAbs(secondControlPointInLayerSpace.x() - secondPointInLayerSpace.x()) > 20.0) { + secondControlPointInLayerSpace.ry() = secondPointInLayerSpace.y() + ((secondControlPointInLayerSpace.y() - secondPointInLayerSpace.y() < 0) ? 20 : -20); + } + break; + case AnchorLine::Left : + case AnchorLine::Right : + secondControlPointInLayerSpace.ry() = secondPointInLayerSpace.y(); + if (qAbs(secondControlPointInLayerSpace.x() - secondPointInLayerSpace.x()) < 20.0 && + qAbs(secondControlPointInLayerSpace.y() - secondPointInLayerSpace.y()) > 20.0) { + secondControlPointInLayerSpace.rx() = secondPointInLayerSpace.x() + ((secondControlPointInLayerSpace.x() - secondPointInLayerSpace.x() < 0) ? 20 : -20); + } + break; + default: break; + } + + QPainterPath anchorLinePath; + anchorLinePath.setFillRule(Qt::WindingFill); + + QRectF baseRect(0.0, 0.0, 5., 5.); + baseRect.moveCenter(firstPointInLayerSpace); + QPainterPath basePath; + basePath.addRoundedRect(baseRect, 6., 6.); + anchorLinePath = anchorLinePath.united(basePath); + + QRectF baseLineRect; + switch (anchorLine) { + case AnchorLine::Left : { + baseLineRect = QRectF(topLeftBoundingBoxInLayerSpace, bottomLeftBoundingBoxInLayerSpace); + baseLineRect.setWidth(3); + } + break; + case AnchorLine::Top : { + baseLineRect = QRectF(topLeftBoundingBoxInLayerSpace, topRightBoundingBoxInLayerSpace); + baseLineRect.setHeight(3); + } + break; + case AnchorLine::Right : { + baseLineRect = QRectF(topRightBoundingBoxInLayerSpace, bottomRightBoundingBoxInLayerSpace); + baseLineRect.adjust(-3, 0, 0, 0); + } + break; + case AnchorLine::Bottom : { + baseLineRect = QRectF(bottomLeftBoundingBoxInLayerSpace, bottomRightBoundingBoxInLayerSpace); + baseLineRect.adjust(0, -3, 0, 0); + } + break; + default: break; + } + + if (!baseLineRect.isEmpty()) { + + QPainterPath baseLinePath; + baseLinePath.addRoundedRect(baseLineRect, 1., 1.); + anchorLinePath = anchorLinePath.united(baseLinePath); + } + + QPainterPath arrowPath; + arrowPath.setFillRule(Qt::WindingFill); + + + + if (showAnchorLine) { + QPainterPath curvePath(curveToPath(firstPointInLayerSpace, + firstControlPointInLayerSpace, + secondControlPointInLayerSpace, + secondPointInLayerSpace)); + + double arrowDegrees = curvePath.angleAtPercent(curvePath.percentAtLength(curvePath.length() - 2.5)); + + + + QPainterPathStroker arrowPathStroker; + arrowPathStroker.setWidth(2.0); + arrowPathStroker.setCapStyle(Qt::RoundCap); + + arrowPath = arrowPath.united(arrowPathStroker.createStroke(curvePath)); + + + + + + QRectF arrowCutRect(0.0, 0.0, 8., 8.); + arrowCutRect.moveCenter(secondPointInLayerSpace); + QPainterPath arrowCutPath; + arrowCutPath.addRect(arrowCutRect); + arrowPath = arrowPath.subtracted(arrowCutPath); + + arrowPath = arrowPath.united(createArrowPath(secondPointInLayerSpace, arrowDegrees)); + } + + AnchorHandlePathData pathData; + pathData.arrowPath = arrowPath; + pathData.sourceAnchorLinePath = anchorLinePath; + pathData.beginArrowPoint = firstPointInLayerSpace; + pathData.endArrowPoint = secondPointInLayerSpace; + + pathData.targetAnchorLinePath = createTargetAnchorLinePath(anchorLine); + pathData.targetNamePath = createTargetNamePathPath(anchorLine); + + return pathData; +} + +QPainterPath AnchorController::createTargetNamePathPath(AnchorLine::Type anchorLine) const +{ + QPainterPath path; + QmlAnchors anchors(formEditorItem()->qmlItemNode().anchors()); + if (anchors.instanceHasAnchor(anchorLine)) { + AnchorLine targetAnchorLine(anchors.instanceAnchor(anchorLine)); + + FormEditorItem *targetItem = formEditorItem()->scene()->itemForQmlItemNode(targetAnchorLine.qmlItemNode()); + QRectF boundingRect(targetItem->qmlItemNode().instanceBoundingRect()); + + QTransform sceneTransform(targetItem->qmlItemNode().instanceSceneTransform()); + + QPointF centerBoundingBoxInLayerSpace(sceneTransform.map(boundingRect.center())); + + QFont font; + font.setPixelSize(24); + QString nameString(QString("%1 (%2)").arg(targetAnchorLine.qmlItemNode().simplfiedTypeName()).arg(targetAnchorLine.qmlItemNode().id())); + path.addText(0., -4., font, nameString); + //path.translate(centerBoundingBoxInLayerSpace - path.qmlItemNode().instanceBoundingRect().center()); + + } + + return path; +} + +QPainterPath AnchorController::createTargetAnchorLinePath(AnchorLine::Type anchorLine) const +{ + QPainterPath path; + QmlAnchors anchors(formEditorItem()->qmlItemNode().anchors()); + if (anchors.instanceHasAnchor(anchorLine)) { + AnchorLine targetAnchorLine(anchors.instanceAnchor(anchorLine)); + + FormEditorItem *targetItem = formEditorItem()->scene()->itemForQmlItemNode(targetAnchorLine.qmlItemNode()); + QRectF boundingRect(targetItem->qmlItemNode().instanceBoundingRect()); + + QTransform sceneTransform(targetItem->qmlItemNode().instanceSceneTransform()); + + QPointF topLeftBoundingBoxInLayerSpace(sceneTransform.map(boundingRect.topLeft())); + QPointF bottomLeftBoundingBoxInLayerSpace(sceneTransform.map(boundingRect.bottomLeft())); + QPointF topRightBoundingBoxInLayerSpace(sceneTransform.map(boundingRect.topRight())); + QPointF bottomRightBoundingBoxInLayerSpace(sceneTransform.map(boundingRect.bottomRight())); + + + switch(targetAnchorLine.type()) { + case AnchorLine::Top : { + path.moveTo(topLeftBoundingBoxInLayerSpace); + path.lineTo(topRightBoundingBoxInLayerSpace); + } + break; + case AnchorLine::Bottom : { + path.moveTo(bottomLeftBoundingBoxInLayerSpace); + path.lineTo(bottomRightBoundingBoxInLayerSpace); + } + break; + case AnchorLine::Left : { + path.moveTo(topLeftBoundingBoxInLayerSpace); + path.lineTo(bottomLeftBoundingBoxInLayerSpace); + } + break; + case AnchorLine::Right : { + path.moveTo(topRightBoundingBoxInLayerSpace); + path.lineTo(bottomRightBoundingBoxInLayerSpace); + } + break; + default: break; + } + + QPainterPathStroker pathStroker; + pathStroker.setWidth(20.0); + pathStroker.setCapStyle(Qt::RoundCap); + path = pathStroker.createStroke(path); + + + } + + return path; +} + +void AnchorController::updatePosition() +{ + QRectF boundingRect = m_data->formEditorItem->qmlItemNode().instanceBoundingRect(); + QPointF beginPoint; + QPointF endPoint; + QmlAnchors anchors(m_data->formEditorItem->qmlItemNode().anchors()); + m_data->sceneTransform = m_data->formEditorItem->sceneTransform(); + + if (anchors.instanceHasAnchor(AnchorLine::Top)) + m_data->topItem->setHandlePath(createPainterPathForAnchor(boundingRect, AnchorLine::Top)); + else + m_data->topItem->setHandlePath(AnchorHandlePathData()); + + if (anchors.instanceHasAnchor(AnchorLine::Bottom)) + m_data->bottomItem->setHandlePath(createPainterPathForAnchor(boundingRect, AnchorLine::Bottom)); + else + m_data->bottomItem->setHandlePath(AnchorHandlePathData()); + + if (anchors.instanceHasAnchor(AnchorLine::Right)) + m_data->rightItem->setHandlePath(createPainterPathForAnchor(boundingRect, AnchorLine::Right)); + else + m_data->rightItem->setHandlePath(AnchorHandlePathData()); + + if (anchors.instanceHasAnchor(AnchorLine::Left)) + m_data->leftItem->setHandlePath(createPainterPathForAnchor(boundingRect, AnchorLine::Left)); + else + m_data->leftItem->setHandlePath(AnchorHandlePathData()); +} + + +FormEditorItem* AnchorController::formEditorItem() const +{ + return m_data->formEditorItem; +} + +QWeakPointer AnchorController::weakPointer() const +{ + return m_data; +} + + +bool AnchorController::isTopHandle(const AnchorHandleItem *handle) const +{ + return handle == m_data->topItem; +} + +bool AnchorController::isLeftHandle(const AnchorHandleItem *handle) const +{ + return handle == m_data->leftItem; +} + +bool AnchorController::isRightHandle(const AnchorHandleItem *handle) const +{ + return handle == m_data->rightItem; +} + +bool AnchorController::isBottomHandle(const AnchorHandleItem *handle) const +{ + return handle == m_data->bottomItem; +} + +void AnchorController::updateTargetPoint(AnchorLine::Type anchorLine, const QPointF &targetPoint) +{ + QRectF boundingRect = m_data->formEditorItem->qmlItemNode().instanceBoundingRect(); + + switch(anchorLine) { + case AnchorLine::Top : + m_data->topItem->setHandlePath(createPainterPathForAnchor(boundingRect, anchorLine, targetPoint)); break; + case AnchorLine::Bottom : + m_data->bottomItem->setHandlePath(createPainterPathForAnchor(boundingRect, anchorLine, targetPoint)); break; + case AnchorLine::Left : + m_data->leftItem->setHandlePath(createPainterPathForAnchor(boundingRect, anchorLine, targetPoint)); break; + case AnchorLine::Right : + m_data->rightItem->setHandlePath(createPainterPathForAnchor(boundingRect, anchorLine, targetPoint)); break; + default: break; + } +} + +void AnchorController::highlight(AnchorLine::Type anchorLine) +{ + switch(anchorLine) { + case AnchorLine::Top : + m_data->topItem->setHighlighted(true); break; + case AnchorLine::Bottom : + m_data->bottomItem->setHighlighted(true); break; + case AnchorLine::Left : + m_data->leftItem->setHighlighted(true); break; + case AnchorLine::Right : + m_data->rightItem->setHighlighted(true); break; + default: break; + } +} + +void AnchorController::clearHighlight() +{ + m_data->topItem->setHighlighted(false); + m_data->leftItem->setHighlighted(false); + m_data->rightItem->setHighlighted(false); + m_data->bottomItem->setHighlighted(false); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorcontroller.h b/src/plugins/qmldesigner/components/formeditor/anchorcontroller.h new file mode 100644 index 0000000000..4d693dd4b0 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorcontroller.h @@ -0,0 +1,117 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORCONTROLLER_H +#define ANCHORCONTROLLER_H + +#include +#include +#include +#include +#include + +namespace QmlDesigner { + +struct AnchorHandlePathData +{ + QPainterPath sourceAnchorLinePath; + QPainterPath targetAnchorLinePath; + QPainterPath arrowPath; + QPainterPath targetNamePath; + QPointF beginArrowPoint; + QPointF endArrowPoint; +}; + +class FormEditorItem; +class LayerItem; +class AnchorHandleItem; + +class AnchorControllerData +{ +public: + AnchorControllerData(LayerItem *layerItem, + FormEditorItem *formEditorItem); + AnchorControllerData(const AnchorControllerData &other); + ~AnchorControllerData(); + + QWeakPointer layerItem; + FormEditorItem *formEditorItem; + + AnchorHandleItem *topItem; + AnchorHandleItem *leftItem; + AnchorHandleItem *rightItem; + AnchorHandleItem *bottomItem; + + QTransform sceneTransform; +}; + + +class AnchorController +{ + public: + AnchorController(); + AnchorController(LayerItem *layerItem, FormEditorItem *formEditorItem); + AnchorController(const QSharedPointer &data); + + + void show(); + void hide(); + + void updatePosition(); + + bool isValid() const; + + QWeakPointer weakPointer() const; + + + FormEditorItem *formEditorItem() const; + + bool isTopHandle(const AnchorHandleItem *handle) const; + bool isLeftHandle(const AnchorHandleItem *handle) const; + bool isRightHandle(const AnchorHandleItem *handle) const; + bool isBottomHandle(const AnchorHandleItem *handle) const; + + void updateTargetPoint(AnchorLine::Type anchorLine, const QPointF &targetPoint); + + void clearHighlight(); + void highlight(AnchorLine::Type anchorLine); + +private: //functions + AnchorHandlePathData createPainterPathForAnchor(const QRectF &boundingRect, + AnchorLine::Type anchorLine, + const QPointF &targetPoint = QPointF()) const; + QPainterPath createTargetAnchorLinePath(AnchorLine::Type anchorLine) const; + QPainterPath createTargetNamePathPath(AnchorLine::Type anchorLine) const; +private: + QSharedPointer m_data; +}; + +} // namespace QmlDesigner + +#endif // ANCHORCONTROLLER_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.cpp b/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.cpp new file mode 100644 index 0000000000..95939c6e0f --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.cpp @@ -0,0 +1,212 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchorhandleitem.h" + +#include +#include +#include +#include +#include + +namespace QmlDesigner { + +AnchorHandleItem::AnchorHandleItem(QGraphicsItem *parent, const AnchorController &anchorController) + : QGraphicsItemGroup(parent), + m_anchorControllerData(anchorController.weakPointer()), + m_sourceAnchorLinePathItem(new QGraphicsPathItem(this)), + m_arrowPathItem(new QGraphicsPathItem(this)), + m_targetAnchorLinePathItem(new QGraphicsPathItem(this)), + m_targetNamePathItem(new QGraphicsPathItem(this)) +{ + addToGroup(m_sourceAnchorLinePathItem); + addToGroup(m_arrowPathItem); + addToGroup(m_targetAnchorLinePathItem); + addToGroup(m_targetNamePathItem); + + setFlag(QGraphicsItem::ItemIsMovable, true); +} + +AnchorLine::Type AnchorHandleItem::sourceAnchorLine() const +{ + if (isTopHandle()) + return AnchorLine::Top; + if (isBottomHandle()) + return AnchorLine::Bottom; + if (isLeftHandle()) + return AnchorLine::Left; + if (isRightHandle()) + return AnchorLine::Right; + + return AnchorLine::Invalid; +} + +AnchorLine AnchorHandleItem::targetAnchorLine() const +{ + QmlAnchors anchors(anchorController().formEditorItem()->qmlItemNode().anchors()); + + if (isTopHandle()) + return anchors.instanceAnchor(AnchorLine::Top); + if (isBottomHandle()) + return anchors.instanceAnchor(AnchorLine::Bottom); + if (isLeftHandle()) + return anchors.instanceAnchor(AnchorLine::Left); + if (isRightHandle()) + return anchors.instanceAnchor(AnchorLine::Right); + + return AnchorLine(); +} + +static QString anchorLineToString(AnchorLine::Type anchorLineType) +{ + switch(anchorLineType) { + case AnchorLine::Top: return "Top"; + case AnchorLine::Bottom: return "Bottom"; + case AnchorLine::Left: return "Left"; + case AnchorLine::Right: return "Right"; + default: break; + } + + return QString(); + +} + +QString AnchorHandleItem::toolTipString() const +{ + QString templateString("

    Anchor Handle

    %1

    %2

    "); + QmlItemNode fromNode(anchorController().formEditorItem()->qmlItemNode()); + QString fromString(QString("%3: %1(%2)").arg(fromNode.simplfiedTypeName(), fromNode.id(), anchorLineToString(sourceAnchorLine()))); + + AnchorLine toAnchorLine(targetAnchorLine()); + QmlItemNode toNode(toAnchorLine.qmlItemNode()); + QString toString; + if (toNode.isValid()) + toString = QString("%3: %1(%2)").arg(toNode.simplfiedTypeName(), toNode.id(), anchorLineToString(toAnchorLine.type())); + + return templateString.arg(fromString).arg(toString); +} + +void AnchorHandleItem::setHandlePath(const AnchorHandlePathData &pathData) +{ + m_beginArrowPoint = pathData.beginArrowPoint; + m_endArrowPoint = pathData.endArrowPoint; + m_arrowPathItem->setPath(pathData.arrowPath); + m_sourceAnchorLinePathItem->setPath(pathData.sourceAnchorLinePath); + m_targetAnchorLinePathItem->setPath(pathData.targetAnchorLinePath); + m_targetNamePathItem->setPath(pathData.targetNamePath); + + setHighlighted(false); +} + +AnchorController AnchorHandleItem::anchorController() const +{ + Q_ASSERT(!m_anchorControllerData.isNull()); + return AnchorController(m_anchorControllerData.toStrongRef()); +} + +AnchorHandleItem* AnchorHandleItem::fromGraphicsItem(QGraphicsItem *item) +{ + return qgraphicsitem_cast(item); +} + +bool AnchorHandleItem::isTopHandle() const +{ + return anchorController().isTopHandle(this); +} + +bool AnchorHandleItem::isLeftHandle() const +{ + return anchorController().isLeftHandle(this); +} + +bool AnchorHandleItem::isRightHandle() const +{ + return anchorController().isRightHandle(this); +} + +bool AnchorHandleItem::isBottomHandle() const +{ + return anchorController().isBottomHandle(this); +} + +AnchorLine::Type AnchorHandleItem::anchorType() const +{ + if (isTopHandle()) + return AnchorLine::Top; + + if (isBottomHandle()) + return AnchorLine::Bottom; + + if (isLeftHandle()) + return AnchorLine::Left; + + if (isRightHandle()) + return AnchorLine::Right; + + + return AnchorLine::Invalid; +} + +void AnchorHandleItem::setHighlighted(bool highlight) +{ + QLinearGradient gradient(m_beginArrowPoint, m_endArrowPoint); + gradient.setCoordinateMode(QGradient::LogicalMode); + m_arrowPathItem->setPen(QPen(QBrush(Qt::gray), 1.0, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); + m_targetAnchorLinePathItem->setPen(QColor(70, 0, 0, 90)); + m_targetAnchorLinePathItem->setBrush(QColor(255, 0, 0, 50)); + m_arrowPathItem->setPen(QPen(QBrush(Qt::gray), 1.0, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); + m_targetNamePathItem->setPen(QColor(0, 0, 255, 90)); + m_targetNamePathItem->setBrush(QColor(0, 0, 255, 50)); + + if (highlight) { + gradient.setColorAt(0.0, QColor(0, 0, 120, 255)); + gradient.setColorAt(1.0, QColor(120, 0, 0, 255)); + m_arrowPathItem->setBrush(gradient); + m_sourceAnchorLinePathItem->setPen(QColor(0, 0, 70, 255)); + m_sourceAnchorLinePathItem->setBrush(QColor(0, 0, 70, 255)); + m_targetAnchorLinePathItem->show(); + m_targetNamePathItem->show(); + + } else { + gradient.setColorAt(0.0, QColor(0, 0, 255, 255)); + gradient.setColorAt(1.0, QColor(255, 0, 0, 255)); + m_arrowPathItem->setBrush(gradient); + m_sourceAnchorLinePathItem->setPen(QColor(0, 0, 100, 255)); + m_sourceAnchorLinePathItem->setBrush(QColor(0, 0, 100, 255)); + m_targetAnchorLinePathItem->hide(); + m_targetNamePathItem->hide(); + } +} + +QPointF AnchorHandleItem::itemSpacePosition() const +{ + return parentItem()->mapToItem(anchorController().formEditorItem(), pos()); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.h b/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.h new file mode 100644 index 0000000000..6d6bd057f7 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorhandleitem.h @@ -0,0 +1,91 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORHANDLEITEM_H +#define ANCHORHANDLEITEM_H + +#include + +#include "anchorcontroller.h" + +namespace QmlDesigner { + +class AnchorHandleItem : public QGraphicsItemGroup +{ +public: + enum + { + Type = 0xEAEC + }; + + + AnchorHandleItem(QGraphicsItem *parent, const AnchorController &anchorController); + + void setHandlePath(const AnchorHandlePathData &pathData); + + int type() const; + + AnchorController anchorController() const; + + static AnchorHandleItem* fromGraphicsItem(QGraphicsItem *item); + + + bool isTopHandle() const; + bool isLeftHandle() const; + bool isRightHandle() const; + bool isBottomHandle() const; + + QPointF itemSpacePosition() const; + + AnchorLine::Type anchorType() const; + + QString toolTipString() const; + AnchorLine targetAnchorLine() const; + AnchorLine::Type sourceAnchorLine() const; + + void setHighlighted(bool highlight); + +private: + QWeakPointer m_anchorControllerData; + QGraphicsPathItem *m_sourceAnchorLinePathItem; + QGraphicsPathItem *m_arrowPathItem; + QGraphicsPathItem *m_targetAnchorLinePathItem; + QGraphicsPathItem *m_targetNamePathItem; + QPointF m_beginArrowPoint; + QPointF m_endArrowPoint; +}; + +inline int AnchorHandleItem::type() const +{ + return Type; +} + +} // namespace QmlDesigner + +#endif // ANCHORHANDLEITEM_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp new file mode 100644 index 0000000000..78762c23f7 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp @@ -0,0 +1,116 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchorindicator.h" + +#include + +namespace QmlDesigner { + +AnchorIndicator::AnchorIndicator(LayerItem *layerItem) + : m_layerItem(layerItem) +{ + Q_ASSERT(layerItem); +} + +AnchorIndicator::~AnchorIndicator() +{ + m_itemControllerHash.clear(); +} + +void AnchorIndicator::show() +{ + QHashIterator itemControllerIterator(m_itemControllerHash); + while (itemControllerIterator.hasNext()) { + AnchorController controller = itemControllerIterator.next().value(); + controller.show(); + } +} + + +void AnchorIndicator::hide() +{ + QHashIterator itemControllerIterator(m_itemControllerHash); + while (itemControllerIterator.hasNext()) { + AnchorController controller = itemControllerIterator.next().value(); + controller.hide(); + } +} + +void AnchorIndicator::clear() +{ + m_itemControllerHash.clear(); +} + +void AnchorIndicator::setItems(const QList &itemList) +{ + clear(); + + foreach (FormEditorItem *item, itemList) { + AnchorController controller(m_layerItem, item); + m_itemControllerHash.insert(item, controller); + } + + updateItems(itemList); +} + +void AnchorIndicator::updateItems(const QList &itemList) +{ + foreach (FormEditorItem *item, itemList) { + if (m_itemControllerHash.contains(item)) { + AnchorController controller(m_itemControllerHash.value(item)); + controller.updatePosition(); + } + } +} + +void AnchorIndicator::updateTargetPoint(FormEditorItem *item, AnchorLine::Type anchorLine, const QPointF &targetPoint) +{ + AnchorController controller(m_itemControllerHash.value(item)); + controller.updateTargetPoint(anchorLine, targetPoint); +} + +void AnchorIndicator::clearHighlight() +{ + QHashIterator itemControllerIterator(m_itemControllerHash); + while (itemControllerIterator.hasNext()) { + AnchorController controller = itemControllerIterator.next().value(); + controller.clearHighlight(); + } +} + +void AnchorIndicator::highlight(FormEditorItem *item, AnchorLine::Type anchorLine) +{ + if (m_itemControllerHash.contains(item)) { + AnchorController controller(m_itemControllerHash.value(item)); + controller.highlight(anchorLine); + } +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.h b/src/plugins/qmldesigner/components/formeditor/anchorindicator.h new file mode 100644 index 0000000000..c36ed04be8 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.h @@ -0,0 +1,64 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORINDICATOR_H +#define ANCHORINDICATOR_H + +#include "anchorcontroller.h" +#include +#include + +namespace QmlDesigner { + +class AnchorIndicator +{ +public: + AnchorIndicator(LayerItem *layerItem); + ~AnchorIndicator(); + + void show(); + void hide(); + void clear(); + + void setItems(const QList &itemList); + + void updateItems(const QList &itemList); + void updateTargetPoint(FormEditorItem *item, AnchorLine::Type anchorLine, const QPointF &targetPoint); + + void clearHighlight(); + void highlight(FormEditorItem *item, AnchorLine::Type anchorLine); + +private: + QHash m_itemControllerHash; + LayerItem *m_layerItem; +}; + +} // namespace QmlDesigner + +#endif // ANCHORINDICATOR_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.cpp b/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.cpp new file mode 100644 index 0000000000..6877ad1b0f --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.cpp @@ -0,0 +1,236 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchorlinecontroller.h" + +#include "formeditoritem.h" +#include "layeritem.h" +#include + +#include "anchorlinehandleitem.h" + +namespace QmlDesigner { + + +AnchorLineControllerData::AnchorLineControllerData(LayerItem *layerItem, FormEditorItem *formEditorItem) + : layerItem(layerItem), + formEditorItem(formEditorItem), + topItem(0), + leftItem(0), + rightItem(0), + bottomItem(0) +{ +} + +AnchorLineControllerData::AnchorLineControllerData(const AnchorLineControllerData &other) + : layerItem(other.layerItem), + formEditorItem(other.formEditorItem), + topItem(other.topItem), + leftItem(other.leftItem), + rightItem(other.rightItem), + bottomItem(other.bottomItem) +{} + +AnchorLineControllerData::~AnchorLineControllerData() +{ + if (layerItem) { + layerItem->scene()->removeItem(topItem); + layerItem->scene()->removeItem(leftItem); + layerItem->scene()->removeItem(rightItem); + layerItem->scene()->removeItem(bottomItem); + } +} + + +AnchorLineController::AnchorLineController() + : m_data(new AnchorLineControllerData(0, 0)) +{ + +} + +AnchorLineController::AnchorLineController(const QSharedPointer &data) + : m_data(data) +{ + +} + +AnchorLineController::AnchorLineController(LayerItem *layerItem, FormEditorItem *formEditorItem) + : m_data(new AnchorLineControllerData(layerItem, formEditorItem)) +{ + m_data->topItem = new AnchorLineHandleItem(layerItem, *this); + m_data->topItem->setZValue(300); + + m_data->leftItem = new AnchorLineHandleItem(layerItem, *this); + m_data->leftItem->setZValue(300); + + m_data->rightItem = new AnchorLineHandleItem(layerItem, *this); + m_data->rightItem->setZValue(300); + + m_data->bottomItem = new AnchorLineHandleItem(layerItem, *this); + m_data->bottomItem->setZValue(300); + + updatePosition(); +} + + +bool AnchorLineController::isValid() const +{ + return m_data->formEditorItem != 0; +} + +void AnchorLineController::show(AnchorLine::Type anchorLineMask) +{ + if (anchorLineMask & AnchorLine::Top) + m_data->topItem->show(); + else + m_data->topItem->hide(); + + if (anchorLineMask & AnchorLine::Left) + m_data->leftItem->show(); + else + m_data->leftItem->hide(); + + if (anchorLineMask & AnchorLine::Right) + m_data->rightItem->show(); + else + m_data->rightItem->hide(); + + if (anchorLineMask & AnchorLine::Bottom) + m_data->bottomItem->show(); + else + m_data->bottomItem->hide(); +} + +void AnchorLineController::hide() +{ + m_data->topItem->hide(); + m_data->leftItem->hide(); + m_data->rightItem->hide(); + m_data->bottomItem->hide(); +} + +static QPainterPath rectToPath(const QRectF &rect) +{ + QPainterPath path; + path.addRoundedRect(rect, 4, 4); + + return path; +} + +void AnchorLineController::updatePosition() +{ + QRectF boundingRect = m_data->formEditorItem->qmlItemNode().instanceBoundingRect(); + + QRectF topBoundingRect(boundingRect); + QRectF leftBoundingRect(boundingRect); + QRectF bottomBoundingRect(boundingRect); + QRectF rightBoundingRect(boundingRect); + + + if (formEditorItem()->isContainer()) { + topBoundingRect.setBottom(boundingRect.top() + 6); + topBoundingRect.adjust(7, -5, -7, 0); + + leftBoundingRect.setRight(boundingRect.left() + 6); + leftBoundingRect.adjust(-5, 7, 0, -7); + + bottomBoundingRect.setTop(boundingRect.bottom() - 6); + bottomBoundingRect.adjust(7, 0, -7, 5); + + rightBoundingRect.setLeft(boundingRect.right() - 6); + rightBoundingRect.adjust(0, 7, 5, -7); + + } else { + double height = qMin(boundingRect.height() / 4., 10.); + double width = qMin(boundingRect.width() / 4., 10.); + + topBoundingRect.setHeight(height); + topBoundingRect.adjust(width, -4, -width, -1); + + leftBoundingRect.setWidth(width); + leftBoundingRect.adjust(-4, height, -1, -height); + + bottomBoundingRect.setTop(boundingRect.bottom() - height); + bottomBoundingRect.adjust(width, 1, -width, 4); + + rightBoundingRect.setLeft(boundingRect.right() - width); + rightBoundingRect.adjust(1, height, 4, -height); + } + + m_data->topItem->setHandlePath(m_data->formEditorItem->mapToItem(m_data->layerItem.data(), + rectToPath(topBoundingRect))); + m_data->leftItem->setHandlePath(m_data->formEditorItem->mapToItem(m_data->layerItem.data(), + rectToPath(leftBoundingRect))); + m_data->bottomItem->setHandlePath(m_data->formEditorItem->mapToItem(m_data->layerItem.data(), + rectToPath(bottomBoundingRect))); + m_data->rightItem->setHandlePath(m_data->formEditorItem->mapToItem(m_data->layerItem.data(), + rectToPath(rightBoundingRect))); +} + + +FormEditorItem* AnchorLineController::formEditorItem() const +{ + return m_data->formEditorItem; +} + +QWeakPointer AnchorLineController::weakPointer() const +{ + return m_data; +} + + +bool AnchorLineController::isTopHandle(const AnchorLineHandleItem *handle) const +{ + return handle == m_data->topItem; +} + +bool AnchorLineController::isLeftHandle(const AnchorLineHandleItem *handle) const +{ + return handle == m_data->leftItem; +} + +bool AnchorLineController::isRightHandle(const AnchorLineHandleItem *handle) const +{ + return handle == m_data->rightItem; +} + +bool AnchorLineController::isBottomHandle(const AnchorLineHandleItem *handle) const +{ + return handle == m_data->bottomItem; +} + +void AnchorLineController::clearHighlight() +{ + m_data->topItem->setHiglighted(false); + m_data->leftItem->setHiglighted(false); + m_data->rightItem->setHiglighted(false); + m_data->bottomItem->setHiglighted(false); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.h b/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.h new file mode 100644 index 0000000000..98701705e0 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlinecontroller.h @@ -0,0 +1,93 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORLINECONTROLLER_H +#define ANCHORLINECONTROLLER_H + +#include +#include +#include + +namespace QmlDesigner { + +class FormEditorItem; +class LayerItem; +class AnchorLineHandleItem; + +class AnchorLineControllerData +{ +public: + AnchorLineControllerData(LayerItem *layerItem, + FormEditorItem *formEditorItem); + AnchorLineControllerData(const AnchorLineControllerData &other); + ~AnchorLineControllerData(); + + QWeakPointer layerItem; + FormEditorItem *formEditorItem; + + AnchorLineHandleItem *topItem; + AnchorLineHandleItem *leftItem; + AnchorLineHandleItem *rightItem; + AnchorLineHandleItem *bottomItem; +}; + + +class AnchorLineController +{ + public: + AnchorLineController(); + AnchorLineController(LayerItem *layerItem, FormEditorItem *formEditorItem); + AnchorLineController(const QSharedPointer &data); + + void show(AnchorLine::Type anchorLineMask); + void hide(); + + void updatePosition(); + + bool isValid() const; + + QWeakPointer weakPointer() const; + + + FormEditorItem *formEditorItem() const; + + bool isTopHandle(const AnchorLineHandleItem *handle) const; + bool isLeftHandle(const AnchorLineHandleItem *handle) const; + bool isRightHandle(const AnchorLineHandleItem *handle) const; + bool isBottomHandle(const AnchorLineHandleItem *handle) const; + + void clearHighlight(); + +private: + QSharedPointer m_data; +}; + +} // namespace QmlDesigner + +#endif // ANCHORLINECONTROLLER_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.cpp b/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.cpp new file mode 100644 index 0000000000..e2aa10b67f --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.cpp @@ -0,0 +1,148 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchorlinehandleitem.h" + +#include +#include +#include + +namespace QmlDesigner { + +AnchorLineHandleItem::AnchorLineHandleItem(QGraphicsItem *parent, const AnchorLineController &anchorLineController) + : QGraphicsPathItem(parent), + m_anchorLineControllerData(anchorLineController.weakPointer()) +{ + setFlag(QGraphicsItem::ItemIsMovable, true); + setHiglighted(false); +} + +void AnchorLineHandleItem::setHandlePath(const QPainterPath & path) +{ + setPath(path); + update(); +} + +QRectF AnchorLineHandleItem::boundingRect() const +{ + return QGraphicsPathItem::boundingRect(); +} + +QPainterPath AnchorLineHandleItem::shape() const +{ + return QGraphicsPathItem::shape(); +} + +AnchorLineController AnchorLineHandleItem::anchorLineController() const +{ + Q_ASSERT(!m_anchorLineControllerData.isNull()); + return AnchorLineController(m_anchorLineControllerData.toStrongRef()); +} + +AnchorLine::Type AnchorLineHandleItem::anchorLine() const +{ + if (isTopHandle()) + return AnchorLine::Top; + + if (isLeftHandle()) + return AnchorLine::Left; + + if (isRightHandle()) + return AnchorLine::Right; + + if (isBottomHandle()) + return AnchorLine::Bottom; + + return AnchorLine::Invalid; +} + +AnchorLineHandleItem* AnchorLineHandleItem::fromGraphicsItem(QGraphicsItem *item) +{ + return qgraphicsitem_cast(item); +} + +bool AnchorLineHandleItem::isTopHandle() const +{ + return anchorLineController().isTopHandle(this); +} + +bool AnchorLineHandleItem::isLeftHandle() const +{ + return anchorLineController().isLeftHandle(this); +} + +bool AnchorLineHandleItem::isRightHandle() const +{ + return anchorLineController().isRightHandle(this); +} + +bool AnchorLineHandleItem::isBottomHandle() const +{ + return anchorLineController().isBottomHandle(this); +} + +AnchorLine::Type AnchorLineHandleItem::anchorLineType() const +{ + if (isTopHandle()) + return AnchorLine::Top; + + if (isBottomHandle()) + return AnchorLine::Bottom; + + if (isLeftHandle()) + return AnchorLine::Left; + + if (isRightHandle()) + return AnchorLine::Right; + + + return AnchorLine::Invalid; +} + +QPointF AnchorLineHandleItem::itemSpacePosition() const +{ + return parentItem()->mapToItem(anchorLineController().formEditorItem(), pos()); +} + +void AnchorLineHandleItem::setHiglighted(bool highlight) +{ + if (highlight) { + QPen pen; + pen.setColor(QColor(108, 141, 221)); + setPen(pen); + setBrush(QColor(108, 141, 221, 140)); + } else { + QPen pen; + pen.setColor(QColor(108, 141, 221)); + setPen(pen); + setBrush(QColor(108, 141, 221, 60)); + } +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.h b/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.h new file mode 100644 index 0000000000..b35ec346ac --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlinehandleitem.h @@ -0,0 +1,86 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORLINEHANDLEITEM_H +#define ANCHORLINEHANDLEITEM_H + +#include + +#include "anchorlinecontroller.h" + +namespace QmlDesigner { + +class AnchorLineHandleItem : public QGraphicsPathItem +{ +public: + enum + { + Type = 0xEAEB + }; + + + AnchorLineHandleItem(QGraphicsItem *parent, const AnchorLineController &AnchorLineController); + + void setHandlePath(const QPainterPath & path); + + int type() const; + QRectF boundingRect() const; + QPainterPath shape() const; + + AnchorLineController anchorLineController() const; + AnchorLine::Type anchorLine() const; + + + static AnchorLineHandleItem* fromGraphicsItem(QGraphicsItem *item); + + + bool isTopHandle() const; + bool isLeftHandle() const; + bool isRightHandle() const; + bool isBottomHandle() const; + + QPointF itemSpacePosition() const; + + AnchorLine::Type anchorLineType() const; + + void setHiglighted(bool highlight); + + +private: + QWeakPointer m_anchorLineControllerData; +}; + +inline int AnchorLineHandleItem::type() const +{ + return Type; +} + +} // namespace QmlDesigner + +#endif // ANCHORLINEHANDLEITEM_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.cpp new file mode 100644 index 0000000000..a521faf216 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.cpp @@ -0,0 +1,131 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchorlineindicator.h" + +#include + +namespace QmlDesigner { + +AnchorLineIndicator::AnchorLineIndicator(LayerItem *layerItem) + : m_layerItem(layerItem) +{ + Q_ASSERT(layerItem); +} + +AnchorLineIndicator::~AnchorLineIndicator() +{ + m_itemControllerHash.clear(); +} + +void AnchorLineIndicator::show(AnchorLine::Type anchorLineMask) +{ + QHashIterator itemControllerIterator(m_itemControllerHash); + while (itemControllerIterator.hasNext()) { + AnchorLineController controller = itemControllerIterator.next().value(); + controller.show(anchorLineMask); + } +} + +void AnchorLineIndicator::hide() +{ + QHashIterator itemControllerIterator(m_itemControllerHash); + while (itemControllerIterator.hasNext()) { + AnchorLineController controller = itemControllerIterator.next().value(); + controller.hide(); + } +} + +void AnchorLineIndicator::clear() +{ + m_itemControllerHash.clear(); +} + +void AnchorLineIndicator::setItem(FormEditorItem* item) +{ + if (!item) + return; + + QList itemList; + itemList.append(item); + + setItems(itemList); +} + +static bool equalLists(const QList &firstList, const QList &secondList) +{ + return firstList.toSet() == secondList.toSet(); +} + +void AnchorLineIndicator::setItems(const QList &itemList) +{ + if (equalLists(itemList, m_itemControllerHash.keys())) + return; + + clear(); + + foreach (FormEditorItem *item, itemList) { + AnchorLineController controller(m_layerItem, item); + m_itemControllerHash.insert(item, controller); + } + + show(AnchorLine::AllMask); +} + +void AnchorLineIndicator::updateItems(const QList &itemList) +{ + foreach (FormEditorItem *item, itemList) { + if (m_itemControllerHash.contains(item)) { + AnchorLineController controller(m_itemControllerHash.value(item)); + controller.updatePosition(); + } + } +} + +void AnchorLineIndicator::update() +{ + foreach (FormEditorItem *item, m_itemControllerHash.keys()) { + if (m_itemControllerHash.contains(item)) { + AnchorLineController controller(m_itemControllerHash.value(item)); + controller.updatePosition(); + } + } +} + +void AnchorLineIndicator::clearHighlight() +{ + foreach (FormEditorItem *item, m_itemControllerHash.keys()) { + if (m_itemControllerHash.contains(item)) { + AnchorLineController controller(m_itemControllerHash.value(item)); + controller.clearHighlight(); + } + } +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.h b/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.h new file mode 100644 index 0000000000..2a4c9966fc --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchorlineindicator.h @@ -0,0 +1,69 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORLINEINDICATOR_H +#define ANCHORLINEINDICATOR_H + +#include "layeritem.h" +#include "anchorlinecontroller.h" +#include + +namespace QmlDesigner { + +class FormEditorItem; + +class AnchorLineIndicator +{ +public: + AnchorLineIndicator(LayerItem *layerItem); + ~AnchorLineIndicator(); + + void show(AnchorLine::Type anchorLineMask); + + void hide(); + + void clear(); + + void update(); + + void setItems(const QList &itemList); + void setItem(FormEditorItem* item); + void updateItems(const QList &itemList); + + void clearHighlight(); + +private: + QHash m_itemControllerHash; + + LayerItem *m_layerItem; +}; + +} // namespace QmlDesigner + +#endif // ANCHORLINEINDICATOR_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchormanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/anchormanipulator.cpp new file mode 100644 index 0000000000..1468ae1e5f --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchormanipulator.cpp @@ -0,0 +1,144 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchormanipulator.h" + +#include "formeditoritem.h" +#include "formeditorscene.h" +#include "formeditorview.h" +#include +#include + +namespace QmlDesigner { + +AnchorManipulator::AnchorManipulator(FormEditorView *view) + : m_beginFormEditorItem(0), + m_beginAnchorLine(AnchorLine::Invalid), + m_view(view) +{ +} + +AnchorManipulator::~AnchorManipulator() +{ + clear(); +} + +void AnchorManipulator::begin(FormEditorItem *beginItem, AnchorLine::Type anchorLine) +{ + m_beginFormEditorItem = beginItem; + m_beginAnchorLine = anchorLine; +} + +static double offset(const QPointF &topLeft, const QPointF &bottomRight, AnchorLine::Type anchorLine) +{ + switch(anchorLine) { + case AnchorLine::Top : return topLeft.y(); + case AnchorLine::Left : return topLeft.x(); + case AnchorLine::Bottom : return bottomRight.y(); + case AnchorLine::Right : return bottomRight.x(); + default: break; + } + + return 0.0; +} + +void AnchorManipulator::setMargin(FormEditorItem *endItem, AnchorLine::Type endAnchorLine) +{ + QPointF beginItemTopLeft(m_beginFormEditorItem->mapToParent(m_beginFormEditorItem->qmlItemNode().instanceBoundingRect().topLeft())); + QPointF endItemTopLeft(m_beginFormEditorItem->parentItem()->mapFromItem(endItem, endItem->qmlItemNode().instanceBoundingRect().topLeft())); + + QPointF beginItemBottomRight(m_beginFormEditorItem->mapToParent(m_beginFormEditorItem->qmlItemNode().instanceBoundingRect().bottomRight())); + QPointF endItemBottomRight(m_beginFormEditorItem->parentItem()->mapFromItem(endItem, endItem->qmlItemNode().instanceBoundingRect().bottomRight())); + + QPointF topLeftAnchorOffset = beginItemTopLeft - endItemTopLeft; + QPointF bottomRightAnchorOffset = endItemBottomRight - beginItemBottomRight; + + + double anchorOffset = 0.0; + if (m_beginAnchorLine & (AnchorLine::Bottom | AnchorLine::Right)) { + anchorOffset = offset(endItemTopLeft, endItemBottomRight, endAnchorLine) - + offset(beginItemTopLeft, beginItemBottomRight, m_beginAnchorLine); + } else { + anchorOffset = offset(beginItemTopLeft, beginItemBottomRight, m_beginAnchorLine) - + offset(endItemTopLeft, endItemBottomRight, endAnchorLine); + } + + m_beginFormEditorItem->qmlItemNode().anchors().setMargin(m_beginAnchorLine, anchorOffset); +} +void AnchorManipulator::addAnchor(FormEditorItem *endItem, AnchorLine::Type endAnchorLine) +{ + RewriterTransaction m_rewriterTransaction = m_view->beginRewriterTransaction(); + setMargin(endItem, endAnchorLine); + + m_beginFormEditorItem->qmlItemNode().anchors().setAnchor(m_beginAnchorLine, + endItem->qmlItemNode(), + endAnchorLine); +} + +void AnchorManipulator::removeAnchor() +{ + RewriterTransaction transaction = m_view->beginRewriterTransaction(); + QmlAnchors anchors(m_beginFormEditorItem->qmlItemNode().anchors()); + if (anchors.instanceHasAnchor(m_beginAnchorLine)) { + anchors.removeAnchor(m_beginAnchorLine); + anchors.removeMargin(m_beginAnchorLine); + } +} + +void AnchorManipulator::clear() +{ + m_beginFormEditorItem = 0; + m_beginAnchorLine = AnchorLine::Invalid; +} + +bool AnchorManipulator::isActive() const +{ + return m_beginFormEditorItem && m_beginAnchorLine != AnchorLine::Invalid; +} + +AnchorLine::Type AnchorManipulator::beginAnchorLine() const +{ + return m_beginAnchorLine; +} + +bool AnchorManipulator::beginAnchorLineIsHorizontal() const +{ + return beginAnchorLine() & AnchorLine::HorizontalMask; +} +bool AnchorManipulator::beginAnchorLineIsVertical() const +{ + return beginAnchorLine() & AnchorLine::HorizontalMask; +} + +FormEditorItem *AnchorManipulator::beginFormEditorItem() const +{ + return m_beginFormEditorItem; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/anchormanipulator.h b/src/plugins/qmldesigner/components/formeditor/anchormanipulator.h new file mode 100644 index 0000000000..b44238a4e1 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchormanipulator.h @@ -0,0 +1,71 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORMANIPULATOR_H +#define ANCHORMANIPULATOR_H + +#include + +namespace QmlDesigner { + +class FormEditorItem; +class FormEditorView; + +class AnchorManipulator +{ +public: + AnchorManipulator(FormEditorView *view); + ~AnchorManipulator(); + void begin(FormEditorItem *beginItem, AnchorLine::Type anchorLine); + void addAnchor(FormEditorItem *endItem, AnchorLine::Type anchorLine); + void removeAnchor(); + + void clear(); + + bool isActive() const; + + bool beginAnchorLineIsHorizontal() const; + bool beginAnchorLineIsVertical() const; + + AnchorLine::Type beginAnchorLine() const; + + FormEditorItem *beginFormEditorItem() const; + +private: // fucntions + void setMargin(FormEditorItem *endItem, AnchorLine::Type endAnchorLine); + +private: // variables + FormEditorItem *m_beginFormEditorItem; + AnchorLine::Type m_beginAnchorLine; + QWeakPointer m_view; +}; + +} // namespace QmlDesigner + +#endif // ANCHORMANIPULATOR_H diff --git a/src/plugins/qmldesigner/components/formeditor/anchortool.cpp b/src/plugins/qmldesigner/components/formeditor/anchortool.cpp new file mode 100644 index 0000000000..524352819d --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchortool.cpp @@ -0,0 +1,226 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "anchortool.h" + +#include "formeditorscene.h" +#include "formeditorview.h" +#include +#include +#include "anchorlinehandleitem.h" + +#include + +#include + +namespace QmlDesigner { + +AnchorTool::AnchorTool(FormEditorView* editorView) + : AbstractFormEditorTool(editorView), + m_anchorLineIndicator(editorView->scene()->manipulatorLayerItem()), + m_anchorIndicator(editorView->scene()->manipulatorLayerItem()), + m_anchorManipulator(editorView), + m_lastAnchorLineHandleItem(0) +{ + m_hoverTimeLine.setDuration(200); + connect(&m_hoverTimeLine, SIGNAL(finished()), SLOT(checkIfStillHovering())); +} + +AnchorTool::~AnchorTool() +{ + +} + +void AnchorTool::mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *) +{ + AnchorLineHandleItem *anchorLineHandleItem = topAnchorLineHandleItem(itemList); + if (anchorLineHandleItem) { + m_anchorManipulator.begin(anchorLineHandleItem->anchorLineController().formEditorItem(), + anchorLineHandleItem->anchorLineType()); + } + + m_anchorLineIndicator.clear(); + +} + +bool areAchorable(FormEditorItem *firstItem, FormEditorItem *secondItem) +{ + return firstItem->qmlItemNode().anchors().canAnchor(secondItem->qmlItemNode()); +} + +void AnchorTool::mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) +{ + if (m_anchorManipulator.isActive()) { + FormEditorItem *targetItem = 0; + AnchorLineHandleItem *anchorLineHandleItem = topAnchorLineHandleItem(itemList); + if (anchorLineHandleItem && areAchorable(m_anchorManipulator.beginFormEditorItem(), anchorLineHandleItem->anchorLineController().formEditorItem())) { + targetItem = anchorLineHandleItem->anchorLineController().formEditorItem(); + } else { + FormEditorItem *topFormEditItem = topFormEditorItemWithRootItem(itemList); + if (topFormEditItem && areAchorable(m_anchorManipulator.beginFormEditorItem(), topFormEditItem)) { + targetItem = topFormEditItem; + } else { + m_anchorLineIndicator.hide(); + m_anchorIndicator.updateTargetPoint(m_anchorManipulator.beginFormEditorItem(), m_anchorManipulator.beginAnchorLine(), event->scenePos()); + } + } + + if (targetItem) { + targetItem->qmlItemNode().selectNode(); + m_anchorLineIndicator.setItem(targetItem); + m_anchorLineIndicator.show(m_anchorManipulator.beginFormEditorItem()->qmlItemNode().anchors().possibleAnchorLines(m_anchorManipulator.beginAnchorLine(), targetItem->qmlItemNode())); + m_anchorIndicator.updateTargetPoint(m_anchorManipulator.beginFormEditorItem(), m_anchorManipulator.beginAnchorLine(), event->scenePos()); + targetItem->qmlItemNode().selectNode(); + } + } + +} + +void AnchorTool::mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *) +{ + if (m_anchorManipulator.isActive()) { + AnchorLineHandleItem *anchorLineHandleItem = topAnchorLineHandleItem(itemList); + if (anchorLineHandleItem) { + m_anchorManipulator.addAnchor(anchorLineHandleItem->anchorLineController().formEditorItem(), + anchorLineHandleItem->anchorLineType()); + } else { + m_anchorManipulator.removeAnchor(); + } + + + } + + FormEditorItem *topFormEditItem = topFormEditorItem(itemList); + if (topFormEditItem) + topFormEditItem->qmlItemNode().selectNode(); + + m_anchorManipulator.clear(); + m_anchorLineIndicator.clear(); +} + +void AnchorTool::mouseDoubleClickEvent(const QList & /*itemList*/, + QGraphicsSceneMouseEvent * /*event*/) +{ +} + +void AnchorTool::hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) +{ + m_anchorLineIndicator.clearHighlight(); + m_anchorIndicator.clearHighlight(); + m_lastMousePosition = event->scenePos(); + FormEditorItem *topFormEditItem = 0; + AnchorLineHandleItem *anchorLineHandleItem = topAnchorLineHandleItem(itemList); + + if (anchorLineHandleItem) { + anchorLineHandleItem->setHiglighted(true); + m_anchorIndicator.highlight(anchorLineHandleItem->anchorLineController().formEditorItem(), + anchorLineHandleItem->anchorLineType()); + topFormEditItem = anchorLineHandleItem->anchorLineController().formEditorItem(); + if (m_hoverTimeLine.state() == QTimeLine::NotRunning) { + m_lastAnchorLineHandleItem = anchorLineHandleItem; + m_hoverTimeLine.start(); + } + } else { + topFormEditItem = topFormEditorItem(itemList); + } + + if (topFormEditItem) { + m_anchorLineIndicator.setItem(topFormEditItem); + m_anchorLineIndicator.show(AnchorLine::AllMask); + topFormEditItem->qmlItemNode().selectNode(); + } else { + + m_anchorLineIndicator.clear(); + } +} + +void AnchorTool::checkIfStillHovering() +{ + AnchorLineHandleItem *anchorLineHandleItem = topAnchorLineHandleItem(scene()->items(m_lastMousePosition)); + + if (anchorLineHandleItem && anchorLineHandleItem == m_lastAnchorLineHandleItem) { + FormEditorItem *sourceFormEditItem = anchorLineHandleItem->anchorLineController().formEditorItem(); + QmlAnchors anchors(sourceFormEditItem->qmlItemNode().anchors()); + if (anchors.instanceHasAnchor(anchorLineHandleItem->anchorLine())) { + QmlItemNode targetNode(anchors.instanceAnchor(anchorLineHandleItem->anchorLine()).qmlItemNode()); + FormEditorItem *targetFormEditorItem = scene()->itemForQmlItemNode(targetNode); + targetFormEditorItem->showAttention(); + } + } +} + +void AnchorTool::keyPressEvent(QKeyEvent *) +{ +} + +void AnchorTool::keyReleaseEvent(QKeyEvent *) +{ +} + +void AnchorTool::itemsAboutToRemoved(const QList &removedItems) +{ + QList newItemList = items().toSet().subtract(removedItems.toSet()).toList(); + setItems(newItemList); + m_anchorIndicator.setItems(newItemList); + m_anchorLineIndicator.clear(); +} + +void AnchorTool::selectedItemsChanged(const QList &/*itemList*/) +{ + m_anchorIndicator.setItems(view()->scene()->allFormEditorItems()); + m_anchorIndicator.show(); +} + +void AnchorTool::clear() +{ + m_anchorLineIndicator.clear(); + m_anchorIndicator.clear(); +} + +void AnchorTool::formEditorItemsChanged(const QList &) +{ + m_anchorLineIndicator.updateItems(view()->scene()->allFormEditorItems()); + m_anchorIndicator.updateItems(view()->scene()->allFormEditorItems()); +} + +AnchorLineHandleItem* AnchorTool::topAnchorLineHandleItem(const QList & itemList) +{ + foreach (QGraphicsItem *item, itemList) { + AnchorLineHandleItem *anchorLineItem = AnchorLineHandleItem::fromGraphicsItem(item); + if (anchorLineItem) + return anchorLineItem; + } + + return 0; +} +} diff --git a/src/plugins/qmldesigner/components/formeditor/anchortool.h b/src/plugins/qmldesigner/components/formeditor/anchortool.h new file mode 100644 index 0000000000..d11dd1818e --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/anchortool.h @@ -0,0 +1,88 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ANCHORTOOL_H +#define ANCHORTOOL_H + +#include + +#include "abstractformeditortool.h" + +#include "anchorlineindicator.h" +#include "anchorindicator.h" +#include "anchormanipulator.h" + +namespace QmlDesigner { + +class AnchorLineHandleItem; + +class AnchorTool : public QObject, public AbstractFormEditorTool +{ + Q_OBJECT +public: + AnchorTool(FormEditorView* editorView); + ~AnchorTool(); + + void mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *keyEvent); + + void itemsAboutToRemoved(const QList &itemList); + + void selectedItemsChanged(const QList &itemList); + + void clear(); + + void formEditorItemsChanged(const QList &itemList); + + static AnchorLineHandleItem* topAnchorLineHandleItem(const QList & itemList); + +private slots: + void checkIfStillHovering(); + +private: //variables + AnchorLineIndicator m_anchorLineIndicator; + AnchorIndicator m_anchorIndicator; + AnchorManipulator m_anchorManipulator; + QTimeLine m_hoverTimeLine; + QPointF m_lastMousePosition; + AnchorLineHandleItem *m_lastAnchorLineHandleItem; +}; + +} +#endif // ANCHORTOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/controlelement.cpp b/src/plugins/qmldesigner/components/formeditor/controlelement.cpp new file mode 100644 index 0000000000..5894fe5c45 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/controlelement.cpp @@ -0,0 +1,66 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "controlelement.h" + +#include +#include +#include +#include "layeritem.h" +#include + + +namespace QmlDesigner { + +ControlElement::ControlElement(LayerItem *layerItem) + : m_controlShape(new QGraphicsRectItem(layerItem)) +{ + QPen pen; + pen.setStyle(Qt::DashLine); + pen.setColor(Qt::blue); + m_controlShape->setPen(pen); +} + +ControlElement::~ControlElement() +{ + delete m_controlShape; +} + +void ControlElement::hide() +{ + m_controlShape->hide(); +} + +void ControlElement::setBoundingRect(const QRectF &rect) +{ + m_controlShape->show(); + m_controlShape->setRect(m_controlShape->mapFromScene(rect).boundingRect()); +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/controlelement.h b/src/plugins/qmldesigner/components/formeditor/controlelement.h new file mode 100644 index 0000000000..1ec1f3a864 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/controlelement.h @@ -0,0 +1,57 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef CONTROLELEMENT_H +#define CONTROLELEMENT_H + + +#include + + +namespace QmlDesigner { + +class LayerItem; + +class ControlElement +{ +public: + ControlElement(LayerItem *layerItem); + ~ControlElement(); + + void hide(); + + void setBoundingRect(const QRectF &rect); + +private: + QGraphicsRectItem *m_controlShape; +}; + +} + +#endif // CONTROLELEMENT_H diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp new file mode 100644 index 0000000000..7878cf86a3 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -0,0 +1,315 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "dragtool.h" + +#include "formeditorscene.h" +#include "formeditorview.h" +#include "modelutilities.h" +#include "itemutilfunctions.h" +#include +#include + +#include "resizehandleitem.h" + +#include +#include +#include + +namespace QmlDesigner { + +DragTool::DragTool(FormEditorView *editorView) + : AbstractFormEditorTool(editorView), + m_moveManipulator(editorView->scene()->manipulatorLayerItem(), editorView), + m_selectionIndicator(editorView->scene()->manipulatorLayerItem()) +{ +// view()->setCursor(Qt::SizeAllCursor); +} + + +DragTool::~DragTool() +{ + +} + +void DragTool::clear() +{ + m_moveManipulator.clear(); + m_selectionIndicator.clear(); + m_movingItem.clear(); +} + +void DragTool::mousePressEvent(const QList &, + QGraphicsSceneMouseEvent *) +{ + +} + +void DragTool::mouseMoveEvent(const QList &, + QGraphicsSceneMouseEvent *) +{ + +} + +void DragTool::hoverMoveEvent(const QList &, + QGraphicsSceneMouseEvent * /*event*/) +{ + +} + +void DragTool::keyPressEvent(QKeyEvent *) +{ + +} + +void DragTool::keyReleaseEvent(QKeyEvent *) +{ + +} + + +void DragTool::mouseReleaseEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent *) +{ + +} + +void DragTool::mouseDoubleClickEvent(const QList & /*itemList*/, + QGraphicsSceneMouseEvent * /*event*/) +{ + +} + +void DragTool::itemsAboutToRemoved(const QList & /* removedItemList */) +{ + +} + +void DragTool::selectedItemsChanged(const QList &) +{ + +} + + + +void DragTool::updateMoveManipulator() +{ + if (m_moveManipulator.isActive()) + return; +} + +void DragTool::beginWithPoint(const QPointF &beginPoint) +{ + m_movingItem = scene()->itemForQmlItemNode(m_dragNode); + + m_moveManipulator.setItem(m_movingItem.data()); + m_moveManipulator.begin(beginPoint); + +} + +void DragTool::createQmlItemNode(const ItemLibraryInfo &itemLibraryRepresentation, QmlItemNode parentNode, QPointF scenePos) +{ + QmlDesignerItemLibraryDragAndDrop::CustomDragAndDrop::hide(); + + MetaInfo metaInfo = MetaInfo::global(); + + FormEditorItem *parentItem = scene()->itemForQmlItemNode(parentNode); + QPointF pos = parentItem->mapFromScene(scenePos); + + m_dragNode = view()->createQmlItemNode(itemLibraryRepresentation, pos, parentNode); + + Q_ASSERT(m_dragNode.modelNode().isValid()); + Q_ASSERT(m_dragNode.isValid()); + + QList nodeList; + nodeList.append(m_dragNode); + view()->setSelectedQmlItemNodes(nodeList); + m_selectionIndicator.setItems(scene()->itemsForQmlItemNodes(nodeList)); +} + +void DragTool::createQmlItemNodeFromImage(const QString &imageName, QmlItemNode parentNode, QPointF scenePos) +{ + QmlDesignerItemLibraryDragAndDrop::CustomDragAndDrop::hide(); + + MetaInfo metaInfo = MetaInfo::global(); + + FormEditorItem *parentItem = scene()->itemForQmlItemNode(parentNode); + QPointF pos = parentItem->mapFromScene(scenePos); + + m_dragNode = view()->createQmlItemNodeFromImage(imageName, pos, parentNode); + + QList nodeList; + nodeList.append(m_dragNode); + view()->setSelectedQmlItemNodes(nodeList); + m_selectionIndicator.setItems(scene()->itemsForQmlItemNodes(nodeList)); +} + +FormEditorItem* DragTool::calculateContainer(const QPointF &point, FormEditorItem * currentItem) +{ + QList list = scene()->items(point); + foreach (QGraphicsItem *item, list) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem && formEditorItem != currentItem && formEditorItem->isContainer()) + return formEditorItem; + } + return 0; +} + + +void DragTool::formEditorItemsChanged(const QList & itemList) +{ + if (m_movingItem && itemList.contains(m_movingItem.data())) { + QList updateItemList; + updateItemList.append(m_movingItem.data()); + m_selectionIndicator.updateItems(updateItemList); + } +} + + +void DragTool::dropEvent(QGraphicsSceneDragDropEvent * event) +{ + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo") || + event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + event->accept(); + end(event->scenePos()); + //Q_ASSERT(m_token.isValid()); + m_rewriterTransaction.commit(); + m_dragNode = ModelNode(); + view()->changeToSelectionTool(); + } +} + +void DragTool::dragEnterEvent(QGraphicsSceneDragDropEvent * event) +{ + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo") || + event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + if (!m_rewriterTransaction.isValid()) { + m_rewriterTransaction = view()->beginRewriterTransaction(); + } + } +} + +void DragTool::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) +{ + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo") || + event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + event->accept(); + if (m_dragNode.isValid()) + m_dragNode.destroy(); + end(event->scenePos()); + m_rewriterTransaction.commit(); + QmlDesignerItemLibraryDragAndDrop::CustomDragAndDrop::show(); + QList nodeList; + view()->setSelectedQmlItemNodes(nodeList); + view()->changeToSelectionTool(); + } +} + +static ItemLibraryInfo ItemLibraryInfoFromData(const QByteArray &data) +{ + QDataStream stream(data); + + ItemLibraryInfo itemLibraryInfo; + stream >> itemLibraryInfo; + + return itemLibraryInfo; +} + +void DragTool::dragMoveEvent(QGraphicsSceneDragDropEvent * event) +{ + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo") || + event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + event->accept(); + QPointF scenePos = event->scenePos(); + if (m_dragNode.isValid()) { + + FormEditorItem *parentItem = calculateContainer(event->scenePos() - QPoint(2, 2)); + if (!parentItem) { //if there is no parent any more - the use left the scene + end(event->scenePos()); + m_dragNode.destroy(); //delete the node then + QmlDesignerItemLibraryDragAndDrop::CustomDragAndDrop::show(); + return; + } + //move + move(event->scenePos()); + } else { + //create new node if container + + FormEditorItem *parentItem = calculateContainer(event->scenePos()); + if (!parentItem) + return; + QmlItemNode parentNode; //get possible container parentNode + if (parentItem) + parentNode = parentItem->qmlItemNode(); + + if (event->mimeData()->hasFormat("application/vnd.bauhaus.itemlibraryinfo")) { + Q_ASSERT(!event->mimeData()->data("application/vnd.bauhaus.itemlibraryinfo").isEmpty()); + ItemLibraryInfo ItemLibraryInfo = ItemLibraryInfoFromData(event->mimeData()->data("application/vnd.bauhaus.itemlibraryinfo")); + createQmlItemNode(ItemLibraryInfo, parentNode, event->scenePos()); + } else if (event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + Q_ASSERT(!event->mimeData()->data("application/vnd.bauhaus.libraryresource").isEmpty()); + QString imageName = QString::fromLatin1((event->mimeData()->data("application/vnd.bauhaus.libraryresource"))); + createQmlItemNodeFromImage(imageName, parentNode, event->scenePos()); + } else Q_ASSERT(false); + beginWithPoint(event->scenePos()); + } + } + if (event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { + } +} + +void DragTool::end(QPointF scenePos) +{ + m_moveManipulator.end(scenePos); + clear(); +} + +void DragTool::move(QPointF scenePos) +{ + if (!m_movingItem) + return; + + FormEditorItem *containerItem = calculateContainer(scenePos - QPoint(2, 2), m_movingItem.data()); + if (containerItem && + containerItem != m_movingItem->parentItem() && + view()->currentState().isBaseState()) { + + m_moveManipulator.reparentTo(containerItem); + } + + //MoveManipulator::Snapping useSnapping = MoveManipulator::NoSnapping; + MoveManipulator::Snapping useSnapping = MoveManipulator::UseSnapping; + /* if (event->modifiers().testFlag(Qt::ControlModifier) != view()->isSnapButtonChecked()) + useSnapping = MoveManipulator::UseSnapping;*/ + + m_moveManipulator.update(scenePos, useSnapping); +} + + +} diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.h b/src/plugins/qmldesigner/components/formeditor/dragtool.h new file mode 100644 index 0000000000..97f676482b --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.h @@ -0,0 +1,105 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef DRAGTOOL_H +#define DRAGTOOL_H + +#include "abstractformeditortool.h" +#include "movemanipulator.h" +#include "selectionindicator.h" +#include "resizeindicator.h" + +#include + + +namespace QmlDesigner { + + +class DragTool : public AbstractFormEditorTool +{ +public: + DragTool(FormEditorView* editorView); + ~DragTool(); + + void mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *keyEvent); + + void itemsAboutToRemoved(const QList &itemList); + + void selectedItemsChanged(const QList &itemList); + + void updateMoveManipulator(); + + void beginWithPoint(const QPointF &beginPoint); + + + virtual void dropEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragEnterEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent * event); + virtual void dragMoveEvent(QGraphicsSceneDragDropEvent * event); + + //void beginWithPoint(const QPointF &beginPoint); + + void clear(); + + void formEditorItemsChanged(const QList &itemList); + +protected: + + +private: + + void createQmlItemNode(const ItemLibraryInfo &ItemLibraryRepresentation, QmlItemNode parentNode, QPointF scenePos); + void createQmlItemNodeFromImage(const QString &imageName, QmlItemNode parentNode, QPointF scenePos); + FormEditorItem* calculateContainer(const QPointF &point, FormEditorItem * currentItem = 0); + + void begin(QPointF scenePos); + void end(QPointF scenePos); + void move(QPointF scenePos); + + MoveManipulator m_moveManipulator; + SelectionIndicator m_selectionIndicator; + QWeakPointer m_movingItem; + RewriterTransaction m_rewriterTransaction; + QmlItemNode m_dragNode; +}; + +} +#endif // DRAGTOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.pri b/src/plugins/qmldesigner/components/formeditor/formeditor.pri new file mode 100644 index 0000000000..1c3bd78988 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.pri @@ -0,0 +1,84 @@ +VPATH += $$PWD +QT += opengl +INCLUDEPATH += $$PWD +INCLUDEPATH += $$PWD/../navigator +DEPENDPATH += $$PWD +SOURCES += formeditoritem.cpp \ + formeditorview.cpp \ + formeditorscene.cpp \ + formeditorwidget.cpp \ + selectiontool.cpp \ + abstractformeditortool.cpp \ + controlelement.cpp \ + resizemanipulator.cpp \ + movemanipulator.cpp \ + layeritem.cpp \ + itemutilfunctions.cpp \ + selectionrectangle.cpp \ + rubberbandselectionmanipulator.cpp \ + movetool.cpp \ + selectionindicator.cpp \ + snappinglinecreator.cpp \ + snapper.cpp \ + onedimensionalcluster.cpp \ + singleselectionmanipulator.cpp \ + scalemanipulator.cpp \ + resizetool.cpp \ + resizeindicator.cpp \ + scaleitem.cpp \ + resizecontroller.cpp \ + resizehandleitem.cpp \ + anchortool.cpp \ + anchorlineindicator.cpp \ + anchorlinecontroller.cpp \ + anchorlinehandleitem.cpp \ + anchormanipulator.cpp \ + anchorindicator.cpp \ + anchorcontroller.cpp \ + anchorhandleitem.cpp \ + dragtool.cpp \ + itemcreatortool.cpp \ + toolbox.cpp \ + zoomaction.cpp \ + formeditorgraphicsview.cpp \ + numberseriesaction.cpp +HEADERS += formeditorscene.h \ + formeditorwidget.h \ + formeditoritem.h \ + formeditorview.h \ + selectiontool.h \ + abstractformeditortool.h \ + controlelement.h \ + resizemanipulator.h \ + movemanipulator.h \ + layeritem.h \ + itemutilfunctions.h \ + selectionrectangle.h \ + rubberbandselectionmanipulator.h \ + movetool.h \ + selectionindicator.h \ + snappinglinecreator.h \ + snapper.h \ + onedimensionalcluster.h \ + singleselectionmanipulator.h \ + scalemanipulator.h \ + resizetool.h \ + resizeindicator.h \ + scaleitem.h \ + resizecontroller.h \ + resizehandleitem.h \ + anchortool.h \ + anchorlineindicator.h \ + anchorlinecontroller.h \ + anchorlinehandleitem.h \ + anchormanipulator.h \ + anchorindicator.h \ + anchorcontroller.h \ + anchorhandleitem.h \ + dragtool.h \ + itemcreatortool.cpp \ + toolbox.h \ + zoomaction.h \ + formeditorgraphicsview.h \ + numberseriesaction.h +RESOURCES += formeditor.qrc diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.qrc b/src/plugins/qmldesigner/components/formeditor/formeditor.qrc new file mode 100644 index 0000000000..14e0dbd0fb --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.qrc @@ -0,0 +1,12 @@ + + + resize_handle.png + + + anchor.png + transform.png + + + snapping.png + + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp new file mode 100644 index 0000000000..fb2e905eda --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp @@ -0,0 +1,88 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditorgraphicsview.h" + +#include + +namespace QmlDesigner { + +FormEditorGraphicsView::FormEditorGraphicsView(QWidget *parent) : + QGraphicsView(parent) +{ + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + setResizeAnchor(QGraphicsView::AnchorViewCenter); +// setCacheMode(QGraphicsView::CacheNone); + setCacheMode(QGraphicsView::CacheBackground); + setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); +// setViewportUpdateMode(QGraphicsView::NoViewportUpdate); + setRenderHint(QPainter::Antialiasing, false); + + setFrameShape(QFrame::NoFrame); + + setAutoFillBackground(true); + setBackgroundRole(QPalette::Window); + + const int checkerbordSize= 20; + QPixmap tilePixmap(checkerbordSize * 2, checkerbordSize * 2); + tilePixmap.fill(Qt::white); + QPainter tilePainter(&tilePixmap); + QColor color(220, 220, 220); + tilePainter.fillRect(0, 0, checkerbordSize, checkerbordSize, color); + tilePainter.fillRect(checkerbordSize, checkerbordSize, checkerbordSize, checkerbordSize, color); + tilePainter.end(); + + setBackgroundBrush(tilePixmap); + + viewport()->setMouseTracking(true); +} + +void FormEditorGraphicsView::wheelEvent(QWheelEvent *event) +{ + if (event->modifiers().testFlag(Qt::ControlModifier)) { + event->ignore(); + } else { + QGraphicsView::wheelEvent(event); + } + +} + +void FormEditorGraphicsView::drawBackground(QPainter *painter, const QRectF &rect) +{ + painter->save(); + painter->setBrushOrigin(0, 0); + painter->fillRect(rect.intersected(sceneRect()), backgroundBrush()); + // paint rect around editable area + painter->setPen(Qt::darkGray); + QRectF frameRect = sceneRect().adjusted(-1, -1, 0, 0); + painter->drawRect(frameRect); + painter->restore(); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h new file mode 100644 index 0000000000..2e79f656a4 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h @@ -0,0 +1,51 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORGRAPHICSVIEW_H +#define FORMEDITORGRAPHICSVIEW_H + +#include + +namespace QmlDesigner { + +class FormEditorGraphicsView : public QGraphicsView +{ +Q_OBJECT +public: + explicit FormEditorGraphicsView(QWidget *parent = 0); + + +protected: + void drawBackground(QPainter *painter, const QRectF &rect); + void wheelEvent(QWheelEvent *event); +}; + +} // namespace QmlDesigner + +#endif // FORMEDITORGRAPHICSVIEW_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp new file mode 100644 index 0000000000..91652fc37c --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -0,0 +1,323 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditoritem.h" +#include "formeditorscene.h" +#include "formeditornodeinstanceview.h" +#include "selectiontool.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace QmlDesigner { + + + +FormEditorScene *FormEditorItem::scene() const { + return qobject_cast(QGraphicsItem::scene()); +} + +FormEditorItem::FormEditorItem(const QmlItemNode &qmlItemNode, FormEditorScene* scene) + : QGraphicsObject(scene->formLayerItem()), + m_snappingLineCreator(this), + m_qmlItemNode(qmlItemNode), + m_borderWidth(1.0), + m_opacity(0.6) +{ + setCacheMode(QGraphicsItem::ItemCoordinateCache); + setup(); +} + +void FormEditorItem::setup() +{ + if (qmlItemNode().hasInstanceParent()) + setParentItem(scene()->itemForQmlItemNode(qmlItemNode().instanceParent().toQmlItemNode())); + + if (QGraphicsItem::parentItem() == scene()->formLayerItem()) + m_borderWidth = 0.0; + + setFlag(QGraphicsItem::ItemIsMovable, true); + updateGeometry(); + updateVisibilty(); +} + +QRectF FormEditorItem::boundingRect() const +{ + return m_boundingRect; +} + +void FormEditorItem::updateGeometry() +{ + prepareGeometryChange(); + m_boundingRect = qmlItemNode().instanceBoundingRect(); + setTransform(qmlItemNode().instanceTransform()); + setTransform(m_attentionTransform, true); + //the property for zValue is called z in QGraphicsObject + Q_ASSERT(qmlItemNode().instanceValue("z").isValid()); + setZValue(qmlItemNode().instanceValue("z").toDouble()); +} + +void FormEditorItem::updateVisibilty() +{ +// setVisible(nodeInstance().isVisible()); +// setOpacity(nodeInstance().opacity()); +} + +void FormEditorItem::showAttention() +{ + if (m_attentionTimeLine.isNull()) { + m_attentionTimeLine = new QTimeLine(500, this); + m_attentionTimeLine->setCurveShape(QTimeLine::SineCurve); + connect(m_attentionTimeLine.data(), SIGNAL(valueChanged(qreal)), SLOT(changeAttention(qreal))); + connect(m_attentionTimeLine.data(), SIGNAL(finished()), m_attentionTimeLine.data(), SLOT(deleteLater())); + + m_attentionTimeLine->start(); + } +} + +void FormEditorItem::changeAttention(qreal value) +{ + if (QGraphicsItem::parentItem() == scene()->formLayerItem()) { + setAttentionHighlight(value); + } else { + setAttentionHighlight(value); + setAttentionScale(value); + } +} + +FormEditorView *FormEditorItem::formEditorView() const +{ + return scene()->editorView(); +} + +void FormEditorItem::setAttentionScale(double sinusScale) +{ + if (!qFuzzyIsNull(sinusScale)) { + double scale = std::sqrt(sinusScale); + m_attentionTransform.reset(); + QPointF centerPoint(qmlItemNode().instanceBoundingRect().center()); + m_attentionTransform.translate(centerPoint.x(), centerPoint.y()); + m_attentionTransform.scale(scale * 0.15 + 1.0, scale * 0.15 + 1.0); + m_attentionTransform.translate(-centerPoint.x(), -centerPoint.y()); + m_inverseAttentionTransform = m_attentionTransform.inverted(); + prepareGeometryChange(); + setTransform(qmlItemNode().instanceTransform()); + setTransform(m_attentionTransform, true); + } else { + m_attentionTransform.reset(); + prepareGeometryChange(); + setTransform(qmlItemNode().instanceTransform()); + } +} + +void FormEditorItem::setAttentionHighlight(double value) +{ + m_opacity = 0.6 + value; + if (QGraphicsItem::parentItem() == scene()->formLayerItem()) + m_borderWidth = value * 4; + else + m_borderWidth = 1. + value * 3; + + update(); +} + +FormEditorItem::~FormEditorItem() +{ + scene()->removeItemFromHash(this); +} + +/* \brief returns the parent item skipping all proxyItem*/ +FormEditorItem *FormEditorItem::parentItem() const +{ + return qgraphicsitem_cast (QGraphicsItem::parentItem()); +} + +FormEditorItem* FormEditorItem::fromQGraphicsItem(QGraphicsItem *graphicsItem) +{ + return qgraphicsitem_cast(graphicsItem); +} + +static QRectF alignedRect(const QRectF &rect) +{ + QRectF alignedRect(rect); + alignedRect.setTop(std::floor(rect.top()) + 0.5); + alignedRect.setBottom(std::floor(rect.bottom()) + 0.5); + alignedRect.setLeft(std::floor(rect.left()) + 0.5); + alignedRect.setRight(std::floor(rect.right()) + 0.5); + + return alignedRect; +} + +void FormEditorItem::paintBoundingRect(QPainter *painter) const +{ + if (QGraphicsItem::parentItem() == scene()->formLayerItem() && qFuzzyIsNull(m_borderWidth)) + return; + + QPen pen; + pen.setJoinStyle(Qt::MiterJoin); + + switch(scene()->paintMode()) { + case FormEditorScene::AnchorMode: { + pen.setColor(Qt::black); + pen.setWidth(m_borderWidth); + } + break; + case FormEditorScene::NormalMode: { + pen.setColor(Qt::gray); + } + break; + } + + painter->setPen(pen); + int offset = m_borderWidth / 2; + painter->drawRect(alignedRect(boundingRect().adjusted(offset, offset, -offset, -offset))); +} + +void FormEditorItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + painter->save(); + painter->setRenderHint(QPainter::Antialiasing, true); + switch(scene()->paintMode()) { + case FormEditorScene::AnchorMode: + painter->setOpacity(m_opacity); + break; + case FormEditorScene::NormalMode: + painter->setOpacity(qmlItemNode().instanceValue("opacity").toDouble()); + break; + } + + qmlItemNode().paintInstance(painter); + + painter->setRenderHint(QPainter::Antialiasing, false); + paintBoundingRect(painter); + + painter->restore(); +} + +AbstractFormEditorTool* FormEditorItem::tool() const +{ + return static_cast(scene())->currentTool(); +} + +SnapLineMap FormEditorItem::topSnappingLines() const +{ + return m_snappingLineCreator.topLines(); +} + +SnapLineMap FormEditorItem::bottomSnappingLines() const +{ + return m_snappingLineCreator.bottomLines(); +} + +SnapLineMap FormEditorItem::leftSnappingLines() const +{ + return m_snappingLineCreator.leftLines(); +} + +SnapLineMap FormEditorItem::rightSnappingLines() const +{ + return m_snappingLineCreator.rightLines(); +} + +SnapLineMap FormEditorItem::horizontalCenterSnappingLines() const +{ + return m_snappingLineCreator.horizontalCenterLines(); +} + +SnapLineMap FormEditorItem::verticalCenterSnappingLines() const +{ + return m_snappingLineCreator.verticalCenterLines(); +} + +SnapLineMap FormEditorItem::topSnappingOffsets() const +{ + return m_snappingLineCreator.topOffsets(); +} + +SnapLineMap FormEditorItem::bottomSnappingOffsets() const +{ + return m_snappingLineCreator.bottomOffsets(); +} + +SnapLineMap FormEditorItem::leftSnappingOffsets() const +{ + return m_snappingLineCreator.leftOffsets(); +} + +SnapLineMap FormEditorItem::rightSnappingOffsets() const +{ + return m_snappingLineCreator.rightOffsets(); +} + + +void FormEditorItem::updateSnappingLines(const QList &exceptionList, + FormEditorItem *transformationSpaceItem) +{ + m_snappingLineCreator.update(exceptionList, transformationSpaceItem); +} + + +QList FormEditorItem::childFormEditorItems() const +{ + QList formEditorItemList; + + foreach (QGraphicsItem *item, childItems()) { + FormEditorItem *formEditorItem = fromQGraphicsItem(item); + if (formEditorItem) + formEditorItemList.append(formEditorItem); + } + + return formEditorItemList; +} + +bool FormEditorItem::isContainer() const +{ + return qmlItemNode().modelNode().metaInfo().isContainer(); +} + +QmlItemNode FormEditorItem::qmlItemNode() const +{ + return m_qmlItemNode; +} + +} + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h new file mode 100644 index 0000000000..b5ffc76992 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h @@ -0,0 +1,131 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORITEM_H +#define FORMEDITORITEM_H + +#include +#include +#include +#include "snappinglinecreator.h" + +class QTimeLine; + +namespace QmlDesigner { + +class FormEditorScene; +class FormEditorView; +class AbstractFormEditorTool; + +namespace Internal { + class GraphicItemResizer; + class MoveController; +} + +class FormEditorItem : public QGraphicsObject +{ + Q_OBJECT + + friend class QmlDesigner::FormEditorScene; +public: + ~FormEditorItem(); + + void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + + bool isContainer() const; + QmlItemNode qmlItemNode() const; + + + enum { Type = UserType + 0xfffa }; + + int type() const; + + static FormEditorItem* fromQGraphicsItem(QGraphicsItem *graphicsItem); + + void updateSnappingLines(const QList &exceptionList, + FormEditorItem *transformationSpaceItem); + + SnapLineMap topSnappingLines() const; + SnapLineMap bottomSnappingLines() const; + SnapLineMap leftSnappingLines() const; + SnapLineMap rightSnappingLines() const; + SnapLineMap horizontalCenterSnappingLines() const; + SnapLineMap verticalCenterSnappingLines() const; + + SnapLineMap topSnappingOffsets() const; + SnapLineMap bottomSnappingOffsets() const; + SnapLineMap leftSnappingOffsets() const; + SnapLineMap rightSnappingOffsets() const; + + QList childFormEditorItems() const; + FormEditorScene *scene() const; + FormEditorItem *parentItem() const; + + QRectF boundingRect() const; + + void updateGeometry(); + void updateVisibilty(); + + void showAttention(); + + FormEditorView *formEditorView() const; + +protected: + AbstractFormEditorTool* tool() const; + void paintBoundingRect(QPainter *painter) const; + +private slots: + void changeAttention(qreal value); + +private: // functions + FormEditorItem(const QmlItemNode &qmlItemNode, FormEditorScene* scene); + void setup(); + void setAttentionScale(double scale); + void setAttentionHighlight(double value); + +private: // variables + SnappingLineCreator m_snappingLineCreator; + QmlItemNode m_qmlItemNode; + QWeakPointer m_attentionTimeLine; + QTransform m_attentionTransform; // make item larger in anchor mode + QTransform m_inverseAttentionTransform; + QRectF m_boundingRect; + double m_borderWidth; + double m_opacity; +}; + + +inline int FormEditorItem::type() const +{ + return UserType + 0xfffa; +} + +} + +#endif // FORMEDITORITEM_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditormainview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditormainview.cpp new file mode 100644 index 0000000000..d1da63fafc --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditormainview.cpp @@ -0,0 +1,401 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditormainview.h" + +#include "formeditorview.h" +#include "formeditorwidget.h" +#include +#include + +#include "zoomaction.h" + +namespace QmlDesigner { + + +FormEditorMainView::FormEditorMainView() + : m_formMainEditorWidget(new FormEditorMainWidget(this)) +{ + QPixmapCache::setCacheLimit(1024 * 100); +} + +FormEditorMainView::~FormEditorMainView() +{ + resetViews(); + + if (m_formMainEditorWidget) + m_formMainEditorWidget->deleteLater(); +} + +void FormEditorMainView::modelAttached(Model *model) +{ + AbstractView::modelAttached(model); + + setupSubViews(); + + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->modelAttached(model); + } + + m_formMainEditorWidget->setModel(model); +} + +void FormEditorMainView::createSubView(const QmlModelState &state) +{ + FormEditorView *subView = new FormEditorView(this); + subView->setCurrentState(state); + m_formEditorViewList.append(subView); + + m_formMainEditorWidget->addWidget(subView->widget()); + m_subWindowMap.insert(state, subView->widget()); + + subView->setZoomLevel(zoomAction()->zoomLevel()); + connect(zoomAction(), SIGNAL(zoomLevelChanged(double)), subView, SLOT(setZoomLevel(double))); +} + +void FormEditorMainView::removeSubView(const ModelState &state) +{ + QWidget *subWindow = m_subWindowMap.take(state).data(); + Q_ASSERT(subWindow); + if (subWindow == m_formMainEditorWidget->currentWidget()) + setCurrentState(); + delete subWindow; + + FormEditorView *editorView = 0; + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view->modelState() == state) { + editorView = view.data(); + break; + } + } + Q_ASSERT(editorView); + m_formEditorViewList.removeOne(editorView); + delete editorView; +} + +static bool modelStateLessThan(const ModelState &firstState, const ModelState &secondState) + { + if (firstState.isBaseState()) + return false; + + return firstState.name().toLower() > secondState.name().toLower(); + } + +void FormEditorMainView::setupSubViews() +{ + foreach(const QWeakPointer &view, m_formEditorViewList) + delete view.data(); + m_formEditorViewList.clear(); + + foreach(const QWeakPointer &view, m_subWindowMap.values()) + delete view.data(); + m_subWindowMap.clear(); + + QList invertedStates(model()->modelStates()); + qSort(invertedStates.begin(), invertedStates.end(), modelStateLessThan); + foreach(const ModelState &state, invertedStates) + createSubView(state); +} + +void FormEditorMainView::resetViews() +{ + m_subWindowMap.clear(); + foreach(const QWeakPointer &view, m_formEditorViewList) + delete view.data(); + m_formEditorViewList.clear(); +} + +void FormEditorMainView::nodeCreated(const ModelNode &createdNode) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeCreated(createdNode); + } +} + +void FormEditorMainView::modelAboutToBeDetached(Model *model) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->modelAboutToBeDetached(model); + } + + resetViews(); + + m_formMainEditorWidget->setModel(0); + + AbstractView::modelAboutToBeDetached(model); +} + +void FormEditorMainView::nodeAboutToBeRemoved(const ModelNode &removedNode) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeAboutToBeRemoved(removedNode); + } +} + +void FormEditorMainView::propertiesAdded(const NodeState &state, const QList& propertyList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->propertiesAdded(state, propertyList); + } +} + +void FormEditorMainView::propertiesAboutToBeRemoved(const NodeState &state, const QList& propertyList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->propertiesAboutToBeRemoved(state, propertyList); + } +} + +void FormEditorMainView::propertyValuesChanged(const NodeState &state, const QList& propertyList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->propertyValuesChanged(state, propertyList); + } +} + +void FormEditorMainView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeIdChanged(node, newId, oldId); + } +} + +void FormEditorMainView::nodeReparented(const ModelNode &node, const ModelNode &oldParent, const ModelNode &newParent) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeReparented(node, oldParent, newParent); + } +} + +FormEditorMainWidget *FormEditorMainView::widget() const +{ + return m_formMainEditorWidget.data(); +} + +NodeInstanceView *FormEditorMainView::nodeInstanceView(const ModelState &modelState) const +{ + foreach (const QWeakPointer &view, m_formEditorViewList) { + if (view->modelState() == modelState) + return view->nodeInstanceView(); + } + + return 0; +} + +void FormEditorMainView::selectedNodesChanged(const QList &selectedNodeList, + const QList &lastSelectedNodeList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->selectedNodesChanged(selectedNodeList, lastSelectedNodeList); + } +} + +void FormEditorMainView::modelStateAboutToBeRemoved(const ModelState &modelState) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->modelStateAboutToBeRemoved(modelState); + } + + removeSubView(modelState); +} + +void FormEditorMainView::modelStateAdded(const ModelState &modelState) +{ + createSubView(modelState); + m_formEditorViewList.last()->modelAttached(model()); + + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->modelStateAdded(modelState); + } +} + +void FormEditorMainView::nodeStatesAboutToBeRemoved(const QList &nodeStateList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeStatesAboutToBeRemoved(nodeStateList); + } +} + +void FormEditorMainView::nodeStatesAdded(const QList &nodeStateList) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeStatesAdded(nodeStateList); + } +} + +void FormEditorMainView::setCurrentState(const QmlModelState &state) +{ + Q_ASSERT(m_subWindowMap.contains(state)); + m_formMainEditorWidget->setCurrentWidget(m_subWindowMap.value(state).data()); + emit stateChanged(state); +} + +ModelState FormEditorMainView::currentState() const +{ + QWidget *currentWidget = m_formMainEditorWidget->currentWidget(); + QMapIterator > iter(m_subWindowMap); + while (iter.hasNext()) { + iter.next(); + if (iter.value().data() == currentWidget) { + return iter.key(); + } + } + Q_ASSERT_X(0, Q_FUNC_INFO, "cannot find current state"); + return ModelState(); +} + +FormEditorMainView::EditorTool FormEditorMainView::currentTool() const +{ + return m_currentTool; +} + +void FormEditorMainView::setCurrentTool(FormEditorMainView::EditorTool tool) +{ + if (m_currentTool == tool) + return; + m_currentTool = tool; + switch (tool) { + case MoveTool: { + foreach(const QWeakPointer &view, m_formEditorViewList) + view->changeToMoveTool(); + break; + } + case DragTool: { + foreach(const QWeakPointer &view, m_formEditorViewList) + view->changeToDragTool(); + break; + } + case SelectTool: { + foreach(const QWeakPointer &view, m_formEditorViewList) + view->changeToSelectionTool(); + break; + } + case ResizeTool: { + foreach(const QWeakPointer &view, m_formEditorViewList) + view->changeToResizeTool(); + break; + } + case AnchorTool: { + foreach(const QWeakPointer &view, m_formEditorViewList) + view->changeToAnchorTool(); + break; + } + default: Q_ASSERT(0); + } + emit toolChanged(m_currentTool); +} + +void FormEditorMainView::changeToDragTool() +{ + setCurrentTool(DragTool); +} + + +void FormEditorMainView::changeToMoveTool() +{ + setCurrentTool(MoveTool); +} + +void FormEditorMainView::changeToMoveTool(const QPointF &/*beginPoint*/) +{ + setCurrentTool(MoveTool); +} + +void FormEditorMainView::changeToSelectionTool() +{ + setCurrentTool(SelectTool); +} + +void FormEditorMainView::changeToResizeTool() +{ + setCurrentTool(ResizeTool); +} + +void FormEditorMainView::changeToAnchorTool() +{ + setCurrentTool(AnchorTool); +} + +void FormEditorMainView::changeToTransformTools() +{ + foreach(const QWeakPointer &view, m_formEditorViewList) + if (view) + view->changeToTransformTools(); +} + +void FormEditorMainView::anchorsChanged(const NodeState &nodeState) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->anchorsChanged(nodeState); + } +} + + +void FormEditorMainView::auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->auxiliaryDataChanged(node, name, data); + } +} + +void FormEditorMainView::nodeSlidedToIndex(const ModelNode &node, int newIndex, int oldIndex) +{ + foreach(const QWeakPointer &view, m_formEditorViewList) { + if (view) + view->nodeSlidedToIndex(node, newIndex, oldIndex); + } +} + +ComponentAction *FormEditorMainView::componentAction() const +{ + return m_formMainEditorWidget->componentAction(); +} + +ZoomAction *FormEditorMainView::zoomAction() const +{ + return m_formMainEditorWidget->zoomAction(); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditormainview.h b/src/plugins/qmldesigner/components/formeditor/formeditormainview.h new file mode 100644 index 0000000000..05a563f09e --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditormainview.h @@ -0,0 +1,123 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORMAINVIEW_H +#define FORMEDITORMAINVIEW_H + +#include + +#include +#include +#include + + +namespace QmlDesigner { +class AbstractFormEditorTool; + +class FormEditorMainView : public ForwardView +{ + Q_OBJECT + +public: + FormEditorMainView(); + ~FormEditorMainView(); + + // AbstractView + void modelAttached(Model *model); + void modelAboutToBeDetached(Model *model); + void nodeCreated(const ModelNode &createdNode); + void nodeAboutToBeRemoved(const ModelNode &removedNode); + void nodeReparented(const ModelNode &node, const ModelNode &oldParent, const ModelNode &newParent); + void propertiesAdded(const NodeState &state, const QList& propertyList); + void propertiesAboutToBeRemoved(const NodeState &state, const QList& propertyList); + void propertyValuesChanged(const NodeState& state, const QList &propertyList); + void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId); + + void selectedNodesChanged(const QList &selectedNodeList, + const QList &lastSelectedNodeList); + + void modelStateAboutToBeRemoved(const ModelState &modelState); + void modelStateAdded(const ModelState &modelState); + + void nodeStatesAboutToBeRemoved(const QList &nodeStateList); + void nodeStatesAdded(const QList &nodeStateList); + + void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); + // FormEditorMainView + FormEditorMainWidget *widget() const; + NodeInstanceView *nodeInstanceView(const ModelState &modelState) const; + + void setCurrentState(const ModelState &state); + ModelState currentState() const; + + enum EditorTool { + MoveTool, + DragTool, + SelectTool, + ResizeTool, + AnchorTool + }; + + EditorTool currentTool() const; + void setCurrentTool(EditorTool tool); + + void changeToMoveTool(); + void changeToMoveTool(const QPointF &beginPoint); + void changeToDragTool(); + void changeToSelectionTool(); + void changeToResizeTool(); + void changeToTransformTools(); + void changeToAnchorTool(); + + void anchorsChanged(const NodeState &nodeState); + void nodeSlidedToIndex(const ModelNode &node, int newIndex, int oldIndex); + + ComponentAction *componentAction() const; + ZoomAction *zoomAction() const; + +signals: + void stateChanged(const ModelState &state); + void toolChanged(EditorTool tool); + +protected: + void setupSubViews(); + void createSubView(const QmlModelState &state); + void removeSubView(const QmlModelState &state); + void resetViews(); + +private: + QWeakPointer m_formMainEditorWidget; + QList > m_formEditorViewList; + QMap > m_subWindowMap; + EditorTool m_currentTool; +}; + +} // namespace QmlDesigner + +#endif // FORMEDITORMAINVIEW_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.cpp new file mode 100644 index 0000000000..ade4aace51 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.cpp @@ -0,0 +1,156 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditormainwidget.h" + +#include +#include +#include +#include +#include +#include +#include "toolbox.h" +#include "componentaction.h" +#include "zoomaction.h" +#include +#include + +namespace QmlDesigner { + +FormEditorMainWidget::FormEditorMainWidget(FormEditorMainView *mainView) + : QWidget(), + m_formEditorMainView(mainView), + m_stackedWidget(new QStackedWidget(this)) +{ + QFile file(":/qmldesigner/stylesheet.css"); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + setStyleSheet(styleSheet); + + QVBoxLayout *fillLayout = new QVBoxLayout(this); + fillLayout->setMargin(0); + fillLayout->setSpacing(0); + setLayout(fillLayout); + + QActionGroup *toolActionGroup = new QActionGroup(this); + + QAction *transformToolAction = toolActionGroup->addAction("Transform Tool (Press Key Q)"); + transformToolAction->setShortcut(Qt::Key_Q); + transformToolAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + transformToolAction->setCheckable(true); + transformToolAction->setChecked(true); + transformToolAction->setIcon(QPixmap(":/icon/tool/transform.png")); + connect(transformToolAction, SIGNAL(triggered(bool)), SLOT(changeTransformTool(bool))); + + QAction *anchorToolAction = toolActionGroup->addAction("Anchor Tool (Press Key W)"); + anchorToolAction->setShortcut(Qt::Key_W); + anchorToolAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + anchorToolAction->setCheckable(true); + anchorToolAction->setIcon(QPixmap(":/icon/tool/anchor.png")); + connect(anchorToolAction, SIGNAL(triggered(bool)), SLOT(changeAnchorTool(bool))); + + addActions(toolActionGroup->actions()); + + + m_componentAction = new ComponentAction(toolActionGroup); + addAction(m_componentAction.data()); + + m_zoomAction = new ZoomAction(toolActionGroup); + addAction(m_zoomAction.data()); + + ToolBox *toolBox = new ToolBox(this); + toolBox->setActions(actions()); + fillLayout->addWidget(toolBox); + + fillLayout->addWidget(m_stackedWidget.data()); +} + +void FormEditorMainWidget::addWidget(QWidget *widget) +{ + m_stackedWidget->addWidget(widget); +} + +QWidget *FormEditorMainWidget::currentWidget() const +{ + return m_stackedWidget->currentWidget(); +} + +void FormEditorMainWidget::setCurrentWidget(QWidget *widget) +{ + m_stackedWidget->setCurrentWidget(widget); +} + +void FormEditorMainWidget::setModel(Model *model) +{ + m_componentAction->setDisabled(true); + + if (model) { + m_componentAction->setModel(model->masterModel()); + m_componentAction->setEnabled(true); + } +} + +void FormEditorMainWidget::changeTransformTool(bool checked) +{ + if (checked) + m_formEditorMainView->changeToTransformTools(); +} + +void FormEditorMainWidget::changeAnchorTool(bool checked) +{ + if (checked) + m_formEditorMainView->changeToAnchorTool(); +} + +ComponentAction *FormEditorMainWidget::componentAction() const +{ + return m_componentAction.data(); +} + +ZoomAction *FormEditorMainWidget::zoomAction() const +{ + return m_zoomAction.data(); +} + +void FormEditorMainWidget::wheelEvent(QWheelEvent *event) +{ + if (event->modifiers().testFlag(Qt::ControlModifier)) { + if (event->delta() > 0) { + zoomAction()->zoomIn(); + } else { + zoomAction()->zoomOut(); + } + + event->accept(); + } else { + QWidget::wheelEvent(event); + } +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.h new file mode 100644 index 0000000000..d07afa5fc4 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditormainwidget.h @@ -0,0 +1,74 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORMAINWIDGET_H +#define FORMEDITORMAINWIDGET_H + +#include +#include + + + +namespace QmlDesigner { + +class Model; +class FormEditorMainView; +class ComponentAction; +class ZoomAction; + +class FormEditorMainWidget : public QWidget +{ + Q_OBJECT +public: + FormEditorMainWidget(FormEditorMainView *mainView); + + void addWidget(QWidget *widget); + QWidget *currentWidget() const; + void setCurrentWidget(QWidget *widget); + void setModel(Model *model); + + ComponentAction *componentAction() const; + ZoomAction *zoomAction() const; + +protected: + void wheelEvent(QWheelEvent *event); + +private slots: + void changeTransformTool(bool checked); + void changeAnchorTool(bool checked); + +private: + QWeakPointer m_formEditorMainView; + QWeakPointer m_stackedWidget; + QWeakPointer m_componentAction; + QWeakPointer m_zoomAction; +}; + +} +#endif // FORMEDITORMAINWIDGET_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.cpp new file mode 100644 index 0000000000..7516f55934 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.cpp @@ -0,0 +1,48 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditornodeinstanceview.h" +#include "formeditorview.h" + +#include +#include + + +namespace QmlDesigner { + +FormEditorNodeInstanceView::FormEditorNodeInstanceView(QObject * parent) : NodeInstanceView(parent) +{ + +} + +FormEditorNodeInstanceView::~FormEditorNodeInstanceView() +{ +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.h b/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.h new file mode 100644 index 0000000000..b1c9909e92 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditornodeinstanceview.h @@ -0,0 +1,50 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORNODEINSTANCE_H +#define FORMEDITORNODEINSTANCE_H + + +#include + +namespace QmlDesigner { + +class FormEditorView; + +class FormEditorNodeInstanceView : public NodeInstanceView +{ + Q_OBJECT +public: + FormEditorNodeInstanceView(QObject * parent); + ~FormEditorNodeInstanceView(); +}; + + +} +#endif //FORMEDITORNODEINSTANCE_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp new file mode 100644 index 0000000000..9c7c69d67a --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -0,0 +1,364 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditorscene.h" +#include "formeditorview.h" +#include "formeditorwidget.h" +#include "formeditoritem.h" +#include "movemanipulator.h" +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "formeditornodeinstanceview.h" + +#include "resizehandleitem.h" +#include + + + +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) + +{ + setSceneRect(0, 0, 1, 1); // prevent automatic calculation (causing a recursion), right size will be set later + + m_manipulatorLayerItem->setZValue(1.0); + m_formLayerItem->setZValue(0.0); + m_formLayerItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true); + view->setScene(this); + +// setItemIndexMethod(QGraphicsScene::NoIndex); +} + +FormEditorScene::~FormEditorScene() +{ + clear(); //FormEditorItems have to be cleared before destruction + //Reason: FormEditorItems accesses FormEditorScene in destructor +} + + +FormEditorItem* FormEditorScene::itemForQmlItemNode(const QmlItemNode &qmlItemNode) const +{ + Q_ASSERT(hasItemForQmlItemNode(qmlItemNode)); + return m_qmlItemNodeItemHash.value(qmlItemNode); +} + + +QList FormEditorScene::itemsForQmlItemNodes(const QList &nodeList) const +{ + QList itemList; + foreach (const QmlItemNode &node, nodeList) { + if (hasItemForQmlItemNode(node)) + itemList += itemForQmlItemNode(node); + } + + return itemList; +} + +QList FormEditorScene::allFormEditorItems() const +{ + return m_qmlItemNodeItemHash.values(); +} + +void FormEditorScene::updateAllFormEditorItems() +{ + foreach (FormEditorItem *item, allFormEditorItems()) { + item->update(); + } +} + +bool FormEditorScene::hasItemForQmlItemNode(const QmlItemNode &qmlItemNode) const +{ + return m_qmlItemNodeItemHash.contains(qmlItemNode); +} + +void FormEditorScene::removeItemFromHash(FormEditorItem *item) +{ + m_qmlItemNodeItemHash.remove(item->qmlItemNode()); +} + + +AbstractFormEditorTool* FormEditorScene::currentTool() const +{ + return m_editorView->currentTool(); +} + +//This method calculates the possible parent for reparent +FormEditorItem* FormEditorScene::calulateNewParent(FormEditorItem *formEditorItem) +{ + QList list = items(formEditorItem->qmlItemNode().instanceBoundingRect().center()); + foreach (QGraphicsItem *graphicsItem, list) { + if (qgraphicsitem_cast(graphicsItem) && + graphicsItem->collidesWithItem(formEditorItem, Qt::ContainsItemShape)) + return qgraphicsitem_cast(graphicsItem); + } + return 0; +} + +void FormEditorScene::synchronizeTransformation(const QmlItemNode &qmlItemNode) +{ + FormEditorItem *item = itemForQmlItemNode(qmlItemNode); + item->updateGeometry(); + item->update(); + + if (qmlItemNode.isRootNode()) { + QRectF sceneRect(qmlItemNode.instanceBoundingRect()); + + setSceneRect(sceneRect); + formLayerItem()->update(); + manipulatorLayerItem()->update(); + } +} + +void FormEditorScene::synchronizeParent(const QmlItemNode &qmlItemNode) +{ + QmlItemNode parentNode = qmlItemNode.instanceParent().toQmlItemNode(); + if (parentNode.isValid()) + reparentItem(qmlItemNode, parentNode); +} + +void FormEditorScene::synchronizeOtherProperty(const QmlItemNode &qmlItemNode) +{ + if (hasItemForQmlItemNode(qmlItemNode)) { + FormEditorItem *item = itemForQmlItemNode(qmlItemNode); + if (item) + item->update(); + } +} + +void FormEditorScene::synchronizeState(const QmlItemNode &qmlItemNode) +{ + if (hasItemForQmlItemNode(qmlItemNode)) { + FormEditorItem *item = itemForQmlItemNode(qmlItemNode); + if (item) + item->update(); + } +} + + +FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNode) +{ + FormEditorItem *formEditorItem = new FormEditorItem(qmlItemNode, this); + Q_ASSERT(!m_qmlItemNodeItemHash.contains(qmlItemNode)); + + m_qmlItemNodeItemHash.insert(qmlItemNode, formEditorItem); + if (qmlItemNode.isRootNode()) { + QRectF sceneRect(qmlItemNode.instanceBoundingRect()); + + setSceneRect(sceneRect); + formLayerItem()->update(); + manipulatorLayerItem()->update(); + } + + return formEditorItem; +} + + +void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) +{ + currentTool()->dropEvent(event); + + if (views().first()) + views().first()->setFocus(); +} + +void FormEditorScene::dragEnterEvent(QGraphicsSceneDragDropEvent * event) +{ + currentTool()->dragEnterEvent(event); +} + +void FormEditorScene::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) +{ + currentTool()->dragLeaveEvent(event); + + return; + + if (m_dragNode.isValid()) { + m_dragNode.destroy(); + } +} + +void FormEditorScene::dragMoveEvent(QGraphicsSceneDragDropEvent * event) +{ + currentTool()->dragMoveEvent(event); +} + +QList FormEditorScene::removeLayerItems(const QList &itemList) +{ + QList itemListWithoutLayerItems; + + foreach (QGraphicsItem *item, itemList) + if (item != manipulatorLayerItem() && item != formLayerItem()) + itemListWithoutLayerItems.append(item); + + return itemListWithoutLayerItems; +} + +void FormEditorScene::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + currentTool()->mousePressEvent(removeLayerItems(items(event->scenePos())), event); +} + +void FormEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->buttons()) + currentTool()->mouseMoveEvent(removeLayerItems(items(event->scenePos())), event); + else + currentTool()->hoverMoveEvent(removeLayerItems(items(event->scenePos())), event); + + event->accept(); +} + +void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + currentTool()->mouseReleaseEvent(removeLayerItems(items(event->scenePos())), event); + + event->accept(); + } + +void FormEditorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + currentTool()->mouseDoubleClickEvent(removeLayerItems(items(event->scenePos())), event); + + event->accept(); +} + +void FormEditorScene::keyPressEvent(QKeyEvent *keyEvent) +{ + currentTool()->keyPressEvent(keyEvent); +} + +void FormEditorScene::keyReleaseEvent(QKeyEvent *keyEvent) +{ + currentTool()->keyReleaseEvent(keyEvent); +} + +FormEditorView *FormEditorScene::editorView() const +{ + return m_editorView; +} + +LayerItem* FormEditorScene::manipulatorLayerItem() const +{ + return m_manipulatorLayerItem.data(); +} + +LayerItem* FormEditorScene::formLayerItem() const +{ + return m_formLayerItem.data(); +} + +bool FormEditorScene::event(QEvent * event) +{ + switch(event->type()) + { + case QEvent::GraphicsSceneHoverEnter : + hoverEnterEvent(static_cast(event)); + return true; + case QEvent::GraphicsSceneHoverMove : + hoverMoveEvent(static_cast(event)); + return true; + case QEvent::GraphicsSceneHoverLeave : + hoverLeaveEvent(static_cast(event)); + return true; + default: return QGraphicsScene::event(event); + } + +} + +void FormEditorScene::hoverEnterEvent(QGraphicsSceneHoverEvent * /*event*/) +{ + qDebug() << __FUNCTION__; +} + +void FormEditorScene::hoverMoveEvent(QGraphicsSceneHoverEvent * /*event*/) +{ + qDebug() << __FUNCTION__; +} + +void FormEditorScene::hoverLeaveEvent(QGraphicsSceneHoverEvent * /*event*/) +{ + qDebug() << __FUNCTION__; +} + + +void FormEditorScene::reparentItem(const QmlItemNode &node, const QmlItemNode &newParent) +{ + Q_ASSERT(hasItemForQmlItemNode(node)); + Q_ASSERT(hasItemForQmlItemNode(newParent)); + FormEditorItem *item = itemForQmlItemNode(node); + FormEditorItem *parentItem = itemForQmlItemNode(newParent); + item->setParentItem(parentItem); + item->setParent(parentItem); +} + +FormEditorItem* FormEditorScene::rootFormEditorItem() const +{ + QList childItemList(m_formLayerItem->childItems()); + if (!childItemList.isEmpty()) + return FormEditorItem::fromQGraphicsItem(childItemList.first()); + + return 0; +} + +FormEditorScene::PaintMode FormEditorScene::paintMode() const +{ + return m_paintMode; +} + +void FormEditorScene::setPaintMode(PaintMode paintMode) +{ + m_paintMode = paintMode; +} + +void FormEditorScene::clearFormEditorItems() +{ + foreach (QGraphicsItem *item, items()) { + if (qgraphicsitem_cast(item)) + delete item; + } +} + +} + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h new file mode 100644 index 0000000000..89098ba7ab --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h @@ -0,0 +1,133 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORSCENE_H +#define FORMEDITORSCENE_H + + +#include +#include +#include +#include +#include "abstractformeditortool.h" + + +class QGraphicsSceneMouseEvent; + +namespace QmlDesigner { + +class FormEditorWidget; +class FormEditorItem; +class FormEditorView; +class LayerItem; + +class FormEditorScene : public QGraphicsScene +{ + Q_OBJECT + + friend class QmlDesigner::FormEditorItem; + friend class QmlDesigner::FormEditorView; + +public: + enum PaintMode { + NormalMode, + AnchorMode + }; + + FormEditorScene(FormEditorWidget *widget, FormEditorView *editorView); + ~FormEditorScene(); + FormEditorItem *addFormEditorItem(const QmlItemNode &qmlItemNode); + + FormEditorItem* itemForQmlItemNode(const QmlItemNode &qmlItemNode) const; + + QList itemsForQmlItemNodes(const QList &nodeList) const; + QList allFormEditorItems() const; + + void updateAllFormEditorItems(); + + bool hasItemForQmlItemNode(const QmlItemNode &qmlItemNode) const; + + void synchronizeTransformation(const QmlItemNode &qmlItemNode); + void synchronizeParent(const QmlItemNode &qmlItemNode); + void synchronizeOtherProperty(const QmlItemNode &qmlItemNode); + void synchronizeState(const QmlItemNode &qmlItemNode); + + FormEditorItem* calulateNewParent(FormEditorItem *widget); + bool event(QEvent *event); + LayerItem* manipulatorLayerItem() const; + LayerItem* formLayerItem() const; + FormEditorView *editorView() const; + + FormEditorItem *rootFormEditorItem() const; + + void reparentItem(const QmlItemNode &node, const QmlItemNode &newParent); + + PaintMode paintMode() const; + void setPaintMode(PaintMode paintMode); + + void clearFormEditorItems(); + +protected: + void dropEvent(QGraphicsSceneDragDropEvent * event); + void dragEnterEvent(QGraphicsSceneDragDropEvent * event); + void dragLeaveEvent(QGraphicsSceneDragDropEvent * event); + void dragMoveEvent(QGraphicsSceneDragDropEvent * event); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); + + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + + void keyPressEvent(QKeyEvent *keyEvent); + void keyReleaseEvent(QKeyEvent *keyEvent); + +private: + QList removeLayerItems(const QList &itemList); + + AbstractFormEditorTool* currentTool() const; + void removeItemFromHash(FormEditorItem*); + + FormEditorView *m_editorView; + AbstractFormEditorTool *m_currentTool; + QHash m_qmlItemNodeItemHash; + QWeakPointer m_formLayerItem; + QWeakPointer m_manipulatorLayerItem; + ModelNode m_dragNode; + PaintMode m_paintMode; +}; + + + + +} +#endif //FORMEDITORSCENE_H + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.cpp new file mode 100644 index 0000000000..8fe38a042e --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.cpp @@ -0,0 +1,38 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditorsubwindow.h" + +namespace QmlDesigner { + +FormEditorSubWindow::FormEditorSubWindow() +{ +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.h b/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.h new file mode 100644 index 0000000000..9376d73b89 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorsubwindow.h @@ -0,0 +1,45 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORSUBWINDOW_H +#define FORMEDITORSUBWINDOW_H + +#include + +namespace QmlDesigner { + +class FormEditorSubWindow : public QMdiSubWindow +{ +public: + FormEditorSubWindow(); +}; + +} // namespace QmlDesigner + +#endif // FORMEDITORSUBWINDOW_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp new file mode 100644 index 0000000000..7da0cb9ed5 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -0,0 +1,531 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "selectiontool.h" +#include "movetool.h" +#include "resizetool.h" +#include "anchortool.h" +#include "dragtool.h" +#include "itemcreatortool.h" +#include "formeditorview.h" +#include "formeditorwidget.h" +#include "formeditornodeinstanceview.h" +#include "formeditoritem.h" +#include "formeditorscene.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QmlDesigner { + +FormEditorView::FormEditorView(QObject *parent) + : QmlModelView(parent), + m_formEditorWidget(new FormEditorWidget(this)), + m_scene(new FormEditorScene(m_formEditorWidget.data(), this)), + m_moveTool(new MoveTool(this)), + m_selectionTool(new SelectionTool(this)), + m_resizeTool(new ResizeTool(this)), + m_anchorTool(new AnchorTool(this)), + m_dragTool(new DragTool(this)), + m_itemCreatorTool(new ItemCreatorTool(this)), + m_currentTool(m_selectionTool) +{ + connect(widget()->zoomAction(), SIGNAL(zoomLevelChanged(double)), SLOT(updateGraphicsIndicators())); +} + +FormEditorScene* FormEditorView::scene() const +{ + return m_scene.data(); +} + +FormEditorView::~FormEditorView() +{ + delete m_selectionTool; + m_selectionTool = 0; + delete m_moveTool; + m_moveTool = 0; + delete m_resizeTool; + m_resizeTool = 0; + delete m_anchorTool; + m_anchorTool = 0; + delete m_dragTool; + m_dragTool = 0; + + + // delete scene after tools to prevent double deletion + // of items + delete m_scene.data(); + delete m_formEditorWidget.data(); +} + +void FormEditorView::modelAttached(Model *model) +{ + Q_ASSERT(model); + + QmlModelView::modelAttached(model); + + Q_ASSERT(m_scene->formLayerItem()); + + if (rootQmlObjectNode().toQmlItemNode().isValid()) + setupFormEditorItemTree(rootQmlObjectNode().toQmlItemNode()); +} + + +//This method does the setup of the inital FormEditorItem tree in the scene +void FormEditorView::setupFormEditorItemTree(const QmlItemNode &qmlItemNode) +{ + m_scene->addFormEditorItem(qmlItemNode); + + foreach (const QmlItemNode &nextNode, qmlItemNode.children()) //TODO instance children + setupFormEditorItemTree(nextNode); +} + +void FormEditorView::nodeCreated(const ModelNode &createdNode) +{ + QmlModelView::nodeCreated(createdNode); + ModelNode node(createdNode); + if (QmlItemNode(node).isValid()) //only setup QmlItems + setupFormEditorItemTree(QmlItemNode(node)); +} + +void FormEditorView::modelAboutToBeDetached(Model *model) +{ + m_selectionTool->clear(); + m_moveTool->clear(); + m_resizeTool->clear(); + m_anchorTool->clear(); + m_dragTool->clear(); + m_scene->clearFormEditorItems(); + + QmlModelView::modelAboutToBeDetached(model); +} + +void FormEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) +{ + QmlItemNode qmlItemNode(removedNode); + + if (qmlItemNode.isValid()) { + + FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode); + + QList nodeList; + nodeList.append(qmlItemNode.allSubModelNodes()); + nodeList.append(qmlItemNode); + + QList removedItemList; + removedItemList.append(scene()->itemsForQmlItemNodes(nodeList)); + m_currentTool->itemsAboutToRemoved(removedItemList); + + delete item; + } + + QmlModelView::nodeAboutToBeRemoved(removedNode); +} + + void FormEditorView::nodeTypeChanged(const ModelNode &node,const QString &type, int majorVersion, int minorVersion) + { + QmlItemNode oldItemNode(node); + if (oldItemNode.isValid() && m_scene->hasItemForQmlItemNode(oldItemNode)) { + FormEditorItem *item = m_scene->itemForQmlItemNode(oldItemNode); + + QList nodeList; + nodeList.append(oldItemNode.allSubModelNodes()); + nodeList.append(oldItemNode); + + QList removedItemList; + removedItemList.append(scene()->itemsForQmlItemNodes(nodeList)); + m_currentTool->itemsAboutToRemoved(removedItemList); + + delete item; + } + + QmlModelView::nodeTypeChanged(node, type, majorVersion, minorVersion); + + QmlItemNode newItemNode(node); + if (newItemNode.isValid()) //only setup QmlItems + setupFormEditorItemTree(newItemNode); + } + +void FormEditorView::propertiesAboutToBeRemoved(const QList& propertyList) +{ + QmlModelView::propertiesAboutToBeRemoved(propertyList); +} +void FormEditorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) +{ + QmlModelView::nodeReparented(node, newPropertyParent, oldPropertyParent, propertyChange); +} + +void FormEditorView::variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) +{ + QmlModelView::variantPropertiesChanged(propertyList, propertyChange); +} + +void FormEditorView::bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) +{ + QmlModelView::bindingPropertiesChanged(propertyList, propertyChange); +} + +FormEditorWidget *FormEditorView::widget() const +{ + Q_ASSERT(!m_formEditorWidget.isNull()); + return m_formEditorWidget.data(); +} + +void FormEditorView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) +{ + nodeInstanceView()->nodeIdChanged(node, newId, oldId); +} + +void FormEditorView::selectedNodesChanged(const QList &selectedNodeList, + const QList &lastSelectedNodeList) +{ + QmlModelView::selectedNodesChanged(selectedNodeList, lastSelectedNodeList); + + m_currentTool->setItems(scene()->itemsForQmlItemNodes(toQmlItemNodeList(selectedNodeList))); + if (scene()->paintMode() == FormEditorScene::AnchorMode) { + foreach (FormEditorItem *item, m_scene->itemsForQmlItemNodes(toQmlItemNodeList(selectedNodeList))) + item->update(); + + foreach (FormEditorItem *item, m_scene->itemsForQmlItemNodes(toQmlItemNodeList(lastSelectedNodeList))) + item->update(); + } + + m_scene->update(); +} + +AbstractFormEditorTool* FormEditorView::currentTool() const +{ + return m_currentTool; +} + +void FormEditorView::changeToMoveTool() +{ + if (m_currentTool == m_moveTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::SizeAllCursor); + m_currentTool->clear(); + m_currentTool = m_moveTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + +void FormEditorView::changeToDragTool() +{ + if (m_currentTool == m_dragTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::ArrowCursor); + setCurrentState(baseState()); + m_currentTool->clear(); + m_currentTool = m_dragTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + + +void FormEditorView::changeToMoveTool(const QPointF &beginPoint) +{ + if (m_currentTool == m_moveTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::SizeAllCursor); + m_currentTool->clear(); + m_currentTool = m_moveTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); + m_moveTool->beginWithPoint(beginPoint); +} + +void FormEditorView::changeToSelectionTool() +{ + if (m_currentTool == m_selectionTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::ArrowCursor); + m_currentTool->clear(); + m_currentTool = m_selectionTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + +void FormEditorView::changeToItemCreatorTool() +{ + if(m_currentTool == m_itemCreatorTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::CrossCursor); + setCurrentState(baseState()); + m_currentTool->clear(); + m_currentTool = m_itemCreatorTool; + m_currentTool->clear(); + setSelectedQmlItemNodes(QList()); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + +void FormEditorView::changeToSelectionTool(QGraphicsSceneMouseEvent *event) +{ + if (m_currentTool == m_selectionTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::ArrowCursor); + m_currentTool->clear(); + m_currentTool = m_selectionTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); + + m_selectionTool->selectUnderPoint(event); +} + +void FormEditorView::changeToResizeTool() +{ + if (m_currentTool == m_resizeTool) + return; + + scene()->setPaintMode(FormEditorScene::NormalMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::ArrowCursor); + m_currentTool->clear(); + m_currentTool = m_resizeTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + +void FormEditorView::changeToAnchorTool() +{ + if (m_currentTool == m_anchorTool) + return; + + scene()->setPaintMode(FormEditorScene::AnchorMode); + m_scene->updateAllFormEditorItems(); + setCursor(Qt::ArrowCursor); + m_currentTool->clear(); + m_currentTool = m_anchorTool; + m_currentTool->clear(); + m_currentTool->setItems(scene()->itemsForQmlItemNodes(selectedQmlItemNodes())); +} + +void FormEditorView::changeToTransformTools() +{ + if (m_currentTool == m_moveTool || + m_currentTool == m_resizeTool || + m_currentTool == m_selectionTool) + return; + + changeToSelectionTool(); +} + +void FormEditorView::setCursor(const QCursor &cursor) +{ + m_formEditorWidget->setCursor(cursor); +} + +bool FormEditorView::isSnapButtonChecked() const +{ + return m_formEditorWidget->isSnapButtonChecked(); +} + + +void FormEditorView::nodeSlidedToIndex(const NodeListProperty &listProperty, int /*newIndex*/, int /*oldIndex*/) +{ + QList newOrderModelNodeList = listProperty.toModelNodeList(); + foreach(const ModelNode &node, newOrderModelNodeList) { + FormEditorItem *item = m_scene->itemForQmlItemNode(QmlItemNode(node)); + if (item) { + FormEditorItem *oldParentItem = item->parentItem(); + item->setParentItem(0); + item->setParentItem(oldParentItem); + } + } + + m_currentTool->formEditorItemsChanged(scene()->allFormEditorItems()); +} + +void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data) +{ + QmlModelView::auxiliaryDataChanged(node, name, data); + if (name == "invisible") { + FormEditorItem *item(m_scene->itemForQmlItemNode(QmlItemNode(node))); + bool isInvisible = data.toBool(); + item->setVisible(!isInvisible); + ModelNode newNode(node); + if (isInvisible) + newNode.deselectNode(); + } +} + +double FormEditorView::margins() const +{ + return m_formEditorWidget->margins(); +} + +double FormEditorView::spacing() const +{ + return m_formEditorWidget->spacing(); +} + +void FormEditorView::activateItemCreator(const QString &name) +{ + if (m_currentTool == m_itemCreatorTool) { + m_itemCreatorTool->setItemString(name); + return; + } + changeToItemCreatorTool(); + m_itemCreatorTool->setItemString(name); +} + +void FormEditorView::deActivateItemCreator() +{ + if (m_currentTool == m_itemCreatorTool) { + changeToSelectionTool(); + emit ItemCreatorDeActivated(); + } +} + +QList FormEditorView::adjustStatesForModelNodes(const QList &nodeList) const +{ + QList adjustedNodeList; + foreach (const ModelNode &node, nodeList) + adjustedNodeList.append(node); + + return adjustedNodeList; +} + +QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode) +{ + QmlObjectNode qmlObjectNode = firstQmlObjectNode; + + while (true) { + QmlItemNode itemNode = qmlObjectNode.toQmlItemNode(); + if (itemNode.isValid()) + return itemNode; + if (qmlObjectNode.hasInstanceParent()) + qmlObjectNode = qmlObjectNode.instanceParent(); + else + break; + } + + return QmlItemNode(); +} + +void FormEditorView::transformChanged(const QmlObjectNode &qmlObjectNode) +{ + QmlItemNode itemNode = qmlObjectNode.toQmlItemNode(); + if (itemNode.isValid() && scene()->hasItemForQmlItemNode(itemNode)) { + m_scene->synchronizeTransformation(itemNode); + m_currentTool->formEditorItemsChanged(QList() << m_scene->itemForQmlItemNode(itemNode)); + } +} + +void FormEditorView::parentChanged(const QmlObjectNode &qmlObjectNode) +{ + QmlItemNode itemNode = qmlObjectNode.toQmlItemNode(); + QmlItemNode parentNode = qmlObjectNode.instanceParent().toQmlItemNode(); + if (itemNode.isValid() + && scene()->hasItemForQmlItemNode(itemNode) + && parentNode.isValid() + && scene()->hasItemForQmlItemNode(parentNode) + && scene()->itemForQmlItemNode(itemNode)->parentItem() != scene()->itemForQmlItemNode(parentNode)) { + scene()->synchronizeParent(itemNode); + m_currentTool->formEditorItemsChanged(QList() << m_scene->itemForQmlItemNode(itemNode)); + } +} + +void FormEditorView::otherPropertyChanged(const QmlObjectNode &qmlObjectNode) +{ + Q_ASSERT(qmlObjectNode.isValid()); + + QmlItemNode itemNode = findRecursiveQmlItemNode(qmlObjectNode); + + if (itemNode.isValid() && scene()->hasItemForQmlItemNode(itemNode)) { + m_scene->synchronizeOtherProperty(itemNode); + m_currentTool->formEditorItemsChanged(QList() << m_scene->itemForQmlItemNode(itemNode)); + } +} + +void FormEditorView::updateGraphicsIndicators() +{ + m_currentTool->formEditorItemsChanged(scene()->allFormEditorItems()); +} + +void FormEditorView::updateItem(const QmlObjectNode &qmlObjectNode) +{ + + Q_ASSERT(qmlObjectNode.isValid()); + + QmlItemNode itemNode = findRecursiveQmlItemNode(qmlObjectNode); + + if (itemNode.isValid() && scene()->hasItemForQmlItemNode(itemNode)) { + m_scene->synchronizeOtherProperty(itemNode); + m_currentTool->formEditorItemsChanged(QList() << m_scene->itemForQmlItemNode(itemNode)); + } +} + +void FormEditorView::stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState) +{ + QmlModelView::stateChanged(newQmlModelState, oldQmlModelState); + + + m_formEditorWidget->anchorToolAction()->setEnabled(newQmlModelState.isBaseState()); + + if (!newQmlModelState.isBaseState() && currentTool() == m_anchorTool) { + changeToTransformTools(); + m_formEditorWidget->transformToolAction()->setChecked(true); + } + +// FormEditorItem *item = m_scene->itemForQmlItemNode(fxObjectNode); +// +// m_currentTool->formEditorItemsChanged(itemList); +} + + +} + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h new file mode 100644 index 0000000000..82b6f18a75 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -0,0 +1,141 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORVIEW_H +#define FORMEDITORVIEW_H + +#include + +class QGraphicsScene; +class QGraphicsSceneMouseEvent; + +namespace QmlDesigner { + +class FormEditorWidget; +class FormEditorNodeInstanceView; +class FormEditorScene; +class NodeInstanceView; + +class AbstractFormEditorTool; +class MoveTool; +class SelectionTool; +class ResizeTool; +class AnchorTool; +class DragTool; +class ItemCreatorTool; +class ItemLibraryInfo; +class QmlItemNode; + +class FormEditorView : public QmlModelView +{ + Q_OBJECT + +public: + FormEditorView(QObject *parent); + ~FormEditorView(); + + // AbstractView + void modelAttached(Model *model); + void modelAboutToBeDetached(Model *model); + + void nodeCreated(const ModelNode &createdNode); + void nodeAboutToBeRemoved(const ModelNode &removedNode); + void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange); + void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId); + void propertiesAboutToBeRemoved(const QList& propertyList); + void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); + void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); + void nodeTypeChanged(const ModelNode &node,const QString &type, int majorVersion, int minorVersion); + + void selectedNodesChanged(const QList &selectedNodeList, + const QList &lastSelectedNodeList); + + // FormEditorView + FormEditorWidget *widget() const; + AbstractFormEditorTool *currentTool() const; + FormEditorScene *scene() const; + + void changeToMoveTool(); + void changeToMoveTool(const QPointF &beginPoint); + void changeToDragTool(); + void changeToSelectionTool(); + void changeToItemCreatorTool(); + void changeToSelectionTool(QGraphicsSceneMouseEvent *event); + void changeToResizeTool(); + void changeToAnchorTool(); + void changeToTransformTools(); + + void setCursor(const QCursor &cursor); + + bool isSnapButtonChecked() const; + + void nodeSlidedToIndex(const NodeListProperty &listProperty, int newIndex, int oldIndex); + void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); + + double margins() const; + double spacing() const; + void deActivateItemCreator(); + +public slots: + void activateItemCreator(const QString &name); + +signals: + void ItemCreatorDeActivated(); + +protected: + void transformChanged(const QmlObjectNode &qmlObjectNode); + void parentChanged(const QmlObjectNode &qmlObjectNode); + void otherPropertyChanged(const QmlObjectNode &qmlObjectNode); + void updateItem(const QmlObjectNode &qmlObjectNode); + void stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState); + +protected slots: + QList adjustStatesForModelNodes(const QList &nodeList) const; + void updateGraphicsIndicators(); + +private: //functions + void setupFormEditorItemTree(const QmlItemNode &qmlItemNode); + + +private: //variables + QWeakPointer m_formEditorWidget; + QWeakPointer m_scene; + MoveTool *m_moveTool; + SelectionTool *m_selectionTool; + ResizeTool *m_resizeTool; + AnchorTool *m_anchorTool; + DragTool *m_dragTool; + ItemCreatorTool *m_itemCreatorTool; + AbstractFormEditorTool *m_currentTool; + +}; + +} + +#endif //FORMEDITORVIEW_H diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp new file mode 100644 index 0000000000..5217711fa4 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -0,0 +1,221 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "formeditorwidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "numberseriesaction.h" + +namespace QmlDesigner { + +FormEditorWidget::FormEditorWidget(FormEditorView *view) + : QWidget(), + m_formEditorView(view) +{ + QFile file(":/qmldesigner/stylesheet.css"); + file.open(QFile::ReadOnly); + QString styleSheet = QLatin1String(file.readAll()); + setStyleSheet(styleSheet); + + QVBoxLayout *fillLayout = new QVBoxLayout(this); + fillLayout->setMargin(0); + fillLayout->setSpacing(0); + setLayout(fillLayout); + + m_toolActionGroup = new QActionGroup(this); + + m_transformToolAction = m_toolActionGroup->addAction("Transform Tool (Press Key Q)"); + m_transformToolAction->setShortcut(Qt::Key_Q); + m_transformToolAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + m_transformToolAction->setCheckable(true); + m_transformToolAction->setChecked(true); + m_transformToolAction->setIcon(QPixmap(":/icon/tool/transform.png")); + connect(m_transformToolAction.data(), SIGNAL(triggered(bool)), SLOT(changeTransformTool(bool))); + + m_anchorToolAction = m_toolActionGroup->addAction("Anchor Tool (Press Key W)"); + m_anchorToolAction->setShortcut(Qt::Key_W); + m_anchorToolAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + m_anchorToolAction->setCheckable(true); + m_anchorToolAction->setIcon(QPixmap(":/icon/tool/anchor.png")); + connect(m_anchorToolAction.data(), SIGNAL(triggered(bool)), SLOT(changeAnchorTool(bool))); + + addActions(m_toolActionGroup->actions()); + + QActionGroup *layoutActionGroup = new QActionGroup(this); + layoutActionGroup->setExclusive(false); + + m_snappingToolAction = layoutActionGroup->addAction("Toogle Snapping (Press Key E)"); + m_snappingToolAction->setShortcut(Qt::Key_E); + m_snappingToolAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + m_snappingToolAction->setCheckable(true); + m_snappingToolAction->setChecked(true); + m_snappingToolAction->setIcon(QPixmap(":/icon/layout/snapping.png")); + connect(m_snappingToolAction.data(), SIGNAL(triggered(bool)), SLOT(changeSnappingTool(bool))); + + m_snappingMarginAction = new NumberSeriesAction(layoutActionGroup); + m_snappingMarginAction->addEntry("no margins (0)", 0); + m_snappingMarginAction->addEntry("small margin (2)", 2); + m_snappingMarginAction->addEntry("medium margin (6)", 6); + m_snappingMarginAction->addEntry("all in margin (10)", 10); + m_snappingMarginAction->setCurrentEntryIndex(3); + layoutActionGroup->addAction(m_snappingMarginAction.data()); + addActions(layoutActionGroup->actions()); + + m_snappingSpacingAction = new NumberSeriesAction(layoutActionGroup); + m_snappingSpacingAction->addEntry("no spacing (0)", 0); + m_snappingSpacingAction->addEntry("small spacing (2)", 2); + m_snappingSpacingAction->addEntry("medium spacing (4)", 4); + m_snappingSpacingAction->addEntry("all in spacing (6)", 6); + m_snappingSpacingAction->setCurrentEntryIndex(1); + layoutActionGroup->addAction(m_snappingSpacingAction.data()); + + addActions(layoutActionGroup->actions()); + + m_zoomAction = new ZoomAction(toolActionGroup()); + connect(m_zoomAction.data(), SIGNAL(zoomLevelChanged(double)), SLOT(setZoomLevel(double))); + addAction(m_zoomAction.data()); + + QAction *separatorAction = new QAction(toolActionGroup()); + separatorAction->setSeparator(true); + addAction(separatorAction); + + m_toolBox = new ToolBox(this); + toolBox()->setActions(actions()); + fillLayout->addWidget(toolBox()); + + m_graphicsView = new FormEditorGraphicsView(this); + fillLayout->addWidget(m_graphicsView.data()); +} + +void FormEditorWidget::enterEvent(QEvent *event) +{ + setFocus(); + QWidget::enterEvent(event); +} + +void FormEditorWidget::changeTransformTool(bool checked) +{ + if (checked) + m_formEditorView->changeToTransformTools(); +} + +void FormEditorWidget::changeAnchorTool(bool checked) +{ + if (checked && m_formEditorView->currentState().isBaseState()) + m_formEditorView->changeToAnchorTool(); +} + +void FormEditorWidget::changeSnappingTool(bool /*checked*/) +{ + // TODO +} + +void FormEditorWidget::wheelEvent(QWheelEvent *event) +{ + if (event->modifiers().testFlag(Qt::ControlModifier)) { + if (event->delta() > 0) { + zoomAction()->zoomIn(); + } else { + zoomAction()->zoomOut(); + } + + event->accept(); + } else { + QWidget::wheelEvent(event); + } + +} + +ZoomAction *FormEditorWidget::zoomAction() const +{ + return m_zoomAction.data(); +} + +QAction *FormEditorWidget::anchorToolAction() const +{ + return m_anchorToolAction.data(); +} + +QAction *FormEditorWidget::transformToolAction() const +{ + return m_transformToolAction.data(); +} + +void FormEditorWidget::setZoomLevel(double zoomLevel) +{ + m_graphicsView->resetTransform(); + + m_graphicsView->scale(zoomLevel, zoomLevel); +} + +void FormEditorWidget::setScene(FormEditorScene *scene) +{ + m_graphicsView->setScene(scene); +} + +QActionGroup *FormEditorWidget::toolActionGroup() const +{ + return m_toolActionGroup.data(); +} + +ToolBox *FormEditorWidget::toolBox() const +{ + return m_toolBox.data(); +} + +bool FormEditorWidget::isSnapButtonChecked() const +{ + return m_snappingToolAction->isChecked(); +} + +double FormEditorWidget::spacing() const +{ + return m_snappingSpacingAction->currentValue().toDouble(); +} + +double FormEditorWidget::margins() const +{ + return m_snappingMarginAction->currentValue().toDouble(); +} + +} + + diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h new file mode 100644 index 0000000000..2a718507f8 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h @@ -0,0 +1,91 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef FORMEDITORWIDGET_H +#define FORMEDITORWIDGET_H + +#include + +class QActionGroup; + +namespace QmlDesigner { + +class ZoomAction; +class FormEditorView; +class FormEditorScene; +class FormEditorGraphicsView; +class ToolBox; +class NumberSeriesAction; + +class FormEditorWidget : public QWidget +{ + Q_OBJECT +public: + FormEditorWidget(FormEditorView *view); + bool isSnapButtonChecked() const; + + ZoomAction *zoomAction() const; + QAction *anchorToolAction() const; + QAction *transformToolAction() const; + + void setScene(FormEditorScene *scene); + ToolBox *toolBox() const; + + double spacing() const; + double margins() const; + + +protected: + void enterEvent(QEvent *event); + void wheelEvent(QWheelEvent *event); + QActionGroup *toolActionGroup() const; + +private slots: + void changeTransformTool(bool checked); + void changeAnchorTool(bool checked); + void setZoomLevel(double zoomLevel); + void changeSnappingTool(bool checked); + +private: + QWeakPointer m_formEditorView; + QWeakPointer m_graphicsView; + QWeakPointer m_zoomAction; + QWeakPointer m_anchorToolAction; + QWeakPointer m_transformToolAction; + QWeakPointer m_toolActionGroup; + QWeakPointer m_toolBox; + QWeakPointer m_snappingToolAction; + QWeakPointer m_snappingMarginAction; + QWeakPointer m_snappingSpacingAction; +}; + + +} +#endif //FORMEDITORWIDGET_H + diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp new file mode 100644 index 0000000000..9376ed18dc --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp @@ -0,0 +1,191 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "itemcreatortool.h" +#include "formeditorscene.h" +#include "formeditorview.h" + +#include +#include + +#include +#include +#include +#include + +namespace QmlDesigner { + +ItemCreatorTool::ItemCreatorTool(FormEditorView *editorView) + : AbstractFormEditorTool(editorView), + m_rubberbandSelectionManipulator(editorView->scene()->manipulatorLayerItem(), editorView) + +{ + +} + + +ItemCreatorTool::~ItemCreatorTool() +{ +} + +void ItemCreatorTool::mousePressEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + m_rubberbandSelectionManipulator.begin(event->scenePos()); + else + view()->deActivateItemCreator(); +} + +void ItemCreatorTool::mouseMoveEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent *event) +{ + view()->setCursor(Qt::CrossCursor); + if (m_rubberbandSelectionManipulator.isActive()) { + m_rubberbandSelectionManipulator.update(event->scenePos()); + } else { + + } +} + +void ItemCreatorTool::hoverMoveEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent * /*event*/) +{ +} + +void ItemCreatorTool::mouseReleaseEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + if (m_rubberbandSelectionManipulator.isActive()) { + QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->scenePos(); + if (mouseMovementVector.toPoint().manhattanLength() < QApplication::startDragDistance()) { + m_rubberbandSelectionManipulator.update(event->scenePos()); + } else { + m_rubberbandSelectionManipulator.update(event->scenePos()); + QRectF rect(m_rubberbandSelectionManipulator.beginPoint(), event->scenePos()); + createAtItem(rect); + m_rubberbandSelectionManipulator.end(); + view()->deActivateItemCreator(); + } + } + } else { + view()->deActivateItemCreator(); + } +} + +void ItemCreatorTool::mouseDoubleClickEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent * /*event*/) +{ + +} + +void ItemCreatorTool::keyPressEvent(QKeyEvent *event) +{ + switch(event->key()) { + case Qt::Key_Escape: + view()->deActivateItemCreator(); + break; + } +} + +void ItemCreatorTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/) +{ + +} + +void ItemCreatorTool::itemsAboutToRemoved(const QList &/*itemList*/) +{ + +} + +void ItemCreatorTool::clear() +{ + m_rubberbandSelectionManipulator.clear(); +} + +void ItemCreatorTool::selectedItemsChanged(const QList &/*itemList*/) +{ +} + +void ItemCreatorTool::formEditorItemsChanged(const QList &/*itemList*/) +{ +} + +void ItemCreatorTool::setItemString(const QString &itemString) +{ + m_itemString = itemString; +} + +FormEditorItem* ItemCreatorTool::calculateContainer(const QPointF &point) +{ + QList list = scene()->items(point); + foreach (QGraphicsItem *item, list) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem && formEditorItem->isContainer()) + return formEditorItem; + } + return 0; +} + +void ItemCreatorTool::createAtItem(const QRectF &rect) +{ + QPointF pos = rect.topLeft(); + + QmlItemNode parentNode = view()->rootQmlItemNode(); + FormEditorItem *parentItem = calculateContainer(pos); + if (parentItem) { + parentNode = parentItem->qmlItemNode(); + pos = parentItem->mapFromScene(pos); + } + + QStringList list = m_itemString.split("^"); + if (list.count() != 2) + return; + if (list.first() == "item") { + RewriterTransaction transaction = view()->beginRewriterTransaction(); + ItemLibraryInfo itemLibraryRepresentation = view()->model()->metaInfo().itemLibraryRepresentation(list.at(1)); + QmlItemNode newNode = view()->createQmlItemNode(itemLibraryRepresentation, pos, parentNode); + newNode.modelNode().variantProperty("width") = rect.width(); + newNode.modelNode().variantProperty("height") = rect.height(); + QList nodeList; + nodeList.append(newNode); + view()->setSelectedQmlItemNodes(nodeList); + } else if (list.first() == "image") { + RewriterTransaction transaction = view()->beginRewriterTransaction(); + QmlItemNode newNode = view()->createQmlItemNodeFromImage(list.at(1), pos, parentNode); + newNode.modelNode().variantProperty("width") = rect.width(); + newNode.modelNode().variantProperty("height") = rect.height(); + QList nodeList; + nodeList.append(newNode); + view()->setSelectedQmlItemNodes(nodeList); + } +} + +} //QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h new file mode 100644 index 0000000000..c266103905 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h @@ -0,0 +1,82 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ITEMCREATORTOOL_H +#define ITEMCREATORTOOL_H + + +#include "abstractformeditortool.h" +#include "rubberbandselectionmanipulator.h" + +#include + + +namespace QmlDesigner { + + +class ItemCreatorTool : public AbstractFormEditorTool +{ +public: + ItemCreatorTool(FormEditorView* editorView); + ~ItemCreatorTool(); + + void mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *keyEvent); + + void itemsAboutToRemoved(const QList &itemList); + + void clear(); + + void selectedItemsChanged(const QList &itemList); + + void formEditorItemsChanged(const QList &itemList); + + void setItemString(const QString &itemString); + + FormEditorItem* calculateContainer(const QPointF &point); + + void createAtItem(const QRectF &rect); + +private: + RubberBandSelectionManipulator m_rubberbandSelectionManipulator; + QString m_itemString; +}; + +} +#endif // ITEMCREATORTOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.cpp b/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.cpp new file mode 100644 index 0000000000..405b617e9d --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.cpp @@ -0,0 +1,78 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "itemutilfunctions.h" +#include +#include + +#include +#include + +namespace QmlDesigner { + +class FormEditorItem; + +QRectF boundingRectForItemList(QList itemList) +{ + QRectF boundingRect; + + foreach (FormEditorItem *item, itemList) + { + boundingRect = boundingRect.united(item->mapToScene(item->qmlItemNode().instanceBoundingRect()).boundingRect()); + } + + return boundingRect; +} + +//ModelNode parentNodeSemanticallyChecked(const ModelNode &childNode, const ModelNode &parentNode) +//{ +// if (ModelUtilities::canReparent(childNode, parentNode)) { +// ModelNode newParentNode; +// newParentNode = ModelUtilities::mapGraphicsViewToGraphicsScene(parentNode); +// if (newParentNode == childNode.parentNode()) +// return ModelNode(); +// if (ModelUtilities::isQWidget(childNode)) +// return ModelUtilities::reparentAndProxymize(childNode, newParentNode); +// else +// return parentNode; +// } +// +// return ModelNode(); +//} + +//FormEditorItem* mapGraphicsViewToGraphicsScene(FormEditorItem* item) +//{ +// if (item == 0) //null pointer +// return 0; +// ModelNode newNode = ModelUtilities::mapGraphicsViewToGraphicsScene(item->modelNode()); +// return item->scene()->itemForNode(newNode); +//} + + +} diff --git a/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.h b/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.h new file mode 100644 index 0000000000..95760f2cb8 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/itemutilfunctions.h @@ -0,0 +1,48 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef ITEMUTILFUNCTIONS_H +#define ITEMUTILFUNCTIONS_H + +#include +#include +#include "formeditoritem.h" + + +namespace QmlDesigner { + +QRectF boundingRectForItemList(QList itemList); + +ModelNode parentNodeSemanticallyChecked(const ModelNode &childNode, const ModelNode &parentNode); + +FormEditorItem* mapGraphicsViewToGraphicsScene(FormEditorItem* item); + +} + +#endif // ITEMUTILFUNCTIONS_H diff --git a/src/plugins/qmldesigner/components/formeditor/layeritem.cpp b/src/plugins/qmldesigner/components/formeditor/layeritem.cpp new file mode 100644 index 0000000000..5a94811531 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/layeritem.cpp @@ -0,0 +1,73 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "layeritem.h" + +#include + + +namespace QmlDesigner { + +LayerItem::LayerItem(FormEditorScene* scene) + : QGraphicsObject() +{ + scene->addItem(this); + setZValue(1); + setFlag(QGraphicsItem::ItemIsMovable, false); +} + +LayerItem::~LayerItem() +{ +} + +void LayerItem::paint(QPainter * /*painter*/, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) +{ +} + +QRectF LayerItem::boundingRect() const +{ + return childrenBoundingRect(); +} + +QList LayerItem::findAllChildItems() const +{ + return findAllChildItems(this); +} + +QList LayerItem::findAllChildItems(const QGraphicsItem *item) const +{ + QList itemList(item->childItems()); + + foreach (QGraphicsItem *childItem, item->childItems()) + itemList += findAllChildItems(childItem); + + return itemList; +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/layeritem.h b/src/plugins/qmldesigner/components/formeditor/layeritem.h new file mode 100644 index 0000000000..09881a065c --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/layeritem.h @@ -0,0 +1,66 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef LAYERITEM_H +#define LAYERITEM_H + +#include +#include + +namespace QmlDesigner { + +class FormEditorScene; + +class LayerItem : public QGraphicsObject +{ +public: + enum + { + Type = 0xEAAA + }; + LayerItem(FormEditorScene* scene); + ~LayerItem(); + void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + QRectF boundingRect() const; + int type() const; + + QList findAllChildItems() const; + +protected: + QList findAllChildItems(const QGraphicsItem *item) const; +}; + +inline int LayerItem::type() const +{ + return Type; +} + +} + +#endif // LAYERITEM_H diff --git a/src/plugins/qmldesigner/components/formeditor/manipulatorlayeritem.h b/src/plugins/qmldesigner/components/formeditor/manipulatorlayeritem.h new file mode 100644 index 0000000000..215d1702fe --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/manipulatorlayeritem.h @@ -0,0 +1,39 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef MANIPULATORLAYERITEM_H +#define MANIPULATORLAYERITEM_H + +class ManipulatorLayerItem +{ +public: + ManipulatorLayerItem(); +}; + +#endif // MANIPULATORLAYERITEM_H diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp new file mode 100644 index 0000000000..fe0ca9893a --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -0,0 +1,363 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "movemanipulator.h" +#include "itemutilfunctions.h" +#include "layeritem.h" +#include "formeditoritem.h" +#include "formeditorscene.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + + +namespace QmlDesigner { + +MoveManipulator::MoveManipulator(LayerItem *layerItem, FormEditorView *view) + : m_layerItem(layerItem), + m_view(view), + m_isActive(false) +{ +} + +MoveManipulator::~MoveManipulator() +{ + deleteSnapLines(); +} + +QPointF MoveManipulator::beginPoint() const +{ + return m_beginPoint; +} + +void MoveManipulator::setItem(FormEditorItem* item) +{ + QList itemList; + itemList.append(item); + + setItems(itemList); +} + +void MoveManipulator::setItems(const QList &itemList) +{ + m_itemList = itemList; + if (!m_itemList.isEmpty()) { + if (m_itemList.first()->parentItem()) + m_snapper.setContainerFormEditorItem(m_itemList.first()->parentItem()); + else + m_snapper.setContainerFormEditorItem(m_itemList.first()); + m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); + } +} + +void MoveManipulator::updateHashes() +{ +// foreach (FormEditorItem* item, m_itemList) +// m_beginItemRectHash[item] = item->mapRectToParent(item->qmlItemNode().instanceBoundingRect()); + + foreach (FormEditorItem* item, m_itemList) { + QPointF positionInParentSpace = m_snapper.containerFormEditorItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item)); + m_beginItemRectHash[item].translate(positionInParentSpace - m_beginPositionHash.value(item)); + m_beginPositionHash.insert(item, positionInParentSpace); + } +} + +bool MoveManipulator::itemsCanReparented() const +{ + foreach (FormEditorItem* item, m_itemList) { + if (!item->qmlItemNode().canReparent()) + return false; + } + + return true; +} + +void MoveManipulator::begin(const QPointF &beginPoint) +{ + m_isActive = true; + + m_snapper.updateSnappingLines(m_itemList); + + + foreach (FormEditorItem* item, m_itemList) + m_beginItemRectHash.insert(item, m_snapper.containerFormEditorItem()->mapRectFromItem(item, item->qmlItemNode().instanceBoundingRect())); + + foreach (FormEditorItem* item, m_itemList) { + QPointF positionInParentSpace(item->qmlItemNode().instancePosition()); + QPointF positionInScenesSpace = m_snapper.containerFormEditorItem()->mapToScene(positionInParentSpace); + m_beginPositionInSceneSpaceHash.insert(item, positionInScenesSpace); + } + + foreach (FormEditorItem* item, m_itemList) { + QPointF positionInParentSpace = m_snapper.containerFormEditorItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item)); + m_beginPositionHash.insert(item, positionInParentSpace); + + QmlAnchors anchors(item->qmlItemNode().anchors()); + m_beginTopMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Top)); + m_beginLeftMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Left)); + m_beginRightMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Right)); + m_beginBottomMarginHash.insert(item, anchors.instanceMargin(AnchorLine::Bottom)); + m_beginHorizontalCenterHash.insert(item, anchors.instanceMargin(AnchorLine::HorizontalCenter)); + m_beginVerticalCenterHash.insert(item, anchors.instanceMargin(AnchorLine::VerticalCenter)); + } + + m_beginPoint = beginPoint; + +// setOpacityForAllElements(0.62); + + m_rewriterTransaction = m_view->beginRewriterTransaction(); +} + + + + + +QPointF MoveManipulator::findSnappingOffset(const QList &boundingRectList) +{ + QPointF offset; + + QMap verticalOffsetMap; + foreach (const QRectF &boundingRect, boundingRectList) { + double verticalOffset = m_snapper.snappedVerticalOffset(boundingRect); + if (verticalOffset < std::numeric_limits::max()) + verticalOffsetMap.insert(qAbs(verticalOffset), verticalOffset); + } + + + if (!verticalOffsetMap.isEmpty()) + offset.rx() = verticalOffsetMap.begin().value(); + + + + QMap horizontalOffsetMap; + foreach (const QRectF &boundingRect, boundingRectList) { + double horizontalOffset = m_snapper.snappedHorizontalOffset(boundingRect); + if (horizontalOffset < std::numeric_limits::max()) + horizontalOffsetMap.insert(qAbs(horizontalOffset), horizontalOffset); + } + + + if (!horizontalOffsetMap.isEmpty()) + offset.ry() = horizontalOffsetMap.begin().value(); + + return offset; +} + + +void MoveManipulator::generateSnappingLines(const QList &boundingRectList) +{ + m_graphicsLineList = m_snapper.generateSnappingLines(boundingRectList, + m_layerItem.data(), + m_snapper.transformtionSpaceFormEditorItem()->sceneTransform()); +} + + + +QList MoveManipulator::tanslatedBoundingRects(const QList &boundingRectList, const QPointF& offsetVector) +{ + QList translatedBoundingRectList; + foreach (const QRectF &boundingRect, boundingRectList) + translatedBoundingRectList.append(boundingRect.translated(offsetVector)); + + return translatedBoundingRectList; +} + + + +/* + /brief updates the position of the items. +*/ +void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping) +{ + deleteSnapLines(); //Since they position is changed and the item is moved the snapping lines are + //are obsolete. The new updated snapping lines (color and visibility) will be + //calculated in snapPoint() called in moveNode() later + + if (m_itemList.isEmpty()) { + return; + } else { + QPointF updatePointInContainerSpace(m_snapper.containerFormEditorItem()->mapFromScene(updatePoint)); + QPointF beginPointInContainerSpace(m_snapper.containerFormEditorItem()->mapFromScene(m_beginPoint)); + + QPointF offsetVector(updatePointInContainerSpace - beginPointInContainerSpace); + if (useSnapping == UseSnapping) { + offsetVector -= findSnappingOffset(tanslatedBoundingRects(m_beginItemRectHash.values(), offsetVector)); + generateSnappingLines(tanslatedBoundingRects(m_beginItemRectHash.values(), offsetVector)); + } + + foreach (FormEditorItem* item, m_itemList) { + QPointF positionInContainerSpace(m_beginPositionHash.value(item) + offsetVector); + QmlAnchors anchors(item->qmlItemNode().anchors()); + + if (anchors.instanceHasAnchor(AnchorLine::Top)) { + anchors.setMargin(AnchorLine::Top, m_beginTopMarginHash.value(item) + offsetVector.y()); + } + + if (anchors.instanceHasAnchor(AnchorLine::Left)) { + anchors.setMargin(AnchorLine::Left, m_beginLeftMarginHash.value(item) + offsetVector.x()); + } + + if (anchors.instanceHasAnchor(AnchorLine::Bottom)) { + anchors.setMargin(AnchorLine::Bottom, m_beginBottomMarginHash.value(item) - offsetVector.y()); + } + + if (anchors.instanceHasAnchor(AnchorLine::Right)) { + anchors.setMargin(AnchorLine::Right, m_beginRightMarginHash.value(item) - offsetVector.x()); + } + + if (anchors.instanceHasAnchor(AnchorLine::HorizontalCenter)) { + anchors.setMargin(AnchorLine::HorizontalCenter, m_beginHorizontalCenterHash.value(item) + offsetVector.x()); + } + + if (anchors.instanceHasAnchor(AnchorLine::VerticalCenter)) { + anchors.setMargin(AnchorLine::VerticalCenter, m_beginVerticalCenterHash.value(item) + offsetVector.y()); + } + + item->qmlItemNode().setPosition(positionInContainerSpace); + } + + + } +} + +void MoveManipulator::clear() +{ + deleteSnapLines(); + m_beginItemRectHash.clear(); + m_beginPositionHash.clear(); + m_beginPositionInSceneSpaceHash.clear(); + m_itemList.clear(); + + m_rewriterTransaction.commit(); + + m_beginTopMarginHash.clear(); + m_beginLeftMarginHash.clear(); + m_beginRightMarginHash.clear(); + m_beginBottomMarginHash.clear(); + m_beginHorizontalCenterHash.clear(); + m_beginVerticalCenterHash.clear(); +} + +void MoveManipulator::reparentTo(FormEditorItem *newParent) +{ + deleteSnapLines(); + + if (!newParent) + return; + + if (!itemsCanReparented()) + return; + + foreach (FormEditorItem* item, m_itemList) { + QmlItemNode parent(newParent->qmlItemNode()); + if (parent.isValid()) { + item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty("data")); + } + } + + if (m_view->model()) { + m_snapper.setContainerFormEditorItem(newParent); + m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); + m_snapper.updateSnappingLines(m_itemList); + updateHashes(); + } +} + + +void MoveManipulator::end(const QPointF &/*endPoint*/) +{ + m_isActive = false; + deleteSnapLines(); +// setOpacityForAllElements(1.0); + clear(); +} + +void MoveManipulator::moveBy(double deltaX, double deltaY) +{ + foreach (FormEditorItem* item, m_itemList) { + QmlAnchors anchors(item->qmlItemNode().anchors()); + + if (anchors.instanceHasAnchor(AnchorLine::Top)) { + anchors.setMargin(AnchorLine::Top, anchors.instanceMargin(AnchorLine::Top) - deltaY); + } + + if (anchors.instanceHasAnchor(AnchorLine::Left)) { + anchors.setMargin(AnchorLine::Left, anchors.instanceMargin(AnchorLine::Left) + deltaX); + } + + if (anchors.instanceHasAnchor(AnchorLine::Bottom)) { + anchors.setMargin(AnchorLine::Bottom, anchors.instanceMargin(AnchorLine::Bottom) + deltaY); + } + + if (anchors.instanceHasAnchor(AnchorLine::Right)) { + anchors.setMargin(AnchorLine::Right, anchors.instanceMargin(AnchorLine::Right) - deltaX); + } + + if (anchors.instanceHasAnchor(AnchorLine::HorizontalCenter)) { + anchors.setMargin(AnchorLine::HorizontalCenter, anchors.instanceMargin(AnchorLine::HorizontalCenter) + deltaX); + } + + if (anchors.instanceHasAnchor(AnchorLine::VerticalCenter)) { + anchors.setMargin(AnchorLine::VerticalCenter, anchors.instanceMargin(AnchorLine::VerticalCenter) + deltaY); + } + + item->qmlItemNode().setPosition(QPointF(item->qmlItemNode().instanceValue("x").toDouble() + deltaX, + item->qmlItemNode().instanceValue("y").toDouble() + deltaY)); + } +} + +void MoveManipulator::setOpacityForAllElements(qreal opacity) +{ + foreach (FormEditorItem* item, m_itemList) + item->setOpacity(opacity); +} + +void MoveManipulator::deleteSnapLines() +{ + if (m_layerItem) { + foreach (QGraphicsItem *item, m_graphicsLineList) + m_layerItem->scene()->removeItem(item); + } + m_graphicsLineList.clear(); + m_view->scene()->update(); +} + +bool MoveManipulator::isActive() const +{ + return m_isActive; +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h new file mode 100644 index 0000000000..3501625b4d --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h @@ -0,0 +1,114 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef MOVEMANIPULATOR_H +#define MOVEMANIPULATOR_H + +#include +#include +#include +#include +#include +#include + +#include "controlelement.h" +#include "formeditoritem.h" +#include "rewritertransaction.h" +#include "snapper.h" +#include "formeditorview.h" + +namespace QmlDesigner { + +class ModelNodeChangeSet; +class Model; + +class MoveManipulator +{ +public: + enum Snapping { + UseSnapping, + NoSnapping + }; + + MoveManipulator(LayerItem *layerItem, FormEditorView *view); + ~MoveManipulator(); + void setItems(const QList &itemList); + void setItem(FormEditorItem* item); + + void begin(const QPointF& beginPoint); + void update(const QPointF& updatePoint, Snapping useSnapping); + void reparentTo(FormEditorItem *newParent); + void end(const QPointF& endPoint); + + void moveBy(double deltaX, double deltaY); + + QPointF beginPoint() const; + + void clear(); + + bool isActive() const; + +protected: + void setOpacityForAllElements(qreal opacity); + + QPointF findSnappingOffset(const QList &boundingRectList); + + void deleteSnapLines(); + + QList tanslatedBoundingRects(const QList &boundingRectList, const QPointF& offset); + QPointF calculateBoundingRectMovementOffset(const QPointF& updatePoint); + QRectF boundingRect(FormEditorItem* item, const QPointF& updatePoint); + + void generateSnappingLines(const QList &boundingRectList); + void updateHashes(); + + bool itemsCanReparented() const; + +private: + Snapper m_snapper; + QWeakPointer m_layerItem; + QWeakPointer m_view; + QList m_itemList; + QHash m_beginItemRectHash; + QHash m_beginPositionHash; + QHash m_beginPositionInSceneSpaceHash; + QPointF m_beginPoint; + QHash m_beginTopMarginHash; + QHash m_beginLeftMarginHash; + QHash m_beginRightMarginHash; + QHash m_beginBottomMarginHash; + QHash m_beginHorizontalCenterHash; + QHash m_beginVerticalCenterHash; + QList m_graphicsLineList; + bool m_isActive; + RewriterTransaction m_rewriterTransaction; +}; + +} +#endif // MOVEMANIPULATOR_H diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp new file mode 100644 index 0000000000..09f5ec73c1 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -0,0 +1,345 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "movetool.h" + +#include "formeditorscene.h" +#include "formeditorview.h" +#include "modelutilities.h" +#include "itemutilfunctions.h" + +#include "resizehandleitem.h" + +#include +#include +#include + +namespace QmlDesigner { + +MoveTool::MoveTool(FormEditorView *editorView) + : AbstractFormEditorTool(editorView), + m_moveManipulator(editorView->scene()->manipulatorLayerItem(), editorView), + m_selectionIndicator(editorView->scene()->manipulatorLayerItem()), + m_resizeIndicator(editorView->scene()->manipulatorLayerItem()) +{ +// view()->setCursor(Qt::SizeAllCursor); +} + + +MoveTool::~MoveTool() +{ + +} + +void MoveTool::clear() +{ + m_moveManipulator.clear(); + m_movingItems.clear(); + m_selectionIndicator.clear(); + m_resizeIndicator.clear(); +} + +void MoveTool::mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) +{ + if (itemList.isEmpty()) + return; + m_movingItems = movingItems(items()); + if (m_movingItems.isEmpty()) + return; + + m_moveManipulator.setItems(m_movingItems); + m_moveManipulator.begin(event->scenePos()); +} + +void MoveTool::mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event) +{ + if (m_movingItems.isEmpty()) + return; + +// m_selectionIndicator.hide(); + m_resizeIndicator.hide(); + + FormEditorItem *containerItem = containerFormEditorItem(itemList, m_movingItems); + if (containerItem && + containerItem != m_movingItems.first()->parentItem() && + view()->currentState().isBaseState() && + !event->modifiers().testFlag(Qt::ShiftModifier)) { + + m_moveManipulator.reparentTo(containerItem); + } + + MoveManipulator::Snapping useSnapping = MoveManipulator::NoSnapping; + if (event->modifiers().testFlag(Qt::ControlModifier) != view()->isSnapButtonChecked()) + useSnapping = MoveManipulator::UseSnapping; + + m_moveManipulator.update(event->scenePos(), useSnapping); +} + +void MoveTool::hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent * /*event*/) +{ + if (itemList.isEmpty()) { + view()->changeToSelectionTool(); + return; + } + + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + if (resizeHandle) { + view()->changeToResizeTool(); + return; + } + + if (!topSelectedItemIsMovable(itemList)) { + view()->changeToSelectionTool(); + return; + } +} + +void MoveTool::keyPressEvent(QKeyEvent *event) +{ + switch(event->key()) { + case Qt::Key_Shift: + case Qt::Key_Alt: + case Qt::Key_Control: + case Qt::Key_AltGr: + event->setAccepted(false); + return; + } + + double moveStep = 1.0; + + if (event->modifiers().testFlag(Qt::ShiftModifier)) + moveStep = 10.0; + + if (!event->isAutoRepeat()) { + QList movableItems(movingItems(items())); + if (movableItems.isEmpty()) + return; + + m_moveManipulator.setItems(movableItems); +// m_selectionIndicator.hide(); + m_resizeIndicator.hide(); + } + + switch(event->key()) { + case Qt::Key_Left: m_moveManipulator.moveBy(-moveStep, 0.0); break; + case Qt::Key_Right: m_moveManipulator.moveBy(moveStep, 0.0); break; + case Qt::Key_Up: m_moveManipulator.moveBy(0.0, -moveStep); break; + case Qt::Key_Down: m_moveManipulator.moveBy(0.0, moveStep); break; + } + + +} + +void MoveTool::keyReleaseEvent(QKeyEvent *keyEvent) +{ + switch(keyEvent->key()) { + case Qt::Key_Shift: + case Qt::Key_Alt: + case Qt::Key_Control: + case Qt::Key_AltGr: + keyEvent->setAccepted(false); + return; + } + + if (!keyEvent->isAutoRepeat()) { + m_moveManipulator.clear(); +// m_selectionIndicator.show(); + m_resizeIndicator.show(); + } +} + +void MoveTool::mouseReleaseEvent(const QList &/*itemList*/, + QGraphicsSceneMouseEvent *event) +{ + if (m_movingItems.isEmpty()) + return; + + QLineF moveVector(event->scenePos(), m_moveManipulator.beginPoint()); + if (moveVector.length() < QApplication::startDragDistance()) + { + QPointF beginPoint(m_moveManipulator.beginPoint()); + + m_moveManipulator.end(beginPoint); + +// m_selectionIndicator.show(); + m_resizeIndicator.show(); + m_movingItems.clear(); + + view()->changeToSelectionTool(event); + } else { + m_moveManipulator.end(event->scenePos()); + + m_selectionIndicator.show(); + m_resizeIndicator.show(); + m_movingItems.clear(); + } +} + +void MoveTool::mouseDoubleClickEvent(const QList & /*itemList*/, + QGraphicsSceneMouseEvent * /*event*/) +{ + +} + +void MoveTool::itemsAboutToRemoved(const QList &removedItemList) +{ + foreach (FormEditorItem* removedItem, removedItemList) + m_movingItems.removeOne(removedItem); +} + +void MoveTool::selectedItemsChanged(const QList &itemList) +{ + m_selectionIndicator.setItems(movingItems(itemList)); + m_resizeIndicator.setItems(itemList); + updateMoveManipulator(); +} + +bool MoveTool::haveSameParent(const QList &itemList) +{ + if (itemList.isEmpty()) + return false; + + QGraphicsItem *firstParent = itemList.first()->parentItem(); + foreach (FormEditorItem* item, itemList) + { + if (firstParent != item->parentItem()) + return false; + } + + return true; +} + +bool MoveTool::isAncestorOfAllItems(FormEditorItem* maybeAncestorItem, + const QList &itemList) +{ + foreach (FormEditorItem* item, itemList) + { + if (!maybeAncestorItem->isAncestorOf(item) && item != maybeAncestorItem) + return false; + } + + return true; +} + + +FormEditorItem* MoveTool::ancestorIfOtherItemsAreChild(const QList &itemList) +{ + if (itemList.isEmpty()) + return 0; + + + foreach (FormEditorItem* item, itemList) + { + if (isAncestorOfAllItems(item, itemList)) + return item; + } + + return 0; +} + +void MoveTool::updateMoveManipulator() +{ + if (m_moveManipulator.isActive()) + return; +} + +void MoveTool::beginWithPoint(const QPointF &beginPoint) +{ + m_movingItems = movingItems(items()); + if (m_movingItems.isEmpty()) + return; + + m_moveManipulator.setItems(m_movingItems); + m_moveManipulator.begin(beginPoint); +} + +static bool isNotAncestorOfItemInList(FormEditorItem *formEditorItem, const QList &itemList) +{ + foreach (FormEditorItem *item, itemList) { + if (item->qmlItemNode().isAncestorOf(formEditorItem->qmlItemNode())) + return false; + } + + return true; +} + +FormEditorItem* MoveTool::containerFormEditorItem(const QList &itemUnderMouseList, + const QList &selectedItemList) +{ + Q_ASSERT(!selectedItemList.isEmpty()); + + foreach (QGraphicsItem* item, itemUnderMouseList) { + FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); + if (formEditorItem + && !selectedItemList.contains(formEditorItem) + && isNotAncestorOfItemInList(formEditorItem, selectedItemList)) + if (formEditorItem->isContainer()) { + return formEditorItem; + } + + } + + return 0; +} + + +QList MoveTool::movingItems(const QList &selectedItemList) +{ + FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(selectedItemList); + + if (ancestorItem != 0 && ancestorItem->qmlItemNode().isRootNode()) { +// view()->changeToSelectionTool(); + return QList(); + } + + + if (ancestorItem != 0 && ancestorItem->parentItem() != 0) { + QList ancestorItemList; + ancestorItemList.append(ancestorItem); + return ancestorItemList; + } + + if (!haveSameParent(selectedItemList)) { +// view()->changeToSelectionTool(); + return QList(); + } + + return selectedItemList; +} + +void MoveTool::formEditorItemsChanged(const QList &itemList) +{ + m_selectionIndicator.updateItems(itemList); + m_resizeIndicator.updateItems(itemList); +} + +} diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.h b/src/plugins/qmldesigner/components/formeditor/movetool.h new file mode 100644 index 0000000000..df3c65b791 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/movetool.h @@ -0,0 +1,97 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef MOVETOOL_H +#define MOVETOOL_H + +#include "abstractformeditortool.h" +#include "movemanipulator.h" +#include "selectionindicator.h" +#include "resizeindicator.h" + +#include + + +namespace QmlDesigner { + + +class MoveTool : public AbstractFormEditorTool +{ +public: + MoveTool(FormEditorView* editorView); + ~MoveTool(); + + void mousePressEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void hoverMoveEvent(const QList &itemList, + QGraphicsSceneMouseEvent *event); + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *keyEvent); + + void itemsAboutToRemoved(const QList &itemList); + + void selectedItemsChanged(const QList &itemList); + + void updateMoveManipulator(); + + + + void beginWithPoint(const QPointF &beginPoint); + + void clear(); + + void formEditorItemsChanged(const QList &itemList); + +protected: + static bool haveSameParent(const QList &itemList); + + static QList movingItems(const QList &selectedItemList); + + static FormEditorItem* containerFormEditorItem(const QList &itemUnderMouseList, + const QList &selectedItemList); + + static bool isAncestorOfAllItems(FormEditorItem* maybeAncestorItem, + const QList &itemList); + static FormEditorItem* ancestorIfOtherItemsAreChild(const QList &itemList); + +private: + MoveManipulator m_moveManipulator; + SelectionIndicator m_selectionIndicator; + ResizeIndicator m_resizeIndicator; + QList m_movingItems; +}; + +} +#endif // MOVETOOL_H diff --git a/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp new file mode 100644 index 0000000000..ba6354f01d --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp @@ -0,0 +1,88 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "numberseriesaction.h" +#include +#include +#include + + +namespace QmlDesigner { + +NumberSeriesAction::NumberSeriesAction(QObject *parent) : + QWidgetAction(parent), + m_comboBoxModelIndex(-1) +{ +} + +void NumberSeriesAction::addEntry(const QString &text, const QVariant &value) +{ + if (m_comboBoxModel.isNull()) + m_comboBoxModel = new QStandardItemModel(this); + + QStandardItem *newItem = new QStandardItem(text); + newItem->setData(value); + m_comboBoxModel->appendRow(newItem); +} + +QVariant NumberSeriesAction::currentValue() const +{ + return m_comboBoxModel->item(m_comboBoxModelIndex)->data(); +} + +QWidget *NumberSeriesAction::createWidget(QWidget *parent) +{ + QComboBox *comboBox = new QComboBox(parent); + + comboBox->setModel(m_comboBoxModel.data()); + + comboBox->setCurrentIndex(m_comboBoxModelIndex); + connect(comboBox, SIGNAL(currentIndexChanged(int)), SLOT(emitValueChanged(int))); + + return comboBox; +} + +void NumberSeriesAction::emitValueChanged(int index) +{ + if (index == -1) + return; + + m_comboBoxModelIndex = index; + + emit valueChanged(m_comboBoxModel.data()->item(index)->data()); +} + +void NumberSeriesAction::setCurrentEntryIndex(int index) +{ + Q_ASSERT(index < m_comboBoxModel->rowCount()); + + m_comboBoxModelIndex = index; +} + +} // namespace QKinecticDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/numberseriesaction.h b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.h new file mode 100644 index 0000000000..e6a8c82f16 --- /dev/null +++ b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.h @@ -0,0 +1,66 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +***********************************************************************