change: open file just create one layer. Add a function which is ElementImpl Trait FROM<PluginResult> BY<PluginResultType & CoordType>

This commit is contained in:
Tsuki 2024-03-06 11:25:16 +08:00
parent 3d57f61196
commit 28fd066050
13 changed files with 107 additions and 107 deletions

View File

@ -187,6 +187,8 @@ impl Component for AppModel {
root: &Self::Root, root: &Self::Root,
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let layers = Rc::new(RefCell::new(Vec::with_capacity(20)));
let control = ControlPanelModel::builder().launch(0).forward( let control = ControlPanelModel::builder().launch(0).forward(
sender.input_sender(), sender.input_sender(),
|msg| match msg { |msg| match msg {
@ -198,7 +200,7 @@ impl Component for AppModel {
); );
let render = let render =
MonitorModel::builder() MonitorModel::builder()
.launch(()) .launch(layers.clone())
.forward(sender.input_sender(), |a| match a { .forward(sender.input_sender(), |a| match a {
MonitorOutputMsg::LayerRenderFinished => AppMsg::Close, MonitorOutputMsg::LayerRenderFinished => AppMsg::Close,
_ => AppMsg::Close, _ => AppMsg::Close,
@ -224,9 +226,11 @@ impl Component for AppModel {
let mut canvas = renderer.create_canvas(); let mut canvas = renderer.create_canvas();
let mut cms_ref = dialog_cms.lock().unwrap(); let mut cms_ref = dialog_cms.lock().unwrap();
let data = element_impl.render(&data,&mut canvas,&mut (*cms_ref)); let mut data_target = element_impl.render(&data,&mut canvas,&mut (*cms_ref));
data_target.data = Some(Arc::new(data) as Arc<dyn Any + Send + Sync + 'static>);
let element = Element::create_instant( let element = Element::create_instant(
InstantElementDrawerType::Prepared(data), InstantElementDrawerType::Prepared(data_target),
dialog_dispatcher.clone(), dialog_dispatcher.clone(),
"New Element".to_string(), "New Element".to_string(),
).get_instance(); ).get_instance();
@ -246,7 +250,7 @@ impl Component for AppModel {
open_dialog: dialog, open_dialog: dialog,
control, control,
render, render,
layers: Rc::new(RefCell::new(Vec::with_capacity(20))), layers ,
setting, setting,
tracker: 0, tracker: 0,
}; };
@ -282,6 +286,7 @@ impl Component for AppModel {
} }
AppMsg::NewLayer(layer) => { AppMsg::NewLayer(layer) => {
(*self.layers).borrow_mut().push(layer); (*self.layers).borrow_mut().push(layer);
self.render.sender().send(MonitorInputMsg::RefreshLayerList);
} }
AppMsg::CloseRequest => { AppMsg::CloseRequest => {
relm4::main_application().quit(); relm4::main_application().quit();
@ -292,6 +297,7 @@ impl Component for AppModel {
} }
_ => {} _ => {}
} }
self.update_view(widgets, _sender);
} }
fn update_cmd( fn update_cmd(

View File

@ -16,12 +16,14 @@ pub enum MonitorInputMsg {
ClearMetaItems, ClearMetaItems,
UpdateMetaItem(HashMap<String, String>), UpdateMetaItem(HashMap<String, String>),
UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)), UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)),
RefreshLayerList,
None, None,
} }
impl Debug for MonitorInputMsg { impl Debug for MonitorInputMsg {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
MonitorInputMsg::RefreshLayerList => write!(f, "MonitorInputMsg::RefreshLayerList"),
MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"), MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"),
MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"), MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"),
MonitorInputMsg::RemoveLayer(_) => write!(f, "MonitorInputMsg::RemoveLayer"), MonitorInputMsg::RemoveLayer(_) => write!(f, "MonitorInputMsg::RemoveLayer"),

View File

@ -50,7 +50,7 @@ pub struct MonitorWidgets {
impl Component for MonitorModel { impl Component for MonitorModel {
type CommandOutput = MonitorCommand; type CommandOutput = MonitorCommand;
type Input = MonitorInputMsg; type Input = MonitorInputMsg;
type Init = (); type Init = Rc<RefCell<Vec<Layer>>>;
type Output = MonitorOutputMsg; type Output = MonitorOutputMsg;
view! { view! {
@ -76,6 +76,7 @@ impl Component for MonitorModel {
set_margin_all: 5, set_margin_all: 5,
#[name="widget_layer"] #[name="widget_layer"]
gtk::Overlay{ gtk::Overlay{
#[name = "renderer"]
#[wrap(Some)] #[wrap(Some)]
set_child = &Render{ set_child = &Render{
// #[track = "model.changed(MonitorModel::new_layer())"] // #[track = "model.changed(MonitorModel::new_layer())"]
@ -86,7 +87,8 @@ impl Component for MonitorModel {
set_view: model.render_range, set_view: model.render_range,
connect_render_status_notify[sender] => move |r| { connect_render_status_notify[sender] => move |r| {
sender.output(MonitorOutputMsg::LayerRenderFinished); sender.output(MonitorOutputMsg::LayerRenderFinished);
} },
set_interior_layers: model.layers.clone(),
}, },
add_overlay=&gtk::Button{ add_overlay=&gtk::Button{
set_label:"Add", set_label:"Add",
@ -107,7 +109,8 @@ impl Component for MonitorModel {
} }
} }
fn update(&mut self, message: Self::Input, sender: ComponentSender<Self>, root: &Self::Root) { fn update_with_view(&mut self, widgets: &mut Self::Widgets, message: Self::Input, sender: ComponentSender<Self>, root: &Self::Root) {
self.reset(); self.reset();
match message { match message {
MonitorInputMsg::AddLayer(layer) => { MonitorInputMsg::AddLayer(layer) => {
@ -115,51 +118,10 @@ impl Component for MonitorModel {
let raw_id = self.get_new_layer(); let raw_id = self.get_new_layer();
self.set_new_layer(*raw_id + 1); self.set_new_layer(*raw_id + 1);
self.sidebar.sender().send(SideBarInputMsg::RefreshList); self.sidebar.sender().send(SideBarInputMsg::RefreshList);
// let need_prepare = { layer.get_prepare().lock().unwrap().is_some() }; }
// { MonitorInputMsg::RefreshLayerList => {
// let mut layers = self.layers.borrow_mut(); self.sidebar.sender().send(SideBarInputMsg::RefreshList);
// if !layers.contains_key(layer.name.as_str()) { widgets.renderer.queue_render();
// let mut widgets = layer.widgets.lock().unwrap();
// if widgets.is_some() {
// let ws = widgets.take().unwrap();
// ws.into_iter().for_each(|w| {
// sender.input(MonitorInputMsg::AddWidget(w));
// });
// }
// }
// }
// if need_prepare {
// sender.oneshot_command(async move {
// let mut back = OffscreenRenderer::new(3000, 3000).unwrap();
// let canvas = back.create_canvas();
// let f = {
// let p = layer.get_prepare();
// let mut _p = p.lock().unwrap();
// _p.take().unwrap()
// };
// let imp = layer.get_imp().unwrap();
// let map: Mapper = Mercator::default().into();
// let cms = CMS::new(map, (3000.0, 3000.0));
// let canvas = Arc::new(Mutex::new(canvas));
// let target = f(imp, canvas, cms);
// layer.set_render_target(target);
// MonitorCommand::NewLayer(layer)
// });
// } else {
// {
// let mut layers = self.layers.borrow_mut();
// if layers.contains_key(layer.name.as_str()) {
// let p = layers.get_mut(layer.name.as_str()).unwrap();
// *p = layer;
// } else {
// layers.insert(layer.name.clone(), layer);
// }
// }
// let raw_id = self.get_new_layer();
// self.set_new_layer(*raw_id + 1);
// self.sidebar.sender().send(SideBarInputMsg::RefreshList);
// }
} }
MonitorInputMsg::AddMetaItem(map) => { MonitorInputMsg::AddMetaItem(map) => {
self.sidebar.emit(SideBarInputMsg::AddMetaItems(map)) self.sidebar.emit(SideBarInputMsg::AddMetaItems(map))
@ -169,20 +131,6 @@ impl Component for MonitorModel {
self.sidebar.emit(SideBarInputMsg::ClearMetaItems); self.sidebar.emit(SideBarInputMsg::ClearMetaItems);
self.sidebar.emit(SideBarInputMsg::AddMetaItems(map)) self.sidebar.emit(SideBarInputMsg::AddMetaItems(map))
} }
// MonitorInputMsg::RemoveLayer(k) => {
// self.layers.borrow_mut().remove(&k);
// sender
// .output_sender()
// .send(MonitorOutputMsg::LayerRemoved(0))
// .unwrap();
// }
// MonitorInputMsg::UpdateLayer((k, f)) => {
// f(&mut (*self.layers.borrow_mut().get_mut(&k).unwrap()));
// sender
// .output_sender()
// .send(MonitorOutputMsg::LayerUpdated(0))
// .unwrap();
// }
MonitorInputMsg::AddWidget(widget) => match widget.widget_type() { MonitorInputMsg::AddWidget(widget) => match widget.widget_type() {
WidgetType::Cairo => { WidgetType::Cairo => {
let frame = WidgetFrame::new(); let frame = WidgetFrame::new();
@ -196,6 +144,8 @@ impl Component for MonitorModel {
MonitorInputMsg::None => {} MonitorInputMsg::None => {}
_ => {} _ => {}
} }
self.update_view(widgets, sender);
} }
fn init( fn init(
@ -203,9 +153,8 @@ impl Component for MonitorModel {
root: &Self::Root, root: &Self::Root,
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let layers = Rc::new(RefCell::new(Vec::new()));
let sidebar: Controller<SideBarModel> = SideBarModel::builder() let sidebar: Controller<SideBarModel> = SideBarModel::builder()
.launch(layers.clone()) .launch(init.clone())
.forward(sender.input_sender(), |msg| match msg { .forward(sender.input_sender(), |msg| match msg {
SideBarOutputMsg::NewLayer(layer) => MonitorInputMsg::AddLayer(layer), SideBarOutputMsg::NewLayer(layer) => MonitorInputMsg::AddLayer(layer),
_ => MonitorInputMsg::None, _ => MonitorInputMsg::None,
@ -222,7 +171,7 @@ impl Component for MonitorModel {
render_cfg, render_cfg,
sidebar_open: true, sidebar_open: true,
sidebar_width: 400, sidebar_width: 400,
layers: layers, layers: init,
sidebar, sidebar,
tracker: 0, tracker: 0,
}; };

View File

@ -23,12 +23,14 @@ use std::{
pin::Pin, pin::Pin,
sync::{Arc, Mutex}, sync::{Arc, Mutex},
}; };
use core_extensions::SelfOps;
use radarg_plugin_interface::PluginResult; use radarg_plugin_interface::PluginResult;
use tokio::sync::{ use tokio::sync::{
oneshot::{channel, Receiver, Sender}, oneshot::{channel, Receiver, Sender},
Notify, Notify,
}; };
use tracing::Instrument; use tracing::Instrument;
use crate::widgets::Render;
pub type ElementID = usize; pub type ElementID = usize;
static ELEMENT_ID: AtomicUsize = AtomicUsize::new(0); static ELEMENT_ID: AtomicUsize = AtomicUsize::new(0);
@ -36,7 +38,7 @@ static ELEMENT_ID: AtomicUsize = AtomicUsize::new(0);
pub type Data = Box<dyn Any + Send + Sync>; pub type Data = Box<dyn Any + Send + Sync>;
pub type Buffer = pub type Buffer =
Arc<Mutex<BTreeMap<DateTime<Utc>, (Option<Data>, Option<RenderResult>)>>>; Arc<Mutex<BTreeMap<DateTime<Utc>, (Option<Data>, Option<RenderResult>)>>>;
type DrawFunc = Arc<Box<dyn Fn(&mut CanvasWrapper, &CMS)>>; type DrawFunc = Rc<Box<dyn Fn(&Render)>>;
type IResult<T> = Result<T, PipelineError>; type IResult<T> = Result<T, PipelineError>;
#[derive(Debug)] #[derive(Debug)]
@ -134,13 +136,31 @@ impl InstantElement {
dispatcher, dispatcher,
} }
} }
pub fn render(&mut self, render: &Render) {
pub fn render(&self, canvas: &mut CanvasWrapper, cms: &CMS) {
match self.draw_type { match self.draw_type {
InstantElementDrawerType::Draw(ref func) => { InstantElementDrawerType::Draw(ref func) => {
func(canvas, cms); 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 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,1.0 );
let mut path = femtovg::Path::new();
path.rect(ox,oy,x,y);
canvas.fill_path(&path, &paint);
} }
InstantElementDrawerType::Prepared(ref target) => {}
} }
} }
} }
@ -280,13 +300,14 @@ impl RenderResult {
} }
} }
#[derive(Clone, Debug, PartialEq, PartialOrd)] #[derive(Clone, Debug)]
pub struct Target { pub struct Target {
pub target: TargetType, pub target: TargetType,
pub thumbnail: Option<gtk::gdk::Texture>, pub thumbnail: Option<gtk::gdk::Texture>,
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>>
} }
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)] #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
@ -302,6 +323,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>>,
) -> Self { ) -> Self {
Self { Self {
target, target,
@ -309,10 +331,11 @@ impl Target {
height, height,
bounds, bounds,
thumbnail, thumbnail,
data
} }
} }
pub fn size(&self, cms: &CMS) -> (f32, f32) { pub fn size(&self, cms: &Render) -> (f32, f32) {
let (x, y) = self.bounds; let (x, y) = self.bounds;
let p1 = (x.0, y.0); let p1 = (x.0, y.0);
@ -324,7 +347,7 @@ impl Target {
((x2 - x1).abs(), (y2 - y1).abs()) ((x2 - x1).abs(), (y2 - y1).abs())
} }
pub fn origin(&self, cms: &CMS) -> (f32, f32) { pub fn origin(&self, cms: &Render) -> (f32, f32) {
let (x, y) = self.bounds; let (x, y) = self.bounds;
let p1 = (x.0, y.1); let p1 = (x.0, y.1);
cms.map(p1).unwrap() cms.map(p1).unwrap()

View File

@ -4,7 +4,7 @@ use crate::data::Radar2d;
use crate::pipeline::element::{ElementImpl, Target}; use crate::pipeline::element::{ElementImpl, Target};
use crate::pipeline::offscreen_renderer::CanvasWrapper; use crate::pipeline::offscreen_renderer::CanvasWrapper;
use crate::widgets::predefined::color_mapper::ColorMapper; use crate::widgets::predefined::color_mapper::ColorMapper;
use crate::widgets::{LayerImpl, CMS}; use crate::widgets::{LayerImpl};
use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps}; use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps};
use std::any::Any; use std::any::Any;
use std::fmt::Debug; use std::fmt::Debug;

View File

@ -1,20 +1,20 @@
use super::utils::*; use super::utils::*;
use crate::pipeline::element::Target;
use euclid::Size2D; use euclid::Size2D;
use femtovg::{renderer::OpenGl, Canvas}; use femtovg::{renderer::OpenGl, Canvas};
use gl; use gl;
use gl::types::{GLchar, GLenum, GLint, GLuint, GLvoid}; use gl::types::{GLchar, GLenum, GLint, GLuint, GLvoid};
use glow::HasContext; use glow::HasContext;
use std::borrow::{Borrow, BorrowMut};
use std::fmt::{Debug, Formatter};
use std::num::NonZeroU32; use std::num::NonZeroU32;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use std::sync::{Mutex, RwLock}; use std::sync::{Mutex, RwLock};
use std::{cell::RefCell, sync::Arc}; use std::{cell::RefCell, sync::Arc};
use std::fmt::{Debug, Formatter};
use surfman::{ use surfman::{
device, Adapter, Connection, Context, ContextAttributeFlags, Device, Error, GLApi, device, Adapter, Connection, Context, ContextAttributeFlags, Device, Error, GLApi,
NativeConnection, NativeDevice, NativeConnection, NativeDevice,
}; };
use crate::pipeline::element::Target;
pub struct OffscreenRenderer { pub struct OffscreenRenderer {
context: Arc<RwLock<Context>>, context: Arc<RwLock<Context>>,
@ -110,8 +110,7 @@ impl OffscreenRenderer {
CanvasWrapper::new(canvas) CanvasWrapper::new(canvas)
} }
pub fn get_img(&self, target: Target) { pub fn get_img(&self, target: Target) {}
}
pub fn get_mem_img(&self) -> Vec<u8> { pub fn get_mem_img(&self) -> Vec<u8> {
let (w, h) = self.size; let (w, h) = self.size;
@ -151,7 +150,6 @@ impl Debug for CanvasWrapper {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CanvasWrapper").finish() f.debug_struct("CanvasWrapper").finish()
} }
} }
impl CanvasWrapper { impl CanvasWrapper {
@ -181,3 +179,21 @@ impl Drop for CanvasWrapper {
let _ = self; let _ = self;
} }
} }
impl From<Canvas<OpenGl>> for CanvasWrapper {
fn from(canvas: Canvas<OpenGl>) -> Self {
Self(canvas)
}
}
impl Borrow<Canvas<OpenGl>> for CanvasWrapper {
fn borrow(&self) -> &Canvas<OpenGl> {
&self
}
}
impl BorrowMut<Canvas<OpenGl>> for CanvasWrapper {
fn borrow_mut(&mut self) -> &mut Canvas<OpenGl> {
self
}
}

View File

@ -13,6 +13,7 @@ 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;
#[derive(Debug)] #[derive(Debug)]
pub struct GridFieldRenderer<CMAP, T> pub struct GridFieldRenderer<CMAP, T>
@ -171,6 +172,7 @@ where
let d2_start = data.dim2.view().first().unwrap().clone(); let d2_start = data.dim2.view().first().unwrap().clone();
let d2_end = data.dim2.view().last().unwrap().clone(); let d2_end = data.dim2.view().last().unwrap().clone();
canvas.set_render_target(RenderTarget::Screen);
Target::new( Target::new(
TargetType::Mem(png_data), TargetType::Mem(png_data),
@ -178,6 +180,7 @@ where
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), Some(thumbnail_tex),
None
) )
} }
} }

View File

@ -9,6 +9,8 @@ use gtk::subclass::prelude::*;
use gtk::traits::{GLAreaExt, WidgetExt}; use gtk::traits::{GLAreaExt, WidgetExt};
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};
use std::num::NonZeroU32; use std::num::NonZeroU32;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
#[derive(Debug, Default, Clone, Copy, PartialEq)] #[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct RenderConfig { pub struct RenderConfig {
@ -52,7 +54,7 @@ pub struct Render {
pub config: RefCell<RenderConfig>, pub config: RefCell<RenderConfig>,
pub status: RefCell<RenderStatus>, pub status: RefCell<RenderStatus>,
pub mapper: RefCell<Mapper>, pub mapper: RefCell<Mapper>,
pub(super) interior_layers: RefCell<Vec<Layer>>, pub(super) interior_layers: RefCell<Rc<RefCell<Vec<Layer>>>>,
} }
impl Default for Render { impl Default for Render {
@ -61,7 +63,7 @@ impl Default for Render {
render_status: Cell::new(0), render_status: Cell::new(0),
exterior: RefCell::new(ExteriorWidget::default()), exterior: RefCell::new(ExteriorWidget::default()),
interior: RefCell::new(InteriorWidget::default()), interior: RefCell::new(InteriorWidget::default()),
interior_layers: RefCell::new(Vec::new()), interior_layers: RefCell::new(Rc::new(RefCell::new(Vec::new()))),
config: RefCell::new(RenderConfig::default()), config: RefCell::new(RenderConfig::default()),
status: RefCell::new(RenderStatus::default()), status: RefCell::new(RenderStatus::default()),
mapper: RefCell::new(Mercator::default().into()), mapper: RefCell::new(Mercator::default().into()),
@ -198,7 +200,8 @@ impl GLAreaImpl for Render {
} }
} }
let c = &(*self.interior_layers.borrow()); let c = self.interior_layers.borrow();
let c = &mut *c.borrow_mut();
self.interior self.interior
.borrow() .borrow()
.draw(c, &self.obj(), self.status.borrow(), configs); .draw(c, &self.obj(), self.status.borrow(), configs);

View File

@ -12,6 +12,7 @@ use std::{
pin::Pin, pin::Pin,
sync::{Arc, Mutex}, sync::{Arc, Mutex},
}; };
use core_extensions::SelfOps;
type PrepareFunc = Arc< type PrepareFunc = Arc<
Mutex< Mutex<
@ -59,20 +60,14 @@ impl Layer {
} }
} }
pub fn draw(&self, render: &Render, window_size: (f32, f32)) { pub fn draw(&mut self, render: &Render, window_size: (f32, f32)) {
if self.visiable { if self.visiable {
// if let Some(element) = &self.associated_element { match self.associated_element{
// let element = element.lock().unwrap(); AssoElement::Instant(ref mut e) => {
// match *element { e.render(render);
// Element::TimeSeries(ref e) => { }
// if self.time.is_none() { AssoElement::TimeSeries(ref e) => {}
// return; }
// }
// let time = self.time.unwrap();
// }
// Element::Instant(ref e) => {}
// }
// }
} }
} }

View File

@ -25,12 +25,12 @@ impl InteriorWidget {
pub fn draw( pub fn draw(
&self, &self,
layers: &Vec<Layer>, layers: &mut Vec<Layer>,
render: &Render, render: &Render,
status: Ref<'_, RenderStatus>, status: Ref<'_, RenderStatus>,
_c: Ref<'_, RenderConfig>, _c: Ref<'_, RenderConfig>,
) { ) {
for layer in layers.iter().filter(|x| x.visiable) { for layer in layers.iter_mut().filter(|x| x.visiable) {
layer.draw(render, (1000.0, 1000.0)); layer.draw(render, (1000.0, 1000.0));
} }
} }

View File

@ -5,7 +5,8 @@ mod interior;
pub mod predefined; pub mod predefined;
pub mod renders; pub mod renders;
pub mod widget; pub mod widget;
pub use self::cms::CMS; // pub use self::cms::CMS;
use crate::coords::cms::CMS;
pub use self::imp::{RenderConfig, RenderMotion, RenderStatus}; pub use self::imp::{RenderConfig, RenderMotion, RenderStatus};
use crate::coords::Mapper; use crate::coords::Mapper;
use adw::prelude::{GLAreaExt, GestureDragExt}; use adw::prelude::{GLAreaExt, GestureDragExt};
@ -15,7 +16,9 @@ pub use glib::subclass::prelude::*;
use gtk::traits::WidgetExt; use gtk::traits::WidgetExt;
use gtk::{EventControllerScrollFlags, Inhibit}; use gtk::{EventControllerScrollFlags, Inhibit};
pub use interior::*; pub use interior::*;
use std::cell::{Ref, RefMut}; use std::cell::{Ref, RefCell, RefMut};
use std::rc::Rc;
use std::sync::{Arc, Mutex};
pub type WindowCoord = (f32, f32); pub type WindowCoord = (f32, f32);
@ -124,7 +127,7 @@ impl Render {
self.imp().mapper.replace(mapper); self.imp().mapper.replace(mapper);
} }
pub fn set_interior_layers(&self, layers: Vec<Layer>) { pub fn set_interior_layers(&self, layers: Rc<RefCell<Vec<Layer>>>) {
self.imp().interior_layers.replace(layers); self.imp().interior_layers.replace(layers);
self.queue_render(); self.queue_render();
self.set_render_status(0); self.set_render_status(0);

View File

@ -3,7 +3,6 @@ use super::{
super::Layer, super::Layer,
color_mapper::ColorMapper, color_mapper::ColorMapper,
}; };
use crate::widgets::CMS;
use femtovg::{renderer::OpenGl, Canvas, Color, Paint, Path}; use femtovg::{renderer::OpenGl, Canvas, Color, Paint, Path};
use num_traits::*; use num_traits::*;
#[derive(Debug)] #[derive(Debug)]

View File

@ -1,7 +1,8 @@
use crate::widgets::{Layer, LayerImpl, Render, CMS}; use crate::widgets::{Layer, LayerImpl, Render};
use femtovg::{renderer::OpenGl, Canvas}; use femtovg::{renderer::OpenGl, Canvas};
use gtk::Align; use gtk::Align;
use std::{fmt::Debug, rc::Rc}; use std::{fmt::Debug, rc::Rc};
use crate::coords::cms::CMS;
pub enum WidgetType { pub enum WidgetType {
OpenGl, OpenGl,