93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
function clamp(value, minimum, maximum) {
|
||
return Math.max(minimum, Math.min(maximum, value));
|
||
}
|
||
|
||
function finiteNumber(value, fallback) {
|
||
var parsed = Number(value);
|
||
return isFinite(parsed) ? parsed : fallback;
|
||
}
|
||
|
||
function iconFor(kind, ratio) {
|
||
var name = String(kind || "").toLowerCase();
|
||
if (name === "volume-muted")
|
||
return "audio-volume-muted-symbolic";
|
||
if (name === "volume") {
|
||
if (ratio <= 0)
|
||
return "audio-volume-muted-symbolic";
|
||
if (ratio < 0.34)
|
||
return "audio-volume-low-symbolic";
|
||
if (ratio < 0.67)
|
||
return "audio-volume-medium-symbolic";
|
||
return "audio-volume-high-symbolic";
|
||
}
|
||
if (name === "microphone-muted")
|
||
return "microphone-sensitivity-muted-symbolic";
|
||
if (name === "microphone")
|
||
return "audio-input-microphone-symbolic";
|
||
if (name === "brightness")
|
||
return "display-brightness-symbolic";
|
||
// The magnifier, stepped from SUPER+ALT+= / - / 0. Ratio 0 is 1.00 ×,
|
||
// which is the magnifier switched off, so it gets the "actual size" icon
|
||
// rather than a magnifying glass claiming to be magnifying.
|
||
if (name === "zoom")
|
||
return ratio <= 0 ? "zoom-original-symbolic" : "zoom-in-symbolic";
|
||
if (name === "media-play" || name === "media-playing")
|
||
return "media-playback-start-symbolic";
|
||
if (name === "media-pause" || name === "media-paused")
|
||
return "media-playback-pause-symbolic";
|
||
if (name === "media-next")
|
||
return "media-skip-forward-symbolic";
|
||
if (name === "media-previous")
|
||
return "media-skip-backward-symbolic";
|
||
if (name === "media-stop")
|
||
return "media-playback-stop-symbolic";
|
||
return name || "dialog-information-symbolic";
|
||
}
|
||
|
||
function normalizedDuration(value) {
|
||
var parsed = finiteNumber(value, 1400);
|
||
return Math.max(0, Math.round(parsed));
|
||
}
|
||
|
||
function progressState(kind, rawValue, rawMaximum, rawLabel, rawDuration) {
|
||
var maximum = Math.max(1, finiteNumber(rawMaximum, 100));
|
||
var value = clamp(finiteNumber(rawValue, 0), 0, maximum);
|
||
var ratio = value / maximum;
|
||
var label = String(rawLabel || "");
|
||
if (!label)
|
||
label = Math.round(ratio * 100) + "%";
|
||
|
||
return {
|
||
kind: String(kind || ""),
|
||
value: value,
|
||
maximum: maximum,
|
||
ratio: ratio,
|
||
label: label,
|
||
icon: iconFor(kind, ratio),
|
||
duration: normalizedDuration(rawDuration),
|
||
progress: true
|
||
};
|
||
}
|
||
|
||
function messageState(kind, rawLabel, rawDuration) {
|
||
return {
|
||
kind: String(kind || ""),
|
||
value: 0,
|
||
maximum: 100,
|
||
ratio: 0,
|
||
label: String(rawLabel || ""),
|
||
icon: iconFor(kind, 0),
|
||
duration: normalizedDuration(rawDuration),
|
||
progress: false
|
||
};
|
||
}
|
||
|
||
if (typeof module !== "undefined") {
|
||
module.exports = {
|
||
clamp: clamp,
|
||
iconFor: iconFor,
|
||
progressState: progressState,
|
||
messageState: messageState
|
||
};
|
||
}
|