| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import 'dart:async';
- import 'package:xterm/util/observable.dart';
- class Oscillator with Observable {
- Oscillator(this.duration);
- Oscillator.ms(int ms) : duration = Duration(milliseconds: ms);
- final Duration duration;
- var _value = true;
- Timer? _timer;
- var _shouldRun = false;
- @override
- void addListener(listener) {
- super.addListener(listener);
- resume();
- }
- @override
- void removeListener(listener) {
- super.removeListener(listener);
- if (listeners.isEmpty) {
- pause();
- }
- }
- void _onOscillation(_) {
- _value = !_value;
- notifyListeners();
- }
- bool get value {
- return _value;
- }
- void restart() {
- stop();
- start();
- }
- void start() {
- _value = true;
- _shouldRun = true;
- // only start right away when anyone is listening.
- // the moment a listener gets registered the Oscillator will start
- if (listeners.isNotEmpty) {
- _startInternal();
- }
- }
- void _startInternal() {
- if (_timer != null) return;
- _timer = Timer.periodic(duration, _onOscillation);
- }
- void pause() {
- _stopInternal();
- }
- void resume() {
- if (_shouldRun) {
- _startInternal();
- }
- }
- void stop() {
- _shouldRun = false;
- _stopInternal();
- }
- void _stopInternal() {
- _timer?.cancel();
- _timer = null;
- }
- }
|