diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-01-21 16:15:12 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-01-21 16:15:12 +0100 |
| commit | 53a48a778af34bd25963881539e6f66f47dc5580 (patch) | |
| tree | 23a4193a40506fc354eaea626c9e8d58d343abae /src/main.rs | |
| parent | 6e0a9ec574dcc6da863c6d8e482c5a2cb4701df4 (diff) | |
add resizable pane
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 63 |
1 files changed, 45 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs index d2effe6..b21585f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,15 +3,14 @@ pub mod math; pub mod ui; use function_cache::FunctionCache; -use iced::executor; -use iced::widget::column; -use iced::widget::text_input; -use iced::widget::{canvas, container}; +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}; pub fn main() -> iced::Result { Graph::run(Settings { @@ -20,8 +19,8 @@ pub fn main() -> iced::Result { }) } -#[derive(Default)] struct Graph { + panes: pane_grid::State<Pane>, input_state: String, graph_canvas: GraphCanvas, } @@ -33,12 +32,18 @@ impl Application for Graph { type Flags = (); fn new(_flags: ()) -> (Self, Command<Message>) { + let (mut panes, pane) = pane_grid::State::new(Pane::new(PaneKind::FunctionPane)); + panes.split( + pane_grid::Axis::Vertical, + &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, - ..Default::default() + panes, }, Command::none(), ) @@ -64,25 +69,47 @@ impl Application for Graph { Message::UpdateScreen => { self.graph_canvas.clear(); } + Message::Resized(pane_grid::ResizeEvent { split, ratio }) => { + self.panes.resize(&split, ratio); + } } Command::none() } fn view(&self) -> Element<Message> { - let input = text_input("x", &self.input_state) - .on_input(Message::InputChanged) - .on_submit(Message::UpdateFunction) - .padding(15) - .size(30); - let canvas = canvas(&self.graph_canvas) - .width(Length::Fill) - .height(Length::Fill); + 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() + } + PaneKind::FunctionPane => { + text_input("x", &self.input_state) + .on_input(Message::InputChanged) + .on_submit(Message::UpdateFunction) + .padding(15) + .size(30).into() + }, + _ => text("").into(), + }; - let container = container(canvas) + container(child) + .width(Length::Fill) + .height(Length::Fill) + .into() + })) + }) + .width(Length::Fill) + .height(Length::Fill) + .spacing(10) + .on_resize(10, Message::Resized); + + container(pane_grid) .width(Length::Fill) .height(Length::Fill) - .padding(20); - - column![input, container].into() + .padding(10) + .into() } } |