跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

浏览文件

WebSiteContextMenuServicer.cs

259 行 · 7.9 KB历史下载
1using Core.Models;
2using Core.Models.Db;
3using Core.Servicers.Instances;
4using Core.Servicers.Interfaces;
5using System;
6using System.Collections.Generic;
7using System.Diagnostics;
8using System.IO;
9using System.Linq;
10using System.Text;
11using System.Threading.Tasks;
12using System.Windows;
13using System.Windows.Controls;
14using System.Windows.Documents;
15using System.Windows.Media;
16using UI.Controls.Charts.Model;
17using UI.ViewModels;
18
19namespace UI.Servicers
20{
21 public class WebSiteContextMenuServicer : IWebSiteContextMenuServicer
22 {
23
24 private readonly MainViewModel _main;
25 private readonly IAppConfig _appConfig;
26 private readonly IThemeServicer _theme;
27 private readonly IWebData _webData;
28 private readonly IUIServicer _uIServicer;
29
30 private ContextMenu _menu;
31 private MenuItem _setCategory;
32 private MenuItem _block;
33 private MenuItem _site;
34
35
36 public WebSiteContextMenuServicer(
37 MainViewModel main_,
38 IAppConfig appConfig_,
39 IThemeServicer theme_,
40 IWebData webData_,
41 IUIServicer uIServicer_)
42 {
43 _main = main_;
44 _appConfig = appConfig_;
45 _theme = theme_;
46 _webData = webData_;
47 _uIServicer = uIServicer_;
48 }
49
50 public void Init()
51 {
52 CreateMenu();
53 _theme.OnThemeChanged += Theme_OnThemeChanged;
54 }
55
56 private void CreateMenu()
57 {
58 if (_menu != null)
59 {
60 _menu.ContextMenuOpening -= _menu_ContextMenuOpening;
61 }
62 _menu = new ContextMenu();
63 _menu.Items.Clear();
64
65 MenuItem open = new MenuItem();
66 open.Header = "在浏览器打开网站";
67 open.Click += Open_Click; ;
68
69
70 _setCategory = new MenuItem();
71 _setCategory.Header = "设置分类";
72
73 MenuItem editAlias = new MenuItem();
74 editAlias.Header = "编辑别名";
75 editAlias.Click += EditAlias_ClickAsync;
76
77 _block = new MenuItem();
78 _block.Header = "忽略此网站";
79 _block.Click += Block_Click;
80
81 _site = new MenuItem();
82 _site.IsEnabled = false;
83
84 _menu.Items.Add(_site);
85 _menu.Items.Add(open);
86 _menu.Items.Add(new Separator());
87 _menu.Items.Add(_setCategory);
88 _menu.Items.Add(editAlias);
89 _menu.Items.Add(new Separator());
90 _menu.Items.Add(_block);
91 _menu.ContextMenuOpening += _menu_ContextMenuOpening;
92 }
93
94 private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
95 {
96 var data = _menu.Tag as ChartsDataModel;
97 var site = data.Data as WebSiteModel;
98
99 try
100 {
101 string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", site.Alias, (val) =>
102 {
103 if (val.Length > 15)
104 {
105 _main.Error("别名最大长度为15位字符");
106 return false;
107 }
108 return true;
109 });
110
111 // 开始更新别名
112
113 data.Name = string.IsNullOrEmpty(input) ? site.Title : input;
114 site.Alias = input;
115
116 _webData.Update(site);
117
118 _main.Success("别名已更新");
119 Debug.WriteLine("输入内容:" + input);
120 }
121 catch
122 {
123 // 输入取消,无需处理异常
124 }
125 }
126
127 private void _menu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
128 {
129 if (_menu.Tag == null)
130 {
131 return;
132 }
133 var data = _menu.Tag as ChartsDataModel;
134 var site = data.Data as WebSiteModel;
135 _site.Header = site.Title;
136
137 var config = _appConfig.GetConfig();
138 if (config.Behavior.IgnoreURLList.Contains(site.Domain))
139 {
140 _block.Header = "取消忽略此站点";
141 }
142 else
143 {
144 _block.Header = "忽略此站点";
145 }
146
147 UpdateCategoryMenu();
148 }
149
150 private void Open_Click(object sender, System.Windows.RoutedEventArgs e)
151 {
152 var data = _menu.Tag as ChartsDataModel;
153 var site = data.Data as WebSiteModel;
154 if (!string.IsNullOrEmpty(site.Domain))
155 {
156 Process.Start($"http://{site.Domain}");
157 _main.Info("操作已执行");
158 }
159 }
160
161 private void Theme_OnThemeChanged(object sender, EventArgs e)
162 {
163 _menu.UpdateDefaultStyle();
164 }
165
166 private void Block_Click(object sender, System.Windows.RoutedEventArgs e)
167 {
168 var data = _menu.Tag as ChartsDataModel;
169 var site = data.Data as WebSiteModel;
170 if (site == null) { return; }
171
172 var newBadgeList = new List<ChartBadgeModel>();
173 if (data.BadgeList != null)
174 {
175 var categoryBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Ignore).ToList();
176 newBadgeList.AddRange(categoryBadge);
177 }
178
179 var config = _appConfig.GetConfig();
180 if (config.Behavior.IgnoreURLList.Contains(site.Domain))
181 {
182 config.Behavior.IgnoreURLList.Remove(site.Domain);
183 _main.Toast($"已取消忽略此域名 {site.Domain}", Controls.Window.ToastType.Success);
184 }
185 else
186 {
187 config.Behavior.IgnoreURLList.Add(site.Domain);
188 _main.Toast($"已忽略此域名 {site.Domain}", Controls.Window.ToastType.Success);
189
190 newBadgeList.Add(ChartBadgeModel.IgnoreBadge);
191 }
192 data.BadgeList = newBadgeList;
193 }
194
195
196
197 private void UpdateCategoryMenu()
198 {
199 _setCategory.Items.Clear();
200
201 var data = _menu.Tag as ChartsDataModel;
202 var site = data.Data as WebSiteModel;
203 var categories = _webData.GetWebSiteCategories();
204 foreach (var category in categories)
205 {
206 var categoryMenu = new MenuItem();
207 categoryMenu.Header = category.Name;
208 categoryMenu.IsChecked = site.CategoryID == category.ID;
209 categoryMenu.Click += (s, e) =>
210 {
211 UpdateSiteCategory(data, category.ID);
212 };
213 _setCategory.Items.Add(categoryMenu);
214 }
215 }
216
217
218
219 private void UpdateSiteCategory(ChartsDataModel data, int categoryId_)
220 {
221 Task.Run(() =>
222 {
223 var category = _webData.GetWebSiteCategory(categoryId_);
224 if (category != null)
225 {
226 WebSiteModel site_ = data.Data as WebSiteModel;
227 _webData.UpdateWebSitesCategory(new int[] { site_.ID }, categoryId_);
228 site_.CategoryID = categoryId_;
229 site_.Category = category;
230
231 var newBadgeList = new List<ChartBadgeModel>();
232 if (data.BadgeList != null)
233 {
234 var otherBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Category).ToList();
235 newBadgeList.AddRange(otherBadge);
236 }
237 newBadgeList.Add(new ChartBadgeModel()
238 {
239 Name = category.Name,
240 Color = category.Color,
241 Type = ChartBadgeType.Category
242 });
243 data.BadgeList = newBadgeList;
244 }
245 });
246 }
247
248
249
250
251
252 public ContextMenu GetContextMenu()
253 {
254 return _menu;
255 }
256
257
258 }
259}