@@ -428,22 +428,118 @@ void QgsLayoutRuler::mouseMoveEvent( QMouseEvent *event )
428
428
mMarkerPos = event->posF ();
429
429
update ();
430
430
431
- // update cursor position in status bar
432
- QPointF displayPos = mTransform .inverted ().map ( event->posF () );
433
- switch ( mOrientation )
431
+ QPointF displayPos;
432
+ if ( mCreatingGuide )
434
433
{
435
- case Qt::Horizontal:
434
+ // event -> layout coordinates
435
+ QgsLayout *layout = mView ->currentLayout ();
436
+ QPoint viewPoint = mView ->mapFromGlobal ( mapToGlobal ( event->pos () ) );
437
+ displayPos = mView ->mapToScene ( viewPoint );
438
+ int pageNo = layout->pageCollection ()->pageNumberForPoint ( displayPos );
439
+ QgsLayoutItemPage *page = layout->pageCollection ()->page ( pageNo );
440
+
441
+ switch ( mOrientation )
436
442
{
437
- // mouse is over a horizontal ruler, so don't show a y coordinate
438
- displayPos.setY ( 0 );
439
- break ;
443
+ case Qt::Horizontal:
444
+ {
445
+ // mouse is creating a horizontal ruler, so don't show x coordinate
446
+ mGuideItem ->setLine ( 0 , displayPos.y (), page->rect ().width (), displayPos.y () );
447
+ displayPos.setX ( 0 );
448
+ break ;
449
+ }
450
+ case Qt::Vertical:
451
+ {
452
+ // mouse is creating a vertical ruler, so don't show a y coordinate
453
+ mGuideItem ->setLine ( displayPos.x (), 0 , displayPos.x (), page->rect ().height () );
454
+ displayPos.setY ( 0 );
455
+ break ;
456
+ }
440
457
}
441
- case Qt::Vertical:
458
+ }
459
+ else
460
+ {
461
+ // update cursor position in status bar
462
+ displayPos = mTransform .inverted ().map ( event->posF () );
463
+ switch ( mOrientation )
442
464
{
443
- // mouse is over a vertical ruler, so don't show an x coordinate
444
- displayPos.setX ( 0 );
445
- break ;
465
+ case Qt::Horizontal:
466
+ {
467
+ // mouse is over a horizontal ruler, so don't show a y coordinate
468
+ displayPos.setY ( 0 );
469
+ break ;
470
+ }
471
+ case Qt::Vertical:
472
+ {
473
+ // mouse is over a vertical ruler, so don't show an x coordinate
474
+ displayPos.setX ( 0 );
475
+ break ;
476
+ }
446
477
}
447
478
}
448
479
emit cursorPosChanged ( displayPos );
449
480
}
481
+
482
+ void QgsLayoutRuler::mousePressEvent ( QMouseEvent *event )
483
+ {
484
+ if ( event->button () == Qt::LeftButton )
485
+ {
486
+ mCreatingGuide = true ;
487
+ mGuideItem .reset ( new QGraphicsLineItem () );
488
+
489
+ mGuideItem ->setZValue ( QgsLayout::ZGuide );
490
+ QPen linePen ( Qt::DashLine );
491
+ linePen.setColor ( Qt::red );
492
+ linePen.setWidthF ( 0 );
493
+ mGuideItem ->setPen ( linePen );
494
+
495
+ mView ->currentLayout ()->addItem ( mGuideItem .get () );
496
+
497
+ switch ( mOrientation )
498
+ {
499
+ case Qt::Horizontal:
500
+ {
501
+ QApplication::setOverrideCursor ( Qt::SplitVCursor );
502
+ break ;
503
+ }
504
+ case Qt::Vertical:
505
+ QApplication::setOverrideCursor ( Qt::SplitHCursor );
506
+ break ;
507
+ }
508
+ }
509
+ }
510
+
511
+ void QgsLayoutRuler::mouseReleaseEvent ( QMouseEvent *event )
512
+ {
513
+ if ( event->button () == Qt::LeftButton )
514
+ {
515
+ mCreatingGuide = false ;
516
+ QApplication::restoreOverrideCursor ();
517
+ mGuideItem .reset ();
518
+
519
+ QgsLayout *layout = mView ->currentLayout ();
520
+
521
+ // create guide
522
+ QPoint viewPoint = mView ->mapFromGlobal ( mapToGlobal ( event->pos () ) );
523
+ QPointF scenePos = mView ->mapToScene ( viewPoint );
524
+ int page = layout->pageCollection ()->pageNumberForPoint ( scenePos );
525
+ std::unique_ptr< QgsLayoutGuide > guide;
526
+ switch ( mOrientation )
527
+ {
528
+ case Qt::Horizontal:
529
+ {
530
+ // mouse is creating a horizontal guide
531
+ double posOnPage = layout->pageCollection ()->positionOnPage ( scenePos ).y ();
532
+ guide.reset ( new QgsLayoutGuide ( QgsLayoutGuide::Horizontal, QgsLayoutMeasurement ( posOnPage, layout->units () ) ) );
533
+ break ;
534
+ }
535
+ case Qt::Vertical:
536
+ {
537
+ // mouse is creating a vertical guide
538
+ guide.reset ( new QgsLayoutGuide ( QgsLayoutGuide::Vertical, QgsLayoutMeasurement ( scenePos.x (), layout->units () ) ) );
539
+ break ;
540
+ }
541
+ }
542
+ guide->setPage ( page );
543
+ mView ->currentLayout ()->guides ().addGuide ( guide.release () );
544
+ }
545
+ }
0 commit comments