Skip to content

Commit e77c355

Browse files
committed
Improved keyboard focus management for UI panels and menus
1 parent b1fab86 commit e77c355

18 files changed

Lines changed: 104 additions & 21 deletions

plugin/include/XenRoll/editor/PluginEditor.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,12 @@ class AudioPluginAudioProcessorEditor : public juce::AudioProcessorEditor,
367367
void timerCallback();
368368

369369
/**
370-
* @brief Bring keyboard focus back to main panel
370+
* @brief Bring keyboard focus back to viewed panel
371371
*/
372-
void bringBackKeyboardFocus() { mainPanel->grabKeyboardFocus(); }
372+
void bringBackKeyboardFocus() {
373+
if (viewedPanel)
374+
viewedPanel->grabKeyboardFocus();
375+
}
373376

374377
/**
375378
* @brief Called when A4 frequency changes
@@ -442,6 +445,8 @@ class AudioPluginAudioProcessorEditor : public juce::AudioProcessorEditor,
442445
private:
443446
AudioPluginAudioProcessor &processorRef;
444447

448+
juce::Component* viewedPanel;
449+
445450
std::shared_ptr<DissonanceMeter> dissonanceMeter;
446451

447452
std::shared_ptr<PitchMemory> pitchMemory;

plugin/include/XenRoll/editor/menus/ClockDiagramMenu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class ClockDiagramMenu : public juce::Component {
2121
g.drawRect(getLocalBounds().toFloat(), Theme::wider);
2222
}
2323

24+
void visibilityChanged() override;
25+
2426
private:
2527
AudioPluginAudioProcessorEditor &editor;
2628
Parameters &params;

plugin/include/XenRoll/editor/menus/EditRatiosMarksMenu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class EditRatiosMarksMenu : public juce::Component {
2121
g.drawRect(getLocalBounds().toFloat(), Theme::wider);
2222
}
2323

24+
void visibilityChanged() override;
25+
2426
private:
2527
AudioPluginAudioProcessorEditor &editor;
2628
Parameters &params;

plugin/include/XenRoll/editor/menus/GenNewKeysMenu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class GenNewKeysMenu : public juce::Component {
2121
g.drawRect(getLocalBounds().toFloat(), Theme::wider);
2222
}
2323

24+
void visibilityChanged() override;
25+
2426
private:
2527
AudioPluginAudioProcessorEditor &editor;
2628
Parameters &params;

plugin/include/XenRoll/editor/menus/InstancesMenu.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,7 @@ class InstancesMenu : public juce::Component {
1313

1414
void buildMenu();
1515

16-
void visibilityChanged() override {
17-
if (isVisible()) {
18-
std::set<int> mbNewPossibleInds = getPossibleInds();
19-
if (mbNewPossibleInds != possibleInds) {
20-
possibleInds = mbNewPossibleInds;
21-
buildMenu();
22-
}
23-
}
24-
}
16+
void visibilityChanged() override;
2517

2618
void paint(juce::Graphics &g) override {
2719
g.fillAll(params.theme.darker);

plugin/include/XenRoll/editor/menus/MoreToolsMenu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class MoreToolsMenu : public juce::Component {
2121
g.drawRect(getLocalBounds().toFloat(), Theme::wider);
2222
}
2323

24+
void visibilityChanged() override;
25+
2426
private:
2527
AudioPluginAudioProcessorEditor &editor;
2628
Theme &theme;

plugin/include/XenRoll/editor/menus/VocalToMelodyMenu.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,7 @@ class VocalToMelodyMenu : public juce::Component {
3232
Theme::wider);
3333
}
3434

35-
void visibilityChanged() override {
36-
if (isVisible()) {
37-
micGain_dBSlider->setValue(GlobalSettings::getInstance().getMicGain_dB());
38-
}
39-
}
35+
void visibilityChanged() override;
4036

4137
private:
4238
AudioPluginAudioProcessorEditor &editor;

plugin/include/XenRoll/editor/panels/HelpPanel.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ namespace audio_plugin {
88

99
class HelpPanel : public juce::Component {
1010
public:
11-
HelpPanel(Theme &theme) : theme(theme) { setVisible(false); }
11+
HelpPanel(Theme &theme) : theme(theme) {
12+
setWantsKeyboardFocus(true);
13+
setVisible(false);
14+
}
1215

1316
void paint(juce::Graphics &g) override {
1417
g.fillAll(theme.darker);

plugin/source/editor/PluginEditor.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor(AudioPluginAudi
197197
mainPanel->initViewport();
198198
mainPanel->setPlayHeadTime(playHeadTime);
199199
addAndMakeVisible(mainViewport.get());
200+
viewedPanel = mainPanel.get();
200201

201202
clockDiagramPanel =
202203
std::make_unique<ClockDiagramPanel>(processorRef.params, *this, mainPanel->getNotes());
@@ -273,7 +274,14 @@ AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor(AudioPluginAudi
273274
addAndMakeVisible(pitchMemorySettingsButton.get());
274275

275276
settingsButton->onClick = [this](const juce::MouseEvent &me) {
276-
settingsViewport->setVisible(!settingsViewport->isVisible());
277+
bool newVisible = !settingsViewport->isVisible();
278+
settingsViewport->setVisible(newVisible); // viewport
279+
if (newVisible) {
280+
viewedPanel = settingsPanel.get(); // panel
281+
} else {
282+
viewedPanel = mainPanel.get();
283+
}
284+
bringBackKeyboardFocus();
277285

278286
helpViewport->setVisible(false);
279287
dissonancePanel->setVisible(false);
@@ -283,7 +291,14 @@ AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor(AudioPluginAudi
283291
return false;
284292
};
285293
helpButton->onClick = [this](const juce::MouseEvent &me) {
286-
helpViewport->setVisible(!helpViewport->isVisible());
294+
bool newVisible = !helpViewport->isVisible();
295+
helpViewport->setVisible(newVisible); // viewport
296+
if (newVisible) {
297+
viewedPanel = helpPanel.get(); // panel
298+
} else {
299+
viewedPanel = mainPanel.get();
300+
}
301+
bringBackKeyboardFocus();
287302

288303
settingsViewport->setVisible(false);
289304
dissonancePanel->setVisible(false);
@@ -293,7 +308,14 @@ AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor(AudioPluginAudi
293308
return false;
294309
};
295310
dissonanceButton->onClick = [this](const juce::MouseEvent &me) {
296-
dissonancePanel->setVisible(!dissonancePanel->isVisible());
311+
bool newVisible = !dissonancePanel->isVisible();
312+
dissonancePanel->setVisible(newVisible);
313+
if (newVisible) {
314+
viewedPanel = dissonancePanel.get();
315+
} else {
316+
viewedPanel = mainPanel.get();
317+
}
318+
bringBackKeyboardFocus();
297319

298320
helpViewport->setVisible(false);
299321
settingsViewport->setVisible(false);
@@ -303,7 +325,14 @@ AudioPluginAudioProcessorEditor::AudioPluginAudioProcessorEditor(AudioPluginAudi
303325
return false;
304326
};
305327
pitchMemorySettingsButton->onClick = [this](const juce::MouseEvent &me) {
306-
pitchMemorySettingsPanel->setVisible(!pitchMemorySettingsPanel->isVisible());
328+
bool newVisible = !pitchMemorySettingsPanel->isVisible();
329+
pitchMemorySettingsPanel->setVisible(newVisible);
330+
if (newVisible) {
331+
viewedPanel = pitchMemorySettingsPanel.get();
332+
} else {
333+
viewedPanel = mainPanel.get();
334+
}
335+
bringBackKeyboardFocus();
307336

308337
settingsViewport->setVisible(false);
309338
helpViewport->setVisible(false);

plugin/source/editor/menus/ClockDiagramMenu.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,10 @@ ClockDiagramMenu::ClockDiagramMenu(Parameters &params, AudioPluginAudioProcessor
4141
const int totalHeight = y + vertPadding;
4242
setSize(width, totalHeight);
4343
}
44+
45+
void ClockDiagramMenu::visibilityChanged() {
46+
if (!isVisible()) {
47+
editor.bringBackKeyboardFocus();
48+
}
49+
}
4450
} // namespace audio_plugin

0 commit comments

Comments
 (0)