@@ -33,6 +33,7 @@ use crate::gui::pages::settings_style_page::settings_style_page;
3333use crate :: gui:: pages:: thumbnail_page:: thumbnail_page;
3434use crate :: gui:: pages:: types:: running_page:: RunningPage ;
3535use crate :: gui:: pages:: types:: settings_page:: SettingsPage ;
36+ use crate :: gui:: pages:: welcome_page:: welcome_page;
3637use crate :: gui:: styles:: types:: custom_palette:: { CustomPalette , ExtraStyles } ;
3738use crate :: gui:: styles:: types:: palette:: Palette ;
3839use crate :: gui:: types:: conf:: Conf ;
@@ -77,6 +78,8 @@ pub const ICON_FONT_FAMILY_NAME: &str = "Icons for Sniffnet";
7778pub struct Sniffer {
7879 /// Parameters that are persistent across runs
7980 pub conf : Conf ,
81+ /// Are we during welcome / quit animation? None if not, true if welcome, false if quit
82+ pub welcome : Option < ( bool , u8 ) > ,
8083 /// Capture receiver clone (to close the channel after every run), with the current capture id (to ignore pending messages from previous captures)
8184 pub current_capture_rx : ( usize , Option < Receiver < BackendTrafficMessage > > ) ,
8285 /// Capture data
@@ -140,6 +143,7 @@ impl Sniffer {
140143 let capture_source = CaptureSource :: from_conf ( & conf) ;
141144 Self {
142145 conf,
146+ welcome : Some ( ( true , 0 ) ) ,
143147 current_capture_rx : ( 0 , None ) ,
144148 info_traffic : InfoTraffic :: default ( ) ,
145149 addresses_resolved : HashMap :: new ( ) ,
@@ -173,6 +177,10 @@ impl Sniffer {
173177 fn keyboard_subscription ( & self ) -> Subscription < Message > {
174178 const NO_MODIFIER : Modifiers = Modifiers :: empty ( ) ;
175179
180+ if self . welcome . is_some ( ) {
181+ return Subscription :: none ( ) ;
182+ }
183+
176184 if self . thumbnail {
177185 iced:: event:: listen_with ( |event, _, _| match event {
178186 Keyboard ( Event :: KeyPressed {
@@ -231,8 +239,17 @@ impl Sniffer {
231239 }
232240 }
233241
234- fn time_subscription ( ) -> Subscription < Message > {
235- iced:: time:: every ( Duration :: from_millis ( 1000 ) ) . map ( |_| Message :: Periodic )
242+ fn time_subscription ( & self ) -> Subscription < Message > {
243+ if let Some ( ( w, _) ) = self . welcome {
244+ let sub = iced:: time:: every ( Duration :: from_millis ( 100 ) ) ;
245+ if w {
246+ sub. map ( |_| Message :: Welcome )
247+ } else {
248+ sub. map ( |_| Message :: Quit )
249+ }
250+ } else {
251+ iced:: time:: every ( Duration :: from_millis ( 1000 ) ) . map ( |_| Message :: Periodic )
252+ }
236253 }
237254
238255 fn window_subscription ( ) -> Subscription < Message > {
@@ -430,8 +447,24 @@ impl Sniffer {
430447 }
431448 Message :: QuitWrapper => return self . quit_wrapper ( ) ,
432449 Message :: Quit => {
433- let _ = self . conf . clone ( ) . store ( ) ;
434- return window:: close ( self . id . unwrap_or_else ( Id :: unique) ) ;
450+ if self . welcome . is_none ( ) {
451+ self . welcome = Some ( ( false , 13 ) ) ;
452+ } else if let Some ( ( false , x) ) = self . welcome {
453+ if x <= 2 {
454+ let _ = self . conf . clone ( ) . store ( ) ;
455+ return window:: close ( self . id . unwrap_or_else ( Id :: unique) ) ;
456+ }
457+ self . welcome = Some ( ( false , x. saturating_sub ( 1 ) ) ) ;
458+ }
459+ }
460+ Message :: Welcome => {
461+ if let Some ( ( true , x) ) = self . welcome {
462+ if x >= 19 {
463+ self . welcome = None ;
464+ } else {
465+ self . welcome = Some ( ( true , x + 1 ) ) ;
466+ }
467+ }
435468 }
436469 Message :: CopyIp ( ip) => {
437470 self . timing_events . copy_ip_now ( ip) ;
@@ -595,6 +628,10 @@ impl Sniffer {
595628 let font = style. get_extension ( ) . font ;
596629 let font_headers = style. get_extension ( ) . font_headers ;
597630
631+ if let Some ( ( _, x) ) = self . welcome {
632+ return welcome_page ( font, x) . into ( ) ;
633+ }
634+
598635 let header = header ( self ) ;
599636
600637 let body = if self . thumbnail {
@@ -676,7 +713,7 @@ impl Sniffer {
676713 Subscription :: batch ( [
677714 self . keyboard_subscription ( ) ,
678715 self . mouse_subscription ( ) ,
679- Sniffer :: time_subscription ( ) ,
716+ self . time_subscription ( ) ,
680717 Sniffer :: window_subscription ( ) ,
681718 ] )
682719 }
@@ -1895,7 +1932,8 @@ mod tests {
18951932 sniffer. update ( Message :: ChangeRunningPage ( RunningPage :: Notifications ) ) ;
18961933 sniffer. update ( Message :: DataReprSelection ( DataRepr :: Bits ) ) ;
18971934
1898- // quit the app by sending a CloseRequested message
1935+ // force saving configs by quitting the app
1936+ sniffer. welcome = Some ( ( false , 0 ) ) ;
18991937 sniffer. update ( Message :: Quit ) ;
19001938
19011939 assert ! ( path. exists( ) ) ;
0 commit comments