From fb4bb338f8286966b86f1777a6d1d89622442688 Mon Sep 17 00:00:00 2001 From: Paul Walker Date: Mon, 6 May 2024 12:05:49 -0400 Subject: [PATCH] Towards documentation hiding Add a footer control to hide and show documentation in a plugin-wide sticky fashion. Closes #69 --- src-juce/AWConsolidatedEditor.cpp | 149 ++++++++++++++++++++++++++++-- src-juce/AWConsolidatedEditor.h | 12 ++- 2 files changed, 149 insertions(+), 12 deletions(-) diff --git a/src-juce/AWConsolidatedEditor.cpp b/src-juce/AWConsolidatedEditor.cpp index 0f60437..37980ca 100644 --- a/src-juce/AWConsolidatedEditor.cpp +++ b/src-juce/AWConsolidatedEditor.cpp @@ -42,6 +42,9 @@ void AWLookAndFeel::setDarkTheme() setColour(ColourIds::jogHovered, juce::Colour(160, 160, 165)); setColour(ColourIds::jogStroke, juce::Colours::white); + setColour(ColourIds::help, juce::Colour(20, 20, 25)); + setColour(ColourIds::helpHovered, juce::Colour(40, 40, 75)); + setColour(ColourIds::hamburger, juce::Colour(90, 90, 95)); setColour(ColourIds::hamburgerHovered, juce::Colour(160, 160, 165)); setColour(ColourIds::hamburgerStroke, juce::Colours::white); @@ -106,6 +109,9 @@ void AWLookAndFeel::setLightTheme() setColour(ColourIds::jogHovered, juce::Colour(95, 95, 90)); setColour(ColourIds::jogStroke, juce::Colours::black); + setColour(ColourIds::help, juce::Colour(220, 220, 245)); + setColour(ColourIds::helpHovered, juce::Colours::white); + setColour(ColourIds::hamburger, juce::Colour(165, 165, 160)); setColour(ColourIds::hamburgerHovered, juce::Colour(95, 95, 90)); setColour(ColourIds::hamburgerStroke, juce::Colours::black); @@ -411,6 +417,10 @@ struct Picker : public juce::Component, public juce::TextEditor::Listener teb.setX(teb.getX() + getBounds().getX()); teb.setY(teb.getY() + getBounds().getY() + teb.getHeight()); teb = teb.withHeight(400); + if (!editor->isDocDisplayed()) + { + teb = teb.expanded(70, 0); + } listBox->setBounds(teb); populateForTypein(); @@ -618,6 +628,53 @@ struct AWLink : public juce::Component } }; + +struct ToggleHelp : public juce::Button +{ + AWConsolidatedAudioProcessorEditor *editor; + ToggleHelp(AWConsolidatedAudioProcessorEditor *p) + : juce::Button(juce::String("Display Help") ), editor(p) + { + setAccessible(true); + } + void paintButton(juce::Graphics &g, bool shouldDrawButtonAsHighlighted, + bool shouldDrawButtonAsDown) override + { + g.setColour(findColour(ColourIds::help)); + if (isHovered) + g.setColour(findColour(ColourIds::helpHovered)); + + g.setFont(juce::Font(editor->jakartaSansMedium).withHeight(16)); + std::string txt = (editor->isDocDisplayed() ? "Hide Doc": "Show Doc"); + g.drawText(txt, getLocalBounds(), juce::Justification::centredRight); + } + + bool isHovered{false}; + void mouseEnter(const juce::MouseEvent &) override + { + isHovered = true; + repaint(); + } + void mouseExit(const juce::MouseEvent &) override + { + isHovered = false; + repaint(); + } + + void mouseDown(const juce::MouseEvent &) override { editor->toggleDocDisplay(); } + + bool keyPressed(const juce::KeyPress &p) override + { + if (p.getKeyCode() == juce::KeyPress::returnKey) + { + // dojog does long hold stuff so go direct + editor->toggleDocDisplay(); + return true; + } + return false; + } +}; + struct ParamDisp : juce::Component, juce::TextEditor::Listener { AWConsolidatedAudioProcessor::AWParam *weakParam{nullptr}; @@ -1018,7 +1075,7 @@ AWConsolidatedAudioProcessorEditor::AWConsolidatedAudioProcessorEditor( setFocusContainerType(juce::Component::FocusContainerType::keyboardFocusContainer); setWantsKeyboardFocus(true); - setSize(baseHeight, baseHeight); + setSize(baseWidth, baseHeight); auto fs = awres::get_filesystem(); try @@ -1112,14 +1169,11 @@ AWConsolidatedAudioProcessorEditor::AWConsolidatedAudioProcessorEditor( findColour(ColourIds::documentationForeground)); addAndMakeVisible(*docBodyEd); awTag = std::make_unique(jakartaSansSemi); - auto fa = getLocalBounds() - .withHeight(40) - .withY(getHeight() - 40) - .withTrimmedLeft(100) - .withTrimmedRight(100); - awTag->setBounds(fa); addAndMakeVisible(*awTag); + toggleHelp = std::make_unique(this); + addAndMakeVisible(*toggleHelp); + accessibleOrderWeakRefs.push_back(menuPicker.get()); accessibleOrderWeakRefs.push_back(menuPicker->hamburger.get()); accessibleOrderWeakRefs.push_back(menuPicker->up.get()); @@ -1128,8 +1182,7 @@ AWConsolidatedAudioProcessorEditor::AWConsolidatedAudioProcessorEditor( accessibleOrderWeakRefs.push_back(k.get()); accessibleOrderWeakRefs.push_back(docBodyLabel.get()); accessibleOrderWeakRefs.push_back(docBodyEd.get()); - - resizeDocArea(); + accessibleOrderWeakRefs.push_back(toggleHelp.get()); juce::PropertiesFile::Options options; options.applicationName = "AirwindowsConsolidated"; @@ -1148,6 +1201,9 @@ AWConsolidatedAudioProcessorEditor::AWConsolidatedAudioProcessorEditor( auto cs = properties->getIntValue("colorStrategy", (int)ColorStrategy::FOLLOW_SYSTEM); updateColorStrategy((ColorStrategy)cs, false); + + resized(); + sizeBasedOnDocAreaDisplay(); } AWConsolidatedAudioProcessorEditor::~AWConsolidatedAudioProcessorEditor() @@ -1202,6 +1258,17 @@ void AWConsolidatedAudioProcessorEditor::idle() void AWConsolidatedAudioProcessorEditor::resizeDocArea() { + if (!isDocDisplayed()) + { + docBodyLabel->setVisible(false); + docBodyEd->setVisible(false); + return; + } + else + { + docBodyLabel->setVisible(true); + docBodyEd->setVisible(true); + } docString = AirwinRegistry::documentationStringFor(processor.curentProcessorIndex); docHeader = docString.upToFirstOccurrenceOf("\n", false, false); docString = docString.fromFirstOccurrenceOf("\n", false, false).trim(); @@ -1235,7 +1302,41 @@ void AWConsolidatedAudioProcessorEditor::resizeDocArea() void AWConsolidatedAudioProcessorEditor::handleAsyncUpdate() {} -void AWConsolidatedAudioProcessorEditor::resized() {} +void AWConsolidatedAudioProcessorEditor::resized() { + if (!properties || !menuPicker) + { + // not set up yet + return; + } + + auto idd = isDocDisplayed(); + resizeDocArea(); + + auto fa = getLocalBounds() + .withHeight(40) + .withY(getHeight() - 40) + .withTrimmedLeft(100) + .withTrimmedRight(100); + awTag->setBounds(fa); + + menuPicker->setBounds(getLocalBounds().reduced(5).withHeight(60)); + + for (const auto &l : labels) + { + if (idd) + l->setSize(180, l->getHeight()); + else + { + auto w = getWidth() - 5 - l->getX(); + l->setSize(w, l->getHeight()); + } + } + + auto ta = getLocalBounds().withTrimmedTop(getHeight() - 40) + .withTrimmedLeft(getWidth() - 100).withTrimmedRight(5) + .withHeight(25); + toggleHelp->setBounds(ta); +} void AWConsolidatedAudioProcessorEditor::paint(juce::Graphics &g) { @@ -1580,3 +1681,31 @@ void AWConsolidatedAudioProcessorEditor::darkModeSettingChanged() repaint(); } + +bool AWConsolidatedAudioProcessorEditor::isDocDisplayed() +{ + if (!properties) + return true; + + return properties->getBoolValue("isDocDisplayed", true); +} + +void AWConsolidatedAudioProcessorEditor::toggleDocDisplay() +{ + auto res = properties->getBoolValue("isDocDisplayed", true); + properties->setValue("isDocDisplayed", !res); + sizeBasedOnDocAreaDisplay(); +} +void AWConsolidatedAudioProcessorEditor::sizeBasedOnDocAreaDisplay() +{ + resizeDocArea(); + if (isDocDisplayed()) + { + setSize(baseWidth, baseHeight); + } + else + { + setSize(baseWidth - 200, baseHeight); + } + repaint(); +} diff --git a/src-juce/AWConsolidatedEditor.h b/src-juce/AWConsolidatedEditor.h index 15bba6f..85bd562 100644 --- a/src-juce/AWConsolidatedEditor.h +++ b/src-juce/AWConsolidatedEditor.h @@ -7,10 +7,11 @@ //============================================================================== /** */ -struct DocPanel; struct ParamKnob; struct ParamDisp; struct Picker; +struct ToggleHelp; + enum ColourIds { gradientStart, @@ -18,6 +19,8 @@ enum ColourIds jog, jogHovered, jogStroke, + help, + helpHovered, hamburger, hamburgerHovered, hamburgerStroke, @@ -100,7 +103,7 @@ class AWConsolidatedAudioProcessorEditor : public juce::AudioProcessorEditor, // access the processor object that created it. AWConsolidatedAudioProcessor &processor; - static constexpr int baseWidth = 400, baseHeight = 600; + static constexpr int baseWidth = 600, baseHeight = 600; struct IdleTimer : juce::Timer { @@ -123,6 +126,11 @@ class AWConsolidatedAudioProcessorEditor : public juce::AudioProcessorEditor, std::unique_ptr docBodyLabel; void resizeDocArea(); + bool isDocDisplayed(); + void toggleDocDisplay(); + void sizeBasedOnDocAreaDisplay(); + std::unique_ptr toggleHelp; + juce::String docString, docHeader;