mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 03:29:02 +01:00 
			
		
		
		
	working (but messy) pan & zoom without scrollbar and new note on click
This commit is contained in:
		
							parent
							
								
									525f167127
								
							
						
					
					
						commit
						02fd8f8133
					
				| @ -4,9 +4,10 @@ import linkService from "./link.js"; | ||||
| import libraryLoader from "./library_loader.js"; | ||||
| import treeService from "./tree.js"; | ||||
| import contextMenuWidget from "./context_menu.js"; | ||||
| import infoService from "./info.js"; | ||||
| 
 | ||||
| const $component = $("#note-detail-relation-map"); | ||||
| const $relationMapCanvas = $("#relation-map-canvas"); | ||||
| const $relationMapContainer = $("#relation-map-container"); | ||||
| const $addChildNotesButton = $("#relation-map-add-child-notes"); | ||||
| const $createChildNote = $("#relation-map-create-child-note"); | ||||
| const $zoomInButton = $("#relation-map-zoom-in"); | ||||
| @ -124,33 +125,18 @@ async function loadNotesAndRelations() { | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| function getMousePos(canvas, evt) { | ||||
|     var rect = canvas.getBoundingClientRect(); | ||||
| 
 | ||||
|     console.log(rect); | ||||
|     console.log(canvas); | ||||
| 
 | ||||
| 
 | ||||
|     console.log(`(${evt.clientX} - ${rect.left}) / (${rect.right} - ${rect.left}) * ${canvas.width}`); | ||||
| 
 | ||||
|     return { | ||||
|         x: (evt.clientX - rect.left) / (rect.right - rect.left) * canvas.width, | ||||
|         y: (evt.clientY - rect.top) / (rect.bottom - rect.top) * canvas.height | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| function initPanZoom() { | ||||
|     if (pzInstance) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     pzInstance = panzoom($relationMapCanvas[0], { | ||||
|     pzInstance = panzoom($relationMapContainer[0], { | ||||
|         maxZoom: 2, | ||||
|         minZoom: 0.1, | ||||
|         smoothScroll: false, | ||||
|         onMouseDown: function(event) { | ||||
|             if (clipboard) { | ||||
|                 const {x, y} = getMousePos($relationMapCanvas[0].getContext("2d"), event); | ||||
|                 const {x, y} = getMousePos(event); | ||||
| 
 | ||||
|                 console.log(x, y); | ||||
| 
 | ||||
| @ -165,22 +151,27 @@ function initPanZoom() { | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     pzInstance.on('transform', () => { | ||||
|         jsPlumbInstance.setZoom(getZoom()); | ||||
| 
 | ||||
|         updateTransform(); | ||||
|     }); | ||||
| 
 | ||||
|     if (mapData.transform) { | ||||
|         pzInstance.zoomTo(0, 0, mapData.transform.scale); | ||||
| 
 | ||||
|         pzInstance.moveTo(mapData.transform.x, mapData.transform.y); | ||||
|     } | ||||
| 
 | ||||
|     pzInstance.on('zoom', function (e) { | ||||
|         mapData.transform = pzInstance.getTransform(); | ||||
|     function updateTransform() { | ||||
|         const newTransform = pzInstance.getTransform(); | ||||
| 
 | ||||
|         saveData(); | ||||
|     }); | ||||
|         if (JSON.stringify(newTransform) !== JSON.stringify(mapData.transform)) { | ||||
|             mapData.transform = newTransform; | ||||
| 
 | ||||
|     pzInstance.on('panend', function (e) { | ||||
|         mapData.transform = pzInstance.getTransform(); | ||||
| 
 | ||||
|         saveData(); | ||||
|     }, true); | ||||
|             saveData(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     $zoomInButton.click(() => pzInstance.zoomTo(0, 0, 1.2)); | ||||
|     $zoomOutButton.click(() => pzInstance.zoomTo(0, 0, 0.8)); | ||||
| @ -192,7 +183,7 @@ function cleanup() { | ||||
|         jsPlumbInstance.deleteEveryEndpoint(); | ||||
| 
 | ||||
|         // without this we still end up with note boxes remaining in the canvas
 | ||||
|         $relationMapCanvas.empty(); | ||||
|         $relationMapContainer.empty(); | ||||
|     } | ||||
| 
 | ||||
|     if (pzInstance) { | ||||
| @ -213,7 +204,7 @@ function initJsPlumbInstance () { | ||||
|         Connector: "StateMachine", | ||||
|         ConnectionOverlays: uniDirectionalOverlays, | ||||
|         HoverPaintStyle: { stroke: "#777", strokeWidth: 1 }, | ||||
|         Container: "relation-map-canvas" | ||||
|         Container: "relation-map-container" | ||||
|     }); | ||||
| 
 | ||||
|     jsPlumbInstance.registerConnectionType("uniDirectional", { anchor:"Continuous", connector:"StateMachine", overlays: uniDirectionalOverlays }); | ||||
| @ -223,7 +214,7 @@ function initJsPlumbInstance () { | ||||
|     jsPlumbInstance.bind("connection", connectionCreatedHandler); | ||||
| 
 | ||||
|     // so that canvas is not panned when clicking/dragging note box
 | ||||
|     $relationMapCanvas.on('mousedown touchstart', '.note-box, .connection-label', e => e.stopPropagation()); | ||||
|     $relationMapContainer.on('mousedown touchstart', '.note-box, .connection-label', e => e.stopPropagation()); | ||||
| } | ||||
| 
 | ||||
| function connectionContextMenuHandler(connection, event) { | ||||
| @ -291,7 +282,7 @@ async function connectionCreatedHandler(info, originalEvent) { | ||||
|     connection.getOverlay("label").setLabel(name); | ||||
| } | ||||
| 
 | ||||
| $relationMapCanvas.on("contextmenu", ".note-box", e => { | ||||
| $relationMapContainer.on("contextmenu", ".note-box", e => { | ||||
|     const contextMenuItems = [ | ||||
|         {title: "Remove note", cmd: "remove", uiIcon: "trash"}, | ||||
|         {title: "Edit title", cmd: "edit-title", uiIcon: "pencil"}, | ||||
| @ -427,7 +418,7 @@ $addChildNotesButton.click(async () => { | ||||
| let clipboard = null; | ||||
| 
 | ||||
| $createChildNote.click(async () => { | ||||
|     const title = prompt("Enter title of new note", "new note"); | ||||
|     const title = "new note" || prompt("Enter title of new note", "new note"); | ||||
| 
 | ||||
|     if (!title.trim()) { | ||||
|         return; | ||||
| @ -438,6 +429,8 @@ $createChildNote.click(async () => { | ||||
|         target: 'into' | ||||
|     }); | ||||
| 
 | ||||
|     infoService.showMessage("Click on canvas to place new note"); | ||||
| 
 | ||||
|     // reloading tree so that the new note appears there
 | ||||
|     // no need to wait for it to finish
 | ||||
|     treeService.reload(); | ||||
| @ -445,6 +438,62 @@ $createChildNote.click(async () => { | ||||
|     clipboard = { id: note.noteId, title }; | ||||
| }); | ||||
| 
 | ||||
| function getZoom() { | ||||
|     const matrixRegex = /matrix\((-?\d*\.?\d+),\s*0,\s*0,\s*-?\d*\.?\d+,\s*-?\d*\.?\d+,\s*-?\d*\.?\d+\)/; | ||||
| 
 | ||||
|     const matches = $relationMapContainer.css('transform').match(matrixRegex); | ||||
| 
 | ||||
|     return matches[1]; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function dragover_handler(ev) { | ||||
|     ev.preventDefault(); | ||||
|     // Set the dropEffect to move
 | ||||
|     //ev.dataTransfer.dropEffect = "move";
 | ||||
| 
 | ||||
|     console.log("DRAGOVER"); | ||||
| } | ||||
| function drop_handler(ev) { | ||||
|     ev.preventDefault(); | ||||
| 
 | ||||
|     console.log("DROP!", ev); | ||||
| } | ||||
| 
 | ||||
| function getMousePos(evt) { | ||||
|     const rect = $relationMapContainer[0].getBoundingClientRect(); | ||||
| 
 | ||||
|     const zoom = getZoom(); | ||||
| 
 | ||||
|     return { | ||||
|         x: (evt.clientX - rect.left) / zoom, | ||||
|         y: (evt.clientY - rect.top) / zoom | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| $relationMapContainer.click(function(event) { | ||||
|     console.log("HEY!"); | ||||
| 
 | ||||
|     console.log(event.clientX, event.clientY); | ||||
| 
 | ||||
|     if (clipboard) { | ||||
|         const {x, y} = getMousePos(event); | ||||
| 
 | ||||
|         console.log(x, y); | ||||
| 
 | ||||
|         createNoteBox(clipboard.id, clipboard.title, x, y); | ||||
| 
 | ||||
|         //mapData.notes.push({ id: clipboard.id, x, y });
 | ||||
| 
 | ||||
|         clipboard = null; | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| }); | ||||
| 
 | ||||
| $component.on("drop", drop_handler); | ||||
| $component.on("dragover", dragover_handler); | ||||
| 
 | ||||
| export default { | ||||
|     show, | ||||
|     getContent: () => JSON.stringify(mapData), | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| #note-detail-relation-map { | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
| } | ||||
| 
 | ||||
| /* this is removing dotted border around focused/active relation map */ | ||||
| @ -8,8 +7,10 @@ | ||||
|     outline: none; | ||||
| } | ||||
| 
 | ||||
| #relation-map-canvas { | ||||
|     position: absolute; /* needs to be absolute otherwise connections will be misplaced */ | ||||
| #relation-map-wrapper { | ||||
|     position: relative; | ||||
|     overflow: hidden !important; | ||||
|     height: 800px; | ||||
| } | ||||
| 
 | ||||
| .note-box { | ||||
|  | ||||
| @ -19,5 +19,7 @@ | ||||
|                 id="relation-map-zoom-out"></button> | ||||
|     </div> | ||||
| 
 | ||||
|     <div id="relation-map-canvas"></div> | ||||
|     <div id="relation-map-wrapper"> | ||||
|        <div id="relation-map-container"></div> | ||||
|     </div> | ||||
| </div> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 azivner
						azivner