commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r8759 - trunk/gnue-forms/src/GFObjects


From: reinhard
Subject: [gnue] r8759 - trunk/gnue-forms/src/GFObjects
Date: Wed, 11 Oct 2006 17:43:22 -0500 (CDT)

Author: reinhard
Date: 2006-10-11 17:43:22 -0500 (Wed, 11 Oct 2006)
New Revision: 8759

Modified:
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFEntry.py
   trunk/gnue-forms/src/GFObjects/GFTabStop.py
Log:
Be ultra smart about which UI entries to refresh.


Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2006-10-11 17:19:26 UTC (rev 
8758)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2006-10-11 22:43:22 UTC (rev 
8759)
@@ -94,6 +94,9 @@
     # Are we scrolling the visible portion along with record movement?
     self.__scrolling = False
 
+    # Has the result set changed since the last refresh?
+    self.__has_resultset_changed = False
+
     # Trigger exposure
     self._validTriggers = {
       'ON-NEWRECORD':   'On-NewRecord',
@@ -266,6 +269,8 @@
 
     self._resultSet = event.resultSet
 
+    self.__has_resultset_changed = True
+
     # FIXME: during commit, master datasources navigate the current record
     # through the dirty record list and cause the detail blocks to follow
     # through this event. However, in that case, we wouldn't want the UI to
@@ -273,7 +278,7 @@
     recno = self._resultSet.getRecordNumber ()
     if recno == -1:
       if not self._resultSet.firstRecord ():
-        self.new_record()
+        self._resultSet.insertRecord(self._lastValues)
     else:
       self.__switch_record (recno - self._currentRecord)
 
@@ -848,6 +853,7 @@
         self.mode = 'query'
         self.__query_values = {}
         self.__query_values.update(self._queryDefaults)
+        self.__has_resultset_changed = True
         self.__switch_record(0)
 
   # ---------------------------------------------------------------------------
@@ -856,6 +862,7 @@
 
         self.__query_values = {}
         self.__query_values.update(self.__last_query_values)
+        self.__has_resultset_changed = True
         self.__switch_record(0)
 
   # ---------------------------------------------------------------------------
@@ -863,6 +870,7 @@
   def cancel_query(self):
 
         self.mode = 'normal'
+        self.__has_resultset_changed = True
         self.__switch_record(0)
 
   # ---------------------------------------------------------------------------
@@ -959,12 +967,14 @@
         if self._getMasterBlock() is None:
             self._dataSourceLink.requeryAll(commit)
 
-        # Our recordCount might have changed if records were deleted
+        self.__has_resultset_changed = True
+
+        # If the last record was deleted, insert a new one
         if not self._resultSet.getRecordCount():
-            self.new_record()
+            self._resultSet.insertRecord(self._lastValues)
+        else:
+            self.__switch_record(0)
 
-        self.__switch_record(0)
-
   # ---------------------------------------------------------------------------
 
   def clear(self):
@@ -1135,12 +1145,24 @@
     self.__visibleStart = max (self.__visibleStart, newRecord - self._rows + 1)
     self.__visibleStart = max (self.__visibleStart, 0)
 
+    # Find out which ui entries to refresh
+    if self.__has_resultset_changed:
+        # Result set completely changed, refresh everything
+        refresh = 'all'
+        self.__has_resultset_changed = False
+    elif newRecordCount != self._recordCount:
+        # Newly inserted or deleted record, so all records starting from this
+        # one have moved, so refresh them
+        refresh = 'current'
+    else:
+        refresh = 'none'
+
     self._currentRecord = newRecord
     self._recordCount   = newRecordCount
 
     for entry in self._entryList:
         entry.recalculate_visible (adjustment, self._currentRecord,
-                self._recordCount)
+                self._recordCount, refresh)
 
     for field in self._fieldList:
       field._event_new_current_record ()

Modified: trunk/gnue-forms/src/GFObjects/GFEntry.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFEntry.py   2006-10-11 17:19:26 UTC (rev 
8758)
+++ trunk/gnue-forms/src/GFObjects/GFEntry.py   2006-10-11 22:43:22 UTC (rev 
8759)
@@ -205,3 +205,5 @@
     def endEdit(self):
 
         self._displayHandler.endEdit()
+
+        self.refresh_ui_current()

Modified: trunk/gnue-forms/src/GFObjects/GFTabStop.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFTabStop.py 2006-10-11 17:19:26 UTC (rev 
8758)
+++ trunk/gnue-forms/src/GFObjects/GFTabStop.py 2006-10-11 22:43:22 UTC (rev 
8759)
@@ -137,22 +137,32 @@
     # Recalculate the visible index of an object
     # -------------------------------------------------------------------------
 
-    def recalculate_visible(self, adjustment, cur_record, rec_count):
+    def recalculate_visible(self, adjustment, cur_record, rec_count, refresh):
         """
-        Recalculate the visible index of an object. This determines that real 
UI
-        widget of a 'row-based grid' which should be visible.
+        Process a record pointer movement or a result set change for this
+        entry.
 
+        This function sets the C{_visibleIndex} property of this entry. It also
+        takes care of disabling rows of this entry that are outside the actual
+        number of available records, and it redisplays the contents of the
+        entry as needed.
+
         @param adjustment: value to change the visible index, e.g. 1 or -1
         @param cur_record: the currently active record
         @param rec_count: the number of records available at all
-
-        As a result of this recalculation the property self._visibleIndex will
-        be set to the new value.
+        @param refresh: 'none' if no records have to be redisplayed (i.e. only
+            the cursor position has changed), 'current' if all records starting
+            with the current record have to be redisplayed (i.e. a new record
+            has been inserted), or 'all' if all records have to be redisplayed
+            (i.e. the complete resultset has changed); if the records scroll
+            within this entry, everything is redisplayed anyway
         """
 
         if self.hidden:
             return
 
+        old_visible_index = self._visibleIndex
+
         index = min(max(self._visibleIndex + adjustment, 0),
                     int(self._rows)-1)
 
@@ -183,16 +193,23 @@
 
             self.__last_enabled_row = last_enabled_row
 
-            # If we have scrolled, redisplay all records
             first_visible_record = cur_record - self._visibleIndex
-            # FIXME
-            # if first_visible_record != self.__first_visible_record:
-            if True:
-                if isinstance(self, GFFieldBound):
-                    self.refresh_ui(0, self._rows - 1)
+            if first_visible_record != self.__first_visible_record:
+                # If we have scrolled, redisplay all records
+                refresh_start = 0
                 self.__first_visible_record = first_visible_record
+            else:
+                if refresh == 'all':
+                    refresh_start = 0
+                elif refresh == 'current':
+                    refresh_start = max(old_visible_index, self._visibleIndex)
+                else:
+                    refresh_start = None
 
+            if isinstance(self, GFFieldBound) and refresh_start is not None:
+                self.refresh_ui(refresh_start, self._rows - 1)
 
+
 # =============================================================================
 # Base class for all widgets bound to a field
 # =============================================================================





reply via email to

[Prev in Thread] Current Thread [Next in Thread]