Split drawing into functions

This commit is contained in:
Austen Adler 2023-09-18 22:48:07 -04:00
parent 335079ac14
commit f3cee84c51

View File

@ -1,5 +1,6 @@
use egui::{ use egui::{
Button, Color32, FontId, Frame, Grid, Key, Label, RichText, Rounding, Stroke, Style, Vec2, Button, Color32, FontId, Frame, Grid, Key, Label, RichText, Rounding, ScrollArea, Stroke,
Style, Vec2,
}; };
use rpn_rs::calc::{errors::CalculatorError, Calculator}; use rpn_rs::calc::{errors::CalculatorError, Calculator};
use tracing::{error, info}; use tracing::{error, info};
@ -56,6 +57,76 @@ impl TemplateApp {
} }
} }
fn draw_stack(&mut self, ui: &mut egui::Ui) {
ui.add(Label::new(
RichText::new(
self.calculator
.stack
.iter()
.rev()
.map(|e| e.to_string())
.collect::<Vec<_>>()
.join("\n"),
)
.background_color(egui::Color32::RED)
.font(DEFAULT_FONT)
.size(STACK_FONT_SIZE)
.color(Color32::WHITE),
));
}
fn draw_error(&mut self, ui: &mut egui::Ui) {
if let Some(ref e) = self.latest_error {
ui.label(
RichText::new(e.to_string())
.font(DEFAULT_FONT)
.size(STACK_FONT_SIZE)
.color(Color32::RED),
);
}
}
fn draw_input(&mut self, ui: &mut egui::Ui) {
egui::Frame::none()
.fill(egui::Color32::RED)
.inner_margin(5.0)
.stroke(Stroke::new(10.0, Color32::BLUE))
.show(ui, |ui| {
ui.label(
RichText::new(self.calculator.get_l())
.color(Color32::WHITE)
.font(DEFAULT_FONT),
);
});
}
fn draw_buttons(&mut self, ui: &mut egui::Ui) {
Grid::new("grid").spacing(BUTTON_SPACING).show(ui, |ui| {
for row in BUTTON_LAYOUT.iter() {
for button in row.iter() {
let label = RichText::new(button.value)
.font(DEFAULT_FONT)
.color(Color32::WHITE);
if ui
.add_enabled(
button.enabled,
Button::new(label)
.stroke(Stroke::NONE)
.rounding(Rounding::none())
.fill(Color32::from_gray(0x12)),
)
.on_hover_text(button.help)
.clicked()
{
info!("Clicked button {}", button.value);
self.calculator_input(button.value);
}
}
ui.end_row();
}
});
}
fn handle_input(&mut self, i: &egui::InputState) { fn handle_input(&mut self, i: &egui::InputState) {
if i.events.is_empty() { if i.events.is_empty() {
return; return;
@ -161,62 +232,15 @@ impl eframe::App for TemplateApp {
ui.hyperlink("https://gitea.austen-wares.com/stonewareslord/rpn_rs"); ui.hyperlink("https://gitea.austen-wares.com/stonewareslord/rpn_rs");
// Buttons // Buttons
Grid::new("grid").spacing(BUTTON_SPACING).show(ui, |ui| { self.draw_buttons(ui);
for row in BUTTON_LAYOUT.iter() {
for button in row.iter() {
let label = RichText::new(button.value)
.font(DEFAULT_FONT)
.color(Color32::WHITE);
if ui
.add_enabled(
button.enabled,
Button::new(label)
// .frame(false)
.stroke(Stroke::NONE)
.rounding(Rounding::none())
.fill(Color32::from_gray(0x12)),
)
.on_hover_text(button.help)
.clicked()
{
info!("Clicked button {}", button.value);
self.calculator_input(button.value);
}
}
ui.end_row();
}
});
// Stack // Stack
// ui.add_sized( Vec2::new(ui.available_width(), ui.available_height()),
ui.add(Label::new(
RichText::new(
self.calculator
.stack
.iter()
.rev()
.map(|e| e.to_string())
.collect::<Vec<_>>()
.join("\n"),
)
.background_color(egui::Color32::RED)
.font(DEFAULT_FONT)
.size(STACK_FONT_SIZE)
.color(Color32::WHITE),
));
egui::Frame::none() ScrollArea::vertical().show(ui, |ui| {
.fill(egui::Color32::RED) self.draw_stack(ui);
.inner_margin(5.0) });
.stroke(Stroke::new(10.0, Color32::BLUE))
.show(ui, |ui| {
ui.label(
RichText::new(self.calculator.get_l())
.color(Color32::WHITE)
.font(DEFAULT_FONT),
);
});
self.draw_input(ui);
// Reset the error state and update `self.latest_error` if required // Reset the error state and update `self.latest_error` if required
match std::mem::take(&mut self.error_state) { match std::mem::take(&mut self.error_state) {
ErrorState::NoModify => {} ErrorState::NoModify => {}
@ -224,15 +248,7 @@ impl eframe::App for TemplateApp {
ErrorState::Clear => self.latest_error = None, ErrorState::Clear => self.latest_error = None,
} }
if let Some(ref e) = self.latest_error { self.draw_error(ui);
ui.label(
RichText::new(e.to_string())
.font(DEFAULT_FONT)
.size(STACK_FONT_SIZE)
.color(Color32::RED),
);
}
egui::warn_if_debug_build(ui); egui::warn_if_debug_build(ui);
}); });
}) })