mirror of
https://github.com/Theaninova/TheaninovOS.git
synced 2025-12-12 11:36:20 +00:00
238 lines
5.5 KiB
JavaScript
238 lines
5.5 KiB
JavaScript
// This file is for brightness/volume indicator and popup notifications
|
|
// For the notification widget on the sidebar, see notificationlist.js
|
|
// The actual widget for each single notification is in lib/notification.js
|
|
|
|
const {GLib, Gtk} = imports.gi
|
|
import {App, Service, Utils, Widget} from "../imports.js"
|
|
import Audio from "resource:///com/github/Aylur/ags/service/audio.js"
|
|
import Notifications from "resource:///com/github/Aylur/ags/service/notifications.js"
|
|
const {Box, EventBox, Icon, Scrollable, Label, Button, Revealer} = Widget
|
|
import Brightness from "../scripts/brightness.js"
|
|
import Indicator from "../scripts/indicator.js"
|
|
import Notification from "./lib/notification.js"
|
|
|
|
const OsdValue = (name, labelConnections, progressConnections, props = {}) =>
|
|
Widget.Box({
|
|
// Volume
|
|
...props,
|
|
vertical: true,
|
|
className: "osd-bg osd-value",
|
|
hexpand: true,
|
|
children: [
|
|
Widget.Box({
|
|
vexpand: true,
|
|
children: [
|
|
Widget.Label({
|
|
xalign: 0,
|
|
yalign: 0,
|
|
hexpand: true,
|
|
className: "osd-label",
|
|
label: `${name}`,
|
|
}),
|
|
Widget.Label({
|
|
hexpand: false,
|
|
className: "osd-value-txt",
|
|
label: "100",
|
|
connections: labelConnections,
|
|
}),
|
|
],
|
|
}),
|
|
Widget.ProgressBar({
|
|
className: "osd-progress",
|
|
hexpand: true,
|
|
vertical: false,
|
|
connections: progressConnections,
|
|
}),
|
|
],
|
|
})
|
|
|
|
const brightnessIndicator = OsdValue(
|
|
"Brightness",
|
|
[
|
|
[
|
|
Brightness,
|
|
self => {
|
|
self.label = `${Math.round(Brightness.screen_value * 100)}`
|
|
},
|
|
"notify::screen-value",
|
|
],
|
|
],
|
|
[
|
|
[
|
|
Brightness,
|
|
progress => {
|
|
const updateValue = Brightness.screen_value
|
|
progress.value = updateValue
|
|
},
|
|
"notify::screen-value",
|
|
],
|
|
],
|
|
)
|
|
|
|
const volumeIndicator = OsdValue(
|
|
"Volume",
|
|
[
|
|
[
|
|
Audio,
|
|
label => {
|
|
label.label = `${Math.round((Audio.speaker?.volume ?? 0) * 100)}`
|
|
},
|
|
],
|
|
],
|
|
[
|
|
[
|
|
Audio,
|
|
progress => {
|
|
const updateValue = Audio.speaker?.volume ?? 0
|
|
if (!isNaN(updateValue)) progress.value = updateValue
|
|
},
|
|
],
|
|
],
|
|
)
|
|
|
|
const indicatorValues = Widget.Revealer({
|
|
transition: "slide_down",
|
|
connections: [
|
|
[
|
|
Indicator,
|
|
(revealer, value) => {
|
|
revealer.revealChild = value > -1
|
|
},
|
|
"popup",
|
|
],
|
|
],
|
|
child: Widget.Box({
|
|
halign: "center",
|
|
vertical: false,
|
|
children: [brightnessIndicator, volumeIndicator],
|
|
}),
|
|
})
|
|
|
|
const PopupNotification = notifObject =>
|
|
Widget.Box({
|
|
homogeneous: true,
|
|
children: [
|
|
Widget.EventBox({
|
|
onHoverLost: () => {
|
|
notifObject.dismiss()
|
|
},
|
|
child: Widget.Revealer({
|
|
revealChild: true,
|
|
child: Widget.Box({
|
|
children: [
|
|
Notification({
|
|
notifObject: notifObject,
|
|
isPopup: true,
|
|
props: {halign: "fill"},
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
}),
|
|
],
|
|
})
|
|
|
|
const naiveNotifPopupList = Widget.Box({
|
|
vertical: true,
|
|
className: "spacing-v-5",
|
|
connections: [
|
|
[
|
|
Notifications,
|
|
box => {
|
|
box.children = Notifications.popups.reverse().map(notifItem => PopupNotification(notifItem))
|
|
},
|
|
],
|
|
],
|
|
})
|
|
|
|
const notifPopupList = Box({
|
|
vertical: true,
|
|
className: "spacing-v-5-revealer",
|
|
properties: [
|
|
["map", new Map()],
|
|
|
|
[
|
|
"dismiss",
|
|
(box, id, force = false) => {
|
|
if (!id || !box._map.has(id) || (box._map.get(id)._hovered && !force)) return
|
|
|
|
const notif = box._map.get(id)
|
|
// console.log(notif);
|
|
notif.revealChild = false
|
|
Utils.timeout(200, () => {
|
|
notif._destroyWithAnims()
|
|
})
|
|
},
|
|
],
|
|
|
|
[
|
|
"notify",
|
|
(box, id) => {
|
|
if (!id || Notifications.dnd) return
|
|
|
|
if (!Notifications.getNotification(id)) return
|
|
|
|
box._map.delete(id)
|
|
|
|
const notif = Notifications.getNotification(id)
|
|
box._map.set(
|
|
id,
|
|
Notification({
|
|
notifObject: notif,
|
|
isPopup: true,
|
|
}),
|
|
)
|
|
|
|
box.children = Array.from(box._map.values()).reverse()
|
|
|
|
Utils.timeout(10, () => {
|
|
box.get_parent().revealChild = true
|
|
})
|
|
|
|
box._map.get(id).interval = Utils.interval(4500, () => {
|
|
const notif = box._map.get(id)
|
|
if (!notif._hovered) {
|
|
if (notif.interval) {
|
|
Utils.timeout(500, () => notif.destroy())
|
|
GLib.source_remove(notif.interval)
|
|
notif.interval = undefined
|
|
}
|
|
}
|
|
})
|
|
},
|
|
],
|
|
],
|
|
connections: [
|
|
[Notifications, (box, id) => box._notify(box, id), "notified"],
|
|
[Notifications, (box, id) => box._dismiss(box, id), "dismissed"],
|
|
[Notifications, (box, id) => box._dismiss(box, id, true), "closed"],
|
|
],
|
|
})
|
|
|
|
const notificationPopups = Widget.Revealer({
|
|
className: "osd-notifs",
|
|
transition: "slide_down",
|
|
connections: [
|
|
[
|
|
Notifications,
|
|
self => {
|
|
self.revealChild = Notifications.popups.length > 0
|
|
},
|
|
],
|
|
],
|
|
child: notifPopupList,
|
|
})
|
|
|
|
export default () =>
|
|
Widget.EventBox({
|
|
onHover: () => {
|
|
//make the widget hide when hovering
|
|
Indicator.popup(-1)
|
|
},
|
|
child: Widget.Box({
|
|
vertical: true,
|
|
style: "padding: 1px;",
|
|
children: [indicatorValues, notificationPopups],
|
|
}),
|
|
})
|