summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp')
-rw-r--r--src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp534
1 files changed, 0 insertions, 534 deletions
diff --git a/src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp b/src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp
deleted file mode 100644
index ad66274a..00000000
--- a/src/Authoring/Studio/Palettes/Inspector/ObjectListModel.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-/****************************************************************************
-**
-** 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 "ObjectListModel.h"
-
-#include "ClientDataModelBridge.h"
-#include "Core.h"
-#include "Doc.h"
-#include "GraphUtils.h"
-#include "IObjectReferenceHelper.h"
-#include "StudioUtils.h"
-#include "SlideSystem.h"
-#include "StudioObjectTypes.h"
-#include "StudioPreferences.h"
-#include "Qt3DSDMStudioSystem.h"
-#include "ClientDataModelBridge.h"
-
-#include <QCoreApplication>
-#include <QColor>
-
-ObjectListModel::ObjectListModel(CCore *core,
- const qt3dsdm::Qt3DSDMInstanceHandle &baseHandle, QObject *parent,
- bool isAliasSelectList)
- : QAbstractItemModel(parent)
- , m_core(core)
- , m_baseHandle(baseHandle)
- , m_AliasSelectList(isAliasSelectList)
-{
- auto doc = m_core->GetDoc();
- m_objRefHelper = doc->GetDataModelObjectReferenceHelper();
- if (!m_AliasSelectList)
- m_slideHandle = m_objRefHelper->GetSlideList(m_baseHandle)[0];
- else
- m_slideHandle = m_objRefHelper->GetSlideList(m_baseHandle).back();
-}
-
-QHash<int, QByteArray> ObjectListModel::roleNames() const
-{
- auto names = QAbstractItemModel::roleNames();
- names.insert(NameRole, "name");
- names.insert(HandleRole, "handle");
- names.insert(IconRole, "icon");
- names.insert(TextColorRole, "textColor");
- names.insert(AbsolutePathRole, "absolutePath");
- names.insert(PathReferenceRole, "referencePath");
-
- return names;
-}
-
-int ObjectListModel::rowCount(const QModelIndex &parent) const
-{
- if (!parent.isValid())
- return 1;
-
- const auto handle = handleForIndex(parent);
- const auto children = childrenList(m_slideHandle, handle);
- return int(children.size());
-}
-
-int ObjectListModel::columnCount(const QModelIndex &parent) const
-{
- Q_UNUSED(parent)
- return 1;
-}
-
-QVariant ObjectListModel::data(const QModelIndex &index, int role) const
-{
- return data(index, QModelIndex(), role);
-}
-
-QVariant ObjectListModel::data(const QModelIndex &index,
- const QModelIndex &startingIndex,
- int role) const
-{
- if (!hasIndex(index.row(), index.column(), index.parent()))
- return {};
-
- auto handle = handleForIndex(index);
-
- auto studioSystem = m_core->GetDoc()->GetStudioSystem();
- auto propertySystem = studioSystem->GetPropertySystem();
- qt3dsdm::SValue typeValue;
- propertySystem->GetInstancePropertyValue(handle,
- studioSystem->GetClientDataModelBridge()
- ->GetTypeProperty(), typeValue);
- qt3dsdm::DataModelDataType::Value valueType(qt3dsdm::GetValueType(typeValue));
- if (valueType == qt3dsdm::DataModelDataType::None)
- return {};
-
- switch (role) {
- case NameRole: {
- return nameForHandle(handle);
- }
- case PathReferenceRole: {
- Q3DStudio::CString data;
- if (startingIndex.isValid()) {
- data = m_objRefHelper->GetObjectReferenceString(
- handleForIndex(startingIndex),
- CRelativePathTools::EPATHTYPE_RELATIVE,
- handle);
- } else {
- data = m_objRefHelper->GetObjectReferenceString(
- m_baseHandle,
- CRelativePathTools::EPATHTYPE_RELATIVE,
- handle);
- }
- return data.toQString();
- }
- case AbsolutePathRole: {
- Q3DStudio::CString data(m_objRefHelper->GetObjectReferenceString(
- m_baseHandle, CRelativePathTools::EPATHTYPE_GUID, handle));
- return data.toQString();
- }
- case HandleRole: {
- return (int)handleForIndex(index);
- }
- case IconRole: {
- auto info = m_objRefHelper->GetInfo(handle);
- return StudioUtils::resourceImageUrl() + CStudioObjectTypes::GetNormalIconName(info.m_Type);
- }
- case TextColorRole: {
- auto bridge = m_core->GetDoc()->GetStudioSystem()->GetClientDataModelBridge();
- auto objType = bridge->GetObjectType(handle);
- auto info = m_objRefHelper->GetInfo(handle);
- if (m_excludeTypes.contains(objType))
- return QVariant::fromValue(CStudioPreferences::disabledColor());
- else if (info.m_Master)
- return QVariant::fromValue(CStudioPreferences::masterColor());
- else
- return QVariant::fromValue(CStudioPreferences::textColor());
- }
- default:
- return {};
- }
-
- return {};
-}
-
-QModelIndex ObjectListModel::index(int row, int column, const QModelIndex &parent) const
-{
- if (!parent.isValid())
- return createIndex(row, column, (quintptr)(m_baseHandle));
-
- const auto handle = handleForIndex(parent);
- const auto children = childrenList(m_slideHandle, handle);
- if (row >= children.size())
- return {};
-
- auto childHandle = children[row];
- return createIndex(row, column, (quintptr)(childHandle));
-}
-
-QModelIndex ObjectListModel::parent(const QModelIndex &index) const
-{
- if (!index.isValid())
- return {};
-
- const auto handle = handleForIndex(index);
- qt3dsdm::Qt3DSDMInstanceHandle parentHandle = m_core->GetDoc()->GetAssetGraph()->GetParent(handle);
- if (!parentHandle.Valid())
- return {};
-
- int row = 0;
- qt3dsdm::Qt3DSDMInstanceHandle grandParentHandle = m_core->GetDoc()->GetAssetGraph()
- ->GetParent(parentHandle);
- if (grandParentHandle.Valid()) {
- const auto children = childrenList(m_slideHandle, grandParentHandle);
- const auto it = std::find(children.begin(), children.end(), parentHandle);
- Q_ASSERT(it != children.end());
- row = it - children.begin();
- }
-
- return createIndex(row, 0, (quintptr)(parentHandle));
-}
-
-qt3dsdm::Qt3DSDMInstanceHandle ObjectListModel::handleForIndex(const QModelIndex &index) const
-{
- return static_cast<qt3dsdm::Qt3DSDMInstanceHandle>(index.internalId());
-}
-
-void ObjectListModel::excludeObjectTypes(const QVector<EStudioObjectType> &types)
-{
- m_excludeTypes = types;
-}
-
-bool ObjectListModel::selectable(const qt3dsdm::Qt3DSDMInstanceHandle &handle) const
-{
- auto bridge = m_core->GetDoc()->GetStudioSystem()->GetClientDataModelBridge();
- auto objType = bridge->GetObjectType(handle);
- // disallow aliasing the current active root
- bool tryingToAliasParent = (m_core->GetDoc()->GetActiveRootInstance() == handle)
- && m_AliasSelectList;
- return (!m_excludeTypes.contains(objType) && !tryingToAliasParent);
-}
-
-qt3dsdm::TInstanceHandleList ObjectListModel::childrenList(
- const qt3dsdm::Qt3DSDMSlideHandle &slideHandle,
- const qt3dsdm::Qt3DSDMInstanceHandle &handle) const
-{
- auto studioSystem = m_core->GetDoc()->GetStudioSystem();
- auto slideSystem = studioSystem->GetSlideSystem();
- auto currentMaster = slideSystem->GetMasterSlide(slideHandle);
-
- qt3dsdm::TInstanceHandleList children;
- m_objRefHelper->GetChildInstanceList(handle, children, slideHandle, m_baseHandle, true);
- // allow action trigger/target from all objects
- if (m_AliasSelectList) {
- children.erase(
- std::remove_if(children.begin(), children.end(),
- [&slideHandle, slideSystem, &currentMaster](const qt3dsdm::Qt3DSDMInstanceHandle &h) {
- const auto childSlide = slideSystem->GetAssociatedSlide(h);
- if (!childSlide.Valid())
- return true;
- const auto childMaster = slideSystem->GetMasterSlide(childSlide);
- if (childMaster == currentMaster) {
- return childSlide != childMaster && childSlide != slideHandle;
- } else {
- return childSlide != childMaster;
- }
- }), children.end());
- }
- return children;
-}
-
-QString ObjectListModel::nameForHandle(const qt3dsdm::Qt3DSDMInstanceHandle &handle) const
-{
- const auto data = m_objRefHelper->GetInfo(handle);
- return data.m_Name.toQString();
-}
-
-QModelIndex ObjectListModel::indexForHandle(const qt3dsdm::Qt3DSDMInstanceHandle &handle,
- const QModelIndex &startIndex) const
-{
- if (handle == m_baseHandle)
- return index(0, 0, {});
-
- for (int i = 0; i < rowCount(startIndex); i++) {
- auto idx = index(i, 0, startIndex);
- if (static_cast<qt3dsdm::Qt3DSDMInstanceHandle>(idx.internalId()) == handle)
- return idx;
- if (rowCount(idx) > 0) {
- QModelIndex foundIndex = indexForHandle(handle, idx);
- if (foundIndex.isValid())
- return foundIndex;
- }
- }
- return {};
-}
-
-
-FlatObjectListModel::FlatObjectListModel(ObjectListModel *sourceModel, QObject *parent)
- : QAbstractListModel(parent)
-
-{
- Q_ASSERT(sourceModel);
- setSourceModel(sourceModel);
-}
-
-QVector<FlatObjectListModel::SourceInfo> FlatObjectListModel::collectSourceIndexes(
- const QModelIndex &sourceIndex, int depth) const
-{
- QVector<SourceInfo> sourceInfo;
-
- for (int i = 0; i < m_sourceModel->rowCount(sourceIndex); i++) {
- auto idx = m_sourceModel->index(i, 0, sourceIndex);
- SourceInfo info;
- info.depth = depth;
- info.index = idx;
- sourceInfo.append(info);
- if (m_sourceModel->rowCount(idx) > 0) {
- sourceInfo += collectSourceIndexes(idx, depth + 1);
- }
- }
-
- return sourceInfo;
-}
-
-QHash<int, QByteArray> FlatObjectListModel::roleNames() const
-{
- auto roles = m_sourceModel->roleNames();
- roles.insert(DepthRole, "depth");
- roles.insert(ExpandedRole, "expanded");
- roles.insert(ParentExpandedRole, "parentExpanded");
- roles.insert(HasChildrenRole, "hasChildren");
- return roles;
-}
-
-QModelIndex FlatObjectListModel::mapToSource(const QModelIndex &proxyIndex) const
-{
- int row = proxyIndex.row();
- if (row < 0 || row >= m_sourceInfo.count())
- return {};
- return m_sourceInfo[row].index;
-}
-
-QModelIndex FlatObjectListModel::mapFromSource(const QModelIndex &sourceIndex) const
-{
- return index(rowForSourceIndex(sourceIndex));
-}
-
-QVariant FlatObjectListModel::data(const QModelIndex &index, int role) const
-{
- return data(index, QModelIndex(), role);
-}
-
-QVariant FlatObjectListModel::data(const QModelIndex &index,
- const QModelIndex &startingIndex,
- int role) const
-{
- const auto row = index.row();
- if (row < 0 || row >= m_sourceInfo.count())
- return {};
-
- switch (role) {
- case DepthRole: {
- auto info = m_sourceInfo[row];
- return info.depth;
- }
- case ExpandedRole: {
- auto info = m_sourceInfo[row];
- return info.expanded;
- }
- case ParentExpandedRole: {
- auto info = m_sourceInfo[row];
- if (info.depth == 0)
- return true;
-
- int depth = info.depth;
- for (int i = row - 1; i >= 0; i--) {
- const auto prevInfo = m_sourceInfo[i];
- if (prevInfo.depth < depth) {
- if (!prevInfo.expanded) {
- return false;
- } else {
- depth = prevInfo.depth;
- }
- }
- }
- return true;
- }
- case HasChildrenRole: {
- if (row == m_sourceInfo.count() - 1)
- return false;
- auto info = m_sourceInfo[row];
- auto nextInfo = m_sourceInfo[row + 1];
- return (nextInfo.depth > info.depth);
- }
- }
-
- QModelIndex sourceIndex = mapToSource(index);
- if (startingIndex.isValid())
- return m_sourceModel->data(sourceIndex, startingIndex, role);
- else
- return m_sourceModel->data(sourceIndex, QModelIndex(), role);
-
-}
-
-bool FlatObjectListModel::setData(const QModelIndex &index, const QVariant &data, int role)
-{
- const auto row = index.row();
- if (row < 0 || row >= m_sourceInfo.count())
- return {};
-
- switch (role) {
- case ExpandedRole: {
- auto info = &m_sourceInfo[index.row()];
- info->expanded = data.toBool();
- Q_EMIT dataChanged(this->index(0, 0), this->index(rowCount() - 1, 0), {});
- return true;
- }
- }
-
- QModelIndex sourceIndex = mapToSource(index);
- return m_sourceModel->setData(sourceIndex, data, role);
-}
-
-int FlatObjectListModel::rowCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
-
- return m_sourceInfo.count();
-}
-
-bool FlatObjectListModel::removeRows(int row, int count, const QModelIndex &parent)
-{
- beginRemoveRows(parent, row, row + count - 1);
- m_sourceInfo.remove(row, count);
- endRemoveRows();
- return true;
-}
-
-void FlatObjectListModel::setSourceModel(ObjectListModel *sourceModel)
-{
- beginResetModel();
- sourceModel->disconnect(this);
- connect(sourceModel, &QAbstractListModel::dataChanged, this,
- [this](const QModelIndex &start, const QModelIndex &end, const QVector<int> &roles) {
- emit dataChanged(mapFromSource(start), mapFromSource(end), roles);
-
- });
- connect(sourceModel, &QAbstractListModel::rowsInserted, this,
- [this](const QModelIndex &parent, int start, int end) {
- const int parentRow = rowForSourceIndex(parent);
- const int depth = m_sourceInfo[parentRow].depth + 1;
- const int startRow = rowForSourceIndex(parent, start);
- Q_ASSERT(startRow != -1);
- beginInsertRows({}, startRow, startRow + end - start);
- for (int row = end; row >= start; --row) {
- SourceInfo info;
- info.depth = depth;
- info.index = m_sourceModel->index(row, 0, parent);
- m_sourceInfo.insert(startRow, info);
- }
- endInsertRows();
- });
- connect(sourceModel, &QAbstractListModel::rowsRemoved, this,
- [this](const QModelIndex &parent, int start, int end) {
- const int startRow = rowForSourceIndex(parent, start);
- const int endRow = rowForSourceIndex(parent, end);
- Q_ASSERT(startRow != -1 && endRow != -1);
- beginRemoveRows({}, startRow, endRow);
- m_sourceInfo.remove(startRow, endRow - startRow + 1);
- endRemoveRows();
- });
- connect(sourceModel, &QAbstractListModel::modelReset, this,
- [this]() {
- beginResetModel();
- m_sourceInfo = collectSourceIndexes({}, 0);
- endResetModel();
- });
-
- connect(sourceModel, &ObjectListModel::roleUpdated, this, [this](int role) {
- emit dataChanged(index(0,0), index(rowCount() - 1, 0), {role});
- });
-
- connect(sourceModel, &ObjectListModel::rolesUpdated, this,
- [this](const QVector<int> &roles = QVector<int> ()) {
- emit dataChanged(index(0,0), index(rowCount() - 1, 0), roles);
- });
-
-
- m_sourceModel = sourceModel;
- m_sourceInfo = collectSourceIndexes({}, 0);
- endResetModel();
-}
-
-// startIndex and searchIndex are source indexes
-bool FlatObjectListModel::expandTo(const QModelIndex &startIndex, const QModelIndex &searchIndex)
-{
- // Found the index we are looking for. We don't want to expand it, so just return true.
- if (startIndex == searchIndex)
- return true;
-
- // Look for the search index in children
- const int rowCount = m_sourceModel->rowCount(startIndex);
- for (int i = 0; i < rowCount; i++) {
- auto idx = m_sourceModel->index(i, 0, startIndex);
- if (idx == searchIndex) {
- // Expand startIndex as that is the parent
- setData(index(rowForSourceIndex(startIndex)), QVariant(true), ExpandedRole);
- return true;
- }
- if (m_sourceModel->rowCount(idx) > 0) {
- bool found = expandTo(idx, searchIndex);
- if (found) {
- // Found by some descendant. Keep expanding parents
- setData(index(rowForSourceIndex(startIndex)), QVariant(true), ExpandedRole);
- return true;
- }
- }
- }
- return false;
-}
-
-int FlatObjectListModel::rowForSourceIndex(const QModelIndex &sourceIndex) const
-{
- for (int i = 0; i < m_sourceInfo.size(); i++) {
- if (m_sourceInfo[i].index == sourceIndex)
- return i;
- }
- return -1;
-}
-
-int FlatObjectListModel::rowForSourceIndex(const QModelIndex& parentIndex, int row) const
-{
- const int parentRow = rowForSourceIndex(parentIndex);
- if (parentRow == -1)
- return -1;
- const int childDepth = m_sourceInfo[parentRow].depth + 1;
- int i = parentRow + 1;
- while (i < m_sourceInfo.size()) {
- const auto& info = m_sourceInfo[i];
- if (info.depth < childDepth)
- break;
- if (info.depth == childDepth) {
- if (row == 0)
- break;
- --row;
- }
- ++i;
- }
- return i;
-}
-
-QModelIndex FlatObjectListModel::sourceIndexForHandle(const qt3dsdm::Qt3DSDMInstanceHandle &handle)
-{
- return m_sourceModel->indexForHandle(handle);
-}