josuFramework - Configuration
The configuration system in josuFramework provides a robust way to manage, persist, and track changes to application settings. It is built upon the Bindable system, ensuring that changes to configuration are automatically propagated to all interested components.
ConfigManager<TLookup>
ConfigManager<TLookup> is the base class for all configuration managers. It uses an Enum as a lookup key for settings.
Core Features:
Bindable Integration: Each configuration item is backed by a
Bindable<T>.Default Values: Provides a way to define default values and constraints (min/max) for settings.
Persistence: Supports loading and saving settings (implementation-specific).
Type Safety: Uses generics and enums to ensure type-safe access to settings.
Example usage:
public enum MySettings {
Volume,
Username,
Fullscreen
}
public class MyConfigManager extends ConfigManager<MySettings> {
@Override
protected void initialiseDefaults() {
setDefault(MySettings.Volume, 1.0, 0.0, 1.0);
setDefault(MySettings.Username, "Guest");
setDefault(MySettings.Fullscreen, true);
}
}
Accessing Settings
You can retrieve a Bindable for a setting using getBindable(TLookup).
Bindable<Double> volume = config.getBindable(MySettings.Volume);
volume.bindValueChanged(e -> System.out.println("Volume: " + e.getNewValue()));
Alternatively, you can use bindWith(TLookup, Bindable) to bind an existing bindable to a configuration setting.
IniConfigManager
IniConfigManager is a concrete implementation of ConfigManager that stores settings in a plain-text .ini file. It handles serialization and deserialization of common types (String, Integer, Double, Boolean, and Enums).
IniConfigManager<MySettings> config = new IniConfigManager<>("settings.ini");
config.load();
// ...
config.save();
Change Tracking
The configuration system supports tracking changes to settings for purposes such as displaying notifications or logging.
ITrackableConfigManager: Interface for config managers that support tracking.TrackedSettings: A collection of settings being tracked.TrackedSetting<T>: Represents an individual setting being tracked.SettingDescription: Provides a human-readable name and value for a setting.
Example of setting up tracking:
public class MyConfigManager extends ConfigManager<MySettings> implements ITrackableConfigManager {
// ...
@Override
public TrackedSettings createTrackedSettings() {
TrackedSettings settings = new TrackedSettings();
settings.addSetting(new TrackedSetting<>(MySettings.Volume,
v -> new SettingDescription("Volume", String.format("%.0f%%", (Double)v * 100))));
return settings;
}
}
When a setting changes, you can use these descriptions to inform the user.