diff --git a/src/renderer/components/FileExplorer/CodeEditor.tsx b/src/renderer/components/FileExplorer/CodeEditor.tsx index bf0c0f2a0..bb7da6f00 100644 --- a/src/renderer/components/FileExplorer/CodeEditor.tsx +++ b/src/renderer/components/FileExplorer/CodeEditor.tsx @@ -25,6 +25,7 @@ import { FileTree } from './FileTree'; import { FileTabs } from './FileTabs'; import { EditorHeader } from './EditorHeader'; import { MarkdownPreview } from './MarkdownPreview'; +import { SettingsPage, type SettingsPageTab } from '../SettingsPage'; import '@/styles/editor-diff.css'; interface CodeEditorProps { @@ -35,6 +36,9 @@ interface CodeEditorProps { onClose: () => void; connectionId?: string | null; remotePath?: string | null; + showSettingsPage?: boolean; + settingsPageInitialTab?: SettingsPageTab; + onCloseSettingsPage?: () => void; } export default function CodeEditor({ @@ -45,12 +49,37 @@ export default function CodeEditor({ onClose, connectionId, remotePath, + showSettingsPage, + settingsPageInitialTab, + onCloseSettingsPage, }: CodeEditorProps) { const { effectiveTheme } = useTheme(); - const { toggle: toggleRightSidebar, collapsed: rightSidebarCollapsed } = useRightSidebar(); + const { + toggle: toggleRightSidebar, + collapsed: rightSidebarCollapsed, + setCollapsed: setRightSidebarCollapsed, + } = useRightSidebar(); const monacoRef = useRef(null); const editorRef = useRef(null); const editorRegistrationCleanupRef = useRef<(() => void) | null>(null); + const rightSidebarWasCollapsedRef = useRef(false); + + // Collapse the right sidebar when settings is shown inside the editor, + // and restore the previous state when settings is closed. + useEffect(() => { + if (showSettingsPage) { + rightSidebarWasCollapsedRef.current = rightSidebarCollapsed; + if (!rightSidebarCollapsed) { + setRightSidebarCollapsed(true); + } + } else { + if (!rightSidebarWasCollapsedRef.current && rightSidebarCollapsed) { + setRightSidebarCollapsed(false); + } + } + // Only react to showSettingsPage toggling, not rightSidebarCollapsed changes + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [showSettingsPage, setRightSidebarCollapsed]); // File management with custom hook const { @@ -277,6 +306,7 @@ export default function CodeEditor({ onSaveAll={saveAllFiles} onToggleRightSidebar={toggleRightSidebar} onClose={onClose} + showSettingsPage={showSettingsPage} />
@@ -297,24 +327,35 @@ export default function CodeEditor({ />
- - - + {showSettingsPage ? ( +
+ {})} + /> +
+ ) : ( + <> + + + + + )}
diff --git a/src/renderer/components/FileExplorer/EditorHeader.tsx b/src/renderer/components/FileExplorer/EditorHeader.tsx index c75cede5b..149b29d87 100644 --- a/src/renderer/components/FileExplorer/EditorHeader.tsx +++ b/src/renderer/components/FileExplorer/EditorHeader.tsx @@ -10,6 +10,7 @@ interface EditorHeaderProps { onSaveAll: () => void; onToggleRightSidebar: () => void; onClose: () => void; + showSettingsPage?: boolean; } export const EditorHeader: React.FC = ({ @@ -20,10 +21,11 @@ export const EditorHeader: React.FC = ({ onSaveAll, onToggleRightSidebar, onClose, + showSettingsPage, }) => { return (
- + = ({ onSaveAll={onSaveAll} onToggleRightSidebar={onToggleRightSidebar} onClose={onClose} + showSettingsPage={showSettingsPage} />
); @@ -54,6 +57,7 @@ const EditorControls: React.FC<{ onSaveAll: () => void; onToggleRightSidebar: () => void; onClose: () => void; + showSettingsPage?: boolean; }> = ({ hasUnsavedChanges, isSaving, @@ -61,27 +65,32 @@ const EditorControls: React.FC<{ onSaveAll, onToggleRightSidebar, onClose, + showSettingsPage, }) => (
- - + {!showSettingsPage && ( + <> + + + + )} diff --git a/src/renderer/views/Workspace.tsx b/src/renderer/views/Workspace.tsx index f2b64bd45..c071f281a 100644 --- a/src/renderer/views/Workspace.tsx +++ b/src/renderer/views/Workspace.tsx @@ -155,14 +155,6 @@ export function Workspace() { }; }, []); - // Listen for native menu "Settings" click (main → renderer) - useEffect(() => { - const cleanup = window.electronAPI.onMenuOpenSettings?.(() => { - openSettingsPage(); - }); - return () => cleanup?.(); - }, [openSettingsPage]); - // Listen for native menu Undo/Redo (main → renderer) and keep operations editor-scoped. useEffect(() => { const cleanupUndo = window.electronAPI.onMenuUndo?.(() => { @@ -189,6 +181,14 @@ export function Workspace() { const projectMgmt = useProjectManagementContext(); const { showEditorMode, setShowEditorMode, setShowKanban } = projectMgmt; + // Listen for native menu "Settings" click (main → renderer) + useEffect(() => { + const cleanup = window.electronAPI.onMenuOpenSettings?.(() => { + openSettingsPage(); + }); + return () => cleanup?.(); + }, [openSettingsPage]); + const handleToggleKanban = useCallback(() => { if (!projectMgmt.selectedProject) return; setShowEditorMode(false); @@ -257,7 +257,10 @@ export function Workspace() { }); // Show toast on update availability - useUpdateNotifier({ checkOnMount: true, onOpenSettings: () => openSettingsPage('general') }); + useUpdateNotifier({ + checkOnMount: true, + onOpenSettings: () => openSettingsPage('general'), + }); // Listen for native menu "Check for Updates" click (main → renderer) useEffect(() => { @@ -485,6 +488,9 @@ export function Workspace() { onClose={handleCloseEditor} connectionId={derivedRemoteConnectionId} remotePath={derivedRemotePath} + showSettingsPage={showSettingsPage} + settingsPageInitialTab={settingsPageInitialTab} + onCloseSettingsPage={handleCloseSettingsPage} /> )}