-
Notifications
You must be signed in to change notification settings - Fork 1
/
MainViewController.cs
90 lines (75 loc) · 2.85 KB
/
MainViewController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using AppKit;
using coinTicker.Models;
using coinTicker.Services;
namespace coinTicker
{
public class MainViewController : NSViewController
{
private readonly IDataService _dataService = new DataService();
private readonly IFileService _fileService = new FileService();
private readonly IProductTickerFeed _productTickerFeed = new ProductTickerFeed();
private readonly NSMenu _mainMenu = new NSMenu();
private NSStatusItem _statusItem;
private Product _defaultProduct;
public MainViewController(NSStatusItem statusItem)
{
_statusItem = statusItem;
CreateMenu(statusItem);
CreateTickerMenu();
SetDefaultProduct(_fileService.GetDefaultProduct());
}
private void CreateMenu(NSStatusItem statusItem)
{
_statusItem = statusItem;
var quitItem = new NSMenuItem {Title = "Quit"};
quitItem.Activated += (sender, e) => QuitApplication();
_mainMenu.AddItem(quitItem);
_statusItem.Menu = _mainMenu;
}
private void CreateTickerMenu()
{
InvokeOnMainThread(async () =>
{
var productsItem = new NSMenuItem {Title = "Ticker"};
_mainMenu.AddItem(productsItem);
var allProducts = await _dataService.GetAllProducts();
var tickerSubmenu = new NSMenu();
_statusItem.Menu.SetSubmenu(tickerSubmenu, productsItem);
foreach (var product in allProducts)
{
var item = new NSMenuItem
{
Title = product.Id
};
item.Activated += (sender, e) =>
{
SetDefaultProduct(product);
_fileService.SaveDefaultProduct(product);
};
tickerSubmenu.AddItem(item);
}
});
}
private void QuitApplication()
{
_productTickerFeed.Disconnect();
NSApplication.SharedApplication.Terminate(null);
}
private void SetCurrentPrice(double price)
{
InvokeOnMainThread(() =>
{
_statusItem.Button.Title = price.ToCurrency(_defaultProduct.TargetCurrency);
});
}
private async void SetDefaultProduct(Product product)
{
_defaultProduct = product;
SetCurrentPrice((await _dataService.GetTickerByProduct(_defaultProduct)).Price);
_productTickerFeed.OnTickerReceived = (ticker) => SetCurrentPrice(ticker.Price);
_productTickerFeed.Connect();
_productTickerFeed.Unsubscribe();
_productTickerFeed.SubscribeTicker(_defaultProduct.Id);
}
}
}