Add sound support to front panel widget
This commit is contained in:
parent
fb262cf3b1
commit
782e522ce8
@ -1,16 +1,17 @@
|
|||||||
use std::path::Path;
|
use std::{path::Path, sync::mpsc::Sender};
|
||||||
|
|
||||||
use eframe::{
|
use eframe::{
|
||||||
egui::{self, TextureOptions, Ui, Widget, Id, Painter},
|
egui::{self, TextureOptions, Ui, Widget, Id, Painter},
|
||||||
epaint::{vec2, Pos2, Rect, TextureHandle, pos2, Color32},
|
epaint::{vec2, Pos2, Rect, TextureHandle, pos2, Color32},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::audio::AudioMessage;
|
||||||
|
|
||||||
use self::switch::SwitchState;
|
use self::switch::SwitchState;
|
||||||
|
|
||||||
pub mod led;
|
pub mod led;
|
||||||
pub mod switch;
|
pub mod switch;
|
||||||
|
|
||||||
|
|
||||||
const NULL_UV: Rect = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
const NULL_UV: Rect = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
||||||
const NULL_TINT: Color32 = Color32::WHITE;
|
const NULL_TINT: Color32 = Color32::WHITE;
|
||||||
|
|
||||||
@ -31,13 +32,15 @@ struct FrontpanelState {
|
|||||||
pub struct Frontpanel<'a> {
|
pub struct Frontpanel<'a> {
|
||||||
id: Id,
|
id: Id,
|
||||||
textures: &'a Textures,
|
textures: &'a Textures,
|
||||||
|
audio_tx: Sender<AudioMessage>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Frontpanel<'a> {
|
impl<'a> Frontpanel<'a> {
|
||||||
pub fn new(id: Id, textures: &'a Textures) -> Self {
|
pub fn new(id: Id, textures: &'a Textures, audio_tx: Sender<AudioMessage>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
id,
|
id,
|
||||||
textures,
|
textures,
|
||||||
|
audio_tx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,13 +76,10 @@ impl Widget for Frontpanel<'_> {
|
|||||||
pos += fp_rect.left_top().to_vec2();
|
pos += fp_rect.left_top().to_vec2();
|
||||||
let led_data = 0xAAAA;
|
let led_data = 0xAAAA;
|
||||||
let led_on = (led_data & led.mask) > 0;
|
let led_on = (led_data & led.mask) > 0;
|
||||||
ui.allocate_ui_at_rect(
|
ui.allocate_ui_at_rect(Rect::from_center_size(pos, vec2(16.0, 16.0)), |ui| {
|
||||||
Rect::from_center_size(pos, vec2(16.0, 16.0)),
|
|
||||||
|ui| {
|
|
||||||
ui.add(led::Led::new(led_on, &led_textures));
|
ui.add(led::Led::new(led_on, &led_textures));
|
||||||
},
|
});
|
||||||
);
|
}
|
||||||
};
|
|
||||||
// 0: Power
|
// 0: Power
|
||||||
// 1..17: A/D left to right
|
// 1..17: A/D left to right
|
||||||
// 17..25: Action left to right
|
// 17..25: Action left to right
|
||||||
@ -89,22 +89,28 @@ impl Widget for Frontpanel<'_> {
|
|||||||
pos.y *= y_scale;
|
pos.y *= y_scale;
|
||||||
pos += fp_rect.left_top().to_vec2();
|
pos += fp_rect.left_top().to_vec2();
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
ui.allocate_ui_at_rect(
|
ui.allocate_ui_at_rect(Rect::from_center_size(pos, vec2(32.0, 32.0)), |ui| {
|
||||||
Rect::from_center_size(pos, vec2(32.0, 32.0)),
|
if ui
|
||||||
|ui| {
|
.add(switch::ToggleSwitch::new(&mut state.power, &sw_textures))
|
||||||
ui.add(switch::ToggleSwitch::new(&mut state.power, &sw_textures));
|
.drag_started()
|
||||||
},
|
{
|
||||||
);
|
if state.power {
|
||||||
|
self.audio_tx.send(AudioMessage::FanOn).unwrap();
|
||||||
|
} else {
|
||||||
|
self.audio_tx.send(AudioMessage::FanOff).unwrap();
|
||||||
|
}
|
||||||
|
self.audio_tx.send(AudioMessage::PlaySwitchClick).unwrap();
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (1..17).contains(&i) {
|
if (1..17).contains(&i) {
|
||||||
let bit_mask = 1 << (16 - i);
|
let bit_mask = 1 << (16 - i);
|
||||||
let mut sw_state = state.ad_sws & bit_mask > 0;
|
let mut sw_state = state.ad_sws & bit_mask > 0;
|
||||||
ui.allocate_ui_at_rect(
|
ui.allocate_ui_at_rect(Rect::from_center_size(pos, vec2(32.0, 32.0)), |ui| {
|
||||||
Rect::from_center_size(pos, vec2(32.0, 32.0)),
|
if ui.add(switch::ToggleSwitch::new(&mut sw_state, &sw_textures)).drag_started() {
|
||||||
|ui| {
|
self.audio_tx.send(AudioMessage::PlaySwitchClick).unwrap();
|
||||||
ui.add(switch::ToggleSwitch::new(&mut sw_state, &sw_textures));
|
};
|
||||||
},
|
});
|
||||||
);
|
|
||||||
state.ad_sws = (state.ad_sws & !(bit_mask)) | ((sw_state as u16) << (16 - i));
|
state.ad_sws = (state.ad_sws & !(bit_mask)) | ((sw_state as u16) << (16 - i));
|
||||||
}
|
}
|
||||||
if (17..25).contains(&i) {
|
if (17..25).contains(&i) {
|
||||||
@ -119,16 +125,17 @@ impl Widget for Frontpanel<'_> {
|
|||||||
24 => &mut state.aux2,
|
24 => &mut state.aux2,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
ui.allocate_ui_at_rect(
|
ui.allocate_ui_at_rect(Rect::from_center_size(pos, vec2(32.0, 32.0)), |ui| {
|
||||||
Rect::from_center_size(pos, vec2(32.0, 32.0)),
|
if ui.add(switch::ThreePosSwitch::new(state, &sw_textures)).drag_started() {
|
||||||
|ui| {
|
self.audio_tx.send(AudioMessage::PlaySwitchClick).unwrap();
|
||||||
ui.add(switch::ThreePosSwitch::new(state, &sw_textures));
|
};
|
||||||
},
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
// todo!();
|
|
||||||
}
|
}
|
||||||
ui.data_mut(|data| data.insert_temp(self.id, state));
|
ui.data_mut(|data| data.insert_temp(self.id, state));
|
||||||
|
if resp.drag_started() {
|
||||||
|
dbg!(self.id, resp.interact_pointer_pos());
|
||||||
|
}
|
||||||
resp
|
resp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
src/main.rs
12
src/main.rs
@ -227,8 +227,16 @@ impl eframe::App for AltairEmulator {
|
|||||||
});
|
});
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
ui.add(Label::new("Hello"));
|
ui.add(Label::new("Hello"));
|
||||||
ui.add(Frontpanel::new(Id::new("frontpanel"), &self.textures));
|
ui.add(Frontpanel::new(
|
||||||
ui.add(Frontpanel::new(Id::new("frontpanel2"), &self.textures));
|
Id::new("frontpanel"),
|
||||||
|
&self.textures,
|
||||||
|
self.audio_tx.clone(),
|
||||||
|
));
|
||||||
|
ui.add(Frontpanel::new(
|
||||||
|
Id::new("frontpanel2"),
|
||||||
|
&self.textures,
|
||||||
|
self.audio_tx.clone(),
|
||||||
|
));
|
||||||
// dbg!(ui.input(|input| input.pointer.latest_pos()));
|
// dbg!(ui.input(|input| input.pointer.latest_pos()));
|
||||||
// dbg!(ui.input(|input| input.pointer.latest_pos()));
|
// dbg!(ui.input(|input| input.pointer.latest_pos()));
|
||||||
// let (_, fp_rect) = ui.allocate_space((800.0, 333.0).into());
|
// let (_, fp_rect) = ui.allocate_space((800.0, 333.0).into());
|
||||||
|
Loading…
Reference in New Issue
Block a user