152 view->setTransformationAnchor(AnchorUnderMouse);
153 view->setResizeAnchor(AnchorViewCenter);
154 if (QGLFormat::hasOpenGL())
155 view->setViewport(
new QGLWidget(QGLFormat(QGL::SampleBuffers),
view));
156 view->setRenderHint(QPainter::Antialiasing);
157 view->setBackgroundBrush(Qt::black);
159 view->setScene(
new QGraphicsScene());
164 view->setFrameStyle(QFrame::NoFrame);
171 view->setAnimatedZoomTime(1500.0);
197 view->setInteractive (
false );
325 m_d->lastmajormode=m;
328 m_d->dragzoom_startpoint=QPoint();
332 setDragMode(QGraphicsView::ScrollHandDrag);
334 setDragMode(QGraphicsView::NoDrag);
340 setCursor(Qt::ArrowCursor);
343 setCursor(Qt::OpenHandCursor);
347 setCursor(Qt::SizeVerCursor);
350 setCursor(Qt::CrossCursor);
360 if (!
m_d->cols_override_inactive.contains(ic))
361 ic->setTemporaryIgnoreInteractions(
false);
363 if (!
m_d->cols_override_unmovable.contains(ic))
364 ic->setTemporaryIgnoreMovable(
false);
367 ic->setTemporaryIgnoreMovable(
true);
369 ic->setTemporaryIgnoreInteractions(
true);
438 double delta =
event->pos().y()-
m_d->dragzoom_startpoint.y();
439 m_d->dragzoom_startpoint=
event->pos();
440 ViewportAnchor save = transformationAnchor();
441 setTransformationAnchor(AnchorViewCenter);
443 setTransformationAnchor(save);
448 for (QGraphicsItem*item : items(event->pos())) {
450 if (ic->itemBelongsAndIsPresentlyActive(item)) {
457 QGraphicsView::mouseMoveEvent(event);
464 setFocus(Qt::MouseFocusReason);
466 if (
m_d->showhelptext) {
467 m_d->showhelptext=
false;
468 viewport()->update();
478 if (
m_d->mode==
CHANGEVIEW&&event->buttons()==(Qt::LeftButton|Qt::MiddleButton)) {
480 m_d->dragzoom_startpoint=
event->pos();
485 if (
m_d->mode==
DRAGZOOM&&event->buttons()!=(Qt::LeftButton|Qt::MiddleButton)) {
486 if (event->buttons()==(Qt::LeftButton|Qt::MiddleButton|Qt::RightButton)) {
503 if (event->buttons()!=Qt::LeftButton) {
504 QGraphicsView::mousePressEvent(event);
510 bool continueselection =
m_d->ic_multiselection && (
event->modifiers() & Qt::ShiftModifier);
516 QPoint pickpoint =
event->pos();
517 if (continueselection) {
518 assert(
m_d->ic_multiselection);
519 m_d->locateActiveItemAtPoint(item,ic,pickpoint,
m_d->ic_multiselection);
522 QGraphicsView::mousePressEvent(event);
526 m_d->locateActiveItemAtPoint(item,ic,pickpoint);
533 m_d->setNewSelected(item);
534 ic->itemPickedPrivate(item);
538 ic->itemGotEventPrivate(item,event);
543 m_d->ic_multiselection=ic;
544 m_d->setNewSelected(item,continueselection);
554 QGraphicsView::mousePressEvent(event);
679 bool haditemsinselection =
m_d->ic_multiselection && !
m_d->selecteditems.empty();
682 QMapIterator<QGraphicsItem*,HighLightItem*> it(
m_d->selecteditems);
683 while (it.hasNext()) {
685 it.value()->sendsignalondelete =
false;
687 if (
m_d->scene->items().contains(it.value())) {
688 m_d->scene->removeItem(it.value());
694 m_d->selecteditems.clear();
695 if (
m_d->clearselectionsemitsignals&&haditemsinselection) {
697 m_d->ic_multiselection = 0;
699 m_d->clearselectionsemitsignals=
true;
783 if (
m_d->zoomanim_nsteps==1) {
788 QRectF currentview = mapToScene(viewport()->rect()).boundingRect();
790 double w1 = currentview.width(), h1 = currentview.height();
791 double x1 = currentview.x(), y1 = currentview.y();
793 double w2 = goal.width(), h2 = goal.height();
794 double x2 = goal.x(), y2 = goal.y();
796 const double eps = 1.0/
m_d->zoomanim_nsteps;
797 for (
double f = eps; f < 1.0+0.5*eps; f+=eps ) {
802 m_d->zoomanim_queue.enqueue(QRectF( x1*(1.0-f2)+x2*f2, y1*(1.0-f2)+y2*f2,
803 w1*(1.0-f2)+w2*f2, h1*(1.0-f2)+h2*f2 ));
806 m_d->savedrenderhints=renderHints();
807 setRenderHints(QPainter::RenderHints());
808 m_d->zoomanim_timer->start();
903 if (
m_d->cols_override_inactive.contains(ic)==disallow)
907 m_d->cols_override_inactive.insert(ic);
908 if (
m_d->cols_all.contains(ic) )
909 ic->setTemporaryIgnoreInteractions(
true);
911 m_d->cols_override_inactive.remove(ic);
912 if (
m_d->cols_all.contains(ic) &&
m_d->mode !=
PICK )
913 ic->setTemporaryIgnoreInteractions(
false);
950 if (
m_d->currentsaveimagefile.isEmpty()) {
954 while (QFile::exists(guess+
".png"))
955 guess=
base+
"_"+QString::number(i++);
958 guess=
m_d->currentsaveimagefile;
961 QString filename = QFileDialog::getSaveFileName(0,
"Select target image file", guess,
962 "Image (*.png *.bmp)",
963 0,QFileDialog::DontResolveSymlinks);
964 if(filename.isEmpty())
967 QPixmap pm = viewport()->grab();
968 if (!(filename.endsWith(
".png",Qt::CaseInsensitive)||filename.endsWith(
".bmp",Qt::CaseInsensitive)))
972 m_d->currentsaveimagefile = std::move(filename);
990 if (!
m_d->showhelptext)
992 QRect imgrect = viewport()->rect();
993 imgrect.setWidth(imgrect.width()*3);
994 imgrect.setHeight(imgrect.height()*3);
995 if (!
m_d->helptextimage||
m_d->helptextimage->size()!=imgrect.size())
996 m_d->createNewHelptextImage(imgrect);
997 painter->setRenderHint(QPainter::Antialiasing,
false);
998 painter->drawImage(mapToScene(viewport()->rect()).boundingRect(),*(
m_d->helptextimage),
1008 "<h2>How to navigate a VP1GraphicsView</h2>\n"
1010 " <p>\n <b>H/F1</b> Show this help."
1011 " \n <b>S</b> Seek mode.\n"
1012 " \n <b>+/-</b> Zoom.\n"
1013 " \n <b>CTRL+HOME</b> Set home.\n"
1014 " \n <b>HOME</b> View home.\n"
1015 " \n <b>1</b> View all.\n"
1016 " \n <b>ESC</b> Switch between view and pick mode.\n"
1017 " \n <b>P</b> Print view.\n"
1018 " \n <b>CTRL+P</b> Save snapshot to image file.</p>\n"
1019 " <p>\n <b>Mouse wheel</b> zoom. Use <b>CTRL</b> and <b>SHIFT</b> for finegrained control.</p>\n"
1020 " <p>\n To select items (in pick mode), click on them. Selected multiple by holding down <b>SHIFT</b>.</p>\n"
1023 " Please report any bugs to <i>Thomas.Kittelmann@cern.ch</i>.\n"
1028 QFont myfont(
"Helvetica",36);
1030 helptext.setDefaultFont ( myfont );
1035 helptextimage =
new QImage(imrect.size(), QImage::Format_ARGB32);
1040 int pageWidth = qMax(imrect.width() - 100, 100);
1041 int pageHeight = qMax(imrect.height() - 100, 100);
1042 if (pageWidth !=
helptext.pageSize().width()) {
1043 helptext.setPageSize(QSize(pageWidth, pageHeight));
1046 QRect textRect(imrect.width() / 2 - pageWidth / 2,
1047 imrect.height() / 2 - pageHeight / 2,
1051 QRect clearRect = textRect.adjusted(-pad, -pad, pad, pad);
1052 painter.setPen(Qt::NoPen);
1053 painter.setBrush(QColor(0, 0, 0, 63));
1055 painter.drawRect(clearRect.x() + clearRect.width() + 1,
1056 clearRect.y() + shade,
1058 clearRect.height() + 1);
1059 painter.drawRect(clearRect.x() + shade,
1060 clearRect.y() + clearRect.height() + 1,
1061 clearRect.width() - shade + 1,
1064 painter.setRenderHint(QPainter::Antialiasing,
false);
1065 painter.setBrush(QColor(255, 255, 255, 220));
1066 painter.setPen(Qt::black);
1067 painter.drawRect(clearRect);
1069 painter.setClipRegion(textRect, Qt::IntersectClip);
1070 painter.translate(textRect.topLeft());
1072 QAbstractTextDocumentLayout::PaintContext ctx;
1074 QLinearGradient g(0, 0, 0, textRect.height());
1075 g.setColorAt(0, Qt::black);
1076 g.setColorAt(0.9, Qt::black);
1077 g.setColorAt(1, Qt::transparent);
1079 QPalette pal =
view->viewport()->palette();
1080 pal.setBrush(QPalette::Text, g);
1082 ctx.palette = std::move(pal);
1083 ctx.clip = QRect(0, 0, textRect.width(), textRect.height());
1084 helptext.documentLayout()->draw(&painter, ctx);
1092 QGraphicsItem *items[],
1093 const QStyleOptionGraphicsItem options[])
1096 if (!(
m_d->transform&&
m_d->transformactive)) {
1097 QGraphicsView::drawItems(painter,numItems,items,options);
1102 for (
int i = 0; i < numItems; ++i) {
1103 QGraphicsItem *item = items[i];
1105 painter->setTransform(item->sceneTransform(),
true);
1108 m_d->transform->paintItem(painter, item);