Skip to content

Commit a4120e3

Browse files
authored
Refactoring layer (#128)
1 parent 8326fc5 commit a4120e3

5 files changed

Lines changed: 161 additions & 211 deletions

File tree

src/map/mapvas_egui.rs

Lines changed: 72 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,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

931906
pub 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+
}
936923
impl 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

942929
impl 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

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

0 commit comments

Comments
 (0)