Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions editor/includes/editor/editorplatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class EDITOR_EXPORT EditorPlatform : public PlatformAdaptor {
bool mouseButton(int) const override;
bool mousePressed(int) const override;
bool mouseReleased(int) const override;
bool mouseButtonDoubleClick(int) const override;

Vector4 mousePosition() const override;
void mouseLockCursor(bool lock) override;
Expand All @@ -75,8 +76,9 @@ class EDITOR_EXPORT EditorPlatform : public PlatformAdaptor {
void syncConfiguration(VariantMap &map) const override;

protected:
QHash<int32_t, int32_t> m_keys;
QHash<int32_t, int32_t> m_mouseButtons;
std::unordered_map<int32_t, int32_t> m_keys;
std::unordered_map<int32_t, int32_t> m_mouseButtons;
std::unordered_map<int32_t, int32_t> m_mouseDoubleClick;

QSize m_screenSize;

Expand Down
65 changes: 51 additions & 14 deletions editor/src/editor/editorplatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QStandardPaths>
#include <QMouseEvent>
#include <QGuiApplication>
#include <QDateTime>

#include <engine.h>
#include <json.h>
Expand Down Expand Up @@ -180,21 +181,29 @@ void EditorPlatform::update() {
m_inputString.clear();

for(auto &it : m_keys) {
switch(it) {
case RELEASE: it = NONE; break;
case PRESS: it = REPEAT; break;
switch(it.second) {
case RELEASE: it.second = NONE; break;
case PRESS: it.second = REPEAT; break;
default: break;
}
}

for(auto &it : m_mouseButtons) {
switch(it) {
case RELEASE: it = NONE; break;
case PRESS: it = REPEAT; break;
switch(it.second) {
case RELEASE: it.second = NONE; break;
case PRESS: it.second = REPEAT; break;
default: break;
}
}

for(auto &it : m_mouseDoubleClick) {
switch(it.second) {
case RELEASE: it.second = NONE; break;
case PRESS: it.second = REPEAT; break;
default: break;
}
}

m_mouseScrollDelta = 0.0f;

PlatformAdaptor::update();
Expand All @@ -209,11 +218,11 @@ void EditorPlatform::reset() {
m_mouseDelta = Vector4();

for(auto &it : m_keys) {
it = NONE;
it.second = NONE;
}

for(auto &it : m_mouseButtons) {
it = NONE;
it.second = NONE;
}
}

Expand All @@ -222,31 +231,42 @@ bool EditorPlatform::isActive() const {
}

bool EditorPlatform::key(Input::KeyCode code) const {
return (m_keys.value(code) > RELEASE);
auto it = m_keys.find(code);
return (it != m_keys.end() && it->second > RELEASE);
}

bool EditorPlatform::keyPressed(Input::KeyCode code) const {
return (m_keys.value(code) == PRESS);
auto it = m_keys.find(code);
return (it != m_keys.end() && it->second == PRESS);
}

bool EditorPlatform::keyReleased(Input::KeyCode code) const {
return (m_keys.value(code) == RELEASE);
auto it = m_keys.find(code);
return (it != m_keys.end() && it->second == RELEASE);
}

TString EditorPlatform::inputString() const {
return m_inputString;
}

bool EditorPlatform::mouseButton(int button) const {
return (m_mouseButtons.value(button | 0x10000000) > RELEASE);
auto it = m_mouseButtons.find(button | 0x10000000);
return (it != m_mouseButtons.end() && it->second > RELEASE);
}

bool EditorPlatform::mousePressed(int button) const {
return (m_mouseButtons.value(button | 0x10000000) == PRESS);
auto it = m_mouseButtons.find(button | 0x10000000);
return (it != m_mouseButtons.end() && it->second == PRESS);
}

bool EditorPlatform::mouseReleased(int button) const {
return (m_mouseButtons.value(button | 0x10000000) == RELEASE);
auto it = m_mouseButtons.find(button | 0x10000000);
return (it != m_mouseButtons.end() && it->second == RELEASE);
}

bool EditorPlatform::mouseButtonDoubleClick(int button) const {
auto it = m_mouseDoubleClick.find(button | 0x10000000);
return (it != m_mouseDoubleClick.end() && it->second == PRESS);
}

uint32_t EditorPlatform::screenWidth() const { return m_screenSize.width(); }
Expand Down Expand Up @@ -289,6 +309,23 @@ void EditorPlatform::setMouseButtons(int button, int state) {
}

m_mouseButtons[btn] = state;

if(state == PRESS) {
static QPoint lastPos;
static qint64 lastTime = 0;

QPoint currentPos = QPoint(m_mousePosition.x, m_screenSize.height() - m_mousePosition.y);
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();

if(lastTime > 0 && (currentTime - lastTime) < 300 &&
(currentPos - lastPos).manhattanLength() < 20) {
m_mouseDoubleClick[btn] = PRESS;
lastTime = 0;
} else {
lastPos = currentPos;
lastTime = currentTime;
}
}
}

void EditorPlatform::setKeys(QKeyEvent *ev, bool release) {
Expand Down
2 changes: 2 additions & 0 deletions engine/includes/adapters/desktopadaptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class DesktopAdaptor : public PlatformAdaptor {
bool mouseButton(int button) const override;
bool mousePressed(int button) const override;
bool mouseReleased(int button) const override;
bool mouseButtonDoubleClick(int button) const override;

void mouseLockCursor(bool lock) override;
void mouseSetCursor(Input::CursorShape shape) override;
Expand Down Expand Up @@ -80,6 +81,7 @@ class DesktopAdaptor : public PlatformAdaptor {

static std::unordered_map<int32_t, int32_t> s_keys;
static std::unordered_map<int32_t, int32_t> s_mouseButtons;
static std::unordered_map<int32_t, int32_t> s_mouseDoubleClick;
static std::unordered_map<int32_t, GLFWcursor *> s_mouseCursors;

static Vector4 s_mousePosition;
Expand Down
7 changes: 7 additions & 0 deletions engine/includes/adapters/mobileadaptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class MobileAdaptor : public PlatformAdaptor {
bool mouseButton(int button) const override;
bool mousePressed(int button) const override;
bool mouseReleased(int button) const override;
bool mouseButtonDoubleClick(int button) const override;

void mouseLockCursor(bool lock) override;

Expand All @@ -50,6 +51,12 @@ class MobileAdaptor : public PlatformAdaptor {
Vector4 joystickThumbs(int) const override;

public:
static std::unordered_map<int32_t, int32_t> s_keys;
static std::unordered_map<int32_t, std::pair<uint32_t, Vector4>> s_touches;
static std::unordered_map<int32_t, int32_t> s_touchDoubleClick;
static uint64_t s_lastTouchTime;
static int32_t s_lastTouchButton;

static Vector4 s_thumbs;
static Vector4 s_mousePosition;
static Vector4 s_oldMousePosition;
Expand Down
1 change: 1 addition & 0 deletions engine/includes/adapters/platformadaptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class ENGINE_EXPORT PlatformAdaptor {
virtual bool mouseButton(int code) const;
virtual bool mousePressed(int code) const;
virtual bool mouseReleased(int code) const;
virtual bool mouseButtonDoubleClick(int code) const;
virtual void mouseLockCursor(bool lock);
virtual void mouseSetCursor(Input::CursorShape shape);

Expand Down
1 change: 1 addition & 0 deletions engine/includes/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ class ENGINE_EXPORT Input {
static bool isMouseButton(int button);
static bool isMouseButtonDown(int button);
static bool isMouseButtonUp(int button);
static bool isMouseButtonDoubleClick(int button);

static Vector4 mousePosition();
static Vector4 mouseDelta();
Expand Down
23 changes: 23 additions & 0 deletions engine/src/adapters/desktopadaptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ TString DesktopAdaptor::s_inputString;

std::unordered_map<int32_t, int32_t> DesktopAdaptor::s_keys;
std::unordered_map<int32_t, int32_t> DesktopAdaptor::s_mouseButtons;
std::unordered_map<int32_t, int32_t> DesktopAdaptor::s_mouseDoubleClick;
std::unordered_map<int32_t, GLFWcursor *> DesktopAdaptor::s_mouseCursors;

DesktopAdaptor::DesktopAdaptor() :
Expand Down Expand Up @@ -90,6 +91,14 @@ void DesktopAdaptor::update() {
}
}

for(auto &it : s_mouseDoubleClick) {
switch(it.second) {
case RELEASE: it.second = NONE; break;
case PRESS: it.second = REPEAT; break;
default: break;
}
}

s_oldMousePosition = s_mousePosition;

s_mouseScrollDelta = 0.0f;
Expand Down Expand Up @@ -233,6 +242,10 @@ bool DesktopAdaptor::mouseReleased(int button) const {
return (s_mouseButtons[button | 0x10000000] == RELEASE);
}

bool DesktopAdaptor::mouseButtonDoubleClick(int button) const {
return (s_mouseDoubleClick[button | 0x10000000] == PRESS);
}

void DesktopAdaptor::mouseLockCursor(bool lock) {
glfwSetInputMode(m_window, GLFW_CURSOR, lock ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL);
}
Expand Down Expand Up @@ -347,6 +360,16 @@ void DesktopAdaptor::charCallback(GLFWwindow *, unsigned int codepoint) {

void DesktopAdaptor::buttonCallback(GLFWwindow *, int button, int action, int) {
s_mouseButtons[button | 0x10000000] = action;

if (action == PRESS) {
int key = button | 0x10000000;
auto it = s_mouseDoubleClick.find(key);
if (it != s_mouseDoubleClick.end() && it->second == REPEAT) {
s_mouseDoubleClick[key] = PRESS;
} else {
s_mouseDoubleClick[key] = action;
}
}
}

void DesktopAdaptor::scrollCallback(GLFWwindow *, double, double yoffset) {
Expand Down
Loading
Loading