/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ #ifndef __GRAPHEDITORPANEL_JUCEHEADER__ #define __GRAPHEDITORPANEL_JUCEHEADER__ #include "FilterGraph.h" class FilterComponent; class ConnectorComponent; class PinComponent; //============================================================================== /** A panel that displays and edits a FilterGraph. */ class GraphEditorPanel : public Component, public ChangeListener { public: GraphEditorPanel (FilterGraph& graph); ~GraphEditorPanel(); void paint (Graphics& g); void mouseDown (const MouseEvent& e); void createNewPlugin (const PluginDescription* desc, int x, int y); FilterComponent* getComponentForFilter (uint32 filterID) const; ConnectorComponent* getComponentForConnection (const AudioProcessorGraph::Connection& conn) const; PinComponent* findPinAt (int x, int y) const; void resized(); void changeListenerCallback (ChangeBroadcaster*); void updateComponents(); //============================================================================== void beginConnectorDrag (uint32 sourceFilterID, int sourceFilterChannel, uint32 destFilterID, int destFilterChannel, const MouseEvent& e); void dragConnector (const MouseEvent& e); void endDraggingConnector (const MouseEvent& e); //============================================================================== private: FilterGraph& graph; ScopedPointer draggingConnector; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GraphEditorPanel) }; //============================================================================== /** A panel that embeds a GraphEditorPanel with a midi keyboard at the bottom. It also manages the graph itself, and plays it. */ class GraphDocumentComponent : public Component { public: //============================================================================== GraphDocumentComponent (AudioPluginFormatManager& formatManager, AudioDeviceManager* deviceManager); ~GraphDocumentComponent(); //============================================================================== void createNewPlugin (const PluginDescription* desc, int x, int y); inline void setDoublePrecision (bool doublePrecision) { graphPlayer.setDoublePrecisionProcessing (doublePrecision); } //============================================================================== ScopedPointer graph; //============================================================================== void resized(); //============================================================================== void unfocusKeyboardComponent(); //============================================================================== void releaseGraph(); private: //============================================================================== AudioDeviceManager* deviceManager; AudioProcessorPlayer graphPlayer; MidiKeyboardState keyState; public: GraphEditorPanel* graphPanel; private: Component* keyboardComp; Component* statusBar; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GraphDocumentComponent) }; //============================================================================== /** A desktop window containing a plugin's UI. */ class PluginWindow : public DocumentWindow { public: enum WindowFormatType { Normal = 0, Generic, Programs, Parameters, AudioIO, NumTypes }; PluginWindow (Component* pluginEditor, AudioProcessorGraph::Node*, WindowFormatType, AudioProcessorGraph&); ~PluginWindow(); static PluginWindow* getWindowFor (AudioProcessorGraph::Node*, WindowFormatType, AudioProcessorGraph&); static void closeCurrentlyOpenWindowsFor (const uint32 nodeId); static void closeAllCurrentlyOpenWindows(); void moved() override; void closeButtonPressed() override; private: AudioProcessorGraph& graph; AudioProcessorGraph::Node* owner; WindowFormatType type; float getDesktopScaleFactor() const override { return 1.0f; } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginWindow) }; inline String toString (PluginWindow::WindowFormatType type) { switch (type) { case PluginWindow::Normal: return "Normal"; case PluginWindow::Generic: return "Generic"; case PluginWindow::Programs: return "Programs"; case PluginWindow::Parameters: return "Parameters"; default: return String(); } } inline String getLastXProp (PluginWindow::WindowFormatType type) { return "uiLastX_" + toString (type); } inline String getLastYProp (PluginWindow::WindowFormatType type) { return "uiLastY_" + toString (type); } inline String getOpenProp (PluginWindow::WindowFormatType type) { return "uiopen_" + toString (type); } #endif // __GRAPHEDITORPANEL_JUCEHEADER__