summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp')
-rw-r--r--src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp b/src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp
new file mode 100644
index 00000000..f0dc9c85
--- /dev/null
+++ b/src/Authoring/Qt3DStudio/DragAndDrop/TimelineDropTarget.cpp
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2002 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSCommonPrecompile.h"
+#include "TimelineDropTarget.h"
+#include "StudioApp.h"
+#include "DropSource.h"
+#include "HotKeys.h"
+#include "Core.h"
+#include "Doc.h"
+#include "IDropTargetHelper.h"
+#include "GraphUtils.h"
+#include "Qt3DSDMStudioSystem.h"
+#include "ClientDataModelBridge.h"
+#include "Qt3DSDMSlides.h"
+
+// Timeline stuff
+
+//===============================================================================
+/**
+ * This get called on every DragWithin.
+ * Note: the source will validate the target instead of the otherway around.
+ * This is because the DropSource knows how to get information from itself without
+ * creating an asset. This is mainly for DropSources that have a lazy creation idiom.
+ * like files.
+ * @param the DropSource in question.
+ * @return true if the DropSource likes the DropTarget.
+ */
+bool CTimeLineDropTarget::Accept(CDropSource &inSource)
+{
+ bool theDropFlag = inSource.ValidateTarget(this);
+ return theDropFlag;
+}
+
+//===============================================================================
+/**
+ * This is where it actually happens.
+ * Note: At this point either everything should be verified, and setup in the dropsource.
+ * Then the only thing left to do is to get the Assets and move/copy or connect them.
+ * Or the dropsource needs the target to perform the actual drop.
+ * Note that if the Control key is depressed, the start time follows the current view time(
+ *i.e. playhead position )
+ *
+ * @param inSource the Object in question.
+ * @return true if the drop was successful .
+ */
+bool CTimeLineDropTarget::Drop(CDropSource &inSource)
+{
+ qt3dsdm::Qt3DSDMInstanceHandle theTargetInstance = GetInstance();
+
+ if (theTargetInstance.Valid()) {
+ CDoc *theDoc = g_StudioApp.GetCore()->GetDoc();
+ qt3dsdm::ISlideSystem *theSlideSystem = theDoc->GetStudioSystem()->GetSlideSystem();
+ qt3dsdm::Qt3DSDMSlideHandle theSlide = theDoc->GetActiveSlide();
+ if (!theSlideSystem->IsMasterSlide(theSlide)
+ && (inSource.GetCurrentFlags() & CHotKeys::MODIFIER_ALT)) {
+ if (CanAddToMaster()) {
+ qt3dsdm::Qt3DSDMSlideHandle theMasterSlideHandle =
+ theSlideSystem->GetMasterSlide(theSlide);
+ if (theMasterSlideHandle.Valid())
+ theSlide = theMasterSlideHandle;
+ }
+ }
+ CCmd *theCmd = inSource.GenerateAssetCommand(theTargetInstance, m_Destination, theSlide);
+ if (theCmd)
+ g_StudioApp.GetCore()->ExecuteCommand(theCmd);
+ }
+
+ return true;
+}
+
+//===============================================================================
+/**
+ * This will get the objec ttype from the Asset.
+ * Note: The asset can change all of the time, so i always ask the asset for its type.
+ * @return the Studio object type.
+ */
+long CTimeLineDropTarget::GetObjectType()
+{
+ qt3dsdm::Qt3DSDMInstanceHandle theTargetInstance = GetTargetInstance();
+ if (theTargetInstance.Valid()) {
+ CClientDataModelBridge *theBridge =
+ g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()->GetClientDataModelBridge();
+ return theBridge->GetObjectType(theTargetInstance);
+ }
+
+ return m_ObjectType;
+}
+
+//===============================================================================
+/**
+ * Check to see if the Asset is a relative of our asset.
+ * @return true if the inAsset is a parent grandparent...etc. of this asset.
+ */
+bool CTimeLineDropTarget::IsRelative(qt3dsdm::Qt3DSDMInstanceHandle inInstance)
+{
+ bool theReturn = false; ///< Default return value.
+ qt3dsdm::Qt3DSDMInstanceHandle theThisInstance = GetInstance();
+
+ // This will check to see if the inAsset is already some sort of parent grandparent....etc.
+ if (theThisInstance.Valid())
+ theReturn = IsAscendant(theThisInstance, inInstance,
+ g_StudioApp.GetCore()->GetDoc()->GetAssetGraph());
+
+ return theReturn;
+}
+
+//===============================================================================
+/**
+ * Check to see if the inAsset is our asset.
+ * @param inAsset The Asset to check.
+ * @return true if we are the same.
+ */
+bool CTimeLineDropTarget::IsSelf(qt3dsdm::Qt3DSDMInstanceHandle inInstance)
+{
+ qt3dsdm::Qt3DSDMInstanceHandle theThisInstance = GetInstance();
+ // true if self.....
+ return (theThisInstance == inInstance);
+}
+
+//===============================================================================
+/**
+ * This method is used to detirmine validity for dropping on Master items.
+ * We do not allow Master items to be dropped on non-master targets because
+ * it does not make any hierarchical sense. Also checks for NULL and Scene object.
+ * (The scene object reports as a master object so that we can re-arrange layers (On the master
+ *slide).)
+ * Changed checking for scene to checking for root object, which may be a component. This
+ * would allow for the root component (as in edit component) to re-arrange its children, even if
+ *either
+ * party is not a master.
+ * @param inAsset The Asset to check.
+ * @return true if we are the same.
+ */
+bool CTimeLineDropTarget::IsMaster()
+{
+ if (!m_Instance.Valid())
+ return true;
+ else if (m_Instance == g_StudioApp.GetCore()->GetDoc()->GetActiveRootInstance())
+ return true;
+ else {
+ qt3dsdm::ISlideSystem *theSlideSystem =
+ g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()->GetSlideSystem();
+ qt3dsdm::Qt3DSDMSlideHandle theSlide = theSlideSystem->GetAssociatedSlide(m_Instance);
+ return theSlideSystem->IsMasterSlide(theSlide);
+ }
+}
+
+void CTimeLineDropTarget::SetDestination(EDROPDESTINATION inDestination)
+{
+ m_Destination = inDestination;
+}
+
+EDROPDESTINATION CTimeLineDropTarget::GetDestination() const
+{
+ return m_Destination;
+}
+
+//===============================================================================
+/**
+ * Figure out the destination (parent) asset that the drop is to occur.
+ * In the case that the drop occurs ON this asset, then the to-be-dropped asset becomes a child
+ *of m_Asset
+ * Otherwise, this m_Asset ends up being a sibling
+ */
+qt3dsdm::Qt3DSDMInstanceHandle CTimeLineDropTarget::GetTargetInstance()
+{
+ qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance();
+ if (!theInstance.Valid())
+ return 0;
+
+ CClientDataModelBridge *theBridge =
+ g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()->GetClientDataModelBridge();
+ bool theIsActiveComponent = false;
+ bool theIsComponent = (theBridge->GetObjectType(theInstance) == OBJTYPE_COMPONENT);
+ if (theIsComponent)
+ theIsActiveComponent = theBridge->IsActiveComponent(theInstance);
+
+ // If the drop destination is ON, it will be valid if this is not a component or it's in the
+ // component timeline
+ if (m_Destination == EDROPDESTINATION_ON) {
+ if (!theIsComponent || theIsActiveComponent)
+ return theInstance;
+ else
+ return 0;
+ }
+
+ // if target is a component, and we want to insert it above/below, and we are viewing this
+ // component, then it's an invalid operation
+ // thus set the target to 0.
+ if (theIsActiveComponent)
+ return 0;
+
+ return theBridge->GetParentInstance(theInstance);
+}
+
+// LASTTIMELINE RELATED CODE