diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-10-06 11:49:09 +0000 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-10-06 16:58:43 +0200 |
commit | 07840524085bd1785b8f9142b03d942f678c5c51 (patch) | |
tree | 499c1674fdd1b3e0c07688d8e4e56748dfea2ca3 /src/Authoring/Studio/Palettes/BasicObjects |
Initial import
Diffstat (limited to 'src/Authoring/Studio/Palettes/BasicObjects')
5 files changed, 432 insertions, 0 deletions
diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.cpp b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.cpp new file mode 100644 index 00000000..9ceee2d2 --- /dev/null +++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.cpp @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** 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 "BasicObjectsModel.h" +#include "DropSource.h" +#include "Literals.h" +#include "StudioUtils.h" + +#include <QCoreApplication> +#include <QDataStream> +#include <QMimeData> + +BasicObjectsModel::BasicObjectsModel(QObject *parent) : QAbstractListModel(parent) +{ + initialize(); +} + +void BasicObjectsModel::initialize() +{ + m_ObjectItems = { + {tr("Rectangle"), "Asset-Rectangle-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_RECT}, + {tr("Sphere"), "Asset-Sphere-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_SPHERE}, + {tr("Cube"), "Asset-Cube-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_BOX}, + {tr("Cylinder"), "Asset-Cylinder-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_CYLINDER}, + {tr("Cone"), "Asset-Cone-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_CONE}, + {tr("Component"), "Asset-Component-Normal.png"_L1, OBJTYPE_COMPONENT, PRIMITIVETYPE_UNKNOWN}, + {tr("Group"), "Asset-Group-Normal.png"_L1, OBJTYPE_GROUP, PRIMITIVETYPE_UNKNOWN}, + {tr("Text"), "Asset-Text-Normal.png"_L1, OBJTYPE_TEXT, PRIMITIVETYPE_UNKNOWN}, + {tr("Layer"), "Asset-Layer-Normal.png"_L1, OBJTYPE_LAYER, PRIMITIVETYPE_UNKNOWN}, + {tr("Camera"), "Asset-Camera-Normal.png"_L1, OBJTYPE_CAMERA, PRIMITIVETYPE_UNKNOWN}, + {tr("Light"), "Asset-Light-Normal.png"_L1, OBJTYPE_LIGHT, PRIMITIVETYPE_UNKNOWN}, + {tr("Alias"), "Asset-Alias-Normal.png"_L1, OBJTYPE_ALIAS, PRIMITIVETYPE_UNKNOWN} + }; +} + +QVariant BasicObjectsModel::data(const QModelIndex &index, int role) const +{ + if (!hasIndex(index.row(), index.column(),index.parent())) + return {}; + + const auto row = index.row(); + + switch (role) { + case NameRole: return m_ObjectItems.at(row).name(); + case IconRole: return resourceImageUrl() + + m_ObjectItems.at(row).icon(); + case ObjectTypeRole: return m_ObjectItems.at(row).objectType(); + case PrimitiveTypeRole: return m_ObjectItems.at(row).primitiveType(); + } + + return {}; +} + +int BasicObjectsModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + return m_ObjectItems.count(); +} + +QHash<int, QByteArray> BasicObjectsModel::roleNames() const +{ + auto names = QAbstractListModel::roleNames(); + names.insert(NameRole, "name"); + names.insert(IconRole, "icon"); + + return names; +} + +Qt::ItemFlags BasicObjectsModel::flags(const QModelIndex &index) const { + if (index.isValid()) + return Qt::ItemIsDragEnabled; + + return QAbstractListModel::flags(index); +} + +QStringList BasicObjectsModel::mimeTypes() const +{ + return { m_MimeType }; +} + +QMimeData *BasicObjectsModel::mimeData(const QModelIndexList &indexes) const +{ + + const auto row = indexes.first().row(); // we support only one item for D&D + auto object = m_ObjectItems.at(row); + + auto *data = CDropSourceFactory::Create(object.GetFlavor(), &object); + return data; +} + +BasicObjectItem::~BasicObjectItem() +{ +} diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.h b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.h new file mode 100644 index 00000000..ccaf07d6 --- /dev/null +++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsModel.h @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef BASICOBJECTSMODEL_H +#define BASICOBJECTSMODEL_H + +#include <QAbstractListModel> + +#include "IDragable.h" +#include "StudioObjectTypes.h" + +class BasicObjectItem : public IDragable { + +public: + BasicObjectItem() {} + BasicObjectItem(const QString &name, const QString &icon, + EStudioObjectType objectType, EPrimitiveType primitiveType) + : m_name(name), m_icon(icon) + , m_objectType(objectType), m_primitiveType(primitiveType) + { } + + virtual ~BasicObjectItem(); + + QString name() const { return m_name; } + QString icon() const { return m_icon; } + + EStudioObjectType objectType() const { return m_objectType; } + EPrimitiveType primitiveType() const { return m_primitiveType; } + + void setName(const QString &name) { m_name = name; } + void setIcon(const QString &icon) { m_icon = icon; } + void setObjectType(EStudioObjectType type) { m_objectType = type; } + void setPrimitveType(EPrimitiveType type) { m_primitiveType = type; } + + long GetFlavor() const override {return EUIC_FLAVOR_BASIC_OBJECTS;} + +private: + QString m_name; + QString m_icon; + EStudioObjectType m_objectType; + EPrimitiveType m_primitiveType; +}; + +class BasicObjectsModel : public QAbstractListModel +{ + Q_OBJECT +public: + BasicObjectsModel(QObject *parent = nullptr); + + enum Roles { + NameRole = Qt::DisplayRole, + IconRole = Qt::DecorationRole, + ObjectTypeRole = Qt::UserRole + 1, + PrimitiveTypeRole + }; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QHash<int, QByteArray> roleNames() const override; + + Qt::ItemFlags flags(const QModelIndex &index) const override; + QStringList mimeTypes() const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; + +private: + void initialize(); + + QVector<BasicObjectItem> m_ObjectItems; + + const QString m_MimeType = QLatin1String("application/x-basic-object"); +}; + +#endif // BASICOBJECTSMODEL_H diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp new file mode 100644 index 00000000..6834352a --- /dev/null +++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** 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 "BasicObjectsView.h" +#include "BasicObjectsModel.h" +#include "CColor.h" +#include "Literals.h" +#include "StudioPreferences.h" +#include "StudioUtils.h" + +#include <QtCore/qcoreapplication.h> +#include <QtCore/qtimer.h> +#include <QtGui/qdrag.h> +#include <QtQml/qqmlcontext.h> +#include <QtQml/qqmlengine.h> + +BasicObjectsView::BasicObjectsView(QWidget *parent) : QQuickWidget(parent) + , m_ObjectsModel(new BasicObjectsModel(this)) + +{ + setResizeMode(QQuickWidget::SizeRootObjectToView); + QTimer::singleShot(0, this, &BasicObjectsView::initialize); +} + +QSize BasicObjectsView::sizeHint() const +{ + return {120, 600}; +} + +void BasicObjectsView::startDrag(int row) +{ + const auto index = m_ObjectsModel->index(row); + + QDrag drag(this); + drag.setMimeData(m_ObjectsModel->mimeData({index})); + drag.setPixmap(QPixmap(index.data(BasicObjectsModel::IconRole).toUrl().toLocalFile())); + drag.exec(Qt::CopyAction); +} + +void BasicObjectsView::initialize() +{ + CStudioPreferences::setQmlContextProperties(rootContext()); + rootContext()->setContextProperty("_basicObjectsModel"_L1, m_ObjectsModel); + rootContext()->setContextProperty("_basicObjectsView"_L1, this); + rootContext()->setContextProperty("_resDir"_L1, resourceImageUrl()); + + engine()->addImportPath(qmlImportPath()); + setSource(QUrl("qrc:/Studio/Palettes/BasicObjects/BasicObjectsView.qml"_L1)); +} diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.h b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.h new file mode 100644 index 00000000..9317fc8f --- /dev/null +++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef BASICOBJECTSVIEW_H +#define BASICOBJECTSVIEW_H + +#include <QQuickWidget> + +class BasicObjectsModel; + +class BasicObjectsView : public QQuickWidget +{ + Q_OBJECT +public: + explicit BasicObjectsView(QWidget *parent = nullptr); + + QSize sizeHint() const override; + + Q_INVOKABLE void startDrag(int row); +private: + void initialize(); + + BasicObjectsModel *m_ObjectsModel = nullptr; + QColor m_BaseColor = QColor::fromRgb(75, 75, 75); +}; + +#endif // BASICOBJECTSVIEW_H diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml new file mode 100644 index 00000000..ec2a0f6e --- /dev/null +++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +import QtQuick 2.8 +import QtQuick.Controls 2.1 +import "../controls" + +Rectangle { + + color: _backgroundColor + + ListView { + anchors { + fill: parent + leftMargin: 8 + } + boundsBehavior: Flickable.StopAtBounds + + model: _basicObjectsModel + spacing: 2 + + ScrollBar.vertical: ScrollBar {} + + delegate: Item { + height: contentRow.height + width: contentRow.width + Item { + id: dragItem + anchors.fill: parent + + Drag.active: dragArea.drag.active + Drag.hotSpot.x: width / 2 + Drag.hotSpot.y: height / 2 + Drag.dragType: Drag.Automatic + Drag.supportedActions: Qt.CopyAction + + MouseArea { + id: dragArea + property bool dragging: false + anchors.fill: parent + drag.target: dragItem + } + + Drag.onDragStarted: _basicObjectsView.startDrag(model.index) + } + Row { + id: contentRow + spacing: 4 + Image { + id: assetIcon + width: 24 + height: 24 + fillMode: Image.Pad + source: model.icon + } + StyledLabel { + y: (assetIcon.height - height) / 2 + text: model.name + } + } + } + } +} |