-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Range controller automatically extends to full mode #1163
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,8 +11,7 @@ | |
#include <vector> | ||
|
||
@interface ASAbstractLayoutController () { | ||
std::vector<ASRangeTuningParameters> _tuningParameters; | ||
std::vector<ASRangeTuningParameters> _minimumTuningParameters; | ||
std::vector<std::vector<ASRangeTuningParameters>> _tuningParameters; | ||
CGSize _viewportSize; | ||
} | ||
@end | ||
|
@@ -25,32 +24,32 @@ - (instancetype)init | |
return nil; | ||
} | ||
|
||
_tuningParameters = std::vector<ASRangeTuningParameters>(ASLayoutRangeTypeCount); | ||
_tuningParameters[ASLayoutRangeTypeVisible] = { | ||
_tuningParameters = std::vector<std::vector<ASRangeTuningParameters>> (ASLayoutRangeModeCount, std::vector<ASRangeTuningParameters> (ASLayoutRangeTypeCount)); | ||
|
||
_tuningParameters[ASLayoutRangeModeMinimum][ASLayoutRangeTypeVisible] = { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe it is time to remove the visible type from range parameters? This used to exist because the old range controller implementation had individual range handlers and it helped propagate the pattern, but now we can quite easily assuming that they are zero and make the appropriate call in the range controller. If you see any value to having them be explicit, feel free to keep them. |
||
.leadingBufferScreenfuls = 0, | ||
.trailingBufferScreenfuls = 0 | ||
}; | ||
_tuningParameters[ASLayoutRangeTypeDisplay] = { | ||
.leadingBufferScreenfuls = 1.5, | ||
.trailingBufferScreenfuls = 0.75 | ||
_tuningParameters[ASLayoutRangeModeMinimum][ASLayoutRangeTypeDisplay] = { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I know that pager node has custom values for ranges, and we should probably have it set up appropriate minimum ranges as well. |
||
.leadingBufferScreenfuls = 0.25, | ||
.trailingBufferScreenfuls = 0.25 | ||
}; | ||
_tuningParameters[ASLayoutRangeTypeFetchData] = { | ||
.leadingBufferScreenfuls = 3, | ||
.trailingBufferScreenfuls = 2 | ||
_tuningParameters[ASLayoutRangeModeMinimum][ASLayoutRangeTypeFetchData] = { | ||
.leadingBufferScreenfuls = 1, | ||
.trailingBufferScreenfuls = 1 | ||
}; | ||
|
||
_minimumTuningParameters = std::vector<ASRangeTuningParameters>(ASLayoutRangeTypeCount); | ||
_minimumTuningParameters[ASLayoutRangeTypeVisible] = { | ||
_tuningParameters[ASLayoutRangeModeFull][ASLayoutRangeTypeVisible] = { | ||
.leadingBufferScreenfuls = 0, | ||
.trailingBufferScreenfuls = 0 | ||
}; | ||
_minimumTuningParameters[ASLayoutRangeTypeDisplay] = { | ||
.leadingBufferScreenfuls = 0.25, | ||
.trailingBufferScreenfuls = 0.25 | ||
_tuningParameters[ASLayoutRangeModeFull][ASLayoutRangeTypeDisplay] = { | ||
.leadingBufferScreenfuls = 1.5, | ||
.trailingBufferScreenfuls = 0.75 | ||
}; | ||
_minimumTuningParameters[ASLayoutRangeTypeFetchData] = { | ||
.leadingBufferScreenfuls = 1, | ||
.trailingBufferScreenfuls = 1 | ||
_tuningParameters[ASLayoutRangeModeFull][ASLayoutRangeTypeFetchData] = { | ||
.leadingBufferScreenfuls = 3, | ||
.trailingBufferScreenfuls = 2 | ||
}; | ||
|
||
return self; | ||
|
@@ -60,33 +59,28 @@ - (instancetype)init | |
|
||
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
ASDisplayNodeAssert(rangeType < _tuningParameters.size(), @"Requesting a range that is OOB for the configured tuning parameters"); | ||
return _tuningParameters[rangeType]; | ||
return [self tuningParametersForRangeMode:ASLayoutRangeModeFull rangeType:rangeType]; | ||
} | ||
|
||
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
ASDisplayNodeAssert(rangeType < _tuningParameters.size(), @"Requesting a range that is OOB for the configured tuning parameters"); | ||
ASDisplayNodeAssert(rangeType != ASLayoutRangeTypeVisible, @"Must not set Visible range tuning parameters (always 0, 0)"); | ||
_tuningParameters[rangeType] = tuningParameters; | ||
} | ||
|
||
- (ASRangeTuningParameters)minimumTuningParametersForRangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
ASDisplayNodeAssert(rangeType < _minimumTuningParameters.size(), @"Requesting a range that is OOB for the configured minimum tuning parameters"); | ||
return _minimumTuningParameters[rangeType]; | ||
return [self setTuningParameters:tuningParameters forRangeMode:ASLayoutRangeModeFull rangeType:rangeType]; | ||
} | ||
|
||
- (void)setMinimumTuningParameters:(ASRangeTuningParameters)minimumTuningParameters forRangeType:(ASLayoutRangeType)rangeType | ||
- (ASRangeTuningParameters)tuningParametersForRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
ASDisplayNodeAssert(rangeType < _minimumTuningParameters.size(), @"Requesting a range that is OOB for the configured minimum tuning parameters"); | ||
ASDisplayNodeAssert(rangeType != ASLayoutRangeTypeVisible, @"Must not set Visible range minimum tuning parameters (always 0, 0)"); | ||
_minimumTuningParameters[rangeType] = minimumTuningParameters; | ||
ASDisplayNodeAssert(rangeMode < _tuningParameters.size() && rangeType < _tuningParameters[rangeMode].size(), | ||
@"Requesting a range that is OOB for the configured tuning parameters"); | ||
return _tuningParameters[rangeMode][rangeType]; | ||
} | ||
|
||
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType isFullRange:(BOOL)isFullRange | ||
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
return isFullRange ? [self tuningParametersForRangeType:rangeType] : [self minimumTuningParametersForRangeType:rangeType]; | ||
ASDisplayNodeAssert(rangeMode < _tuningParameters.size() && rangeType < _tuningParameters[rangeMode].size(), | ||
@"Setting a range that is OOB for the configured tuning parameters"); | ||
ASDisplayNodeAssert(rangeType != ASLayoutRangeTypeVisible, | ||
@"Must not set Visible range minimum tuning parameters (always 0, 0)"); | ||
_tuningParameters[rangeMode][rangeType] = tuningParameters; | ||
} | ||
|
||
#pragma mark - Abstract Index Path Range Support | ||
|
@@ -98,7 +92,7 @@ - (BOOL)shouldUpdateForVisibleIndexPaths:(NSArray *)indexPaths rangeType:(ASLayo | |
return NO; | ||
} | ||
|
||
- (NSSet *)indexPathsForScrolling:(ASScrollDirection)scrollDirection rangeType:(ASLayoutRangeType)rangeType shouldUseFullRange:(BOOL)shouldUseFullRange | ||
- (NSSet *)indexPathsForScrolling:(ASScrollDirection)scrollDirection rangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType | ||
{ | ||
ASDisplayNodeAssertNotSupported(); | ||
return nil; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need away to check if a specific node is in the set that displayed? Maybe we can actually pass the displaying nodes object as the object, and any listeners can check for contains object?