Screenie/Configuration.cs

98 lines
3.3 KiB
C#

using System.Drawing.Imaging;
using Dalamud.Configuration;
using Dalamud.Game.ClientState.GamePad;
using FFXIVClientStructs.FFXIV.Client.UI;
using Scriban;
using Scriban.Parsing;
namespace Screenie;
[Serializable]
public class Configuration : IPluginConfiguration {
public int Version { get; set; } = 1;
public string SaveDirectory = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Screenie");
public Format SaveFormat = Format.Png;
public int SaveFormatData = 90;
public string SaveFileNameFormat = """
{{ captured_at_local | date.to_string '%Y/%m %b/[%H.%M.%S]' }}
{{ if active_character -}}
{{ active_character.name }} - {{ location }}
{{- else -}}
Main Menu or Loading Screen
{{- end -}}
{{- if area }} ({{ area }}) {{- end -}}
{{- if ward }} W{{ ward }} {{- end -}}
{{- if plot -}} P{{ plot }} {{- end -}}
""";
public GamepadButtons GamepadKeybind = GamepadButtons.L1 | GamepadButtons.Start;
public List<SeVirtualKey> KeyboardKeybind = [];
public bool DisableNativeScreenshots = true;
private int _templateHashCode;
private Template? _template;
internal Template SaveFileNameTemplate {
get {
var currentHash = this.SaveFileNameFormat.GetHashCode();
if (currentHash == this._templateHashCode && this._template != null) {
return this._template;
}
this._templateHashCode = currentHash;
this._template = Template.Parse(
this.SaveFileNameFormat,
parserOptions: new ParserOptions {
LiquidFunctionsToScriban = true,
}
);
return this._template;
}
}
}
public enum Format {
Png,
WebpLossless,
WebpLossy,
Jpg,
// AvifLossless,
// AvifLossy,
// HeicLossless,
// HeicLossy,
}
public static class FormatExt {
public static string Name(this Format format) {
return format switch {
Format.Png => "PNG",
Format.WebpLossless => "WEBP (lossless)",
Format.WebpLossy => "WEBP (lossy)",
Format.Jpg => "JPG",
// Format.AvifLossless => "AVIF (lossless)",
// Format.AvifLossy => "AVIF (lossy)",
// Format.HeicLossless => "HEIC (lossless)",
// Format.HeicLossy => "HEIC (lossy)",
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
};
}
public static ImageFormat? ToImageFormat(this Format format) {
return format switch {
Format.Png => ImageFormat.Png,
Format.WebpLossless => null,
Format.WebpLossy => null,
Format.Jpg => ImageFormat.Jpeg,
// Format.AvifLossless => null,
// Format.AvifLossy => null,
// Format.HeicLossless => null,
// Format.HeicLossy => null,
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
};
}
}