OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 part of polymer; | |
6 | |
7 /// Like [Timer] but can be restarted, and if no duration is supplied uses | |
8 /// [window.requestAnimationFrame] instead of a 0-duration timer. | |
9 // TODO(jmesserly): need to find a better name here. Also this feels more like a | |
10 // system level API, but doesn't map exactly to any of our other primitives. | |
11 class PolymerJob { | |
12 Function _callback; | |
13 Timer _timer; | |
14 int _id; // for requestAnimationFrame | |
15 | |
16 PolymerJob._(); | |
17 | |
18 bool get isScheduled => _timer != null || _id != null; | |
19 | |
20 /// Starts the job. If the job is already running, it will [stop] first. | |
21 void start(void callback(), [Duration wait]) { | |
22 stop(); | |
23 _callback = callback; | |
24 if (wait == null) { | |
25 _id = window.requestAnimationFrame((_) => complete()); | |
26 } else { | |
27 _timer = new Timer(wait, complete); | |
28 } | |
29 } | |
30 | |
31 /// Stops the job. It can be restarted by calling [start] with a new callback. | |
32 void stop() { | |
33 if (_id != null) { | |
34 window.cancelAnimationFrame(_id); | |
35 _id = null; | |
36 } | |
37 if (_timer != null) { | |
38 _timer.cancel(); | |
39 _timer = null; | |
40 } | |
41 } | |
42 | |
43 /// Synchronously completes the job. | |
44 void complete() { | |
45 if (isScheduled) { | |
46 stop(); | |
47 _callback(); | |
48 } | |
49 } | |
50 } | |
OLD | NEW |