Skip to content

Commit a00592e

Browse files
committed
split color scheme ID & colors into separate settings
That will simplify making the color scheme ID editable in-game.
1 parent 9cf2218 commit a00592e

9 files changed

Lines changed: 83 additions & 105 deletions

File tree

src/SMAPI.Installer/InteractiveInstaller.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ public void Run(string[] args)
191191
** show theme selector
192192
****/
193193
// get theme writers
194-
ColorfulConsoleWriter lightBackgroundWriter = new(context.Platform, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.LightBackground));
195-
ColorfulConsoleWriter darkBackgroundWriter = new(context.Platform, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.DarkBackground));
194+
ColorfulConsoleWriter lightBackgroundWriter = new(context.Platform, MonitorColorScheme.LightBackground, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.LightBackground));
195+
ColorfulConsoleWriter darkBackgroundWriter = new(context.Platform, MonitorColorScheme.DarkBackground, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.DarkBackground));
196196

197197
// print question
198198
this.PrintPlain("Which text looks more readable?");

src/SMAPI.Internal/ConsoleWriting/ColorSchemeConfig.cs

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,23 @@ internal class ColorfulConsoleWriter : IConsoleWriter
2525
/// <summary>Construct an instance.</summary>
2626
/// <param name="platform">The target platform.</param>
2727
public ColorfulConsoleWriter(Platform platform)
28-
: this(platform, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.AutoDetect)) { }
28+
: this(platform, MonitorColorScheme.AutoDetect, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.AutoDetect)) { }
2929

3030
/// <summary>Construct an instance.</summary>
3131
/// <param name="platform">The target platform.</param>
32+
/// <param name="colorSchemeId">The color scheme ID in <paramref name="colorConfig"/> to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
3233
/// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
33-
public ColorfulConsoleWriter(Platform platform, ColorSchemeConfig colorConfig)
34+
public ColorfulConsoleWriter(Platform platform, MonitorColorScheme colorSchemeId, Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> colorConfig)
3435
{
35-
if (colorConfig.UseScheme == MonitorColorScheme.None)
36+
if (colorSchemeId == MonitorColorScheme.None)
3637
{
3738
this.SupportsColor = false;
3839
this.Colors = null;
3940
}
4041
else
4142
{
4243
this.SupportsColor = this.TestColorSupport();
43-
this.Colors = this.GetConsoleColorScheme(platform, colorConfig);
44+
this.Colors = this.GetConsoleColorScheme(platform, colorSchemeId, colorConfig);
4445
}
4546
}
4647

@@ -73,34 +74,31 @@ public void WriteLine(string message, ConsoleLogLevel level)
7374
/// <summary>Get the default color scheme config for cases where it's not configurable (e.g. the installer).</summary>
7475
/// <param name="useScheme">The default color scheme ID to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
7576
/// <remarks>The colors here should be kept in sync with the SMAPI config file.</remarks>
76-
public static ColorSchemeConfig GetDefaultColorSchemeConfig(MonitorColorScheme useScheme)
77+
public static Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> GetDefaultColorSchemeConfig(MonitorColorScheme useScheme)
7778
{
78-
return new ColorSchemeConfig(
79-
useScheme: useScheme,
80-
schemes: new Dictionary<MonitorColorScheme, IDictionary<ConsoleLogLevel, ConsoleColor>>
79+
return new Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>>
80+
{
81+
[MonitorColorScheme.DarkBackground] = new()
82+
{
83+
[ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
84+
[ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
85+
[ConsoleLogLevel.Info] = ConsoleColor.White,
86+
[ConsoleLogLevel.Warn] = ConsoleColor.Yellow,
87+
[ConsoleLogLevel.Error] = ConsoleColor.Red,
88+
[ConsoleLogLevel.Alert] = ConsoleColor.Magenta,
89+
[ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
90+
},
91+
[MonitorColorScheme.LightBackground] = new()
8192
{
82-
[MonitorColorScheme.DarkBackground] = new Dictionary<ConsoleLogLevel, ConsoleColor>
83-
{
84-
[ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
85-
[ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
86-
[ConsoleLogLevel.Info] = ConsoleColor.White,
87-
[ConsoleLogLevel.Warn] = ConsoleColor.Yellow,
88-
[ConsoleLogLevel.Error] = ConsoleColor.Red,
89-
[ConsoleLogLevel.Alert] = ConsoleColor.Magenta,
90-
[ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
91-
},
92-
[MonitorColorScheme.LightBackground] = new Dictionary<ConsoleLogLevel, ConsoleColor>
93-
{
94-
[ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
95-
[ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
96-
[ConsoleLogLevel.Info] = ConsoleColor.Black,
97-
[ConsoleLogLevel.Warn] = ConsoleColor.DarkYellow,
98-
[ConsoleLogLevel.Error] = ConsoleColor.Red,
99-
[ConsoleLogLevel.Alert] = ConsoleColor.DarkMagenta,
100-
[ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
101-
}
93+
[ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
94+
[ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
95+
[ConsoleLogLevel.Info] = ConsoleColor.Black,
96+
[ConsoleLogLevel.Warn] = ConsoleColor.DarkYellow,
97+
[ConsoleLogLevel.Error] = ConsoleColor.Red,
98+
[ConsoleLogLevel.Alert] = ConsoleColor.DarkMagenta,
99+
[ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
102100
}
103-
);
101+
};
104102
}
105103

106104

@@ -123,22 +121,22 @@ private bool TestColorSupport()
123121

124122
/// <summary>Get the color scheme to use for the current console.</summary>
125123
/// <param name="platform">The target platform.</param>
124+
/// <param name="colorSchemeId">The color scheme ID in <paramref name="colorConfig"/> to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
126125
/// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
127-
private IDictionary<ConsoleLogLevel, ConsoleColor> GetConsoleColorScheme(Platform platform, ColorSchemeConfig colorConfig)
126+
private IDictionary<ConsoleLogLevel, ConsoleColor> GetConsoleColorScheme(Platform platform, MonitorColorScheme colorSchemeId, Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> colorConfig)
128127
{
129128
// get color scheme ID
130-
MonitorColorScheme schemeId = colorConfig.UseScheme;
131-
if (schemeId == MonitorColorScheme.AutoDetect)
129+
if (colorSchemeId == MonitorColorScheme.AutoDetect)
132130
{
133-
schemeId = platform == Platform.Mac
131+
colorSchemeId = platform == Platform.Mac
134132
? MonitorColorScheme.LightBackground // macOS doesn't provide console background color info, but it's usually white.
135133
: ColorfulConsoleWriter.IsDark(Console.BackgroundColor) ? MonitorColorScheme.DarkBackground : MonitorColorScheme.LightBackground;
136134
}
137135

138136
// get colors for scheme
139-
return colorConfig.Schemes.TryGetValue(schemeId, out IDictionary<ConsoleLogLevel, ConsoleColor>? scheme)
137+
return colorConfig.TryGetValue(colorSchemeId, out Dictionary<ConsoleLogLevel, ConsoleColor>? scheme)
140138
? scheme
141-
: throw new NotSupportedException($"Unknown color scheme '{schemeId}'.");
139+
: throw new NotSupportedException($"Unknown color scheme '{colorSchemeId}'.");
142140
}
143141

144142
/// <summary>Get whether a console color should be considered dark, which is subjectively defined as 'white looks better than black on this text'.</summary>

src/SMAPI.Internal/SMAPI.Internal.projitems

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
</PropertyGroup>
1111
<ItemGroup>
1212
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ColorfulConsoleWriter.cs" />
13-
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ColorSchemeConfig.cs" />
1413
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ConsoleLogLevel.cs" />
1514
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\IConsoleWriter.cs" />
1615
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\MonitorColorScheme.cs" />

src/SMAPI/Framework/Logging/LogManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ internal class LogManager : IDisposable
4747
****/
4848
/// <summary>Construct an instance.</summary>
4949
/// <param name="logPath">The log file path to write.</param>
50+
/// <param name="colorSchemeId">The color scheme ID in <paramref name="colorConfig"/> to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
5051
/// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
5152
/// <param name="writeToConsole">Whether to output log messages to the console.</param>
5253
/// <param name="verboseLogging">The log contexts for which to enable verbose logging, which may show a lot more information to simplify troubleshooting.</param>
5354
/// <param name="isDeveloperMode">Whether to enable full console output for developers.</param>
5455
/// <param name="getScreenIdForLog">Get the screen ID that should be logged to distinguish between players in split-screen mode, if any.</param>
55-
public LogManager(string logPath, ColorSchemeConfig colorConfig, bool writeToConsole, HashSet<string> verboseLogging, bool isDeveloperMode, Func<int?> getScreenIdForLog)
56+
public LogManager(string logPath, MonitorColorScheme colorSchemeId, Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> colorConfig, bool writeToConsole, HashSet<string> verboseLogging, bool isDeveloperMode, Func<int?> getScreenIdForLog)
5657
{
5758
// init log file
5859
this.LogFile = new LogFileManager(logPath);
5960

6061
// init monitor
61-
this.GetMonitorImpl = (id, name) => new Monitor(id, name, this.LogFile, colorConfig, verboseLogging.Contains("*") || verboseLogging.Contains(id), getScreenIdForLog)
62+
this.GetMonitorImpl = (id, name) => new Monitor(id, name, this.LogFile, colorSchemeId, colorConfig, verboseLogging.Contains("*") || verboseLogging.Contains(id), getScreenIdForLog)
6263
{
6364
WriteToConsole = writeToConsole,
6465
ShowTraceInConsole = isDeveloperMode,

src/SMAPI/Framework/Models/SConfig.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,11 @@ internal class SConfig
9595
/// <summary>Whether to include more technical details about broken mods in the TRACE logs. This is mainly useful for creating compatibility rewriters.</summary>
9696
public bool LogTechnicalDetailsForBrokenMods { get; set; }
9797

98+
/// <summary>The color scheme ID in <see cref="ConsoleColorSchemes"/> to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</summary>
99+
public MonitorColorScheme ConsoleColorScheme { get; set; }
100+
98101
/// <summary>The colors to use for text written to the SMAPI console.</summary>
99-
public ColorSchemeConfig ConsoleColors { get; set; }
102+
public Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> ConsoleColorSchemes { get; set; }
100103

101104
/// <summary>Whether to prevent mods from enabling Harmony's debug mode, which impacts performance and creates a file on your desktop. Debug mode should never be enabled by a released mod.</summary>
102105
public bool SuppressHarmonyDebugMode { get; set; }
@@ -131,7 +134,8 @@ internal class SConfig
131134
/// <param name="useCaseInsensitivePaths"><inheritdoc cref="UseCaseInsensitivePaths" path="/summary" /></param>
132135
/// <param name="logNetworkTraffic"><inheritdoc cref="LogNetworkTraffic" path="/summary" /></param>
133136
/// <param name="logTechnicalDetailsForBrokenMods"><inheritdoc cref="LogTechnicalDetailsForBrokenMods" path="/summary" /></param>
134-
/// <param name="consoleColors"><inheritdoc cref="ConsoleColors" path="/summary" /></param>
137+
/// <param name="consoleColorScheme"><inheritdoc cref="ConsoleColorScheme" path="/summary" /></param>
138+
/// <param name="consoleColorSchemes"><inheritdoc cref="ConsoleColorSchemes" path="/summary" /></param>
135139
/// <param name="suppressHarmonyDebugMode"><inheritdoc cref="SuppressHarmonyDebugMode" path="/summary" /></param>
136140
/// <param name="suppressUpdateChecks"><inheritdoc cref="SuppressUpdateChecks" path="/summary" /></param>
137141
/// <param name="modsToLoadEarly"><inheritdoc cref="ModsToLoadEarly" path="/summary" /></param>
@@ -153,7 +157,8 @@ public SConfig(
153157
bool? useCaseInsensitivePaths,
154158
bool? logNetworkTraffic,
155159
bool? logTechnicalDetailsForBrokenMods,
156-
ColorSchemeConfig consoleColors,
160+
MonitorColorScheme consoleColorScheme,
161+
Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>>? consoleColorSchemes,
157162
bool? suppressHarmonyDebugMode,
158163
string[]? suppressUpdateChecks,
159164
string[]? modsToLoadEarly,
@@ -176,7 +181,8 @@ public SConfig(
176181
this.UseCaseInsensitivePaths = useCaseInsensitivePaths ?? (bool)SConfig.DefaultValues[nameof(this.UseCaseInsensitivePaths)];
177182
this.LogNetworkTraffic = logNetworkTraffic ?? (bool)SConfig.DefaultValues[nameof(this.LogNetworkTraffic)];
178183
this.LogTechnicalDetailsForBrokenMods = logTechnicalDetailsForBrokenMods ?? (bool)SConfig.DefaultValues[nameof(this.LogTechnicalDetailsForBrokenMods)];
179-
this.ConsoleColors = consoleColors;
184+
this.ConsoleColorScheme = consoleColorScheme;
185+
this.ConsoleColorSchemes = consoleColorSchemes ?? [];
180186
this.SuppressHarmonyDebugMode = suppressHarmonyDebugMode ?? (bool)SConfig.DefaultValues[nameof(this.SuppressHarmonyDebugMode)];
181187
this.SuppressUpdateChecks = new HashSet<string>(suppressUpdateChecks ?? [], StringComparer.OrdinalIgnoreCase);
182188
this.ModsToLoadEarly = new HashSet<string>(modsToLoadEarly ?? [], StringComparer.OrdinalIgnoreCase);

src/SMAPI/Framework/Monitor.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,11 @@ internal class Monitor : IMonitor
7373
/// <param name="modId">The mod ID, if applicable.</param>
7474
/// <param name="source">The name of the module which logs messages using this instance.</param>
7575
/// <param name="logFile">The log file to which to write messages.</param>
76+
/// <param name="colorSchemeId">The color scheme ID in <paramref name="colorConfig"/> to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
7677
/// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
7778
/// <param name="isVerbose">Whether verbose logging is enabled. This enables more detailed diagnostic messages than are normally needed.</param>
7879
/// <param name="getScreenIdForLog">Get the screen ID that should be logged to distinguish between players in split-screen mode, if any.</param>
79-
public Monitor(string modId, string source, LogFileManager logFile, ColorSchemeConfig colorConfig, bool isVerbose, Func<int?> getScreenIdForLog)
80+
public Monitor(string modId, string source, LogFileManager logFile, MonitorColorScheme colorSchemeId, Dictionary<MonitorColorScheme, Dictionary<ConsoleLogLevel, ConsoleColor>> colorConfig, bool isVerbose, Func<int?> getScreenIdForLog)
8081
{
8182
// validate
8283
if (string.IsNullOrWhiteSpace(source))
@@ -86,7 +87,7 @@ public Monitor(string modId, string source, LogFileManager logFile, ColorSchemeC
8687
this.ModId = modId;
8788
this.Source = source;
8889
this.LogFile = logFile ?? throw new ArgumentNullException(nameof(logFile), "The log file manager cannot be null.");
89-
this.ConsoleWriter = new ColorfulConsoleWriter(Constants.Platform, colorConfig);
90+
this.ConsoleWriter = new ColorfulConsoleWriter(Constants.Platform, colorSchemeId, colorConfig);
9091
this.IsVerbose = isVerbose;
9192
this.GetScreenIdForLog = getScreenIdForLog;
9293
}

src/SMAPI/Framework/SCore.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public SCore(string modsPath, bool writeToConsole, bool? developerMode)
206206
}
207207

208208
// init basics
209-
this.LogManager = new LogManager(logPath: logPath, colorConfig: this.Settings.ConsoleColors, writeToConsole: writeToConsole, verboseLogging: this.Settings.VerboseLogging, isDeveloperMode: this.Settings.DeveloperMode, getScreenIdForLog: this.GetScreenIdForLog);
209+
this.LogManager = new LogManager(logPath: logPath, colorSchemeId: this.Settings.ConsoleColorScheme, colorConfig: this.Settings.ConsoleColorSchemes, writeToConsole: writeToConsole, verboseLogging: this.Settings.VerboseLogging, isDeveloperMode: this.Settings.DeveloperMode, getScreenIdForLog: this.GetScreenIdForLog);
210210
this.CommandManager = new CommandManager(this.Monitor);
211211
this.EventManager = new EventManager(this.ModRegistry);
212212
SCore.DeprecationManager = new DeprecationManager(this.Monitor, this.ModRegistry);

0 commit comments

Comments
 (0)