Offline areas download an extra ring of tiles at each zoom level

This commit is contained in:
stopflock
2025-08-11 01:35:11 -05:00
parent f5a831ab12
commit fa3b8b3456
3 changed files with 43 additions and 10 deletions
+3
View File
@@ -23,3 +23,6 @@ const int kTileFetchSecondDelayMs = 15000;
const int kTileFetchJitter2Ms = 4000;
const int kTileFetchThirdDelayMs = 60000;
const int kTileFetchJitter3Ms = 5000;
// User download max zoom span (user can download up to kMaxUserDownloadZoomSpan zooms above min)
const int kMaxUserDownloadZoomSpan = 7;
+30 -4
View File
@@ -146,7 +146,32 @@ class _DownloadAreaDialogState extends State<DownloadAreaDialog> {
Widget build(BuildContext context) {
final bounds = widget.controller.camera.visibleBounds;
final maxZoom = _zoom.toInt();
double sliderMin;
double sliderMax;
int sliderDivisions;
double sliderValue;
// Generate slider min/max/divisions with clarity
if (_minZoom != null) {
sliderMin = _minZoom!.toDouble();
} else {
sliderMin = 12.0; //fallback
}
if (_minZoom != null) {
final candidateMax = _minZoom! + kMaxUserDownloadZoomSpan;
sliderMax = candidateMax > 19 ? 19.0 : candidateMax.toDouble();
} else {
sliderMax = 19.0; //fallback
}
if (_minZoom != null) {
final candidateMax = _minZoom! + kMaxUserDownloadZoomSpan;
int diff = (candidateMax > 19 ? 19 : candidateMax) - _minZoom!;
sliderDivisions = diff > 0 ? diff : 1;
} else {
sliderDivisions = 7; //fallback
}
sliderValue = _zoom.clamp(sliderMin, sliderMax);
// We recompute estimates when the zoom slider changes
return AlertDialog(
title: Row(
children: const [
@@ -167,12 +192,13 @@ class _DownloadAreaDialogState extends State<DownloadAreaDialog> {
Text('Z${_zoom.toStringAsFixed(0)}'),
],
),
Slider(
min: 12,
max: 19,
divisions: 7,
min: sliderMin,
max: sliderMax,
divisions: sliderDivisions,
label: 'Z${_zoom.toStringAsFixed(0)}',
value: _zoom,
value: sliderValue,
onChanged: (v) {
setState(() => _zoom = v);
WidgetsBinding.instance.addPostFrameCallback((_) => _recomputeEstimates());
@@ -22,12 +22,16 @@ Set<List<int>> computeTileList(LatLngBounds bounds, int zMin, int zMax) {
}
for (int z = zMin; z <= zMax; z++) {
final n = pow(2, z).toInt();
final minTile = latLonToTile(latMin, lonMin, z);
final maxTile = latLonToTile(latMax, lonMax, z);
final minX = min(minTile[0], maxTile[0]);
final maxX = max(minTile[0], maxTile[0]);
final minY = min(minTile[1], maxTile[1]);
final maxY = max(minTile[1], maxTile[1]);
final minTileRaw = latLonToTileRaw(latMin, lonMin, z);
final maxTileRaw = latLonToTileRaw(latMax, lonMax, z);
int minX = min(minTileRaw[0].floor(), maxTileRaw[0].floor()) - 1;
int maxX = max(minTileRaw[0].ceil() - 1, maxTileRaw[0].ceil() - 1) + 1;
int minY = min(minTileRaw[1].floor(), maxTileRaw[1].floor()) - 1;
int maxY = max(minTileRaw[1].ceil() - 1, maxTileRaw[1].ceil() - 1) + 1;
minX = minX.clamp(0, n - 1);
maxX = maxX.clamp(0, n - 1);
minY = minY.clamp(0, n - 1);
maxY = maxY.clamp(0, n - 1);
for (int x = minX; x <= maxX; x++) {
for (int y = minY; y <= maxY; y++) {
tiles.add([z, x, y]);