commit 227bba597aaa14bb096574900a88cca738e2f682 Author: LordMZTE Date: Fri Sep 24 20:20:25 2021 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..cb84fd6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "guwu" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +gtk = "^0.14.0" +relm = "^0.22.0" +relm-derive = "^0.22.0" +uwuify = "0.2.2" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..0328871 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,114 @@ +use gtk::prelude::FrameExt; +use gtk::prelude::OrientableExt; +use gtk::prelude::TextBufferExt; +use gtk::prelude::TextViewExt; +use gtk::prelude::WidgetExt; +use gtk::{Inhibit, Orientation}; +use relm::Widget; +use relm::{connect, Relm}; +use relm_derive::{widget, Msg}; + +fn main() { + let res = Win::run(()); + let _ = dbg!(res); +} + +pub struct Model { + relm: Relm, + uwubuf1: Vec, + uwubuf2: Vec, +} + +impl Model { + pub fn prep_uwubufs(&mut self, len: usize) { + if len > self.uwubuf1.len() { + self.uwubuf1.resize(len, 0); + } + + if len > self.uwubuf2.len() { + self.uwubuf2.resize(len, 0); + } + } +} + +#[derive(Clone, Msg)] +pub enum Msg { + Quit, + Edited, +} + +#[widget] +impl Widget for Win { + fn model(relm: &Relm, _: ()) -> Model { + Model { + relm: relm.clone(), + uwubuf1: vec![], + uwubuf2: vec![], + } + } + + fn update(&mut self, event: Msg) { + match event { + Msg::Quit => gtk::main_quit(), + Msg::Edited => { + if let (Some(inbuf), Some(outbuf)) = + (self.widgets.input.buffer(), self.widgets.output.buffer()) + { + if let Some(text) = inbuf.text(&inbuf.start_iter(), &inbuf.end_iter(), true) { + let len = uwuifier::round_up16(text.len()) * 16; + self.model.prep_uwubufs(len); + let uwu = uwuifier::uwuify_sse( + text.as_bytes(), + &mut self.model.uwubuf1[..len], + &mut self.model.uwubuf2[..len], + ); + + if let Ok(uwu) = std::str::from_utf8(uwu) { + outbuf.set_text(uwu); + } + } + } + } + } + } + + fn init_view(&mut self) { + if let Some(buf) = self.widgets.input.buffer() { + connect!(buf, connect_changed(_), self.model.relm, Msg::Edited); + } + } + + view! { + gtk::Window { + gtk::Box { + orientation: Orientation::Horizontal, + + gtk::Frame { + label: Some("Input"), + + gtk::ScrolledWindow { + hexpand: true, + vexpand: true, + #[name = "input"] + gtk::TextView {}, + }, + }, + + gtk::Frame { + label: Some("Output"), + + gtk::ScrolledWindow { + hexpand: true, + vexpand: true, + #[name = "output"] + gtk::TextView { + editable: false, + }, + }, + }, + }, + + delete_event(_, _) => (Msg::Quit, Inhibit(false)), + } + } +}