Files
hyprland/config/ags/apps/settings/main.ts
T
2024-06-26 00:10:21 +05:45

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
}