@@ -11,6 +11,9 @@ import 'selection_model.dart';
11
11
12
12
typedef bool IsIndeterminate (var entity);
13
13
14
+ /// Count getter to return when there is no valid count
15
+ final CountGetter _noCountGetter = () => - 1 ;
16
+
14
17
/// Selection model interface that is meant to be used with the table view
15
18
/// component.
16
19
abstract class BaseTableSelectionModel <T > implements SelectionModel <T > {
@@ -88,6 +91,13 @@ abstract class TableSelectionModel<T> extends BaseTableSelectionModel<T>
88
91
@override
89
92
SelectableGetter <T > getSelectable;
90
93
94
+ /// Whether or not the concept of "all entities" is applicable to this model
95
+ /// or not.
96
+ ///
97
+ /// Useful for cases such as an unknown number of entities in the model
98
+ /// due to expansion.
99
+ bool supportsSelectAll;
100
+
91
101
/// If the table supports selection over multiple pages.
92
102
bool supportsMultiplePageSelection;
93
103
@@ -118,7 +128,7 @@ class _SingleTableSelectionModelImpl<T> extends Observable<ChangeRecord>
118
128
119
129
bool deselectOnRemove;
120
130
121
- CountGetter _totalEntitiesCount = () => - 1 ;
131
+ CountGetter _totalEntitiesCount = _noCountGetter ;
122
132
123
133
@override
124
134
CountGetter get totalEntitiesCount => _totalEntitiesCount;
@@ -137,7 +147,7 @@ class _SingleTableSelectionModelImpl<T> extends Observable<ChangeRecord>
137
147
_totalEntitiesCountController.stream;
138
148
139
149
@override
140
- CountGetter entitiesOnPageCount = () => - 1 ;
150
+ CountGetter entitiesOnPageCount = _noCountGetter ;
141
151
142
152
@override
143
153
IsIndeterminate isIndeterminate;
@@ -220,10 +230,11 @@ class _TableSelectionModelImpl<T> extends Observable<ChangeRecord>
220
230
221
231
bool _allSelected = false ;
222
232
223
- CountGetter _totalEntitiesCount = () => - 1 ;
233
+ CountGetter _totalEntitiesCount = _noCountGetter ;
224
234
225
235
@override
226
- CountGetter get totalEntitiesCount => _totalEntitiesCount;
236
+ CountGetter get totalEntitiesCount =>
237
+ supportsSelectAll ? _totalEntitiesCount : _noCountGetter;
227
238
228
239
@override
229
240
set totalEntitiesCount (CountGetter value) {
@@ -239,14 +250,17 @@ class _TableSelectionModelImpl<T> extends Observable<ChangeRecord>
239
250
_totalEntitiesCountController.stream;
240
251
241
252
@override
242
- CountGetter entitiesOnPageCount = () => - 1 ;
253
+ CountGetter entitiesOnPageCount = _noCountGetter ;
243
254
244
255
@override
245
256
bool supportsMultiplePageSelection = true ;
246
257
247
258
@override
248
259
SelectableGetter <T > getSelectable;
249
260
261
+ @override
262
+ bool supportsSelectAll = true ;
263
+
250
264
/// Returns number of items selected in the model.
251
265
int get _selectedCount => _backingModel.selectedValues.length;
252
266
@@ -261,13 +275,14 @@ class _TableSelectionModelImpl<T> extends Observable<ChangeRecord>
261
275
// allOnPageSelected and allAcrossPagesSelected, but it turns out to be
262
276
// ambiguous and does more bad than good.
263
277
bool get allAcrossPagesSelected =>
264
- _allSelected ||
265
- (_selectedCount > 0 && totalEntitiesCount () == _selectedCount);
278
+ supportsSelectAll &&
279
+ (_allSelected ||
280
+ (_selectedCount > 0 && totalEntitiesCount () == _selectedCount));
266
281
267
282
@override
268
283
void selectAllAcrossPages () {
269
284
if (_allSelected) return ;
270
- assert (supportsMultiplePageSelection);
285
+ assert (supportsSelectAll && supportsMultiplePageSelection);
271
286
bool wasEmpty = isEmpty;
272
287
_allSelected = true ;
273
288
if (wasEmpty) {
@@ -347,7 +362,9 @@ class _TableSelectionModelImpl<T> extends Observable<ChangeRecord>
347
362
348
363
@override
349
364
bool get isPageSelected =>
350
- selectedCount > 0 && selectedCount == entitiesOnPageCount ();
365
+ supportsSelectAll &&
366
+ selectedCount > 0 &&
367
+ selectedCount == entitiesOnPageCount ();
351
368
352
369
@override
353
370
void onRemove (T entity) {
0 commit comments