1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

Use WebViewLifetimeListener in WebControlRelays

This commit is contained in:
attila 2024-08-23 10:08:01 +02:00
parent b395239884
commit 853e2052ff
4 changed files with 98 additions and 27 deletions

View file

@ -2,6 +2,32 @@
# develop
## Change
The constructors of the WebSliderRelay, WebToggleButtonRelay and
WebComboBoxRelay classes were changed and they no longer accept a reference
parameter to a WebBrowserComponent object.
**Possible Issues**
Code that uses these classes will fail to compile.
**Workaround**
Omit the WebBrowserComponent parameter when constructing the relay objects.
**Rationale**
The relay classes use a new underlying mechanism to obtain a pointer to the
WebBrowserComponent object. When calling the
WebBrowserComponent::Options::withOptionsFrom() function with the relay as a
parameter, the corresponding WebBrowserComponent object will notify the relay
about its creation and destruction.
This avoids the anti-pattern where the relay class required a reference to a
yet uninitialised WebBrowserComponent object.
## Change
The coefficients of LadderFilter::Mode::BPF12 have been changed, causing a

View file

@ -438,9 +438,9 @@ public:
private:
WebViewPluginAudioProcessor& processorRef;
WebSliderRelay cutoffSliderRelay { webComponent, "cutoffSlider" };
WebToggleButtonRelay muteToggleRelay { webComponent, "muteToggle" };
WebComboBoxRelay filterTypeComboRelay { webComponent, "filterTypeCombo" };
WebSliderRelay cutoffSliderRelay { "cutoffSlider" };
WebToggleButtonRelay muteToggleRelay { "muteToggle" };
WebComboBoxRelay filterTypeComboRelay { "filterTypeCombo" };
WebControlParameterIndexReceiver controlParameterIndexReceiver;

View file

@ -37,9 +37,8 @@ namespace juce
#if JUCE_WEB_BROWSER
WebSliderRelay::WebSliderRelay (WebBrowserComponent& browserIn, StringRef nameIn)
: browser (browserIn),
name (nameIn)
WebSliderRelay::WebSliderRelay (StringRef nameIn)
: name (nameIn)
{
}
@ -75,12 +74,25 @@ WebBrowserComponent::Options WebSliderRelay::buildOptions (const WebBrowserCompo
{
return initialOptions
.withEventListener (eventId, [this] (auto object) { handleEvent (object); })
.withInitialisationData ("__juce__sliders", name);
.withInitialisationData ("__juce__sliders", name)
.withWebViewLifetimeListener (this);
}
void WebSliderRelay::emitEvent (const var& payload)
{
browser.emitEventIfBrowserIsVisible (eventId, payload);
if (browser != nullptr)
browser->emitEventIfBrowserIsVisible (eventId, payload);
}
void WebSliderRelay::webViewConstructed (WebBrowserComponent* browserIn)
{
browser = browserIn;
listeners.call (&Listener::initialUpdateRequested, this);
}
void WebSliderRelay::webViewDestructed (WebBrowserComponent*)
{
browser = nullptr;
}
void WebSliderRelay::handleEvent (const var& event)
@ -122,9 +134,8 @@ void WebSliderRelay::handleEvent (const var& event)
}
//==============================================================================
WebToggleButtonRelay::WebToggleButtonRelay ([[maybe_unused]] WebBrowserComponent& browserIn, StringRef nameIn)
: browser (browserIn),
name (nameIn)
WebToggleButtonRelay::WebToggleButtonRelay (StringRef nameIn)
: name (nameIn)
{
}
@ -154,12 +165,25 @@ WebBrowserComponent::Options WebToggleButtonRelay::buildOptions (const WebBrowse
{
return initialOptions
.withEventListener (eventId, [this] (auto object) { handleEvent (object); })
.withInitialisationData ("__juce__toggles", name);
.withInitialisationData ("__juce__toggles", name)
.withWebViewLifetimeListener (this);
}
void WebToggleButtonRelay::emitEvent (const var& payload)
{
browser.emitEventIfBrowserIsVisible (eventId, payload);
if (browser != nullptr)
browser->emitEventIfBrowserIsVisible (eventId, payload);
}
void WebToggleButtonRelay::webViewConstructed (WebBrowserComponent* browserIn)
{
browser = browserIn;
listeners.call (&Listener::initialUpdateRequested);
}
void WebToggleButtonRelay::webViewDestructed (WebBrowserComponent*)
{
browser = nullptr;
}
void WebToggleButtonRelay::handleEvent (const var& event)
@ -187,9 +211,8 @@ void WebToggleButtonRelay::handleEvent (const var& event)
}
//==============================================================================
WebComboBoxRelay::WebComboBoxRelay ([[maybe_unused]] WebBrowserComponent& browserIn, StringRef nameIn)
: browser (browserIn),
name (nameIn)
WebComboBoxRelay::WebComboBoxRelay (StringRef nameIn)
: name (nameIn)
{
}
@ -219,12 +242,25 @@ WebBrowserComponent::Options WebComboBoxRelay::buildOptions (const WebBrowserCom
{
return initialOptions
.withEventListener (eventId, [this] (auto object) { handleEvent (object); })
.withInitialisationData ("__juce__comboBoxes", name);
.withInitialisationData ("__juce__comboBoxes", name)
.withWebViewLifetimeListener (this);
}
void WebComboBoxRelay::emitEvent (const var& payload)
{
browser.emitEventIfBrowserIsVisible (eventId, payload);
if (browser != nullptr)
browser->emitEventIfBrowserIsVisible (eventId, payload);
}
void WebComboBoxRelay::webViewConstructed (WebBrowserComponent* browserIn)
{
browser = browserIn;
listeners.call (&Listener::initialUpdateRequested);
}
void WebComboBoxRelay::webViewDestructed (WebBrowserComponent*)
{
browser = nullptr;
}
void WebComboBoxRelay::handleEvent (const var& event)

View file

@ -62,14 +62,15 @@ namespace juce
@tags{GUI}
*/
class JUCE_API WebSliderRelay : public OptionsBuilder<WebBrowserComponent::Options>
class JUCE_API WebSliderRelay : public OptionsBuilder<WebBrowserComponent::Options>,
private WebViewLifetimeListener
{
public:
/** Creating a relay will ensure that a Javascript object under the provided name will be
available in the specified WebBrowserComponent's context. Use the frontend framework's
getSliderState function with the same name to get a hold of this object.
*/
WebSliderRelay (WebBrowserComponent& browserIn, StringRef nameIn);
WebSliderRelay (StringRef nameIn);
//==============================================================================
/** @internal */
@ -98,8 +99,10 @@ public:
private:
void handleEvent (const var& event);
void webViewConstructed (WebBrowserComponent*) override;
void webViewDestructed (WebBrowserComponent*) override;
WebBrowserComponent& browser;
WebBrowserComponent* browser = nullptr;
String name;
float value{};
Identifier eventId { "__juce__slider" + name };
@ -134,14 +137,15 @@ private:
@tags{GUI}
*/
class JUCE_API WebToggleButtonRelay : public OptionsBuilder<WebBrowserComponent::Options>
class JUCE_API WebToggleButtonRelay : public OptionsBuilder<WebBrowserComponent::Options>,
private WebViewLifetimeListener
{
public:
/** Creating a relay will ensure that a Javascript object under the provided name will be
available in the specified WebBrowserComponent's context. Use the frontend framework's
getToggleState function with the same name to get a hold of this object.
*/
WebToggleButtonRelay (WebBrowserComponent& browserIn, StringRef nameIn);
WebToggleButtonRelay (StringRef nameIn);
//==============================================================================
/** @internal */
@ -169,8 +173,10 @@ public:
private:
void handleEvent (const var& event);
void webViewConstructed (WebBrowserComponent*) override;
void webViewDestructed (WebBrowserComponent*) override;
WebBrowserComponent& browser;
WebBrowserComponent* browser = nullptr;
String name;
Identifier eventId { "__juce__toggle" + name };
ListenerList<Listener> listeners;
@ -204,14 +210,15 @@ private:
@tags{GUI}
*/
class JUCE_API WebComboBoxRelay : public OptionsBuilder<WebBrowserComponent::Options>
class JUCE_API WebComboBoxRelay : public OptionsBuilder<WebBrowserComponent::Options>,
private WebViewLifetimeListener
{
public:
/** Creating a relay will ensure that a Javascript object under the provided name will be
available in the specified WebBrowserComponent's context. Use the frontend framework's
getComboBoxState function with the same name to get a hold of this object.
*/
WebComboBoxRelay (WebBrowserComponent& browserIn, StringRef nameIn);
WebComboBoxRelay (StringRef nameIn);
//==============================================================================
/** @internal */
@ -239,8 +246,10 @@ public:
private:
void handleEvent (const var& event);
void webViewConstructed (WebBrowserComponent*) override;
void webViewDestructed (WebBrowserComponent*) override;
WebBrowserComponent& browser;
WebBrowserComponent* browser = nullptr;
String name;
Identifier eventId { "__juce__comboBox" + name };
ListenerList<Listener> listeners;