Add AppBar notch with time, DE, layout, battery, brightness and power

main
Warinyourself 3 weeks ago
parent ea715d5f1e
commit b286ebbe05

@ -4,6 +4,7 @@ import { useAppStore } from '@/store/app'
import { usePageStore } from '@/store/page'
import { useQuerySync } from '@/composables/useQuerySync'
import { useLightdm, initLightdm } from '@/composables/useLightdm'
import { initSystemInfo } from '@/composables/useSystemInfo'
import { focusInputPassword, setCSSVariable } from '@/utils/helper'
import { hotkeys, toMagicKeyCombo } from '@/utils/hotkeys'
import { initTimer } from '@/utils/time'
@ -54,6 +55,7 @@ export default defineComponent({
initTimer()
initLightdm()
initSystemInfo()
appStore.setUpSettings()
useQuerySync()
initKeybinds()

@ -0,0 +1,82 @@
import { defineComponent, computed } from 'vue'
import { Power, Sun, Battery, BatteryCharging, BatteryFull, BatteryLow, BatteryMedium, BatteryWarning } from '@lucide/vue'
import { useLightdm } from '@/composables/useLightdm'
import { useSystemInfo } from '@/composables/useSystemInfo'
import { useAppStore } from '@/store/app'
import { usePageStore } from '@/store/page'
import { getDesktopIcon, systemActionsObject } from '@/utils/helper'
import AppIcon from '@/components/app/AppIcon.vue'
import timeRef, { timePresets, type TimePreset } from '@/utils/time'
export default defineComponent({
name: 'AppBar',
setup() {
const session = useLightdm()
const sys = useSystemInfo()
const appStore = useAppStore()
const pageStore = usePageStore()
const formattedTime = computed(() => {
const preset = (appStore.timeFormat as TimePreset) || 'HH:mm'
const options = timePresets[preset] ?? timePresets['HH:mm']
return new Intl.DateTimeFormat(pageStore.locale, options).format(timeRef.time)
})
const BatteryIcon = computed(() => {
if (!sys.battery.value) return Battery
const { level, ac_status } = sys.battery.value
if (ac_status) return BatteryCharging
if (level > 80) return BatteryFull
if (level > 50) return BatteryMedium
if (level > 20) return BatteryLow
return BatteryWarning
})
return () => {
const desktop = session.currentDesktop.value
const layout = sys.currentLayout.value
const bat = sys.battery.value
return (
<div class="app-bar">
{appStore.showTime && (
<div class="app-bar__item">
<span class="app-bar__time">{formattedTime.value}</span>
</div>
)}
{desktop && (
<div class="app-bar__item">
<AppIcon name={getDesktopIcon(desktop.key)} />
<span>{desktop.name}</span>
</div>
)}
{layout && (
<div class="app-bar__item app-bar__item--clickable" onClick={sys.cycleLayout}>
<span class="app-bar__layout">{layout.short_description.toUpperCase()}</span>
</div>
)}
{sys.canAccessBattery.value && bat && (
<div class="app-bar__item">
<BatteryIcon.value />
<span>{Math.round(bat.level)}%</span>
</div>
)}
{sys.canAccessBrightness.value && (
<div class="app-bar__item">
<Sun />
<span>{Math.round(sys.brightness.value)}%</span>
</div>
)}
<div class="app-bar__item app-bar__item--clickable" onClick={systemActionsObject.shutdown}>
<Power />
</div>
</div>
)
}
}
})

@ -0,0 +1,84 @@
import { ref } from 'vue'
export interface BatteryData {
level: number
status: string
ac_status: boolean
}
export interface LayoutData {
name: string
short_description: string
description: string
}
const canAccessBattery = ref(false)
const canAccessBrightness = ref(false)
const battery = ref<BatteryData | null>(null)
const brightness = ref(0)
const layouts = ref<LayoutData[]>([])
const currentLayout = ref<LayoutData | null>(null)
function _readBattery() {
const b = (window.lightdm as any)?.battery_data
if (b) battery.value = { level: b.level, status: b.status, ac_status: b.ac_status }
}
export function initSystemInfo() {
canAccessBattery.value = !!(window.lightdm as any)?.can_access_battery
canAccessBrightness.value = !!(window.lightdm as any)?.can_access_brightness
if (canAccessBattery.value) {
_readBattery()
;(window.lightdm as any)?.battery_update?.connect(_readBattery)
}
if (canAccessBrightness.value) {
brightness.value = (window.lightdm as any)?.brightness ?? 0
;(window.lightdm as any)?.brightness_update?.connect(() => {
brightness.value = (window.lightdm as any)?.brightness ?? 0
})
}
const ldmLayouts: any[] = (window.lightdm as any)?.layouts || []
layouts.value = ldmLayouts.map((l) => ({
name: l.name,
short_description: l.short_description,
description: l.description,
}))
const ldmLayout = (window.lightdm as any)?.layout
if (ldmLayout) {
currentLayout.value = {
name: ldmLayout.name,
short_description: ldmLayout.short_description,
description: ldmLayout.description,
}
}
}
function cycleLayout() {
if (!layouts.value.length) return
const idx = layouts.value.findIndex((l) => l.name === currentLayout.value?.name)
const next = layouts.value[(idx + 1) % layouts.value.length]!
currentLayout.value = next
;(window.lightdm as any).layout = next
}
function setBrightness(value: number) {
brightness.value = Math.max(0, Math.min(100, Math.round(value)))
;(window.lightdm as any)?.brightness_set?.(brightness.value)
}
export function useSystemInfo() {
return {
canAccessBattery,
canAccessBrightness,
battery,
brightness,
layouts,
currentLayout,
cycleLayout,
setBrightness,
}
}

@ -14,5 +14,5 @@
.transition-group
position: relative
.login-view, .app-bar, .shutdown-block
.login-view, .shutdown-block
zoom: var(--zoom)

@ -9,10 +9,23 @@ if (window.lightdm === undefined) {
can_restart: true,
can_hibernate: true,
can_shutdown: true,
can_access_battery: true,
can_access_brightness: true,
battery_data: { name: 'BAT0', level: 78, status: 'Discharging', ac_status: false, capacity: 100, time: '1:30', watt: 10 },
brightness: 70,
layouts: [
{ name: 'us', description: 'English (US)', short_description: 'en' },
{ name: 'ru', description: 'Russian', short_description: 'ru' },
],
layout: { name: 'us', description: 'English (US)', short_description: 'en' },
authentication_complete: { connect: () => {} },
show_message: { connect: () => {} },
show_prompt: { connect: () => {} },
battery_update: { connect: () => {} },
brightness_update: { connect: () => {} },
sessions: [
{ name: 'GNOME', key: 'gnome-shell' },

@ -12,6 +12,7 @@ import FrameRateBlock from '@/components/base/FrameRateBlock'
import BackgroundImage from '@/components/base/BackgroundImage'
import ShutdownButton from '@/components/base/ShutdownButton'
import GithubButton from '@/components/base/GithubButton'
import AppBar from '@/components/base/AppBar'
export default defineComponent({
name: 'HomePage',
@ -63,6 +64,8 @@ export default defineComponent({
return (
<div class="index">
<AppBar />
{showFrameRate && <FrameRateBlock />}
<BackgroundImage />

Loading…
Cancel
Save