diff --git a/cyberpunk-slideshow/src/main.rs b/cyberpunk-slideshow/src/main.rs index 43dbf02..8ed6da6 100644 --- a/cyberpunk-slideshow/src/main.rs +++ b/cyberpunk-slideshow/src/main.rs @@ -1,6 +1,6 @@ use std::{fs::File, io::Read, path::Path, rc::Rc, time::Duration}; -use cyberpunk::{AsymLine, GlowPen, Pen, Text}; +use cyberpunk::{AsymLine, AsymLineCutout, GlowPen, Pen, Text}; use glib::Object; use gtk::{glib, prelude::*, subclass::prelude::*}; use serde::{Deserialize, Serialize}; @@ -87,17 +87,33 @@ impl CyberScreen { start_y: height as f64 / 2., start_length: 75., height: 50., - total_length: 200., + end_length: 75., invert: false, } .draw(&pen); pen.stroke(); + AsymLineCutout { + orientation: gtk::Orientation::Horizontal, + start_x: 50., + start_y: height as f64 / 4. * 3., + start_length: 75., + cutout_length: 15., + end_length: 75., + height: 15., + invert: true, + }.draw(&pen); + pen.stroke(); + let tracery = pen.finish(); let _ = context.set_source(tracery); let _ = context.paint(); - Text::new("Test text".to_owned(), (0.7, 0., 1.)).draw(&context); + let text = Text::new("Test text".to_owned(), &context, 64.); + let text_extents = text.extents(); + context.move_to(20., text_extents.height() + 40.); + context.set_source_rgb(0.7, 0., 1.); + text.draw(); } }); diff --git a/cyberpunk/src/lib.rs b/cyberpunk/src/lib.rs index 3d83443..73d1d95 100644 --- a/cyberpunk/src/lib.rs +++ b/cyberpunk/src/lib.rs @@ -10,19 +10,19 @@ use std::{ time::{Duration, Instant}, }; -struct AsymLineCutout { - orientation: gtk::Orientation, - start_x: f64, - start_y: f64, - start_length: f64, - total_length: f64, - cutout_length: f64, - height: f64, - invert: bool, +pub struct AsymLineCutout { + pub orientation: gtk::Orientation, + pub start_x: f64, + pub start_y: f64, + pub start_length: f64, + pub cutout_length: f64, + pub end_length: f64, + pub height: f64, + pub invert: bool, } impl AsymLineCutout { - fn draw(&self, pen: &impl Pen) { + pub fn draw(&self, pen: &impl Pen) { let dodge = if self.invert { self.height } else { @@ -48,7 +48,15 @@ impl AsymLineCutout { + (self.height / 2.), self.start_y + dodge / 2., ); - pen.line_to(self.total_length, self.start_y + dodge / 2.); + pen.line_to( + self.start_x + + self.start_length + + self.height + + self.cutout_length + + (self.height / 2.) + + self.end_length, + self.start_y + dodge / 2., + ); } gtk::Orientation::Vertical => { pen.move_to(self.start_x, self.start_y); @@ -69,7 +77,15 @@ impl AsymLineCutout { + self.cutout_length + (self.height / 2.), ); - pen.line_to(self.start_x + dodge / 2., self.total_length); + pen.line_to( + self.start_x + dodge / 2., + self.start_y + + self.start_length + + self.height + + self.cutout_length + + (self.height / 2.) + + self.end_length, + ); } _ => panic!("unknown orientation"), } @@ -93,7 +109,7 @@ pub struct AsymLine { pub height: f64, // Total length of the entire line. - pub total_length: f64, + pub end_length: f64, // When normal, the angle dodge is upwards. When inverted, the angle dodge is downwards. pub invert: bool, @@ -114,7 +130,10 @@ impl AsymLine { self.start_x + self.start_length + self.height, self.start_y + dodge, ); - pen.line_to(self.start_x + self.total_length, self.start_y + dodge); + pen.line_to( + self.start_x + self.start_length + self.height + self.end_length, + self.start_y + dodge, + ); } gtk::Orientation::Vertical => {} _ => panic!("unknown orientation"), @@ -238,25 +257,23 @@ impl Pen for GlowPen { } } -pub struct Text { +pub struct Text<'a> { content: String, - color: (f64, f64, f64), + context: &'a Context, } -impl Text { - pub fn new(content: String, color: (f64, f64, f64)) -> Self { - - Self{ content, color } - } - - pub fn draw(&self, context: &Context) { +impl<'a> Text<'a> { + pub fn new(content: String, context: &'a Context, size: f64) -> Self { context.select_font_face("Alegreya Sans SC", FontSlant::Normal, FontWeight::Bold); - context.set_font_size(64.); + context.set_font_size(size); + Self { content, context } + } - let extents = context.text_extents(&self.content).unwrap(); - context.move_to(20., extents.height() + 20.); + pub fn extents(&self) -> TextExtents { + self.context.text_extents(&self.content).unwrap() + } - context.set_source_rgb(self.color.0, self.color.1, self.color.2); - let _ = context.show_text(&self.content); + pub fn draw(&self) { + let _ = self.context.show_text(&self.content); } }