diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index e680213efb..f44397e7c3 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1095,6 +1095,7 @@ SET(Inventor_CPP_SRCS SoAxisCrossKit.cpp SoTextLabel.cpp SoTouchEvents.cpp + SoMouseWheelEvent.cpp SoFCCSysDragger.cpp ) SET(Inventor_SRCS @@ -1121,6 +1122,7 @@ SET(Inventor_SRCS SoAxisCrossKit.h SoTextLabel.h SoTouchEvents.h + SoMouseWheelEvent.h SoFCCSysDragger.h ) SOURCE_GROUP("View3D\\Inventor" FILES ${Inventor_SRCS}) diff --git a/src/Gui/Quarter/Mouse.cpp b/src/Gui/Quarter/Mouse.cpp index f64b0a530d..63b2edb30e 100644 --- a/src/Gui/Quarter/Mouse.cpp +++ b/src/Gui/Quarter/Mouse.cpp @@ -37,11 +37,14 @@ QuarterWidget. */ +#include "PreCompiled.h" + #ifdef _MSC_VER #pragma warning(disable : 4267) #endif #include +#include #include #include @@ -67,11 +70,13 @@ public: this->publ = publ; this->location2 = new SoLocation2Event; this->mousebutton = new SoMouseButtonEvent; + this->wheel = new SoMouseWheelEvent; } ~MouseP() { delete this->location2; delete this->mousebutton; + delete this->wheel; } const SoEvent * mouseMoveEvent(QMouseEvent * event); @@ -82,6 +87,7 @@ public: class SoLocation2Event * location2; class SoMouseButtonEvent * mousebutton; + class SoMouseWheelEvent * wheel; SbVec2s windowsize; Mouse * publ; }; @@ -161,26 +167,24 @@ MouseP::mouseMoveEvent(QMouseEvent * event) const SoEvent * MouseP::mouseWheelEvent(QWheelEvent * event) { - PUBLIC(this)->setModifiers(this->mousebutton, event); + PUBLIC(this)->setModifiers(this->wheel, event); SbVec2s pos(event->pos().x(), PUBLIC(this)->windowsize[1] - event->pos().y() - 1); // the following corrects for high-dpi displays (e.g. mac retina) #if QT_VERSION >= 0x050000 pos *= publ->quarter->devicePixelRatio(); #endif - this->location2->setPosition(pos); - this->mousebutton->setPosition(pos); + this->location2->setPosition(pos); //I don't know why location2 is assigned here, I assumend it important --DeepSOIC + this->wheel->setPosition(pos); // QWheelEvent::delta() returns the distance that the wheel is // rotated, in eights of a degree. A positive value indicates that // the wheel was rotated forwards away from the user; a negative // value indicates that the wheel was rotated backwards toward the - // user. - (event->delta() > 0) ? - this->mousebutton->setButton(SoMouseButtonEvent::BUTTON4) : - this->mousebutton->setButton(SoMouseButtonEvent::BUTTON5); + // user. A typical wheel click is 120, but values coming from touchpad + // can be a lot lower + this->wheel->setDelta(event->delta()); - this->mousebutton->setState(SoButtonEvent::DOWN); - return this->mousebutton; + return this->wheel; } const SoEvent * diff --git a/src/Gui/SoFCDB.cpp b/src/Gui/SoFCDB.cpp index bcde577c83..b90089c127 100644 --- a/src/Gui/SoFCDB.cpp +++ b/src/Gui/SoFCDB.cpp @@ -56,6 +56,7 @@ #include "Inventor/MarkerBitmaps.h" #include "Inventor/SmSwitchboard.h" #include "SoFCCSysDragger.h" +#include "SoMouseWheelEvent.h" #include "propertyeditor/PropertyItem.h" #include "NavigationStyle.h" @@ -125,6 +126,7 @@ void Gui::SoFCDB::init() SoFCSeparator ::initClass(); SoFCSelectionRoot ::initClass(); SoFCPathAnnotation ::initClass(); + SoMouseWheelEvent ::initClass(); PropertyItem ::init(); PropertySeparatorItem ::init(); diff --git a/src/Gui/SoMouseWheelEvent.cpp b/src/Gui/SoMouseWheelEvent.cpp new file mode 100644 index 0000000000..10d694b508 --- /dev/null +++ b/src/Gui/SoMouseWheelEvent.cpp @@ -0,0 +1,28 @@ +/*************************************************************************** + * Copyright (c) Victor Titov (DeepSOIC) * + * (vv.titov@gmail.com) 2020 * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#include "PreCompiled.h" + +#include "SoMouseWheelEvent.h" + +SO_EVENT_SOURCE(SoMouseWheelEvent); \ No newline at end of file diff --git a/src/Gui/SoMouseWheelEvent.h b/src/Gui/SoMouseWheelEvent.h new file mode 100644 index 0000000000..268009f397 --- /dev/null +++ b/src/Gui/SoMouseWheelEvent.h @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (c) Victor Titov (DeepSOIC) * + * (vv.titov@gmail.com) 2020 * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#ifndef SOMOUSEWHEELEVENT_H_FC +#define SOMOUSEWHEELEVENT_H_FC + +//#ifndef GuiExport +//#define GuiExport +//#endif + +#include + +/** + * @brief The SoMouseWheelEvent class is a temporary replacement for + * SoMouseWheelEvent from Coin, for until freecad stops using Coin version that + * doesn't have one (coin v 4.0.0a doesn't have SoMouseWheelEvent). + */ +class GuiExport SoMouseWheelEvent : public SoEvent { + SO_EVENT_HEADER(); +public: //methods + static void initClass(){ + SO_EVENT_INIT_CLASS(SoMouseWheelEvent, SoEvent); + } + SoMouseWheelEvent () : delta(0) {} + SoMouseWheelEvent (int delta) : delta(delta) {} + ///returns wheel position change. One click is usually 120 units, + /// smaller values come from high-resolution devices like touchpads + int getDelta() const {return delta;} + void setDelta(int delta) {this->delta = delta;} + ~SoMouseWheelEvent(){} + +private: //data + int delta; +}; + +#endif diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index c42ae316cd..37365af2eb 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -41,6 +41,7 @@ #include "Application.h" #include "Document.h" #include "NavigationStyle.h" +#include "SoMouseWheelEvent.h" #include "SoFCSelectionAction.h" #include "SoFCOffscreenRenderer.h" #include "SoFCVectorizeSVGAction.h" @@ -1992,6 +1993,10 @@ void View3DInventorPy::eventCallback(void * ud, SoEventCallback * n) dict.setItem("Button", Py::String(button)); } + if (e->isOfType(SoMouseWheelEvent::getClassTypeId())){ + const SoMouseWheelEvent* mwe = static_cast(e); + dict.setItem("Delta", Py::Long(mwe->getDelta())); + } if (e->isOfType(SoSpaceballButtonEvent::getClassTypeId())) { const SoSpaceballButtonEvent* sbe = static_cast(e); std::string button;