OSDN Git Service

QmlObserver: Fix navigation on Mac OS X
authorKai Koehne <kai.koehne@nokia.com>
Thu, 11 Nov 2010 15:50:45 +0000 (16:50 +0100)
committerKai Koehne <kai.koehne@nokia.com>
Tue, 16 Nov 2010 10:01:01 +0000 (11:01 +0100)
The QmlObserver relies on installing an event handler on the graphicsview
viewport, to get e.g. Mouse events.

QmlObserver on Mac OS X switches the viewport later on to a QGLViewPort, when
QmlObserver has already been set up ... Make QmlObserver aware of this by
listening to the ChildRemoved event that will be signalled in this case.

Task-number: QTCREATORBUG-2892
Reviewed-by: Lasse Holmstedt
share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp
share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h

index 20c9c44..24d0b9c 100644 (file)
@@ -79,8 +79,10 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, QObje
     data->subcomponentEditorTool = new SubcomponentEditorTool(this);
     data->currentTool = data->selectionTool;
 
-    data->view->setMouseTracking(true);
-    data->view->viewport()->installEventFilter(this);
+    // to capture ChildRemoved event when viewport changes
+    data->view->installEventFilter(this);
+
+    data->setViewport(data->view->viewport());
 
     data->debugService = QDeclarativeObserverService::instance();
     connect(data->debugService, SIGNAL(designModeBehaviorChanged(bool)), SLOT(setDesignModeBehavior(bool)));
@@ -137,6 +139,22 @@ void QDeclarativeViewObserverPrivate::_q_reloadView()
     emit q->reloadRequested();
 }
 
+void QDeclarativeViewObserverPrivate::setViewport(QWidget *widget)
+{
+    if (viewport.data() == widget)
+        return;
+
+    if (viewport) {
+        viewport->removeEventFilter(q);
+    }
+    viewport = widget;
+    if (viewport) {
+        // make sure we get mouse move events
+        viewport->setMouseTracking(true);
+        viewport->installEventFilter(q);
+    }
+}
+
 void QDeclarativeViewObserverPrivate::clearEditorItems()
 {
     clearHighlight();
@@ -145,6 +163,17 @@ void QDeclarativeViewObserverPrivate::clearEditorItems()
 
 bool QDeclarativeViewObserver::eventFilter(QObject *obj, QEvent *event)
  {
+     if (obj == data->view) {
+         // Event from view
+         if (event->type() == QEvent::ChildRemoved) {
+             // Might mean that viewport has changed
+             if (data->view->viewport() != data->viewport.data())
+                 data->setViewport(data->view->viewport());
+         }
+         return QObject::eventFilter(obj, event);
+     }
+
+     //Event from viewport
      switch (event->type()) {
      case QEvent::Leave: {
          if (leaveEvent(event))
index 4f90a28..1ded6e5 100644 (file)
@@ -66,6 +66,7 @@ public:
     QDeclarativeView *view;
     QDeclarativeViewObserver *q;
     QDeclarativeObserverService *debugService;
+    QWeakPointer<QWidget> viewport;
 
     QPointF cursorPos;
     QList<QWeakPointer<QGraphicsObject> > currentSelection;
@@ -88,6 +89,8 @@ public:
 
     QmlToolbar *toolbar;
 
+    void setViewport(QWidget *widget);
+
     void clearEditorItems();
     void createToolbar();
     void changeToSelectTool();