Skip to content

Commit 37a1b5d

Browse files
committed
...
1 parent 2f28473 commit 37a1b5d

File tree

9 files changed

+2363
-297
lines changed

9 files changed

+2363
-297
lines changed

SmartImage.Linux/AppMode.cs

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
// Read S SmartImage.Linux AppMode.cs
2+
// 2023-07-05 @ 12:45 PM
3+
4+
using System.Collections.Concurrent;
5+
using System.Diagnostics;
6+
using SmartImage.Lib;
7+
using SmartImage.Lib.Results;
8+
using SmartImage.Lib.Utilities;
9+
using Spectre.Console;
10+
using Spectre.Console.Rendering;
11+
12+
namespace SmartImage.Linux;
13+
14+
public sealed class AppMode : IDisposable
15+
{
16+
public SearchClient Client { get; }
17+
18+
public SearchQuery Query { get; private set; }
19+
20+
public SearchConfig Config => Client.Config;
21+
22+
private readonly CancellationTokenSource m_cts;
23+
private readonly ConcurrentBag<SearchResult> m_results;
24+
25+
private readonly Table m_resTable;
26+
27+
private const int COMPLETE = 100;
28+
29+
internal static readonly AppMode Value = new()
30+
{ };
31+
32+
private AppMode()
33+
{
34+
Client = new SearchClient(new SearchConfig());
35+
m_results = new();
36+
m_cts = new();
37+
Query = SearchQuery.Null;
38+
39+
Client.OnComplete += OnComplete;
40+
Client.OnResult += OnResult;
41+
42+
m_resTable = new Table()
43+
{
44+
Border = TableBorder.Heavy,
45+
Title = new($"Results"),
46+
ShowFooters = true,
47+
ShowHeaders = true,
48+
};
49+
50+
m_resTable.AddColumns(new TableColumn("#"),
51+
new TableColumn("Name"),
52+
new TableColumn("Similarity"),
53+
new TableColumn("Artist"),
54+
new TableColumn("Description"),
55+
new TableColumn("Character")
56+
);
57+
}
58+
59+
void OnResult(object sender, SearchResult sr)
60+
{
61+
m_results.Add(sr);
62+
// ptMap[sr.Engine].Item1.Increment(COMPLETE);
63+
// pt1.Increment(1.0);
64+
int i = 0;
65+
66+
// var t = ptMap[sr.Engine].Item2;
67+
68+
foreach (SearchResultItem sri in sr.Results) {
69+
m_resTable.Rows.Add(new IRenderable[]
70+
{
71+
new Text($"{i + 1}"),
72+
Markup.FromInterpolated($"[link={sri.Url}]{sr.Engine.Name} #{i + 1}[/]"),
73+
Markup.FromInterpolated($"{sri.Similarity}"),
74+
Markup.FromInterpolated($"{sri.Artist}"),
75+
Markup.FromInterpolated($"{sri.Description}"),
76+
Markup.FromInterpolated($"{sri.Character}"),
77+
});
78+
79+
i++;
80+
}
81+
82+
// AnsiConsole.Write(t);
83+
}
84+
85+
private async Task RunSearchAsync()
86+
{
87+
88+
// pt1.MaxValue = m_client.Engines.Length;
89+
90+
var run = Client.RunSearchAsync(Query, token: m_cts.Token);
91+
92+
var sw = Stopwatch.StartNew();
93+
94+
var live = AConsole.Live(m_resTable)
95+
.AutoClear(false)
96+
.Overflow(VerticalOverflow.Ellipsis)
97+
.StartAsync(async (ctx) =>
98+
{
99+
while (!run.IsCompleted) {
100+
ctx.Refresh();
101+
m_resTable.Caption = new TableTitle($"{sw.Elapsed.TotalSeconds:F3}");
102+
// await Task.Delay(1000);
103+
}
104+
105+
});
106+
107+
await run;
108+
109+
await live;
110+
111+
}
112+
113+
private void OnComplete(object sender, SearchResult[] searchResults)
114+
{
115+
// pt1.Increment(COMPLETE);
116+
}
117+
118+
public async Task<object?> RunAsync(object? c)
119+
{
120+
var cstr = (string?) c;
121+
Debug.WriteLine($"Input: {cstr}");
122+
123+
await AConsole.Progress().AutoRefresh(true).StartAsync(async ctx =>
124+
{
125+
var p = ctx.AddTask("Creating query");
126+
p.IsIndeterminate = true;
127+
Query = await SearchQuery.TryCreateAsync(cstr);
128+
p.Increment(COMPLETE);
129+
ctx.Refresh();
130+
});
131+
132+
AConsole.WriteLine($"Input: {Query}");
133+
134+
await AConsole.Progress().AutoRefresh(true).StartAsync(async ctx =>
135+
{
136+
var p = ctx.AddTask("Uploading");
137+
p.IsIndeterminate = true;
138+
var url = await Query.UploadAsync();
139+
140+
if (url == null) {
141+
throw new SmartImageException(); //todo
142+
}
143+
144+
p.Increment(COMPLETE);
145+
ctx.Refresh();
146+
});
147+
148+
AConsole.MarkupLine($"[green]{Query.Upload}[/]");
149+
150+
AConsole.WriteLine($"{Config}");
151+
152+
Console.CancelKeyPress += (sender, args) =>
153+
{
154+
AConsole.MarkupLine($"[red]Cancellation requested[/]");
155+
m_cts.Cancel();
156+
args.Cancel = false;
157+
158+
Environment.Exit(-1);
159+
};
160+
161+
// await Prg_1.StartAsync(RunSearchAsync);
162+
163+
await RunSearchAsync();
164+
165+
return null;
166+
167+
}
168+
169+
public void Dispose()
170+
{
171+
foreach (var sr in m_results) {
172+
sr.Dispose();
173+
}
174+
175+
m_results.Clear();
176+
m_cts.Dispose();
177+
Client.Dispose();
178+
Query.Dispose();
179+
}
180+
}

0 commit comments

Comments
 (0)