editors/TextViewer.py
branchwxPython4
changeset 3688 c2992796a859
parent 3429 67a4d207bace
parent 3682 c613afdab571
child 3750 f62625418bff
--- a/editors/TextViewer.py	Sun Nov 20 18:36:13 2022 +0100
+++ b/editors/TextViewer.py	Wed Nov 23 14:18:25 2022 +0100
@@ -130,8 +130,7 @@
         self.Editor.SetUseTabs(0)
 
         self.Editor.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT |
-                                    wx.stc.STC_MOD_BEFOREDELETE |
-                                    wx.stc.STC_PERFORMED_USER)
+                                    wx.stc.STC_MOD_BEFOREDELETE)
 
         self.Bind(wx.stc.EVT_STC_STYLENEEDED, self.OnStyleNeeded, self.Editor)
         self.Editor.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
@@ -221,25 +220,24 @@
         self.SearchResults = None
         self.CurrentFindHighlight = None
 
+    Buffering = "Off"
     def OnModification(self, event):
         if not self.DisableEvents:
             mod_type = event.GetModificationType()
             if mod_type & wx.stc.STC_MOD_BEFOREINSERT:
                 if self.CurrentAction is None:
-                    self.StartBuffering()
+                    self.Buffering = "ShouldStart"
                 elif self.CurrentAction[0] != "Add" or self.CurrentAction[1] != event.GetPosition() - 1:
-                    self.Controler.EndBuffering()
-                    self.StartBuffering()
+                    self.Buffering = "ShouldRestart"
                 self.CurrentAction = ("Add", event.GetPosition())
-                wx.CallAfter(self.RefreshModel)
+                self.RefreshModelAfter()
             elif mod_type & wx.stc.STC_MOD_BEFOREDELETE:
                 if self.CurrentAction is None:
-                    self.StartBuffering()
+                    self.Buffering = "ShouldStart"
                 elif self.CurrentAction[0] != "Delete" or self.CurrentAction[1] != event.GetPosition() + 1:
-                    self.Controler.EndBuffering()
-                    self.StartBuffering()
+                    self.Buffering = "ShouldRestart"
                 self.CurrentAction = ("Delete", event.GetPosition())
-                wx.CallAfter(self.RefreshModel)
+                self.RefreshModelAfter()
         event.Skip()
 
     def OnDoDrop(self, event):
@@ -387,7 +385,7 @@
             elif values[3] == self.TagName:
                 self.ResetBuffer()
                 event.SetDragText(values[0])
-                wx.CallAfter(self.RefreshModel)
+                self.RefreshModelAfter()
             else:
                 message = _("Variable don't belong to this POU!")
             if message is not None:
@@ -437,10 +435,14 @@
             self.ParentWindow.RefreshFileMenu()
             self.ParentWindow.RefreshEditMenu()
 
+    def EndBuffering(self):
+        self.Controler.EndBuffering()
+
     def ResetBuffer(self):
         if self.CurrentAction is not None:
-            self.Controler.EndBuffering()
+            self.EndBuffering()
             self.CurrentAction = None
+            self.Buffering == "Off"
 
     def GetBufferState(self):
         if not self.Debug and self.TextSyntax != "ALL":
@@ -840,12 +842,29 @@
                 self.RemoveHighlight(*self.CurrentFindHighlight)
             self.CurrentFindHighlight = None
 
+    pending_model_refresh=False
     def RefreshModel(self):
+        self.pending_model_refresh=False
         self.RefreshJumpList()
         self.Colourise(0, -1)
+
+        if self.Buffering == "ShouldStart":
+            self.StartBuffering()
+            self.Buffering == "On"
+        elif self.Buffering == "ShouldRestart":
+            self.EndBuffering()
+            self.StartBuffering()
+            self.Buffering == "On"
+
         self.Controler.SetEditedElementText(self.TagName, self.GetText())
         self.ResetSearchResults()
 
+    def RefreshModelAfter(self):
+        if self.pending_model_refresh:
+            return
+        self.pending_model_refresh=True
+        wx.CallAfter(self.RefreshModel)
+
     def OnKeyDown(self, event):
         key = event.GetKeyCode()
         if self.Controler is not None: