sync
This commit is contained in:
parent
1e8a90aebe
commit
18b7d2d3d8
6
src/actions.rs
Normal file
6
src/actions.rs
Normal file
@ -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);
|
||||||
@ -5,7 +5,6 @@ use super::{
|
|||||||
setting::SettingModel,
|
setting::SettingModel,
|
||||||
ControlPanelOutputMsg, TimelineMsg,
|
ControlPanelOutputMsg, TimelineMsg,
|
||||||
};
|
};
|
||||||
use crate::data_utils::plugin_result_impl;
|
|
||||||
use crate::pipeline::element::{
|
use crate::pipeline::element::{
|
||||||
Element, InstantElement, InstantElementDrawerType, TimeSeriesElement,
|
Element, InstantElement, InstantElementDrawerType, TimeSeriesElement,
|
||||||
};
|
};
|
||||||
@ -24,6 +23,7 @@ use crate::{
|
|||||||
widgets::render::Layer,
|
widgets::render::Layer,
|
||||||
CONFIG, PLUGIN_MANAGER,
|
CONFIG, PLUGIN_MANAGER,
|
||||||
};
|
};
|
||||||
|
use crate::{data_utils::plugin_result_impl, pipeline::element::DataTarget};
|
||||||
use abi_stable::std_types::RStr;
|
use abi_stable::std_types::RStr;
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
use chrono::{prelude::*, Duration};
|
use chrono::{prelude::*, Duration};
|
||||||
@ -228,11 +228,10 @@ impl Component for AppModel {
|
|||||||
let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap();
|
let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap();
|
||||||
let mut canvas = renderer.create_canvas();
|
let mut canvas = renderer.create_canvas();
|
||||||
let mut dialog_cms = CMS::new(Mercator::default().into(), (3000.0, 3000.0));
|
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);
|
let data_target = element_impl.render(&data, &mut canvas, &mut dialog_cms);
|
||||||
data_target.data = Some(Arc::new(data) as Arc<dyn Any + Send + Sync + 'static>);
|
let data_target = DataTarget::new(Some(data), data_target);
|
||||||
|
|
||||||
let element = Element::create_instant(
|
let element = Element::create_instant(
|
||||||
InstantElementDrawerType::Prepared((data_target, Arc::new(element_impl))),
|
InstantElementDrawerType::Prepared((data_target, element_impl)),
|
||||||
dialog_dispatcher.clone(),
|
dialog_dispatcher.clone(),
|
||||||
"ET".to_string(),
|
"ET".to_string(),
|
||||||
)
|
)
|
||||||
|
|||||||
@ -161,7 +161,7 @@ impl Component for MonitorModel {
|
|||||||
let current_rate = widgets.renderer.scale_rate();
|
let current_rate = widgets.renderer.scale_rate();
|
||||||
self.set_render_range((lat_start, lat_end, lon_start, lon_end));
|
self.set_render_range((lat_start, lat_end, lon_start, lon_end));
|
||||||
let new_rate = widgets.renderer.scale_rate();
|
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));
|
sender.input(MonitorInputMsg::ChangeZoom(zoom));
|
||||||
}
|
}
|
||||||
MonitorInputMsg::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems),
|
MonitorInputMsg::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems),
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
button {
|
|
||||||
color: magenta;
|
|
||||||
}
|
|
||||||
@ -1,14 +1,15 @@
|
|||||||
use radarg_plugin_interface::{CoordType, PluginResult, PluginResultType};
|
|
||||||
use crate::pipeline::element::ElementImpl;
|
use crate::pipeline::element::ElementImpl;
|
||||||
use crate::pipeline::GridElementImpl;
|
use crate::pipeline::GridElementImpl;
|
||||||
use crate::utils::*;
|
use crate::utils::*;
|
||||||
|
use radarg_plugin_interface::{CoordType, PluginResult, PluginResultType};
|
||||||
|
use std::sync::Arc;
|
||||||
macro_rules! data_to_grid {
|
macro_rules! data_to_grid {
|
||||||
($_type:ident,$(($branch:path ,$boundary_norm: expr)),+) => {
|
($_type:ident,$(($branch:path ,$boundary_norm: expr)),+) => {
|
||||||
match $_type {
|
match $_type {
|
||||||
$(
|
$(
|
||||||
$branch => {
|
$branch => {
|
||||||
let element_impl = GridElementImpl::new($boundary_norm);
|
let element_impl = GridElementImpl::new($boundary_norm);
|
||||||
Box::new(element_impl)
|
Arc::new(element_impl)
|
||||||
}
|
}
|
||||||
),+
|
),+
|
||||||
_ => panic!("Invalid type")
|
_ => panic!("Invalid type")
|
||||||
@ -16,7 +17,7 @@ macro_rules! data_to_grid {
|
|||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
pub fn plugin_result_impl(a: &PluginResult) -> Box<dyn ElementImpl> {
|
pub fn plugin_result_impl(a: &PluginResult) -> Arc<dyn ElementImpl> {
|
||||||
let block = a.blocks.first().unwrap();
|
let block = a.blocks.first().unwrap();
|
||||||
match block.coord_type {
|
match block.coord_type {
|
||||||
CoordType::Cartesian => {
|
CoordType::Cartesian => {
|
||||||
@ -41,4 +42,3 @@ pub fn plugin_result_impl(a: &PluginResult) -> Box<dyn ElementImpl> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ use gtk::{
|
|||||||
use plugin_system::{init_plugin, PluginManager};
|
use plugin_system::{init_plugin, PluginManager};
|
||||||
use std::{ptr, sync::Mutex};
|
use std::{ptr, sync::Mutex};
|
||||||
use tokio::runtime::Runtime;
|
use tokio::runtime::Runtime;
|
||||||
|
mod actions;
|
||||||
mod chart;
|
mod chart;
|
||||||
mod components;
|
mod components;
|
||||||
mod config;
|
mod config;
|
||||||
@ -20,13 +21,13 @@ mod data;
|
|||||||
mod errors;
|
mod errors;
|
||||||
mod pipeline;
|
mod pipeline;
|
||||||
mod plugin_system;
|
mod plugin_system;
|
||||||
|
use crate::components::app::AppMsg;
|
||||||
use components::app::AppModel;
|
use components::app::AppModel;
|
||||||
use once_cell::{sync::Lazy as SafeLazy, unsync::Lazy as UnsafeLazy};
|
use once_cell::{sync::Lazy as SafeLazy, unsync::Lazy as UnsafeLazy};
|
||||||
use relm4::RelmApp;
|
use relm4::RelmApp;
|
||||||
use surfman::declare_surfman;
|
use surfman::declare_surfman;
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
use tracing_subscriber;
|
use tracing_subscriber;
|
||||||
use crate::components::app::AppMsg;
|
|
||||||
|
|
||||||
mod data_utils;
|
mod data_utils;
|
||||||
mod map_tile;
|
mod map_tile;
|
||||||
@ -67,11 +68,7 @@ fn main() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let app = adw::Application::builder().application_id(APP_ID).build();
|
||||||
|
|
||||||
let app = adw::Application::builder()
|
|
||||||
.application_id(APP_ID)
|
|
||||||
.build();
|
|
||||||
let relm: RelmApp<AppMsg> = relm4::RelmApp::from_app(app.clone());
|
let relm: RelmApp<AppMsg> = relm4::RelmApp::from_app(app.clone());
|
||||||
relm4_icons::initialize_icons();
|
relm4_icons::initialize_icons();
|
||||||
info!("Init plugin system");
|
info!("Init plugin system");
|
||||||
|
|||||||
@ -144,7 +144,7 @@ impl MapTile {
|
|||||||
(origin.lon() as f64..rb.lon() as f64).into(),
|
(origin.lon() as f64..rb.lon() as f64).into(),
|
||||||
(origin.lat() as f64..rb.lat() 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();
|
let cache = cache.lock().unwrap();
|
||||||
cache.insert(tile, Arc::new(std::sync::Mutex::new(result)));
|
cache.insert(tile, Arc::new(std::sync::Mutex::new(result)));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,7 @@ use std::any::Any;
|
|||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::fmt::Formatter;
|
use std::fmt::Formatter;
|
||||||
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::atomic::AtomicUsize;
|
use std::sync::atomic::AtomicUsize;
|
||||||
use std::{
|
use std::{
|
||||||
@ -48,7 +49,7 @@ pub enum Element {
|
|||||||
|
|
||||||
impl Element {
|
impl Element {
|
||||||
pub fn create_time_series(
|
pub fn create_time_series(
|
||||||
imp: Arc<Box<dyn ElementImpl>>,
|
imp: Arc<dyn ElementImpl>,
|
||||||
dispatcher: Rc<Dispatcher>,
|
dispatcher: Rc<Dispatcher>,
|
||||||
key: String,
|
key: String,
|
||||||
cms: CMS,
|
cms: CMS,
|
||||||
@ -95,7 +96,7 @@ pub struct TimeSeriesElement {
|
|||||||
pub id: ElementID,
|
pub id: ElementID,
|
||||||
pub key: String,
|
pub key: String,
|
||||||
cms: CMS,
|
cms: CMS,
|
||||||
imp: Arc<Box<dyn ElementImpl>>,
|
imp: Arc<dyn ElementImpl>,
|
||||||
registers: Arc<Mutex<HashMap<DateTime<Utc>, Vec<Arc<Notify>>>>>,
|
registers: Arc<Mutex<HashMap<DateTime<Utc>, Vec<Arc<Notify>>>>>,
|
||||||
pipeline: Pipeline,
|
pipeline: Pipeline,
|
||||||
pub buffer: Buffer,
|
pub buffer: Buffer,
|
||||||
@ -105,7 +106,7 @@ pub struct TimeSeriesElement {
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum InstantElementDrawerType {
|
pub enum InstantElementDrawerType {
|
||||||
Draw(DrawFunc),
|
Draw(DrawFunc),
|
||||||
Prepared((Target, Arc<Box<dyn ElementImpl>>)),
|
Prepared((DataTarget, Arc<dyn ElementImpl>)),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for InstantElementDrawerType {
|
impl Debug for InstantElementDrawerType {
|
||||||
@ -141,33 +142,7 @@ impl InstantElement {
|
|||||||
func(render);
|
func(render);
|
||||||
}
|
}
|
||||||
InstantElementDrawerType::Prepared((ref mut target, _)) => {
|
InstantElementDrawerType::Prepared((ref mut target, _)) => {
|
||||||
let mut canvas = render.get_canvas();
|
render.draw_img(target);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -178,14 +153,9 @@ impl InstantElement {
|
|||||||
cms: CMS,
|
cms: CMS,
|
||||||
) -> (TimeSeriesElement, DateTime<Utc>) {
|
) -> (TimeSeriesElement, DateTime<Utc>) {
|
||||||
// let imp = Arc::new(InstantElementImpl::new(self));
|
// 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 mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key);
|
||||||
let data = target
|
let data = target.take_data().unwrap();
|
||||||
.data
|
|
||||||
.clone()
|
|
||||||
.unwrap()
|
|
||||||
.downcast::<PluginResult>()
|
|
||||||
.unwrap();
|
|
||||||
let time_stamp = data.blocks.first().unwrap().datetime;
|
let time_stamp = data.blocks.first().unwrap().datetime;
|
||||||
let meta_info: MetaInfo = data.meta.clone().into();
|
let meta_info: MetaInfo = data.meta.clone().into();
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
@ -202,12 +172,7 @@ impl InstantElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TimeSeriesElement {
|
impl TimeSeriesElement {
|
||||||
fn new(
|
fn new(imp: Arc<dyn ElementImpl>, dispatcher: Rc<Dispatcher>, cms: CMS, key: String) -> Self {
|
||||||
imp: Arc<Box<dyn ElementImpl>>,
|
|
||||||
dispatcher: Rc<Dispatcher>,
|
|
||||||
cms: CMS,
|
|
||||||
key: String,
|
|
||||||
) -> Self {
|
|
||||||
let id = ELEMENT_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
let id = ELEMENT_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
let mut pipeline = Pipeline::new(20, key.clone());
|
let mut pipeline = Pipeline::new(20, key.clone());
|
||||||
pipeline.set_dispatcher(dispatcher.clone());
|
pipeline.set_dispatcher(dispatcher.clone());
|
||||||
@ -329,12 +294,12 @@ impl TimeSeriesElement {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct RenderResult {
|
pub struct RenderResult {
|
||||||
target: Target,
|
target: DataTarget,
|
||||||
meta_info: MetaInfo,
|
meta_info: MetaInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderResult {
|
impl RenderResult {
|
||||||
pub fn new(target: Target, meta_info: MetaInfo) -> Self {
|
pub fn new(target: DataTarget, meta_info: MetaInfo) -> Self {
|
||||||
Self { target, meta_info }
|
Self { target, meta_info }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,13 +319,14 @@ pub struct Target {
|
|||||||
pub width: f32,
|
pub width: f32,
|
||||||
pub height: f32,
|
pub height: f32,
|
||||||
pub bounds: (Range, Range),
|
pub bounds: (Range, Range),
|
||||||
pub data: Option<Arc<dyn Any + Send + Sync + 'static>>,
|
// pub data: Option<Arc<dyn Any + Send + Sync + 'static>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
|
||||||
pub enum TargetType {
|
pub enum TargetType {
|
||||||
ImageId(ImageId),
|
ImageId(ImageId),
|
||||||
Mem(Vec<u8>),
|
Mem(Vec<u8>),
|
||||||
|
NativeBuffer(Vec<u8>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Target {
|
impl Target {
|
||||||
@ -370,7 +336,7 @@ impl Target {
|
|||||||
height: f32,
|
height: f32,
|
||||||
bounds: (Range, Range),
|
bounds: (Range, Range),
|
||||||
thumbnail: Option<gtk::gdk::Texture>,
|
thumbnail: Option<gtk::gdk::Texture>,
|
||||||
data: Option<Arc<dyn Any + Send + Sync + 'static>>,
|
// data: Option<Arc<dyn Any + Send + Sync + 'static>>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
target,
|
target,
|
||||||
@ -378,7 +344,7 @@ impl Target {
|
|||||||
height,
|
height,
|
||||||
bounds,
|
bounds,
|
||||||
thumbnail,
|
thumbnail,
|
||||||
data,
|
// data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,12 +360,12 @@ impl Target {
|
|||||||
((x2 - x1).abs(), (y2 - y1).abs())
|
((x2 - x1).abs(), (y2 - y1).abs())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mem_to_native_texture(
|
pub fn native_buffer_to_native_texture(
|
||||||
&self,
|
&self,
|
||||||
gl: &glow::Context,
|
gl: &glow::Context,
|
||||||
flags: ImageFlags,
|
flags: ImageFlags,
|
||||||
) -> glow::NativeTexture {
|
) -> glow::NativeTexture {
|
||||||
if let TargetType::Mem(ref mem) = self.target {
|
if let TargetType::NativeBuffer(ref mem) = self.target {
|
||||||
use glow::*;
|
use glow::*;
|
||||||
let texture = unsafe {
|
let texture = unsafe {
|
||||||
let id = gl.create_texture().unwrap();
|
let id = gl.create_texture().unwrap();
|
||||||
@ -549,3 +515,41 @@ impl Target {
|
|||||||
self.target = target;
|
self.target = target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct DataTarget {
|
||||||
|
data: Option<PluginResult>,
|
||||||
|
target: Target,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DataTarget {
|
||||||
|
pub fn new(data: Option<PluginResult>, target: Target) -> Self {
|
||||||
|
Self { data, target }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn take_data(&mut self) -> Option<PluginResult> {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use super::{
|
use super::{
|
||||||
dispatcher::Dispatcher,
|
dispatcher::Dispatcher,
|
||||||
element::RenderResult,
|
element::{DataTarget, RenderResult},
|
||||||
offscreen_renderer::{CanvasWrapper, OffscreenRenderer},
|
offscreen_renderer::{CanvasWrapper, OffscreenRenderer},
|
||||||
utils::data_to_element,
|
utils::data_to_element,
|
||||||
};
|
};
|
||||||
@ -16,6 +16,7 @@ use crate::{
|
|||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
||||||
use futures::{future::BoxFuture, Future};
|
use futures::{future::BoxFuture, Future};
|
||||||
|
use radarg_plugin_interface::PluginResult;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
use std::{
|
use std::{
|
||||||
@ -23,7 +24,6 @@ use std::{
|
|||||||
rc::Rc,
|
rc::Rc,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
use radarg_plugin_interface::PluginResult;
|
|
||||||
use tokio::{
|
use tokio::{
|
||||||
sync::{mpsc, oneshot},
|
sync::{mpsc, oneshot},
|
||||||
task,
|
task,
|
||||||
@ -136,7 +136,7 @@ impl Pipeline {
|
|||||||
let mut offscreen_renderer = OffscreenRenderer::new(3000, 3000).unwrap();
|
let mut offscreen_renderer = OffscreenRenderer::new(3000, 3000).unwrap();
|
||||||
let mut canvas_wrapper = offscreen_renderer.create_canvas();
|
let mut canvas_wrapper = offscreen_renderer.create_canvas();
|
||||||
let target = task(&loaded_data, &mut canvas_wrapper, &mut cms);
|
let target = task(&loaded_data, &mut canvas_wrapper, &mut cms);
|
||||||
target
|
DataTarget::new(Some(loaded_data), target)
|
||||||
});
|
});
|
||||||
|
|
||||||
let target = handle.await.unwrap();
|
let target = handle.await.unwrap();
|
||||||
|
|||||||
@ -9,11 +9,11 @@ use femtovg::{
|
|||||||
};
|
};
|
||||||
use geo_types::LineString;
|
use geo_types::LineString;
|
||||||
use gl::types::GLvoid;
|
use gl::types::GLvoid;
|
||||||
|
use gtk::ResponseType::No;
|
||||||
use image::{imageops::resize, ImageBuffer, Rgba};
|
use image::{imageops::resize, ImageBuffer, Rgba};
|
||||||
use ndarray::ArrayView2;
|
use ndarray::ArrayView2;
|
||||||
use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps};
|
use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps};
|
||||||
use std::{fmt::Debug, io::Cursor, marker::PhantomData};
|
use std::{fmt::Debug, io::Cursor, marker::PhantomData};
|
||||||
use gtk::ResponseType::No;
|
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -183,12 +183,10 @@ where
|
|||||||
canvas.set_render_target(RenderTarget::Screen);
|
canvas.set_render_target(RenderTarget::Screen);
|
||||||
|
|
||||||
Target::new(
|
Target::new(
|
||||||
TargetType::Mem(pixels),
|
TargetType::NativeBuffer(pixels),
|
||||||
w,
|
w,
|
||||||
h,
|
h,
|
||||||
((d1_start, d1_end).into(), (d2_start, d2_end).into()),
|
((d1_start, d1_end).into(), (d2_start, d2_end).into()),
|
||||||
// Some(thumbnail_tex),
|
|
||||||
None,
|
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ macro_rules! match_in_macro {
|
|||||||
match $block.data_type {
|
match $block.data_type {
|
||||||
$(
|
$(
|
||||||
$branch => {
|
$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)
|
Some(element)
|
||||||
},
|
},
|
||||||
)+
|
)+
|
||||||
@ -36,11 +36,7 @@ macro_rules! match_in_macro {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn data_to_element(
|
pub fn data_to_element(block: &Block, dispatcher: Rc<Dispatcher>, cms: CMS) -> Option<Element> {
|
||||||
block: &Block,
|
|
||||||
dispatcher: Rc<Dispatcher>,
|
|
||||||
cms: CMS,
|
|
||||||
) -> Option<Element> {
|
|
||||||
use crate::utils::*;
|
use crate::utils::*;
|
||||||
use radarg_plugin_interface::PluginResultType;
|
use radarg_plugin_interface::PluginResultType;
|
||||||
match block.shape {
|
match block.shape {
|
||||||
|
|||||||
@ -95,7 +95,6 @@ impl ObjectSubclass for Render {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ObjectImpl for Render {
|
impl ObjectImpl for Render {
|
||||||
|
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
let area = self.obj();
|
let area = self.obj();
|
||||||
@ -340,6 +339,20 @@ impl Render {
|
|||||||
target.set_target(TargetType::ImageId(converted));
|
target.set_target(TargetType::ImageId(converted));
|
||||||
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);
|
let painter = Paint::image(id, ox, oy, x, y, 0.0, 1.0);
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
use super::super::Render;
|
use super::super::Render;
|
||||||
use crate::coords::cms::CMS;
|
use crate::coords::cms::CMS;
|
||||||
|
use crate::errors::PipelineError;
|
||||||
use crate::pipeline::element::{self, Element, ElementID, Target, TargetType};
|
use crate::pipeline::element::{self, Element, ElementID, Target, TargetType};
|
||||||
use crate::pipeline::offscreen_renderer::CanvasWrapper;
|
use crate::pipeline::offscreen_renderer::CanvasWrapper;
|
||||||
use crate::{coords::Range, widgets::widget::Widget};
|
use crate::{coords::Range, widgets::widget::Widget};
|
||||||
use chrono::{prelude::*, DateTime};
|
use chrono::{prelude::*, DateTime};
|
||||||
|
use core_extensions::SelfOps;
|
||||||
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
||||||
use std::{
|
use std::{
|
||||||
cell::{Ref, RefCell},
|
cell::{Ref, RefCell},
|
||||||
@ -12,8 +14,6 @@ use std::{
|
|||||||
pin::Pin,
|
pin::Pin,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
use core_extensions::SelfOps;
|
|
||||||
use crate::errors::PipelineError;
|
|
||||||
|
|
||||||
type PrepareFunc = Arc<
|
type PrepareFunc = Arc<
|
||||||
Mutex<
|
Mutex<
|
||||||
@ -29,7 +29,7 @@ pub type LayerImplSync = Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>;
|
|||||||
pub enum AssoElement {
|
pub enum AssoElement {
|
||||||
TimeSeries(Arc<Mutex<element::TimeSeriesElement>>),
|
TimeSeries(Arc<Mutex<element::TimeSeriesElement>>),
|
||||||
Instant(element::InstantElement),
|
Instant(element::InstantElement),
|
||||||
Test
|
Test,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -86,27 +86,23 @@ impl Layer {
|
|||||||
if let Some(result) = result.unwrap() {
|
if let Some(result) = result.unwrap() {
|
||||||
let target = result.get_mut_target();
|
let target = result.get_mut_target();
|
||||||
|
|
||||||
let mut canvas = render.get_canvas();
|
// let mut canvas = render.get_canvas();
|
||||||
let mut canvas = canvas.as_mut().unwrap();
|
// let mut canvas = canvas.as_mut().unwrap();
|
||||||
let (ox, oy) = target.origin(render);
|
// let (ox, oy) = target.origin(render);
|
||||||
let (x, y) = target.size(render);
|
// let (x, y) = target.size(render);
|
||||||
|
|
||||||
let result_id = match target.target {
|
render.draw_img(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);
|
|
||||||
|
|
||||||
|
// 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) {
|
pub fn set_associated_element(&mut self, element: AssoElement) {
|
||||||
self.associated_element = element;
|
self.associated_element = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -251,7 +251,6 @@ impl Render {
|
|||||||
height,
|
height,
|
||||||
bounds,
|
bounds,
|
||||||
None,
|
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 {
|
pub fn scale_rate(&self) -> f64 {
|
||||||
let status = self.imp().status.borrow();
|
let status = self.imp().status.borrow();
|
||||||
status.scale_rate.unwrap()
|
status.scale_rate.unwrap()
|
||||||
|
|||||||
@ -13,8 +13,8 @@ use std::{fmt::Debug, io::Cursor, marker::PhantomData};
|
|||||||
|
|
||||||
use super::super::renders::DataRenderer;
|
use super::super::renders::DataRenderer;
|
||||||
use super::super::{LayerImpl, Render};
|
use super::super::{LayerImpl, Render};
|
||||||
use crate::{data::Radar2d, utils::meshgrid};
|
|
||||||
use crate::coords::cms::CMS;
|
use crate::coords::cms::CMS;
|
||||||
|
use crate::{data::Radar2d, utils::meshgrid};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct GridFieldRenderer<CMAP, T>
|
pub struct GridFieldRenderer<CMAP, T>
|
||||||
@ -175,7 +175,7 @@ where
|
|||||||
let d2_end = data.dim2.view().last().unwrap().clone();
|
let d2_end = data.dim2.view().last().unwrap().clone();
|
||||||
|
|
||||||
Target::new(
|
Target::new(
|
||||||
TargetType::Mem(png_data),
|
TargetType::NativeBuffer(png_data),
|
||||||
w,
|
w,
|
||||||
h,
|
h,
|
||||||
((d1_start, d1_end).into(), (d2_start, d2_end).into()),
|
((d1_start, d1_end).into(), (d2_start, d2_end).into()),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user