Author: reinhard Date: 2010-12-02 14:47:47 -0600 (Thu, 02 Dec 2010) New Revision: 10253
Modified: trunk/gnue-forms/ trunk/gnue-forms/src/GFObjects/GFBlock.py trunk/gnue-forms/src/GFObjects/GFEntry.py trunk/gnue-forms/src/GFObjects/GFField.py trunk/gnue-forms/src/GFObjects/GFTabStop.py trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py Log: Much improved behaviour of entries and grids when there is no current record. Property changes on: trunk/gnue-forms ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2010-12-02 19:02:14.151999950 +0100 committer: Reinhard Müller <[email protected]> properties: branch-nick: forms + timestamp: 2010-12-02 21:29:40.832000017 +0100 committer: Reinhard Müller <[email protected]> properties: branch-nick: forms Name: bzr:file-ids - src/GFObjects/GFTabStop.py 3...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFTabStop.py src/uidrivers/qt3/widgets/entry.py 8...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2Fuidrivers%2Fqt3%2Fwidgets%2Fentry.py src/uidrivers/qt4/widgets/entry.py 9...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2Fuidrivers%2Fqt4%2Fwidgets%2Fentry.py src/uidrivers/wx/widgets/entry.py 10...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2Fuidrivers%2Fwx%2Fwidgets%2Fentry.py + src/GFObjects/GFBlock.py 1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFBlock.py src/GFObjects/GFEntry.py 1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFEntry.py src/GFObjects/GFField.py 1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFField.py src/GFObjects/GFTabStop.py 3...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFTabStop.py src/uidrivers/wx/widgets/entry.py 10...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2Fuidrivers%2Fwx%2Fwidgets%2Fentry.py Name: bzr:revision-id:v4 - 3116 [email protected] 3117 [email protected] 3118 [email protected] 3119 [email protected] 3120 [email protected] 3121 [email protected] 3122 [email protected] 3123 [email protected] 3124 [email protected] 3125 [email protected] 3126 [email protected] 3127 [email protected] 3128 [email protected] 3129 [email protected] 3130 [email protected] 3131 [email protected] 3132 [email protected] 3133 [email protected] 3134 [email protected] 3135 [email protected] 3136 [email protected] 3137 [email protected] 3138 [email protected] 3139 [email protected] 3140 [email protected] 3141 [email protected] 3142 [email protected] 3143 [email protected] 3144 [email protected] 3145 [email protected] 3146 [email protected] 3147 [email protected] 3148 [email protected] 3149 [email protected] 3150 [email protected] 3151 [email protected] 3152 [email protected] 3153 [email protected] 3154 [email protected] 3155 [email protected] 3156 [email protected] 3157 [email protected] 3158 [email protected] 3159 [email protected] 3160 [email protected] 3161 [email protected] 3162 [email protected] 3163 [email protected] + 3116 [email protected] 3117 [email protected] 3118 [email protected] 3119 [email protected] 3120 [email protected] 3121 [email protected] 3122 [email protected] 3123 [email protected] 3124 [email protected] 3125 [email protected] 3126 [email protected] 3127 [email protected] 3128 [email protected] 3129 [email protected] 3130 [email protected] 3131 [email protected] 3132 [email protected] 3133 [email protected] 3134 [email protected] 3135 [email protected] 3136 [email protected] 3137 [email protected] 3138 [email protected] 3139 [email protected] 3140 [email protected] 3141 [email protected] 3142 [email protected] 3143 [email protected] 3144 [email protected] 3145 [email protected] 3146 [email protected] 3147 [email protected] 3148 [email protected] 3149 [email protected] 3150 [email protected] 3151 [email protected] 3152 [email protected] 3153 [email protected] 3154 [email protected] 3155 [email protected] 3156 [email protected] 3157 [email protected] 3158 [email protected] 3159 [email protected] 3160 [email protected] 3161 [email protected] 3162 [email protected] 3163 [email protected] 3164 [email protected] Name: bzr:text-parents - src/uidrivers/qt3/widgets/entry.py svn-v3-single1-dHJ1bmsvZ251ZS1mb3Jtcw..:3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:10108 src/uidrivers/qt4/widgets/entry.py svn-v3-single1-dHJ1bmsvZ251ZS1mb3Jtcw..:3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:10108 src/uidrivers/wx/widgets/entry.py [email protected] + src/GFObjects/GFBlock.py [email protected] src/GFObjects/GFEntry.py [email protected] src/GFObjects/GFField.py [email protected] Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py =================================================================== --- trunk/gnue-forms/src/GFObjects/GFBlock.py 2010-12-02 20:47:44 UTC (rev 10252) +++ trunk/gnue-forms/src/GFObjects/GFBlock.py 2010-12-02 20:47:47 UTC (rev 10253) @@ -943,9 +943,6 @@ current record. """ - if self._dataSourceLink.type == 'unbound': - return None - if self.mode == 'query': return None @@ -1531,21 +1528,20 @@ newRecord = 0 newRecordCount = 1 elif self.__resultset is None: - newRecord = 0 + newRecord = -1 newRecordCount = 0 else: newRecord = self.__resultset.getRecordNumber() newRecordCount = self.__resultset.getRecordCount() - adjustment = newRecord - self._currentRecord - if new_visible_start is None: new_visible_start = self.__visible_start new_visible_start = max(new_visible_start, newRecord - self._rows + 1) new_visible_start = max(new_visible_start, 0) new_visible_start = min(new_visible_start, newRecord) - adjustment += self.__visible_start - new_visible_start + scroll = new_visible_start - self.__visible_start + self.__visible_start = new_visible_start # Find out which ui entries to refresh @@ -1566,7 +1562,7 @@ # also contains the entries that are bound to us via grid_link. for field in self._fieldMap.itervalues(): for entry in field._entryList: - entry.recalculate_visible(adjustment, self._currentRecord, + entry.recalculate_visible(scroll, self._currentRecord, self.__record_count, refresh) self.__adjust_scrollbars() Modified: trunk/gnue-forms/src/GFObjects/GFEntry.py =================================================================== --- trunk/gnue-forms/src/GFObjects/GFEntry.py 2010-12-02 20:47:44 UTC (rev 10252) +++ trunk/gnue-forms/src/GFObjects/GFEntry.py 2010-12-02 20:47:47 UTC (rev 10253) @@ -118,18 +118,22 @@ if self.style == 'label': if not GFTabStop._is_enabled_(self, index): return False + + if self.visible_offset is None: + # No record displayed at all + return False + + # Consider empty labels disabled. This makes a difference for + # the enclosing boxes. + if index is None: + record_number = None else: - # Consider empty labels disabled. This makes a difference for - # the enclosing boxes. - if index is None: - record_number = None - else: - record_number = self.visible_offset + index - return (self._field.get_value(record_number) is not None) - else: - return GFFieldBound._is_enabled_(self, index) + record_number = self.visible_offset + index + return (self._field.get_value(record_number) is not None) + return GFFieldBound._is_enabled_(self, index) + # ------------------------------------------------------------------------- # Refresh the user interface with the current field data # ------------------------------------------------------------------------- Modified: trunk/gnue-forms/src/GFObjects/GFField.py =================================================================== --- trunk/gnue-forms/src/GFObjects/GFField.py 2010-12-02 20:47:44 UTC (rev 10252) +++ trunk/gnue-forms/src/GFObjects/GFField.py 2010-12-02 20:47:47 UTC (rev 10253) @@ -297,9 +297,12 @@ if self.editable == 'N': return False - new = (self._block.get_record_status(record_number) \ - in ['empty', 'inserted', 'void']) + status = self._block.get_record_status(record_number) + if status is None: + return False + new = status in ['empty', 'inserted', 'void'] + if self._block.editable == 'new' and not new: return False if self.editable == 'new' and not new: Modified: trunk/gnue-forms/src/GFObjects/GFTabStop.py =================================================================== --- trunk/gnue-forms/src/GFObjects/GFTabStop.py 2010-12-02 20:47:44 UTC (rev 10252) +++ trunk/gnue-forms/src/GFObjects/GFTabStop.py 2010-12-02 20:47:47 UTC (rev 10253) @@ -77,10 +77,9 @@ self._rows = 1 self._gap = 0 - self.__visible_offset = 0 + self.__visible_offset = None self.__visible_index = 0 - self.__last_enabled_row = None - self.__current_row_enabled = True + self.__enabled_rows = None # ------------------------------------------------------------------------- @@ -114,7 +113,7 @@ if self._block: self._block._entryList.append(self) - self.__last_enabled_row = self._rows - 1 + self.__enabled_rows = self._rows # ------------------------------------------------------------------------- @@ -143,9 +142,14 @@ and index == self.__visible_index: return - self._form._event_focus_changed(self, - self.__visible_offset + index) + if self.__visible_offset is None: + # Click on a button which is bound to a block. + record_number = None + else: + record_number = self.__visible_offset + index + self._form._event_focus_changed(self, record_number) + # ------------------------------------------------------------------------- def _event_line_up(self): @@ -244,6 +248,8 @@ If this entry is part of a grid, this property contains the record number of the record visible in the first line. This is equal to the number of records which have scrolled out through the top of the grid. + If the grid is completely empty because the current block has no + records, this property contains None. If this entry is not part of a grid, this property simply contains the record number currently visible in the entry, or None if no record is @@ -261,7 +267,8 @@ current record is not visible in the grid (for example, because there is no current record set), this property holds None. - If this entry is not part of a grid, this property always contains 0. + If this entry is not part of a grid, this property always contains if + there is a current record, and None if there is no current record. """ return self.__visible_index @@ -269,7 +276,7 @@ # Recalculate the visible index of an object # ------------------------------------------------------------------------- - def recalculate_visible(self, adjustment, cur_record, rec_count, refresh): + def recalculate_visible(self, scroll, cur_record, rec_count, refresh): """ Process a record pointer movement or a result set change for this entry. @@ -279,7 +286,7 @@ 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 scroll: How much records to scroll. @param cur_record: the currently active record, or -1 if there is no record active currently. @param rec_count: the number of records available at all @@ -296,66 +303,67 @@ if self._form.get_focus_object() is self: self.ui_focus_out() + try: old_visible_index = self.__visible_index - index = min(max(self.__visible_index + adjustment, 0), - int(self._rows)-1) + if cur_record == -1 and self._rows == 1: + # Single entry (no grid), no current record: no record + # displayed. + new_visible_offset = None + else: + # Display records, if the entry is in a grid even if there is + # no current record. + if self.__visible_offset is not None: + new_visible_offset = self.__visible_offset + scroll + else: + new_visible_offset = 0 - # Don't let the index pass the number of records - lowestVisible = max(cur_record - index, 0) - if lowestVisible + index > rec_count: - index = index -1 + new_visible_offset = min(new_visible_offset, rec_count - self._rows) + new_visible_offset = max(new_visible_offset, 0) + if cur_record != -1: + new_visible_offset = max(new_visible_offset, cur_record - self._rows + 1) + new_visible_offset = min(new_visible_offset, cur_record) - # If the current record has rolled around from the top to the - # bottom then reset the counter. - if cur_record == 0: - index = 0 + if new_visible_offset != self.__visible_offset: + # If we have scrolled, redisplay all records + refresh = 'all' - self.__visible_index = index + self.__visible_offset = new_visible_offset + if cur_record == -1: + self.__visible_index = None + else: + self.__visible_index = cur_record - self.__visible_offset + if self.uiWidget is not None: - if self.__last_enabled_row is None: + if self.__enabled_rows is None: # if running for the first time, all rows are enabled # because widgets are created enabled by default - self.__last_enabled_row = self._rows - 1 + self.__enabled_rows = self._rows - # Re-enable old current row if it was disabled - if not self.__current_row_enabled: - self.uiWidget._ui_set_enabled_(old_visible_index, True) - self.__current_row_enabled = True + if self.__visible_offset is None: + enabled_rows = 0 + else: + enabled_rows = rec_count - self.__visible_offset + enabled_rows = min(enabled_rows, self._rows) - last_enabled_row = self.__visible_index + \ - (rec_count - cur_record) - 1 - last_enabled_row = min(last_enabled_row, self._rows - 1) - # Disable rows if necessary - for i in range(last_enabled_row+1, self.__last_enabled_row+1): + for i in range(enabled_rows, self.__enabled_rows): self.uiWidget._ui_set_enabled_(i, False) # Enable rows if necessary - for i in range(self.__last_enabled_row+1, last_enabled_row+1): - self.uiWidget._ui_set_enabled_(i, False) + for i in range(self.__enabled_rows, enabled_rows): + self.uiWidget._ui_set_enabled_(i, True) - self.__last_enabled_row = last_enabled_row + self.__enabled_rows = enabled_rows - # Disable current row if current record is -1 - if cur_record == -1: - self.uiWidget._ui_set_enabled_(self.__visible_index, False) - self.__current_row_enabled = False - - first_visible_record = cur_record - self.__visible_index - if first_visible_record != self.__visible_offset: - # If we have scrolled, redisplay all records + if refresh == 'all': refresh_start = 0 - self.__visible_offset = first_visible_record + elif refresh == 'current': + refresh_start = max(old_visible_index, self.__visible_index) else: - if refresh == 'all': - refresh_start = 0 - elif refresh == 'current': - refresh_start = max(old_visible_index, self.__visible_index) - else: - refresh_start = None + refresh_start = None if isinstance(self, GFFieldBound) and refresh_start is not None: self.refresh_ui(refresh_start, self._rows - 1) @@ -395,7 +403,7 @@ def __update_status(self, refresh_start): if self.uiWidget is not None: - for index in range(refresh_start, self.__last_enabled_row + 1): + for index in range(refresh_start, self.__enabled_rows): self.uiWidget._ui_set_enabled_(index, self._is_enabled_(index)) self.getParent().update_status() @@ -570,10 +578,7 @@ record. """ - if self.__current_row_enabled: - self.uiWidget._ui_set_current_row_(self.__visible_index) - else: - self.uiWidget._ui_set_current_row_(-1) + self.uiWidget._ui_set_current_row_(self.__visible_index) # ============================================================================= @@ -627,19 +632,23 @@ if not GFTabStop._is_enabled_(self, index): return False + + if self.visible_offset is None: + # No record displayed + return False + + if index is None: + record_number = None else: - if index is None: - record_number = None - else: - record_number = self.visible_offset + index - return self._field.is_editable(record_number) + record_number = self.visible_offset + index + return self._field.is_editable(record_number) # ------------------------------------------------------------------------- # UI events (called from UIEntry) # ------------------------------------------------------------------------- - def _event_jump_records(self, index): + def _event_goto_record(self, index): """ Move the database cursor as a result of the user clicking on a part of the grid which can't receive the focus. @@ -725,7 +734,8 @@ def refresh_ui_current(self): - self.refresh_ui(self.visible_index, self.visible_index) + if self.visible_index is not None: + self.refresh_ui(self.visible_index, self.visible_index) # ------------------------------------------------------------------------- @@ -748,14 +758,18 @@ for index in range (from_index, to_index + 1): # Do not execute if we were editing - would overwrite unsaved change - if not (index == self.visible_index \ - and self._displayHandler.editing): + if (index == self.visible_index and self._displayHandler.editing): + continue + + if self.visible_offset is not None: try: value = self._field.get_value(self.visible_offset + index) except Exception: # invalid value value = None - display = self._displayHandler.build_display(value, False) - self.uiWidget._ui_set_value_(index, display) + else: + value = None + display = self._displayHandler.build_display(value, False) + self.uiWidget._ui_set_value_(index, display) # ------------------------------------------------------------------------- Modified: trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py =================================================================== --- trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py 2010-12-02 20:47:44 UTC (rev 10252) +++ trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py 2010-12-02 20:47:47 UTC (rev 10253) @@ -696,7 +696,7 @@ widget.GetParent().Refresh() # Needed for Windows # Set new current row to specific color. - if index == -1: + if index is None: self.__current_row = None self.__current_row_color_save = None else: _______________________________________________ commit-gnue mailing list [email protected] http://lists.gnu.org/mailman/listinfo/commit-gnue
