From e058af3471cf1445de3260f5b3514529eb9bc744 Mon Sep 17 00:00:00 2001 From: Alex Ionochkin Date: Wed, 4 Mar 2015 11:13:01 +0000 Subject: [PATCH] customview: keyboard handling --- package.json | 2 +- .../scrollview/customscrollviewinner.coffee | 74 +++++++++++++++++++ src/themes/default/kd.scrollview.styl | 3 + 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 96b4c655..d783861b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kdf", - "version": "0.1.14", + "version": "0.1.15", "description": "KD: a non-document focused UI Framework for web applications.", "main": "gulpfile.js", "scripts": { diff --git a/src/components/scrollview/customscrollviewinner.coffee b/src/components/scrollview/customscrollviewinner.coffee index 235371e2..5e1895a0 100644 --- a/src/components/scrollview/customscrollviewinner.coffee +++ b/src/components/scrollview/customscrollviewinner.coffee @@ -5,6 +5,25 @@ KDScrollTrack = require './scrolltrack' module.exports = class KDCustomScrollViewWrapper extends KDScrollView + SPACEBAR = 32 + PAGEUP = 33 + PAGEDOWN = 34 + END = 35 + HOME = 36 + + constructor: (options = {}, data) -> + + options.bind = KD.utils.curry 'keydown', options.bind + options.attributes ?= {} + options.attributes.tabindex ?= "0" + + @globalKeydownEventBound = no + + super options, data + + @on 'MutationHappened', @bound "toggleGlobalKeydownEventOnSizeCheck" + + scroll: (event) -> if @verticalThumb.beingDragged or @horizontalThumb.beingDragged @@ -70,3 +89,58 @@ module.exports = class KDCustomScrollViewWrapper extends KDScrollView @setScrollLeft lastPosition = newPosition return shouldStop + + + toggleGlobalKeydownEventOnSizeCheck: -> + + winHeight = $(window).height() + needToBind = @getHeight() >= winHeight + @toggleGlobalKeydownEvent needToBind + + + toggleGlobalKeydownEvent: (needToBind) -> + + eventName = "keydown.customscroll#{@getId()}" + + if needToBind + $(document).on eventName, @bound "keyDown" unless @globalKeydownEventBound + else + $(document).off eventName if @globalKeydownEventBound + + @globalKeydownEventBound = needToBind + + + destroy: -> + + @toggleGlobalKeydownEvent no + super + + + pageUp: -> + @scrollTo top : Math.max @getScrollTop() - @getHeight(), 0 + + + pageDown: -> + @scrollTo top : @getScrollTop() + @getHeight() + + + keyDown: (event) -> + + editables = "input,textarea,select,datalist,keygen,[contenteditable='true']" + + return yes if ($ document.activeElement).is editables + return yes if not(@getDomElement().is ":visible") + return yes if @getScrollHeight() <= @verticalThumb.getTrackSize() + + shouldPropagate = no + if event.which is SPACEBAR and event.shiftKey + @pageUp() + else + switch event.which + when PAGEUP then @pageUp() + when SPACEBAR, PAGEDOWN then @pageDown() + when END then @scrollToBottom() + when HOME then @scrollTo top : 0 + else shouldPropagate = yes + + return shouldPropagate \ No newline at end of file diff --git a/src/themes/default/kd.scrollview.styl b/src/themes/default/kd.scrollview.styl index 2f3ca438..2ec4ec74 100755 --- a/src/themes/default/kd.scrollview.styl +++ b/src/themes/default/kd.scrollview.styl @@ -24,6 +24,9 @@ overflow hidden !important height 100% + &:focus + outline none + .kdscrolltrack right 0 z-index 1000