summaryrefslogtreecommitdiff
path: root/utils/widgets.tsx
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-01-16 16:35:37 +1100
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-01-16 16:35:37 +1100
commit02fd2e97f2c8a53bf2344e6fa8b14769cb15ee38 (patch)
tree5e2a56becf6ba6961995e541ce9688224f704773 /utils/widgets.tsx
parentpopupwindow: switch to class (diff)
downloadcaelestia-shell-02fd2e97f2c8a53bf2344e6fa8b14769cb15ee38.tar.gz
caelestia-shell-02fd2e97f2c8a53bf2344e6fa8b14769cb15ee38.tar.bz2
caelestia-shell-02fd2e97f2c8a53bf2344e6fa8b14769cb15ee38.zip
refactor: move ts to src
Also move popupwindow to own file
Diffstat (limited to 'utils/widgets.tsx')
-rw-r--r--utils/widgets.tsx84
1 files changed, 0 insertions, 84 deletions
diff --git a/utils/widgets.tsx b/utils/widgets.tsx
deleted file mode 100644
index 7b16075..0000000
--- a/utils/widgets.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import { Binding, register } from "astal";
-import { App, Astal, Gdk, Widget } from "astal/gtk3";
-import AstalHyprland from "gi://AstalHyprland";
-
-export const setupCustomTooltip = (self: any, text: string | Binding<string>) => {
- if (!text) return null;
-
- const window = (
- <window
- visible={false}
- namespace="caelestia-tooltip"
- keymode={Astal.Keymode.NONE}
- exclusivity={Astal.Exclusivity.IGNORE}
- anchor={Astal.WindowAnchor.TOP | Astal.WindowAnchor.LEFT}
- >
- <label className="tooltip" label={text} />
- </window>
- ) as Widget.Window;
- self.set_tooltip_window(window);
-
- let dirty = true;
- let lastX = 0;
- self.connect("size-allocate", () => (dirty = true));
- window.connect("size-allocate", () => {
- window.marginLeft = lastX + (self.get_allocated_width() - window.get_preferred_width()[1]) / 2;
- });
- if (text instanceof Binding) self.hook(text, (_: any, v: string) => !v && window.hide());
-
- self.connect("query-tooltip", (_: any, x: number, y: number) => {
- if (text instanceof Binding && !text.get()) return false;
- if (dirty) {
- const { width, height } = self.get_allocation();
- const { x: cx, y: cy } = AstalHyprland.get_default().get_cursor_position();
- window.marginLeft = cx + ((width - window.get_preferred_width()[1]) / 2 - x);
- window.marginTop = cy + (height - y);
- lastX = cx - x;
- dirty = false;
- }
- return true;
- });
-
- self.connect("destroy", () => window.destroy());
-
- return window;
-};
-
-export const setupChildClickthrough = (self: any) =>
- self.connect("size-allocate", () => self.get_window()?.set_child_input_shapes());
-
-const extendProp = <T,>(
- prop: T | Binding<T | undefined> | undefined,
- override: (prop: T | undefined) => T | undefined
-) => prop && (prop instanceof Binding ? prop.as(override) : override(prop));
-
-@register()
-export class PopupWindow extends Widget.Window {
- constructor(props: Widget.WindowProps) {
- super({
- keymode: Astal.Keymode.ON_DEMAND,
- exclusivity: Astal.Exclusivity.IGNORE,
- ...props,
- visible: false,
- application: App,
- name: props.monitor ? extendProp(props.name, n => (n ? n + props.monitor : undefined)) : props.name,
- namespace: extendProp(props.name, n => `caelestia-${n}`),
- onKeyPressEvent: (self, event) => {
- // Close window on escape
- if (event.get_keyval()[1] === Gdk.KEY_Escape) self.hide();
-
- return props.onKeyPressEvent?.(self, event);
- },
- borderWidth: 20, // To allow shadow, cause if not it gets cut off
- });
- }
-
- popup_at_widget(widget: JSX.Element, event: Gdk.Event) {
- const { width, height } = widget.get_allocation();
- const [_, x, y] = event.get_coords();
- const { x: cx, y: cy } = AstalHyprland.get_default().get_cursor_position();
- this.marginLeft = cx + ((width - this.get_preferred_width()[1]) / 2 - x);
- this.marginTop = cy + (height - y);
- this.show();
- }
-}