1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-07 14:05:38 -05:00
Files
DankMaterialShell/Services/NotificationSettings.qml
2025-07-21 00:50:33 -04:00

194 lines
5.7 KiB
QML

pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
Singleton {
id: root
// General notification settings
property bool notificationsEnabled: true
property bool soundEnabled: true
property bool persistNotifications: true
property int defaultTimeout: 5000 // milliseconds
// Grouping settings
property bool enableSmartGrouping: true
property bool autoExpandConversations: true
property bool replaceMediaNotifications: true
// Persistence settings
property int maxStoredNotifications: 100
property int notificationRetentionDays: 7
// Display settings
property bool showNotificationPopups: true
property bool showAppIcons: true
property bool showTimestamps: true
property bool enableInlineReply: true
property bool showActionButtons: true
// Priority settings
property bool allowCriticalNotifications: true
property bool respectDoNotDisturb: true
// App-specific settings
property var appSettings: ({})
// Do Not Disturb settings
property bool doNotDisturbMode: false
property string doNotDisturbStart: "22:00"
property string doNotDisturbEnd: "08:00"
property bool allowCriticalInDND: true
// Sound settings
property string notificationSound: "default"
property real soundVolume: 0.7
property bool vibrationEnabled: false
function getAppSetting(appName, setting, defaultValue) {
const app = appSettings[appName.toLowerCase()];
if (app && app.hasOwnProperty(setting)) {
return app[setting];
}
return defaultValue;
}
function setAppSetting(appName, setting, value) {
let newAppSettings = {};
for (const app in appSettings) {
newAppSettings[app] = appSettings[app];
}
const appKey = appName.toLowerCase();
if (!newAppSettings[appKey]) {
newAppSettings[appKey] = {};
}
newAppSettings[appKey][setting] = value;
appSettings = newAppSettings;
// Save to persistent storage
saveSettings();
}
function isAppBlocked(appName) {
const appKey = appName.toLowerCase();
if (appKey === "notify-send" || appKey === "libnotify") {
return false;
}
return getAppSetting(appName, "blocked", false);
}
function isAppMuted(appName) {
return getAppSetting(appName, "muted", false);
}
function getAppTimeout(appName) {
return getAppSetting(appName, "timeout", defaultTimeout);
}
function isInDoNotDisturbMode() {
if (!doNotDisturbMode && !respectDoNotDisturb) {
return false;
}
const now = new Date();
const currentTime = now.getHours() * 60 + now.getMinutes();
const startParts = doNotDisturbStart.split(":");
const endParts = doNotDisturbEnd.split(":");
const startTime = parseInt(startParts[0]) * 60 + parseInt(startParts[1]);
const endTime = parseInt(endParts[0]) * 60 + parseInt(endParts[1]);
if (startTime <= endTime) {
// Same day range (e.g., 9:00 - 17:00)
return currentTime >= startTime && currentTime <= endTime;
} else {
// Overnight range (e.g., 22:00 - 08:00)
return currentTime >= startTime || currentTime <= endTime;
}
}
function shouldShowNotification(notification) {
// Check if notifications are globally disabled
if (!notificationsEnabled) {
return false;
}
// Check if app is blocked
if (isAppBlocked(notification.appName)) {
return false;
}
// DND logic temporarily disabled for all notifications
// if (isInDoNotDisturbMode()) {
// // Allow critical notifications if configured
// if (allowCriticalInDND && notification.urgency === 2) {
// return true;
// }
// return false;
// }
return true;
}
function shouldPlaySound(notification) {
if (!soundEnabled) {
return false;
}
if (isAppMuted(notification.appName)) {
return false;
}
if (isInDoNotDisturbMode() && !allowCriticalInDND) {
return false;
}
return true;
}
function saveSettings() {
// In a real implementation, this would save to a config file
console.log("NotificationSettings: Settings saved");
}
function loadSettings() {
// In a real implementation, this would load from a config file
console.log("NotificationSettings: Settings loaded");
}
function resetToDefaults() {
notificationsEnabled = true;
soundEnabled = true;
persistNotifications = true;
defaultTimeout = 5000;
enableSmartGrouping = true;
autoExpandConversations = true;
replaceMediaNotifications = true;
maxStoredNotifications = 100;
notificationRetentionDays = 7;
showNotificationPopups = true;
showAppIcons = true;
showTimestamps = true;
enableInlineReply = true;
showActionButtons = true;
allowCriticalNotifications = true;
respectDoNotDisturb = true;
doNotDisturbMode = false;
doNotDisturbStart = "22:00";
doNotDisturbEnd = "08:00";
allowCriticalInDND = true;
notificationSound = "default";
soundVolume = 0.7;
vibrationEnabled = false;
appSettings = {};
saveSettings();
}
Component.onCompleted: {
loadSettings();
}
}