start on UI

This commit is contained in:
Nicole Tietz-Sokolskaya 2024-12-26 19:26:58 -05:00
parent 40c08b91fb
commit a9c51a48bc
2 changed files with 45 additions and 14 deletions

View file

@ -12,3 +12,6 @@ hex = "0.4.3"
midir = "0.10.0"
nom = "7.1.3"
thiserror = "1.0.63"
[lints.clippy]
unwrap_used = "deny"

View file

@ -1,6 +1,6 @@
use std::{sync::Arc, thread::JoinHandle, time::Instant};
use std::{sync::Arc, thread::JoinHandle};
use egui::mutex::Mutex;
use egui::{mutex::Mutex, Color32, Frame, Rounding, SelectableLabel};
use midir::{MidiInput, MidiInputPort};
/// Launches the UI and runs it until it's done executing.
@ -16,7 +16,6 @@ pub fn run() {
}
struct MidiKeysApp {
previous_frame_time: Instant,
midi_input_ports: Arc<Mutex<Vec<MidiInputPort>>>,
midi_in: MidiInput,
}
@ -32,9 +31,7 @@ impl MidiKeysApp {
// TODO: have a way to shut down the midi daemon?
let _ = launch_midi_daemon(midi_input_ports.clone());
let previous_frame_time = Instant::now();
MidiKeysApp {
previous_frame_time,
midi_input_ports,
midi_in,
}
@ -43,22 +40,53 @@ impl MidiKeysApp {
impl eframe::App for MidiKeysApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
let duration = self.previous_frame_time.elapsed().as_secs_f32();
self.previous_frame_time = Instant::now();
ctx.set_theme(egui::Theme::Light);
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Hello world");
let ports = self.midi_input_ports.lock().clone();
let framerate = format!("{:>8.2}", 1. / duration);
ui.label(framerate);
egui::TopBottomPanel::top("menu_bar_panel").show(ctx, |ui| {
egui::menu::bar(ui, |ui| {
ui.menu_button("File", |ui| {
if ui.button("Quit").clicked() {
ctx.send_viewport_cmd(egui::ViewportCommand::Close);
}
});
ui.menu_button("Help", |ui| {
if ui.button("About").clicked() {
// TODO: implement something
}
});
});
});
for input_port in self.midi_input_ports.lock().iter() {
egui::SidePanel::left("instrument_panel").show(ctx, |ui| {
ui.heading("Connections");
for (idx, port) in ports.iter().enumerate() {
let port_name = self
.midi_in
.port_name(input_port)
.port_name(port)
.unwrap_or("unknown".to_string());
ui.label(port_name);
ui.add(SelectableLabel::new(idx == 0, port_name));
}
});
egui::CentralPanel::default().show(ctx, |ui| {
for port in ports.iter() {
let mut frame = Frame::default()
.inner_margin(4.0)
.stroke((1.0, Color32::BLACK))
.rounding(Rounding::same(2.0))
.begin(ui);
let port_name = self
.midi_in
.port_name(port)
.unwrap_or("unknown".to_string());
frame.content_ui.label(port_name);
frame.end(ui);
}
});
}