Skip to content

Commit f35b1b9

Browse files
committed
Resolve #204: Add option to prefer 24-hour time when parsing
1 parent fe4e8bb commit f35b1b9

File tree

10 files changed

+116
-5
lines changed

10 files changed

+116
-5
lines changed

Hourglass/App.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
<setting name="UpgradeRequired" serializeAs="String">
2323
<value>True</value>
2424
</setting>
25+
<setting name="Prefer24HourTime" serializeAs="String">
26+
<value>False</value>
27+
</setting>
2528
</Hourglass.Properties.Settings>
2629
</userSettings>
2730
</configuration>

Hourglass/AppEntry.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ private static void SetGlobalSettingsFromArguments(CommandLineArguments argument
172172
{
173173
Settings.Default.ShowInNotificationArea = arguments.ShowInNotificationArea;
174174
Settings.Default.OpenSavedTimersOnStartup = arguments.OpenSavedTimers;
175+
Settings.Default.Prefer24HourTime = arguments.Prefer24HourTime;
175176
}
176177

177178
/// <summary>

Hourglass/CommandLineArguments.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ public static string Usage
149149
/// </summary>
150150
public bool OpenSavedTimers { get; private set; }
151151

152+
/// <summary>
153+
/// Gets a value indicating whether to prefer interpreting time of day values as 24-hour time.
154+
/// </summary>
155+
public bool Prefer24HourTime { get; private set; }
156+
152157
/// <summary>
153158
/// Gets or sets a value indicating what information to display in the timer window title.
154159
/// </summary>
@@ -292,6 +297,7 @@ private static CommandLineArguments GetArgumentsFromMostRecentOptions()
292297
Sound = options.Sound,
293298
LoopSound = options.LoopSound,
294299
OpenSavedTimers = Settings.Default.OpenSavedTimersOnStartup,
300+
Prefer24HourTime = Settings.Default.Prefer24HourTime,
295301
WindowTitleMode = options.WindowTitleMode,
296302
WindowState = windowSize.WindowState != WindowState.Minimized ? windowSize.WindowState : windowSize.RestoreWindowState,
297303
RestoreWindowState = windowSize.RestoreWindowState,
@@ -331,6 +337,7 @@ private static CommandLineArguments GetArgumentsFromFactoryDefaults()
331337
Sound = defaultOptions.Sound,
332338
LoopSound = defaultOptions.LoopSound,
333339
OpenSavedTimers = false,
340+
Prefer24HourTime = false,
334341
WindowTitleMode = WindowTitleMode.ApplicationName,
335342
WindowState = defaultOptions.WindowSize.WindowState,
336343
RestoreWindowState = defaultOptions.WindowSize.RestoreWindowState,
@@ -587,6 +594,19 @@ private static CommandLineArguments GetCommandLineArguments(IEnumerable<string>
587594
argumentsBasedOnFactoryDefaults.OpenSavedTimers = openSavedTimers;
588595
break;
589596

597+
case "--prefer-24h-time":
598+
case "-j":
599+
ThrowIfDuplicateSwitch(specifiedSwitches, "--prefer-24h-time");
600+
601+
bool prefer24HourTime = GetBoolValue(
602+
arg,
603+
remainingArgs,
604+
argumentsBasedOnMostRecentOptions.Prefer24HourTime);
605+
606+
argumentsBasedOnMostRecentOptions.Prefer24HourTime = prefer24HourTime;
607+
argumentsBasedOnFactoryDefaults.Prefer24HourTime = prefer24HourTime;
608+
break;
609+
590610
case "--window-title":
591611
case "-i":
592612
ThrowIfDuplicateSwitch(specifiedSwitches, "--window-title");

Hourglass/Parsing/NormalTimeToken.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,35 @@ public override string ToString(IFormatProvider provider)
148148
StringBuilder stringBuilder = new StringBuilder();
149149

150150
// Hour
151+
int adjustedHour;
152+
if (Settings.Default.Prefer24HourTime)
153+
{
154+
// This class stores its data in 12-hour format, so adust it back to 24-hour time.
155+
if (this.Hour == 12 && this.HourPeriod == HourPeriod.Am)
156+
{
157+
adjustedHour = 0;
158+
}
159+
else if (this.HourPeriod == HourPeriod.Pm)
160+
{
161+
adjustedHour = this.Hour + 12;
162+
}
163+
else
164+
{
165+
adjustedHour = this.Hour;
166+
}
167+
}
168+
else
169+
{
170+
adjustedHour = this.Hour;
171+
}
172+
151173
stringBuilder.AppendFormat(
152174
Resources.ResourceManager.GetEffectiveProvider(provider),
153175
Resources.ResourceManager.GetString("NormalTimeTokenHourPartFormatString", provider),
154-
this.Hour);
176+
adjustedHour);
155177

156178
// Minute
157-
if (this.Minute != 0 || this.Second != 0)
179+
if (this.Minute != 0 || this.Second != 0 || this.HourPeriod == HourPeriod.Undefined || Settings.Default.Prefer24HourTime)
158180
{
159181
stringBuilder.AppendFormat(
160182
Resources.ResourceManager.GetEffectiveProvider(provider),
@@ -172,7 +194,11 @@ public override string ToString(IFormatProvider provider)
172194
}
173195

174196
// Hour period
175-
if (this.IsMidday)
197+
if (Settings.Default.Prefer24HourTime)
198+
{
199+
// No suffix when outputting 24-hour time.
200+
}
201+
else if (this.IsMidday)
176202
{
177203
stringBuilder.Append(Resources.ResourceManager.GetString("NormalTimeTokenMiddaySuffix", provider));
178204
}
@@ -272,7 +298,7 @@ protected override TimeToken ParseInternal(Match match, IFormatProvider provider
272298
{
273299
timeToken.HourPeriod = HourPeriod.Pm;
274300
}
275-
else if (match.Groups["military"].Success)
301+
else if (match.Groups["military"].Success || Settings.Default.Prefer24HourTime)
276302
{
277303
if (timeToken.Hour == 0)
278304
{

Hourglass/Properties/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Hourglass/Properties/Resources.resx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,4 +1257,8 @@ $</value>
12571257
<value>Rest_ore</value>
12581258
<comment>The text for the restore menu item, where the character following the optional underscore (_) is the access key</comment>
12591259
</data>
1260+
<data name="ContextMenuPrefer24HourTimeMenuItem" xml:space="preserve">
1261+
<value>Prefer 24-_hour time when parsing</value>
1262+
<comment>The text for the prefer 24-hour time when parsing menu item, where the character following the optional underscore (_) is the access key</comment>
1263+
</data>
12601264
</root>

Hourglass/Properties/Settings.Designer.cs

Lines changed: 13 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Hourglass/Properties/Settings.settings

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@
2929
<Setting Name="UpgradeRequired" Type="System.Boolean" Scope="User">
3030
<Value Profile="(Default)">True</Value>
3131
</Setting>
32+
<Setting Name="Prefer24HourTime" Type="System.Boolean" Scope="User">
33+
<Value Profile="(Default)">False</Value>
34+
</Setting>
3235
</Settings>
3336
</SettingsFile>

Hourglass/Resources/Usage.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,20 @@ Options:
160160
Default value last
161161
Alias -v
162162

163+
--prefer-24h-time on|off|last
164+
When the input used to start the timer contains a time of day that does
165+
not explicitly specify "am" or "pm", prefer interpreting the input as a
166+
24-hour time rather than the closest 12-hour time to the current time.
167+
168+
For example, if the current time is 3:00 pm (15:00) and the input is
169+
"until 05:00" the timer will --
170+
- if this setting is on, count down until 5:00 am (05:00); or
171+
- if this setting is off, count down until 5:00 pm (17:00).
172+
173+
Required no
174+
Default value last
175+
Alias -j
176+
163177
--window-title none|app|left|elapsed|title|last
164178
Sets the timer window title.
165179

@@ -244,6 +258,7 @@ Options:
244258
--sound normal beep
245259
--loop-sound off
246260
--open-saved-timers off
261+
--prefer-24h-time off
247262
--window-state normal
248263
--window-bounds auto,auto,350,150
249264
--lock-interface off

Hourglass/Windows/ContextMenu.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ public class ContextMenu : System.Windows.Controls.ContextMenu
161161
/// </summary>
162162
private MenuItem openSavedTimersOnStartupMenuItem;
163163

164+
/// <summary>
165+
/// The "Prefer 24-hour time when parsing" <see cref="MenuItem"/>.
166+
/// </summary>
167+
private MenuItem prefer24HourTimeMenuItem;
168+
164169
/// <summary>
165170
/// The "Reverse progress bar" <see cref="MenuItem"/>.
166171
/// </summary>
@@ -460,6 +465,9 @@ private void UpdateMenuFromOptions()
460465
// Open saved timers on startup
461466
this.openSavedTimersOnStartupMenuItem.IsChecked = Settings.Default.OpenSavedTimersOnStartup;
462467

468+
// Prefer 24-hour time when parsing
469+
this.prefer24HourTimeMenuItem.IsChecked = Settings.Default.Prefer24HourTime;
470+
463471
// Reverse progress bar
464472
this.reverseProgressBarMenuItem.IsChecked = this.timerWindow.Options.ReverseProgressBar;
465473

@@ -534,6 +542,9 @@ private void UpdateOptionsFromMenu()
534542
// Open saved timers on startup
535543
Settings.Default.OpenSavedTimersOnStartup = this.openSavedTimersOnStartupMenuItem.IsChecked;
536544

545+
// Prefer 24-hour time when parsing
546+
Settings.Default.Prefer24HourTime = this.prefer24HourTimeMenuItem.IsChecked;
547+
537548
// Reverse progress bar
538549
this.timerWindow.Options.ReverseProgressBar = this.reverseProgressBarMenuItem.IsChecked;
539550

@@ -686,6 +697,13 @@ private void BuildMenu()
686697
this.openSavedTimersOnStartupMenuItem.Click += this.CheckableMenuItemClick;
687698
this.advancedOptionsMenuItem.Items.Add(this.openSavedTimersOnStartupMenuItem);
688699

700+
// Prefer 24-hour time when parsing
701+
this.prefer24HourTimeMenuItem = new MenuItem();
702+
this.prefer24HourTimeMenuItem.Header = Properties.Resources.ContextMenuPrefer24HourTimeMenuItem;
703+
this.prefer24HourTimeMenuItem.IsCheckable = true;
704+
this.prefer24HourTimeMenuItem.Click += this.CheckableMenuItemClick;
705+
this.advancedOptionsMenuItem.Items.Add(this.prefer24HourTimeMenuItem);
706+
689707
// Reverse progress bar
690708
this.reverseProgressBarMenuItem = new MenuItem();
691709
this.reverseProgressBarMenuItem.Header = Properties.Resources.ContextMenuReverseProgressBarMenuItem;

0 commit comments

Comments
 (0)