@@ -61,6 +61,7 @@ IntersectEditor::IntersectEditor (IntersectProcessor& p)
6161
6262 setWantsKeyboardFocus (true );
6363 setSize (kBaseW , kBaseH );
64+ lastUiSnapshotVersion = processor.getUiSliceSnapshotVersion ();
6465 startTimerHz (30 );
6566}
6667
@@ -249,6 +250,14 @@ bool IntersectEditor::keyPressed (const juce::KeyPress& key)
249250void IntersectEditor::timerCallback ()
250251{
251252 waveformView.rebuildCacheIfNeeded ();
253+ bool uiChanged = false ;
254+
255+ const auto snapshotVersion = processor.getUiSliceSnapshotVersion ();
256+ if (snapshotVersion != lastUiSnapshotVersion)
257+ {
258+ lastUiSnapshotVersion = snapshotVersion;
259+ uiChanged = true ;
260+ }
252261
253262 // Check if scale changed (lastScale starts at -1 so first tick always applies)
254263 float scale = processor.apvts .getRawParameterValue (ParamIds::uiScale)->load ();
@@ -258,9 +267,21 @@ void IntersectEditor::timerCallback()
258267 setTransform (juce::AffineTransform::scale (scale));
259268 IntersectLookAndFeel::setMenuScale (scale);
260269 saveUserSettings (scale, getTheme ().name );
270+ uiChanged = true ;
261271 }
262272
263- repaint ();
273+ // Waveform cursor/playhead animation updates continuously.
274+ waveformView.repaint ();
275+
276+ // Other components only need repaint when snapshot/theme/scale changes.
277+ if (uiChanged)
278+ {
279+ headerBar.repaint ();
280+ sliceLane.repaint ();
281+ scrollZoomBar.repaint ();
282+ sliceControlBar.repaint ();
283+ actionPanel.repaint ();
284+ }
264285}
265286
266287void IntersectEditor::ensureDefaultThemes ()
0 commit comments