diff --git a/direct/src/directtools/DirectCameraControl.py b/direct/src/directtools/DirectCameraControl.py index bdd3b4a3a8..daeb0d240f 100644 --- a/direct/src/directtools/DirectCameraControl.py +++ b/direct/src/directtools/DirectCameraControl.py @@ -140,10 +140,10 @@ class DirectCameraControl(PandaObject): taskMgr.spawnMethodNamed(self.HPPanTask, 'manipulateCamera') def XZTranslateOrHPanYZoomTask(self, state): - if direct.fShift | direct.fControl: - return self.HPanYZoomTask(state) - else: + if direct.fShift: return self.XZTranslateTask(state) + else: + return self.HPanYZoomTask(state) def XZTranslateOrHPPanTask(self, state): if direct.fShift: diff --git a/direct/src/directtools/DirectManipulation.py b/direct/src/directtools/DirectManipulation.py index 331f8f4369..9d400448df 100644 --- a/direct/src/directtools/DirectManipulation.py +++ b/direct/src/directtools/DirectManipulation.py @@ -227,12 +227,12 @@ class DirectManipulationControl(PandaObject): # Mouse started elsewhere in the outer frame, rotate self.rotate2D(state) else: - # Mouse starte in central region, xlate + # Mouse started in central region, xlate # Mode depends on shift key if direct.fShift: - self.xlateCamXY(state) - else: self.xlateCamXZ(state) + else: + self.xlateCamXY(state) if self.fSetCoa: # Update coa based on current widget position direct.selected.last.mCoa2Dnp.assign( diff --git a/direct/src/tkwidgets/Dial.py b/direct/src/tkwidgets/Dial.py index cbaabb517a..614363b222 100644 --- a/direct/src/tkwidgets/Dial.py +++ b/direct/src/tkwidgets/Dial.py @@ -54,7 +54,7 @@ class Dial(Pmw.MegaWidget): dim = self['edgeLength'] self.sfGridDelta = dim / 10 half = self.half = int(dim/2.0) - radius = self.radius = half - 2 + radius = self.radius = half - 4 # Running total which increments/decrements every time around dial self.baseVal = 0.0 @@ -76,6 +76,10 @@ class Dial(Pmw.MegaWidget): half, half)) self._canvas.grid(rowspan = 2, columnspan = 2) + # The shuttle ring + self._canvas.create_oval(-half, -half, half, half, + fill = 'white', tags = ('ring',)) + # The dial face self._canvas.create_oval(-radius, -radius, radius, radius, fill = 'white', tags = ('dial',)) @@ -144,6 +148,11 @@ class Dial(Pmw.MegaWidget): command = self.reset) # Add event bindings + self._canvas.tag_bind('ring', '', self.highlightRing) + self._canvas.tag_bind('ring', '', self.restoreRing) + self._canvas.tag_bind('ring', '', self.ringMouseDown) + self._canvas.tag_bind('ring', '', self.ringMouseMotion) + self._canvas.tag_bind('ring', '', self.ringMouseUp) self._canvas.tag_bind('dial', '', self.mouseDown) self._canvas.tag_bind('dial', '', self.mouseMotion) self._canvas.tag_bind('dial', '', self.shiftMouseMotion) @@ -338,6 +347,43 @@ class Dial(Pmw.MegaWidget): def expDown(self,event): self.setScaleFactorExp(max(-MAX_EXP, self.exp - 1), 0) + def ringMouseDown(self,event): + apply(self.onPress, self['callbackData']) + self.startRingAngle = self.computeRingAngle(event) + self.deltaRingAngle = 0.0 + self.velocityTask = self.after(100, self.ringComputeVelocity) + + def ringMouseMotion(self, event): + # What is the current ring angle + ringAngle = self.computeRingAngle(event) + self.deltaRingAngle = ringAngle - self.startRingAngle + + def ringComputeVelocity(self): + # Compute new exponent based upon current ring position + exp = self.deltaRingAngle/POINTFIVE_PI + # Set resulting scale factor + self.setScaleFactorExp(exp, fUpdateIndicator = 1) + # Update value and entry + delta = self.delta + self.value = newValue = self.value + delta * self.deltaRingAngle + self.set(newValue) + self.updateIndicator(self.value) + self.velocityTask = self.after(100, self.ringComputeVelocity) + + def computeRingAngle(self, event): + x = self._canvas.canvasx(event.x) + y = self._canvas.canvasy(event.y) + rawAngle = math.atan2(y,x) + # Convert to dial coords + dialAngle = rawAngle + TWO_PI + return dialAngle + + def ringMouseUp(self, event): + self.after_cancel(self.velocityTask) + # reset indicator + self.updateIndicator(self.value) + apply(self.onRelease, self['callbackData']) + def knobMouseDown(self,event): apply(self.onPress, self['callbackData']) self.lasty = self._canvas.canvasy(event.y) @@ -426,6 +472,12 @@ class Dial(Pmw.MegaWidget): def restoreSFMarker(self, event): self._canvas.itemconfigure('sfMarker', fill = '#A0A0A0') + def highlightRing(self, event): + self._canvas.itemconfigure('ring', fill = '#A0A0A0') + + def restoreRing(self, event): + self._canvas.itemconfigure('ring', fill = 'white') + def highlightKnob(self, event): self._canvas.itemconfigure('velocityKnob', fill = '#252525')