Closes #296.
Unified · Split
| @@ -15,6 +15,9 @@ class app.Shortcuts · 14 unmodified lines | ||
| 15 | 15 | $.off document, 'keypress', @onKeypress |
| 16 | 16 | return |
| 17 | 17 | |
| 18 | + swapArrowKeysBehavior: -> | |
| 19 | + app.settings.get('arrowScroll') | |
| 20 | + | |
| 18 | 21 | showTip: -> |
| 19 | 22 | app.showTip('KeyNav') |
| 20 | 23 | @showTip = null |
| @@ -40,7 +43,9 @@ class app.Shortcuts · 19 unmodified lines | ||
| 40 | 43 | event.preventDefault() if result is false |
| 41 | 44 | return |
| 42 | 45 | |
| 43 | − handleKeydownEvent: (event) -> | |
| 46 | + handleKeydownEvent: (event, _force) -> | |
| 47 | + return @handleKeydownAltEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior() | |
| 48 | + | |
| 44 | 49 | if not event.target.form and (48 <= event.which <= 57 or 65 <= event.which <= 90) |
| 45 | 50 | @trigger 'typing' |
| 46 | 51 | return |
| @@ -100,7 +105,9 @@ class app.Shortcuts · 53 unmodified lines | ||
| 100 | 105 | @trigger 'pageBottom' |
| 101 | 106 | false |
| 102 | 107 | |
| 103 | − handleKeydownShiftEvent: (event) -> | |
| 108 | + handleKeydownShiftEvent: (event, _force) -> | |
| 109 | + return @handleKeydownEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior() | |
| 110 | + | |
| 104 | 111 | if not event.target.form and 65 <= event.which <= 90 |
| 105 | 112 | @trigger 'typing' |
| 106 | 113 | return |
| @@ -118,7 +125,9 @@ class app.Shortcuts · 11 unmodified lines | ||
| 118 | 125 | @trigger 'altDown' |
| 119 | 126 | false |
| 120 | 127 | |
| 121 | − handleKeydownAltEvent: (event) -> | |
| 128 | + handleKeydownAltEvent: (event, _force) -> | |
| 129 | + return @handleKeydownEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior() | |
| 130 | + | |
| 122 | 131 | switch event.which |
| 123 | 132 | when 9 |
| 124 | 133 | @trigger 'altRight', event |
| @@ -24,6 +24,10 @@ app.templates.settingsPage = (settings) -> """ · 23 unmodified lines | ||
| 24 | 24 | <label class="_settings-label"> |
| 25 | 25 | <input type="checkbox" name="smoothScroll" value="1"#{if settings.smoothScroll then ' checked' else ''}>Use smooth scrolling |
| 26 | 26 | </label> |
| 27 | + <label class="_settings-label"> | |
| 28 | + <input type="checkbox" name="arrowScroll" value="1"#{if settings.arrowScroll then ' checked' else ''}>Use arrow keys to scroll the main content area | |
| 29 | + <small>With this checked, use <code class="_label">alt</code> + <code class="_label">↑</code><code class="_label">↓</code><code class="_label">←</code><code class="_label">→</code> to navigate the sidebar.</small> | |
| 30 | + </label> | |
| 27 | 31 | </div> |
| 28 | 32 | </div> |
| 29 | 33 | |
| @@ -15,6 +15,7 @@ class app.views.SettingsPage extends app.View · 14 unmodified lines | ||
| 15 | 15 | settings = {} |
| 16 | 16 | settings.dark = app.settings.get('dark') |
| 17 | 17 | settings.smoothScroll = !app.settings.get('fastScroll') |
| 18 | + settings.arrowScroll = app.settings.get('arrowScroll') | |
| 18 | 19 | settings[layout] = app.settings.hasLayout(layout) for layout in LAYOUTS |
| 19 | 20 | settings |
| 20 | 21 | |
| @@ -40,6 +41,10 @@ class app.views.SettingsPage extends app.View · 19 unmodified lines | ||
| 40 | 41 | app.settings.set('fastScroll', !enable) |
| 41 | 42 | return |
| 42 | 43 | |
| 44 | + toggle: (name, enable) -> | |
| 45 | + app.settings.set(name, enable) | |
| 46 | + return | |
| 47 | + | |
| 43 | 48 | onChange: (event) => |
| 44 | 49 | input = event.target |
| 45 | 50 | switch input.name |
| @@ -49,6 +54,8 @@ class app.views.SettingsPage extends app.View · 3 unmodified lines | ||
| 49 | 54 | @toggleLayout input.value, input.checked |
| 50 | 55 | when 'smoothScroll' |
| 51 | 56 | @toggleSmoothScroll input.checked |
| 57 | + else | |
| 58 | + @toggle input.name, input.checked | |
| 52 | 59 | return |
| 53 | 60 | |
| 54 | 61 | onRoute: (route) => |