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
133 changes: 101 additions & 32 deletions rSlide/ConfigManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,22 @@ public class Config
public Config()
{
ImagePaths = new List<string>();
DisplayDuration = 8.0;
TransitionDurationPercent = 20.0;
DisplayDuration = 2.0;
TransitionDurationPercent = 0.0;
PlaybackMode = "Random";
LastImageIndex = 0;
EnableKenBurns = true;
KenBurnsDuration = 10.0;
KenBurnsMaxZoom = 1.3;
StretchMode = "Uniform";
// Default: all transitions enabled
ActiveTransitions = new List<string> {
"Crossfade", "MorphZoom", "SoftWipe", "ParallaxReveal", "ScaleDissolve",
ActiveTransitions = new List<string>
{
"Crossfade",
"MorphZoom",
"SoftWipe",
"ParallaxReveal",
"ScaleDissolve",
"KenBurns"
};
}
Expand All @@ -32,6 +38,8 @@ public Config()
public bool EnableKenBurns { get; set; }
public double KenBurnsDuration { get; set; }
public double KenBurnsMaxZoom { get; set; }
public string StretchMode { get; set; }

/// <summary>
/// List of active transition/effect names. One transition is picked
/// randomly each time. KenBurns is also listed here as an effect toggle.
Expand All @@ -45,8 +53,13 @@ public static class ConfigManager
private static readonly CultureInfo CI = CultureInfo.InvariantCulture;

// Transition names that appear in the pool
private static readonly string[] AllTransitions = {
"Crossfade", "MorphZoom", "SoftWipe", "ParallaxReveal", "ScaleDissolve"
private static readonly string[] AllTransitions =
{
"Crossfade",
"MorphZoom",
"SoftWipe",
"ParallaxReveal",
"ScaleDissolve"
};

// KenBurns key and its parameter keys
Expand Down Expand Up @@ -85,8 +98,18 @@ private static List<string> BuildConfigLines(Config config, bool isDefault)
lines.Add("[Display]");
lines.Add("; DisplayDuration: seconds each image is shown (1-60)");
lines.Add(string.Format(CI, "DisplayDuration={0:F1}", config.DisplayDuration));
lines.Add("; TransitionDurationPercent: transition length as % of DisplayDuration (0-100)");
lines.Add(string.Format(CI, "TransitionDurationPercent={0:F1}", config.TransitionDurationPercent));
lines.Add(
"; TransitionDurationPercent: transition length as % of DisplayDuration (0-100)"
);
lines.Add(
string.Format(
CI,
"TransitionDurationPercent={0:F1}",
config.TransitionDurationPercent
)
);
lines.Add("; StretchMode: Uniform | UniformToFill | Fill | None");
lines.Add(string.Format(CI, "StretchMode={0}", config.StretchMode));
lines.Add("");

// --- Playback ---
Expand All @@ -113,7 +136,10 @@ private static List<string> BuildConfigLines(Config config, bool isDefault)
lines.Add("; Effects (not transitions -- applied during image display):");
lines.Add("; KenBurns - slow pan & zoom during image display");

var active = new HashSet<string>(config.ActiveTransitions, StringComparer.OrdinalIgnoreCase);
var active = new HashSet<string>(
config.ActiveTransitions,
StringComparer.OrdinalIgnoreCase
);

// Write transition entries
foreach (var t in AllTransitions)
Expand All @@ -135,10 +161,22 @@ private static List<string> BuildConfigLines(Config config, bool isDefault)
lines.Add("; KenBurns parameters (uncomment to change defaults):");
bool durationDefault = Math.Abs(config.KenBurnsDuration - 10.0) < 0.01;
bool zoomDefault = Math.Abs(config.KenBurnsMaxZoom - 1.3) < 0.01;
lines.Add(string.Format(CI, "{0}KenBurnsDuration={1:F1}",
durationDefault ? "; " : "", config.KenBurnsDuration));
lines.Add(string.Format(CI, "{0}KenBurnsMaxZoom={1:F1}",
zoomDefault ? "; " : "", config.KenBurnsMaxZoom));
lines.Add(
string.Format(
CI,
"{0}KenBurnsDuration={1:F1}",
durationDefault ? "; " : "",
config.KenBurnsDuration
)
);
lines.Add(
string.Format(
CI,
"{0}KenBurnsMaxZoom={1:F1}",
zoomDefault ? "; " : "",
config.KenBurnsMaxZoom
)
);
lines.Add("");

// --- Controls ---
Expand Down Expand Up @@ -176,6 +214,9 @@ private static List<string> BuildConfigLines(Config config, bool isDefault)
lines.Add("; Display");
lines.Add("; I Toggle info overlay");
lines.Add("; D Show desktop (minimize other windows)");
lines.Add(
"; T Toggle fill mode (Uniform / UniformToFill / Fill / None)"
);
lines.Add(";");
lines.Add("; Application");
lines.Add("; Escape Exit rSlide");
Expand All @@ -197,23 +238,26 @@ public static Config LoadConfig(string path)
var config = new Config();
config.ActiveTransitions = new List<string>(); // start empty, populate from file
config.EnableKenBurns = false; // default off; set true if KenBurns line is found
if (!File.Exists(path)) return config;
if (!File.Exists(path))
return config;

var lines = File.ReadAllLines(path);
string section = "";

foreach (var line in lines)
{
var t = line.Trim();
if (string.IsNullOrWhiteSpace(t)) continue;
if (string.IsNullOrWhiteSpace(t))
continue;

if (t.StartsWith("[") && t.EndsWith("]"))
{
section = t.Substring(1, t.Length - 2);
continue;
}

if (t.StartsWith(";")) continue;
if (t.StartsWith(";"))
continue;

// --- Paths: bare lines (no = sign) are folder paths ---
if (section == "Paths")
Expand Down Expand Up @@ -242,8 +286,12 @@ public static Config LoadConfig(string path)
config.EnableKenBurns = true;
config.ActiveTransitions.Add(KenBurnsKey);
}
else if (Array.Exists(AllTransitions,
x => x.Equals(name, StringComparison.OrdinalIgnoreCase)))
else if (
Array.Exists(
AllTransitions,
x => x.Equals(name, StringComparison.OrdinalIgnoreCase)
)
)
{
config.ActiveTransitions.Add(name);
}
Expand All @@ -265,25 +313,35 @@ public static Config LoadConfig(string path)
// --- Key=Value sections ---
{
var eq = t.IndexOf('=');
if (eq < 0) continue;
if (eq < 0)
continue;
var key = t.Substring(0, eq).Trim();
var val = t.Substring(eq + 1).Trim();

switch (section)
{
case "Display":
if (key == "DisplayDuration") config.DisplayDuration = PD(val, 8.0);
else if (key == "TransitionDurationPercent") config.TransitionDurationPercent = PD(val, 20.0);
if (key == "DisplayDuration")
config.DisplayDuration = PD(val, 8.0);
else if (key == "TransitionDurationPercent")
config.TransitionDurationPercent = PD(val, 20.0);
else if (key == "StretchMode")
config.StretchMode = val;
break;
case "Playback":
if (key == "PlaybackMode") config.PlaybackMode = val;
else if (key == "LastImageIndex") config.LastImageIndex = PI(val, 0);
if (key == "PlaybackMode")
config.PlaybackMode = val;
else if (key == "LastImageIndex")
config.LastImageIndex = PI(val, 0);
break;
// Legacy [KenBurns] section support
case "KenBurns":
if (key == "EnableKenBurns") config.EnableKenBurns = PB(val, true);
else if (key == "Duration") config.KenBurnsDuration = PD(val, 10.0);
else if (key == "MaxZoom") config.KenBurnsMaxZoom = PD(val, 1.3);
if (key == "EnableKenBurns")
config.EnableKenBurns = PB(val, true);
else if (key == "Duration")
config.KenBurnsDuration = PD(val, 10.0);
else if (key == "MaxZoom")
config.KenBurnsMaxZoom = PD(val, 1.3);
break;
}
}
Expand All @@ -297,11 +355,22 @@ public static void SaveConfig(string path, Config config)
File.WriteAllLines(path, BuildConfigLines(config, false));
}

private static double PD(string v, double d) {
double r; return double.TryParse(v, NumberStyles.Float, CI, out r) ? r : d; }
private static int PI(string v, int d) {
int r; return int.TryParse(v, NumberStyles.Integer, CI, out r) ? r : d; }
private static bool PB(string v, bool d) {
bool r; return bool.TryParse(v, out r) ? r : d; }
private static double PD(string v, double d)
{
double r;
return double.TryParse(v, NumberStyles.Float, CI, out r) ? r : d;
}

private static int PI(string v, int d)
{
int r;
return int.TryParse(v, NumberStyles.Integer, CI, out r) ? r : d;
}

private static bool PB(string v, bool d)
{
bool r;
return bool.TryParse(v, out r) ? r : d;
}
}
}
Loading