From 4e4729ffd099af5ecef770545612e1d377922016 Mon Sep 17 00:00:00 2001 From: RF Simulator Bot Date: Mon, 10 Aug 2026 07:37:46 +0200 Subject: [PATCH] fix: inspector dirty-tracking marks edits in equalizer/attenuator/combiner/filter drawers B2: m_param_edited was set OUTSIDE the gain-change if in the ideal-mode amplifier block, so merely selecting an amplifier marked the project dirty every frame (spurious '*' and Unsaved-Changes prompt with zero edits). Move it inside the change branch. B3: the equalizer (mode combo, S-param browse, ref gain/freq/slope), ideal-filter (mode combo, S-param browse), attenuator (atten, S-param mode, S-param file), and combiner (S-parameter mode, S-param file) drawers mutated engine state without setting m_param_edited, so onParamChange()/markDirty() never fired and edits were silently lost on New/Open/Exit without a save prompt. Set m_param_edited=true inside every state-mutating control, matching the amplifier/NF pattern. --- app/src/inspector_panel.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/inspector_panel.cpp b/app/src/inspector_panel.cpp index 892b6c9..68e4a7f 100644 --- a/app/src/inspector_panel.cpp +++ b/app/src/inspector_panel.cpp @@ -221,9 +221,10 @@ void InspectorPanel::drawAmplifierProperties(AmplifierEngine &engine, int index) ImGui::EndDisabled(); } else { double gain = engine.gain_dB(); - if (utils::inputDouble("Gain (dB)", gain, 1, 10, "%.1f", -10.0, 40.0)) + if (utils::inputDouble("Gain (dB)", gain, 1, 10, "%.1f", -10.0, 40.0)) { engine.setGain_dB(gain); - m_param_edited = true; + m_param_edited = true; + } } double nf = engine.nf_dB(); @@ -456,6 +457,7 @@ void InspectorPanel::drawEqualizerProperties(EqualizerEngine &engine, int index) int eq_mode_idx = engine.sparamMode() ? 1 : 0; if (ImGui::Combo("##eq_mode", &eq_mode_idx, eq_modes, IM_ARRAYSIZE(eq_modes))) { engine.setSParamMode(eq_mode_idx == 1); + m_param_edited = true; } if (engine.sparamMode()) { @@ -466,6 +468,7 @@ void InspectorPanel::drawEqualizerProperties(EqualizerEngine &engine, int index) .result(); if (!result.empty()) { engine.setSParamFilepath(result[0]); + m_param_edited = true; } } if (engine.sparamLoaded()) { @@ -478,16 +481,22 @@ void InspectorPanel::drawEqualizerProperties(EqualizerEngine &engine, int index) } double ref_gain = engine.refGain_dB(); - if (utils::inputDouble("Ref Gain (dB)", ref_gain, 1, 10, "%.1f", -40.0, 40.0)) + if (utils::inputDouble("Ref Gain (dB)", ref_gain, 1, 10, "%.1f", -40.0, 40.0)) { engine.setRefGain_dB(ref_gain); + m_param_edited = true; + } double ref_freq = engine.refFreq_Hz(); - if (utils::inputFrequency("Ref Freq (MHz)", ref_freq, 1.0, 100.0, "%.0f", 1.0, 100e9)) + if (utils::inputFrequency("Ref Freq (MHz)", ref_freq, 1.0, 100.0, "%.0f", 1.0, 100e9)) { engine.setRefFreq_Hz(ref_freq); + m_param_edited = true; + } double slope = engine.slope_dBPerDecade(); - if (utils::inputDouble("Slope (dB/dec)", slope, 0.1, 1.0, "%.1f", -100.0, 100.0)) + if (utils::inputDouble("Slope (dB/dec)", slope, 0.1, 1.0, "%.1f", -100.0, 100.0)) { engine.setSlope_dBPerDecade(slope); + m_param_edited = true; + } if (engine.sparamMode()) ImGui::EndDisabled(); @@ -512,6 +521,7 @@ void InspectorPanel::drawIdealFilterProperties(IdealFilterEngine &engine, int in int f_mode_idx = engine.sparamMode() ? 1 : 0; if (ImGui::Combo("##filter_mode", &f_mode_idx, filter_modes, IM_ARRAYSIZE(filter_modes))) { engine.setSParamMode(f_mode_idx == 1); + m_param_edited = true; } if (engine.sparamMode()) { @@ -522,6 +532,7 @@ void InspectorPanel::drawIdealFilterProperties(IdealFilterEngine &engine, int in .result(); if (!result.empty()) { engine.setSParamFilepath(result[0]); + m_param_edited = true; } } if (engine.sparamLoaded()) { @@ -575,11 +586,13 @@ void InspectorPanel::drawAttenuatorProperties(AttenuatorEngine &engine, int inde float atten_f = static_cast(engine.attenuation()); if (ImGui::DragFloat("Atten (dB)", &atten_f, 0.1f, 0.0f, 200.0f)) { engine.setAttenuation(static_cast(atten_f)); + m_param_edited = true; } bool sparam_mode = engine.sParamMode(); if (ImGui::Checkbox("S-param mode", &sparam_mode)) { engine.setSParamMode(sparam_mode); + m_param_edited = true; } if (sparam_mode) { @@ -589,6 +602,7 @@ void InspectorPanel::drawAttenuatorProperties(AttenuatorEngine &engine, int inde path_buf[sizeof(path_buf) - 1] = '\0'; if (ImGui::InputText("S-param file", path_buf, sizeof(path_buf))) { engine.setSParamFile(path_buf); + m_param_edited = true; } } @@ -606,6 +620,7 @@ void InspectorPanel::drawCombinerProperties(CombinerEngine &engine, int index) { bool sparam_mode = engine.sParamMode(); if (ImGui::Checkbox("S-parameter mode", &sparam_mode)) { engine.setSParamMode(sparam_mode); + m_param_edited = true; } if (sparam_mode) { @@ -615,6 +630,7 @@ void InspectorPanel::drawCombinerProperties(CombinerEngine &engine, int index) { path_buf[sizeof(path_buf) - 1] = '\0'; if (ImGui::InputText("S-param file", path_buf, sizeof(path_buf))) { engine.setSParamFile(path_buf); + m_param_edited = true; } }