From bbd9fbf892879f27ab8a69841de37e91bf11d6f1 Mon Sep 17 00:00:00 2001 From: Franck Jullien Date: Mon, 15 Apr 2019 22:01:18 +0200 Subject: [PATCH] TechDraw: force user to place its balloon --- src/Mod/TechDraw/Gui/QGIViewBalloon.cpp | 10 ++++- src/Mod/TechDraw/Gui/QGVPage.cpp | 35 ++++++++++++++++-- src/Mod/TechDraw/Gui/QGVPage.h | 4 ++ src/Mod/TechDraw/Gui/Resources/TechDraw.qrc | 1 + .../Gui/Resources/icons/cursor-balloon.png | Bin 0 -> 1676 bytes 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/Mod/TechDraw/Gui/Resources/icons/cursor-balloon.png diff --git a/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp b/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp index b60221f295..529ca9d5e7 100644 --- a/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewBalloon.cpp @@ -36,6 +36,7 @@ # include # include # include + # include # include #endif @@ -171,8 +172,9 @@ void QGIViewBalloon::onAttachPointPicked(QGIView *view, QPointF pos) auto bnd = boost::bind(&QGIViewBalloon::parentViewMousePressed, this, _1, _2); if (balloon->OriginIsSet.getValue() == false) { - balloon->OriginX.setValue(pos.x()); - balloon->OriginY.setValue(pos.y()); + /* Move origin by half of cursor size */ + balloon->OriginX.setValue(pos.x() - 16); + balloon->OriginY.setValue(pos.y() + 16); balloon->OriginIsSet.setValue(true); m_parent->signalSelectPoint.disconnect(bnd); @@ -182,6 +184,8 @@ void QGIViewBalloon::onAttachPointPicked(QGIView *view, QPointF pos) if (mdi != nullptr) { page = mdi->getQGVPage(); + page->balloonPlacing(false); + QString labelText = QString::fromUtf8(std::to_string(page->balloonIndex).c_str()); balloon->Text.setValue(std::to_string(page->balloonIndex++).c_str()); @@ -194,6 +198,8 @@ void QGIViewBalloon::onAttachPointPicked(QGIView *view, QPointF pos) // Default label position balloonLabel->setPosFromCenter(pos.x() + 200, pos.y() -200); balloonLabel->setDimString(labelText, Rez::guiX(balloon->TextWrapLen.getValue())); + + QApplication::setOverrideCursor(Qt::ArrowCursor); } } diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 8077e60e51..50c0a73856 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -137,6 +137,7 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGraphicsScene* s, QWidget *parent) bkgBrush = new QBrush(getBackgroundColor()); balloonIndex = 1; + balloonPlacing(false); resetCachedContent(); } @@ -407,9 +408,13 @@ QGIView * QGVPage::addViewBalloon(TechDraw::DrawViewBalloon *balloon) QGIView *parent = 0; parent = findParent(balloonGroup); - if(parent) { - balloonGroup->connect(parent); - addBalloonToParent(balloonGroup,parent); + if(balloon->OriginIsSet.getValue() == false) { + if(parent) { + balloonPlacing(true); + QApplication::setOverrideCursor(QCursor(QPixmap(QString::fromUtf8(":/icons/cursor-balloon.png")))); + balloonGroup->connect(parent); + addBalloonToParent(balloonGroup,parent); + } } return balloonGroup; @@ -854,6 +859,30 @@ void QGVPage::enterEvent(QEvent *event) viewport()->setCursor(Qt::ArrowCursor); } +void QGVPage::leaveEvent(QEvent * event) +{ + if(m_balloonPlacing) { + + // Get the window geometry & cursor position + const QRect &rect = geometry(); + QPoint position = this->mapFromGlobal(QCursor::pos()); + + // Check the bounds + qint32 x = qBound(rect.left(), position.x(), rect.right()); + qint32 y = qBound(rect.top(), position.y(), rect.bottom()); + + QPoint newPoint(x, y); + + // Adjust the cursor + if (x != position.x() || y != position.y()) + QCursor::setPos(this->mapToGlobal(newPoint)); + + event->accept(); + } + + QGraphicsView::leaveEvent(event); +} + void QGVPage::mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index 0280e434bf..c49673dcb5 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -93,6 +93,8 @@ public: int removeQViewByName(const char* name); void removeQViewFromScene(QGIView *view); + void balloonPlacing(bool val) { m_balloonPlacing = val; }; + //void setViews(const std::vector &view) {views = view; } void setPageTemplate(TechDraw::DrawTemplate *pageTemplate); @@ -117,6 +119,7 @@ protected: void wheelEvent(QWheelEvent *event) override; void paintEvent(QPaintEvent *event) override; void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void keyPressEvent(QKeyEvent *event) override; @@ -143,6 +146,7 @@ private: double m_zoomIncrement; int m_reversePan; int m_reverseScroll; + bool m_balloonPlacing; }; } // namespace MDIViewPageGui diff --git a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc index 9d57b36d32..1aa5015dbc 100644 --- a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc +++ b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc @@ -71,6 +71,7 @@ icons/arrow-ccw.svg icons/arrow-cw.svg icons/techdraw-lock.png + icons/cursor-balloon.png translations/TechDraw_af.qm translations/TechDraw_zh-CN.qm translations/TechDraw_zh-TW.qm diff --git a/src/Mod/TechDraw/Gui/Resources/icons/cursor-balloon.png b/src/Mod/TechDraw/Gui/Resources/icons/cursor-balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..dd755464c964b81dd449067893299874107b6c16 GIT binary patch literal 1676 zcmV;726Op|P)%I)3Q~gX0)eCpy(}9A9GaL#(Z}c1CAX zYfG7F6RfeVQ=6KSL{nbF5)x=BNoZJ>w`|yDU+%rf4{4mzkO(qOkJRKk!GiD_GScfP4e&Qb+pvp~=37xJiTj`$NHI!|1 zF&~^_Di9zX3ZrT&j7Ad!fE!UA7B?Pu~o2B<8}Yh+P`3e_!@;9JIl8!42cHSB80DfAJSI*4tl1e`SU^p-P-04&1hl%Git{^P+eqHJ0>1mB zw-~z+=}N#|%cbL%=5_O{op;&gyKgti=MUz{Di6|E&aWHSW4oD;+fAm|&C9h_LLO^( z%f8p^W!+{~R=U}<>b!g1#NRkvFW+o0k+oGwpPOH<#J8md)$8Wv?e&`M{mW6y!ibw-cRx*hx_)>nJ-IBY;!I4)dh{iaZp3OH`;@i=Ik${JSGy3ew(-YKG=a6Jo zvZ6McRt$io`QAI%adjrZTRmZf;HSrqp|3Q8em}Dk9`AhZ5~^aw=XM|@%_{{^0C%N3 zo2lRx;t6R=jX$pT_^Jw>lfgK#M3m}^Y$TMg2%w?@7hp+BQn(T_0H*u;m|rb`Wswnp zcwCT`VL?D1fOZqb_X8Ec5C)sB3Bg1P1<5t>tk(2&bfSPz5Sag3`v!o3P>@@^jRApy7?%49=vF{+BtBisWVUe&Fqup`T9MNE=NYJ3@>(6*W?+PEGYlCL-KC?Xu1q1zt@=v-ceN@DY-;#4IXjW8S1 zq-x3NRTMUlU5v@8K#;HODnV66k++<^D+QQO;TLIXmV$d4^6B?a5?+)MQ@s|!8vrz6 zlz2+hL?RO9^0YK`Q|swDLpPF+Cl8%RRR#N6Js{cdE$5M2MWVVIi`UKLswy6C`(Ztk z<6}H~Bmk0w0|QJg3n0x{W<|M^SZtB25nZ5K-UJYmZ;xGyO}8IDM`3}J@9(KnG({Zn zy6N(k^1142lCRI<@!<5ic}R~kkeaORexmJe^eaK0dTyLhSe{!n*uU&;==HA8AaP;t z1IWwA=lLoc@!<=6hz~jk#Fx58y%(0gml^0*?s9;}iOUA3QeR@~Pa5Vp~-Pg#~tO zHkF7WI6D?)Xmo*717U)5B!H(A@IC(!vo~mN$pH|0RcT3j+kB}|_D`BtF_ zNYWJQYjZ)LyHg|l=qC;^Fc5go6saSJ+D9;v48NP8t9#B=G{>-Fbrjx~9?k2`+g@L5 zmGAX#m(^ao;q$qU-u6cE3p<_hEk3KP@;ZBN*P7~wKWr(EA``j3w=Yx-*Pbo^_x4W= WJaj7$?)M@90000