Make mcdu work

This commit is contained in:
Julian Mutter 2024-01-16 18:08:22 +01:00
parent d7ed0ec59d
commit 02a41a50c0
4 changed files with 73 additions and 43 deletions

1
Cargo.lock generated
View File

@ -974,7 +974,6 @@ dependencies = [
"relm4", "relm4",
"relm4-components", "relm4-components",
"relm4-icons", "relm4-icons",
"relm4-macros",
] ]
[[package]] [[package]]

View File

@ -8,7 +8,7 @@ edition = "2021"
[dependencies] [dependencies]
# Core library # Core library
relm4 = "0.6.2" relm4 = "0.6.2"
relm4-macros = "0.6.2" # relm4-macros = "0.6.2"
# Optional: reusable components # Optional: reusable components
relm4-components = "0.6.2" relm4-components = "0.6.2"
# Optional: icons # Optional: icons

View File

@ -1,16 +1,21 @@
mod mcdu;
use gtk::glib::clone; use gtk::glib::clone;
use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt}; use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt};
use mcdu::McduModel;
use relm4::gtk::prelude::GridExt; use relm4::gtk::prelude::GridExt;
use relm4::{gtk, ComponentParts, ComponentSender, RelmApp, RelmWidgetExt, SimpleComponent}; use relm4::{
gtk, Component, ComponentController, ComponentParts, ComponentSender, RelmApp, RelmWidgetExt,
SimpleComponent,
};
struct AppModel { struct AppModel {
counter: u8, text: String,
} }
#[derive(Debug)] #[derive(Debug)]
enum AppInput { enum AppInput {
Increment, McduInput(char),
Decrement,
} }
struct AppWidgets { struct AppWidgets {
@ -44,7 +49,9 @@ impl SimpleComponent for AppModel {
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> relm4::ComponentParts<Self> { ) -> relm4::ComponentParts<Self> {
relm4_icons::initialize_icons(); relm4_icons::initialize_icons();
let model = AppModel { counter }; let model = AppModel {
text: String::new(),
};
let layout = gtk::Box::builder() let layout = gtk::Box::builder()
.orientation(gtk::Orientation::Horizontal) .orientation(gtk::Orientation::Horizontal)
@ -62,31 +69,11 @@ impl SimpleComponent for AppModel {
.row_homogeneous(true) .row_homogeneous(true)
.build(); .build();
let mcdu = gtk::Grid::builder().build(); let mcdu = McduModel::builder()
mcdu.set_column_spacing(5); .launch(())
mcdu.set_row_spacing(5); .forward(sender.input_sender(), |response| match response {
// mcdu.insert_row(0); mcdu::McduOutput::ButtonPress(c) => AppInput::McduInput(c),
let a = gtk::Button::default(); });
a.set_label("a");
let b = gtk::Button::default();
b.set_label("b");
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let mcdu_width = 6;
for (i, c) in alphabet.char_indices() {
let button = gtk::Button::default();
button.set_label(&c.to_string());
let column = i % mcdu_width;
let row = (i - column) / mcdu_width;
mcdu.attach(&button, column as i32, row as i32, 1, 1);
}
// mcdu.attach(&b, 1, 0, 1, 1);
// mcdu.
// .orientation(gtk::Orientation::Vertical)
// .build();
let inc_button = gtk::Button::with_label("Increment3"); let inc_button = gtk::Button::with_label("Increment3");
let dec_button = gtk::Button::with_label("Decrement"); let dec_button = gtk::Button::with_label("Decrement");
@ -97,14 +84,15 @@ impl SimpleComponent for AppModel {
tab_chooser.append(&x); tab_chooser.append(&x);
let label = gtk::Label::new(Some(&format!("Counter: {}", model.counter))); let label = gtk::Label::new(Some(&format!("Text: NONE")));
label.set_margin_all(5); label.set_margin_all(5);
window.set_child(Some(&layout)); window.set_child(Some(&layout));
layout.set_margin_all(5); layout.set_margin_all(5);
layout.append(&tab_chooser); layout.append(&tab_chooser);
layout.append(&main_view); layout.append(&main_view);
layout.append(&mcdu); layout.append(mcdu.widget());
layout.append(&label);
let widgets = AppWidgets { label }; let widgets = AppWidgets { label };
@ -113,20 +101,13 @@ impl SimpleComponent for AppModel {
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) { fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) {
match message { match message {
AppInput::Increment => { AppInput::McduInput(c) => self.text.push(c),
self.counter = self.counter.wrapping_add(1);
}
AppInput::Decrement => {
self.counter = self.counter.wrapping_sub(1);
}
} }
} }
/// Update the view to represent the updated model. /// Update the view to represent the updated model.
fn update_view(&self, widgets: &mut Self::Widgets, _sender: ComponentSender<Self>) { fn update_view(&self, widgets: &mut Self::Widgets, _sender: ComponentSender<Self>) {
widgets widgets.label.set_label(&format!("Text: {}", self.text));
.label
.set_label(&format!("Counter: {}", self.counter));
} }
} }

50
src/mcdu.rs Normal file
View File

@ -0,0 +1,50 @@
use relm4::gtk::{glib, prelude::*};
use relm4::{gtk, ComponentParts, ComponentSender, SimpleComponent};
pub struct McduModel;
#[derive(Debug)]
pub enum McduOutput {
ButtonPress(char),
}
#[relm4::component(pub)]
impl SimpleComponent for McduModel {
type Init = ();
type Input = ();
type Output = McduOutput;
view! {
#[root]
gtk::Grid {
set_column_spacing: 5,
set_row_spacing: 5,
}
}
fn init(
_init: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let mcdu_width = 6;
for (i, c) in alphabet.char_indices() {
let button = gtk::Button::default();
button.set_label(&c.to_string());
button.connect_clicked(glib::clone!(@strong sender => move |_| {
sender.output(McduOutput::ButtonPress(c)).unwrap();
}));
let column = i % mcdu_width;
let row = (i - column) / mcdu_width;
root.attach(&button, column as i32, row as i32, 1, 1);
}
let model = McduModel;
let widgets = view_output!();
ComponentParts { model, widgets }
}
}