Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions modules/ensemble/lib/framework/theme/theme_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:ensemble/framework/theme/default_theme.dart';
import 'package:ensemble/framework/theme/theme_manager.dart';
import 'package:ensemble/model/text_scale.dart';
import 'package:ensemble/util/utils.dart';
import 'package:ensemble/widget/image.dart';
import 'package:flutter/material.dart';
import 'package:yaml/yaml.dart';

Expand Down Expand Up @@ -158,6 +159,9 @@ mixin ThemeLoader {
maxFactor: Utils.optionalDouble(
getProp(appOverrides, ['textScale', 'maxFactor']),
min: 0)));

// Configure image cache settings from App.imageCache
_configureImageCache(appOverrides);

// extends ThemeData
return customTheme.copyWith(extensions: [
Expand Down Expand Up @@ -507,6 +511,32 @@ mixin ThemeLoader {
BorderRadius.all(Radius.circular(variant == InputVariant.box ? 8 : 0));
}

/// Configures image cache settings from App.imageCache in theme.yaml.
///
/// Example YAML:
/// ```yaml
/// App:
/// imageCache:
/// stalePeriodMinutes: 10080 # 7 days (default: 15 minutes)
/// maxObjects: 500 # (default: 50)
/// ```
void _configureImageCache(YamlMap? appOverrides) {
final imageCache = appOverrides?['imageCache'];
if (imageCache == null) {
return;
}

final stalePeriodMinutes = Utils.optionalInt(imageCache['stalePeriodMinutes'], min: 1);
final maxObjects = Utils.optionalInt(imageCache['maxObjects'], min: 1);

if (stalePeriodMinutes != null || maxObjects != null) {
ImageCacheConfig().configure(
stalePeriodMinutes: stalePeriodMinutes,
maxObjects: maxObjects,
);
}
}

// add more data to checkbox theme
extension CheckboxThemeDataExtension on CheckboxThemeData {
static int? _size;
Expand Down
81 changes: 76 additions & 5 deletions modules/ensemble/lib/widget/image.dart
Original file line number Diff line number Diff line change
Expand Up @@ -381,15 +381,86 @@ class ImageState extends EWidgetState<EnsembleImage> {
}
return fallbackWidget;
}

}

/// Configuration for image caching behavior.
/// Can be set at app level via theme.yaml:
/// ```yaml
/// App:
/// imageCache:
/// stalePeriodMinutes: 10080 # 7 days
/// maxObjects: 500
/// ```
class ImageCacheConfig {
static final ImageCacheConfig _instance = ImageCacheConfig._internal();

factory ImageCacheConfig() => _instance;

ImageCacheConfig._internal();

// Default values - 15 minutes stale period, 50 objects max
static const int defaultStalePeriodMinutes = 15;
static const int defaultMaxObjects = 50;

int _stalePeriodMinutes = defaultStalePeriodMinutes;
int _maxObjects = defaultMaxObjects;
bool _initialized = false;

/// Gets the configured stale period in minutes
int get stalePeriodMinutes => _stalePeriodMinutes;

/// Gets the configured max number of cached objects
int get maxObjects => _maxObjects;

/// Whether the cache config has been explicitly initialized
bool get isInitialized => _initialized;

/// Configure the image cache settings.
/// Called from theme loader when parsing App.imageCache settings.
void configure({int? stalePeriodMinutes, int? maxObjects}) {
if (stalePeriodMinutes != null && stalePeriodMinutes > 0) {
_stalePeriodMinutes = stalePeriodMinutes;
}
if (maxObjects != null && maxObjects > 0) {
_maxObjects = maxObjects;
}
_initialized = true;

// Reinitialize the cache manager with new settings
EnsembleImageCacheManager._reinitialize();
}

/// Reset to default values (useful for testing)
void reset() {
_stalePeriodMinutes = defaultStalePeriodMinutes;
_maxObjects = defaultMaxObjects;
_initialized = false;
EnsembleImageCacheManager._reinitialize();
}
}

class EnsembleImageCacheManager {
static const key = 'ensembleImageCacheKey';
static CacheManager instance = CacheManager(Config(
key,
stalePeriod: const Duration(minutes: 15),
maxNrOfCacheObjects: 50,
));

static CacheManager _instance = _createCacheManager();

static CacheManager get instance => _instance;

static CacheManager _createCacheManager() {
final config = ImageCacheConfig();
return CacheManager(Config(
key,
stalePeriod: Duration(minutes: config.stalePeriodMinutes),
maxNrOfCacheObjects: config.maxObjects,
));
}

/// Reinitialize the cache manager with current config settings.
/// Called when ImageCacheConfig.configure() is called.
static void _reinitialize() {
_instance = _createCacheManager();
}
}

class PinchToZoom extends StatefulWidget {
Expand Down
Loading