mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-06 08:07:49 +00:00
Settings › Plugins (gear menu) gets Import Theme from IntelliJ IDE… (theme plugins of the JetBrains IDEs on this machine, the one each IDE uses first) and Import IntelliJ Theme from File… (a Marketplace .jar / .zip or a .theme.json). The host reads the plugin with size limits; the UI converts it with the IntelliJ mapping (moved from scripts/theme to src/features/plugins/intellijTheme.ts, still used by pnpm theme:import-intellij) into one OpenIDEA theme plugin (engines.openidea ^1.0) with all of its themes, installed through the usual install page, and applies the chosen theme. Theme pickers separate each plugin's themes, and Quick Switch Scheme › Theme previews the theme under the pointer or keyboard after 500 ms and restores the selected one when closed without a choice. Co-authored-by: ldg030201 <100822592+ldg030201@users.noreply.github.com>
134 lines
4.6 KiB
TypeScript
134 lines
4.6 KiB
TypeScript
import { executeAction, getAction, registerActions } from "@/platform/actions";
|
|
import { isTauri } from "@/platform/ipc";
|
|
import { closeProject, confirmLeaveProject, openProject, useProject } from "@/platform/project";
|
|
import { runSearchFieldCommand, showContextMenu } from "@/ui";
|
|
import { showCustomizeToolbar } from "./MainToolbarDialog";
|
|
import { showQuickSwitch } from "./quickSwitch";
|
|
import { notify } from "./notificationStore";
|
|
import { NOTIFICATIONS_TOOL_WINDOW } from "./Notifications";
|
|
import { activateToolWindow } from "./toolwindows/store";
|
|
import { toggleTheme } from "./theme";
|
|
import { cancelTask, canCancel, useTasks } from "./tasks";
|
|
import { maybeEditorService, showStatusInfo } from "./contributions";
|
|
|
|
export async function openProjectDialog() {
|
|
if (!isTauri()) {
|
|
notify({
|
|
level: "warning",
|
|
title: "Opening folders requires the desktop app",
|
|
body: "Run `pnpm tauri dev` to use the file system.",
|
|
});
|
|
return;
|
|
}
|
|
const { open } = await import("@tauri-apps/plugin-dialog");
|
|
const defaultPath = useProject.getState().settings?.general?.defaultProjectDirectory?.trim() || undefined;
|
|
const picked = await open({ directory: true, multiple: false, title: "Open Folder", defaultPath });
|
|
const path = Array.isArray(picked) ? picked[0] : picked;
|
|
if (!path) return;
|
|
// The app feature applies "Open project in" (new / this window / ask).
|
|
if (getAction("file.openProjectPath")) {
|
|
await executeAction("file.openProjectPath", path);
|
|
return;
|
|
}
|
|
if (!(await confirmLeaveProject())) return;
|
|
try {
|
|
await openProject(path);
|
|
} catch (e) {
|
|
notify({ level: "error", title: "Could not open project", body: e instanceof Error ? e.message : String(e) });
|
|
}
|
|
}
|
|
|
|
/** Stop Background Processes (⇧⌘F2): the one running cancellable task, else a choice of them. */
|
|
export function stopBackgroundProcesses() {
|
|
const running = useTasks.getState().tasks.filter(canCancel);
|
|
if (!running.length) return showStatusInfo("No background processes to stop");
|
|
if (running.length === 1) return cancelTask(running[0]!.id);
|
|
showContextMenu({ x: window.innerWidth / 2 - 160, y: 96 }, [
|
|
...running.map((t) => ({ id: String(t.id), label: t.title, icon: "stop", run: () => cancelTask(t.id) })),
|
|
{ kind: "separator" as const },
|
|
{ id: "all", label: "Stop All", run: () => running.forEach((t) => cancelTask(t.id)) },
|
|
]);
|
|
}
|
|
|
|
/** Generic actions owned by the shell. */
|
|
export function registerShellActions(): () => void {
|
|
return registerActions([
|
|
{
|
|
id: "file.openProject",
|
|
title: "Open…",
|
|
category: "File",
|
|
icon: "folder-open",
|
|
keywords: ["folder", "project"],
|
|
run: openProjectDialog,
|
|
},
|
|
{
|
|
id: "file.closeProject",
|
|
title: "Close Project",
|
|
category: "File",
|
|
when: "projectOpen",
|
|
run: async () => {
|
|
if (!useProject.getState().project || !(await confirmLeaveProject())) return;
|
|
try {
|
|
await closeProject();
|
|
} catch (e) {
|
|
maybeEditorService()?.cancelClose?.();
|
|
throw e;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
id: "workbench.stopBackgroundProcesses",
|
|
title: "Stop Background Processes…",
|
|
category: "Window",
|
|
keywords: ["cancel task", "background tasks", "progress"],
|
|
run: stopBackgroundProcesses,
|
|
},
|
|
{
|
|
id: "view.toggleTheme",
|
|
title: "Toggle Light/Dark Theme",
|
|
category: "View",
|
|
icon: "sun",
|
|
keywords: ["appearance", "theme"],
|
|
run: toggleTheme,
|
|
},
|
|
{
|
|
id: "view.quickSwitchScheme",
|
|
title: "Quick Switch Scheme…",
|
|
category: "View",
|
|
keywords: ["theme", "color scheme", "keymap", "view mode"],
|
|
run: () => showQuickSwitch({ x: window.innerWidth / 2 - 120, y: 96 }),
|
|
},
|
|
{
|
|
id: "toolbar.customize",
|
|
title: "Customize Main Toolbar…",
|
|
category: "View",
|
|
keywords: ["toolbar", "widgets", "title bar"],
|
|
run: showCustomizeToolbar,
|
|
},
|
|
{
|
|
id: "view.notifications",
|
|
title: "Notifications",
|
|
category: "View",
|
|
icon: "bell",
|
|
run: () => activateToolWindow(NOTIFICATIONS_TOOL_WINDOW),
|
|
},
|
|
// Keys of search fields (find bar, Find in Files) that are editor shortcuts elsewhere.
|
|
{
|
|
id: "find.field.newLine",
|
|
title: "New Line in Search Field",
|
|
category: "Find",
|
|
hidden: true,
|
|
when: "searchFieldNewLine",
|
|
run: () => void runSearchFieldCommand("newLine"),
|
|
},
|
|
{
|
|
id: "find.field.recentSearches",
|
|
title: "Recent Searches",
|
|
category: "Find",
|
|
hidden: true,
|
|
when: "searchFieldHistory",
|
|
run: () => void runSearchFieldCommand("history"),
|
|
},
|
|
]);
|
|
}
|