#include "qdeclarativedesignview.h" #include "qdeclarativedesigndebugserver.h" #include "selectiontool.h" #include "zoomtool.h" #include "colorpickertool.h" #include "layeritem.h" #include "boundingrecthighlighter.h" #include "subcomponenteditortool.h" #include "qmltoolbar.h" #include #include #include #include #include #include #include namespace QmlViewer { Q_GLOBAL_STATIC(QDeclarativeDesignDebugServer, qmlDesignDebugServer) QDeclarativeDesignView::QDeclarativeDesignView(QWidget *parent) : QDeclarativeView(parent), m_designModeBehavior(false), m_executionPaused(false), m_slowdownFactor(1.0f), m_toolbar(0) { m_manipulatorLayer = new LayerItem(scene()); m_selectionTool = new SelectionTool(this); m_zoomTool = new ZoomTool(this); m_colorPickerTool = new ColorPickerTool(this); m_boundingRectHighlighter = new BoundingRectHighlighter(this); m_subcomponentEditorTool = new SubcomponentEditorTool(this); m_currentTool = m_selectionTool; setMouseTracking(true); connect(qmlDesignDebugServer(), SIGNAL(reloadRequested()), SLOT(reloadView())); connect(qmlDesignDebugServer(), SIGNAL(currentObjectsChanged(QList)), SLOT(onCurrentObjectsChanged(QList))); connect(qmlDesignDebugServer(), SIGNAL(animationSpeedChangeRequested(qreal)), SLOT(changeAnimationSpeed(qreal))); connect(qmlDesignDebugServer(), SIGNAL(colorPickerToolRequested()), SLOT(changeToColorPickerTool())); connect(qmlDesignDebugServer(), SIGNAL(selectMarqueeToolRequested()), SLOT(changeToMarqueeSelectTool())); connect(qmlDesignDebugServer(), SIGNAL(selectToolRequested()), SLOT(changeToSingleSelectTool())); connect(qmlDesignDebugServer(), SIGNAL(zoomToolRequested()), SLOT(changeToZoomTool())); connect(this, SIGNAL(designModeBehaviorChanged(bool)), SLOT(setDesignModeBehavior(bool))); connect(this, SIGNAL(statusChanged(QDeclarativeView::Status)), SLOT(onStatusChanged(QDeclarativeView::Status))); connect(m_colorPickerTool, SIGNAL(selectedColorChanged(QColor)), SIGNAL(selectedColorChanged(QColor))); createToolbar(); } QDeclarativeDesignView::~QDeclarativeDesignView() { } void QDeclarativeDesignView::reloadView() { m_subcomponentEditorTool->clear(); clearHighlightBoundingRect(); emit reloadRequested(); } void QDeclarativeDesignView::mousePressEvent(QMouseEvent *event) { if (!designModeBehavior()) { QDeclarativeView::mousePressEvent(event); return; } m_cursorPos = event->pos(); m_currentTool->mousePressEvent(event); } void QDeclarativeDesignView::mouseMoveEvent(QMouseEvent *event) { if (!designModeBehavior()) { QDeclarativeView::mouseMoveEvent(event); return; } m_cursorPos = event->pos(); QList selItems = selectableItems(event->pos()); if (!selItems.isEmpty()) { setToolTip(AbstractFormEditorTool::titleForItem(selItems.first())); } else { setToolTip(QString()); } if (event->buttons()) { m_subcomponentEditorTool->mouseMoveEvent(event); m_currentTool->mouseMoveEvent(event); } else { m_subcomponentEditorTool->hoverMoveEvent(event); m_currentTool->hoverMoveEvent(event); } } void QDeclarativeDesignView::mouseReleaseEvent(QMouseEvent *event) { if (!designModeBehavior()) { QDeclarativeView::mouseReleaseEvent(event); return; } m_subcomponentEditorTool->mouseReleaseEvent(event); m_cursorPos = event->pos(); m_currentTool->mouseReleaseEvent(event); if (event->buttons() & Qt::LeftButton) { qDebug() << "setting current objects"; qmlDesignDebugServer()->setCurrentObjects(AbstractFormEditorTool::toObjectList(selectedItems())); } } void QDeclarativeDesignView::keyPressEvent(QKeyEvent *event) { if (!designModeBehavior()) { QDeclarativeView::keyPressEvent(event); return; } m_currentTool->keyPressEvent(event); } void QDeclarativeDesignView::keyReleaseEvent(QKeyEvent *event) { if (!designModeBehavior()) { QDeclarativeView::keyReleaseEvent(event); return; } switch(event->key()) { case Qt::Key_V: changeToSingleSelectTool(); break; case Qt::Key_M: changeToMarqueeSelectTool(); break; case Qt::Key_Enter: case Qt::Key_Return: if (!selectedItems().isEmpty()) m_subcomponentEditorTool->setCurrentItem(selectedItems().first()); break; case Qt::Key_Space: if (m_executionPaused) { continueExecution(m_slowdownFactor); } else { pauseExecution(); } break; default: break; } m_currentTool->keyReleaseEvent(event); } QGraphicsItem *QDeclarativeDesignView::currentRootItem() const { return m_subcomponentEditorTool->currentRootItem(); } void QDeclarativeDesignView::mouseDoubleClickEvent(QMouseEvent *event) { if (!designModeBehavior()) { QDeclarativeView::mouseDoubleClickEvent(event); return; } QGraphicsItem *itemToEnter = 0; QList itemList = selectableItems(event->pos()); if (selectedItems().isEmpty() && !itemList.isEmpty()) { itemToEnter = itemList.first(); } else if (!selectedItems().isEmpty() && !itemList.isEmpty()) { itemToEnter = itemList.first(); } m_subcomponentEditorTool->setCurrentItem(itemToEnter); m_subcomponentEditorTool->mouseDoubleClickEvent(event); if ((event->buttons() & Qt::LeftButton) && itemToEnter) { QGraphicsObject *objectToEnter = itemToEnter->toGraphicsObject(); if (objectToEnter) qmlDesignDebugServer()->setCurrentObjects(QList() << objectToEnter); } } void QDeclarativeDesignView::wheelEvent(QWheelEvent *event) { if (!m_designModeBehavior) { QDeclarativeView::wheelEvent(event); return; } m_currentTool->wheelEvent(event); } void QDeclarativeDesignView::setDesignModeBehavior(bool value) { m_designModeBehavior = value; if (m_subcomponentEditorTool) { m_subcomponentEditorTool->clear(); clearHighlightBoundingRect(); if (rootObject()) m_subcomponentEditorTool->pushContext(rootObject()); } } bool QDeclarativeDesignView::designModeBehavior() const { return m_designModeBehavior; } void QDeclarativeDesignView::changeTool(Constants::DesignTool tool, Constants::ToolFlags /*flags*/) { switch(tool) { case Constants::SelectionToolMode: changeToSingleSelectTool(); break; case Constants::NoTool: default: m_currentTool = 0; break; } } void QDeclarativeDesignView::setSelectedItems(QList items) { m_currentSelection = items; m_currentTool->setItems(items); } QList QDeclarativeDesignView::selectedItems() const { return m_currentSelection; } AbstractFormEditorTool *QDeclarativeDesignView::currentTool() const { return m_currentTool; } void QDeclarativeDesignView::clearHighlightBoundingRect() { m_boundingRectHighlighter->clear(); } void QDeclarativeDesignView::highlightBoundingRect(QGraphicsItem *item) { if (!item) return; m_boundingRectHighlighter->highlight(item->toGraphicsObject()); } bool QDeclarativeDesignView::mouseInsideContextItem() const { return m_subcomponentEditorTool->containsCursor(m_cursorPos.toPoint()); } QList QDeclarativeDesignView::selectableItems(const QPointF &scenePos) const { QList itemlist = scene()->items(scenePos); return filteredItemList(itemlist); } QList QDeclarativeDesignView::selectableItems(const QPoint &pos) const { QList itemlist = items(pos); return filteredItemList(itemlist); } QList QDeclarativeDesignView::selectableItems(const QRectF &sceneRect, Qt::ItemSelectionMode selectionMode) const { QList itemlist = scene()->items(sceneRect, selectionMode); return filteredItemList(itemlist); } void QDeclarativeDesignView::changeToSingleSelectTool() { //qDebug() << "changing to selection tool"; m_currentToolMode = Constants::SelectionToolMode; m_selectionTool->setRubberbandSelectionMode(false); changeToSelectTool(); emit selectToolActivated(); qmlDesignDebugServer()->setCurrentTool(Constants::SelectionToolMode); } void QDeclarativeDesignView::changeToSelectTool() { if (m_currentTool == m_selectionTool) return; m_currentTool->clear(); m_currentTool = m_selectionTool; m_currentTool->clear(); m_currentTool->setItems(m_currentSelection); } void QDeclarativeDesignView::changeToMarqueeSelectTool() { qDebug() << "changed to marquee select tool"; changeToSelectTool(); m_currentToolMode = Constants::MarqueeSelectionToolMode; m_selectionTool->setRubberbandSelectionMode(true); emit marqueeSelectToolActivated(); qmlDesignDebugServer()->setCurrentTool(Constants::MarqueeSelectionToolMode); } void QDeclarativeDesignView::changeToZoomTool() { m_currentToolMode = Constants::ZoomMode; qDebug() << "changed to zoom tool"; m_currentTool->clear(); m_currentTool = m_zoomTool; m_currentTool->clear(); emit zoomToolActivated(); qmlDesignDebugServer()->setCurrentTool(Constants::ZoomMode); } void QDeclarativeDesignView::changeToColorPickerTool() { if (m_currentTool == m_colorPickerTool) return; m_currentToolMode = Constants::ColorPickerMode; m_currentTool->clear(); m_currentTool = m_colorPickerTool; m_currentTool->clear(); emit colorPickerActivated(); qmlDesignDebugServer()->setCurrentTool(Constants::ColorPickerMode); } void QDeclarativeDesignView::changeAnimationSpeed(qreal slowdownFactor) { m_slowdownFactor = slowdownFactor; if (m_slowdownFactor != 0) { continueExecution(m_slowdownFactor); } else { pauseExecution(); } } void QDeclarativeDesignView::continueExecution(qreal slowdownFactor) { Q_ASSERT(slowdownFactor > 0); m_slowdownFactor = slowdownFactor; QUnifiedTimer *timer = QUnifiedTimer::instance(); timer->setSlowdownFactor(m_slowdownFactor); timer->setSlowModeEnabled(false); m_executionPaused = false; emit executionStarted(m_slowdownFactor); qmlDesignDebugServer()->setAnimationSpeed(m_slowdownFactor); } void QDeclarativeDesignView::pauseExecution() { QUnifiedTimer *timer = QUnifiedTimer::instance(); m_slowdownFactor = 0; timer->setSlowdownFactor(m_slowdownFactor); timer->setSlowModeEnabled(true); m_executionPaused = true; emit executionPaused(); qmlDesignDebugServer()->setAnimationSpeed(m_slowdownFactor); } void QDeclarativeDesignView::applyChangesFromClient() { } LayerItem *QDeclarativeDesignView::manipulatorLayer() const { return m_manipulatorLayer; } QList QDeclarativeDesignView::filteredItemList(QList &itemlist) const { foreach(QGraphicsItem *item, itemlist) { if (item->type() == Constants::EditorItemType || item->type() == Constants::ResizeHandleItemType || !m_subcomponentEditorTool->isDirectChildOfContext(item)) { itemlist.removeOne(item); } } return itemlist; } void QDeclarativeDesignView::onStatusChanged(QDeclarativeView::Status status) { if (status == QDeclarativeView::Ready) { if (rootObject()) { m_subcomponentEditorTool->pushContext(rootObject()); emit executionStarted(1.0f); } } } void QDeclarativeDesignView::onCurrentObjectsChanged(QList objects) { QList items; foreach(QObject *obj, objects) { QDeclarativeItem* declarativeItem = qobject_cast(obj); if (declarativeItem) items << declarativeItem; } setSelectedItems(items); clearHighlightBoundingRect(); if (!items.isEmpty()) highlightBoundingRect(items.first()); } QToolBar *QDeclarativeDesignView::toolbar() const { return m_toolbar; } void QDeclarativeDesignView::createToolbar() { m_toolbar = new QmlToolbar(this); connect(this, SIGNAL(selectedColorChanged(QColor)), m_toolbar, SLOT(setColorBoxColor(QColor))); connect(m_toolbar, SIGNAL(executionStarted()), this, SLOT(continueExecution())); connect(m_toolbar, SIGNAL(executionPaused()), this, SLOT(pauseExecution())); connect(m_toolbar, SIGNAL(colorPickerSelected()), this, SLOT(changeToColorPickerTool())); connect(m_toolbar, SIGNAL(zoomToolSelected()), this, SLOT(changeToZoomTool())); connect(m_toolbar, SIGNAL(selectToolSelected()), this, SLOT(changeToSingleSelectTool())); connect(m_toolbar, SIGNAL(marqueeSelectToolSelected()), this, SLOT(changeToMarqueeSelectTool())); connect(m_toolbar, SIGNAL(applyChangesFromQmlFileSelected()), SLOT(applyChangesFromClient())); connect(this, SIGNAL(executionStarted(qreal)), m_toolbar, SLOT(startExecution())); connect(this, SIGNAL(executionPaused()), m_toolbar, SLOT(pauseExecution())); connect(this, SIGNAL(selectToolActivated()), m_toolbar, SLOT(activateSelectTool())); // disabled features //connect(m_toolbar, SIGNAL(applyChangesToQmlFileSelected()), SLOT(applyChangesToClient())); //connect(this, SIGNAL(resizeToolActivated()), m_toolbar, SLOT(activateSelectTool())); //connect(this, SIGNAL(moveToolActivated()), m_toolbar, SLOT(activateSelectTool())); connect(this, SIGNAL(colorPickerActivated()), m_toolbar, SLOT(activateColorPicker())); connect(this, SIGNAL(zoomToolActivated()), m_toolbar, SLOT(activateZoom())); connect(this, SIGNAL(marqueeSelectToolActivated()), m_toolbar, SLOT(activateMarqueeSelectTool())); } } //namespace QmlViewer