start on UI
This commit is contained in:
parent
40c08b91fb
commit
a9c51a48bc
2 changed files with 45 additions and 14 deletions
|
@ -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"
|
||||||
|
|
56
src/ui.rs
56
src/ui.rs
|
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue