mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-10-29 09:54:23 +01:00 
			
		
		
		
	Implement redo (#191)
This commit is contained in:
		 Guillermo Peralta Scura
					Guillermo Peralta Scura
				
			
				
					committed by
					
						 Christopher Chedeau
						Christopher Chedeau
					
				
			
			
				
	
			
			
			 Christopher Chedeau
						Christopher Chedeau
					
				
			
						parent
						
							3bbcb9cbdc
						
					
				
				
					commit
					ea534dd535
				
			| @@ -27,6 +27,8 @@ const DEFAULT_PROJECT_NAME = `excalidraw-${getDateTime()}`; | ||||
|  | ||||
| let skipHistory = false; | ||||
| const stateHistory: string[] = []; | ||||
| const redoStack: string[] = []; | ||||
|  | ||||
| function generateHistoryCurrentEntry() { | ||||
|   return JSON.stringify( | ||||
|     elements.map(element => ({ ...element, isSelected: false })) | ||||
| @@ -1351,13 +1353,25 @@ class App extends React.Component<{}, AppState> { | ||||
|     } else if (shapesShortcutKeys.includes(event.key.toLowerCase())) { | ||||
|       this.setState({ elementType: findElementByKey(event.key) }); | ||||
|     } else if (event.metaKey && event.code === "KeyZ") { | ||||
|       let lastEntry = stateHistory.pop(); | ||||
|       // If nothing was changed since last, take the previous one | ||||
|       if (generateHistoryCurrentEntry() === lastEntry) { | ||||
|         lastEntry = stateHistory.pop(); | ||||
|       } | ||||
|       if (lastEntry !== undefined) { | ||||
|         restoreHistoryEntry(lastEntry); | ||||
|       const currentEntry = generateHistoryCurrentEntry(); | ||||
|       if (event.shiftKey) { | ||||
|         // Redo action | ||||
|         const entryToRestore = redoStack.pop(); | ||||
|         if (entryToRestore !== undefined) { | ||||
|           restoreHistoryEntry(entryToRestore); | ||||
|           stateHistory.push(currentEntry); | ||||
|         } | ||||
|       } else { | ||||
|         // undo action | ||||
|         let lastEntry = stateHistory.pop(); | ||||
|         // If nothing was changed since last, take the previous one | ||||
|         if (currentEntry === lastEntry) { | ||||
|           lastEntry = stateHistory.pop(); | ||||
|         } | ||||
|         if (lastEntry !== undefined) { | ||||
|           restoreHistoryEntry(lastEntry); | ||||
|           redoStack.push(currentEntry); | ||||
|         } | ||||
|       } | ||||
|       this.forceUpdate(); | ||||
|       event.preventDefault(); | ||||
| @@ -2046,6 +2060,7 @@ class App extends React.Component<{}, AppState> { | ||||
|     save(this.state); | ||||
|     if (!skipHistory) { | ||||
|       pushHistoryEntry(generateHistoryCurrentEntry()); | ||||
|       redoStack.splice(0, redoStack.length); | ||||
|     } | ||||
|     skipHistory = false; | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user