[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/3.5/kdelibs/kate/part
From:       Guillermo Antonio Amaral Bastidas <me () guillermoamaral ! com>
Date:       2007-06-19 0:02:07
Message-ID: 1182211327.385054.13833.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 677351 by gamaral:

Added more elavorate commentary on the inner workings of updateModified()



 M  +70 -29    katedocument.cpp  


--- branches/KDE/3.5/kdelibs/kate/part/katedocument.cpp #677350:677351
@@ -1548,25 +1548,37 @@
 
 void KateDocument::updateModified()
 {
-  // I noticed that there to many variables to take into consideration
-  // with a simple 'if' or two.
-  //
-  // Patterns Detected:
-  //
-  //  pattern=223  1==7:true  1==8:false  2==7:false  2==8:false
-  //  pattern=201  1==7:true  1==8:false  2==7:false  2==8:false
-  //  pattern=195  1==7:true  1==8:false  2==7:false  2==8:true
-  //  pattern=105  1==7:true  1==8:false  2==7:false  2==8:true
-  //  pattern=148  1==7:false 1==8:false  2==7:false  2==8:false
-  //  pattern=156  1==7:false 1==8:false  2==7:false  2==8:false
-  //  pattern=149  1==7:false 1==8:true   2==7:false  2==8:false
+  /*
+  How this works:
 
+    After noticing that there where to many scenarios to take into
+    consideration when using 'if's to toggle the "Modified" flag
+    I came up with this baby, flexible and repetitive calls are
+    minimal.
+
+    A numeric unique pattern is generated by toggleing a set of bits,
+    each bit symbolizes a different state in the Undo Redo structure.
+
+      lastUndoGroupWhenSaved != null       BIT 1
+      lastRedoGroupWhenSaved != null       BIT 2
+      docWasSavedWhenUndoWasEmpty == true  BIT 3
+      docWasSavedWhenRedoWasEmpty == true  BIT 4
+      undoItems.isEmpty() == true          BIT 5
+      redoItems.isEmpty() == true          BIT 6
+      undoItems.last() != null             BIT 7
+      redoItems.last() != null             BIT 8
+
+    Since there is still a change that a pattern might repeat I also
+    created a set of modifies.
+
+      lastUndoGroupWhenSavedIsLastUndo     MOD 1
+      lastUndoGroupWhenSavedIsLastRedo     MOD 2
+      lastRedoGroupWhenSavedIsLastUndo     MOD 3
+      lastRedoGroupWhenSavedIsLastRedo     MOD 4
+  */
+
+  bool doModify = false;
   unsigned char pattern = 0;
-  const bool oneEqualToSeven = (lastUndoGroupWhenSaved == undoItems.last());
-  const bool oneEqualToEight = (lastUndoGroupWhenSaved == redoItems.last());
-  const bool twoEqualToSeven = (lastRedoGroupWhenSaved == undoItems.last());
-  const bool twoEqualToEight = (lastRedoGroupWhenSaved == redoItems.last());
-  bool doModify = false;
 
   if (lastUndoGroupWhenSaved) pattern |= 1;
   if (lastRedoGroupWhenSaved) pattern |= 2;
@@ -1577,33 +1589,62 @@
   if (undoItems.last()) pattern |= 64;
   if (redoItems.last()) pattern |= 128;
 
+  const bool lastUndoGroupWhenSavedIsLastUndo = (lastUndoGroupWhenSaved == \
undoItems.last()); +  const bool lastUndoGroupWhenSavedIsLastRedo = \
(lastUndoGroupWhenSaved == redoItems.last()); +  const bool \
lastRedoGroupWhenSavedIsLastUndo = (lastRedoGroupWhenSaved == undoItems.last()); +  \
const bool lastRedoGroupWhenSavedIsLastRedo = (lastRedoGroupWhenSaved == \
redoItems.last()); +
+  // This will print out the pattern information
+
+  kdDebug(13020) << k_funcinfo
+    << "Pattern:" << static_cast<unsigned int>(pattern)
+    << " MOD 1:" << lastUndoGroupWhenSavedIsLastUndo
+    << " MOD 2:" << lastUndoGroupWhenSavedIsLastRedo
+    << " MOD 3:" << lastRedoGroupWhenSavedIsLastUndo
+    << " MOD 4:" << lastRedoGroupWhenSavedIsLastRedo << endl;
+
+  /*
+      Detected Patterns:
+
+      Pattern:105  MOD 1:true  MOD 2:false  MOD 3:false  MOD 4:true
+      Pattern:148  MOD 1:false MOD 2:false  MOD 3:false  MOD 4:false
+      Pattern:149  MOD 1:false MOD 2:true   MOD 3:false  MOD 4:false
+      Pattern:159  MOD 1:false MOD 2:true   MOD 3:false  MOD 4:false
+      Pattern:156  MOD 1:false MOD 2:false  MOD 3:false  MOD 4:false
+      Pattern:195  MOD 1:true  MOD 2:false  MOD 3:false  MOD 4:true
+      Pattern:201  MOD 1:true  MOD 2:false  MOD 3:false  MOD 4:false
+      Pattern:223  MOD 1:true  MOD 2:false  MOD 3:false  MOD 4:false
+
+  */
+
   switch (pattern)
   {
-    case 223: case 201:
-        doModify = (oneEqualToSeven);
+    // No MODS are true
+    case 148: case 156:
+        doModify = true;
       break;
 
-    case 195: case 105:
-        doModify = (oneEqualToSeven && twoEqualToEight);
+    // Only MOD 1 is true
+    case 201: case 223:
+        doModify = (lastUndoGroupWhenSavedIsLastUndo);
       break;
 
-    case 148: case 156:
-        doModify = true;
+    // Only MOD 2 is true
+    case 149: case 151:
+        doModify = (lastUndoGroupWhenSavedIsLastRedo);
       break;
 
-    case 149: case 151:
-        doModify = (oneEqualToEight);
+    // MOD 1 and MOD 4 are true
+    case 105: case 195:
+        doModify = (lastUndoGroupWhenSavedIsLastUndo && \
lastRedoGroupWhenSavedIsLastRedo);  break;
-  }  
+  }
 
   if (doModify)
   {
     setModified( false );
     kdDebug(13020) << k_funcinfo << "setting modified to false!" << endl;
   };
-
-  kdDebug(13020) << k_funcinfo << "pattern=" << static_cast<unsigned int>(pattern) \
                << " 1==7:" << oneEqualToSeven 
-  << " 1==8:" << oneEqualToEight << " 2==7:" << twoEqualToSeven << " 2==8:" << \
twoEqualToEight << endl;  }
 
 void KateDocument::clearUndo()


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic