99 lines
3.2 KiB
QML
99 lines
3.2 KiB
QML
pragma Singleton
|
|
|
|
// One presentation model for state that remains active until it is explicitly
|
|
// stopped or naturally completes. Transient confirmations stay in Signal Glass.
|
|
|
|
import Quickshell
|
|
import QtQuick
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
readonly property var activities: {
|
|
const result = [];
|
|
|
|
if (FocusSession.active) {
|
|
result.push({
|
|
kind: "focus",
|
|
glyph: "\u{F051F}",
|
|
label: "Focus session",
|
|
detail: (FocusSession.workspaceLabel || "Focused workspace") + " · " + FocusSession.statusText,
|
|
state: FocusSession.remainingText,
|
|
tone: FocusSession.paused ? "warn" : "accent",
|
|
action: FocusSession.paused ? "Resume" : "Pause"
|
|
});
|
|
}
|
|
|
|
if (Caffeine.enabled) {
|
|
result.push({
|
|
kind: "caffeine",
|
|
glyph: "\u{F0F2E}",
|
|
label: "Caffeine",
|
|
detail: "Automatic sleep is blocked",
|
|
state: "On",
|
|
tone: "ok",
|
|
action: "Turn off"
|
|
});
|
|
}
|
|
|
|
if (PrivacyState.recordingActive) {
|
|
result.push({
|
|
kind: "recording",
|
|
glyph: "\u{F044A}",
|
|
label: "Screen recording",
|
|
detail: "Panama · " + root.recordingElapsed,
|
|
state: "Live",
|
|
tone: "danger",
|
|
action: "Stop"
|
|
});
|
|
}
|
|
if (PrivacyState.screenSharingActive)
|
|
result.push(root.privacyActivity("screen", "\u{F0379}", "Screen sharing", PrivacyState.screenSharingApp));
|
|
if (PrivacyState.cameraActive)
|
|
result.push(root.privacyActivity("camera", "\u{F0100}", "Camera", PrivacyState.cameraApp));
|
|
if (PrivacyState.microphoneActive)
|
|
result.push(root.privacyActivity("microphone", "\u{F036C}", "Microphone", PrivacyState.microphoneApp));
|
|
|
|
return result;
|
|
}
|
|
|
|
readonly property int count: activities.length
|
|
readonly property string recordingElapsed: {
|
|
const total = Capture.recordingSeconds;
|
|
const seconds = String(total % 60).padStart(2, "0");
|
|
const minutes = Math.floor(total / 60) % 60;
|
|
const hours = Math.floor(total / 3600);
|
|
return hours > 0
|
|
? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}`
|
|
: `${minutes}:${seconds}`;
|
|
}
|
|
|
|
function privacyActivity(kind: string, glyph: string, label: string, app: string): var {
|
|
return {
|
|
kind,
|
|
glyph,
|
|
label,
|
|
detail: app || "Managed by the application",
|
|
state: "In use",
|
|
tone: "warn",
|
|
action: ""
|
|
};
|
|
}
|
|
|
|
function activate(kind: string): void {
|
|
if (kind === "focus")
|
|
FocusSession.activateWorkspace();
|
|
else if (["recording", "screen", "camera", "microphone"].indexOf(kind) >= 0)
|
|
ShellState.open("activity");
|
|
}
|
|
|
|
function invoke(kind: string): void {
|
|
if (kind === "focus")
|
|
FocusSession.pauseOrResume();
|
|
else if (kind === "caffeine")
|
|
Caffeine.toggle();
|
|
else if (kind === "recording")
|
|
Capture.stopRecording();
|
|
}
|
|
}
|