From 35364193e3d24d47a8c2d970f70f696f2247e3bb Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Tue, 4 Mar 2025 23:26:05 +1100 Subject: launcher: math mode --- src/modules/launcher/index.tsx | 7 ++-- src/modules/launcher/modes.tsx | 80 +++++++++++++++++++++++++++++++++++++++--- src/services/math.ts | 2 +- 3 files changed, 81 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/modules/launcher/index.tsx b/src/modules/launcher/index.tsx index 2821050..8287187 100644 --- a/src/modules/launcher/index.tsx +++ b/src/modules/launcher/index.tsx @@ -121,9 +121,10 @@ export default class Launcher extends PopupWindow { this.hook(entry, "changed", () => (isAction(entry.get_text()) ? actions : content[mode.get()]).updateContent(entry.get_text()) ); - this.hook(entry, "activate", () => - (isAction(entry.get_text()) ? actions : content[mode.get()]).handleActivate(entry.get_text()) - ); + this.hook(entry, "activate", () => { + (isAction(entry.get_text()) ? actions : content[mode.get()]).handleActivate(entry.get_text()); + entry.set_text(""); // Clear search on activate + }); // Clear search on hide if not in math mode or creating a todo this.connect("hide", () => mode.get() !== "math" && !entry.text.startsWith(">todo") && entry.set_text("")); diff --git a/src/modules/launcher/modes.tsx b/src/modules/launcher/modes.tsx index 4d54ad2..3f6e03e 100644 --- a/src/modules/launcher/modes.tsx +++ b/src/modules/launcher/modes.tsx @@ -1,8 +1,9 @@ import { Apps as AppsService } from "@/services/apps"; +import MathService, { type HistoryItem } from "@/services/math"; import { getAppCategoryIcon } from "@/utils/icons"; import { launch } from "@/utils/system"; import { type FlowBox, setupCustomTooltip } from "@/utils/widgets"; -import { execAsync, Gio, register } from "astal"; +import { bind, execAsync, Gio, register, Variable } from "astal"; import { Astal, Gtk, Widget } from "astal/gtk3"; import { launcher as config } from "config"; import type AstalApps from "gi://AstalApps"; @@ -71,6 +72,28 @@ const FileResult = ({ path }: { path: string }) => ( ); +const MathResult = ({ icon, equation, result }: HistoryItem) => ( + + + +); + @register() class Apps extends Widget.Box implements LauncherContent { #content: FlowBox; @@ -133,16 +156,65 @@ class Files extends Widget.Box implements LauncherContent { @register() class Math extends Widget.Box implements LauncherContent { + #showResult: Variable; + #result: Variable; + #content: FlowBox; + constructor() { - super({ name: "math", className: "math" }); + super({ name: "math", className: "math", vertical: true }); + + this.#showResult = Variable(false); + this.#result = Variable({ equation: "", result: "", icon: "" }); + this.#content = () as FlowBox; + + this.add( + + + + + + + + ); + this.add( + + {this.#content} + + ); } updateContent(search: string): void { - throw new Error("Method not implemented."); + this.#showResult.set(search.length > 0); + this.#result.set(MathService.get_default().evaluate(search)); + + this.#content.foreach(c => c.destroy()); + for (const item of limitLength(MathService.get_default().history, config.math)) + this.#content.add(); } handleActivate(search: string): void { - throw new Error("Method not implemented."); + if (!search) return; + MathService.get_default().commit(); + const res = this.#result.get(); + // Copy and close if not assignment, help or error + if (!["equal", "help", "error"].includes(res.icon)) { + execAsync(["wl-copy", "--", res.result]).catch(console.error); + close(); + } } } diff --git a/src/services/math.ts b/src/services/math.ts index f5807ef..0cddf1b 100644 --- a/src/services/math.ts +++ b/src/services/math.ts @@ -103,7 +103,7 @@ export default class Math extends GObject.Object { } else if (equation.includes("=")) { const [left, right] = equation.split("="); try { - this.#variables[left.trim()] = simplify(right).toString(); + this.#variables[left.trim()] = simplify(right, this.#variables).toString(); } catch { this.#variables[left.trim()] = right.trim(); } -- cgit v1.2.3-freya