From b9b32972afda261020dd207b4ea2b44b7b697b83 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 21 Jan 2024 17:02:00 +0100 Subject: add multiple functions to canvas --- src/main.rs | 74 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 30 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index b21585f..a00d137 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,15 +2,14 @@ pub mod function_cache; pub mod math; pub mod ui; -use function_cache::FunctionCache; +use iced::widget::{ + button, canvas, container, pane_grid, responsive, text, text_input, Column, PaneGrid, row, +}; use iced::{executor, Renderer}; -use iced::widget::{canvas, container, pane_grid, responsive, text, text_input, PaneGrid}; use iced::{Application, Command, Element, Length, Settings, Theme}; -use math::expression_function::ExpressionFunction; -use std::sync::Mutex; use ui::graph::GraphCanvas; -use ui::Message; use ui::pane::{Pane, PaneKind}; +use ui::Message; pub fn main() -> iced::Result { Graph::run(Settings { @@ -21,7 +20,7 @@ pub fn main() -> iced::Result { struct Graph { panes: pane_grid::State, - input_state: String, + func_vec: Vec, graph_canvas: GraphCanvas, } @@ -38,11 +37,10 @@ impl Application for Graph { &pane, Pane::new(PaneKind::GraphPane), ); - let default_func = "f(x) = x^2".to_string(); ( Graph { - graph_canvas: GraphCanvas::new(&default_func), - input_state: default_func, + graph_canvas: GraphCanvas::new(), + func_vec: Vec::new(), panes, }, Command::none(), @@ -55,18 +53,23 @@ impl Application for Graph { fn update(&mut self, message: Message) -> Command { match message { - Message::InputChanged(s) => { - self.input_state = s; + Message::InputChanged(content, i) => { + self.func_vec[i] = content; + } + Message::AddFunction => { + self.func_vec.push(String::new()); + self.graph_canvas.push(""); } - Message::UpdateFunction => { - let func = ExpressionFunction::from_string( - self.input_state.clone(), - self.graph_canvas.ctx.operations(), - ); - self.graph_canvas.func = Mutex::new(FunctionCache::new(func)); + Message::RemoveFunction(i) => { + self.func_vec.remove(i); + self.graph_canvas.remove(i); + self.graph_canvas.clear() + } + Message::UpdateFunction(i) => { + self.graph_canvas.set(i, &self.func_vec[i]); self.graph_canvas.clear(); } - Message::UpdateScreen => { + Message::RefreshGraphCanvas => { self.graph_canvas.clear(); } Message::Resized(pane_grid::ResizeEvent { split, ratio }) => { @@ -79,19 +82,30 @@ impl Application for Graph { fn view(&self) -> Element { let pane_grid = PaneGrid::new(&self.panes, |_id, pane, _| { pane_grid::Content::new(responsive(move |_size| { - let child : Element<'_, Message, Renderer> = match pane.kind { - PaneKind::GraphPane => { - canvas(&self.graph_canvas) - .width(Length::Fill) - .height(Length::Fill).into() - } + let child: Element<'_, Message, Renderer> = match pane.kind { + PaneKind::GraphPane => canvas(&self.graph_canvas) + .width(Length::Fill) + .height(Length::Fill) + .into(), PaneKind::FunctionPane => { - text_input("x", &self.input_state) - .on_input(Message::InputChanged) - .on_submit(Message::UpdateFunction) - .padding(15) - .size(30).into() - }, + let mut flist = Column::new(); + for (i, f) in self.func_vec.iter().enumerate() { + flist = flist.push( + row![ + text_input("f(x) = x^2", f) + .on_input(move |s| Message::InputChanged(s, i)) + .on_submit(Message::UpdateFunction(i)), + button("R").on_press(Message::RemoveFunction(i)) + ].padding(5) + ); + } + flist = flist.push( + button("+") + .width(Length::Fill) + .on_press(Message::AddFunction), + ); + flist.into() + } _ => text("").into(), }; -- cgit v1.2.3-70-g09d2