Skip to content

Commit ffa4593

Browse files
committed
add gesture bounds
1 parent c7612d9 commit ffa4593

File tree

3 files changed

+80
-3
lines changed

3 files changed

+80
-3
lines changed

DragDropUI.py

+45
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ def __init__(self):
241241
self.handGood = False
242242
self.handOpen = True
243243

244+
self.gestureBoundsWindows = {}
245+
244246
def resizeEvent(self, e):
245247
desktopSize = QtGui.QDesktopWidget().screenGeometry()
246248
self.move(
@@ -312,6 +314,49 @@ def setEyeBad(self):
312314
logging.debug("Eyes bad")
313315
self.eyeGood = False
314316
self._updateIcons()
317+
318+
def setGestureBoundNotice(self, direction, state):
319+
if not direction in self.gestureBoundsWindows:
320+
self.gestureBoundsWindows[direction] = BoundsWarningWindow(direction)
321+
if state:
322+
self.gestureBoundsWindows[direction].show()
323+
else:
324+
self.gestureBoundsWindows[direction].hide()
325+
326+
def closeEvent(self, e):
327+
super().closeEvent(e)
328+
for direction,window in self.gestureBoundsWindows.items():
329+
window.close()
330+
331+
class BoundsWarningWindow(QtGui.QWidget):
332+
def __init__(self, direction):
333+
super().__init__()
334+
self.direction = direction
335+
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint)
336+
self.setWindowOpacity(.25)
337+
self.setAttribute(QtCore.Qt.WA_ShowWithoutActivating)
338+
self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
339+
340+
self.layout = QtGui.QVBoxLayout()
341+
self.setLayout(self.layout)
342+
343+
p = self.palette()
344+
p.setColor(self.backgroundRole(), QtCore.Qt.red)
345+
self.setPalette(p)
346+
347+
desktopSize = QtGui.QDesktopWidget().screenGeometry()
348+
size = 32
349+
if direction in ['left', 'right']:
350+
self.resize(size, desktopSize.height())
351+
else:
352+
self.resize(desktopSize.width(), size)
353+
if direction in ['left', 'top']:
354+
self.move(0, 0)
355+
elif direction == 'right':
356+
self.move(desktopSize.width()-size, 0)
357+
else:
358+
self.move(0, desktopSize.height()-size)
359+
315360

316361
class DeviceOptionsWindow(QtGui.QWidget):
317362
def __init__(self):

GestureDevice.py

+31
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class GestureDevice(QtCore.QObject):
2020
pinchValued = QtCore.Signal(object)
2121
fixated = QtCore.Signal(object)
2222
fixationInvalidated = QtCore.Signal(object)
23+
reachingBounds = QtCore.Signal(object, object)
2324

2425
def __init__(self):
2526
super().__init__()
@@ -54,6 +55,13 @@ def __init__(self):
5455
self.timer.start(1.0/30.0)
5556

5657
self.sawHandLastTime = False
58+
59+
self.boundsReached = {
60+
'left': False,
61+
'right': False,
62+
'top': False,
63+
'bottom': False,
64+
}
5765

5866
def poll(self):
5967
frame = self.controller.frame()
@@ -65,7 +73,26 @@ def poll(self):
6573
self.noHands.emit()
6674
self.sawHandLastTime = False
6775
else:
76+
boundsCheck = {
77+
'left': False,
78+
'right': False,
79+
'top': False,
80+
'bottom': False,
81+
}
6882
for hand in hands:
83+
# check for edges
84+
box = frame.interaction_box
85+
pos = box.normalize_point(hand.palm_position, False)
86+
threshold = 1
87+
if pos.x > threshold:
88+
boundsCheck['right'] = True
89+
elif pos.x < 1-threshold:
90+
boundsCheck['left'] = True
91+
if pos.z > threshold:
92+
boundsCheck['bottom'] = True
93+
elif pos.z < 1-threshold:
94+
boundsCheck['top'] = True
95+
6996
if hand.is_left:
7097
if not self.leftHand.isHand(hand) and not self.sawHandLastTime:
7198
self.handAppeared.emit(hand)
@@ -117,6 +144,10 @@ def poll(self):
117144

118145
self.moved.emit(delta)
119146

147+
for direction,warn in boundsCheck.items():
148+
if warn != self.boundsReached[direction]:
149+
self.boundsReached[direction] = warn
150+
self.reachingBounds.emit(direction, warn)
120151
def toggleCalibration(self):
121152
self.setCalibrating(not self.calibrating)
122153

InputScheme.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def setWindow(self, window):
171171
self.gestureTracker.moved.connect(window.feedbackWindow.setHandGood)
172172
self.gazeTracker.eyesAppeared.connect(window.feedbackWindow.setEyeGood)
173173
self.gazeTracker.eyesDisappeared.connect(window.feedbackWindow.setEyeBad)
174-
174+
175175
def grabbed(self, hand):
176176
gaze = self.gazeTracker.getAttentiveGaze(clear=True)
177177
self.doGrab(gaze[0], gaze[1])
@@ -251,7 +251,7 @@ def start(self):
251251
self.gestureTracker.moved.connect(self.handMoved)
252252
self.gestureTracker.fixated.connect(self.fixated)
253253
self.gestureTracker.fixationInvalidated.connect(self.fixationInvalidated)
254-
254+
255255
mousePos = pyMouse.position()
256256
self.virtualPos = [mousePos[0], mousePos[1]]
257257

@@ -268,7 +268,8 @@ def setWindow(self, window):
268268
self.gestureTracker.grabbed.connect(window.feedbackWindow.setHandClosed)
269269
self.gestureTracker.released.connect(window.feedbackWindow.setHandOpen)
270270
self.gestureTracker.moved.connect(window.feedbackWindow.setHandGood)
271-
271+
self.gestureTracker.reachingBounds.connect(window.feedbackWindow.setGestureBoundNotice)
272+
272273
def fixated(self, handPosition):
273274
self.attentivePoint = pyMouse.position()
274275
self.changePreselectedIcon(self.attentivePoint)

0 commit comments

Comments
 (0)