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" midir = "0.10.0"
nom = "7.1.3" nom = "7.1.3"
thiserror = "1.0.63" 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}; use midir::{MidiInput, MidiInputPort};
/// Launches the UI and runs it until it's done executing. /// Launches the UI and runs it until it's done executing.
@ -16,7 +16,6 @@ pub fn run() {
} }
struct MidiKeysApp { struct MidiKeysApp {
previous_frame_time: Instant,
midi_input_ports: Arc<Mutex<Vec<MidiInputPort>>>, midi_input_ports: Arc<Mutex<Vec<MidiInputPort>>>,
midi_in: MidiInput, midi_in: MidiInput,
} }
@ -32,9 +31,7 @@ impl MidiKeysApp {
// TODO: have a way to shut down the midi daemon? // TODO: have a way to shut down the midi daemon?
let _ = launch_midi_daemon(midi_input_ports.clone()); let _ = launch_midi_daemon(midi_input_ports.clone());
let previous_frame_time = Instant::now();
MidiKeysApp { MidiKeysApp {
previous_frame_time,
midi_input_ports, midi_input_ports,
midi_in, midi_in,
} }
@ -43,22 +40,53 @@ impl MidiKeysApp {
impl eframe::App for MidiKeysApp { impl eframe::App for MidiKeysApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
let duration = self.previous_frame_time.elapsed().as_secs_f32(); ctx.set_theme(egui::Theme::Light);
self.previous_frame_time = Instant::now();
egui::CentralPanel::default().show(ctx, |ui| { let ports = self.midi_input_ports.lock().clone();
ui.heading("Hello world");
let framerate = format!("{:>8.2}", 1. / duration); egui::TopBottomPanel::top("menu_bar_panel").show(ctx, |ui| {
ui.label(framerate); 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 let port_name = self
.midi_in .midi_in
.port_name(input_port) .port_name(port)
.unwrap_or("unknown".to_string()); .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);
} }
}); });
} }