11use std:: {
2+ cell:: RefCell ,
23 rc:: Rc ,
34 sync:: { Mutex , MutexGuard , mpsc:: Receiver } ,
45} ;
@@ -15,7 +16,7 @@ use egui::{InputState, PointerButton, Rect, Response, Sense, Ui, Widget};
1516use helpers:: {
1617 MAX_ZOOM , MIN_ZOOM , fit_to_screen, point_to_coordinate, set_coordinate_to_pixel, show_box,
1718} ;
18- use layer:: Layer ;
19+ use layer:: { Layer , TimelineLayer } ;
1920use log:: { debug, warn} ;
2021
2122use super :: {
@@ -43,6 +44,7 @@ pub struct GeometryInfo {
4344pub struct Map {
4445 transform : Transform ,
4546 layers : Rc < Mutex < Vec < Box < dyn Layer > > > > ,
47+ timeline : Rc < RefCell < TimelineLayer > > ,
4648 recv : Rc < Receiver < MapEvent > > ,
4749 ctx : egui:: Context ,
4850 remote : Remote ,
@@ -71,7 +73,7 @@ impl Map {
7173 let screenshot_layer = layer:: ScreenshotLayer :: new ( ctx. clone ( ) ) ;
7274 let screenshot_layer_sender = screenshot_layer. get_sender ( ) ;
7375
74- let timeline_layer = layer:: TimelineLayer :: new ( ) ;
76+ let timeline = Rc :: new ( RefCell :: new ( layer:: TimelineLayer :: new ( ) ) ) ;
7577
7678 let ( send, recv) = std:: sync:: mpsc:: channel ( ) ;
7779
@@ -87,10 +89,9 @@ impl Map {
8789 Box :: new( shape_layer) ,
8890 Box :: new( command) ,
8991 Box :: new( screenshot_layer) ,
90- Box :: new( timeline_layer) ,
9192 ] ) ) ;
9293
93- let map_data_holder = Rc :: new ( MapLayerHolderImpl :: new ( layers. clone ( ) ) ) ;
94+ let map_data_holder = Rc :: new ( MapLayerHolderImpl :: new ( layers. clone ( ) , timeline . clone ( ) ) ) ;
9495
9596 let remote = Remote {
9697 layer : shape_layer_sender. clone ( ) ,
@@ -109,6 +110,7 @@ impl Map {
109110 Self {
110111 transform : Transform :: invalid ( ) ,
111112 layers,
113+ timeline,
112114 recv : recv. into ( ) ,
113115 ctx,
114116 remote : remote. clone ( ) ,
@@ -587,6 +589,8 @@ impl Widget for &mut Map {
587589 profile_scope ! ( "Layer::draw" , layer. name( ) ) ;
588590 layer. draw ( ui, & self . transform , rect) ;
589591 }
592+ profile_scope ! ( "Layer::draw" , "Timeline" ) ;
593+ self . timeline . borrow_mut ( ) . draw ( ui, & self . transform , rect) ;
590594 }
591595 }
592596 self . handle_map_events ( rect) ;
@@ -701,11 +705,12 @@ impl Map {
701705 is_playing : bool ,
702706 playback_speed : f32 ,
703707 ) {
704- if let Ok ( mut layers) = self . layers . lock ( ) {
705- for layer in layers. iter_mut ( ) {
706- layer. update_timeline ( time_range, current_interval, is_playing, playback_speed) ;
707- }
708- }
708+ self . timeline . borrow_mut ( ) . update_timeline (
709+ time_range,
710+ current_interval,
711+ is_playing,
712+ playback_speed,
713+ ) ;
709714 }
710715
711716 /// Get the current timeline interval from the timeline layer
@@ -716,88 +721,46 @@ impl Map {
716721 Option < chrono:: DateTime < chrono:: Utc > > ,
717722 Option < chrono:: DateTime < chrono:: Utc > > ,
718723 ) {
719- if let Ok ( layers) = self . layers . lock ( ) {
720- for layer in layers. iter ( ) {
721- let interval = layer. get_timeline_interval ( ) ;
722- if interval. 0 . is_some ( ) || interval. 1 . is_some ( ) {
723- return interval;
724- }
725- }
726- }
727- ( None , None )
724+ self . timeline . borrow ( ) . get_interval ( )
728725 }
729726
730727 /// Get the timeline playback state from the timeline layer
731728 #[ must_use]
732729 pub fn get_timeline_playback_state ( & self ) -> ( bool , f32 ) {
733- if let Ok ( layers) = self . layers . lock ( ) {
734- for layer in layers. iter ( ) {
735- let ( is_playing, speed) = layer. get_timeline_playback_state ( ) ;
736- if is_playing || ( speed - 1.0 ) . abs ( ) > f32:: EPSILON {
737- return ( is_playing, speed) ;
738- }
739- }
740- }
741- ( false , 1.0 )
730+ self . timeline . borrow ( ) . playback_state ( )
742731 }
743732
744733 /// Set the timeline layer visibility
745734 pub fn set_timeline_visible ( & mut self , visible : bool ) {
746- if let Ok ( mut layers) = self . layers . lock ( ) {
747- for layer in layers. iter_mut ( ) {
748- if layer. name ( ) == "Timeline" {
749- layer. set_visible ( visible) ;
750- break ;
751- }
752- }
753- }
735+ self . timeline . borrow_mut ( ) . set_visible ( visible) ;
754736 }
755737
756738 /// Check if the timeline layer is visible
757739 #[ must_use]
758740 pub fn is_timeline_visible ( & self ) -> bool {
759- if let Ok ( layers) = self . layers . lock ( ) {
760- for layer in layers. iter ( ) {
761- if layer. name ( ) == "Timeline" {
762- return layer. is_visible ( ) ;
763- }
764- }
765- }
766- false
741+ self . timeline . borrow ( ) . visible ( )
767742 }
768743
769744 /// Toggle timeline interval lock state
770745 pub fn toggle_timeline_interval_lock ( & mut self ) {
771- if let Ok ( mut layers) = self . layers . lock ( ) {
772- for layer in layers. iter_mut ( ) {
773- if layer. name ( ) == "Timeline" {
774- layer. toggle_timeline_interval_lock ( ) ;
775- return ;
776- }
777- }
778- }
746+ self . timeline . borrow_mut ( ) . toggle_interval_lock ( ) ;
779747 }
780748
781749 /// Get current timeline interval lock state
782750 #[ must_use]
783751 pub fn get_timeline_interval_lock (
784752 & self ,
785753 ) -> crate :: map:: mapvas_egui:: timeline_widget:: IntervalLock {
786- if let Ok ( layers) = self . layers . lock ( ) {
787- for layer in layers. iter ( ) {
788- if layer. name ( ) == "Timeline" {
789- return layer. get_timeline_interval_lock ( ) ;
790- }
791- }
792- }
793- crate :: map:: mapvas_egui:: timeline_widget:: IntervalLock :: None
754+ self . timeline . borrow ( ) . interval_lock ( )
794755 }
795756
796757 /// Search geometries across all layers
797758 pub fn search_geometries ( & mut self , query : & str ) {
798759 if let Ok ( mut layers) = self . layers . lock ( ) {
799760 for layer in layers. iter_mut ( ) {
800- layer. search_geometries ( query) ;
761+ if let Some ( s) = layer. as_searchable_mut ( ) {
762+ s. search_geometries ( query) ;
763+ }
801764 }
802765 }
803766 }
@@ -806,7 +769,9 @@ impl Map {
806769 pub fn next_search_result ( & mut self ) -> bool {
807770 if let Ok ( mut layers) = self . layers . lock ( ) {
808771 for layer in layers. iter_mut ( ) {
809- if layer. next_search_result ( ) {
772+ if let Some ( s) = layer. as_searchable_mut ( )
773+ && s. next_search_result ( )
774+ {
810775 return true ;
811776 }
812777 }
@@ -818,7 +783,9 @@ impl Map {
818783 pub fn previous_search_result ( & mut self ) -> bool {
819784 if let Ok ( mut layers) = self . layers . lock ( ) {
820785 for layer in layers. iter_mut ( ) {
821- if layer. previous_search_result ( ) {
786+ if let Some ( s) = layer. as_searchable_mut ( )
787+ && s. previous_search_result ( )
788+ {
822789 return true ;
823790 }
824791 }
@@ -830,7 +797,9 @@ impl Map {
830797 pub fn show_search_result_popup ( & mut self ) {
831798 if let Ok ( mut layers) = self . layers . lock ( ) {
832799 for layer in layers. iter_mut ( ) {
833- layer. show_search_result_popup ( ) ;
800+ if let Some ( s) = layer. as_searchable_mut ( ) {
801+ s. show_search_result_popup ( ) ;
802+ }
834803 }
835804 }
836805 }
@@ -839,7 +808,9 @@ impl Map {
839808 pub fn filter_geometries ( & mut self , query : & str ) {
840809 if let Ok ( mut layers) = self . layers . lock ( ) {
841810 for layer in layers. iter_mut ( ) {
842- layer. filter_geometries ( query) ;
811+ if let Some ( s) = layer. as_searchable_mut ( ) {
812+ s. filter_geometries ( query) ;
813+ }
843814 }
844815 }
845816 }
@@ -848,7 +819,9 @@ impl Map {
848819 pub fn clear_filter ( & mut self ) {
849820 if let Ok ( mut layers) = self . layers . lock ( ) {
850821 for layer in layers. iter_mut ( ) {
851- layer. clear_filter ( ) ;
822+ if let Some ( s) = layer. as_searchable_mut ( ) {
823+ s. clear_filter ( ) ;
824+ }
852825 }
853826 }
854827 }
@@ -858,9 +831,11 @@ impl Map {
858831 pub fn get_search_results_count ( & self ) -> usize {
859832 if let Ok ( layers) = self . layers . lock ( ) {
860833 for layer in layers. iter ( ) {
861- let count = layer. get_search_results_count ( ) ;
862- if count > 0 {
863- return count;
834+ if let Some ( s) = layer. as_searchable ( ) {
835+ let count = s. search_results_count ( ) ;
836+ if count > 0 {
837+ return count;
838+ }
864839 }
865840 }
866841 }
@@ -930,24 +905,49 @@ pub trait MapLayerReader {
930905
931906pub trait MapLayerHolder {
932907 fn get_reader ( & self ) -> Box < dyn MapLayerReader + ' _ > ;
908+ /// Render the timeline's sidebar UI block.
909+ fn timeline_ui ( & self , ui : & mut egui:: Ui ) ;
910+ /// Read temporal range from the timeline (used by the temporal-controls scan).
911+ fn timeline_temporal_range (
912+ & self ,
913+ ) -> (
914+ Option < chrono:: DateTime < chrono:: Utc > > ,
915+ Option < chrono:: DateTime < chrono:: Utc > > ,
916+ ) ;
933917}
934918
935- struct MapLayerHolderImpl ( Rc < Mutex < Vec < Box < dyn Layer > > > > ) ;
919+ struct MapLayerHolderImpl {
920+ layers : Rc < Mutex < Vec < Box < dyn Layer > > > > ,
921+ timeline : Rc < RefCell < TimelineLayer > > ,
922+ }
936923impl MapLayerHolderImpl {
937- fn new ( layers : Rc < Mutex < Vec < Box < dyn Layer > > > > ) -> Self {
938- Self ( layers)
924+ fn new ( layers : Rc < Mutex < Vec < Box < dyn Layer > > > > , timeline : Rc < RefCell < TimelineLayer > > ) -> Self {
925+ Self { layers, timeline }
939926 }
940927}
941928
942929impl MapLayerHolder for MapLayerHolderImpl {
943930 fn get_reader ( & self ) -> Box < dyn MapLayerReader + ' _ > {
944931 Box :: new ( MapLayerReaderImpl (
945932 self
946- . 0
933+ . layers
947934 . lock ( )
948935 . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ,
949936 ) )
950937 }
938+
939+ fn timeline_ui ( & self , ui : & mut egui:: Ui ) {
940+ self . timeline . borrow_mut ( ) . ui ( ui) ;
941+ }
942+
943+ fn timeline_temporal_range (
944+ & self ,
945+ ) -> (
946+ Option < chrono:: DateTime < chrono:: Utc > > ,
947+ Option < chrono:: DateTime < chrono:: Utc > > ,
948+ ) {
949+ self . timeline . borrow ( ) . get_temporal_range ( )
950+ }
951951}
952952
953953struct MapLayerReaderImpl < ' a > ( MutexGuard < ' a , Vec < Box < dyn Layer > > > ) ;
0 commit comments