Skip to content

Commit 55ff050

Browse files
committed
Always show app name (or alias) before tab/site title in timeline and preview, even for aliased tabs. Unified and improved App Aliases logic for all timeline displays
1 parent 463a887 commit 55ff050

4 files changed

Lines changed: 170 additions & 40 deletions

File tree

Recap/Resources/AppFilterController.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class AppFilterController : IDisposable
4242
private ToolStripMenuItem _toggleOcrItem;
4343
public event EventHandler AppHidden;
4444
public event Action<string, bool> OcrBlacklistToggled;
45+
public event Action AliasesChanged;
4546

4647
private List<MiniFrame> _currentFrames = new List<MiniFrame>();
4748
private Dictionary<int, string> _appMap = new Dictionary<int, string>();
@@ -1308,6 +1309,7 @@ private void RenameMenuItem_Click(object sender, EventArgs e)
13081309
}
13091310
RebuildAggregatedStats();
13101311
RefreshAppFilterList();
1312+
AliasesChanged?.Invoke();
13111313
}
13121314
}
13131315
}
@@ -1330,6 +1332,7 @@ private void ResetNameMenuItem_Click(object sender, EventArgs e)
13301332
}
13311333
RebuildAggregatedStats();
13321334
RefreshAppFilterList();
1335+
AliasesChanged?.Invoke();
13331336
}
13341337
}
13351338

Recap/Resources/HistoryViewController.cs

Lines changed: 84 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class HistoryViewController : IDisposable
7070
private ToolStripMenuItem _copyImageItem;
7171
private ToolStripMenuItem _viewTextItem;
7272
private DarkListBox _lstNotes;
73+
private Dictionary<string, string> _aliases = new Dictionary<string, string>();
7374

7475
public HistoryViewController(
7576
PictureBox mainPictureBox,
@@ -108,6 +109,8 @@ public HistoryViewController(
108109
_badgeToolTip = new ToolTip();
109110
GenerateIcons();
110111

112+
_aliases = _frameRepository.GetAliases();
113+
111114
_uiTimer = new System.Windows.Forms.Timer { Interval = AdvancedSettings.Instance.UiUpdateIntervalMs };
112115
_uiTimer.Tick += OnUiTimerTick;
113116
_uiTimer.Start();
@@ -118,6 +121,7 @@ public HistoryViewController(
118121

119122
_appFilterController.FilterChanged += OnAppFilterChanged;
120123
_appFilterController.AppHidden += OnAppHidden;
124+
_appFilterController.AliasesChanged += OnAliasesChanged;
121125
_appFilterController.OcrBlacklistToggled += (appName, add) => OcrBlacklistToggled?.Invoke(appName, add);
122126
_frameRepository.DataInvalidated += OnDataInvalidated;
123127
_timelineController.TimeChanged += OnTimeChanged;
@@ -319,38 +323,71 @@ private string CleanAppNameForUI(string rawName)
319323
if (string.IsNullOrEmpty(rawName)) return "";
320324

321325
var parts = rawName.Split('|');
322-
string displayName = "";
323-
324-
if (parts.Length >= 3 && parts[1].Equals("YouTube", StringComparison.OrdinalIgnoreCase))
326+
327+
string baseAppName = parts[0];
328+
if (baseAppName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
325329
{
326-
string title = parts[2];
327-
int vIndex = title.LastIndexOf(" [v=");
328-
if (vIndex > 0)
329-
{
330-
title = title.Substring(0, vIndex);
331-
}
332-
displayName = title;
330+
baseAppName = baseAppName.Substring(0, baseAppName.Length - 4);
333331
}
334-
else if (parts.Length >= 2)
332+
if (baseAppName.Length > 0 && char.IsLower(baseAppName[0]))
335333
{
336-
displayName = parts[parts.Length - 1];
334+
baseAppName = char.ToUpper(baseAppName[0]) + baseAppName.Substring(1);
337335
}
338-
else
336+
337+
if (_aliases != null && _aliases.TryGetValue(parts[0], out string rootAlias))
339338
{
340-
displayName = rawName;
339+
baseAppName = rootAlias;
341340
}
342341

343-
if (displayName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
342+
if (parts.Length == 1)
344343
{
345-
displayName = displayName.Substring(0, displayName.Length - 4);
344+
if (_aliases != null && _aliases.TryGetValue(rawName, out string exactAlias))
345+
{
346+
return exactAlias;
347+
}
348+
return baseAppName;
346349
}
347350

348-
if (displayName.Length > 0 && char.IsLower(displayName[0]) && parts.Length < 2)
351+
string tabTitle = "";
352+
353+
if (_aliases != null && _aliases.TryGetValue(rawName, out string exactAliasTab))
349354
{
350-
displayName = char.ToUpper(displayName[0]) + displayName.Substring(1);
355+
tabTitle = exactAliasTab;
351356
}
357+
else
358+
{
359+
string defaultTabTitle = "";
360+
if (parts.Length >= 3 && parts[1].Equals("YouTube", StringComparison.OrdinalIgnoreCase))
361+
{
362+
string title = parts[2];
363+
int vIndex = title.LastIndexOf(" [v=");
364+
if (vIndex > 0)
365+
{
366+
title = title.Substring(0, vIndex);
367+
}
368+
defaultTabTitle = title;
369+
}
370+
else
371+
{
372+
defaultTabTitle = parts[parts.Length - 1];
373+
}
352374

353-
return displayName;
375+
if (_aliases != null && parts.Length >= 3)
376+
{
377+
string twoPartKey = $"{parts[0]}|{parts[1]}";
378+
if (_aliases.TryGetValue(twoPartKey, out string twoPartAlias))
379+
{
380+
tabTitle = $"{twoPartAlias} - {defaultTabTitle}";
381+
}
382+
}
383+
384+
if (string.IsNullOrEmpty(tabTitle))
385+
{
386+
tabTitle = defaultTabTitle;
387+
}
388+
}
389+
390+
return $"{baseAppName} - {tabTitle}";
354391
}
355392

356393
private async void OnSearchKeyDown(object sender, KeyEventArgs e)
@@ -747,6 +784,33 @@ private void OnAppHidden(object sender, EventArgs e)
747784
OnDataInvalidated(sender, e);
748785
}
749786

787+
private void OnAliasesChanged()
788+
{
789+
_aliases = _frameRepository.GetAliases();
790+
_timelineController.ReloadAliases();
791+
792+
if (_wantedFrameIndex != -1 && _dataManager.FilteredFrames != null && _wantedFrameIndex < _dataManager.FilteredFrames.Count)
793+
{
794+
var miniFrame = _dataManager.FilteredFrames[_wantedFrameIndex];
795+
string rawAppName = "";
796+
if (_dataManager.AppMap.TryGetValue(miniFrame.AppId, out string name))
797+
{
798+
rawAppName = name;
799+
}
800+
else
801+
{
802+
var frameData = _frameRepository.GetFrameIndex(miniFrame.TimestampTicks);
803+
if (frameData.TimestampTicks != 0)
804+
{
805+
rawAppName = frameData.AppName;
806+
}
807+
}
808+
Image appIcon = _iconManager.GetIcon(rawAppName);
809+
string cleanName = CleanAppNameForUI(rawAppName);
810+
_timelineController.UpdateCurrentApp(cleanName, appIcon);
811+
}
812+
}
813+
750814
private void OnDataInvalidated(object sender, EventArgs e)
751815
{
752816
if (_mainPictureBox.InvokeRequired)
@@ -940,6 +1004,7 @@ public void Dispose()
9401004
{
9411005
_appFilterController.FilterChanged -= OnAppFilterChanged;
9421006
_appFilterController.AppHidden -= OnAppHidden;
1007+
_appFilterController.AliasesChanged -= OnAliasesChanged;
9431008
_appFilterController.Dispose();
9441009
}
9451010
if (_frameRepository != null)

Recap/Resources/TimelineController.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ public TimelineController(
5959
}
6060
}
6161

62+
public void ReloadAliases()
63+
{
64+
_previewManager?.ReloadAliases();
65+
}
66+
6267
public int CurrentIndex
6368
{
6469
get => _timeTrackBar.Value;

Recap/Resources/TimelinePreviewManager.cs

Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Drawing;
34
using System.Drawing.Drawing2D;
45
using System.IO;
@@ -13,17 +14,24 @@ public class TimelinePreviewManager : IDisposable
1314
private readonly IconManager _iconManager;
1415
private readonly PreviewPopup _previewPopup;
1516

17+
public void ReloadAliases()
18+
{
19+
_aliases = _frameRepository.GetAliases();
20+
}
21+
1622
private int PreviewWidth => AdvancedSettings.Instance.PreviewWidth;
1723
private int PreviewHeight => AdvancedSettings.Instance.PreviewHeight;
1824

1925
private MiniFrame? _nextFrameToLoad = null;
2026
private bool _isWorkerRunning = false;
2127
private readonly object _workerLock = new object();
28+
private Dictionary<string, string> _aliases = new Dictionary<string, string>();
2229

2330
public TimelinePreviewManager(FrameRepository frameRepository, IconManager iconManager)
2431
{
2532
_frameRepository = frameRepository;
2633
_iconManager = iconManager;
34+
_aliases = _frameRepository.GetAliases();
2735
_previewPopup = new PreviewPopup(PreviewWidth, PreviewHeight);
2836
}
2937

@@ -153,25 +161,15 @@ private string CleanAppName(string rawName)
153161
if (string.IsNullOrEmpty(rawName)) return "";
154162

155163
var parts = rawName.Split('|');
156-
string displayName = "";
157-
158-
if (parts.Length >= 3 && parts[1].Equals("YouTube", StringComparison.OrdinalIgnoreCase))
159-
{
160-
string title = parts[2];
161-
int vIndex = title.LastIndexOf(" [v=");
162-
if (vIndex > 0)
163-
{
164-
title = title.Substring(0, vIndex);
165-
}
166-
displayName = title;
167-
}
168-
else if (parts.Length >= 2)
164+
165+
string baseAppName = parts[0];
166+
if (baseAppName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
169167
{
170-
displayName = parts[parts.Length - 1];
168+
baseAppName = baseAppName.Substring(0, baseAppName.Length - 4);
171169
}
172-
else
170+
if (baseAppName.Length > 0 && char.IsLower(baseAppName[0]))
173171
{
174-
displayName = parts[0].Replace(".exe", "");
172+
baseAppName = char.ToUpper(baseAppName[0]) + baseAppName.Substring(1);
175173
}
176174

177175
string[] suffixesToRemove = new[]
@@ -188,17 +186,76 @@ private string CleanAppName(string rawName)
188186

189187
foreach (var s in suffixesToRemove)
190188
{
191-
if (displayName.EndsWith(s, StringComparison.OrdinalIgnoreCase))
189+
if (baseAppName.EndsWith(s, StringComparison.OrdinalIgnoreCase))
190+
baseAppName = baseAppName.Substring(0, baseAppName.Length - s.Length);
191+
else if (s == "● " && baseAppName.StartsWith(s))
192+
baseAppName = baseAppName.Substring(s.Length);
193+
}
194+
baseAppName = baseAppName.Trim();
195+
196+
if (_aliases != null && _aliases.TryGetValue(parts[0], out string rootAlias))
197+
{
198+
baseAppName = rootAlias;
199+
}
200+
201+
if (parts.Length == 1)
202+
{
203+
if (_aliases != null && _aliases.TryGetValue(rawName, out string exactAlias))
204+
{
205+
return exactAlias;
206+
}
207+
return baseAppName;
208+
}
209+
210+
string tabTitle = "";
211+
212+
if (_aliases != null && _aliases.TryGetValue(rawName, out string exactAliasTab))
213+
{
214+
tabTitle = exactAliasTab;
215+
}
216+
else
217+
{
218+
string defaultTabTitle = "";
219+
if (parts.Length >= 3 && parts[1].Equals("YouTube", StringComparison.OrdinalIgnoreCase))
220+
{
221+
string title = parts[2];
222+
int vIndex = title.LastIndexOf(" [v=");
223+
if (vIndex > 0)
224+
{
225+
title = title.Substring(0, vIndex);
226+
}
227+
defaultTabTitle = title;
228+
}
229+
else
192230
{
193-
displayName = displayName.Substring(0, displayName.Length - s.Length);
231+
defaultTabTitle = parts[parts.Length - 1];
194232
}
195-
else if (s == "● " && displayName.StartsWith(s))
233+
234+
foreach (var s in suffixesToRemove)
235+
{
236+
if (defaultTabTitle.EndsWith(s, StringComparison.OrdinalIgnoreCase))
237+
defaultTabTitle = defaultTabTitle.Substring(0, defaultTabTitle.Length - s.Length);
238+
else if (s == "● " && defaultTabTitle.StartsWith(s))
239+
defaultTabTitle = defaultTabTitle.Substring(s.Length);
240+
}
241+
defaultTabTitle = defaultTabTitle.Trim();
242+
243+
if (_aliases != null && parts.Length >= 3)
244+
{
245+
string twoPartKey = $"{parts[0]}|{parts[1]}";
246+
if (_aliases.TryGetValue(twoPartKey, out string twoPartAlias))
247+
{
248+
tabTitle = $"{twoPartAlias} - {defaultTabTitle}";
249+
}
250+
}
251+
252+
if (string.IsNullOrEmpty(tabTitle))
196253
{
197-
displayName = displayName.Substring(s.Length);
254+
tabTitle = defaultTabTitle;
198255
}
199256
}
200257

201-
return displayName.Trim();
258+
return $"{baseAppName} - {tabTitle}";
202259
}
203260

204261
private Point CalculatePopupPosition(Control trackBar, int mouseX)

0 commit comments

Comments
 (0)