Files
dotfiles/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js

258 lines
6.4 KiB
JavaScript

/*
Copyright (C) 2013 Borsato Ivano
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
*/
'use strict';
import GObject from 'gi://GObject';
import GLib from 'gi://GLib';
import * as Lib from './convenience.js';
/*
DELAY TIMER
*/
let DelaySec = 0;
let timerDelayId = null;
let CallbackFuncDelay = null;
let ElapsedSec;
/**
* @type {TimerDelay}
*/
export const TimerDelay = GObject.registerClass({
GTypeName: 'EasyScreenCast_TimerDelay',
}, class TimerDelay extends GObject.Object {
/**
* Create a new timer
*
* @param {number} delay delay in seconds
* @param {Function} callback callback function that is called after delay seconds (without arguments)
* @param {*} scope scope for the callback
*/
constructor(delay, callback, scope) {
super();
if (isNaN(delay)) {
Lib.TalkativeLog(`-%-delay is NOT a number :${delay}`);
} else {
Lib.TalkativeLog(`-%-init TimerDelay called - sec : ${delay}`);
DelaySec = delay;
ElapsedSec = 1;
this.setCallback(callback);
this.Scope = scope;
}
}
/**
* Set the callback-function
*
* @param {Function} callback callback function that is called after delay seconds (without arguments)
*/
setCallback(callback) {
Lib.TalkativeLog('-%-setcallback TimerDelay called');
if (
callback === undefined ||
callback === null ||
typeof callback !== 'function'
)
throw TypeError("'callback' needs to be a function.");
CallbackFuncDelay = callback;
}
/**
* Set the delay time
*
* @param {number} delay delay in seconds
*/
setDelay(delay) {
Lib.TalkativeLog(`-%-setdelay TimerDelay called: ${delay}`);
DelaySec = delay;
}
/**
* Start or restart a new timer
*/
begin() {
Lib.TalkativeLog('-%-start TimerDelay called');
this.stop();
timerDelayId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () =>
this._callbackInternal()
);
}
/**
* Stop the current timer
*/
stop() {
Lib.TalkativeLog('-%-stop TimerDelay called');
if (timerDelayId !== null) {
if (GLib.source_remove(timerDelayId)) {
timerDelayId = null;
ElapsedSec = 1;
}
}
}
/**
* A convenient way to restart the timer.
*/
restart() {
this.stop();
this.begin();
}
/**
* The internal callback-function.
*
* @private
* @returns {boolean}
*/
_callbackInternal() {
Lib.TalkativeLog(`-%-internalFunction TimerDelay called | Sec = ${ElapsedSec} Sec delay = ${DelaySec}`);
if (ElapsedSec >= DelaySec) {
CallbackFuncDelay.apply(this.Scope, []);
ElapsedSec = 1;
return false;
} else {
ElapsedSec++;
return true;
}
}
});
/*
COUNTING TIMER
*/
let timerCountingId = null;
let CallbackFuncCounting = null;
let isRunning = false;
let secpassed = 0;
/**
* @type {TimerCounting}
*/
export const TimerCounting = GObject.registerClass({
GTypeName: 'EasyScreenCast_TimerCounting',
}, class TimerCounting extends GObject.Object {
/**
* Callback for the counting timer.
*
* @callback TimerCounting~callback
* @param {number} count seconds passed
* @param {boolean} alertEnd whether the timer is ending
*/
/**
* Create a new timer
*
* @param {TimerCounting~callback} callback callback function that is called every second
* @param {EasyScreenCast_Indicator} scope scope for the callback function. This is also used to updateTimeLabel.
*/
constructor(callback, scope) {
super();
Lib.TalkativeLog('-%-init TimerCounting called');
this.setCallback(callback);
secpassed = 0;
this.Scope = scope;
}
/**
* Set the callback-function
*
* @param {TimerCounting~callback} callback callback function that is called every second
*/
setCallback(callback) {
Lib.TalkativeLog('-%-setcallback TimerCounting called');
if (
callback === undefined ||
callback === null ||
typeof callback !== 'function'
)
throw TypeError("'callback' needs to be a function.");
CallbackFuncCounting = callback;
}
/**
* Start or restart a new timer
*/
begin() {
Lib.TalkativeLog('-%-start TimerCounting called');
if (isRunning)
this.stop();
isRunning = true;
timerCountingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () =>
this._callbackInternal()
);
}
/**
* Stop the current timer
*/
stop() {
Lib.TalkativeLog('-%-stop TimerCounting called');
isRunning = false;
if (timerCountingId !== null && GLib.source_remove(timerCountingId))
timerCountingId = null;
}
/**
* A convenient way to stop timer
*/
halt() {
isRunning = false;
}
/**
* The internal callback-function. Calls a function that handles
* the desktop notifications and one that sets the time label next
* to the icon.
*
* @private
* @returns {boolean}
*/
_callbackInternal() {
if (isRunning === false) {
Lib.TalkativeLog('-%-finish TimerCounting ');
CallbackFuncCounting.apply(this.Scope, [secpassed, true]);
secpassed = 0;
this.stop();
this.Scope.updateTimeLabel('');
return false;
} else {
secpassed++;
Lib.TalkativeLog(`-%-continued TimerCounting | sec: ${secpassed}`);
CallbackFuncCounting.apply(this.Scope, [secpassed, false]);
this.Scope.updateTimeLabel(secpassed);
return true;
}
}
});