Skip to content

Commit 8d2e23d

Browse files
committed
Refactoring layer
1 parent 0d62ce0 commit 8d2e23d

5 files changed

Lines changed: 162 additions & 211 deletions

File tree

src/map/mapvas_egui.rs

Lines changed: 73 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use 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};
1516
use 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};
1920
use log::{debug, warn};
2021

2122
use super::{
@@ -43,6 +44,7 @@ pub struct GeometryInfo {
4344
pub 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,10 @@ 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
709+
.timeline
710+
.borrow_mut()
711+
.update_timeline(time_range, current_interval, is_playing, playback_speed);
709712
}
710713

711714
/// Get the current timeline interval from the timeline layer
@@ -716,88 +719,46 @@ impl Map {
716719
Option<chrono::DateTime<chrono::Utc>>,
717720
Option<chrono::DateTime<chrono::Utc>>,
718721
) {
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)
722+
self.timeline.borrow().get_interval()
728723
}
729724

730725
/// Get the timeline playback state from the timeline layer
731726
#[must_use]
732727
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)
728+
self.timeline.borrow().playback_state()
742729
}
743730

744731
/// Set the timeline layer visibility
745732
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-
}
733+
self.timeline.borrow_mut().set_visible(visible);
754734
}
755735

756736
/// Check if the timeline layer is visible
757737
#[must_use]
758738
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
739+
self.timeline.borrow().visible()
767740
}
768741

769742
/// Toggle timeline interval lock state
770743
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-
}
744+
self.timeline.borrow_mut().toggle_interval_lock();
779745
}
780746

781747
/// Get current timeline interval lock state
782748
#[must_use]
783749
pub fn get_timeline_interval_lock(
784750
&self,
785751
) -> 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
752+
self.timeline.borrow().interval_lock()
794753
}
795754

796755
/// Search geometries across all layers
797756
pub fn search_geometries(&mut self, query: &str) {
798757
if let Ok(mut layers) = self.layers.lock() {
799758
for layer in layers.iter_mut() {
800-
layer.search_geometries(query);
759+
if let Some(s) = layer.as_searchable_mut() {
760+
s.search_geometries(query);
761+
}
801762
}
802763
}
803764
}
@@ -806,7 +767,9 @@ impl Map {
806767
pub fn next_search_result(&mut self) -> bool {
807768
if let Ok(mut layers) = self.layers.lock() {
808769
for layer in layers.iter_mut() {
809-
if layer.next_search_result() {
770+
if let Some(s) = layer.as_searchable_mut()
771+
&& s.next_search_result()
772+
{
810773
return true;
811774
}
812775
}
@@ -818,7 +781,9 @@ impl Map {
818781
pub fn previous_search_result(&mut self) -> bool {
819782
if let Ok(mut layers) = self.layers.lock() {
820783
for layer in layers.iter_mut() {
821-
if layer.previous_search_result() {
784+
if let Some(s) = layer.as_searchable_mut()
785+
&& s.previous_search_result()
786+
{
822787
return true;
823788
}
824789
}
@@ -830,7 +795,9 @@ impl Map {
830795
pub fn show_search_result_popup(&mut self) {
831796
if let Ok(mut layers) = self.layers.lock() {
832797
for layer in layers.iter_mut() {
833-
layer.show_search_result_popup();
798+
if let Some(s) = layer.as_searchable_mut() {
799+
s.show_search_result_popup();
800+
}
834801
}
835802
}
836803
}
@@ -839,7 +806,9 @@ impl Map {
839806
pub fn filter_geometries(&mut self, query: &str) {
840807
if let Ok(mut layers) = self.layers.lock() {
841808
for layer in layers.iter_mut() {
842-
layer.filter_geometries(query);
809+
if let Some(s) = layer.as_searchable_mut() {
810+
s.filter_geometries(query);
811+
}
843812
}
844813
}
845814
}
@@ -848,7 +817,9 @@ impl Map {
848817
pub fn clear_filter(&mut self) {
849818
if let Ok(mut layers) = self.layers.lock() {
850819
for layer in layers.iter_mut() {
851-
layer.clear_filter();
820+
if let Some(s) = layer.as_searchable_mut() {
821+
s.clear_filter();
822+
}
852823
}
853824
}
854825
}
@@ -858,9 +829,11 @@ impl Map {
858829
pub fn get_search_results_count(&self) -> usize {
859830
if let Ok(layers) = self.layers.lock() {
860831
for layer in layers.iter() {
861-
let count = layer.get_search_results_count();
862-
if count > 0 {
863-
return count;
832+
if let Some(s) = layer.as_searchable() {
833+
let count = s.search_results_count();
834+
if count > 0 {
835+
return count;
836+
}
864837
}
865838
}
866839
}
@@ -930,24 +903,52 @@ pub trait MapLayerReader {
930903

931904
pub trait MapLayerHolder {
932905
fn get_reader(&self) -> Box<dyn MapLayerReader + '_>;
906+
/// Render the timeline's sidebar UI block.
907+
fn timeline_ui(&self, ui: &mut egui::Ui);
908+
/// Read temporal range from the timeline (used by the temporal-controls scan).
909+
fn timeline_temporal_range(
910+
&self,
911+
) -> (
912+
Option<chrono::DateTime<chrono::Utc>>,
913+
Option<chrono::DateTime<chrono::Utc>>,
914+
);
933915
}
934916

935-
struct MapLayerHolderImpl(Rc<Mutex<Vec<Box<dyn Layer>>>>);
917+
struct MapLayerHolderImpl {
918+
layers: Rc<Mutex<Vec<Box<dyn Layer>>>>,
919+
timeline: Rc<RefCell<TimelineLayer>>,
920+
}
936921
impl MapLayerHolderImpl {
937-
fn new(layers: Rc<Mutex<Vec<Box<dyn Layer>>>>) -> Self {
938-
Self(layers)
922+
fn new(
923+
layers: Rc<Mutex<Vec<Box<dyn Layer>>>>,
924+
timeline: Rc<RefCell<TimelineLayer>>,
925+
) -> Self {
926+
Self { layers, timeline }
939927
}
940928
}
941929

942930
impl MapLayerHolder for MapLayerHolderImpl {
943931
fn get_reader(&self) -> Box<dyn MapLayerReader + '_> {
944932
Box::new(MapLayerReaderImpl(
945933
self
946-
.0
934+
.layers
947935
.lock()
948936
.unwrap_or_else(std::sync::PoisonError::into_inner),
949937
))
950938
}
939+
940+
fn timeline_ui(&self, ui: &mut egui::Ui) {
941+
self.timeline.borrow_mut().ui(ui);
942+
}
943+
944+
fn timeline_temporal_range(
945+
&self,
946+
) -> (
947+
Option<chrono::DateTime<chrono::Utc>>,
948+
Option<chrono::DateTime<chrono::Utc>>,
949+
) {
950+
self.timeline.borrow().get_temporal_range()
951+
}
951952
}
952953

953954
struct MapLayerReaderImpl<'a>(MutexGuard<'a, Vec<Box<dyn Layer>>>);

0 commit comments

Comments
 (0)