commit 1f0257d4d8969af8d472921bc67ce67fce21d69e from: Benjamins Stürz date: Sat Feb 08 14:29:06 2025 UTC minor refactor commit - 929b6e98c73679544243b44af3cc67d86e8e998b commit + 1f0257d4d8969af8d472921bc67ce67fce21d69e blob - e00e263acc3a9da4e638333a19ba840ec67a865f blob + 2f0add7f6aa1793636f6ffca3472cc8c0b39d658 --- ppa6-gui/src/main.rs +++ ppa6-gui/src/main.rs @@ -1,83 +1,13 @@ use std::{convert::identity, fmt::{self, Display, Formatter}, sync::Arc}; -use iced::{advanced::{layout, renderer::Quad, Widget}, application, widget::{button, column, pick_list, row, text, text_input}, Color, Element, Length, Rectangle, Size, Task}; +use iced::{application, widget::{button, column, pick_list, row, text, text_input}, Element, Task}; use ppa6::{usb_context, Context, Device, Printer}; +use crate::docview::DocumentView; +mod docview; + type Document = ppa6::Document<'static>; -struct DocumentView(Arc); - -impl Widget for DocumentView -where - Renderer: iced::advanced::renderer::Renderer -{ - fn size(&self) -> iced::Size { - Size { - width: Length::Fill, - height: Length::Fill, - } - } - fn layout( - &self, - _tree: &mut iced::advanced::widget::Tree, - _renderer: &Renderer, - limits: &layout::Limits, - ) -> layout::Node { - let mut w = self.0.width() as f32; - let mut h = self.0.height() as f32; - let s = limits.max(); - - h *= s.width / w; - w = s.width; - if h > s.height { - w *= s.height / h; - h = s.height; - } - - layout::Node::new(Size::new(w, h)) - } - - fn draw( - &self, - _tree: &iced::advanced::widget::Tree, - renderer: &mut Renderer, - _theme: &Theme, - _style: &iced::advanced::renderer::Style, - layout: iced::advanced::Layout<'_>, - _cursor: iced::advanced::mouse::Cursor, - _viewport: &iced::Rectangle, - ) { - let doc = &self.0; - let b = layout.bounds(); - let w = b.width / doc.width() as f32; - let h = b.height / doc.height() as f32; - for y in 0..doc.height() { - for x in 0..doc.width() { - let pixel = self.0.get(x, y).unwrap(); - let color = if pixel { Color::BLACK } else { Color::WHITE }; - renderer.fill_quad(Quad { - bounds: Rectangle { - x: b.x + w * x as f32, - y: b.y + h * y as f32, - width: w, - height: h, - }, - ..Quad::default() - }, color); - } - } - } -} - -impl<'a, Msg, Theme, Renderer> From for Element<'a, Msg, Theme, Renderer> -where - Renderer: iced::advanced::renderer::Renderer -{ - fn from(value: DocumentView) -> Self { - Self::new(value) - } -} - struct App { ctx: Arc, printer: Option, blob - /dev/null blob + 8bf4966a932330f7a820d592faeced45745aa050 (mode 644) --- /dev/null +++ ppa6-gui/src/docview.rs @@ -0,0 +1,79 @@ +use std::sync::Arc; + +use iced::{advanced::{layout, renderer::Quad, Widget}, Color, Element, Length, Rectangle, Size}; + +use crate::Document; + + +pub struct DocumentView(pub Arc); + +impl Widget for DocumentView +where + Renderer: iced::advanced::renderer::Renderer +{ + fn size(&self) -> iced::Size { + Size { + width: Length::Fill, + height: Length::Fill, + } + } + fn layout( + &self, + _tree: &mut iced::advanced::widget::Tree, + _renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let mut w = self.0.width() as f32; + let mut h = self.0.height() as f32; + let s = limits.max(); + + h *= s.width / w; + w = s.width; + if h > s.height { + w *= s.height / h; + h = s.height; + } + + layout::Node::new(Size::new(w, h)) + } + + fn draw( + &self, + _tree: &iced::advanced::widget::Tree, + renderer: &mut Renderer, + _theme: &Theme, + _style: &iced::advanced::renderer::Style, + layout: iced::advanced::Layout<'_>, + _cursor: iced::advanced::mouse::Cursor, + _viewport: &iced::Rectangle, + ) { + let doc = &self.0; + let b = layout.bounds(); + let w = b.width / doc.width() as f32; + let h = b.height / doc.height() as f32; + for y in 0..doc.height() { + for x in 0..doc.width() { + let pixel = self.0.get(x, y).unwrap(); + let color = if pixel { Color::BLACK } else { Color::WHITE }; + renderer.fill_quad(Quad { + bounds: Rectangle { + x: b.x + w * x as f32, + y: b.y + h * y as f32, + width: w, + height: h, + }, + ..Quad::default() + }, color); + } + } + } +} + +impl<'a, Msg, Theme, Renderer> From for Element<'a, Msg, Theme, Renderer> +where + Renderer: iced::advanced::renderer::Renderer +{ + fn from(value: DocumentView) -> Self { + Self::new(value) + } +}