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