@@ -1248,6 +1248,29 @@ void LayoutPreviewWidget::mousePressEvent(QMouseEvent* event) {
12481248 return ;
12491249 }
12501250
1251+ if (event->button () == Qt::LeftButton
1252+ && toolMode_ == ToolMode::Select
1253+ && importResult_.layout .has_value ()
1254+ && hasSelection ()) {
1255+ const auto bounds = collectBounds (importResult_, currentFloorId ());
1256+ if (bounds.has_value ()) {
1257+ const LayoutTransform transform (*bounds, previewViewport (rect ()), camera_.zoom (), camera_.panOffset ());
1258+ const bool clickedCurrentSelection = selectedElementContainsContextPoint (
1259+ *importResult_.layout ,
1260+ event->position (),
1261+ transform,
1262+ currentFloorId (),
1263+ selectedZoneIds_,
1264+ selectedConnectionIds_,
1265+ selectedBarrierIds_);
1266+ if (clickedCurrentSelection) {
1267+ beginSelectionMove (event->position (), transform, *bounds);
1268+ event->accept ();
1269+ return ;
1270+ }
1271+ }
1272+ }
1273+
12511274 if (camera_.beginPan (event)) {
12521275 return ;
12531276 }
@@ -1300,23 +1323,6 @@ void LayoutPreviewWidget::mousePressEvent(QMouseEvent* event) {
13001323 return ;
13011324 }
13021325
1303- if (importResult_.layout .has_value () && hasSelection ()) {
1304- const LayoutTransform transform (*bounds, previewViewport (rect ()), camera_.zoom (), camera_.panOffset ());
1305- const bool clickedCurrentSelection = selectedElementContainsContextPoint (
1306- *importResult_.layout ,
1307- event->position (),
1308- transform,
1309- currentFloorId (),
1310- selectedZoneIds_,
1311- selectedConnectionIds_,
1312- selectedBarrierIds_);
1313- if (clickedCurrentSelection) {
1314- beginSelectionMove (event->position (), transform, *bounds);
1315- event->accept ();
1316- return ;
1317- }
1318- }
1319-
13201326 selectionDragging_ = true ;
13211327 selectionDragStart_ = event->position ();
13221328 selectionDragCurrent_ = selectionDragStart_;
@@ -1329,16 +1335,16 @@ void LayoutPreviewWidget::mousePressEvent(QMouseEvent* event) {
13291335}
13301336
13311337void LayoutPreviewWidget::mouseReleaseEvent (QMouseEvent* event) {
1332- if (camera_.finishPan (event)) {
1333- return ;
1334- }
1335-
13361338 if (selectionMoveDragging_ && event->button () == Qt::LeftButton) {
13371339 finishSelectionMove (event->position ());
13381340 event->accept ();
13391341 return ;
13401342 }
13411343
1344+ if (camera_.finishPan (event)) {
1345+ return ;
1346+ }
1347+
13421348 if (selectionDragging_ && event->button () == Qt::LeftButton) {
13431349 selectionDragging_ = false ;
13441350 selectionDragCurrent_ = event->position ();
@@ -1413,16 +1419,20 @@ void LayoutPreviewWidget::paintEvent(QPaintEvent* event) {
14131419 painter.setRenderHint (QPainter::Antialiasing);
14141420 painter.fillRect (rect (), QColor (250 , 252 , 255 ));
14151421
1416- const auto bounds = collectBounds (importResult_, currentFloorId ());
1417- if (!bounds .has_value ()) {
1422+ const auto liveBounds = collectBounds (importResult_, currentFloorId ());
1423+ if (!liveBounds .has_value ()) {
14181424 painter.setPen (QPen (QColor (80 , 80 , 80 ), 1 ));
14191425 painter.setFont (QFont (" Segoe UI" , 14 , QFont::DemiBold));
14201426 painter.drawText (rect (), Qt::AlignCenter, " No layout geometry imported" );
14211427 return ;
14221428 }
14231429
1424- const QRectF viewport = previewViewport (rect ());
1425- const LayoutTransform transform (*bounds, viewport, camera_.zoom (), camera_.panOffset ());
1430+ const bool freezeCamera = selectionMoveDragging_ && selectionMoveBounds_.valid ();
1431+ const auto bounds = freezeCamera ? selectionMoveBounds_ : *liveBounds;
1432+ const QRectF viewport = freezeCamera ? selectionMoveViewport_ : previewViewport (rect ());
1433+ const auto zoom = freezeCamera ? selectionMoveZoom_ : camera_.zoom ();
1434+ const auto panOffset = freezeCamera ? selectionMovePanOffset_ : camera_.panOffset ();
1435+ const LayoutTransform transform (bounds, viewport, zoom, panOffset);
14261436
14271437 if (gridSnapEnabled_) {
14281438 drawLayoutCanvasGrid (painter, viewport, transform, gridSpacingMeters_);
@@ -1591,7 +1601,7 @@ void LayoutPreviewWidget::paintEvent(QPaintEvent* event) {
15911601
15921602 painter.setPen (QPen (QColor (115 , 128 , 140 ), 1 ));
15931603 painter.setFont (QFont (" Segoe UI" , 9 , QFont::Medium));
1594- painter.drawText (viewport.adjusted (0 , -10 , 0 , 0 ), Qt::AlignTop | Qt::AlignRight, QString (" Zoom %1%" ).arg (static_cast <int >(camera_. zoom () * 100.0 )));
1604+ painter.drawText (viewport.adjusted (0 , -10 , 0 , 0 ), Qt::AlignTop | Qt::AlignRight, QString (" Zoom %1%" ).arg (static_cast <int >(zoom * 100.0 )));
15951605 painter.drawText (viewport.adjusted (0 , -10 , 0 , 0 ), Qt::AlignTop | Qt::AlignLeft, " Layout Preview" );
15961606
15971607}
@@ -1602,6 +1612,11 @@ void LayoutPreviewWidget::resizeEvent(QResizeEvent* event) {
16021612}
16031613
16041614void LayoutPreviewWidget::wheelEvent (QWheelEvent* event) {
1615+ if (selectionMoveDragging_) {
1616+ event->accept ();
1617+ return ;
1618+ }
1619+
16051620 if (switchFloorByWheel (event)) {
16061621 return ;
16071622 }
0 commit comments