forked from Shinonome/dots-hyprland
159 lines
6.5 KiB
JavaScript
159 lines
6.5 KiB
JavaScript
const { Gdk } = imports.gi;
|
|
import App from 'resource:///com/github/Aylur/ags/app.js';
|
|
import Widget from 'resource:///com/github/Aylur/ags/widget.js';
|
|
import * as Utils from 'resource:///com/github/Aylur/ags/utils.js';
|
|
const { Box, Button, EventBox, Label, Revealer, Scrollable, Stack } = Widget;
|
|
const { execAsync, exec } = Utils;
|
|
import { MaterialIcon } from '../.commonwidgets/materialicon.js';
|
|
import { setupCursorHover } from '../.widgetutils/cursorhover.js';
|
|
import toolBox from './toolbox.js';
|
|
import apiWidgets from './apiwidgets.js';
|
|
import { chatEntry } from './apiwidgets.js';
|
|
import { TabContainer } from '../.commonwidgets/tabcontainer.js';
|
|
import { checkKeybind } from '../.widgetutils/keybind.js';
|
|
import { updateNestedProperty } from '../.miscutils/objects.js';
|
|
|
|
const AGS_CONFIG_FILE = `${App.configDir}/user_options.jsonc`;
|
|
|
|
const SIDEBARTABS = {
|
|
'apis': {
|
|
name: 'apis',
|
|
content: apiWidgets,
|
|
materialIcon: 'api',
|
|
friendlyName: 'APIs',
|
|
},
|
|
'tools': {
|
|
name: 'tools',
|
|
content: toolBox,
|
|
materialIcon: 'home_repair_service',
|
|
friendlyName: 'Tools',
|
|
},
|
|
}
|
|
const CONTENTS = userOptions.sidebar.pages.order.map((tabName) => SIDEBARTABS[tabName])
|
|
|
|
// const pinButton = Button({
|
|
// attribute: {
|
|
// 'enabled': false,
|
|
// 'toggle': (self) => {
|
|
// self.attribute.enabled = !self.attribute.enabled;
|
|
// self.toggleClassName('sidebar-controlbtn-enabled', self.attribute.enabled);
|
|
|
|
// const sideleftWindow = App.getWindow('sideleft');
|
|
// const sideleftContent = sideleftWindow.get_children()[0].get_children()[0].get_children()[1];
|
|
|
|
// sideleftContent.toggleClassName('sidebar-pinned', self.attribute.enabled);
|
|
|
|
// if (self.attribute.enabled) {
|
|
// sideleftWindow.exclusivity = 'exclusive';
|
|
// }
|
|
// else {
|
|
// sideleftWindow.exclusivity = 'normal';
|
|
// }
|
|
// },
|
|
// },
|
|
// vpack: 'start',
|
|
// className: 'sidebar-controlbtn',
|
|
// child: MaterialIcon('push_pin', 'larger'),
|
|
// tooltipText: `Pin sidebar (${userOptions.keybinds.sidebar.pin})`,
|
|
// onClicked: (self) => self.attribute.toggle(self),
|
|
// setup: (self) => {
|
|
// setupCursorHover(self);
|
|
// self.hook(App, (self, currentName, visible) => {
|
|
// if (currentName === 'sideleft' && visible) self.grab_focus();
|
|
// })
|
|
// },
|
|
// })
|
|
|
|
const expandButton = Button({
|
|
attribute: {
|
|
'enabled': false,
|
|
'toggle': (self) => {
|
|
self.attribute.enabled = !self.attribute.enabled;
|
|
// We don't expand the bar, but the expand button. Funny hax but it works
|
|
// (somehow directly expanding the sidebar directly makes it unable to unexpand)
|
|
self.toggleClassName('sidebar-expandbtn-enabled', self.attribute.enabled);
|
|
self.toggleClassName('sidebar-controlbtn-enabled', self.attribute.enabled);
|
|
},
|
|
},
|
|
vpack: 'start',
|
|
className: 'sidebar-controlbtn',
|
|
child: MaterialIcon('expand_content', 'larger'),
|
|
tooltipText: `Expand sidebar (${userOptions.keybinds.sidebar.expand})`,
|
|
onClicked: (self) => self.attribute.toggle(self),
|
|
setup: setupCursorHover,
|
|
})
|
|
|
|
export const widgetContent = TabContainer({
|
|
icons: CONTENTS.map((item) => item.materialIcon),
|
|
names: CONTENTS.map((item) => item.friendlyName),
|
|
children: CONTENTS.map((item) => item.content),
|
|
className: 'sidebar-left spacing-v-10',
|
|
initIndex: CONTENTS.findIndex(obj => obj.name === userOptions.sidebar.pages.defaultPage),
|
|
onChange: (self, index) => {
|
|
const pageName = CONTENTS[index].name;
|
|
const option = 'sidebar.pages.defaultPage';
|
|
updateNestedProperty(userOptions, option, pageName);
|
|
execAsync(['bash', '-c', `${App.configDir}/scripts/ags/agsconfigurator.py \
|
|
--key ${option} \
|
|
--value ${pageName} \
|
|
--file ${AGS_CONFIG_FILE}`
|
|
]).catch(print);
|
|
},
|
|
extraTabStripWidgets: [
|
|
// pinButton,
|
|
expandButton,
|
|
]
|
|
});
|
|
|
|
export default () => {
|
|
return Box({
|
|
// vertical: true,
|
|
vexpand: true,
|
|
css: 'min-width: 2px;',
|
|
children: [
|
|
widgetContent,
|
|
],
|
|
setup: (self) => self
|
|
.on('key-press-event', (widget, event) => { // Handle keybinds
|
|
if (checkKeybind(event, userOptions.keybinds.sidebar.cycleTab))
|
|
widgetContent.cycleTab();
|
|
else if (checkKeybind(event, userOptions.keybinds.sidebar.nextTab))
|
|
widgetContent.nextTab();
|
|
else if (checkKeybind(event, userOptions.keybinds.sidebar.prevTab))
|
|
widgetContent.prevTab();
|
|
else if (checkKeybind(event, userOptions.keybinds.sidebar.expand))
|
|
expandButton.attribute.toggle(expandButton);
|
|
// if (checkKeybind(event, userOptions.keybinds.sidebar.pin))
|
|
// pinButton.attribute.toggle(pinButton);
|
|
|
|
if (widgetContent.attribute.names[widgetContent.attribute.shown.value] == 'APIs') { // If api tab is focused
|
|
// Focus entry when typing
|
|
if ((
|
|
!(event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) &&
|
|
event.get_keyval()[1] >= 32 && event.get_keyval()[1] <= 126 &&
|
|
widget != chatEntry && event.get_keyval()[1] != Gdk.KEY_space)
|
|
||
|
|
((event.get_state()[1] & Gdk.ModifierType.CONTROL_MASK) &&
|
|
event.get_keyval()[1] === Gdk.KEY_v)
|
|
) {
|
|
chatEntry.grab_focus();
|
|
const buffer = chatEntry.get_buffer();
|
|
buffer.set_text(buffer.text + String.fromCharCode(event.get_keyval()[1]), -1);
|
|
buffer.place_cursor(buffer.get_iter_at_offset(-1));
|
|
}
|
|
// Switch API type
|
|
else if (checkKeybind(event, userOptions.keybinds.sidebar.apis.nextTab)) {
|
|
const toSwitchTab = widgetContent.attribute.children[widgetContent.attribute.shown.value];
|
|
toSwitchTab.nextTab();
|
|
}
|
|
else if (checkKeybind(event, userOptions.keybinds.sidebar.apis.prevTab)) {
|
|
const toSwitchTab = widgetContent.attribute.children[widgetContent.attribute.shown.value];
|
|
toSwitchTab.prevTab();
|
|
}
|
|
}
|
|
|
|
})
|
|
,
|
|
});
|
|
}
|