linux-presets/gui/gnome/autocustom-gnome-macos/res/extensions/nightthemeswitcher@romainvi.../preferences/TimeChooser.js

98 lines
3.3 KiB
JavaScript
Executable File

// SPDX-FileCopyrightText: Night Theme Switcher Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
import GDesktopEnums from 'gi://GDesktopEnums';
import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
export class TimeChooser extends Gtk.Widget {
#clockFormat;
#interfaceSettings;
static {
GObject.registerClass({
GTypeName: 'TimeChooser',
Template: 'resource:///org/gnome/Shell/Extensions/nightthemeswitcher/preferences/ui/TimeChooser.ui',
InternalChildren: ['clock_format_stack', 'hours_12', 'minutes_12', 'hours_24', 'minutes_24', 'am_toggle_button', 'pm_toggle_button'],
Properties: {
time: GObject.ParamSpec.double(
'time',
'Time',
'The time of the chooser',
GObject.ParamFlags.READWRITE,
0,
24,
0
),
},
}, this);
}
constructor({ ...params } = {}) {
super(params);
this.#interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this.#interfaceSettings.connect('changed::clock-format', this.#onClockFormatChanged.bind(this));
this.#onClockFormatChanged();
}
#onClockFormatChanged(_settings) {
this.#clockFormat = this.#interfaceSettings.get_enum('clock-format');
this.#syncClockFormatStack();
}
#syncClockFormatStack() {
this._clock_format_stack.set_visible_child_name(this.#clockFormat === GDesktopEnums.ClockFormat['12H'] ? '12h' : '24h');
}
#convertTimeTo24hFormat(time) {
const hours = Math.trunc(time);
const minutes = Math.round((time - hours) * 60);
return { hours, minutes };
}
#convertTimeTo12hFormat(time) {
const { hours: hours24, minutes } = this.#convertTimeTo24hFormat(time);
const hours = hours24 % 12;
const isPm = hours24 > 12;
return { hours, minutes, isPm };
}
#convert24hFormatToTime({ hours, minutes }) {
return hours + minutes / 60;
}
#convert12hFormatToTime({ hours, minutes, isPm }) {
return this.#convert24hFormatToTime({
hours: hours + Number(isPm) * 12,
minutes,
});
}
onTimeChanged(_chooser) {
const time = this.time;
const clock12 = this.#convertTimeTo12hFormat(time);
this._hours_12.value = clock12.hours;
this._minutes_12.value = clock12.minutes;
this._am_toggle_button.active = !clock12.isPm;
this._pm_toggle_button.active = clock12.isPm;
const clock24 = this.#convertTimeTo24hFormat(time);
this._hours_24.value = clock24.hours;
this._minutes_24.value = clock24.minutes;
}
onValueChanged(_widget) {
this.time = this.#clockFormat === GDesktopEnums.ClockFormat['12H']
? this.#convert12hFormatToTime({ hours: this._hours_12.value, minutes: this._minutes_12.value, isPm: this._pm_toggle_button.active })
: this.#convert24hFormatToTime({ hours: this._hours_24.value, minutes: this._minutes_24.value });
}
onOutputChanged(spin) {
spin.text = spin.value.toString().padStart(2, '0');
return true;
}
}