Skip to content

Commit 8026c6c

Browse files
committed
refactor: simplify conditional logic and control flow
1 parent 858a6bd commit 8026c6c

File tree

6 files changed

+203
-225
lines changed

6 files changed

+203
-225
lines changed

src/gui.rs

Lines changed: 71 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,9 @@ impl BridgeApp {
7070
impl eframe::App for BridgeApp {
7171
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
7272
// Intercept Close Request (System X button)
73-
if ctx.input(|i| i.viewport().close_requested()) {
74-
if !self.allowed_to_close {
75-
ctx.send_viewport_cmd(egui::ViewportCommand::CancelClose);
76-
self.show_quit_confirmation = true;
77-
}
73+
if ctx.input(|i| i.viewport().close_requested()) && !self.allowed_to_close {
74+
ctx.send_viewport_cmd(egui::ViewportCommand::CancelClose);
75+
self.show_quit_confirmation = true;
7876
}
7977

8078
// Handle Quit Shortcut (Ctrl+Q / Cmd+Q)
@@ -120,55 +118,51 @@ impl eframe::App for BridgeApp {
120118
let main_enabled = !self.show_quit_confirmation;
121119

122120
// --- Activity Log Consumption ---
123-
if let Ok(mut m) = self.midi.lock() {
124-
if !m.activity_log.is_empty() {
125-
let logs: Vec<_> = m.activity_log.drain(..).collect();
126-
log::debug!("Received {} activity events", logs.len());
127-
for event in logs {
128-
log::debug!(
129-
"Activity: mapping_idx={}, part={:?}, value={}",
130-
event.mapping_idx,
131-
event.part,
132-
event.value
133-
);
134-
135-
if let Some(node_ids) = self.mapping_nodes.get(&event.mapping_idx) {
136-
let target_node_id = match event.part {
137-
eos_midi_bridge::ActivityPart::Trigger => Some(node_ids.trigger),
138-
eos_midi_bridge::ActivityPart::Action => Some(node_ids.action),
139-
eos_midi_bridge::ActivityPart::Output(i) => {
140-
node_ids.outputs.get(i).copied()
141-
}
142-
};
121+
if let Ok(mut m) = self.midi.lock()
122+
&& !m.activity_log.is_empty()
123+
{
124+
let logs: Vec<_> = m.activity_log.drain(..).collect();
125+
log::debug!("Received {} activity events", logs.len());
126+
for event in logs {
127+
log::debug!(
128+
"Activity: mapping_idx={}, part={:?}, value={}",
129+
event.mapping_idx,
130+
event.part,
131+
event.value
132+
);
133+
134+
if let Some(node_ids) = self.mapping_nodes.get(&event.mapping_idx) {
135+
let target_node_id = match event.part {
136+
eos_midi_bridge::ActivityPart::Trigger => Some(node_ids.trigger),
137+
eos_midi_bridge::ActivityPart::Action => Some(node_ids.action),
138+
eos_midi_bridge::ActivityPart::Output(i) => {
139+
node_ids.outputs.get(i).copied()
140+
}
141+
};
143142

144-
if let Some(node_id) = target_node_id {
145-
if let Some(node) = self.snarl.get_node_mut(node_id) {
146-
let live_state = match node {
147-
eos_midi_bridge::nodes::NodeData::Trigger(_, s) => s,
148-
eos_midi_bridge::nodes::NodeData::Action(_, s) => s,
149-
eos_midi_bridge::nodes::NodeData::Output(_, s) => s,
150-
};
151-
live_state.last_value = event.value.clone();
152-
live_state.last_activity = Some(std::time::Instant::now());
153-
log::debug!(
154-
"Updated node {:?} with value: {}",
155-
node_id,
156-
event.value
157-
);
158-
}
159-
} else {
160-
log::warn!(
161-
"No node_id found for mapping_idx={}, part={:?}",
162-
event.mapping_idx,
163-
event.part
164-
);
143+
if let Some(node_id) = target_node_id {
144+
if let Some(node) = self.snarl.get_node_mut(node_id) {
145+
let live_state = match node {
146+
eos_midi_bridge::nodes::NodeData::Trigger(_, s) => s,
147+
eos_midi_bridge::nodes::NodeData::Action(_, s) => s,
148+
eos_midi_bridge::nodes::NodeData::Output(_, s) => s,
149+
};
150+
live_state.last_value = event.value.clone();
151+
live_state.last_activity = Some(std::time::Instant::now());
152+
log::debug!("Updated node {:?} with value: {}", node_id, event.value);
165153
}
166154
} else {
167-
log::warn!("No mapping found for mapping_idx={}", event.mapping_idx);
155+
log::warn!(
156+
"No node_id found for mapping_idx={}, part={:?}",
157+
event.mapping_idx,
158+
event.part
159+
);
168160
}
161+
} else {
162+
log::warn!("No mapping found for mapping_idx={}", event.mapping_idx);
169163
}
170-
ctx.request_repaint();
171164
}
165+
ctx.request_repaint();
172166
}
173167

174168
egui::CentralPanel::default().show(ctx, |ui| {
@@ -367,12 +361,11 @@ impl eframe::App for BridgeApp {
367361
ui.label("MIDI Input:");
368362
let mut selected_in =
369363
self.config_edit.midi_in_name.clone();
370-
if let Some(ref name) = selected_in {
371-
if !m.available_in_ports.is_empty()
372-
&& !m.available_in_ports.contains(name)
373-
{
374-
selected_in = None;
375-
}
364+
if let Some(ref name) = selected_in
365+
&& !m.available_in_ports.is_empty()
366+
&& !m.available_in_ports.contains(name)
367+
{
368+
selected_in = None;
376369
}
377370
let display_in =
378371
selected_in.as_deref().unwrap_or("None");
@@ -398,12 +391,11 @@ impl eframe::App for BridgeApp {
398391
ui.label("MIDI Output:");
399392
let mut selected_out =
400393
self.config_edit.midi_out_name.clone();
401-
if let Some(ref name) = selected_out {
402-
if !m.available_out_ports.is_empty()
403-
&& !m.available_out_ports.contains(name)
404-
{
405-
selected_out = None;
406-
}
394+
if let Some(ref name) = selected_out
395+
&& !m.available_out_ports.is_empty()
396+
&& !m.available_out_ports.contains(name)
397+
{
398+
selected_out = None;
407399
}
408400
let display_out =
409401
selected_out.as_deref().unwrap_or("None");
@@ -465,16 +457,17 @@ impl eframe::App for BridgeApp {
465457
}
466458

467459
// Auto-apply changes if config has changed and is valid
468-
if self.config_edit != self.last_applied_config {
469-
if self.config_edit.validate().is_ok() {
470-
if let Err(e) = self.tx_system.blocking_send(
471-
SystemCommand::Reconfigure(self.config_edit.clone()),
472-
) {
473-
error!("Failed to send live reconfiguration command: {}", e);
474-
} else {
475-
self.last_applied_config = self.config_edit.clone();
476-
self.status_message = "Settings applied".to_string();
477-
}
460+
if self.config_edit != self.last_applied_config
461+
&& self.config_edit.validate().is_ok()
462+
{
463+
if let Err(e) = self
464+
.tx_system
465+
.blocking_send(SystemCommand::Reconfigure(self.config_edit.clone()))
466+
{
467+
error!("Failed to send live reconfiguration command: {}", e);
468+
} else {
469+
self.last_applied_config = self.config_edit.clone();
470+
self.status_message = "Settings applied".to_string();
478471
}
479472
}
480473
}
@@ -492,10 +485,10 @@ impl eframe::App for BridgeApp {
492485
self.snarl_zoom_pending *= 0.8;
493486
}
494487
ui.separator();
495-
if ui.button("🔄 Refresh Mapping").clicked() {
496-
if let Ok(m) = self.midi.lock() {
497-
populate_needed = Some(m.profile.clone());
498-
}
488+
if ui.button("🔄 Refresh Mapping").clicked()
489+
&& let Ok(m) = self.midi.lock()
490+
{
491+
populate_needed = Some(m.profile.clone());
499492
}
500493
ui.separator();
501494
ui.label("Ctrl + Scroll to zoom, Drag to pan");
@@ -504,10 +497,10 @@ impl eframe::App for BridgeApp {
504497
ui.separator();
505498

506499
// If snarl is empty, populate it automatically
507-
if self.snarl.nodes().next().is_none() {
508-
if let Ok(m) = self.midi.lock() {
509-
populate_needed = Some(m.profile.clone());
510-
}
500+
if self.snarl.nodes().next().is_none()
501+
&& let Ok(m) = self.midi.lock()
502+
{
503+
populate_needed = Some(m.profile.clone());
511504
}
512505

513506
let snarl_rect = ui.available_rect_before_wrap();

src/lib.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ pub struct Queue<T> {
4747
elements: Arc<Mutex<VecDeque<T>>>,
4848
}
4949

50+
impl<T> Default for Queue<T> {
51+
fn default() -> Self {
52+
Self::new()
53+
}
54+
}
55+
5056
impl<T> Queue<T> {
5157
pub fn new() -> Self {
5258
Self {
@@ -94,12 +100,10 @@ pub fn resolve_crossfade_direction(
94100
Some(CrossfadeState::Go)
95101
} else if new_cue < old_cue {
96102
Some(CrossfadeState::GoBack)
103+
} else if current_state == CrossfadeState::Inactive {
104+
Some(CrossfadeState::Go)
97105
} else {
98-
if current_state == CrossfadeState::Inactive {
99-
Some(CrossfadeState::Go)
100-
} else {
101-
None
102-
}
106+
None
103107
}
104108
} else {
105109
Some(CrossfadeState::Go)
@@ -113,11 +117,9 @@ pub fn calculate_next_page(current_page: u8, go_up: bool) -> u8 {
113117
} else {
114118
current_page + 1
115119
}
120+
} else if current_page <= 1 {
121+
99
116122
} else {
117-
if current_page <= 1 {
118-
99
119-
} else {
120-
current_page - 1
121-
}
123+
current_page - 1
122124
}
123125
}

src/main.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ fn main() -> anyhow::Result<()> {
6969
let mut interval = tokio::time::interval(Duration::from_millis(500));
7070
loop {
7171
interval.tick().await;
72-
if let Ok(m) = flash_midi.lock() {
73-
if m.crossfade_state == CrossfadeState::Pause {
74-
tick = !tick;
75-
let vel = if tick { 127 } else { 0 };
76-
if let Some((note, chan, _)) = m
77-
.profile
78-
.get_midi_output_for_action(crate::controller::LogicalAction::Go)
79-
{
80-
m.send_queue.enqueue(vec![0x90 | chan, note, vel]);
81-
}
72+
if let Ok(m) = flash_midi.lock()
73+
&& m.crossfade_state == CrossfadeState::Pause
74+
{
75+
tick = !tick;
76+
let vel = if tick { 127 } else { 0 };
77+
if let Some((note, chan, _)) = m
78+
.profile
79+
.get_midi_output_for_action(crate::controller::LogicalAction::Go)
80+
{
81+
m.send_queue.enqueue(vec![0x90 | chan, note, vel]);
8282
}
8383
}
8484
}
@@ -164,11 +164,11 @@ fn main() -> anyhow::Result<()> {
164164
let _ = client.send("/eos/ping", vec![]).await;
165165

166166
// Check for timeout if we ever received a pong
167-
if let Some(last) = last_heartbeat {
168-
if last.elapsed() > Duration::from_secs(4) {
169-
let mut m = heartbeat_midi.lock().unwrap();
170-
m.needs_sync = true; // Retry sync when it comes back
171-
}
167+
if let Some(last) = last_heartbeat
168+
&& last.elapsed() > Duration::from_secs(4)
169+
{
170+
let mut m = heartbeat_midi.lock().unwrap();
171+
m.needs_sync = true; // Retry sync when it comes back
172172
}
173173
}
174174
_ = heartbeat_token.cancelled() => break,
@@ -247,10 +247,8 @@ fn main() -> anyhow::Result<()> {
247247
}
248248
}
249249
}
250-
} else {
251-
if let Ok(mut m) = supervision_midi.lock() {
252-
m.connection_status = "⚠ MIDI Ports not selected".to_string();
253-
}
250+
} else if let Ok(mut m) = supervision_midi.lock() {
251+
m.connection_status = "⚠ MIDI Ports not selected".to_string();
254252
}
255253

256254
// Wait for reconfiguration command

src/midi.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ impl Midi {
6161
pub fn enqueue_pitchwheel(&self, fader_index: u8, value: i16) {
6262
// Find a mapping for FaderMove { index: fader_index } that has a MidiPitchwheel output
6363
for mapping in &self.profile.mappings {
64-
if let crate::controller::LogicalAction::FaderMove { index } = mapping.action {
65-
if index == fader_index as usize {
66-
for output in &mapping.outputs {
67-
if let crate::controller::Output::MidiPitchwheel { channel } = output {
68-
let val = (value + 8192) as u16; // Convert pitch (-8192 to 8191) to 0-16383 range
69-
let mut data = vec![0xE0 | channel];
70-
data.push((val & 0x7F) as u8); // LSB
71-
data.push(((val >> 7) & 0x7F) as u8); // MSB
72-
self.send_queue.enqueue(data);
73-
return;
74-
}
64+
if let crate::controller::LogicalAction::FaderMove { index } = mapping.action
65+
&& index == fader_index as usize
66+
{
67+
for output in &mapping.outputs {
68+
if let crate::controller::Output::MidiPitchwheel { channel } = output {
69+
let val = (value + 8192) as u16; // Convert pitch (-8192 to 8191) to 0-16383 range
70+
let mut data = vec![0xE0 | channel];
71+
data.push((val & 0x7F) as u8); // LSB
72+
data.push(((val >> 7) & 0x7F) as u8); // MSB
73+
self.send_queue.enqueue(data);
74+
return;
7575
}
7676
}
7777
}
@@ -447,15 +447,13 @@ pub async fn execute_mapping(
447447
tokio::spawn(async move {
448448
let mut success = false;
449449
if arg_type == "float" {
450-
if let Some(a) = arg {
451-
if client_clone.send(&final_addr, vec![a]).await.is_ok() {
452-
success = true;
453-
}
454-
}
455-
} else {
456-
if client_clone.send(&final_addr, vec![]).await.is_ok() {
450+
if let Some(a) = arg
451+
&& client_clone.send(&final_addr, vec![a]).await.is_ok()
452+
{
457453
success = true;
458454
}
455+
} else if client_clone.send(&final_addr, vec![]).await.is_ok() {
456+
success = true;
459457
}
460458

461459
if success {

0 commit comments

Comments
 (0)