Skip to content

Commit

Permalink
refactor(Mouse class): removed MouseButton enum
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Instead of a `MouseButton` enum value, both
`Mouse.isPressed()` and `Mouse.wasPressed()` now accept a string
(`'left'`, `'middle'` or `'right'`) or a number (`0`, `1` or `2`).
  • Loading branch information
niklashigi committed Dec 26, 2017
1 parent 2c7748a commit 704e678
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export { Mouse, MouseButton } from './inputs/mouse'
export { Mouse } from './inputs/mouse'
export { Keyboard } from './inputs/keyboard'
export { Gamepad } from './inputs/gamepad'
44 changes: 34 additions & 10 deletions src/inputs/mouse.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as Mocha from 'mocha'
import { ICanvas, IDocument } from '../apis'
import { Vector2 } from '../utils/math'
import { MockEventTarget } from '../utils/mock'
import { Mouse, MouseButton } from './mouse'
import { Mouse } from './mouse'

class MockCanvas extends MockEventTarget implements ICanvas {

Expand Down Expand Up @@ -42,34 +42,58 @@ describe('The `Mouse` class', () => {
].sort())
})

describe('should have a `parseButton()` method that', () => {

it('correctly parses button names', () => {
expect(mouse.parseButton('left')).to.equal(0)
expect(mouse.parseButton('middle')).to.equal(1)
expect(mouse.parseButton('right')).to.equal(2)
})

it('returns button numbers unchanged', () => {
expect(mouse.parseButton(0)).to.equal(0)
expect(mouse.parseButton(1)).to.equal(1)
expect(mouse.parseButton(2)).to.equal(2)
})

it("throws an error when the named button doesn't exist", () => {
expect(() => mouse.parseButton('lul')).to.throw(Error, 'There is no mouse button called "lul"!')
})

it('throws an error when the button number is out of range', () => {
expect(() => mouse.parseButton(42)).to.throw(Error, 'There is no mouse button with the index 42!')
})

})

describe('should have an `isPressed()` method that', () => {

it('returns `true` when the mouse button is pressed', () => {
canvas.listeners.mousedown({ button: MouseButton.Left })
expect(mouse.isPressed(MouseButton.Left)).to.equal(true)
canvas.listeners.mousedown({ button: 0 })
expect(mouse.isPressed('left')).to.equal(true)
})

it('returns `false` when the mouse button is not pressed', () => {
canvas.listeners.mouseup({ button: MouseButton.Left })
expect(mouse.isPressed(MouseButton.Left)).to.equal(false)
canvas.listeners.mouseup({ button: 0 })
expect(mouse.isPressed('left')).to.equal(false)
})

})

describe('should have a `wasPressed()` method that', () => {

it('returns `false` when the button is not pressed', () => {
canvas.listeners.mouseup({ button: MouseButton.Left })
expect(mouse.wasPressed(MouseButton.Left)).to.equal(false)
canvas.listeners.mouseup({ button: 0 })
expect(mouse.wasPressed('left')).to.equal(false)
})

it('returns `true` once after the button was pressed', () => {
canvas.listeners.mousedown({ button: MouseButton.Left })
expect(mouse.wasPressed(MouseButton.Left)).to.equal(true)
canvas.listeners.mousedown({ button: 0 })
expect(mouse.wasPressed('left')).to.equal(true)
})

it('returns `false` after button state was queried', () => {
expect(mouse.wasPressed(MouseButton.Left)).to.equal(false)
expect(mouse.wasPressed('left')).to.equal(false)
})

})
Expand Down
32 changes: 23 additions & 9 deletions src/inputs/mouse.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import { ICanvas, IDocument } from '../apis'
import { Vector2 } from '../utils/math'

export enum MouseButton {
Left,
Middle,
Right,
}
const mouseButtons = ['left', 'middle', 'right']

export class Mouse {

Expand All @@ -14,8 +10,8 @@ export class Mouse {

private pointerLocked: boolean = false
private pointerMovement: Vector2 = new Vector2()
private pressedButtons: Set<MouseButton> = new Set()
private queuedButtons: Set<MouseButton> = new Set()
private pressedButtons: Set<number> = new Set()
private queuedButtons: Set<number> = new Set()
private scrollDistance = 0

constructor({ canvas, doc = document }: { canvas: ICanvas, doc?: IDocument }) {
Expand Down Expand Up @@ -48,11 +44,29 @@ export class Mouse {
on = this.document.addEventListener.bind(this.document)
}

public isPressed(/* istanbul ignore next */ button: MouseButton = MouseButton.Left) {
public parseButton(button: string | number): number {
if (typeof button === 'string') {
if (mouseButtons.includes(button)) {
return mouseButtons.indexOf(button)
} else {
throw new Error(`There is no mouse button called "${button}"!`)
}
} else {
if (button < mouseButtons.length) {
return button
} else {
throw new Error(`There is no mouse button with the index ${button}!`)
}
}
}

public isPressed(button: string | number) {
button = this.parseButton(button)
return this.pressedButtons.has(button)
}

public wasPressed(/* istanbul ignore next */ button: MouseButton = MouseButton.Left) {
public wasPressed(button: string | number) {
button = this.parseButton(button)
if (this.queuedButtons.has(button)) {
this.queuedButtons.delete(button)
return true
Expand Down
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"target": "ES2016",
"noImplicitAny": true,
"declaration": true,
"outDir": "./disto/"
},
"lib": ["dom", "es5", "es6", "es7"],
"lib": ["DOM", "ES2015", "ES2016", "ES2016.Array.Include"],
"exclude": [
"node_modules",
"src/**/*.spec.ts"
Expand Down

0 comments on commit 704e678

Please sign in to comment.