Skip to content

Commit 4d12250

Browse files
authored
Merge pull request #133 from Code52/rework-popout-feature
customize popout fade timeout
2 parents b741586 + 369c211 commit 4d12250

File tree

5 files changed

+44
-6
lines changed

5 files changed

+44
-6
lines changed

src/Carnac.Logic/KeysController.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,29 @@
33
using System.Reactive.Disposables;
44
using System.Reactive.Linq;
55
using Carnac.Logic.Models;
6+
using SettingsProviderNet;
67

78
namespace Carnac.Logic
89
{
910
public class KeysController : IDisposable
1011
{
11-
static readonly TimeSpan FiveSeconds = TimeSpan.FromSeconds(5);
1212
static readonly TimeSpan OneSecond = TimeSpan.FromSeconds(1);
13+
readonly TimeSpan fadeOutDelay;
1314
readonly ObservableCollection<Message> messages;
1415
readonly IMessageProvider messageProvider;
1516
readonly IConcurrencyService concurrencyService;
1617
readonly SingleAssignmentDisposable actionSubscription = new SingleAssignmentDisposable();
1718

18-
public KeysController(ObservableCollection<Message> messages, IMessageProvider messageProvider, IConcurrencyService concurrencyService)
19+
public KeysController(ObservableCollection<Message> messages, IMessageProvider messageProvider, IConcurrencyService concurrencyService, ISettingsProvider settingsProvider)
1920
{
2021
this.messages = messages;
2122
this.messageProvider = messageProvider;
2223
this.concurrencyService = concurrencyService;
23-
}
2424

25+
var settings = settingsProvider.GetSettings<PopupSettings>();
26+
fadeOutDelay = TimeSpan.FromSeconds(settings.ItemFadeDelay);
27+
}
28+
2529
public void Start()
2630
{
2731
var messageStream = messageProvider.GetMessageStream().Publish();
@@ -38,7 +42,7 @@ public void Start()
3842
});
3943

4044
var fadeOutMessageSeq = messageStream
41-
.Delay(FiveSeconds, concurrencyService.Default)
45+
.Delay(fadeOutDelay, concurrencyService.Default)
4246
.Select(m => m.FadeOut())
4347
.Publish();
4448

src/Carnac.Logic/Models/PopupSettings.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public class PopupSettings : NotifyPropertyChanged
1313
[DefaultValue(0.5)]
1414
public double ItemOpacity { get; set; }
1515

16+
[DefaultValue(5)]
17+
public double ItemFadeDelay { get; set; }
18+
1619
[DefaultValue("Black")]
1720
public string ItemBackgroundColor { get; set; }
1821

@@ -49,6 +52,7 @@ protected void OnLeftChanged(EventArgs e)
4952

5053
[NotifyProperty(AlsoNotifyFor = new[] { "Margins" })]
5154
public int TopOffset { get; set; }
55+
5256
[NotifyProperty(AlsoNotifyFor = new[] { "Margins" })]
5357
public int BottomOffset { get; set; }
5458

src/Carnac.Tests/KeysControllerFacts.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.ObjectModel;
3+
using System.ComponentModel;
34
using System.Linq;
5+
using System.Reflection;
46
using System.Windows.Forms;
57
using Carnac.Logic;
68
using Carnac.Logic.KeyMonitor;
@@ -10,6 +12,8 @@
1012
using Shouldly;
1113
using Xunit;
1214
using Message = Carnac.Logic.Models.Message;
15+
using SettingsProviderNet;
16+
using Carnac.Tests.ViewModels;
1317

1418
namespace Carnac.Tests
1519
{
@@ -33,7 +37,13 @@ KeysController CreateKeysController(IObservable<Message> messageStream)
3337
var concurrencyService = Substitute.For<IConcurrencyService>();
3438
concurrencyService.MainThreadScheduler.Returns(testScheduler);
3539
concurrencyService.Default.Returns(testScheduler);
36-
return new KeysController(messages, messageProvider, concurrencyService);
40+
41+
var settingsService = Substitute.For<ISettingsProvider>();
42+
var popupSettings = new PopupSettings();
43+
popupSettings.ItemFadeDelay = GetDefaultFadeDelay(popupSettings);
44+
settingsService.GetSettings<PopupSettings>().Returns(popupSettings);
45+
46+
return new KeysController(messages, messageProvider, concurrencyService, settingsService);
3747
}
3848

3949
[Fact]
@@ -135,5 +145,18 @@ IObservable<Message> SingleMessageAt100Ticks()
135145
ReactiveTest.OnNext(MessageAOnNextTick, messageA)
136146
);
137147
}
148+
149+
double GetDefaultFadeDelay(PopupSettings settings)
150+
{
151+
AttributeCollection attributes =
152+
TypeDescriptor.GetProperties(settings)["ItemFadeDelay"].Attributes;
153+
DefaultValueAttribute myAttribute =
154+
(DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];
155+
156+
double fadeDelay;
157+
double.TryParse(myAttribute.Value.ToString(), out fadeDelay);
158+
return fadeDelay;
159+
}
160+
138161
}
139162
}

src/Carnac/App.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ protected override void OnStartup(StartupEventArgs e)
4141
keyShowView = new KeyShowView(keyShowViewModel);
4242
keyShowView.Show();
4343

44-
carnac = new KeysController(keyShowViewModel.Messages, messageProvider, new ConcurrencyService());
44+
carnac = new KeysController(keyShowViewModel.Messages, messageProvider, new ConcurrencyService(), settingsProvider);
4545
carnac.Start();
4646

4747
base.OnStartup(e);

src/Carnac/UI/PreferencesView.xaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@
111111
<TextBox Foreground="White" Text="{Binding Settings.ItemOpacity}" />
112112
</ui:PreferencesField.SecondaryControl>
113113
</ui:PreferencesField>
114+
<ui:PreferencesField Header="Popup Fade Delay (sec)">
115+
<Slider Value="{Binding Settings.ItemFadeDelay}" IsSnapToTickEnabled="True"
116+
LargeChange="2" Maximum="50" Minimum="1" SmallChange="1" TickFrequency="1" />
117+
<ui:PreferencesField.SecondaryControl>
118+
<TextBox Foreground="White" Text="{Binding Settings.ItemFadeDelay}" />
119+
</ui:PreferencesField.SecondaryControl>
120+
</ui:PreferencesField>
114121
<ui:PreferencesField Header="Font Size">
115122
<Slider Value="{Binding Settings.FontSize}" IsSnapToTickEnabled="True"
116123
LargeChange="2" Maximum="48" Minimum="8" SmallChange="1" TickFrequency="1" />

0 commit comments

Comments
 (0)