Files
noctalia-shell/Modules/Panels/Settings/Tabs/Notifications/NotificationsTab.qml
T
Lysec 381444bc2c feat(notifications): add notification display rules
- block: skips the notification completely
- mute: does not play sound (played by noctalia), shows popup, adds to
history
- hide: no sound, no popup, still adds to history
2026-03-18 21:24:14 +01:00

159 lines
4.3 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
spacing: 0
// Helper functions to update arrays immutably
function addMonitor(list, name) {
const arr = (list || []).slice();
if (!arr.includes(name))
arr.push(name);
return arr;
}
function removeMonitor(list, name) {
return (list || []).filter(function (n) {
return n !== name;
});
}
// File pickers for sound sub-tab
function openUnifiedSoundPicker() {
unifiedSoundFilePicker.open();
}
function openLowSoundPicker() {
lowSoundFilePicker.open();
}
function openNormalSoundPicker() {
normalSoundFilePicker.open();
}
function openCriticalSoundPicker() {
criticalSoundFilePicker.open();
}
NTabBar {
id: subTabBar
Layout.fillWidth: true
Layout.bottomMargin: Style.marginM
distributeEvenly: false // this is too cramped on this tab to split evenly
currentIndex: tabView.currentIndex
NTabButton {
text: I18n.tr("common.appearance")
tabIndex: 0
checked: subTabBar.currentIndex === 0
}
NTabButton {
text: I18n.tr("common.duration")
tabIndex: 1
checked: subTabBar.currentIndex === 1
}
NTabButton {
text: I18n.tr("common.history")
tabIndex: 2
checked: subTabBar.currentIndex === 2
}
NTabButton {
text: I18n.tr("common.sound")
tabIndex: 3
checked: subTabBar.currentIndex === 3
}
NTabButton {
text: I18n.tr("common.toast")
tabIndex: 4
checked: subTabBar.currentIndex === 4
}
NTabButton {
text: I18n.tr("panels.notifications.rules-tab")
tabIndex: 5
checked: subTabBar.currentIndex === 5
}
}
Item {
Layout.fillWidth: true
Layout.preferredHeight: Style.marginL
}
NTabView {
id: tabView
currentIndex: subTabBar.currentIndex
GeneralSubTab {
addMonitor: root.addMonitor
removeMonitor: root.removeMonitor
}
DurationSubTab {}
HistorySubTab {}
SoundSubTab {
onOpenUnifiedPicker: root.openUnifiedSoundPicker()
onOpenLowPicker: root.openLowSoundPicker()
onOpenNormalPicker: root.openNormalSoundPicker()
onOpenCriticalPicker: root.openCriticalSoundPicker()
}
ToastSubTab {}
RulesSubTab {}
}
// File Pickers for Sound Files
NFilePicker {
id: unifiedSoundFilePicker
title: I18n.tr("panels.notifications.sounds-files-unified-select-title")
selectionMode: "files"
initialPath: Quickshell.env("HOME")
nameFilters: ["*.wav", "*.mp3", "*.ogg", "*.flac", "*.m4a", "*.aac"]
onAccepted: paths => {
if (paths.length > 0) {
const soundPath = paths[0];
Settings.data.notifications.sounds.normalSoundFile = soundPath;
Settings.data.notifications.sounds.lowSoundFile = soundPath;
Settings.data.notifications.sounds.criticalSoundFile = soundPath;
}
}
}
NFilePicker {
id: lowSoundFilePicker
title: I18n.tr("panels.notifications.sounds-files-low-select-title")
selectionMode: "files"
initialPath: Quickshell.env("HOME")
nameFilters: ["*.wav", "*.mp3", "*.ogg", "*.flac", "*.m4a", "*.aac"]
onAccepted: paths => {
if (paths.length > 0) {
Settings.data.notifications.sounds.lowSoundFile = paths[0];
}
}
}
NFilePicker {
id: normalSoundFilePicker
title: I18n.tr("panels.notifications.sounds-files-normal-select-title")
selectionMode: "files"
initialPath: Quickshell.env("HOME")
nameFilters: ["*.wav", "*.mp3", "*.ogg", "*.flac", "*.m4a", "*.aac"]
onAccepted: paths => {
if (paths.length > 0) {
Settings.data.notifications.sounds.normalSoundFile = paths[0];
}
}
}
NFilePicker {
id: criticalSoundFilePicker
title: I18n.tr("panels.notifications.sounds-files-critical-select-title")
selectionMode: "files"
initialPath: Quickshell.env("HOME")
nameFilters: ["*.wav", "*.mp3", "*.ogg", "*.flac", "*.m4a", "*.aac"]
onAccepted: paths => {
if (paths.length > 0) {
Settings.data.notifications.sounds.criticalSoundFile = paths[0];
}
}
}
}