[Fencommits] fenfire-hs: buggy undo

Tuukka Hastrup Tuukka.Hastrup at iki.fi
Wed Feb 21 14:26:12 EET 2007


Wed Feb 21 13:57:43 EET 2007  Tuukka Hastrup <Tuukka.Hastrup at iki.fi>
  * buggy undo
diff -rN -u old-fenfire-hs/Fenfire.fhs new-fenfire-hs/Fenfire.fhs
--- old-fenfire-hs/Fenfire.fhs	2007-02-21 14:26:11.000000000 +0200
+++ new-fenfire-hs/Fenfire.fhs	2007-02-21 14:26:12.000000000 +0200
@@ -67,7 +67,8 @@
 data FenState = FenState {
     fsGraph :: Graph, fsRotation :: Rotation, fsMark :: Mark,
     fsFilePath :: FilePath, fsGraphModified :: Bool, fsHasFocus :: Bool,
-    fsView :: Int, fsProperty :: Node, fsPropertyList :: [Node] }
+    fsView :: Int, fsProperty :: Node, fsPropertyList :: [Node], 
+    fsUndo :: [(Graph,Rotation)], fsRedo :: [(Graph,Rotation)]}
     
 fsNode :: FenState -> Node
 fsNode (FenState { fsRotation = Rotation node _ }) = node
@@ -318,7 +319,7 @@
     let ?graph = foldr (\n -> insert $ triple dir (node, prop, n))
                        (fsGraph state) nodes in
     state { fsRotation = fromJust $ fromPath (Path node [Conn prop dir (head nodes)]),
-            fsGraph = ?graph, fsMark = Set.empty, fsGraphModified = True }
+            fsGraph = ?graph, fsMark = Set.empty }
 
 disconnect :: (?vs :: ViewSettings) => Dir -> Endo FenState
 disconnect dir state@(FenState { fsRotation=rot@(Rotation node _) }) =
@@ -332,7 +333,8 @@
                 graph' = foldr delete (fsGraph state) triples
                 rot' = fromMaybe (Rotation node 0) $
                        let ?graph = graph' in fromPath =<< path'
-             in state { fsGraph=graph', fsRotation=rot', fsGraphModified=True }
+             in state { fsGraph=graph', fsRotation=rot', fsGraphModified=True,
+                        fsUndo=(fsGraph state,fsRotation state):fsUndo state, fsRedo=[]}
 
 
 type Mark = Set Node
@@ -486,7 +488,7 @@
 
 newState :: Graph -> Rotation -> FilePath -> Bool -> FenState
 newState graph rot fp focus = 
-    FenState graph rot Set.empty fp False focus 0 rdfs_seeAlso ps
+    FenState graph rot Set.empty fp False focus 0 rdfs_seeAlso ps [] []
     where ps = Set.toAscList $ Set.insert rdfs_seeAlso $ Set.fromList $
                    map predicate $ filter f $ graphToList graph
           f (_, _, URI _) = True
@@ -555,7 +557,9 @@
                              g <- liftIO $ loadGraph uri
                              let g' = mergeGraphs graph g
                                  r' = Rotation node r
-                                 s' = state {fsGraph=g', fsRotation=r'}
+                                 s' = state {fsGraph=g', fsRotation=r',
+                                             fsUndo=(graph,rot):fsUndo state,
+                                             fsRedo=[]}
                              put s'
                          _ -> unhandledEvent
         "revert" | filepath /= "" -> confirmRevert modified $ do
@@ -582,9 +586,17 @@
                            URI uri -> confirmString "New URI" uri $ \uri' ->
                               put $ stateReplaceNode (URI uri) (URI uri') state
                            _       -> unhandledEvent
-        _       -> unhandledEvent
+        "undo" | (graph',rot'):undos <- fsUndo state -> do
+                   put state {fsGraph=graph', fsRotation=rot', 
+                              fsUndo=undos, fsRedo=(graph,rot):fsRedo state}
+        "redo" | (graph',rot'):redos <- fsRedo state -> do
+                   put state {fsGraph=graph', fsRotation=rot', 
+                              fsUndo=(graph,rot):fsUndo state, fsRedo=redos}
+        _       -> do liftIO $ putStrLn $ "Unhandled action: " ++ action
+                      unhandledEvent
   where putGraph g        = do modify $ \s ->
-                                   s { fsGraph=g, fsGraphModified=True }
+                                   s { fsGraph=g, fsGraphModified=True,
+                                       fsUndo=(fsGraph s, fsRotation s):fsUndo s, fsRedo=[]}
                                setInterp True
         putRotation rot   = do modify $ \s -> s { fsRotation=rot }
                                setInterp True
@@ -600,6 +612,8 @@
             , ( "revert" , stockRevertToSaved )
             , ( "quit"   , stockQuit          )
             , ( "about"  , stockAbout         )
+            , ( "undo"   , stockUndo          )
+            , ( "redo"   , stockRedo          )
             ]
     forM actionentries $ \(name,stock) -> do 
         action <- actionNew name Nothing Nothing (Just stock)
@@ -674,7 +688,8 @@
     menu = [m "_File" [a "new", a "open", a "loadURI", sep,
                        a "save", a "saveas", a "revert", sep,
                        a "quit"],
-            m "_Edit" [return propmenu, sep,
+            m "_Edit" [a "undo", a "redo", sep,
+                       return propmenu, sep,
                        a "noder", a "nodel", sep,
                        a "breakr", a "breakl", sep,
                        a "mark", a "connr", a "connl", sep, 
@@ -789,7 +804,7 @@
 
                 modifyIORef stateRef $ \s -> 
                     s { fsGraph=g'', fsRotation = Rotation n' r',
-                        fsGraphModified=True }
+                        fsGraphModified=True } -- XXX undo
                 updateActions actionGroup stateRef
                 updateCanvas True
 




More information about the Fencommits mailing list