OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 'use strict'; | |
6 | |
7 /** | |
8 * A controller class detects mouse inactivity and hides "tool" elements. | |
9 * | |
10 * @param {Element} container The main DOM container. | |
11 * @param {number=} opt_timeout Hide timeout in ms. | |
12 * @param {function():boolean=} opt_toolsActive Function that returns |true| | |
13 * if the tools are active and should not be hidden. | |
14 * @constructor | |
15 */ | |
16 function MouseInactivityWatcher(container, opt_timeout, opt_toolsActive) { | |
17 this.container_ = container; | |
18 this.timeout_ = opt_timeout || MouseInactivityWatcher.DEFAULT_TIMEOUT; | |
19 this.toolsActive_ = opt_toolsActive || function() { return false }; | |
20 | |
21 this.onTimeoutBound_ = this.onTimeout_.bind(this); | |
22 this.timeoutID_ = null; | |
23 this.mouseOverTool_ = false; | |
24 | |
25 this.clientX_ = 0; | |
26 this.clientY_ = 0; | |
27 | |
28 /** | |
29 * Indicates if the inactivity watcher is enabled or disabled. Use getters | |
30 * and setters. | |
31 * @type {boolean} | |
32 * @private | |
33 **/ | |
34 this.disabled_ = false; | |
35 this.__defineSetter__('disabled', function(value) { | |
36 this.disabled_ = value; | |
37 if (value) | |
38 this.kick(); | |
39 else | |
40 this.check(); | |
41 }); | |
42 this.__defineGetter__('disabled', function() { | |
43 return this.disabled_; | |
44 }); | |
45 | |
46 this.container_.addEventListener('mousemove', this.onMouseMove_.bind(this)); | |
47 var tools = this.container_.querySelector('.tool'); | |
48 for (var i = 0; i < tools.length; i++) { | |
49 tools[i].addEventListener('mouseover', this.onToolMouseOver_.bind(this)); | |
50 tools[i].addEventListener('mouseout', this.onToolMouseOut_.bind(this)); | |
51 } | |
52 | |
53 // Show tools when the user touches the screen. | |
54 this.container_.addEventListener( | |
55 'touchstart', this.activityStarted_.bind(this)); | |
56 var initiateFading = this.activityStopped_.bind(this, this.timeout_); | |
57 this.container_.addEventListener('touchend', initiateFading); | |
58 this.container_.addEventListener('touchcancel', initiateFading); | |
59 } | |
60 | |
61 /** | |
62 * Default inactivity timeout. | |
63 */ | |
64 MouseInactivityWatcher.DEFAULT_TIMEOUT = 3000; | |
65 | |
66 /** | |
67 * @param {boolean} on True if show, false if hide. | |
68 */ | |
69 MouseInactivityWatcher.prototype.showTools = function(on) { | |
70 if (on) | |
71 this.container_.setAttribute('tools', 'true'); | |
72 else | |
73 this.container_.removeAttribute('tools'); | |
74 }; | |
75 | |
76 /** | |
77 * To be called when the user started activity. Shows the tools | |
78 * and cancels the countdown. | |
79 * @private | |
80 */ | |
81 MouseInactivityWatcher.prototype.activityStarted_ = function() { | |
82 this.showTools(true); | |
83 | |
84 if (this.timeoutID_) { | |
85 clearTimeout(this.timeoutID_); | |
86 this.timeoutID_ = null; | |
87 } | |
88 }; | |
89 | |
90 /** | |
91 * Called when user activity has stopped. Re-starts the countdown. | |
92 * @param {number=} opt_timeout Timeout. | |
93 * @private | |
94 */ | |
95 MouseInactivityWatcher.prototype.activityStopped_ = function(opt_timeout) { | |
96 if (this.disabled_ || this.mouseOverTool_ || this.toolsActive_()) | |
97 return; | |
98 | |
99 if (this.timeoutID_) | |
100 clearTimeout(this.timeoutID_); | |
101 | |
102 this.timeoutID_ = setTimeout( | |
103 this.onTimeoutBound_, opt_timeout || this.timeout_); | |
104 }; | |
105 | |
106 /** | |
107 * Called when a user performed a short action (such as a click or a key press) | |
108 * that should show the tools if they are not visible. | |
109 * @param {number=} opt_timeout Timeout. | |
110 */ | |
111 MouseInactivityWatcher.prototype.kick = function(opt_timeout) { | |
112 this.activityStarted_(); | |
113 this.activityStopped_(opt_timeout); | |
114 }; | |
115 | |
116 /** | |
117 * Check if the tools are active and update the tools visibility accordingly. | |
118 */ | |
119 MouseInactivityWatcher.prototype.check = function() { | |
120 if (this.toolsActive_()) | |
121 this.activityStarted_(); | |
122 else | |
123 this.activityStopped_(); | |
124 }; | |
125 | |
126 /** | |
127 * Mouse move handler. | |
128 * | |
129 * @param {Event} e Event. | |
130 * @private | |
131 */ | |
132 MouseInactivityWatcher.prototype.onMouseMove_ = function(e) { | |
133 if (this.clientX_ == e.clientX && this.clientY_ == e.clientY) { | |
134 // The mouse has not moved, must be the cursor change triggered by | |
135 // some of the attributes on the root container. Ignore the event. | |
136 return; | |
137 } | |
138 this.clientX_ = e.clientX; | |
139 this.clientY_ = e.clientY; | |
140 | |
141 if (this.disabled_) | |
142 return; | |
143 | |
144 this.kick(); | |
145 }; | |
146 | |
147 /** | |
148 * Mouse over handler on a tool element. | |
149 * | |
150 * @param {Event} e Event. | |
151 * @private | |
152 */ | |
153 MouseInactivityWatcher.prototype.onToolMouseOver_ = function(e) { | |
154 this.mouseOverTool_ = true; | |
155 if (!this.disabled_) | |
156 this.kick(); | |
157 }; | |
158 | |
159 /** | |
160 * Mouse out handler on a tool element. | |
161 * | |
162 * @param {Event} e Event. | |
163 * @private | |
164 */ | |
165 MouseInactivityWatcher.prototype.onToolMouseOut_ = function(e) { | |
166 this.mouseOverTool_ = false; | |
167 if (!this.disabled_) | |
168 this.kick(); | |
169 }; | |
170 | |
171 /** | |
172 * Timeout handler. | |
173 * @private | |
174 */ | |
175 MouseInactivityWatcher.prototype.onTimeout_ = function() { | |
176 this.timeoutID_ = null; | |
177 if (!this.disabled_ && !this.toolsActive_()) | |
178 this.showTools(false); | |
179 }; | |
OLD | NEW |