Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mac buttons #30

Merged
merged 9 commits into from
Nov 1, 2021
Merged
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
1 change: 1 addition & 0 deletions examples/callbacks.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import opengl, os, windy

let window = newWindow("Windy Callbacks", ivec2(1280, 800))
window.runeInputEnabled = true

window.makeContextCurrent()
loadExtensions()
Expand Down
102 changes: 101 additions & 1 deletion src/windy/internal.nim
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import common, vmath

const
multiClickRadius = 4

type
State* = object
title*: string
closeRequested*, closed*: bool
mousePos*: IVec2
buttonPressed*, buttonDown*, buttonReleased*, buttonToggle*: set[Button]
buttonDown*, buttonToggle*: set[Button]
perFrame*: PerFrame

doubleClickTime*: float64
Expand All @@ -21,3 +24,100 @@ type
mousePrevPos*: IVec2
mouseDelta*: IVec2
scrollDelta*: Vec2
buttonPressed*, buttonReleased*: set[Button]

var
initialized*: bool
platformDoubleClickInterval*: float64

template handleButtonPressTemplate*() =
window.state.buttonDown.incl button
window.state.perFrame.buttonPressed.incl button
if button in window.state.buttonToggle:
window.state.buttonToggle.excl button
else:
window.state.buttonToggle.incl button
if window.onButtonPress != nil:
window.onButtonPress(button)

if button == MouseLeft:
let
clickTime = epochTime()
mousePos = window.state.mousePos
scaledMultiClickRadius = multiClickRadius * window.contentScale

let
doubleClickInterval = clickTime - window.state.doubleClickTime
doubleClickDistance =
(mousePos - window.state.multiClickPositions[0]).vec2.length
if doubleClickInterval <= platformDoubleClickInterval and
doubleClickDistance <= scaledMultiClickRadius:
window.handleButtonPress(DoubleClick)
window.state.doubleClickTime = 0
else:
window.state.doubleClickTime = clickTime

let
tripleClickIntervals = [
clickTime - window.state.tripleClickTimes[0],
clickTime - window.state.tripleClickTimes[1]
]
tripleClickInterval = tripleClickIntervals[0] + tripleClickIntervals[1]
tripleClickDistance =
(mousePos - window.state.multiClickPositions[1]).vec2.length

if tripleClickInterval < 2 * platformDoubleClickInterval and
tripleClickDistance <= scaledMultiClickRadius:
window.handleButtonPress(TripleClick)
window.state.tripleClickTimes = [0.float64, 0]
else:
window.state.tripleClickTimes[1] = window.state.tripleClickTimes[0]
window.state.tripleClickTimes[0] = clickTime

let
quadrupleClickIntervals = [
clickTime - window.state.quadrupleClickTimes[0],
clickTime - window.state.quadrupleClickTimes[1],
clickTime - window.state.quadrupleClickTimes[2]
]
quadrupleClickInterval =
quadrupleClickIntervals[0] +
quadrupleClickIntervals[1] +
quadrupleClickIntervals[2]
quadrupleClickDistance =
(mousePos - window.state.multiClickPositions[2]).vec2.length

if quadrupleClickInterval < 3 * platformDoubleClickInterval and
quadrupleClickDistance <= multiClickRadius:
window.handleButtonPress(QuadrupleClick)
window.state.quadrupleClickTimes = [0.float64, 0, 0]
else:
window.state.quadrupleClickTimes[2] = window.state.quadrupleClickTimes[1]
window.state.quadrupleClickTimes[1] = window.state.quadrupleClickTimes[0]
window.state.quadrupleClickTimes[0] = clickTime

window.state.multiClickPositions[2] = window.state.multiClickPositions[1]
window.state.multiClickPositions[1] = window.state.multiClickPositions[0]
window.state.multiClickPositions[0] = mousePos

template handleButtonReleaseTemplate*() =
if button == MouseLeft:
if QuadrupleClick in window.state.buttonDown:
window.handleButtonRelease(QuadrupleClick)
if TripleClick in window.state.buttonDown:
window.handleButtonRelease(TripleClick)
if DoubleClick in window.state.buttonDown:
window.handleButtonRelease(DoubleClick)

window.state.buttonDown.excl button
window.state.perFrame.buttonReleased.incl button
if window.onButtonRelease != nil:
window.onButtonRelease(button)

template handleRuneTemplate*() =
if not window.state.runeInputEnabled:
return
if rune.uint32 < 32 or (rune.uint32 > 126 and rune.uint32 < 160):
return
if window.onRune != nil:
window.onRune(rune)
Loading