CubicSDR/src/util/MouseTracker.cpp

184 lines
4.4 KiB
C++

// Copyright (c) Charles J. Cliffe
// SPDX-License-Identifier: GPL-2.0+
#include "MouseTracker.h"
MouseTracker::MouseTracker(wxWindow *target) :
mouseX(0), mouseY(0), lastMouseX(0), lastMouseY(0), originMouseX(0), originMouseY(0), deltaMouseX(0), deltaMouseY(0), vertDragLock(false), horizDragLock(
false), isMouseDown(false), isMouseRightDown(false), isMouseInView(false), target(target) {
}
MouseTracker::MouseTracker() :
MouseTracker(nullptr) {
}
void MouseTracker::OnMouseMoved(wxMouseEvent& event) {
if (target == nullptr) {
return;
}
const wxSize ClientSize = target->GetClientSize();
mouseX = (float) event.m_x / (float) ClientSize.x;
mouseY = 1.0 - (float) event.m_y / (float) ClientSize.y;
deltaMouseX = mouseX - lastMouseX;
deltaMouseY = mouseY - lastMouseY;
if (isMouseDown || isMouseRightDown) {
#ifndef __APPLE__
#if !defined(__linux__) && !defined(__FreeBSD__)
if (horizDragLock && vertDragLock) {
target->WarpPointer(originMouseX * ClientSize.x, (1.0 - originMouseY) * ClientSize.y);
mouseX = originMouseX;
mouseY = originMouseY;
} else if (vertDragLock && mouseY != lastMouseY) {
target->WarpPointer(event.m_x, (1.0 - originMouseY) * ClientSize.y);
mouseY = originMouseY;
} else if (horizDragLock && mouseX != lastMouseX) {
target->WarpPointer(originMouseX * ClientSize.x, event.m_y);
mouseX = originMouseX;
}
#endif
#endif
}
lastMouseX = mouseX;
lastMouseY = mouseY;
}
void MouseTracker::OnMouseWheelMoved(wxMouseEvent& /* event */) {
// std::cout << "wheel?" << std::endl;
}
void MouseTracker::OnMouseDown(wxMouseEvent& event) {
if (isMouseRightDown || target == nullptr) {
return;
}
const wxSize ClientSize = target->GetClientSize();
mouseX = lastMouseX = (float) event.m_x / (float) ClientSize.x;
mouseY = lastMouseY = 1.0 - (float) event.m_y / (float) ClientSize.y;
originMouseX = mouseX;
originMouseY = mouseY;
isMouseDown = true;
}
void MouseTracker::OnMouseReleased(wxMouseEvent& /* event */) {
isMouseDown = false;
}
void MouseTracker::OnMouseRightDown(wxMouseEvent& event) {
if (isMouseDown || target == nullptr) {
return;
}
const wxSize ClientSize = target->GetClientSize();
mouseX = lastMouseX = (float) event.m_x / (float) ClientSize.x;
mouseY = lastMouseY = 1.0 - (float) event.m_y / (float) ClientSize.y;
originMouseX = mouseX;
originMouseY = mouseY;
isMouseRightDown = true;
}
void MouseTracker::OnMouseRightReleased(wxMouseEvent& /* event */) {
isMouseRightDown = false;
}
void MouseTracker::OnMouseEnterWindow(wxMouseEvent& /* event */) {
isMouseInView = true;
isMouseDown = false;
isMouseRightDown = false;
}
void MouseTracker::OnMouseLeftWindow(wxMouseEvent& /* event */) {
isMouseDown = false;
isMouseRightDown = false;
isMouseInView = false;
}
float MouseTracker::getOriginMouseX() const {
return originMouseX;
}
float MouseTracker::getOriginMouseY() const {
return originMouseY;
}
float MouseTracker::getOriginDeltaMouseX() const {
return mouseX - originMouseX;
}
float MouseTracker::getOriginDeltaMouseY() const {
return mouseY - originMouseY;
}
float MouseTracker::getDeltaMouseX() const {
return deltaMouseX;
}
float MouseTracker::getDeltaMouseY() const {
return deltaMouseY;
}
float MouseTracker::getLastMouseX() const {
return lastMouseX;
}
float MouseTracker::getLastMouseY() const {
return lastMouseY;
}
CubicVR::vec2 MouseTracker::getGLXY() const {
return CubicVR::vec2((getMouseX()-0.5)*2.0, (getMouseY()-0.5)*2.0);
}
float MouseTracker::getMouseX() const {
return mouseX;
}
float MouseTracker::getMouseY() const {
return mouseY;
}
void MouseTracker::setVertDragLock(bool dragLock) {
vertDragLock = dragLock;
}
void MouseTracker::setHorizDragLock(bool dragLock) {
horizDragLock = dragLock;
}
bool MouseTracker::getVertDragLock() const {
return vertDragLock;
}
bool MouseTracker::getHorizDragLock() const {
return horizDragLock;
}
bool MouseTracker::mouseDown() const {
return isMouseDown;
}
bool MouseTracker::mouseInView() const {
return isMouseInView;
}
void MouseTracker::setTarget(wxWindow *target_in) {
target = target_in;
}
bool MouseTracker::mouseRightDown() const {
return isMouseRightDown;
}