From 18b7d2d3d86fcd3c6cbd98117269a7b0eebb00b9 Mon Sep 17 00:00:00 2001 From: Tsuki Date: Tue, 19 Mar 2024 18:37:13 +0800 Subject: [PATCH] sync --- src/actions.rs | 6 + src/components/app.rs | 9 +- src/components/monitor/monitor.rs | 2 +- src/css/style.css | 3 - src/data_utils.rs | 10 +- src/main.rs | 11 +- src/map_tile.rs | 2 +- src/pipeline/element.rs | 104 +++++++++--------- src/pipeline/new_pipeline.rs | 12 +- .../predefined/grid_field_renderer.rs | 8 +- src/pipeline/utils.rs | 8 +- src/widgets/render/imp.rs | 15 ++- src/widgets/render/interior/layers.rs | 49 ++++----- src/widgets/render/mod.rs | 5 +- .../render/predefined/grid_field_renderer.rs | 4 +- 15 files changed, 128 insertions(+), 120 deletions(-) create mode 100644 src/actions.rs delete mode 100644 src/css/style.css diff --git a/src/actions.rs b/src/actions.rs new file mode 100644 index 0000000..85fa05c --- /dev/null +++ b/src/actions.rs @@ -0,0 +1,6 @@ +use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt}; +use relm4::actions::{AccelsPlus, ActionablePlus, RelmAction, RelmActionGroup}; +use relm4::{ComponentParts, ComponentSender, RelmApp, RelmWidgetExt, SimpleComponent}; + +relm4::new_action_group!(LayerActionGroup, "layer"); +relm4::new_stateful_action!(AddLayerAction, LayerActionGroup, "add", u8, u8); diff --git a/src/components/app.rs b/src/components/app.rs index 94b76cb..2830214 100644 --- a/src/components/app.rs +++ b/src/components/app.rs @@ -5,7 +5,6 @@ use super::{ setting::SettingModel, ControlPanelOutputMsg, TimelineMsg, }; -use crate::data_utils::plugin_result_impl; use crate::pipeline::element::{ Element, InstantElement, InstantElementDrawerType, TimeSeriesElement, }; @@ -24,6 +23,7 @@ use crate::{ widgets::render::Layer, CONFIG, PLUGIN_MANAGER, }; +use crate::{data_utils::plugin_result_impl, pipeline::element::DataTarget}; use abi_stable::std_types::RStr; use adw::prelude::*; use chrono::{prelude::*, Duration}; @@ -228,11 +228,10 @@ impl Component for AppModel { let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap(); let mut canvas = renderer.create_canvas(); let mut dialog_cms = CMS::new(Mercator::default().into(), (3000.0, 3000.0)); - let mut data_target = element_impl.render(&data, &mut canvas, &mut dialog_cms); - data_target.data = Some(Arc::new(data) as Arc); - + let data_target = element_impl.render(&data, &mut canvas, &mut dialog_cms); + let data_target = DataTarget::new(Some(data), data_target); let element = Element::create_instant( - InstantElementDrawerType::Prepared((data_target, Arc::new(element_impl))), + InstantElementDrawerType::Prepared((data_target, element_impl)), dialog_dispatcher.clone(), "ET".to_string(), ) diff --git a/src/components/monitor/monitor.rs b/src/components/monitor/monitor.rs index f5feab5..bb39641 100644 --- a/src/components/monitor/monitor.rs +++ b/src/components/monitor/monitor.rs @@ -161,7 +161,7 @@ impl Component for MonitorModel { let current_rate = widgets.renderer.scale_rate(); self.set_render_range((lat_start, lat_end, lon_start, lon_end)); let new_rate = widgets.renderer.scale_rate(); - let zoom: f64 = (current_rate / new_rate).log2(); + let zoom: f64 = (new_rate / current_rate).log2(); sender.input(MonitorInputMsg::ChangeZoom(zoom)); } MonitorInputMsg::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems), diff --git a/src/css/style.css b/src/css/style.css deleted file mode 100644 index 6ca35c8..0000000 --- a/src/css/style.css +++ /dev/null @@ -1,3 +0,0 @@ -button { - color: magenta; -} \ No newline at end of file diff --git a/src/data_utils.rs b/src/data_utils.rs index 0e61ab2..1975140 100644 --- a/src/data_utils.rs +++ b/src/data_utils.rs @@ -1,14 +1,15 @@ -use radarg_plugin_interface::{CoordType, PluginResult, PluginResultType}; use crate::pipeline::element::ElementImpl; use crate::pipeline::GridElementImpl; use crate::utils::*; +use radarg_plugin_interface::{CoordType, PluginResult, PluginResultType}; +use std::sync::Arc; macro_rules! data_to_grid { ($_type:ident,$(($branch:path ,$boundary_norm: expr)),+) => { match $_type { $( $branch => { let element_impl = GridElementImpl::new($boundary_norm); - Box::new(element_impl) + Arc::new(element_impl) } ),+ _ => panic!("Invalid type") @@ -16,8 +17,8 @@ macro_rules! data_to_grid { }; } -pub fn plugin_result_impl(a: &PluginResult) -> Box { - let block= a.blocks.first().unwrap(); +pub fn plugin_result_impl(a: &PluginResult) -> Arc { + let block = a.blocks.first().unwrap(); match block.coord_type { CoordType::Cartesian => { let _type = block.data_type; @@ -41,4 +42,3 @@ pub fn plugin_result_impl(a: &PluginResult) -> Box { } } } - diff --git a/src/main.rs b/src/main.rs index 28f5b80..e49c2d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,6 +12,7 @@ use gtk::{ use plugin_system::{init_plugin, PluginManager}; use std::{ptr, sync::Mutex}; use tokio::runtime::Runtime; +mod actions; mod chart; mod components; mod config; @@ -20,13 +21,13 @@ mod data; mod errors; mod pipeline; mod plugin_system; +use crate::components::app::AppMsg; use components::app::AppModel; use once_cell::{sync::Lazy as SafeLazy, unsync::Lazy as UnsafeLazy}; use relm4::RelmApp; use surfman::declare_surfman; use tracing::info; use tracing_subscriber; -use crate::components::app::AppMsg; mod data_utils; mod map_tile; @@ -67,12 +68,8 @@ fn main() { }); } - - - let app = adw::Application::builder() - .application_id(APP_ID) - .build(); - let relm:RelmApp = relm4::RelmApp::from_app(app.clone()); + let app = adw::Application::builder().application_id(APP_ID).build(); + let relm: RelmApp = relm4::RelmApp::from_app(app.clone()); relm4_icons::initialize_icons(); info!("Init plugin system"); let pluginmanager = PluginManager::new(); diff --git a/src/map_tile.rs b/src/map_tile.rs index 46fa738..b4ba2eb 100644 --- a/src/map_tile.rs +++ b/src/map_tile.rs @@ -144,7 +144,7 @@ impl MapTile { (origin.lon() as f64..rb.lon() as f64).into(), (origin.lat() as f64..rb.lat() as f64).into(), ); - let result = Target::new(TargetType::Mem(result), 256.0, 256.0, bounds, None,None); + let result = Target::new(TargetType::Mem(result), 256.0, 256.0, bounds, None); let cache = cache.lock().unwrap(); cache.insert(tile, Arc::new(std::sync::Mutex::new(result))); } diff --git a/src/pipeline/element.rs b/src/pipeline/element.rs index b1f7924..508add9 100644 --- a/src/pipeline/element.rs +++ b/src/pipeline/element.rs @@ -17,6 +17,7 @@ use std::any::Any; use std::borrow::Borrow; use std::collections::{BTreeMap, HashMap}; use std::fmt::Formatter; +use std::ops::{Deref, DerefMut}; use std::rc::Rc; use std::sync::atomic::AtomicUsize; use std::{ @@ -48,7 +49,7 @@ pub enum Element { impl Element { pub fn create_time_series( - imp: Arc>, + imp: Arc, dispatcher: Rc, key: String, cms: CMS, @@ -95,7 +96,7 @@ pub struct TimeSeriesElement { pub id: ElementID, pub key: String, cms: CMS, - imp: Arc>, + imp: Arc, registers: Arc, Vec>>>>, pipeline: Pipeline, pub buffer: Buffer, @@ -105,7 +106,7 @@ pub struct TimeSeriesElement { #[derive(Clone)] pub enum InstantElementDrawerType { Draw(DrawFunc), - Prepared((Target, Arc>)), + Prepared((DataTarget, Arc)), } impl Debug for InstantElementDrawerType { @@ -141,33 +142,7 @@ impl InstantElement { func(render); } InstantElementDrawerType::Prepared((ref mut target, _)) => { - let mut canvas = render.get_canvas(); - let mut canvas = canvas.as_mut().unwrap(); - let (ox, oy) = target.origin(render); - let (x, y) = target.size(render); - - let result_id = match target.target { - TargetType::ImageId(id) => id, - TargetType::Mem(ref mem) => { - let gl_bind = render.get_context(); - let gl = gl_bind.as_ref().unwrap(); - let flags = ImageFlags::empty(); - let texture = target.mem_to_native_texture(gl, flags); - let converted = canvas - .create_image_from_native_texture( - texture, - ImageInfo::new(flags, 3000, 3000, PixelFormat::Rgba8), - ) - .unwrap(); - target.set_target(TargetType::ImageId(converted)); - converted - } - }; - - let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, 1.0); - let mut path = femtovg::Path::new(); - path.rect(ox, oy, x, y); - canvas.fill_path(&path, &paint); + render.draw_img(target); } } } @@ -178,14 +153,9 @@ impl InstantElement { cms: CMS, ) -> (TimeSeriesElement, DateTime) { // let imp = Arc::new(InstantElementImpl::new(self)); - if let InstantElementDrawerType::Prepared((target, imp)) = self.draw_type { + if let InstantElementDrawerType::Prepared((mut target, imp)) = self.draw_type { let mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key); - let data = target - .data - .clone() - .unwrap() - .downcast::() - .unwrap(); + let data = target.take_data().unwrap(); let time_stamp = data.blocks.first().unwrap().datetime; let meta_info: MetaInfo = data.meta.clone().into(); use chrono::prelude::*; @@ -202,12 +172,7 @@ impl InstantElement { } impl TimeSeriesElement { - fn new( - imp: Arc>, - dispatcher: Rc, - cms: CMS, - key: String, - ) -> Self { + fn new(imp: Arc, dispatcher: Rc, cms: CMS, key: String) -> Self { let id = ELEMENT_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed); let mut pipeline = Pipeline::new(20, key.clone()); pipeline.set_dispatcher(dispatcher.clone()); @@ -329,12 +294,12 @@ impl TimeSeriesElement { #[derive(Debug, Clone)] pub struct RenderResult { - target: Target, + target: DataTarget, meta_info: MetaInfo, } impl RenderResult { - pub fn new(target: Target, meta_info: MetaInfo) -> Self { + pub fn new(target: DataTarget, meta_info: MetaInfo) -> Self { Self { target, meta_info } } @@ -354,13 +319,14 @@ pub struct Target { pub width: f32, pub height: f32, pub bounds: (Range, Range), - pub data: Option>, + // pub data: Option>, } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)] pub enum TargetType { ImageId(ImageId), Mem(Vec), + NativeBuffer(Vec), } impl Target { @@ -370,7 +336,7 @@ impl Target { height: f32, bounds: (Range, Range), thumbnail: Option, - data: Option>, + // data: Option>, ) -> Self { Self { target, @@ -378,7 +344,7 @@ impl Target { height, bounds, thumbnail, - data, + // data, } } @@ -394,12 +360,12 @@ impl Target { ((x2 - x1).abs(), (y2 - y1).abs()) } - pub fn mem_to_native_texture( + pub fn native_buffer_to_native_texture( &self, gl: &glow::Context, flags: ImageFlags, ) -> glow::NativeTexture { - if let TargetType::Mem(ref mem) = self.target { + if let TargetType::NativeBuffer(ref mem) = self.target { use glow::*; let texture = unsafe { let id = gl.create_texture().unwrap(); @@ -549,3 +515,41 @@ impl Target { self.target = target; } } + +#[derive(Debug, Clone)] +pub struct DataTarget { + data: Option, + target: Target, +} + +impl DataTarget { + pub fn new(data: Option, target: Target) -> Self { + Self { data, target } + } + + pub fn take_data(&mut self) -> Option { + self.data.take() + } + + pub fn data(&self) -> Option<&PluginResult> { + self.data.as_ref() + } + + pub fn mut_data(&mut self) -> Option<&mut PluginResult> { + self.data.as_mut() + } +} + +impl Deref for DataTarget { + type Target = Target; + + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl DerefMut for DataTarget { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.target + } +} diff --git a/src/pipeline/new_pipeline.rs b/src/pipeline/new_pipeline.rs index 55af127..4f24658 100644 --- a/src/pipeline/new_pipeline.rs +++ b/src/pipeline/new_pipeline.rs @@ -1,6 +1,6 @@ use super::{ dispatcher::Dispatcher, - element::RenderResult, + element::{DataTarget, RenderResult}, offscreen_renderer::{CanvasWrapper, OffscreenRenderer}, utils::data_to_element, }; @@ -16,6 +16,7 @@ use crate::{ use chrono::prelude::*; use femtovg::{renderer::OpenGl, Canvas, ImageId}; use futures::{future::BoxFuture, Future}; +use radarg_plugin_interface::PluginResult; use smallvec::SmallVec; use std::fmt::{Debug, Formatter}; use std::{ @@ -23,7 +24,6 @@ use std::{ rc::Rc, sync::{Arc, Mutex}, }; -use radarg_plugin_interface::PluginResult; use tokio::{ sync::{mpsc, oneshot}, task, @@ -84,7 +84,7 @@ impl Pipeline { current_time: DateTime, check_existed: bool, max_retry_time: usize, - task: Arc Target + Send + Sync>, + task: Arc Target + Send + Sync>, cms: CMS, ) -> Option>> { let paths = { @@ -123,7 +123,7 @@ impl Pipeline { fn worker( &self, datetime: DateTime, - task: Arc Target + Send + Sync>, + task: Arc Target + Send + Sync>, mut cms: CMS, path: impl AsRef + Send + 'static, ) -> BoxFuture<'static, RenderR> { @@ -135,8 +135,8 @@ impl Pipeline { let handle = task::spawn_blocking(move || { let mut offscreen_renderer = OffscreenRenderer::new(3000, 3000).unwrap(); let mut canvas_wrapper = offscreen_renderer.create_canvas(); - let target = task(&loaded_data,&mut canvas_wrapper, &mut cms); - target + let target = task(&loaded_data, &mut canvas_wrapper, &mut cms); + DataTarget::new(Some(loaded_data), target) }); let target = handle.await.unwrap(); diff --git a/src/pipeline/predefined/grid_field_renderer.rs b/src/pipeline/predefined/grid_field_renderer.rs index f41ba3a..f7319bc 100644 --- a/src/pipeline/predefined/grid_field_renderer.rs +++ b/src/pipeline/predefined/grid_field_renderer.rs @@ -9,11 +9,11 @@ use femtovg::{ }; use geo_types::LineString; use gl::types::GLvoid; +use gtk::ResponseType::No; use image::{imageops::resize, ImageBuffer, Rgba}; use ndarray::ArrayView2; use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps}; use std::{fmt::Debug, io::Cursor, marker::PhantomData}; -use gtk::ResponseType::No; use tracing::info; #[derive(Debug)] @@ -78,7 +78,7 @@ impl, CMAP: Col } // let mapped_ring = cms.ring_map(&cell).unwrap(); - let (ox,oy) = cms.map((lb_lon, lb_lat)).unwrap(); + let (ox, oy) = cms.map((lb_lon, lb_lat)).unwrap(); let (rx, ry) = cms.map((rt_lon, rt_lat)).unwrap(); let mut path = Path::new(); @@ -183,12 +183,10 @@ where canvas.set_render_target(RenderTarget::Screen); Target::new( - TargetType::Mem(pixels), + TargetType::NativeBuffer(pixels), w, h, ((d1_start, d1_end).into(), (d2_start, d2_end).into()), - // Some(thumbnail_tex), - None, None, ) } diff --git a/src/pipeline/utils.rs b/src/pipeline/utils.rs index f62d7e0..206dae2 100644 --- a/src/pipeline/utils.rs +++ b/src/pipeline/utils.rs @@ -25,7 +25,7 @@ macro_rules! match_in_macro { match $block.data_type { $( $branch => { - let element = Element::create_time_series(Arc::new(Box::new(GridElementImpl::new($color))), $dispatcher, $name.to_string(), $cms); + let element = Element::create_time_series(Arc::new(GridElementImpl::new($color)), $dispatcher, $name.to_string(), $cms); Some(element) }, )+ @@ -36,11 +36,7 @@ macro_rules! match_in_macro { }; } -pub fn data_to_element( - block: &Block, - dispatcher: Rc, - cms: CMS, -) -> Option { +pub fn data_to_element(block: &Block, dispatcher: Rc, cms: CMS) -> Option { use crate::utils::*; use radarg_plugin_interface::PluginResultType; match block.shape { diff --git a/src/widgets/render/imp.rs b/src/widgets/render/imp.rs index 6b5f778..48c320c 100644 --- a/src/widgets/render/imp.rs +++ b/src/widgets/render/imp.rs @@ -95,7 +95,6 @@ impl ObjectSubclass for Render { } impl ObjectImpl for Render { - fn constructed(&self) { self.parent_constructed(); let area = self.obj(); @@ -340,6 +339,20 @@ impl Render { target.set_target(TargetType::ImageId(converted)); converted } + TargetType::NativeBuffer(ref mem) => { + let gl_bind = self.glow_context.borrow(); + let gl = gl_bind.as_ref().unwrap(); + let flags = femtovg::ImageFlags::empty(); + let texture = target.native_buffer_to_native_texture(gl, flags); + let converted = canvas + .create_image_from_native_texture( + texture, + femtovg::ImageInfo::new(flags, 3000, 3000, femtovg::PixelFormat::Rgba8), + ) + .unwrap(); + target.set_target(TargetType::ImageId(converted)); + converted + } }; let painter = Paint::image(id, ox, oy, x, y, 0.0, 1.0); diff --git a/src/widgets/render/interior/layers.rs b/src/widgets/render/interior/layers.rs index 7797441..442ea77 100644 --- a/src/widgets/render/interior/layers.rs +++ b/src/widgets/render/interior/layers.rs @@ -1,9 +1,11 @@ use super::super::Render; use crate::coords::cms::CMS; +use crate::errors::PipelineError; use crate::pipeline::element::{self, Element, ElementID, Target, TargetType}; use crate::pipeline::offscreen_renderer::CanvasWrapper; use crate::{coords::Range, widgets::widget::Widget}; use chrono::{prelude::*, DateTime}; +use core_extensions::SelfOps; use femtovg::{renderer::OpenGl, Canvas, ImageId}; use std::{ cell::{Ref, RefCell}, @@ -12,8 +14,6 @@ use std::{ pin::Pin, sync::{Arc, Mutex}, }; -use core_extensions::SelfOps; -use crate::errors::PipelineError; type PrepareFunc = Arc< Mutex< @@ -29,7 +29,7 @@ pub type LayerImplSync = Arc>>; pub enum AssoElement { TimeSeries(Arc>), Instant(element::InstantElement), - Test + Test, } #[derive(Clone)] @@ -70,7 +70,7 @@ impl Layer { pub fn draw(&mut self, render: &Render, window_size: (f32, f32)) -> Result<(), PipelineError> { if self.visiable { - match self.associated_element{ + match self.associated_element { AssoElement::Instant(ref mut e) => { e.render(render); } @@ -79,34 +79,30 @@ impl Layer { let mut buffer = e.buffer.lock().unwrap(); let mut result = buffer.get_mut(&self.time.unwrap()).map(|x| x.as_mut()); - if result.is_none(){ - return Ok(()) ; + if result.is_none() { + return Ok(()); } - if let Some(result) = result.unwrap(){ + if let Some(result) = result.unwrap() { let target = result.get_mut_target(); - let mut canvas = render.get_canvas(); - let mut canvas = canvas.as_mut().unwrap(); - let (ox, oy) = target.origin(render); - let (x, y) = target.size(render); + // let mut canvas = render.get_canvas(); + // let mut canvas = canvas.as_mut().unwrap(); + // let (ox, oy) = target.origin(render); + // let (x, y) = target.size(render); - let result_id = match target.target { - TargetType::ImageId(id) => id, - TargetType::Mem(ref mem) => { - let converted = canvas - .load_image_mem(mem, femtovg::ImageFlags::empty()) - .unwrap(); - target.set_target(TargetType::ImageId(converted)); - converted - } - }; - - let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, self.alpha); - let mut path = femtovg::Path::new(); - path.rect(ox, oy, x, y); - canvas.fill_path(&path, &paint); + render.draw_img(target); + // let result_id = match target.target { + // TargetType::ImageId(id) => id, + // TargetType::Mem(ref mem) => { + // let converted = canvas + // .load_image_mem(mem, femtovg::ImageFlags::empty()) + // .unwrap(); + // target.set_target(TargetType::ImageId(converted)); + // converted + // } + // }; } } _ => {} @@ -140,5 +136,4 @@ impl Layer { pub fn set_associated_element(&mut self, element: AssoElement) { self.associated_element = element; } - } diff --git a/src/widgets/render/mod.rs b/src/widgets/render/mod.rs index dfd8c6d..97a738d 100644 --- a/src/widgets/render/mod.rs +++ b/src/widgets/render/mod.rs @@ -251,7 +251,6 @@ impl Render { height, bounds, None, - None )) } @@ -263,6 +262,10 @@ impl Render { } } + pub fn draw_img(&self, img: &mut Target) { + self.imp().draw_target(img); + } + pub fn scale_rate(&self) -> f64 { let status = self.imp().status.borrow(); status.scale_rate.unwrap() diff --git a/src/widgets/render/predefined/grid_field_renderer.rs b/src/widgets/render/predefined/grid_field_renderer.rs index 01768f8..9cb42e5 100644 --- a/src/widgets/render/predefined/grid_field_renderer.rs +++ b/src/widgets/render/predefined/grid_field_renderer.rs @@ -13,8 +13,8 @@ use std::{fmt::Debug, io::Cursor, marker::PhantomData}; use super::super::renders::DataRenderer; use super::super::{LayerImpl, Render}; -use crate::{data::Radar2d, utils::meshgrid}; use crate::coords::cms::CMS; +use crate::{data::Radar2d, utils::meshgrid}; #[derive(Debug)] pub struct GridFieldRenderer @@ -175,7 +175,7 @@ where let d2_end = data.dim2.view().last().unwrap().clone(); Target::new( - TargetType::Mem(png_data), + TargetType::NativeBuffer(png_data), w, h, ((d1_start, d1_end).into(), (d2_start, d2_end).into()),