跳到主要内容

github/tai

公开

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

浏览文件

AppContextMenuServicer.cs

408 行 · 12.6 KB历史下载
1using Core.Models;
2using Core.Servicers.Interfaces;
3using System;
4using System.Collections.Generic;
5using System.Diagnostics;
6using System.IO;
7using System.Linq;
8using System.Text;
9using System.Threading.Tasks;
10using System.Windows;
11using System.Windows.Controls;
12using System.Windows.Media;
13using UI.Controls.Charts.Model;
14using UI.ViewModels;
15
16namespace UI.Servicers
17{
18 public class AppContextMenuServicer : IAppContextMenuServicer
19 {
20
21 private readonly MainViewModel main;
22 private readonly ICategorys categorys;
23 private readonly IAppData appData;
24 private readonly IAppConfig appConfig;
25 private readonly IThemeServicer theme;
26 private readonly IUIServicer _uIServicer;
27 private ContextMenu menu;
28 private MenuItem setCategory;
29 private MenuItem setLink;
30 MenuItem block = new MenuItem();
31 MenuItem _whiteList = new MenuItem();
32
33
34 public AppContextMenuServicer(
35 MainViewModel main,
36 ICategorys categorys,
37 IAppData appData,
38 IAppConfig appConfig,
39 IThemeServicer theme,
40 IUIServicer uIServicer_)
41 {
42 this.main = main;
43 this.categorys = categorys;
44 this.appData = appData;
45 this.appConfig = appConfig;
46 this.theme = theme;
47 this._uIServicer = uIServicer_;
48
49 }
50
51 public void Init()
52 {
53 CreateMenu();
54 theme.OnThemeChanged += Theme_OnThemeChanged;
55 }
56
57 private void CreateMenu()
58 {
59 if (menu != null)
60 {
61 menu.ContextMenuOpening -= SetCategory_ContextMenuOpening;
62 }
63 menu = new ContextMenu();
64 menu.Items.Clear();
65
66 MenuItem run = new MenuItem();
67 run.Header = "启动应用";
68 run.Click += Run_Click;
69
70 MenuItem openDir = new MenuItem();
71 openDir.Header = "打开应用所在目录";
72 openDir.Click += OpenDir_Click;
73
74 setCategory = new MenuItem();
75 setCategory.Header = "设置分类";
76
77 MenuItem editAlias = new MenuItem();
78 editAlias.Header = "编辑别名";
79 editAlias.Click += EditAlias_ClickAsync;
80
81 setLink = new MenuItem();
82 setLink.Header = "添加关联";
83
84 block.Header = "忽略此应用";
85 block.Click += Block_Click;
86
87 _whiteList.Header = "添加到白名单";
88 _whiteList.Click += _whiteList_Click;
89
90 menu.Items.Add(run);
91 menu.Items.Add(new Separator());
92 menu.Items.Add(setCategory);
93 menu.Items.Add(setLink);
94 menu.Items.Add(editAlias);
95 menu.Items.Add(new Separator());
96
97 menu.Items.Add(openDir);
98 menu.Items.Add(block);
99 menu.Items.Add(_whiteList);
100
101 menu.ContextMenuOpening += SetCategory_ContextMenuOpening;
102 }
103
104 private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
105 {
106 var data = menu.Tag as ChartsDataModel;
107 var log = data.Data as DailyLogModel;
108 var app = log != null ? log.AppModel : null;
109
110 if (log == null)
111 {
112 app = (data.Data as HoursLogModel).AppModel;
113 }
114
115 try
116 {
117 string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", app.Alias, (val) =>
118 {
119 if (val.Length > 15)
120 {
121 main.Error("别名最大长度为15位字符");
122 return false;
123 }
124 return true;
125 });
126
127 // 开始更新别名
128 var editApp = appData.GetApp(app.ID);
129 editApp.Alias = input;
130 appData.UpdateApp(editApp);
131 data.Name = string.IsNullOrEmpty(input) ? editApp.Description : input;
132
133 main.Success("别名已更新");
134 Debug.WriteLine("输入内容:" + input);
135 }
136 catch
137 {
138 // 输入取消,无需处理异常
139 }
140 }
141
142 private void _whiteList_Click(object sender, System.Windows.RoutedEventArgs e)
143 {
144 var data = menu.Tag as ChartsDataModel;
145 var log = data.Data as DailyLogModel;
146 var app = log != null ? log.AppModel : null;
147
148 if (log == null)
149 {
150 app = (data.Data as HoursLogModel).AppModel;
151 }
152 var config = appConfig.GetConfig();
153 if (config.Behavior.ProcessWhiteList.Contains(app.Name))
154 {
155 config.Behavior.ProcessWhiteList.Remove(app.Name);
156 main.Toast($"已从白名单移除此应用 {app.Description}", Controls.Window.ToastType.Success);
157 }
158 else
159 {
160 config.Behavior.ProcessWhiteList.Add(app.Name);
161 main.Toast($"已添加至白名单 {app.Description}", Controls.Window.ToastType.Success);
162 }
163 }
164
165 private void Theme_OnThemeChanged(object sender, EventArgs e)
166 {
167 menu.UpdateDefaultStyle();
168 }
169
170 private void Block_Click(object sender, System.Windows.RoutedEventArgs e)
171 {
172 var data = menu.Tag as ChartsDataModel;
173 var log = data.Data as DailyLogModel;
174 var app = log != null ? log.AppModel : null;
175
176 if (log == null)
177 {
178 app = (data.Data as HoursLogModel).AppModel;
179 }
180 var newBadgeList = new List<ChartBadgeModel>();
181 if (data.BadgeList != null)
182 {
183 var categoryBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Ignore).ToList();
184 newBadgeList.AddRange(categoryBadge);
185 }
186
187 var config = appConfig.GetConfig();
188 if (config.Behavior.IgnoreProcessList.Contains(app.Name))
189 {
190 config.Behavior.IgnoreProcessList.Remove(app.Name);
191 main.Toast($"已取消忽略此应用 {app.Description}", Controls.Window.ToastType.Success);
192 }
193 else
194 {
195 config.Behavior.IgnoreProcessList.Add(app.Name);
196 main.Toast($"已忽略此应用 {app.Description}", Controls.Window.ToastType.Success);
197
198 newBadgeList.Add(ChartBadgeModel.IgnoreBadge);
199 }
200 data.BadgeList = newBadgeList;
201 }
202
203 private void SetCategory_ContextMenuOpening(object sender, ContextMenuEventArgs e)
204 {
205 if (menu.Tag == null)
206 {
207 return;
208 }
209 var data = menu.Tag as ChartsDataModel;
210 var log = data.Data as DailyLogModel;
211 var app = log != null ? log.AppModel : null;
212
213 if (log == null)
214 {
215 app = (data.Data as HoursLogModel).AppModel;
216 }
217
218
219 var config = appConfig.GetConfig();
220 if (config.Behavior.IgnoreProcessList.Contains(app.Name))
221 {
222 block.Header = "取消忽略此应用";
223 }
224 else
225 {
226 block.Header = "忽略此应用";
227 }
228
229 if (config.Behavior.ProcessWhiteList.Contains(app.Name))
230 {
231 _whiteList.Header = "从白名单移除";
232 }
233 else
234 {
235 _whiteList.Header = "添加到白名单";
236 }
237
238 UpdateCategory();
239
240 setLink.IsEnabled = config.Links.Count > 0;
241 UpdateLinks();
242 }
243
244 private void UpdateCategory()
245 {
246 setCategory.Items.Clear();
247
248 var data = menu.Tag as ChartsDataModel;
249 var log = data.Data as DailyLogModel;
250 var app = log != null ? log.AppModel : null;
251
252 if (log == null)
253 {
254 app = (data.Data as HoursLogModel).AppModel;
255 }
256
257 var categories = categorys.GetCategories();
258 foreach (var category in categories)
259 {
260 var categoryMenu = new MenuItem();
261 categoryMenu.Header = category.Name;
262 categoryMenu.IsChecked = app.CategoryID == category.ID;
263 categoryMenu.Click += (s, e) =>
264 {
265 SetAppCategory(data, app.ID, category);
266 };
267 setCategory.Items.Add(categoryMenu);
268 }
269
270 setCategory.IsEnabled = setCategory.Items.Count > 0;
271
272 }
273
274 private void UpdateLinks()
275 {
276 setLink.Items.Clear();
277
278 var data = menu.Tag as ChartsDataModel;
279 var log = data.Data as DailyLogModel;
280 var app = log != null ? log.AppModel : null;
281
282 if (log == null)
283 {
284 app = (data.Data as HoursLogModel).AppModel;
285 }
286 var config = appConfig.GetConfig();
287
288 var links = config.Links;
289 foreach (var link in links)
290 {
291 var categoryMenu = new MenuItem();
292 categoryMenu.Header = link.Name;
293 categoryMenu.Click += (s, e) =>
294 {
295 SetLink(app, link.Name);
296 };
297 setLink.Items.Add(categoryMenu);
298 }
299
300 }
301 private void SetLink(AppModel app, string linkName)
302 {
303
304 var config = appConfig.GetConfig();
305 var links = config.Links;
306 var link = links.Where(m => m.ProcessList.Contains(app.Name)).FirstOrDefault();
307 if (link != null)
308 {
309 link.ProcessList.Remove(app.Name);
310 }
311
312 link = links.Where(m => m.Name == linkName).FirstOrDefault();
313 if (link != null)
314 {
315 link.ProcessList.Add(app.Name);
316 appConfig.Save();
317
318 main.Toast("关联成功", Controls.Window.ToastType.Success);
319 }
320 else
321 {
322 main.Toast("关联配置不存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.IncidentTriangle);
323 }
324 }
325 private void SetAppCategory(ChartsDataModel data, int appId, CategoryModel category)
326 {
327 var newBadgeList = new List<ChartBadgeModel>();
328 if (data.BadgeList != null)
329 {
330 var otherBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Category).ToList();
331 newBadgeList.AddRange(otherBadge);
332 }
333
334 newBadgeList.Add(new ChartBadgeModel()
335 {
336 Name = category.Name,
337 Color = category.Color,
338 Type = ChartBadgeType.Category
339 });
340
341 data.BadgeList = newBadgeList;
342
343 var app = appData.GetApp(appId);
344 app.CategoryID = category.ID;
345 app.Category = category;
346 appData.UpdateApp(app);
347
348 main.Toast("操作已执行", Controls.Window.ToastType.Success);
349 }
350
351
352
353 private void OpenDir_Click(object sender, System.Windows.RoutedEventArgs e)
354 {
355
356
357 var data = menu.Tag as ChartsDataModel;
358
359 var log = data.Data as DailyLogModel;
360 var app = log != null ? log.AppModel : null;
361
362 if (log == null)
363 {
364 app = (data.Data as HoursLogModel).AppModel;
365 }
366
367 if (File.Exists(app.File))
368 {
369 System.Diagnostics.Process.Start("explorer.exe", "/select, " + app.File);
370 }
371 else
372 {
373 main.Toast("应用文件似乎不存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.IncidentTriangle);
374 }
375 }
376
377 private void Run_Click(object sender, System.Windows.RoutedEventArgs e)
378 {
379 var data = menu.Tag as ChartsDataModel;
380
381 var log = data.Data as DailyLogModel;
382 var app = log != null ? log.AppModel : null;
383
384 if (log == null)
385 {
386 app = (data.Data as HoursLogModel).AppModel;
387 }
388
389 if (File.Exists(app.File))
390 {
391 System.Diagnostics.Process.Start(app.File);
392 main.Toast("操作已执行", Controls.Window.ToastType.Info);
393
394 }
395 else
396 {
397 main.Toast("应用文件似乎不存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.IncidentTriangle);
398 }
399 }
400
401 public ContextMenu GetContextMenu()
402 {
403 return menu;
404 }
405
406
407 }
408}