[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeedu/step/step
From:       Sebastian Voecking <kde () voecking ! net>
Date:       2011-02-07 13:36:48
Message-ID: 20110207133648.60676AC8CC () svn ! kde ! org
[Download RAW message or body]

SVN commit 1219246 by voecking:

Reimplement coordinate transforms for embedded widgets, fixes problems with IBeam cursor

BUG: 220831
FIXED-IN: 4.6.1


 M  +17 -16    toolgraphics.cc  


--- trunk/KDE/kdeedu/step/step/toolgraphics.cc #1219245:1219246
@@ -197,26 +197,32 @@
 {
     if(!scene() || scene()->views().isEmpty()) return;
     QGraphicsView* activeView = scene()->views().first();
-    QTransform viewportTransform = activeView->viewportTransform();
 
     QPointF position = vectorToPoint(_item->metaObject()->property("position")->
                     readVariant(_item).value<StepCore::Vector2d>());
-    position = viewportTransform.inverted().map(QPointF(viewportTransform.map(position).toPoint()));
-    setPos(position);
 
-    double s = currentViewScale();
-    QTransform itemTransform = activeView->transform() * deviceTransform(viewportTransform);
+    // Move item to the closest pixel position
+    QPoint viewPosition = activeView->mapFromScene(position);
+    setPos(activeView->mapToScene(viewPosition));
 
     StepCore::Vector2d size = _item->metaObject()->property("size")->
                     readVariant(_item).value<StepCore::Vector2d>();
 
-    QRectF irect(-(size[0]+2)/s/2, -(size[1]+2)/s/2, (size[0]+2)/s, (size[1]+2)/s);
-    QRect viewportRect = itemTransform.mapRect(irect).toRect();
-    irect = itemTransform.inverted().mapRect(QRectF(viewportRect));
+    QSize viewSize(qRound(size[0]), qRound(size[1]));
+    QPoint viewTopLeft =
+        viewPosition - QPoint(viewSize.width() / 2, viewSize.height() / 2);
+    QRect viewRect(viewTopLeft, viewSize);
 
-    if(irect != _boundingRect) {
+    QRectF sceneRect =
+        activeView->mapToScene(viewRect.adjusted(0, 0, 1, 1)).boundingRect();
+    QRectF boundingRect = mapRectFromScene(sceneRect);
+    double s = currentViewScale();
+    boundingRect.adjust(-SELECTION_MARGIN/s, -SELECTION_MARGIN/s,
+                        SELECTION_MARGIN/s, SELECTION_MARGIN/s);
+    
+    if(boundingRect != _boundingRect) {
         prepareGeometryChange();
-        _boundingRect = irect;
+        _boundingRect = boundingRect;
         update();
     }
 
@@ -226,12 +232,7 @@
        _centralWidget->show();
     }
 
-    viewportRect = viewportRect.adjusted(1,1,-1,-1).normalized();
-    if(_centralWidget->pos() != viewportRect.topLeft())
-        _centralWidget->move(viewportRect.topLeft());
-
-    if(_centralWidget->size() != viewportRect.size())
-        _centralWidget->resize(viewportRect.size());
+    _centralWidget->setGeometry(viewRect.adjusted(0, 0, 1, 1));
 }
 
 void WidgetGraphicsItem::stateChanged()
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic