99using Nucleus . Gaming . UI ;
1010using System ;
1111using System . Collections . Generic ;
12+ using System . Diagnostics ;
1213using System . Drawing ;
14+ using System . Drawing . Drawing2D ;
1315using System . IO ;
1416using System . Linq ;
1517using System . Text . RegularExpressions ;
@@ -88,6 +90,8 @@ public HubWebView()
8890
8991 button_Panel . BackColor = BackColor ;
9092
93+ ShowThrobber ( ) ;
94+
9195 string debugUri = Path . Combine ( Application . StartupPath , $ "webview\\ debugUri.txt") ;
9296
9397 if ( File . Exists ( debugUri ) )
@@ -120,10 +124,55 @@ public HubWebView()
120124 }
121125 }
122126 }
123-
127+
124128 BuildHandlersDatas ( ) ;
125129 }
126130
131+ private PictureBox throbber ;
132+
133+ private void ShowThrobber ( )
134+ {
135+ if ( throbber == null )
136+ {
137+ throbber = new PictureBox
138+ {
139+ Size = new Size ( 50 , 50 ) ,
140+ BackColor = BackColor ,
141+ Image = ImageCache . GetImage ( Globals . ThemeFolder + "loading.gif" ) ,
142+ SizeMode = PictureBoxSizeMode . StretchImage
143+ } ;
144+
145+ throbber . LocationChanged += ThrobberLocationChanged ;
146+ Controls . Add ( throbber ) ;
147+
148+ throbber . BringToFront ( ) ;
149+ }
150+ }
151+
152+ protected void ThrobberLocationChanged ( object sender , EventArgs e )
153+ {
154+ PictureBox _throb = ( PictureBox ) sender ;
155+ using ( var gp = new GraphicsPath ( ) )
156+ {
157+ gp . AddEllipse ( new Rectangle ( 0 , 0 , _throb . Width , _throb . Height ) ) ;
158+ _throb . Region = new Region ( gp ) ;
159+ }
160+ }
161+
162+ private void ThrobberDispose ( )
163+ {
164+ if ( throbber != null )
165+ Controls . Remove ( throbber ) ;
166+ throbber ? . Dispose ( ) ;
167+ throbber = null ;
168+ }
169+
170+ private void HubWebView_Resize ( object sender , EventArgs e )
171+ {
172+ if ( throbber != null )
173+ throbber . Location = RectangleUtil . Center ( throbber . ClientRectangle , ClientRectangle ) . Location ;
174+ }
175+
127176 private void BuildHandlersDatas ( )
128177 {
129178 installedHandlers . Clear ( ) ;
@@ -146,14 +195,14 @@ private void BuildHandlersDatas()
146195 }
147196
148197 private async void OnLoad ( object sender , EventArgs e )
149- {
198+ {
150199 await InitializeAsync ( ) ;
151200 }
152201
153202 private async Task InitializeAsync ( )
154203 {
155204 try
156- {
205+ {
157206 CoreWebView2Environment environment ;
158207 CoreWebView2EnvironmentOptions environmentOptions = new CoreWebView2EnvironmentOptions ( ) ;
159208 environmentOptions . AreBrowserExtensionsEnabled = true ;
@@ -215,14 +264,45 @@ private async void WebView_CoreWebView2InitializationCompleted(object sender, Co
215264 webView . CoreWebView2 . NewWindowRequested += NewWindowRequested ;
216265 webView . CoreWebView2 . WebMessageReceived += WebMessageReceived ;
217266 webView . CoreWebView2 . ProcessFailed += ProcessFailed ;
267+ webView . CoreWebView2 . NavigationStarting += NavigationStarting ;
268+ webView . CoreWebView2 . NavigationCompleted += NavigationCompleted ;
269+
218270 webView . CoreWebView2 . Profile . PreferredColorScheme = CoreWebView2PreferredColorScheme . Dark ;
219-
271+
220272 BringToFront ( ) ;
221273 }
222274 }
223275 catch { Console . WriteLine ( "Webview init failed!" ) ; }
224276 }
225277
278+ private bool inUserBrowser ;
279+
280+ private void NavigationCompleted ( object sender , CoreWebView2NavigationCompletedEventArgs e )
281+ {
282+ if ( e . IsSuccess )
283+ inUserBrowser = false ;
284+ }
285+
286+ private void NavigationStarting ( object sender , CoreWebView2NavigationStartingEventArgs e )
287+ {
288+ CoreWebView2 currentWindow = ( CoreWebView2 ) sender ;
289+
290+ if ( ! e . Uri . StartsWith ( "https://hub.splitscreen.me/" ) )
291+ {
292+ if ( ! inUserBrowser )
293+ {
294+ Process . Start ( e . Uri ) ;
295+ inUserBrowser = true ;
296+ }
297+ else
298+ {
299+ currentWindow . Reload ( ) ;
300+ }
301+
302+ e . Cancel = true ;
303+ }
304+ }
305+
226306 private void WebMessageReceived ( object sender , CoreWebView2WebMessageReceivedEventArgs e )
227307 {
228308 Console . WriteLine ( e . WebMessageAsJson ) ;
@@ -256,6 +336,7 @@ private void DOMContentLoaded(object sender, CoreWebView2DOMContentLoadedEventAr
256336 hasFreshCahe = false ;
257337 }
258338
339+ ThrobberDispose ( ) ;
259340 webView . ZoomFactor = 0.8 ;
260341 SendDatas ( ) ;
261342 }
@@ -596,7 +677,6 @@ private void DisposeContent(object sender, EventArgs e)
596677 }
597678
598679 webView ? . Dispose ( ) ;
599- }
680+ }
600681 }
601-
602682}
0 commit comments