summaryrefslogtreecommitdiff
path: root/src/renderer
diff options
context:
space:
mode:
authorhaoyuren <13851610112@163.com>2026-03-15 04:27:43 -0500
committerhaoyuren <13851610112@163.com>2026-03-15 04:27:43 -0500
commitd1ee677591bd5e6e8b1726b2281621adf6131332 (patch)
tree609785e6022fe41f8809ab172003928165a1bb72 /src/renderer
parent6aea514b38a8b36882d39aec30fd12e997f82611 (diff)
v0.3.0: Fix sync exclusions, add editor zoom, cached PDF loadingv0.3.0
- Exclude CLAUDE.md from sync (move to .claude/ dotfile dir, clean up root copy) - Add Ctrl+wheel font zoom for editor (capture phase, disable Electron built-in zoom) - Load cached PDF on project connect (avoid recompile to see last PDF) - Add synctex debug logging for PDF↔source navigation troubleshooting - Fix .claude/ dir creation order (mkdir before write) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/renderer')
-rw-r--r--src/renderer/src/components/Editor.tsx24
-rw-r--r--src/renderer/src/components/PdfViewer.tsx10
-rw-r--r--src/renderer/src/components/ProjectList.tsx1
3 files changed, 31 insertions, 4 deletions
diff --git a/src/renderer/src/components/Editor.tsx b/src/renderer/src/components/Editor.tsx
index 4edb945..8319e93 100644
--- a/src/renderer/src/components/Editor.tsx
+++ b/src/renderer/src/components/Editor.tsx
@@ -88,6 +88,7 @@ export default function Editor() {
const docSyncRef = useRef<OverleafDocSync | null>(null)
const cursorThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null)
+ const [editorFontSize, setEditorFontSize] = useState(13.5)
// Add comment state
const [newComment, setNewComment] = useState<{ from: number; to: number; text: string } | null>(null)
@@ -358,6 +359,29 @@ export default function Editor() {
viewRef.current.dispatch({ effects: highlightThreadEffect.of(hoveredThreadId) })
}, [hoveredThreadId])
+ // Ctrl+wheel / pinch zoom on editor (capture phase to beat CodeMirror)
+ useEffect(() => {
+ const el = editorRef.current
+ if (!el) return
+ const handleWheel = (e: WheelEvent) => {
+ if (!(e.ctrlKey || e.metaKey)) return
+ e.preventDefault()
+ e.stopPropagation()
+ const delta = e.deltaY > 0 ? -1 : 1
+ setEditorFontSize((s) => Math.min(28, Math.max(8, +(s + delta * 0.5).toFixed(1))))
+ }
+ el.addEventListener('wheel', handleWheel, { passive: false, capture: true })
+ return () => el.removeEventListener('wheel', handleWheel, { capture: true })
+ }, [])
+
+ // Apply font size to editor
+ useEffect(() => {
+ if (!viewRef.current) return
+ const wrapper = viewRef.current.dom
+ wrapper.style.fontSize = `${editorFontSize}px`
+ viewRef.current.requestMeasure()
+ }, [editorFontSize])
+
if (!activeTab) {
return (
<div className="editor-empty">
diff --git a/src/renderer/src/components/PdfViewer.tsx b/src/renderer/src/components/PdfViewer.tsx
index c5fe8c4..01896d7 100644
--- a/src/renderer/src/components/PdfViewer.tsx
+++ b/src/renderer/src/components/PdfViewer.tsx
@@ -214,9 +214,9 @@ export default function PdfViewer() {
// SyncTeX: double-click PDF → jump to source
const handlePdfDoubleClick = useCallback(async (e: MouseEvent) => {
- if (!pdfPath) return
+ if (!pdfPath) { console.log('[synctex-ui] no pdfPath'); return }
const canvas = (e.target as HTMLElement).closest('canvas.pdf-page') as HTMLCanvasElement | null
- if (!canvas) return
+ if (!canvas) { console.log('[synctex-ui] no canvas target'); return }
const container = containerRef.current
if (!container) return
@@ -234,12 +234,14 @@ export default function PdfViewer() {
// Convert to PDF points (72 DPI coordinate system, origin bottom-left)
const vpInfo = pageViewportsRef.current.get(pageNum)
- if (!vpInfo) return
+ if (!vpInfo) { console.log('[synctex-ui] no viewport info for page', pageNum); return }
const pdfX = (clickX / rect.width) * vpInfo.width
const pdfY = vpInfo.height - (clickY / rect.height) * vpInfo.height
+ console.log(`[synctex-ui] dblclick page=${pageNum} pdfX=${pdfX.toFixed(1)} pdfY=${pdfY.toFixed(1)} path=${pdfPath}`)
const result = await window.api.synctexEdit(pdfPath, pageNum, pdfX, pdfY)
- if (!result) return
+ if (!result) { console.log('[synctex-ui] synctex returned null'); return }
+ console.log(`[synctex-ui] result: file=${result.file} line=${result.line}`)
// Navigate to source — synctex returns relative path (e.g. "latex/main.tex")
const store = useAppStore.getState()
diff --git a/src/renderer/src/components/ProjectList.tsx b/src/renderer/src/components/ProjectList.tsx
index 58a6bb0..2fe23de 100644
--- a/src/renderer/src/components/ProjectList.tsx
+++ b/src/renderer/src/components/ProjectList.tsx
@@ -69,6 +69,7 @@ export default function ProjectList({ onOpenProject }: Props) {
store.setOverleafProjectId(pid)
store.setConnectionState('connected')
if (result.syncDir) store.setSyncDir(result.syncDir)
+ if (result.cachedPdfPath) store.setPdfPath(result.cachedPdfPath)
setStatusMessage('Connected')
onOpenProject(pid)
} else {