130 lines
3.5 KiB
TypeScript
130 lines
3.5 KiB
TypeScript
import { RegularWindow } from "apps/window";
|
|
import { Network } from "./network";
|
|
import { Bluetooth } from "./bluetooth";
|
|
import { Widget as WidgetType } from "types/widgets/widget";
|
|
const hyprland = await Service.import("hyprland")
|
|
import Gtk from "gi://Gtk?version=3.0"
|
|
|
|
globalThis.OpenSettings = OpenSettings;
|
|
let current_window;
|
|
const current_tab = Variable("network");
|
|
|
|
export async function OpenSettings(cur_tab: string = "network") {
|
|
if (current_window) {
|
|
const _current_workspace = hyprland.active.workspace.id;
|
|
const _client = hyprland.clients.find(client => {
|
|
return (client.class == "com.github.Aylur.ags" && client.title == "Settings")
|
|
})
|
|
if (_client && _current_workspace != _client.workspace.id) {
|
|
current_window.destroy();
|
|
current_window = undefined;
|
|
SettingsWindow(cur_tab);
|
|
}
|
|
else
|
|
current_tab.setValue(cur_tab)
|
|
}
|
|
else
|
|
SettingsWindow(cur_tab);
|
|
}
|
|
|
|
|
|
function Settings(cur_tab: string) {
|
|
current_tab.setValue(cur_tab);
|
|
const stack = Widget.Stack({
|
|
// @ts-ignore
|
|
shown: current_tab.bind(),
|
|
vexpand: true,
|
|
hexpand: true,
|
|
transition: "crossfade",
|
|
children: {
|
|
"network": Page(Network(), "Network"),
|
|
"bluetooth": Page(Bluetooth(), "Bluetooth")
|
|
}
|
|
})
|
|
const Row = (name: string, label: string, icon: string = "image-missing") => Widget.Button({
|
|
on_clicked: () => { current_tab.setValue(name) },
|
|
child: Widget.Box({
|
|
children: [
|
|
Widget.Icon(icon),
|
|
Widget.Label(label)
|
|
]
|
|
}),
|
|
class_name: current_tab.bind().as(c => c == name ? "row active" : "row")
|
|
})
|
|
const sidebar = Widget.Box({
|
|
vertical: true,
|
|
vexpand: true,
|
|
class_name: "sidebar",
|
|
spacing: 2,
|
|
children: [
|
|
Row("network", "Network", "network-wireless-signal-excellent-symbolic"),
|
|
Row("bluetooth", "Bluetooth", "bluetooth-active-symbolic"),
|
|
Widget.Separator()
|
|
]
|
|
})
|
|
return Widget.Box({
|
|
hexpand: true,
|
|
vexpand: true,
|
|
vertical: false,
|
|
css: "background-color: #111418",
|
|
children: [
|
|
Widget.Box({
|
|
class_name: "full_sidebar",
|
|
vertical: true,
|
|
children: [
|
|
Widget.Label({
|
|
class_name: "settings_title",
|
|
label: "Settings"
|
|
}),
|
|
Widget.Scrollable({
|
|
hscroll: "never",
|
|
child: sidebar
|
|
}),
|
|
]
|
|
}),
|
|
stack
|
|
]
|
|
});
|
|
}
|
|
|
|
|
|
export const Page = (widget: Gtk.Widget, name: string) => Widget.Box({
|
|
vertical: true,
|
|
children: [
|
|
PageTitle(name),
|
|
widget
|
|
]
|
|
})
|
|
|
|
|
|
export const PageTitle = (label: string) => Widget.Box({
|
|
class_name: "page_title",
|
|
child: Widget.Label({
|
|
label: label,
|
|
hpack: "start"
|
|
})
|
|
})
|
|
|
|
|
|
export const SettingsWindow = (cur_tab: string) => {
|
|
let window = RegularWindow({
|
|
title: "Settings",
|
|
default_height: 600,
|
|
default_width: 850,
|
|
class_name: "settings",
|
|
child: Settings(cur_tab),
|
|
setup(win) {
|
|
current_window = win;
|
|
},
|
|
visible: true,
|
|
});
|
|
// @ts-ignore
|
|
window.on("delete-event", () => {
|
|
// @ts-ignore
|
|
window.destroy()
|
|
current_window = undefined;
|
|
return true
|
|
})
|
|
return window
|
|
}
|