diff --git a/extras/Introjucer/Source/ComponentEditor/jucer_JucerDocument.cpp b/extras/Introjucer/Source/ComponentEditor/jucer_JucerDocument.cpp index 446cd026fe..ec3d19b6bc 100644 --- a/extras/Introjucer/Source/ComponentEditor/jucer_JucerDocument.cpp +++ b/extras/Introjucer/Source/ComponentEditor/jucer_JucerDocument.cpp @@ -430,7 +430,7 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const code.initialisers.addLines (variableInitialisers); if (! componentName.isEmpty()) - code.parentClassInitialiser = "Component (" + quotedString (code.componentName) + ")"; + code.constructorCode << "setName (" + quotedString (componentName) + ")\n"; // call these now, just to make sure they're the first two methods in the list. code.getCallbackCode (String::empty, "void", "paint (Graphics& g)", false) @@ -454,8 +454,7 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const "//[/UserPreSize]\n"; if (initialWidth > 0 || initialHeight > 0) - code.constructorCode - << "\nsetSize (" << initialWidth << ", " << initialHeight << ");\n"; + code.constructorCode << "\nsetSize (" << initialWidth << ", " << initialHeight << ");\n"; code.getCallbackCode (String::empty, "void", "paint (Graphics& g)", false) << "//[UserPaint] Add your own custom painting code here..\n//[/UserPaint]"; @@ -471,7 +470,12 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const { if (isOptionalMethodEnabled (methods[i])) { - String& s = code.getCallbackCode (baseClasses[i], returnValues[i], methods[i], false); + String baseClassToAdd (baseClasses[i]); + + if (baseClassToAdd == "Component" || baseClassToAdd == "Button") + baseClassToAdd = String::empty; + + String& s = code.getCallbackCode (baseClassToAdd, returnValues[i], methods[i], false); if (! s.contains ("//[")) { diff --git a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.cpp b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.cpp index b728fb828c..c692de8ede 100644 --- a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.cpp +++ b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.cpp @@ -357,9 +357,9 @@ void ComponentLayoutEditor::filesDropped (const StringArray& filenames, int x, i JucerComponentHandler jucerDocHandler; layout.getDocument()->beginTransaction(); - if (TestComponent* newOne = dynamic_cast (layout.addNewComponent (&jucerDocHandler, - x - subCompHolder->getX(), - y - subCompHolder->getY()))) + if (TestComponent* newOne = dynamic_cast (layout.addNewComponent (&jucerDocHandler, + x - subCompHolder->getX(), + y - subCompHolder->getY()))) { JucerComponentHandler::setJucerComponentFile (*layout.getDocument(), newOne, f.getRelativePathFrom (document.getCppFile().getParentDirectory())); @@ -370,6 +370,31 @@ void ComponentLayoutEditor::filesDropped (const StringArray& filenames, int x, i } } +bool ComponentLayoutEditor::isInterestedInDragSource (const SourceDetails& dragSourceDetails) +{ + if (dragSourceDetails.description != projectItemDragType) + return false; + + OwnedArray selectedNodes; + ProjectContentComponent::getSelectedProjectItemsBeingDragged (dragSourceDetails, selectedNodes); + + return selectedNodes.size() > 0; +} + +void ComponentLayoutEditor::itemDropped (const SourceDetails& dragSourceDetails) +{ + OwnedArray selectedNodes; + ProjectContentComponent::getSelectedProjectItemsBeingDragged (dragSourceDetails, selectedNodes); + + StringArray filenames; + + for (int i = 0; i < selectedNodes.size(); ++i) + if (selectedNodes.getUnchecked(i)->getFile().hasFileExtension (".cpp")) + filenames.add (selectedNodes.getUnchecked(i)->getFile().getFullPathName()); + + filesDropped (filenames, dragSourceDetails.localPosition.x, dragSourceDetails.localPosition.y); +} + ComponentOverlayComponent* ComponentLayoutEditor::getOverlayCompFor (Component* compToFind) const { for (int i = getNumChildComponents(); --i >= 0;) diff --git a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.h b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.h index 57ba5dd384..a524b921eb 100644 --- a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.h +++ b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutEditor.h @@ -36,7 +36,8 @@ class ComponentLayoutEditor : public Component, public ChangeListener, public FileDragAndDropTarget, - public LassoSource + public DragAndDropTarget, + public LassoSource { public: //============================================================================== @@ -44,24 +45,28 @@ public: ~ComponentLayoutEditor(); //============================================================================== - void paint (Graphics& g); - void resized(); - void visibilityChanged(); - void changeListenerCallback (ChangeBroadcaster*); + void paint (Graphics&) override; + void resized() override; + void visibilityChanged() override; + void changeListenerCallback (ChangeBroadcaster*) override; - void mouseDown (const MouseEvent& e); - void mouseDrag (const MouseEvent& e); - void mouseUp (const MouseEvent& e); - bool keyPressed (const KeyPress& key); + void mouseDown (const MouseEvent&) override; + void mouseDrag (const MouseEvent&) override; + void mouseUp (const MouseEvent&) override; + bool keyPressed (const KeyPress&) override; + + bool isInterestedInFileDrag (const StringArray& files) override; + void filesDropped (const StringArray& filenames, int x, int y) override; + + bool isInterestedInDragSource (const SourceDetails& dragSourceDetails) override; + void itemDropped (const SourceDetails& dragSourceDetails) override; - bool isInterestedInFileDrag (const StringArray& files); - void filesDropped (const StringArray& filenames, int x, int y); ComponentLayout& getLayout() const noexcept { return layout; } void findLassoItemsInArea (Array & results, const Rectangle& area); - SelectedItemSet & getLassoSelection(); + SelectedItemSet& getLassoSelection(); //============================================================================== void refreshAllComponents(); @@ -77,7 +82,7 @@ private: ComponentLayout& layout; Component* subCompHolder; - LassoComponent lassoComp; + LassoComponent lassoComp; SnapGridPainter grid; bool firstResize; }; diff --git a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutPanel.h b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutPanel.h index 9969cdf6d2..b666b6ef64 100644 --- a/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutPanel.h +++ b/extras/Introjucer/Source/ComponentEditor/ui/jucer_ComponentLayoutPanel.h @@ -62,7 +62,7 @@ public: return ((ComponentLayoutEditor*) editor)->createComponentLayerSnapshot(); } - ComponentLayout& getLayout() const noexcept { return layout;} + ComponentLayout& layout; private: class LayoutPropsPanel : public Component, @@ -115,8 +115,6 @@ private: ComponentLayout& layout; PropertyPanel propsPanel; }; - - ComponentLayout& layout; }; diff --git a/extras/Introjucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp b/extras/Introjucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp index 1c8d8d6dbd..330b840f1b 100644 --- a/extras/Introjucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp +++ b/extras/Introjucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp @@ -438,7 +438,7 @@ ApplicationCommandTarget* JucerDocumentEditor::getNextCommandTarget() ComponentLayout* JucerDocumentEditor::getCurrentLayout() const { if (ComponentLayoutPanel* panel = dynamic_cast (tabbedComponent.getCurrentContentComponent())) - return &(panel->getLayout()); + return &(panel->layout); return nullptr; } @@ -577,8 +577,8 @@ void JucerDocumentEditor::addComponent (const int index) panel->xyToTargetXY (x, y); - if (Component* newOne = panel->getLayout().addNewComponent (ObjectTypes::componentTypeHandlers [index], x, y)) - panel->getLayout().getSelectedSet().selectOnly (newOne); + if (Component* newOne = panel->layout.addNewComponent (ObjectTypes::componentTypeHandlers [index], x, y)) + panel->layout.getSelectedSet().selectOnly (newOne); document->beginTransaction(); } diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp index 5a4056bf90..de0bd2e144 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -50,7 +50,6 @@ public: p->checkFileStatus(); } -private: #include "jucer_ProjectTree_Base.h" #include "jucer_ProjectTree_Group.h" #include "jucer_ProjectTree_File.h" @@ -911,3 +910,9 @@ bool ProjectContentComponent::perform (const InvocationInfo& info) return true; } + +void ProjectContentComponent::getSelectedProjectItemsBeingDragged (const DragAndDropTarget::SourceDetails& dragSourceDetails, + OwnedArray& selectedNodes) +{ + FileTreePanel::ProjectTreeItemBase::getSelectedProjectItemsBeingDragged (dragSourceDetails, selectedNodes); +} diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h index 01ba5d8013..eee432ba54 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h @@ -92,6 +92,9 @@ public: StringArray getExportersWhichCanLaunch() const; + static void getSelectedProjectItemsBeingDragged (const DragAndDropTarget::SourceDetails& dragSourceDetails, + OwnedArray& selectedNodes); + //============================================================================== ApplicationCommandTarget* getNextCommandTarget() override; void getAllCommands (Array & commands) override; diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h index 31d89f42a1..8173fab9ca 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h @@ -261,29 +261,29 @@ public: void filesDropped (const StringArray& files, int insertIndex) override { - addFiles (files, insertIndex); + if (files.size() == 1 && File (files[0]).hasFileExtension (Project::projectFileExtension)) + IntrojucerApp::getApp().openFile (files[0]); + else + addFiles (files, insertIndex); } bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override { - if (dragSourceDetails.description != projectItemDragType) - return false; - - OwnedArray selectedNodes; - getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); + OwnedArray selectedNodes; + getSelectedProjectItemsBeingDragged (dragSourceDetails, selectedNodes); return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes); } void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override { - OwnedArray selectedNodes; - getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); + OwnedArray selectedNodes; + getSelectedProjectItemsBeingDragged (dragSourceDetails, selectedNodes); if (selectedNodes.size() > 0) { TreeView* tree = getOwnerView(); - ScopedPointer oldOpenness (tree->getOpennessState (false)); + ScopedPointer oldOpenness (tree->getOpennessState (false)); moveSelectedItemsTo (selectedNodes, insertIndex); @@ -299,20 +299,24 @@ public: return item.isImageFile() ? 250 : JucerTreeViewBase::getMillisecsAllowedForDragGesture(); } - static void getAllSelectedNodesInTree (Component* componentInTree, OwnedArray & selectedNodes) + static void getSelectedProjectItemsBeingDragged (const DragAndDropTarget::SourceDetails& dragSourceDetails, + OwnedArray& selectedNodes) { - TreeView* tree = dynamic_cast (componentInTree); - - if (tree == nullptr) - tree = componentInTree->findParentComponentOfClass(); - - if (tree != nullptr) + if (dragSourceDetails.description == projectItemDragType) { - const int numSelected = tree->getNumSelectedItems(); + TreeView* tree = dynamic_cast (dragSourceDetails.sourceComponent.get()); - for (int i = 0; i < numSelected; ++i) - if (const ProjectTreeItemBase* const p = dynamic_cast (tree->getSelectedItem (i))) - selectedNodes.add (new Project::Item (p->item)); + if (tree == nullptr) + tree = dragSourceDetails.sourceComponent->findParentComponentOfClass(); + + if (tree != nullptr) + { + const int numSelected = tree->getNumSelectedItems(); + + for (int i = 0; i < numSelected; ++i) + if (const ProjectTreeItemBase* const p = dynamic_cast (tree->getSelectedItem (i))) + selectedNodes.add (new Project::Item (p->item)); + } } }