From 4250df8e9ae9ebf266a19d2be0386b072f31ad6d Mon Sep 17 00:00:00 2001 From: Jelle Feringa Date: Thu, 27 Oct 2016 12:48:49 +0200 Subject: [PATCH] fixed #335 -- change cursor on pan, rotate, zoom --- src/addons/Display/SimpleGui.py | 1 + .../Display/icons/cursor-magnify-area.png | Bin 0 -> 811 bytes src/addons/Display/icons/cursor-magnify.png | Bin 0 -> 758 bytes src/addons/Display/icons/cursor-pan.png | Bin 0 -> 541 bytes src/addons/Display/icons/cursor-rotate.png | Bin 0 -> 878 bytes src/addons/Display/qtDisplay.py | 65 ++++++++++++++++-- 6 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/addons/Display/icons/cursor-magnify-area.png create mode 100644 src/addons/Display/icons/cursor-magnify.png create mode 100644 src/addons/Display/icons/cursor-pan.png create mode 100644 src/addons/Display/icons/cursor-rotate.png diff --git a/src/addons/Display/SimpleGui.py b/src/addons/Display/SimpleGui.py index a8e89f088..e2d53a3e8 100644 --- a/src/addons/Display/SimpleGui.py +++ b/src/addons/Display/SimpleGui.py @@ -199,6 +199,7 @@ def add_function_to_menu(self, menu_name, _callable): win = MainWindow() win.show() win.canva.InitDriver() + win.canva.qApp = app display = win.canva._display if sys.platform != "linux2": display.EnableAntiAliasing() diff --git a/src/addons/Display/icons/cursor-magnify-area.png b/src/addons/Display/icons/cursor-magnify-area.png new file mode 100644 index 0000000000000000000000000000000000000000..34eb056eebc89f54117d9bb5909af035e91bbf12 GIT binary patch literal 811 zcmV+`1JwM9P)X1^@s6RQmj^00001b5ch_0Itp) z=>Px%(LxA9XqmK#cjIr! zWeI_+77^JZ(1lXlaFGa+M1+t~mL&Bih^f{;|a1iy#CP4@SAJddJULo|&UTp-_-J zb8l-FNN}4-*zI;vuh$m}Rw@+{jYb#dX(EwGj42kNuB;R~ie_?&7Q^AN5(-VX8+DY? zXr!PU3c8}%q-DuuGMxJi<^%HDCiXi7iEK7I^VQXARoHAcp{lC31!Tu!u^FF!zb|jk zl}(DvF<*&DE|;4r!UMCdAs>gs!P|37PHJRx`;69TPP-+$UE|9V9Z}E?Etd2=uzhe* z72pw|b#R$pMu6v^!w`{3gqyHbQvq4%uAx{R=QyE}rdXqSc`l8C_Is$+YI2X1^@s6FWx?200001b5ch_0Itp) z=>Px%ut`KgR7efIRZXi>Q4~FXV38UjVSx}dDjk?KYbHoKurLIpfe?hyFli8hKcZ)0l5KFynhUw0Ze8yJ#BtChM^*Gn^XLL{~{a?+ud%r z=yW=>R;%TZQgS^~cmsID`3Lbd`6-}OL?RK{Y&PX=Hj|6R0=4&TFc`>OE~hK~i#eAL zLclrqn50lB$kAvdr_-q-BC`2>&Roh@t5pe=)IuWt0vrb{?G!S80Wy_J$;o755Re)o zBCJ}uT-KF6uw+5PT_W*%y%Ou7igLTi*Xwl|i^W!X)N?YKoYP!@R0-Ou+w2+*rqgK= z2n2-9w!hY>B+xPeGC?s^saP+R&*!=JdAtwlW9#A%cqxm;qFM`X6De^x910*;J|2&o zlnsYNy?v>5#r1dJbs}1LUVN+85v$AP;`ZHPd3td@R;Rqz>ltn1_K~;S?E=d5d?SV; zfz8A9EpLk#m?@*tsHrWahPJp4R?3OBT1{`=MdJ%L1UVw2^`Jw_)@U@O)9Ex}b&V2< z1QXGfWoajo@dJ>dP)Lr)W9HiGOQjN%kiT!qvP^hLM1)KxBlq_9wvtpT73uMK7Rx!G z;OU;Uw6n-iTO3}I;XFwy##^0PyWOtLX0y7I-l6{mD}c8o z-Nd(m=K$Mf1pE){M*J0^f7mMU2e7nFN-QVtl0YOM0d57iYnK|9xko~B`Y4o;R44EZ opq3pBK=jHrvLx|07*qoM6N<$g4Enw0{{R3 literal 0 HcmV?d00001 diff --git a/src/addons/Display/icons/cursor-pan.png b/src/addons/Display/icons/cursor-pan.png new file mode 100644 index 0000000000000000000000000000000000000000..69c292b3be4660ef8da26fbbe3935c8f0de14c4a GIT binary patch literal 541 zcmV+&0^Px$*GWV{R9FecRJ%$9K@dD&Acuj8i3Y|R%SD117?^5gsNmxd^b@?`azTH=$S)8K zjWsY5)I;yY9NV!9_lbH2%z$w0XY)TRf${vl>QbB@z>QKy$VBvw@N7V)dfNw|gw zj<0~HaR{C>u?O;K^jOs$({q<6@B}V^P2hO~t{ji`CfwoKlXu`0!Le%M3-P1MNyz)0 zm!Mc*u=2g}VG+qG^+Ol&iJN1>y?2gI2vx^W^!bOqaGR*B0eVEi?%3&7q{?~%)S_na zpKGrrB&K!JiLDJ#i<%`&mNNaseIQ>o{fUiUP4`n=ReY#@p%d_l@|&>=as>5fnDvt5 zDBghIOpX#gh{+fYT3MR}%N4}NQkz+7_1Px&C`m*?R9FeUms^NUQ5eS$!%QwA!qCK?G-$~E(ukOhL`p_3&C7%mB}93n$b<64 zi`2Xk+aC0?x)iGcP! zKr6PTlkgGV*$*<=z8R<>*t3{`U-7#p7SlZC_MN~Wy4mSB2iSuVn2ti%muCs6$(_p5 zChc*yJ)jI})x#iw>7YKtVJOJ2qo+1CumQ$``e`qGf!`1-Z75Uf7(f+_0O=*X0R_}f zzYH#!7m;qpTd)cO_z9QbJm~i9B&})|Y=<>43HpMqIkv;Fo2maZ*l9fLNxc@DK$liM zbf}ElI@ky!JG`AM%GTu0?xbfFzvkeo>tYJPRwa(pa2PbPL>;V;3^`)d3%{;gmy|hs z0~8sqB*XJD&Vr4957enBRw?Vp$idWHKzgYJNpZ~;DnOKNu$#_6Gc^uDHoHesCf zs+2xc%8IF(7z(aElu6pKpJ74NXf~Byuo-mJ?7+B^X$vT)!CrU(Tfo#@3{AlGss`e3 zglnL|*Fy4MS9uj4gC?>lJ;@Ts!$1GF-m+xYIlBX|vVJ6%F8a2!@ZA4rpSV=mIWKL|^##wW0K+%%9j zu_msSH^4(sR@OJ#5u>`Cca(KLa` zy36$e(|6<^xc-8|omswnAd1#ZWj+jsvrq&2zrb7n0nopeve)dR;Q#;t07*qoM6N<$ Ef_DF>3;+NC literal 0 HcmV?d00001 diff --git a/src/addons/Display/qtDisplay.py b/src/addons/Display/qtDisplay.py index 40e96e0e5..65d94de12 100644 --- a/src/addons/Display/qtDisplay.py +++ b/src/addons/Display/qtDisplay.py @@ -20,6 +20,7 @@ from __future__ import print_function import logging +import os import sys logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) @@ -68,7 +69,7 @@ def GetHandle(self): ''' win_id = self.winId() # this returns either an int or voitptr - if "%s"%type(win_id) == "": # PySide + if "%s" % type(win_id) == "": # PySide ### with PySide, self.winId() does not return an integer if sys.platform == "win32": ## Be careful, this hack is py27 specific @@ -79,7 +80,7 @@ def GetHandle(self): ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes = [ ctypes.py_object] win_id = ctypes.pythonapi.PyCObject_AsVoidPtr(win_id) - elif type(win_id) is not int: #PyQt4 or 5 + elif type(win_id) is not int: # PyQt4 or 5 ## below integer cast may be required because self.winId() can ## returns a sip.voitptr according to the PyQt version used ## as well as the python version @@ -103,6 +104,16 @@ def __init__(self, *kargs): self._rightisdown = False self._selection = None self._drawtext = True + self._qApp = None + + @property + def qApp(self): + # reference to QApplication instance + return self._qApp + + @qApp.setter + def qApp(self, value): + self._qApp = value def InitDriver(self): self._display = OCCViewer.Viewer3d(self.GetHandle()) @@ -118,6 +129,26 @@ def InitDriver(self): self._SetupKeyMap() # self._display.thisown = False + self.createCursors() + + def createCursors(self): + module_pth = os.path.abspath(os.path.dirname(__file__)) + icon_pth = os.path.join(module_pth, "icons") + + _CURSOR_PIX_ROT = QtGui.QPixmap(os.path.join(icon_pth, "cursor-rotate.png")) + _CURSOR_PIX_PAN = QtGui.QPixmap(os.path.join(icon_pth, "cursor-pan.png")) + _CURSOR_PIX_ZOOM = QtGui.QPixmap(os.path.join(icon_pth, "cursor-magnify.png")) + _CURSOR_PIX_ZOOM_AREA = QtGui.QPixmap(os.path.join(icon_pth, "cursor-magnify-area.png")) + + self.CURSORS = { + "arrow": QtGui.QCursor(QtCore.Qt.ArrowCursor), # default + "pan": QtGui.QCursor(_CURSOR_PIX_PAN), + "rotate": QtGui.QCursor(_CURSOR_PIX_ROT), + "zoom": QtGui.QCursor(_CURSOR_PIX_ZOOM), + "zoom-area": QtGui.QCursor(_CURSOR_PIX_ZOOM_AREA), + } + + self._cursor = "arrow" def _SetupKeyMap(self): def set_shade_mode(): @@ -188,6 +219,22 @@ def wheelEvent(self, event): def dragMoveEvent(self, event): pass + @property + def cursor(self): + return self._cursor + + @cursor.setter + def cursor(self, value): + if not self._cursor == value: + + self._cursor = value + cursor = self.CURSORS.get(value) + + if cursor: + self.qApp.setOverrideCursor(cursor) + else: + self.qApp.restoreOverrideCursor() + def mousePressEvent(self, event): self.setFocus() self.dragStartPos = point(event.pos()) @@ -210,12 +257,15 @@ def mouseReleaseEvent(self, event): else: # single select otherwise self._display.Select(pt.x, pt.y) + elif event.button() == QtCore.Qt.RightButton: if self._zoom_area: [Xmin, Ymin, dx, dy] = self._drawbox self._display.ZoomArea(Xmin, Ymin, Xmin + dx, Ymin + dy) self._zoom_area = False + self.cursor = "arrow" + def DrawBox(self, event): tolerance = 2 pt = point(event.pos()) @@ -235,11 +285,13 @@ def mouseMoveEvent(self, evt): not modifiers == QtCore.Qt.ShiftModifier): dx = pt.x - self.dragStartPos.x dy = pt.y - self.dragStartPos.y + self.cursor = "rotate" self._display.Rotation(pt.x, pt.y) self._drawbox = False # DYNAMIC ZOOM elif (buttons == QtCore.Qt.RightButton and - not modifiers == QtCore.Qt.ShiftModifier): + not modifiers == QtCore.Qt.ShiftModifier): + self.cursor = "zoom" self._display.Repaint() self._display.DynamicZoom(abs(self.dragStartPos.x), abs(self.dragStartPos.y), abs(pt.x), @@ -253,19 +305,22 @@ def mouseMoveEvent(self, evt): dy = pt.y - self.dragStartPos.y self.dragStartPos.x = pt.x self.dragStartPos.y = pt.y + self.cursor = "pan" self._display.Pan(dx, -dy) self._drawbox = False # DRAW BOX # ZOOM WINDOW elif (buttons == QtCore.Qt.RightButton and - modifiers == QtCore.Qt.ShiftModifier): + modifiers == QtCore.Qt.ShiftModifier): self._zoom_area = True + self.cursor = "zoom-area" self.DrawBox(evt) # SELECT AREA elif (buttons == QtCore.Qt.LeftButton and - modifiers == QtCore.Qt.ShiftModifier): + modifiers == QtCore.Qt.ShiftModifier): self._select_area = True self.DrawBox(evt) else: self._drawbox = False self._display.MoveTo(pt.x, pt.y) + self.cursor = "arrow"