From 3c2ef75b50cf3323d057ea974045ac20be5eca4a Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 10 Mar 2013 12:03:09 +0000 Subject: [PATCH] Tweaks for pick callback cursors. --- simgear/scene/model/SGPickAnimation.cxx | 54 ++++++++++++++++++++----- simgear/scene/util/SGPickCallback.hxx | 9 ++++- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/simgear/scene/model/SGPickAnimation.cxx b/simgear/scene/model/SGPickAnimation.cxx index 7e0baf48..a2bad446 100644 --- a/simgear/scene/model/SGPickAnimation.cxx +++ b/simgear/scene/model/SGPickAnimation.cxx @@ -86,6 +86,10 @@ osg::Vec2d eventToWindowCoords(const osgGA::GUIEventAdapter* ea) _bindingsDown = readBindingList(configNode->getChildren("binding"), modelRoot); readOptionalBindingList(configNode, modelRoot, "mod-up", _bindingsUp); readOptionalBindingList(configNode, modelRoot, "hovered", _hover); + + if (configNode->hasChild("cursor")) { + _cursorName = configNode->getStringValue("cursor"); + } } virtual bool buttonPressed(int button, const osgGA::GUIEventAdapter* ea, const Info&) @@ -129,6 +133,9 @@ osg::Vec2d eventToWindowCoords(const osgGA::GUIEventAdapter* ea) fireBindingList(_hover, params.ptr()); return true; } + + std::string getCursor() const + { return _cursorName; } private: SGBindingList _bindingsDown; SGBindingList _bindingsUp; @@ -137,6 +144,7 @@ osg::Vec2d eventToWindowCoords(const osgGA::GUIEventAdapter* ea) bool _repeatable; double _repeatInterval; double _repeatTime; + std::string _cursorName; }; class VncVisitor : public osg::NodeVisitor { @@ -443,6 +451,17 @@ public: } else if (dragDir == "horizontal") { _dragDirection = DRAG_HORIZONTAL; } + + if (configNode->hasChild("cursor")) { + _cursorName = configNode->getStringValue("cursor"); + } else { + DragDirection dir = effectiveDragDirection(); + if (dir == DRAG_VERTICAL) { + _cursorName = "drag-vertical"; + } else if (dir == DRAG_HORIZONTAL) { + _cursorName = "drag-horizontal"; + } + } } virtual bool buttonPressed(int button, const osgGA::GUIEventAdapter* ea, const Info&) @@ -481,7 +500,18 @@ public: fireBindingList(_releaseAction); } - + + DragDirection effectiveDragDirection() const + { + if (_dragDirection == DRAG_DEFAULT) { + // respect the current default settings - this allows runtime + // setting of the default drag direction. + return static_knobDragAlternateAxis ? DRAG_VERTICAL : DRAG_HORIZONTAL; + } + + return _dragDirection; + } + virtual void mouseMoved(const osgGA::GUIEventAdapter* ea) { _mousePos = eventToWindowCoords(ea); @@ -498,15 +528,8 @@ public: // user is dragging, disable repeat behaviour _hasDragged = true; } - - DragDirection dragDir = _dragDirection; - if (dragDir == DRAG_DEFAULT) { - // respect the current default settings - this allows runtime - // setting of the default drag direction. - dragDir = static_knobDragAlternateAxis ? DRAG_VERTICAL : DRAG_HORIZONTAL; - } - - double delta = (dragDir == DRAG_VERTICAL) ? deltaMouse.y() : deltaMouse.x(); + + double delta = (effectiveDragDirection() == DRAG_VERTICAL) ? deltaMouse.y() : deltaMouse.x(); // per-animation scale factor lets the aircraft author tune for expectations, // eg heading setting vs 5-state switch. // then we scale by a global sensitivity, which the user can set. @@ -545,6 +568,15 @@ public: fireBindingList(_hover, params.ptr()); return true; } + + void setCursor(const std::string& aName) + { + _cursorName = aName; + } + + virtual std::string getCursor() const + { return _cursorName; } + private: void fire(bool isShifted, Direction dir) { @@ -581,6 +613,8 @@ private: osg::Vec2d _mousePos, ///< current window coords location of the mouse _lastFirePos; ///< mouse location where we last fired the bindings double _dragScale; + + std::string _cursorName; }; /////////////////////////////////////////////////////////////////////////////// diff --git a/simgear/scene/util/SGPickCallback.hxx b/simgear/scene/util/SGPickCallback.hxx index 5e2085db..33ab28ad 100644 --- a/simgear/scene/util/SGPickCallback.hxx +++ b/simgear/scene/util/SGPickCallback.hxx @@ -66,8 +66,15 @@ public: virtual bool hover(const osg::Vec2d& windowPos, const Info& info) { return false; } - Priority getPriority() const + virtual Priority getPriority() const { return _priority; } + + /** + * retrieve the name of the cursor to user when hovering this pickable + * object. Mapping is undefined, since SimGear doesn't know about cursors. + */ + virtual std::string getCursor() const + { return std::string(); } private: Priority _priority; -- 2.39.2