Skip to content

Commit

Permalink
Merge pull request #30 from guzba/master
Browse files Browse the repository at this point in the history
mac buttons
  • Loading branch information
treeform authored Nov 1, 2021
2 parents 352e9a2 + 3ac1f9d commit b67e807
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 123 deletions.
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

0 comments on commit b67e807

Please sign in to comment.