This commit is contained in:
LordMZTE 2021-09-24 20:20:25 +02:00
commit 227bba597a
3 changed files with 128 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
Cargo.lock

12
Cargo.toml Normal file
View File

@ -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"

114
src/main.rs Normal file
View File

@ -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<Win>,
uwubuf1: Vec<u8>,
uwubuf2: Vec<u8>,
}
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<Self>, _: ()) -> 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)),
}
}
}