From d7a17c35c443e2cb6c09eaa3cfeaf590a571faa1 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Wed, 17 Jul 2019 20:15:40 -0400
Subject: [PATCH] Version slider

---
 ObjEditor.java |  213 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 170 insertions(+), 43 deletions(-)

diff --git a/ObjEditor.java b/ObjEditor.java
index b1bbdf6..6e1560f 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -282,6 +282,12 @@
         client = inClient;
         copy = client;
 
+        if (copy.versions == null)
+        {
+            copy.versions = new byte[100][];
+            copy.versionindex = -1;
+        }
+        
         // "this" is not called: SetupUI2(objEditor);
     }
 
@@ -295,6 +301,12 @@
         client = inClient;
         copy = client;
 
+        if (copy.versions == null)
+        {
+            copy.versions = new byte[100][];
+            copy.versionindex = -1;
+        }
+        
         SetupUI2(callee.GetEditor());
     }
 
@@ -327,6 +339,12 @@
         copy = localCopy;
         copy.editWindow = this;
 
+        if (copy.versions == null)
+        {
+            copy.versions = new byte[100][];
+            copy.versionindex = -1;
+        }
+        
         SetupMenu();
 
         //SetupName(objEditor); // new
@@ -815,6 +833,28 @@
                 }
             frame.validate();
         }
+
+    private byte[] CompressCopy()
+    {
+        boolean temp = CameraPane.SWITCH;
+        CameraPane.SWITCH = false;
+        
+        copy.ExtractBigData(versiontable);
+        // if (copy == client)
+        
+        byte[] versions[] = copy.versions;
+        copy.versions = null;
+        
+        byte[] compress = Compress(copy);
+        
+        copy.versions = versions;
+        
+        copy.RestoreBigData(versiontable);
+        
+        CameraPane.SWITCH = temp;
+        
+        return compress;
+    }
 
     private JTextPane createTextPane()
     {
@@ -3574,11 +3614,11 @@
         return null;
     }
     
-    java.util.Hashtable<java.util.UUID, Object3D> hashtable = new java.util.Hashtable<java.util.UUID, Object3D>();
     
     public void Save()
     {
-        Save(true);
+        //Save(true);
+        Replace();
     }
     
     private boolean Equal(byte[] compress, byte[] name)
@@ -3597,25 +3637,20 @@
         return true;
     }
 
+    java.util.Hashtable<java.util.UUID, Object3D> versiontable = new java.util.Hashtable<java.util.UUID, Object3D>();
+    
     public boolean Save(boolean user)
     {
         System.err.println("Save");
         
         cRadio tab = GetCurrentTab();
         
-        boolean temp = CameraPane.SWITCH;
-        CameraPane.SWITCH = false;
-        
-        copy.ExtractBigData(hashtable);
-        
-        byte[] compress = Compress(copy);
-
-        CameraPane.SWITCH = temp;
+        byte[] compress = CompressCopy();
         
         boolean thesame = false;
         
         // Quick heuristic using length. Works only when stream is compressed.
-        if (tab.undoindex > 0 && tab.graphs[tab.undoindex-1] != null && Equal(compress, tab.graphs[tab.undoindex-1]))
+        if (copy.versionindex > 0 && copy.versions[copy.versionindex-1] != null && Equal(compress, copy.versions[copy.versionindex-1]))
         {
             thesame = true;
         }
@@ -3623,23 +3658,23 @@
         //EditorFrame.m_MainFrame.requestFocusInWindow();
         if (!thesame)
         {
-            //tab.user[tab.undoindex] = user;
-            boolean increment = tab.graphs[tab.undoindex] == null;
+            //tab.user[tab.versionindex] = user;
+            //boolean increment = true; // tab.graphs[tab.versionindex] == null;
             
-            tab.graphs[tab.undoindex] = compress;
+            copy.versions[++copy.versionindex] = compress;
             
-            if (increment)
-                tab.undoindex++;
+            // if (increment)
+            //     tab.versionindex++;
         }
 
-        copy.RestoreBigData(hashtable);
+        //copy.RestoreBigData(versiontable);
 
         //assert(hashtable.isEmpty());
         
-        for (int i = tab.undoindex; i < tab.graphs.length; i++)
+        for (int i = copy.versionindex+1; i < copy.versions.length; i++)
         {
             //tab.user[i] = false;
-        //    tab.graphs[i] = null;
+            copy.versions[i] = null;
         }
 
         SetUndoStates();
@@ -3649,7 +3684,7 @@
         {
             try
             {
-                FileOutputStream ostream = new FileOutputStream("save" + tab.undoindex);
+                FileOutputStream ostream = new FileOutputStream("save" + copy.versionindex);
                 ObjectOutputStream p = new ObjectOutputStream(ostream);
 
                 p.writeObject(copy);
@@ -3673,7 +3708,7 @@
         boolean temp = CameraPane.SWITCH;
         CameraPane.SWITCH = false;
         
-        copy.ExtractBigData(hashtable);
+        copy.ExtractBigData(versiontable);
         
         copy.clear();
         
@@ -3682,7 +3717,7 @@
             copy.add(obj.get(i));
         }
         
-        copy.RestoreBigData(hashtable);
+        copy.RestoreBigData(versiontable);
         
         CameraPane.SWITCH = temp;
         
@@ -3710,64 +3745,129 @@
     }
     
     cButton undoButton;
+    cButton restoreButton;
+    cButton replaceButton;
     cButton redoButton;
         
+    boolean muteSlider;
+    
+    int VersionCount()
+    {
+        int count = 0;
+        
+        for (int i = copy.versions.length; --i >= 0;)
+        {
+            if (copy.versions[i] != null)
+                count++;
+        }
+        
+        return count;
+    }
+    
     void SetUndoStates()
     {
         cRadio tab = GetCurrentTab();
         
-        undoButton.setEnabled(tab.undoindex > 0);
-        redoButton.setEnabled(tab.graphs[tab.undoindex + 1] != null);
+        restoreButton.setEnabled(copy.versionindex != -1);
+        replaceButton.setEnabled(copy.versionindex != -1);
+        
+        undoButton.setEnabled(copy.versionindex > 0);
+        redoButton.setEnabled(copy.versions[copy.versionindex + 1] != null);
+        
+        muteSlider = true;
+        versionSlider.setMaximum(VersionCount() - 1);
+        versionSlider.setInteger(copy.versionindex);
+        muteSlider = false;
     }
     
     public boolean Undo()
     {
+        // Option?
+        Replace();
+        
         System.err.println("Undo");
         
         cRadio tab = GetCurrentTab();
         
-        if (tab.undoindex == 0)
+        if (copy.versionindex == 0)
         {
             java.awt.Toolkit.getDefaultToolkit().beep();
             return false;
         }
 
-        if (tab.graphs[tab.undoindex] == null) // || !tab.user[tab.undoindex])
+//        if (tab.graphs[tab.versionindex] == null) // || !tab.user[tab.versionindex])
+//        {
+//            if (Save(false))
+//                tab.versionindex -= 1;
+//            else
+//            {
+//                if (tab.versionindex <= 0)
+//                    return false;
+//                else
+//                    tab.versionindex -= 1;
+//            }
+//        }
+
+        copy.versionindex -= 1;
+
+        CopyChanged((Object3D)Uncompress(copy.versions[copy.versionindex]));
+        
+        return true;
+    }
+
+    public boolean Restore()
+    {
+        System.err.println("Restore");
+        
+        cRadio tab = GetCurrentTab();
+        
+        if (copy.versionindex == -1 || copy.versions[copy.versionindex] == null)
         {
-            if (Save(false))
-                tab.undoindex -= 1;
-            else
-            {
-                if (tab.undoindex <= 0)
-                    return false;
-                else
-                    tab.undoindex -= 1;
-            }
+            java.awt.Toolkit.getDefaultToolkit().beep();
+            return false;
         }
 
-        tab.undoindex -= 1;
+        CopyChanged((Object3D)Uncompress(copy.versions[copy.versionindex]));
+        
+        return true;
+    }
 
-        CopyChanged((Object3D)Uncompress(tab.graphs[tab.undoindex]));
+    public boolean Replace()
+    {
+        System.err.println("Replace");
+        
+        cRadio tab = GetCurrentTab();
+        
+        if (copy.versionindex == -1 || copy.versions[copy.versionindex] == null)
+        {
+            // No version yet. OK. java.awt.Toolkit.getDefaultToolkit().beep();
+            return false;
+        }
+
+        copy.versions[copy.versionindex] = CompressCopy();
         
         return true;
     }
 
     public void Redo()
     {
+        // Option?
+        Replace();
+        
         cRadio tab = GetCurrentTab();
         
-        if (tab.graphs[tab.undoindex + 1] == null)
+        if (copy.versions[copy.versionindex + 1] == null)
         {
             java.awt.Toolkit.getDefaultToolkit().beep();
             return;
         }
 
-        tab.undoindex += 1;
+        copy.versionindex += 1;
 
-        CopyChanged((Object3D)Uncompress(tab.graphs[tab.undoindex]));
+        CopyChanged((Object3D)Uncompress(copy.versions[copy.versionindex]));
         
-        //if (!tab.user[tab.undoindex])
-        //    tab.graphs[tab.undoindex] = null;
+        //if (!tab.user[tab.versionindex])
+        //    tab.graphs[tab.versionindex] = null;
     }
 
         void ImportGFD()
@@ -4063,9 +4163,25 @@
         //copy.Touch();
     }
 
+    cNumberSlider versionSlider;
+    
     public void stateChanged(ChangeEvent e)
     {
         //    assert(false);
+        if (e.getSource() == versionSlider)
+        {
+            if (muteSlider)
+                return;
+            
+            int version = versionSlider.getInteger();
+            
+            if (copy.versions[version] != null)
+            {
+                CopyChanged((Object3D)Uncompress(copy.versions[copy.versionindex = version]));
+            }
+            
+            return;
+        }
 
         if (freezematerial)
         {
@@ -4414,7 +4530,7 @@
 
     void makeSomething(Object3D thing, boolean resetmodel) // deselect)
     {
-        if (Globals.SAVEONMAKE) // && resetmodel)
+        if (Globals.REPLACEONMAKE) // && resetmodel)
             Save();
         //Tween.set(thing, 0).target(1).start(tweenManager);
         //Tween.to(thing, 0, 0.5f).target(0).start(tweenManager);
@@ -4786,6 +4902,17 @@
                 c.addChild(csg);
             }
 
+            copy.versions = readobj.versions;
+            copy.versionindex = readobj.versionindex;
+            
+        if (copy.versions == null)
+        {
+            copy.versions = new byte[100][];
+            copy.versionindex = -1;
+        }
+        
+            //? SetUndoStates();
+            
             ResetModel();
             copy.HardTouch(); // recompile?
             refreshContents();

--
Gitblit v1.6.2