From 90d40b8b59b0bc74d106c1cea3d79d836eaa34d0 Mon Sep 17 00:00:00 2001 From: Ben Kuper Date: Mon, 22 Jul 2019 10:26:19 +0200 Subject: [PATCH] 1.0.12b2 fixed alpha mode, transparent block UI and separate fade in/out --- BenTo.jucer | 2 +- Builds/LinuxMakefile/Makefile | 4 +- Builds/MacOSX/BenTo.xcodeproj/project.pbxproj | 4 +- Builds/MacOSX/Info-App.plist | 4 +- .../MacOSX_CI/BenTo.xcodeproj/project.pbxproj | 4 +- Builds/MacOSX_CI/Info-App.plist | 4 +- Builds/VS2017_CI/BenTo_App.vcxproj | 2 +- Builds/VS2017_CI/resources.rc | 6 +-- JuceLibraryCode/JuceHeader.h | 2 +- Source/Prop/ui/PropViz.cpp | 2 +- Source/Timeline/TimelineBlockSequence.cpp | 18 ++++++--- .../Timeline/layers/Block/LightBlockClip.cpp | 40 ++++++++++++++++--- Source/Timeline/layers/Block/LightBlockClip.h | 40 ++++++++++++++++++- .../layers/Block/LightBlockClipManager.cpp | 28 +++++++++++-- .../layers/Block/LightBlockClipManager.h | 7 +++- .../Timeline/layers/Block/LightBlockLayer.cpp | 3 +- .../layers/Block/ui/LightBlockClipUI.cpp | 34 +++++++++++----- .../layers/Block/ui/LightBlockClipUI.h | 3 ++ 18 files changed, 160 insertions(+), 47 deletions(-) diff --git a/BenTo.jucer b/BenTo.jucer index 80fc5b17..4ab3a29b 100644 --- a/BenTo.jucer +++ b/BenTo.jucer @@ -1,7 +1,7 @@ + id="LP0of5" version="1.0.12b2"> diff --git a/Builds/LinuxMakefile/Makefile b/Builds/LinuxMakefile/Makefile index fb4420f1..68222261 100644 --- a/Builds/LinuxMakefile/Makefile +++ b/Builds/LinuxMakefile/Makefile @@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := -m64 endif - JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.12b1 -DJUCE_APP_VERSION_HEX=0x1000c $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I$(HOME)/JUCE/modules -I../../../JUCE\ Modules -I../../External/serial/include -I../../Source $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.12b2 -DJUCE_APP_VERSION_HEX=0x1000c $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I$(HOME)/JUCE/modules -I../../../JUCE\ Modules -I../../External/serial/include -I../../Source $(CPPFLAGS) JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0 JUCE_TARGET_APP := BenTo @@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := -m64 endif - JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.12b1 -DJUCE_APP_VERSION_HEX=0x1000c $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I$(HOME)/JUCE/modules -I../../../JUCE\ Modules -I../../External/serial/include -I../../Source $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.12b2 -DJUCE_APP_VERSION_HEX=0x1000c $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I$(HOME)/JUCE/modules -I../../../JUCE\ Modules -I../../External/serial/include -I../../Source $(CPPFLAGS) JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0 JUCE_TARGET_APP := BenTo diff --git a/Builds/MacOSX/BenTo.xcodeproj/project.pbxproj b/Builds/MacOSX/BenTo.xcodeproj/project.pbxproj index e2169bf8..c6cfdaa0 100644 --- a/Builds/MacOSX/BenTo.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/BenTo.xcodeproj/project.pbxproj @@ -3443,7 +3443,7 @@ "_DEBUG=1", "DEBUG=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=1.0.12b1", + "JUCE_APP_VERSION=1.0.12b2", "JUCE_APP_VERSION_HEX=0x1000c", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", @@ -3488,7 +3488,7 @@ "_NDEBUG=1", "NDEBUG=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=1.0.12b1", + "JUCE_APP_VERSION=1.0.12b2", "JUCE_APP_VERSION_HEX=0x1000c", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", diff --git a/Builds/MacOSX/Info-App.plist b/Builds/MacOSX/Info-App.plist index cd2cad78..d02b1aa4 100644 --- a/Builds/MacOSX/Info-App.plist +++ b/Builds/MacOSX/Info-App.plist @@ -23,9 +23,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.0.12b1 + 1.0.12b2 CFBundleVersion - 1.0.12b1 + 1.0.12b2 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/Builds/MacOSX_CI/BenTo.xcodeproj/project.pbxproj b/Builds/MacOSX_CI/BenTo.xcodeproj/project.pbxproj index 3184c7de..90f8f390 100644 --- a/Builds/MacOSX_CI/BenTo.xcodeproj/project.pbxproj +++ b/Builds/MacOSX_CI/BenTo.xcodeproj/project.pbxproj @@ -3443,7 +3443,7 @@ "_DEBUG=1", "DEBUG=1", "JUCER_XCODE_MAC_2F3811D6=1", - "JUCE_APP_VERSION=1.0.12b1", + "JUCE_APP_VERSION=1.0.12b2", "JUCE_APP_VERSION_HEX=0x1000c", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", @@ -3488,7 +3488,7 @@ "_NDEBUG=1", "NDEBUG=1", "JUCER_XCODE_MAC_2F3811D6=1", - "JUCE_APP_VERSION=1.0.12b1", + "JUCE_APP_VERSION=1.0.12b2", "JUCE_APP_VERSION_HEX=0x1000c", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", diff --git a/Builds/MacOSX_CI/Info-App.plist b/Builds/MacOSX_CI/Info-App.plist index cd2cad78..d02b1aa4 100644 --- a/Builds/MacOSX_CI/Info-App.plist +++ b/Builds/MacOSX_CI/Info-App.plist @@ -23,9 +23,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 1.0.12b1 + 1.0.12b2 CFBundleVersion - 1.0.12b1 + 1.0.12b2 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/Builds/VS2017_CI/BenTo_App.vcxproj b/Builds/VS2017_CI/BenTo_App.vcxproj index 9fbffb3a..abd24702 100644 --- a/Builds/VS2017_CI/BenTo_App.vcxproj +++ b/Builds/VS2017_CI/BenTo_App.vcxproj @@ -47,7 +47,7 @@ Full ..\..\JuceLibraryCode;..\..\..\JUCE\modules;..\..\..\JUCE Modules;../../External/asio;../../External/serial/include;../../Source;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_6069D29A=1;JUCE_APP_VERSION=1.0.12b1;JUCE_APP_VERSION_HEX=0x1000c;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_6069D29A=1;JUCE_APP_VERSION=1.0.12b2;JUCE_APP_VERSION_HEX=0x1000c;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) MultiThreadedDLL true diff --git a/Builds/VS2017_CI/resources.rc b/Builds/VS2017_CI/resources.rc index 1269de3e..9b98361c 100644 --- a/Builds/VS2017_CI/resources.rc +++ b/Builds/VS2017_CI/resources.rc @@ -7,16 +7,16 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 1,0,12b1,0 +FILEVERSION 1,0,12b2,0 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription", "BenTo\0" - VALUE "FileVersion", "1.0.12b1\0" + VALUE "FileVersion", "1.0.12b2\0" VALUE "ProductName", "BenTo\0" - VALUE "ProductVersion", "1.0.12b1\0" + VALUE "ProductVersion", "1.0.12b2\0" END END diff --git a/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/JuceHeader.h index 3530f8fa..26efb6bf 100644 --- a/JuceLibraryCode/JuceHeader.h +++ b/JuceLibraryCode/JuceHeader.h @@ -44,7 +44,7 @@ namespace ProjectInfo { const char* const projectName = "BenTo"; const char* const companyName = ""; - const char* const versionString = "1.0.12b1"; + const char* const versionString = "1.0.12b2"; const int versionNumber = 0x1000c; } #endif diff --git a/Source/Prop/ui/PropViz.cpp b/Source/Prop/ui/PropViz.cpp index f1995e61..d8801db4 100644 --- a/Source/Prop/ui/PropViz.cpp +++ b/Source/Prop/ui/PropViz.cpp @@ -42,7 +42,7 @@ void PropViz::paint(Graphics & g) for (int i = 0; i < numLeds; i++) { Rectangle ledR = lr.removeFromTop(ledSize).reduced(1).toFloat(); - g.setColour(Colours::white.withAlpha(.15f)); + g.setColour(Colours::white.withAlpha(.2f)); g.drawEllipse(ledR, .5f); g.setColour(prop->colors[i]); g.fillEllipse(ledR); diff --git a/Source/Timeline/TimelineBlockSequence.cpp b/Source/Timeline/TimelineBlockSequence.cpp index c9032ea3..589e370a 100644 --- a/Source/Timeline/TimelineBlockSequence.cpp +++ b/Source/Timeline/TimelineBlockSequence.cpp @@ -79,10 +79,15 @@ Array TimelineBlockSequence::getColors(Prop * p, double time, var params for (auto &l : layers) { if (l == nullptr) continue; - String s = l->niceName; + params.getDynamicObject()->setProperty("forceID", l->filterManager->getTargetIDForProp(p)); - colors.add(l->getColors(p, t, params)); //use sequence's time instead of prop time + Array cols = l->getColors(p, t, params); //use sequence's time instead of prop time + + if (cols.isEmpty()) continue; + + colors.add(cols); blendModes.add(l->blendMode->getValueDataAsEnum()); + numActiveLayers++; } @@ -102,10 +107,11 @@ Array TimelineBlockSequence::getColors(Prop * p, double time, var params case LightBlockLayer::ALPHA: { - r = r + (colors[j][i].getFloatRed() - r) * a; - g = g + (colors[j][i].getFloatGreen() - g) * a; - b = b + (colors[j][i].getFloatBlue() - b) * a; - a += colors[j][i].getFloatAlpha(); + float ca = colors[j][i].getFloatAlpha(); + r = r + (colors[j][i].getFloatRed() - r) * ca; + g = g + (colors[j][i].getFloatGreen() - g) * ca; + b = b + (colors[j][i].getFloatBlue() - b) * ca; + a += ca; } break; diff --git a/Source/Timeline/layers/Block/LightBlockClip.cpp b/Source/Timeline/layers/Block/LightBlockClip.cpp index 209638aa..a0b50e73 100644 --- a/Source/Timeline/layers/Block/LightBlockClip.cpp +++ b/Source/Timeline/layers/Block/LightBlockClip.cpp @@ -15,7 +15,8 @@ LightBlockClip::LightBlockClip(LightBlockLayer * layer, float _time) : LayerBlock("LightBlockClip", _time), - layer(layer) + layer(layer), + clipNotifier(10) { itemDataType = "LightBlockClip"; @@ -23,11 +24,12 @@ LightBlockClip::LightBlockClip(LightBlockLayer * layer, float _time) : activeProvider->targetType = TargetParameter::CONTAINER; activeProvider->customGetTargetContainerFunc = &LightBlockModelLibrary::showProvidersAndGet; - autoFade = addBoolParameter("Auto Fade", "If checked, when clips are overlapping, fade will be adjusted automatically", true); - fadeIn = addFloatParameter("Fade In", "Fade in time", 0, 0, getTotalLength()); - fadeOut = addFloatParameter("Fade Out", "Fade out time", 0, 0, getTotalLength()); - fadeIn->setControllableFeedbackOnly(autoFade->boolValue()); - fadeOut->setControllableFeedbackOnly(autoFade->boolValue()); + //autoFade = addBoolParameter("Auto Fade", "If checked, when clips are overlapping, fade will be adjusted automatically", true); + + fadeIn = addFloatParameter("Fade In", "Fade in time", 0, 0, getTotalLength(), false); + fadeIn->canBeDisabledByUser = true; + fadeOut = addFloatParameter("Fade Out", "Fade out time", 0, 0, getTotalLength(), false); + fadeOut->canBeDisabledByUser = true; } LightBlockClip::~LightBlockClip() @@ -132,10 +134,21 @@ void LightBlockClip::onContainerParameterChangedInternal(Parameter * p) fadeIn->setRange(0, getTotalLength()); fadeOut->setRange(0, getTotalLength()); } + /* else if (p == autoFade) { fadeIn->setControllableFeedbackOnly(autoFade->boolValue()); fadeOut->setControllableFeedbackOnly(autoFade->boolValue()); + }*/ +} + +void LightBlockClip::controllableStateChanged(Controllable* c) +{ + LayerBlock::controllableStateChanged(c); + if (c == fadeIn || c == fadeOut) + { + clipListeners.call(&ClipListener::clipFadesChanged, this); + clipNotifier.addMessage(new ClipEvent(ClipEvent::FADES_CHANGED, this)); } } @@ -162,4 +175,19 @@ void LightBlockClip::loadJSONDataInternal(var data) } } + //Retro compatibility, to remove after + var params = data.getProperty("parameters",var()); + for (int i = 0; i < params.size(); i++) + { + if (params[i].getProperty("controlAddress", "") == "/autoFade") + { + bool val = params[i].getProperty("value", false); + fadeIn->setEnabled(!val); + fadeOut->setEnabled(!val); + break; + } + } + + + } diff --git a/Source/Timeline/layers/Block/LightBlockClip.h b/Source/Timeline/layers/Block/LightBlockClip.h index f5413a54..48f7300e 100644 --- a/Source/Timeline/layers/Block/LightBlockClip.h +++ b/Source/Timeline/layers/Block/LightBlockClip.h @@ -27,7 +27,7 @@ class LightBlockClip : TargetParameter * activeProvider; - BoolParameter * autoFade; + //BoolParameter * autoFade; FloatParameter * fadeIn; FloatParameter * fadeOut; @@ -40,10 +40,48 @@ class LightBlockClip : void setCoreLength(float value, bool stretch = false, bool stickToCoreEnd = false) override; + void onContainerParameterChangedInternal(Parameter * p) override; + virtual void controllableStateChanged(Controllable* c) override; var getJSONData() override; void loadJSONDataInternal(var data) override; String getTypeString() const override { return "LightBlockClip"; } + + + //Listener + //Listener + class ClipListener + { + public: + /** Destructor. */ + virtual ~ClipListener() {} + virtual void clipFadesChanged (LightBlockClip *) {} + }; + + ListenerList clipListeners; + void addClipListener(ClipListener* newListener) { clipListeners.add(newListener); } + void removeClipListener(ClipListener* listener) { clipListeners.remove(listener); } + + // ASYNC + class ClipEvent + { + public: + enum Type { FADES_CHANGED }; + + ClipEvent(Type t, LightBlockClip* p, var v = var()) : + type(t), clip(p), value(v) {} + + Type type; + LightBlockClip* clip; + var value; + }; + + QueuedNotifier clipNotifier; + typedef QueuedNotifier::Listener AsyncListener; + + void addAsyncClipListener(AsyncListener* newListener) { clipNotifier.addListener(newListener); } + void addAsyncCoalescedClipListener(AsyncListener* newListener) { clipNotifier.addAsyncCoalescedListener(newListener); } + void removeAsyncClipListener(AsyncListener* listener) { clipNotifier.removeListener(listener); } }; \ No newline at end of file diff --git a/Source/Timeline/layers/Block/LightBlockClipManager.cpp b/Source/Timeline/layers/Block/LightBlockClipManager.cpp index 6a18bf8f..78c2f779 100644 --- a/Source/Timeline/layers/Block/LightBlockClipManager.cpp +++ b/Source/Timeline/layers/Block/LightBlockClipManager.cpp @@ -29,6 +29,20 @@ LayerBlock * LightBlockClipManager::createItem() return new LightBlockClip(lightBlockLayer); } +void LightBlockClipManager::addItemInternal(LayerBlock* block, var data) +{ + LayerBlockManager::addItemInternal(block, data); + LightBlockClip* clip = dynamic_cast(block); + clip->addClipListener(this); +} + +void LightBlockClipManager::removeItemInternal(LayerBlock* block) +{ + LayerBlockManager::removeItemInternal(block); + LightBlockClip* clip = dynamic_cast(block); + clip->removeClipListener(this); +} + void LightBlockClipManager::onControllableFeedbackUpdate(ControllableContainer * cc, Controllable * c) { LightBlockClip * b = c->getParentAs(); @@ -42,6 +56,11 @@ void LightBlockClipManager::onControllableFeedbackUpdate(ControllableContainer * } } +void LightBlockClipManager::clipFadesChanged(LightBlockClip* clip) +{ + computeFadesForClip(clip, false); +} + void LightBlockClipManager::computeFadesForClip(LightBlockClip * clip, bool propagate) { int bIndex = items.indexOf(clip); @@ -63,12 +82,15 @@ void LightBlockClipManager::computeFadesForClip(LightBlockClip * clip, bool prop return; } - if (clip->autoFade->boolValue()) + if (!clip->fadeIn->enabled) { float fadeIn = prevBlock == nullptr ? 0 : jmax(prevBlock->getEndTime() - clip->time->floatValue(), 0.f); - float fadeOut = nextBlock == nullptr ? 0 : jmax(clip->getEndTime() - nextBlock->time->floatValue(), 0.f); - clip->fadeIn->setValue(fadeIn); + } + + if (!clip->fadeOut->enabled) + { + float fadeOut = nextBlock == nullptr ? 0 : jmax(clip->getEndTime() - nextBlock->time->floatValue(), 0.f); clip->fadeOut->setValue(fadeOut); } diff --git a/Source/Timeline/layers/Block/LightBlockClipManager.h b/Source/Timeline/layers/Block/LightBlockClipManager.h index daae73c9..797d5d4b 100644 --- a/Source/Timeline/layers/Block/LightBlockClipManager.h +++ b/Source/Timeline/layers/Block/LightBlockClipManager.h @@ -15,7 +15,8 @@ class LightBlockLayer; class LightBlockClipManager : - public LayerBlockManager + public LayerBlockManager, + public LightBlockClip::ClipListener { public: LightBlockClipManager(LightBlockLayer * layer); @@ -24,7 +25,11 @@ class LightBlockClipManager : LightBlockLayer * lightBlockLayer; LayerBlock * createItem() override; + void addItemInternal(LayerBlock* clip, var) override; + void removeItemInternal(LayerBlock* clip) override; + void onControllableFeedbackUpdate(ControllableContainer * cc, Controllable *c) override; + void clipFadesChanged(LightBlockClip* clip) override; void computeFadesForClip(LightBlockClip * clip, bool propagate); }; \ No newline at end of file diff --git a/Source/Timeline/layers/Block/LightBlockLayer.cpp b/Source/Timeline/layers/Block/LightBlockLayer.cpp index d4c09fd2..eca9332c 100644 --- a/Source/Timeline/layers/Block/LightBlockLayer.cpp +++ b/Source/Timeline/layers/Block/LightBlockLayer.cpp @@ -47,14 +47,13 @@ Array LightBlockLayer::getColors(Prop * p, double time, var params) int resolution = p->resolution->intValue(); Array result; - result.resize(resolution); if (blocks.size() == 0) { - result.fill(Colours::transparentBlack); return result; } + result.resize(resolution); Array> clipColors; for (auto &b : blocks) diff --git a/Source/Timeline/layers/Block/ui/LightBlockClipUI.cpp b/Source/Timeline/layers/Block/ui/LightBlockClipUI.cpp index d2ffe950..3b6cb688 100644 --- a/Source/Timeline/layers/Block/ui/LightBlockClipUI.cpp +++ b/Source/Timeline/layers/Block/ui/LightBlockClipUI.cpp @@ -25,8 +25,8 @@ LightBlockClipUI::LightBlockClipUI(LightBlockClip* _clip) : isDraggingModel(false) { - bgColor = BG_COLOR.brighter().withAlpha(.5f); - + bgColor = Colours::transparentBlack;// BG_COLOR.brighter().withAlpha(.5f); + previewProp.reset(new Prop()); generatePreview(); @@ -36,24 +36,29 @@ LightBlockClipUI::LightBlockClipUI(LightBlockClip* _clip) : addChildComponent(&fadeInHandle, 0); addChildComponent(&fadeOutHandle, 0); - fadeInHandle.setVisible(!clip->autoFade->boolValue()); - fadeOutHandle.setVisible(!clip->autoFade->boolValue()); + fadeInHandle.setVisible(clip->fadeIn->enabled); + fadeOutHandle.setVisible(clip->fadeOut->enabled); fadeInHandle.addMouseListener(this, false); fadeOutHandle.addMouseListener(this, false); + clip->addAsyncClipListener(this); + startTimerHz(10); startThread(); } LightBlockClipUI::~LightBlockClipUI() { + if (!inspectable.wasObjectDeleted()) clip->removeAsyncClipListener(this); signalThreadShouldExit(); waitForThreadToExit(500); } void LightBlockClipUI::paint(Graphics & g) { + bgColor = clip->currentBlock != nullptr ? Colours::transparentBlack : BG_COLOR.brighter().withAlpha(.5f); + LayerBlockUI::paint(g); @@ -76,17 +81,18 @@ void LightBlockClipUI::paint(Graphics & g) g.setColour(Colours::white.withAlpha(.5f)); } - Colour fColor = (clip->autoFade->boolValue() ? BLUE_COLOR : Colours::yellow).withAlpha(.5f); + Colour fInColor = (clip->fadeIn->enabled ? Colours::yellow : BLUE_COLOR).withAlpha(.5f); + Colour fOutColor = (clip->fadeOut->enabled?Colours::yellow : BLUE_COLOR).withAlpha(.5f); if (clip->fadeIn->floatValue() > 0) { - g.setColour(fColor); + g.setColour(fInColor); g.drawLine(0, getHeight(), getWidth()*(clip->fadeIn->floatValue() / clip->getTotalLength()), fadeInHandle.getY() + fadeInHandle.getHeight() / 2); } if (clip->fadeOut->floatValue() > 0) { - g.setColour(fColor); + g.setColour(fOutColor); g.drawLine(getWidth()*(1 - (clip->fadeOut->floatValue() / clip->getTotalLength())), fadeOutHandle.getY() + fadeOutHandle.getHeight() / 2, getWidth(), getHeight()); } } @@ -256,12 +262,18 @@ void LightBlockClipUI::controllableFeedbackUpdateInternal(Controllable * c) { generatePreview(); } +} - if (c == clip->autoFade) +void LightBlockClipUI::newMessage(const LightBlockClip::ClipEvent& e) +{ + switch (e.type) { - fadeInHandle.setVisible(!clip->autoFade->boolValue()); - fadeOutHandle.setVisible(!clip->autoFade->boolValue()); + case LightBlockClip::ClipEvent::FADES_CHANGED: + fadeInHandle.setVisible(clip->fadeIn->enabled); + fadeOutHandle.setVisible(clip->fadeOut->enabled); shouldRepaint = true; + resized(); + break; } } @@ -329,7 +341,7 @@ void LightBlockClipUI::run() continue; } - Image tmpImg = Image(Image::RGB, resX, resY, true); + Image tmpImg = Image(Image::ARGB, resX, resY, true); int id = clip->layer->previewID->intValue(); diff --git a/Source/Timeline/layers/Block/ui/LightBlockClipUI.h b/Source/Timeline/layers/Block/ui/LightBlockClipUI.h index 3f117ae1..8d4647d9 100644 --- a/Source/Timeline/layers/Block/ui/LightBlockClipUI.h +++ b/Source/Timeline/layers/Block/ui/LightBlockClipUI.h @@ -28,6 +28,7 @@ class LightBlockFadeHandle : class LightBlockClipUI : public LayerBlockUI, + public LightBlockClip::AsyncListener, public Thread, //Threaded preview generation public Timer { @@ -73,6 +74,8 @@ class LightBlockClipUI : void controllableFeedbackUpdateInternal(Controllable *) override; + void newMessage(const LightBlockClip::ClipEvent& e) override; + void itemDropped(const SourceDetails &source) override; void timerCallback() override;