diff --git a/client/main.js b/client/main.js index 203001a..d80fb2e 100644 --- a/client/main.js +++ b/client/main.js @@ -70,90 +70,8 @@ function createMenu() { ], }, { - label: "Views", - submenu: [ - { - label: "Change Views", - click: () => { - if (mainWindow) { - mainWindow.webContents.send("change-views"); - } - }, - }, - { type: "separator" }, - { - label: "File Management", - type: "checkbox", - checked: true, - enabled: false, // Always on - }, - { - label: "Visualization", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "visualization", - menuItem.checked, - ), - }, - { - label: "Model Training", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "training", - menuItem.checked, - ), - }, - { - label: "Model Inference", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "inference", - menuItem.checked, - ), - }, - { - label: "Tensorboard", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "monitoring", - menuItem.checked, - ), - }, - { - label: "SynAnno", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "synanno", - menuItem.checked, - ), - }, - { - label: "Mask Proofreading", - type: "checkbox", - checked: false, - click: (menuItem) => - mainWindow.webContents.send( - "toggle-tab", - "mask-proofreading", - menuItem.checked, - ), - }, - ], + label: "Window", + submenu: [{ role: "minimize" }, { role: "close" }], }, ]; diff --git a/client/preload.js b/client/preload.js index 14e18fe..9c18439 100644 --- a/client/preload.js +++ b/client/preload.js @@ -1,25 +1,8 @@ const { contextBridge, ipcRenderer } = require("electron"); -function subscribe(channel) { - return (listener) => { - if (typeof listener !== "function") { - return () => {}; - } - - const wrappedListener = (_event, ...args) => listener(...args); - ipcRenderer.on(channel, wrappedListener); - - return () => { - ipcRenderer.removeListener(channel, wrappedListener); - }; - }; -} - contextBridge.exposeInMainWorld("electronAPI", { isElectron: true, openLocalFile: (options = {}) => ipcRenderer.invoke("open-local-file", options), revealInFinder: (targetPath) => ipcRenderer.invoke("reveal-in-finder", targetPath), - onToggleTab: subscribe("toggle-tab"), - onChangeViews: subscribe("change-views"), }); diff --git a/client/src/components/NeuroglancerViewer.js b/client/src/components/NeuroglancerViewer.js deleted file mode 100644 index 2e791d8..0000000 --- a/client/src/components/NeuroglancerViewer.js +++ /dev/null @@ -1,157 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { Button, Spin, Alert, Typography } from "antd"; -import { ReloadOutlined } from "@ant-design/icons"; -import { apiClient } from "../api"; - -const { Text, Title } = Typography; - -/** - * NeuroglancerViewer Component - * - * Loads and displays Neuroglancer viewer in an iframe using the project's image files. - * Uses the same approach as the Visualization tab. - * - * @param {number} projectId - Project ID to load viewer for - * @param {object} currentSynapse - Current synapse for position reference - */ -function NeuroglancerViewer({ projectId = 1, currentSynapse }) { - const [viewerUrl, setViewerUrl] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - // Load Neuroglancer viewer on mount - useEffect(() => { - loadViewer(); - }, [projectId]); - - const loadViewer = async () => { - setLoading(true); - setError(null); - - try { - const response = await apiClient.get(`/api/synanno/ng-url/${projectId}`); - - if (response.data.url) { - setViewerUrl(response.data.url); - } else { - // If backend returns a message instead of URL (transition state) - if (response.data.message) { - // We can handle the message here, but for now let's just show the "Setup in Progress" state - // by not setting the URL. - console.log("Neuroglancer message:", response.data.message); - } - setError(null); // Clear error if it's just a transition message - } - } catch (err) { - console.error("Failed to load Neuroglancer viewer", err); - setError( - err.response?.data?.detail || "Failed to load Neuroglancer viewer", - ); - } finally { - setLoading(false); - } - }; - - const refreshViewer = () => { - loadViewer(); - }; - - if (loading) { - return ( -
- -
- ); - } - - if (error) { - return ( -
- - -
- ); - } - - // Display viewer in iframe - return ( -
-
-
- {viewerUrl ? ( -