/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE 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 General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ #ifndef JUCE_MOUSEEVENT_H_INCLUDED #define JUCE_MOUSEEVENT_H_INCLUDED //============================================================================== /** Contains position and status information about a mouse event. @see MouseListener, Component::mouseMove, Component::mouseEnter, Component::mouseExit, Component::mouseDown, Component::mouseUp, Component::mouseDrag */ class JUCE_API MouseEvent { public: //============================================================================== /** Creates a MouseEvent. Normally an application will never need to use this. @param source the source that's invoking the event @param position the position of the mouse, relative to the component that is passed-in @param modifiers the key modifiers at the time of the event @param pressure the pressure of the touch or stylus, in the range 0 to 1. Devices that do not support force information may return 0.0, 1.0, or a negative value, depending on the platform @param eventComponent the component that the mouse event applies to @param originator the component that originally received the event @param eventTime the time the event happened @param mouseDownPos the position of the corresponding mouse-down event (relative to the component that is passed-in). If there isn't a corresponding mouse-down (e.g. for a mouse-move), this will just be the same as the current mouse-x position. @param mouseDownTime the time at which the corresponding mouse-down event happened If there isn't a corresponding mouse-down (e.g. for a mouse-move), this will just be the same as the current mouse-event time. @param numberOfClicks how many clicks, e.g. a double-click event will be 2, a triple-click will be 3, etc @param mouseWasDragged whether the mouse has been dragged significantly since the previous mouse-down */ MouseEvent (MouseInputSource source, Point position, ModifierKeys modifiers, float pressure, Component* eventComponent, Component* originator, Time eventTime, Point mouseDownPos, Time mouseDownTime, int numberOfClicks, bool mouseWasDragged) noexcept; /** Destructor. */ ~MouseEvent() noexcept; //============================================================================== /** The position of the mouse when the event occurred. This value is relative to the top-left of the component to which the event applies (as indicated by the MouseEvent::eventComponent field). This is a more accurate floating-point version of the position returned by getPosition() and the integer x and y member variables. */ const Point position; /** The x-position of the mouse when the event occurred. This value is relative to the top-left of the component to which the event applies (as indicated by the MouseEvent::eventComponent field). For a floating-point coordinate, see MouseEvent::position */ const int x; /** The y-position of the mouse when the event occurred. This value is relative to the top-left of the component to which the event applies (as indicated by the MouseEvent::eventComponent field). For a floating-point coordinate, see MouseEvent::position */ const int y; /** The key modifiers associated with the event. This will let you find out which mouse buttons were down, as well as which modifier keys were held down. When used for mouse-up events, this will indicate the state of the mouse buttons just before they were released, so that you can tell which button they let go of. */ const ModifierKeys mods; /** The pressure of the touch or stylus for this event. The range is 0 (soft) to 1 (hard). If the input device doesn't provide any pressure data, it may return a negative value here, or 0.0 or 1.0, depending on the platform. */ float pressure; /** The component that this event applies to. This is usually the component that the mouse was over at the time, but for mouse-drag events the mouse could actually be over a different component and the events are still sent to the component that the button was originally pressed on. The x and y member variables are relative to this component's position. If you use getEventRelativeTo() to retarget this object to be relative to a different component, this pointer will be updated, but originalComponent remains unchanged. @see originalComponent */ Component* const eventComponent; /** The component that the event first occurred on. If you use getEventRelativeTo() to retarget this object to be relative to a different component, this value remains unchanged to indicate the first component that received it. @see eventComponent */ Component* const originalComponent; /** The time that this mouse-event occurred. */ const Time eventTime; /** The time that the corresponding mouse-down event occurred. */ const Time mouseDownTime; /** The source device that generated this event. */ MouseInputSource source; //============================================================================== /** Returns the x coordinate of the last place that a mouse was pressed. The coordinate is relative to the component specified in MouseEvent::component. @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown */ int getMouseDownX() const noexcept; /** Returns the y coordinate of the last place that a mouse was pressed. The coordinate is relative to the component specified in MouseEvent::component. @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown */ int getMouseDownY() const noexcept; /** Returns the coordinates of the last place that a mouse was pressed. The coordinates are relative to the component specified in MouseEvent::component. @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown */ Point getMouseDownPosition() const noexcept; /** Returns the straight-line distance between where the mouse is now and where it was the last time the button was pressed. This is quite handy for things like deciding whether the user has moved far enough for it to be considered a drag operation. @see getDistanceFromDragStartX */ int getDistanceFromDragStart() const noexcept; /** Returns the difference between the mouse's current x postion and where it was when the button was last pressed. @see getDistanceFromDragStart */ int getDistanceFromDragStartX() const noexcept; /** Returns the difference between the mouse's current y postion and where it was when the button was last pressed. @see getDistanceFromDragStart */ int getDistanceFromDragStartY() const noexcept; /** Returns the difference between the mouse's current postion and where it was when the button was last pressed. @see getDistanceFromDragStart */ Point getOffsetFromDragStart() const noexcept; /** Returns true if the user seems to be performing a drag gesture. This is only meaningful if called in either a mouseUp() or mouseDrag() method. It will return true if the user has dragged the mouse more than a few pixels from the place where the mouse-down occurred. Once they have dragged it far enough for this method to return true, it will continue to return true until the mouse-up, even if they move the mouse back to the same location at which the mouse-down happened. This means that it's very handy for objects that can either be clicked on or dragged, as you can use it in the mouseDrag() callback to ignore small movements they might make while trying to click. */ bool mouseWasDraggedSinceMouseDown() const noexcept; /** Returns true if the mouse event is part of a click gesture rather than a drag. This is effectively the opposite of mouseWasDraggedSinceMouseDown() */ bool mouseWasClicked() const noexcept; /** For a click event, the number of times the mouse was clicked in succession. So for example a double-click event will return 2, a triple-click 3, etc. */ int getNumberOfClicks() const noexcept { return numberOfClicks; } /** Returns the time that the mouse button has been held down for. If called from a mouseDrag or mouseUp callback, this will return the number of milliseconds since the corresponding mouseDown event occurred. If called in other contexts, e.g. a mouseMove, then the returned value may be 0 or an undefined value. */ int getLengthOfMousePress() const noexcept; /** Returns true if the pressure value for this event is meaningful. */ bool isPressureValid() const noexcept; //============================================================================== /** The position of the mouse when the event occurred. This position is relative to the top-left of the component to which the event applies (as indicated by the MouseEvent::eventComponent field). For a floating-point position, see MouseEvent::position */ Point getPosition() const noexcept; /** Returns the mouse x position of this event, in global screen coordinates. The coordinates are relative to the top-left of the main monitor. @see getScreenPosition */ int getScreenX() const; /** Returns the mouse y position of this event, in global screen coordinates. The coordinates are relative to the top-left of the main monitor. @see getScreenPosition */ int getScreenY() const; /** Returns the mouse position of this event, in global screen coordinates. The coordinates are relative to the top-left of the main monitor. @see getMouseDownScreenPosition */ Point getScreenPosition() const; /** Returns the x coordinate at which the mouse button was last pressed. The coordinates are relative to the top-left of the main monitor. @see getMouseDownScreenPosition */ int getMouseDownScreenX() const; /** Returns the y coordinate at which the mouse button was last pressed. The coordinates are relative to the top-left of the main monitor. @see getMouseDownScreenPosition */ int getMouseDownScreenY() const; /** Returns the coordinates at which the mouse button was last pressed. The coordinates are relative to the top-left of the main monitor. @see getScreenPosition */ Point getMouseDownScreenPosition() const; //============================================================================== /** Creates a version of this event that is relative to a different component. The x and y positions of the event that is returned will have been adjusted to be relative to the new component. The component pointer that is passed-in must not be null. */ MouseEvent getEventRelativeTo (Component* newComponent) const noexcept; /** Creates a copy of this event with a different position. All other members of the event object are the same, but the x and y are replaced with these new values. */ MouseEvent withNewPosition (Point newPosition) const noexcept; /** Creates a copy of this event with a different position. All other members of the event object are the same, but the x and y are replaced with these new values. */ MouseEvent withNewPosition (Point newPosition) const noexcept; //============================================================================== /** Changes the application-wide setting for the double-click time limit. This is the maximum length of time between mouse-clicks for it to be considered a double-click. It's used by the Component class. @see getDoubleClickTimeout, MouseListener::mouseDoubleClick */ static void setDoubleClickTimeout (int timeOutMilliseconds) noexcept; /** Returns the application-wide setting for the double-click time limit. This is the maximum length of time between mouse-clicks for it to be considered a double-click. It's used by the Component class. @see setDoubleClickTimeout, MouseListener::mouseDoubleClick */ static int getDoubleClickTimeout() noexcept; private: //============================================================================== const Point mouseDownPos; const uint8 numberOfClicks, wasMovedSinceMouseDown; MouseEvent& operator= (const MouseEvent&); }; //============================================================================== /** Contains status information about a mouse wheel event. @see MouseListener, MouseEvent */ struct MouseWheelDetails { //============================================================================== /** The amount that the wheel has been moved in the X axis. If isReversed is true, then a negative deltaX means that the wheel has been pushed physically to the left. If isReversed is false, then a negative deltaX means that the wheel has been pushed physically to the right. */ float deltaX; /** The amount that the wheel has been moved in the Y axis. If isReversed is true, then a negative deltaY means that the wheel has been pushed physically upwards. If isReversed is false, then a negative deltaY means that the wheel has been pushed physically downwards. */ float deltaY; /** Indicates whether the user has reversed the direction of the wheel. See deltaX and deltaY for an explanation of the effects of this value. */ bool isReversed; /** If true, then the wheel has continuous, un-stepped motion. */ bool isSmooth; /** If true, then this event is part of the intertial momentum phase that follows the wheel being released. */ bool isInertial; }; #endif // JUCE_MOUSEEVENT_H_INCLUDED