From 7e71cb947bd5b515e64f5aa3e217a76124568a61 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Fri, 31 Jan 2025 22:14:00 +0100 Subject: [PATCH] good initial page state --- src-tauri/src/lib.rs | 42 +++++----- src/components/App.svelte | 4 +- src/components/ContentsView.svelte | 12 +-- src/components/FileView.svelte | 61 +++++++-------- src/components/Footer.svelte | 56 ++++++-------- src/components/PageList.svelte | 71 ++++++++--------- src/components/PrimitiveView.svelte | 10 +-- src/components/ToolbarLeft.svelte | 35 ++++++--- src/components/TreeNode.svelte | 54 +++++++------ src/components/TreeView.svelte | 30 ++++++-- src/components/XRefTable.svelte | 115 +++++++++++++--------------- src/events/PathSelectedEvent.ts | 10 +++ src/models/FileViewState.svelte.ts | 77 +++---------------- src/models/Primitive.svelte.ts | 11 ++- src/models/TreeViewNode.svelte.ts | 3 + src/models/TreeViewState.svelte.ts | 65 ++++++++++++++++ 16 files changed, 342 insertions(+), 314 deletions(-) create mode 100644 src/events/PathSelectedEvent.ts create mode 100644 src/models/TreeViewState.svelte.ts diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6a1c26e..440efac 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -250,13 +250,9 @@ fn get_prim_by_path( } fn get_prim_model_by_path_with_file(path: &str, file: &CosFile) -> Result { - let (step, prim, detail_path) = get_prim_by_path_with_file(path, file)?; + let (step, prim, trace) = get_prim_by_path_with_file(path, file)?; - Ok(PrimitiveModel::from_primitive_with_children( - step.get_key(), - &prim, - detail_path, - )) + Ok(PrimitiveModel::from_primitive_with_children(&prim, trace)) } fn get_prim_by_path_with_file( @@ -286,7 +282,7 @@ fn get_prim_by_steps_with_file( current_prim = resolve_step(¤t_prim, &step)?; if let Primitive::Reference(xref) = current_prim { last_jump = xref.id.to_string(); - parent = resolve_pref(xref.clone(), file)?; + parent = resolve_p_ref(xref.clone(), file)?; current_prim = &parent; } trace.push(PathTrace::new(step.get_key(), last_jump.clone())); @@ -296,9 +292,9 @@ fn get_prim_by_steps_with_file( fn resolve_parent(step: Step, file: &CosFile) -> Result<(Primitive, PathTrace), String> { let parent = match step { + Step::Page(page_num) => return retrieve_page(page_num, file), Step::Number(obj_num) => resolve_xref(obj_num, file)?, Step::Trailer => retrieve_trailer(file), - Step::Page(page_num) => retrieve_page(page_num, file)?, _ => return Err(String::from(format!("{:?} is not a valid path!", step))), }; Ok((parent, PathTrace::new(step.get_key(), step.get_key()))) @@ -323,12 +319,11 @@ fn get_prim_tree_by_path_with_file( file: &CosFile, ) -> Result { let step = node.step()?; - let (mut parent, trace) = resolve_parent(step.clone(), file)?; + let (parent, trace) = resolve_parent(step.clone(), file)?; let path = vec![trace]; + let mut parent_model = PrimitiveModel::from_primitive_with_children(&parent, path); - let mut parent_model = - PrimitiveModel::from_primitive_with_children(step.get_key(), &parent, path); for child in node.children.iter() { expand(child, &mut parent_model, &parent, file)?; } @@ -420,7 +415,6 @@ fn resolve_step<'a>(current_prim: &'a Primitive, step: &Step) -> Result<&'a Prim ))) } }, - Step::Data => return Err("Not implemented!".to_string()), _ => return Err(format!("Invalid Step: {}", step.get_key())), }) } @@ -430,9 +424,13 @@ fn retrieve_trailer(file: &CosFile) -> Primitive { file.trailer.to_primitive(&mut updater).unwrap() } -fn retrieve_page(page_num: u32, file: &CosFile) -> Result { +fn retrieve_page(page_num: u32, file: &CosFile) -> Result<(Primitive, PathTrace), String> { let page_rc = t!(file.get_page(page_num - 1)); - resolve_pref(page_rc.get_ref().get_inner(), file) + let p_ref = page_rc.get_ref().get_inner(); + Ok(( + resolve_p_ref(p_ref, file)?, + PathTrace::new(format!("Page{}", page_num), p_ref.id.to_string()), + )) } #[derive(Debug, PartialEq, Clone)] pub enum Step { @@ -498,10 +496,10 @@ impl Step { fn resolve_xref(id: u64, file: &CosFile) -> Result { let plain_ref = PlainRef { id, gen: 0 }; - resolve_pref(plain_ref, file) + resolve_p_ref(plain_ref, file) } -fn resolve_pref(plain_ref: PlainRef, file: &CosFile) -> Result { +fn resolve_p_ref(plain_ref: PlainRef, file: &CosFile) -> Result { file.resolver() .resolve(plain_ref) .map_err(|e| e.to_string()) @@ -595,12 +593,12 @@ impl PrimitiveModel { result } - fn from_primitive_with_children( - key: String, - primitive: &Primitive, - path: Vec, - ) -> PrimitiveModel { - let mut model = PrimitiveModel::from_primitive(key, primitive, path.clone()); + fn from_primitive_with_children(primitive: &Primitive, path: Vec) -> PrimitiveModel { + let mut model = PrimitiveModel::from_primitive( + path.last().unwrap().key.clone(), + primitive, + path.clone(), + ); model.add_children(primitive, path); model } diff --git a/src/components/App.svelte b/src/components/App.svelte index 598adec..74bd7c5 100644 --- a/src/components/App.svelte +++ b/src/components/App.svelte @@ -23,7 +23,7 @@ let treeShowing: boolean = $state(true); let pagesShowing: boolean = $state(false); let fileViewHeight: number = $derived( - Math.max(innerHeight - footerHeight - titleBarHeight, 0), + Math.max(innerHeight - footerHeight - tabBarHeight - titleBarHeight, 0), ); let fStates: Map = new Map(); @@ -109,7 +109,7 @@
-
+
("get_contents", { id, path }) .then((result) => { + console.log("Contents loaded", result); contents = result; if (contents && editor) { const text = contents.parts @@ -49,13 +50,6 @@ "\n\n%-------------------% EOF %-------------------%\n\n", ); editor.setValue(text); - const model = editor.getModel(); - if (model) { - monaco.editor.setModelLanguage( - model, - "pdf-content-stream", - ); - } } }) .catch((err) => console.error(err)); diff --git a/src/components/FileView.svelte b/src/components/FileView.svelte index ee8b5b3..6ca5397 100644 --- a/src/components/FileView.svelte +++ b/src/components/FileView.svelte @@ -4,9 +4,12 @@ import PrimitiveView from "./PrimitiveView.svelte"; import TreeView from "./TreeView.svelte"; import type FileViewState from "../models/FileViewState.svelte"; - import { onMount } from "svelte"; + import { createEventDispatcher, onMount } from "svelte"; import PageList from "./PageList.svelte"; import ContentsView from "./ContentsView.svelte"; + import TreeViewNode from "../models/TreeViewNode.svelte"; + import TreeViewState from "../models/TreeViewState.svelte"; + import type { PathSelectedEvent } from "../events/PathSelectedEvent"; let { treeShowing, @@ -49,37 +52,33 @@ window.removeEventListener("mousedown", handleMouseButton); }; }); + + function pathSelectedHandler(event: PathSelectedEvent) { + console.log("Path selected", event.detail.path); + fState.selectPath(event.detail.path); + }
-
+
- - - - - - - - + {#if pagesShowing} + + {:else if treeShowing} + + {/if} @@ -98,7 +97,7 @@
{#if xrefTableShowing}
- +
{/if}
@@ -110,21 +109,13 @@ width: 100%; } - .xref-modal-container { - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 0; - overflow: visible; - } - .xref-modal { position: absolute; + border-left: 1px solid var(--border-color); top: 0; right: 0; bottom: 0; - width: 281px; + width: 280px; background: var(--background-color); box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1); z-index: 1000; diff --git a/src/components/Footer.svelte b/src/components/Footer.svelte index 51f0f56..ced6f5e 100644 --- a/src/components/Footer.svelte +++ b/src/components/Footer.svelte @@ -24,8 +24,6 @@ fState && fState.prim ? toElements(fState.prim.trace) : undefined, ); - $inspect(fState?.path); - $inspect(fState?.prim?.trace); function toElements(path: Trace[]): Path[] { if (path.length == 0) { return [new Path("Trailer", 0)]; @@ -52,38 +50,30 @@ } -
-
- {#if elements} - {#each elements as path} - - {/each} - {/if} -
+ diff --git a/src/components/PageList.svelte b/src/components/PageList.svelte index eabf881..29ccc84 100644 --- a/src/components/PageList.svelte +++ b/src/components/PageList.svelte @@ -3,8 +3,7 @@ import PrimitiveIcon from "./PrimitiveIcon.svelte"; import type PageModel from "../models/PageModel"; - let { fState }: { fState: FileViewState } = $props(); - let h: number = $state(100); + let { fState, h }: { fState: FileViewState; h: number } = $props(); let selected: PageModel | undefined = $state(undefined); function handlePageSelect(page: PageModel) { @@ -13,43 +12,37 @@ } -
-
-
- - - - - +
+
PageRef
+ + + + + + +
PageRef
+
+ + + {#each fState.file.pages as page} + handlePageSelect(page)} + > + + - -
+
+ +

+ {page.key} +

+
+
{page.obj_num}
-
- - - {#each fState.file.pages as page} - handlePageSelect(page)} - > - - - - {/each} - -
-
- -

- {page.key} -

-
-
{page.id}
-
-
+ {/each} + +
@@ -71,7 +64,7 @@ } .t-data { - @apply border border-forge-sec text-sm text-forge-text text-left; + @apply border border-forge-sec text-xs text-forge-text text-left; text-align: left; cursor: default; } diff --git a/src/components/PrimitiveView.svelte b/src/components/PrimitiveView.svelte index 27d884a..744e90b 100644 --- a/src/components/PrimitiveView.svelte +++ b/src/components/PrimitiveView.svelte @@ -6,11 +6,10 @@ let { fState, height }: { fState: FileViewState; height: number } = $props(); - let bodyHeight = $derived(height - 54); - let selected: Primitive | undefined = $state(undefined); + let bodyHeight = $derived(height - 24); let prim = $derived(fState.prim); let showContents = $state(false); - + $inspect(fState.highlightedPrim); function handlePrimSelect(prim: Primitive) { if (prim.isContainer()) { if (!prim) { @@ -44,9 +43,10 @@ {#each prim.children as entry} (selected = entry)} + onclick={() => (fState.highlightedPrim = entry)} ondblclick={() => handlePrimSelect(entry)} > diff --git a/src/components/ToolbarLeft.svelte b/src/components/ToolbarLeft.svelte index 2c54137..0806813 100644 --- a/src/components/ToolbarLeft.svelte +++ b/src/components/ToolbarLeft.svelte @@ -1,33 +1,48 @@ +
- -
- \ No newline at end of file + diff --git a/src/components/TreeNode.svelte b/src/components/TreeNode.svelte index 6819ba0..3f0bc79 100644 --- a/src/components/TreeNode.svelte +++ b/src/components/TreeNode.svelte @@ -2,16 +2,21 @@ import type Primitive from "../models/Primitive.svelte"; import PrimitiveIcon from "./PrimitiveIcon.svelte"; import { CaretRightOutline, CaretDownOutline } from "flowbite-svelte-icons"; - import type FileViewState from "../models/FileViewState.svelte"; - import { arraysAreEqual } from "../utils.js"; + import type TreeViewState from "../models/TreeViewState.svelte"; + import { PathSelectedEvent } from "../events/PathSelectedEvent"; + import { createEventDispatcher } from "svelte"; let { - prim, - path, - fState, - }: { prim: Primitive | undefined; path: string[]; fState: FileViewState } = - $props(); - let active = $derived(arraysAreEqual(path, fState.path)); + parent_view, + parent_path, + treeState, + pathSelectedHandler = $bindable(), + }: { + parent_view: Primitive; + parent_path: string[]; + treeState: TreeViewState; + pathSelectedHandler: any; + } = $props(); function copyPathAndAppend(key: string): string[] { const _path = copyPath(); @@ -22,33 +27,31 @@ function copyPath(): string[] { const _path: string[] = []; - for (let item of path) { + for (let item of parent_path) { _path.push(item); } return _path; } function selectItem(child: Primitive) { - if (child.isContainer()) { - let _path = copyPathAndAppend(child.key); - fState.expandTree(_path); - fState.selectPath(_path); - } else { - let _path = copyPath(); - fState.selectPath(_path); - } + let _path = copyPathAndAppend(child.key); + console.log("Selecting from tree", _path); + treeState.expandTree(_path); + + const event = new PathSelectedEvent(_path); + pathSelectedHandler(event); } -{#if prim} +{#if parent_view}
    - {#each prim.children as child} + {#each parent_view.children as child}
  • {#if child.children.length > 0} @@ -85,9 +90,10 @@
    {#if child.children.length > 0} {/if}
  • diff --git a/src/components/TreeView.svelte b/src/components/TreeView.svelte index 3298669..78fed5e 100644 --- a/src/components/TreeView.svelte +++ b/src/components/TreeView.svelte @@ -1,30 +1,48 @@
      - {#if prim} + {#if treeState.view}
    • {"Trailer "}
      - + {#if active} + + {/if}
    • {/if}
    getTrace
    +getPath