Allow changing the 3D Editor's background color

Task-number: QDS-6585
Change-Id: Ibcac69d3792b521b29dfbdce2d49557d36de99a9
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Samuel Ghinet
2022-05-31 16:19:29 +03:00
parent d99a6d2efe
commit c3b90c0ce5
24 changed files with 369 additions and 44 deletions

View File

@@ -28,6 +28,8 @@
#include <QSize> #include <QSize>
#include <QUrl> #include <QUrl>
#include <QVector> #include <QVector>
#include <QList>
#include <QColor>
#include <qmetatype.h> #include <qmetatype.h>
#include "instancecontainer.h" #include "instancecontainer.h"
@@ -58,7 +60,8 @@ public:
const QString &language, const QString &language,
QSize captureImageMinimumSize, QSize captureImageMinimumSize,
QSize captureImageMaximumSize, QSize captureImageMaximumSize,
qint32 stateInstanceId) qint32 stateInstanceId,
const QList<QColor> &edit3dBackgroundColor)
: instances(instanceContainer) : instances(instanceContainer)
, reparentInstances(reparentContainer) , reparentInstances(reparentContainer)
, ids(idVector) , ids(idVector)
@@ -74,6 +77,7 @@ public:
, captureImageMinimumSize(captureImageMinimumSize) , captureImageMinimumSize(captureImageMinimumSize)
, captureImageMaximumSize(captureImageMaximumSize) , captureImageMaximumSize(captureImageMaximumSize)
, stateInstanceId{stateInstanceId} , stateInstanceId{stateInstanceId}
, edit3dBackgroundColor{edit3dBackgroundColor}
{} {}
friend QDataStream &operator<<(QDataStream &out, const CreateSceneCommand &command) friend QDataStream &operator<<(QDataStream &out, const CreateSceneCommand &command)
@@ -93,6 +97,7 @@ public:
out << command.stateInstanceId; out << command.stateInstanceId;
out << command.captureImageMinimumSize; out << command.captureImageMinimumSize;
out << command.captureImageMaximumSize; out << command.captureImageMaximumSize;
out << command.edit3dBackgroundColor;
return out; return out;
} }
@@ -114,6 +119,7 @@ public:
in >> command.stateInstanceId; in >> command.stateInstanceId;
in >> command.captureImageMinimumSize; in >> command.captureImageMinimumSize;
in >> command.captureImageMaximumSize; in >> command.captureImageMaximumSize;
in >> command.edit3dBackgroundColor;
return in; return in;
} }
@@ -134,6 +140,7 @@ public:
QSize captureImageMinimumSize; QSize captureImageMinimumSize;
QSize captureImageMaximumSize; QSize captureImageMaximumSize;
qint32 stateInstanceId = 0; qint32 stateInstanceId = 0;
QList<QColor> edit3dBackgroundColor;
}; };
QDebug operator<<(QDebug debug, const CreateSceneCommand &command); QDebug operator<<(QDebug debug, const CreateSceneCommand &command);

View File

@@ -30,24 +30,27 @@
namespace QmlDesigner { namespace QmlDesigner {
View3DActionCommand::View3DActionCommand(Type type, bool enable) View3DActionCommand::View3DActionCommand(Type type, const QVariant &value)
: m_type(type) : m_type(type)
, m_enabled(enable) , m_value(value)
, m_position(0)
{ {
} }
View3DActionCommand::View3DActionCommand(int pos) View3DActionCommand::View3DActionCommand(int pos)
: m_type(ParticlesSeek) : m_type(ParticlesSeek)
, m_enabled(true) , m_value(pos)
, m_position(pos)
{ {
} }
bool View3DActionCommand::isEnabled() const bool View3DActionCommand::isEnabled() const
{ {
return m_enabled; return m_value.toBool();
}
QVariant View3DActionCommand::value() const
{
return m_value;
} }
View3DActionCommand::Type View3DActionCommand::type() const View3DActionCommand::Type View3DActionCommand::type() const
@@ -57,29 +60,32 @@ View3DActionCommand::Type View3DActionCommand::type() const
int View3DActionCommand::position() const int View3DActionCommand::position() const
{ {
return m_position; bool ok = false;
int result = m_value.toInt(&ok);
if (!ok) {
qWarning() << "View3DActionCommand: returning a position that is not int; command type = "
<< m_type;
}
return result;
} }
QDataStream &operator<<(QDataStream &out, const View3DActionCommand &command) QDataStream &operator<<(QDataStream &out, const View3DActionCommand &command)
{ {
out << qint32(command.isEnabled()); out << command.value();
out << qint32(command.type()); out << qint32(command.type());
out << qint32(command.position());
return out; return out;
} }
QDataStream &operator>>(QDataStream &in, View3DActionCommand &command) QDataStream &operator>>(QDataStream &in, View3DActionCommand &command)
{ {
qint32 enabled; QVariant value;
qint32 type; qint32 type;
qint32 pos; in >> value;
in >> enabled;
in >> type; in >> type;
in >> pos; command.m_value = value;
command.m_enabled = bool(enabled);
command.m_type = View3DActionCommand::Type(type); command.m_type = View3DActionCommand::Type(type);
command.m_position = pos;
return in; return in;
} }
@@ -88,7 +94,7 @@ QDebug operator<<(QDebug debug, const View3DActionCommand &command)
{ {
return debug.nospace() << "View3DActionCommand(type: " return debug.nospace() << "View3DActionCommand(type: "
<< command.m_type << "," << command.m_type << ","
<< command.m_enabled << ")"; << command.m_value << ")\n";
} }
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -26,6 +26,7 @@
#pragma once #pragma once
#include <QMetaType> #include <QMetaType>
#include <QVariant>
namespace QmlDesigner { namespace QmlDesigner {
@@ -55,20 +56,22 @@ public:
ParticlesPlay, ParticlesPlay,
ParticlesRestart, ParticlesRestart,
ParticlesSeek, ParticlesSeek,
SelectBackgroundColor,
ResetBackgroundColor,
}; };
explicit View3DActionCommand(Type type, bool enable); explicit View3DActionCommand(Type type, const QVariant &value);
View3DActionCommand() = default; View3DActionCommand() = default;
bool isEnabled() const; bool isEnabled() const;
QVariant value() const;
Type type() const; Type type() const;
int position() const; int position() const;
private: private:
Type m_type = Empty; Type m_type = Empty;
bool m_enabled = false; QVariant m_value;
int m_position = 0;
protected: protected:
View3DActionCommand(int pos); View3DActionCommand(int pos);

View File

@@ -142,6 +142,7 @@ void NodeInstanceServerInterface::registerCommands()
registerCommand<View3DActionCommand>("View3DActionCommand"); registerCommand<View3DActionCommand>("View3DActionCommand");
registerCommand<RequestModelNodePreviewImageCommand>("RequestModelNodePreviewImageCommand"); registerCommand<RequestModelNodePreviewImageCommand>("RequestModelNodePreviewImageCommand");
registerCommand<QPair<int, int>>("QPairIntInt"); registerCommand<QPair<int, int>>("QPairIntInt");
registerCommand<QList<QColor>>("QColorList");
registerCommand<ChangeLanguageCommand>("ChangeLanguageCommand"); registerCommand<ChangeLanguageCommand>("ChangeLanguageCommand");
registerCommand<ChangePreviewImageSizeCommand>("ChangePreviewImageSizeCommand"); registerCommand<ChangePreviewImageSizeCommand>("ChangePreviewImageSizeCommand");
registerCommand<CapturedDataCommand>("CapturedDataCommand"); registerCommand<CapturedDataCommand>("CapturedDataCommand");

View File

@@ -45,6 +45,8 @@ Item {
property bool usePerspective: true property bool usePerspective: true
property bool globalOrientation: false property bool globalOrientation: false
property alias contentItem: contentItem property alias contentItem: contentItem
property color backgroundGradientColorStart: "#222222"
property color backgroundGradientColorEnd: "#999999"
enum SelectionMode { Item, Group } enum SelectionMode { Item, Group }
enum TransformMode { Move, Rotate, Scale } enum TransformMode { Move, Rotate, Scale }
@@ -212,6 +214,15 @@ Item {
cameraControl.alignView(selectedNodes); cameraControl.alignView(selectedNodes);
} }
function updateViewStates(viewStates)
{
if ("selectBackgroundColor" in viewStates) {
var color = viewStates.selectBackgroundColor
backgroundGradientColorStart = color[0];
backgroundGradientColorEnd = color[1];
}
}
// If resetToDefault is true, tool states not specifically set to anything will be reset to // If resetToDefault is true, tool states not specifically set to anything will be reset to
// their default state. // their default state.
function updateToolStates(toolStates, resetToDefault) function updateToolStates(toolStates, resetToDefault)
@@ -730,8 +741,8 @@ Item {
anchors.fill: parent anchors.fill: parent
gradient: Gradient { gradient: Gradient {
GradientStop { position: 1.0; color: "#222222" } GradientStop { position: 1.0; color: backgroundGradientColorStart }
GradientStop { position: 0.0; color: "#999999" } GradientStop { position: 0.0; color: backgroundGradientColorEnd }
} }
MouseArea { MouseArea {

View File

@@ -46,6 +46,8 @@ Item {
property bool usePerspective: true property bool usePerspective: true
property bool globalOrientation: false property bool globalOrientation: false
property alias contentItem: contentItem property alias contentItem: contentItem
property color backgroundGradientColorStart: "#222222"
property color backgroundGradientColorEnd: "#999999"
enum SelectionMode { Item, Group } enum SelectionMode { Item, Group }
enum TransformMode { Move, Rotate, Scale } enum TransformMode { Move, Rotate, Scale }
@@ -206,6 +208,15 @@ Item {
cameraControl.alignView(selectedNodes); cameraControl.alignView(selectedNodes);
} }
function updateViewStates(viewStates)
{
if ("selectBackgroundColor" in viewStates) {
var color = viewStates.selectBackgroundColor
backgroundGradientColorStart = color[0];
backgroundGradientColorEnd = color[1];
}
}
// If resetToDefault is true, tool states not specifically set to anything will be reset to // If resetToDefault is true, tool states not specifically set to anything will be reset to
// their default state. // their default state.
function updateToolStates(toolStates, resetToDefault) function updateToolStates(toolStates, resetToDefault)
@@ -875,8 +886,8 @@ Item {
anchors.fill: parent anchors.fill: parent
gradient: Gradient { gradient: Gradient {
GradientStop { position: 1.0; color: "#222222" } GradientStop { position: 1.0; color: backgroundGradientColorStart }
GradientStop { position: 0.0; color: "#999999" } GradientStop { position: 0.0; color: backgroundGradientColorEnd }
} }
MouseArea { MouseArea {

View File

@@ -1954,6 +1954,12 @@ void Qt5InformationNodeInstanceServer::createScene(const CreateSceneCommand &com
#ifdef IMPORT_QUICK3D_ASSETS #ifdef IMPORT_QUICK3D_ASSETS
QTimer::singleShot(0, this, &Qt5InformationNodeInstanceServer::resolveImportSupport); QTimer::singleShot(0, this, &Qt5InformationNodeInstanceServer::resolveImportSupport);
#endif #endif
if (!command.edit3dBackgroundColor.isEmpty()) {
View3DActionCommand backgroundColorCommand(View3DActionCommand::SelectBackgroundColor,
QVariant::fromValue(command.edit3dBackgroundColor));
view3DAction(backgroundColorCommand);
}
} }
void Qt5InformationNodeInstanceServer::sendChildrenChangedCommand(const QList<ServerNodeInstance> &childList) void Qt5InformationNodeInstanceServer::sendChildrenChangedCommand(const QList<ServerNodeInstance> &childList)
@@ -2169,18 +2175,19 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
if (!m_editView3DSetupDone) if (!m_editView3DSetupDone)
return; return;
QVariantMap updatedState; QVariantMap updatedToolState;
QVariantMap updatedViewState;
int renderCount = 1; int renderCount = 1;
switch (command.type()) { switch (command.type()) {
case View3DActionCommand::MoveTool: case View3DActionCommand::MoveTool:
updatedState.insert("transformMode", 0); updatedToolState.insert("transformMode", 0);
break; break;
case View3DActionCommand::RotateTool: case View3DActionCommand::RotateTool:
updatedState.insert("transformMode", 1); updatedToolState.insert("transformMode", 1);
break; break;
case View3DActionCommand::ScaleTool: case View3DActionCommand::ScaleTool:
updatedState.insert("transformMode", 2); updatedToolState.insert("transformMode", 2);
break; break;
case View3DActionCommand::FitToView: case View3DActionCommand::FitToView:
QMetaObject::invokeMethod(m_editView3DData.rootItem, "fitToView"); QMetaObject::invokeMethod(m_editView3DData.rootItem, "fitToView");
@@ -2192,38 +2199,42 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignViewToCamera"); QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignViewToCamera");
break; break;
case View3DActionCommand::SelectionModeToggle: case View3DActionCommand::SelectionModeToggle:
updatedState.insert("selectionMode", command.isEnabled() ? 1 : 0); updatedToolState.insert("selectionMode", command.isEnabled() ? 1 : 0);
break; break;
case View3DActionCommand::CameraToggle: case View3DActionCommand::CameraToggle:
updatedState.insert("usePerspective", command.isEnabled()); updatedToolState.insert("usePerspective", command.isEnabled());
// It can take a couple frames to properly update icon gizmo positions // It can take a couple frames to properly update icon gizmo positions
renderCount = 2; renderCount = 2;
break; break;
case View3DActionCommand::OrientationToggle: case View3DActionCommand::OrientationToggle:
updatedState.insert("globalOrientation", command.isEnabled()); updatedToolState.insert("globalOrientation", command.isEnabled());
break; break;
case View3DActionCommand::EditLightToggle: case View3DActionCommand::EditLightToggle:
updatedState.insert("showEditLight", command.isEnabled()); updatedToolState.insert("showEditLight", command.isEnabled());
break; break;
case View3DActionCommand::ShowGrid: case View3DActionCommand::ShowGrid:
updatedState.insert("showGrid", command.isEnabled()); updatedToolState.insert("showGrid", command.isEnabled());
break; break;
case View3DActionCommand::ShowSelectionBox: case View3DActionCommand::ShowSelectionBox:
updatedState.insert("showSelectionBox", command.isEnabled()); updatedToolState.insert("showSelectionBox", command.isEnabled());
break; break;
case View3DActionCommand::ShowIconGizmo: case View3DActionCommand::ShowIconGizmo:
updatedState.insert("showIconGizmo", command.isEnabled()); updatedToolState.insert("showIconGizmo", command.isEnabled());
break; break;
case View3DActionCommand::ShowCameraFrustum: case View3DActionCommand::ShowCameraFrustum:
updatedState.insert("showCameraFrustum", command.isEnabled()); updatedToolState.insert("showCameraFrustum", command.isEnabled());
break; break;
case View3DActionCommand::SelectBackgroundColor: {
updatedViewState.insert("selectBackgroundColor", command.value());
break;
}
#ifdef QUICK3D_PARTICLES_MODULE #ifdef QUICK3D_PARTICLES_MODULE
case View3DActionCommand::ShowParticleEmitter: case View3DActionCommand::ShowParticleEmitter:
updatedState.insert("showParticleEmitter", command.isEnabled()); updatedToolState.insert("showParticleEmitter", command.isEnabled());
break; break;
case View3DActionCommand::ParticlesPlay: case View3DActionCommand::ParticlesPlay:
m_particleAnimationPlaying = command.isEnabled(); m_particleAnimationPlaying = command.isEnabled();
updatedState.insert("particlePlay", command.isEnabled()); updatedToolState.insert("particlePlay", command.isEnabled());
if (m_particleAnimationPlaying) { if (m_particleAnimationPlaying) {
m_particleAnimationDriver->play(); m_particleAnimationDriver->play();
m_particleAnimationDriver->setSeekerEnabled(false); m_particleAnimationDriver->setSeekerEnabled(false);
@@ -2249,12 +2260,17 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
break; break;
} }
if (!updatedState.isEmpty()) { if (!updatedToolState.isEmpty()) {
QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateToolStates", QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateToolStates",
Q_ARG(QVariant, updatedState), Q_ARG(QVariant, updatedToolState),
Q_ARG(QVariant, QVariant::fromValue(false))); Q_ARG(QVariant, QVariant::fromValue(false)));
} }
if (!updatedViewState.isEmpty()) {
QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateViewStates",
Q_ARG(QVariant, updatedViewState));
}
render3DEditView(renderCount); render3DEditView(renderCount);
} }

View File

@@ -162,6 +162,7 @@ extend_qtc_plugin(QmlDesigner
edit3dcanvas.cpp edit3dcanvas.h edit3dcanvas.cpp edit3dcanvas.h
edit3dactions.cpp edit3dactions.h edit3dactions.cpp edit3dactions.h
edit3dvisibilitytogglesmenu.cpp edit3dvisibilitytogglesmenu.h edit3dvisibilitytogglesmenu.cpp edit3dvisibilitytogglesmenu.h
backgroundcolorselection.cpp backgroundcolorselection.h
edit3d.qrc edit3d.qrc
) )

View File

@@ -0,0 +1,103 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** 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.
**
****************************************************************************/
#include "backgroundcolorselection.h"
#include <nodeinstanceview.h>
#include <utils/qtcassert.h>
#include <view3dactioncommand.h>
#include <qmldesignerplugin.h>
using namespace QmlDesigner;
namespace {
QList<QColor> readBackgroundColorConfiguration()
{
QVariant var = QmlDesigner::DesignerSettings::getValue(
QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR);
if (!var.isValid())
return {};
auto colorNameList = var.value<QList<QString>>();
QTC_ASSERT(colorNameList.size() == 2, return {});
return {colorNameList[0], colorNameList[1]};
}
void setBackgroundColorConfiguration(const QList<QColor> &colorConfig)
{
auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView();
View3DActionCommand cmd(View3DActionCommand::SelectBackgroundColor,
QVariant::fromValue(colorConfig));
view->view3DAction(cmd);
}
void saveBackgroundColorConfiguration(const QList<QColor> &colorConfig)
{
QList<QString> colorsSaved = {colorConfig[0].name(), colorConfig[1].name()};
QmlDesigner::DesignerSettings::setValue(
QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR,
QVariant::fromValue(colorsSaved));
}
} // namespace
QPointer<QColorDialog> BackgroundColorSelection::createDialog(QWidget *parent)
{
auto dialog = new QColorDialog(parent);
dialog->setModal(true);
dialog->setAttribute(Qt::WA_DeleteOnClose);
const QList<QColor> oldColorConfig = readBackgroundColorConfiguration();
dialog->show();
QObject::connect(dialog, &QColorDialog::currentColorChanged, dialog, [](const QColor &color) {
setBackgroundColorConfiguration({color, color});
});
QObject::connect(dialog, &QColorDialog::colorSelected, dialog, [](const QColor &color) {
saveBackgroundColorConfiguration({color, color});
});
if (!oldColorConfig.isEmpty()) {
QObject::connect(dialog, &QColorDialog::rejected, dialog, [oldColorConfig]() {
setBackgroundColorConfiguration(oldColorConfig);
});
}
return dialog;
}
void BackgroundColorSelection::showBackgroundColorSelectionWidget(QWidget *parent)
{
if (m_dialog)
return;
m_dialog = BackgroundColorSelection::createDialog(parent);
QTC_ASSERT(m_dialog, return);
}

View File

@@ -0,0 +1,47 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** 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.
**
****************************************************************************/
#pragma once
#include <QColorDialog>
namespace QmlDesigner {
class BackgroundColorSelection : public QObject
{
Q_OBJECT
public:
explicit BackgroundColorSelection(QObject *parent = nullptr)
: QObject{parent}
{}
static void showBackgroundColorSelectionWidget(QWidget *parent);
private:
static QPointer<QColorDialog> createDialog(QWidget *parent);
inline static QPointer<QColorDialog> m_dialog;
};
} // namespace QmlDesigner

View File

@@ -44,5 +44,7 @@
<file>images/align_camera_on@2x.png</file> <file>images/align_camera_on@2x.png</file>
<file>images/align_view_on.png</file> <file>images/align_view_on.png</file>
<file>images/align_view_on@2x.png</file> <file>images/align_view_on@2x.png</file>
<file>images/color_palette.png</file>
<file>images/color_palette@2x.png</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -48,9 +48,10 @@ Edit3DActionTemplate::Edit3DActionTemplate(const QString &description,
void Edit3DActionTemplate::actionTriggered(bool b) void Edit3DActionTemplate::actionTriggered(bool b)
{ {
if (m_type != View3DActionCommand::Empty) { if (m_type != View3DActionCommand::Empty && m_type != View3DActionCommand::SelectBackgroundColor) {
QmlDesignerPlugin::instance()->viewManager().nodeInstanceView() auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView();
->view3DAction(View3DActionCommand(m_type, b)); View3DActionCommand cmd(m_type, b);
view->view3DAction(cmd);
} }
if (m_action) if (m_action)

View File

@@ -42,6 +42,8 @@
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <backgroundcolorselection.h>
#include <QDebug> #include <QDebug>
#include <QToolButton> #include <QToolButton>
@@ -336,6 +338,32 @@ void Edit3DView::createEdit3DActions()
QKeySequence(Qt::Key_G), true, true, {}, {}, nullptr, QKeySequence(Qt::Key_G), true, true, {}, {}, nullptr,
QCoreApplication::translate("ShowGridAction", "Toggle the visibility of the helper grid.")); QCoreApplication::translate("ShowGridAction", "Toggle the visibility of the helper grid."));
SelectionContextOperation showBackgroundColorSelection = [this](const SelectionContext &) {
BackgroundColorSelection::showBackgroundColorSelectionWidget(edit3DWidget());
};
m_backgroundColorSelectionAction = new Edit3DAction(
QmlDesigner::Constants::EDIT3D_EDIT_SELECT_BACKGROUND_COLOR, View3DActionCommand::SelectBackgroundColor,
QCoreApplication::translate("SelectBackgroundColorAction", "Select Background color"),
{}, false, false, {}, {}, showBackgroundColorSelection,
QCoreApplication::translate("SelectBackgroundColorAction", "Choose a color for the background."));
m_resetBackgroundColorAction = new Edit3DAction(
QmlDesigner::Constants::EDIT3D_EDIT_RESET_BACKGROUND_COLOR, View3DActionCommand::ResetBackgroundColor,
QCoreApplication::translate("ResetBackgroundColorAction", "Reset Background color"),
{}, false, false, {}, {}, [](const SelectionContext &) {
QList<QColor> colors = {QRgb(0x222222), QRgb(0x999999)};
auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView();
View3DActionCommand cmd(View3DActionCommand::SelectBackgroundColor, QVariant::fromValue(colors));
view->view3DAction(cmd);
QList<QString> colorsToSave = {colors[0].name(), colors[1].name()};
QmlDesigner::DesignerSettings::setValue(
QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR,
QVariant::fromValue(colorsToSave));
},
QCoreApplication::translate("ResetBackgroundColorAction", "Reset Background color to the default value."));
m_showSelectionBoxAction = new Edit3DAction( m_showSelectionBoxAction = new Edit3DAction(
QmlDesigner::Constants::EDIT3D_EDIT_SHOW_SELECTION_BOX, View3DActionCommand::ShowSelectionBox, QmlDesigner::Constants::EDIT3D_EDIT_SHOW_SELECTION_BOX, View3DActionCommand::ShowSelectionBox,
QCoreApplication::translate("ShowSelectionBoxAction", "Show Selection Boxes"), QCoreApplication::translate("ShowSelectionBoxAction", "Show Selection Boxes"),
@@ -438,6 +466,29 @@ void Edit3DView::createEdit3DActions()
QKeySequence(), false, false, Utils::Icons::EYE_OPEN_TOOLBAR.icon(), QKeySequence(), false, false, Utils::Icons::EYE_OPEN_TOOLBAR.icon(),
{}, visibilityTogglesTrigger); {}, visibilityTogglesTrigger);
SelectionContextOperation backgroundColorActionsTrigger = [this](const SelectionContext &) {
if (!edit3DWidget()->backgroundColorMenu())
return;
QPoint pos;
const auto &actionWidgets = m_backgrondColorMenuAction->action()->associatedWidgets();
for (auto actionWidget : actionWidgets) {
if (auto button = qobject_cast<QToolButton *>(actionWidget)) {
pos = button->mapToGlobal(QPoint(0, 0));
break;
}
}
edit3DWidget()->showBackgroundColorMenu(!edit3DWidget()->backgroundColorMenu()->isVisible(),
pos);
};
m_backgrondColorMenuAction = new Edit3DAction(
QmlDesigner::Constants::EDIT3D_BACKGROUND_COLOR_ACTIONS, View3DActionCommand::Empty,
QCoreApplication::translate("BackgroundColorMenuActions", "Background Color Actions"),
QKeySequence(), false, false, Icons::COLOR_PALETTE.icon(),
{}, backgroundColorActionsTrigger);
m_leftActions << m_selectionModeAction; m_leftActions << m_selectionModeAction;
m_leftActions << nullptr; // Null indicates separator m_leftActions << nullptr; // Null indicates separator
m_leftActions << nullptr; // Second null after separator indicates an exclusive group m_leftActions << nullptr; // Second null after separator indicates an exclusive group
@@ -455,6 +506,8 @@ void Edit3DView::createEdit3DActions()
m_leftActions << m_alignViewAction; m_leftActions << m_alignViewAction;
m_leftActions << nullptr; m_leftActions << nullptr;
m_leftActions << m_visibilityTogglesAction; m_leftActions << m_visibilityTogglesAction;
m_leftActions << nullptr;
m_leftActions << m_backgrondColorMenuAction;
m_rightActions << m_particleViewModeAction; m_rightActions << m_particleViewModeAction;
m_rightActions << m_particlesPlayAction; m_rightActions << m_particlesPlayAction;
@@ -467,6 +520,9 @@ void Edit3DView::createEdit3DActions()
m_visibilityToggleActions << m_showIconGizmoAction; m_visibilityToggleActions << m_showIconGizmoAction;
m_visibilityToggleActions << m_showCameraFrustumAction; m_visibilityToggleActions << m_showCameraFrustumAction;
m_visibilityToggleActions << m_showParticleEmitterAction; m_visibilityToggleActions << m_showParticleEmitterAction;
m_backgroundColorActions << m_backgroundColorSelectionAction;
m_backgroundColorActions << m_resetBackgroundColorAction;
} }
QVector<Edit3DAction *> Edit3DView::leftActions() const QVector<Edit3DAction *> Edit3DView::leftActions() const
@@ -484,6 +540,11 @@ QVector<Edit3DAction *> Edit3DView::visibilityToggleActions() const
return m_visibilityToggleActions; return m_visibilityToggleActions;
} }
QVector<Edit3DAction *> Edit3DView::backgroundColorActions() const
{
return m_backgroundColorActions;
}
void Edit3DView::addQuick3DImport() void Edit3DView::addQuick3DImport()
{ {
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();

View File

@@ -74,6 +74,7 @@ public:
QVector<Edit3DAction *> leftActions() const; QVector<Edit3DAction *> leftActions() const;
QVector<Edit3DAction *> rightActions() const; QVector<Edit3DAction *> rightActions() const;
QVector<Edit3DAction *> visibilityToggleActions() const; QVector<Edit3DAction *> visibilityToggleActions() const;
QVector<Edit3DAction *> backgroundColorActions() const;
void setSeeker(SeekerSlider *slider); void setSeeker(SeekerSlider *slider);
void addQuick3DImport(); void addQuick3DImport();
@@ -88,6 +89,7 @@ private:
QVector<Edit3DAction *> m_leftActions; QVector<Edit3DAction *> m_leftActions;
QVector<Edit3DAction *> m_rightActions; QVector<Edit3DAction *> m_rightActions;
QVector<Edit3DAction *> m_visibilityToggleActions; QVector<Edit3DAction *> m_visibilityToggleActions;
QVector<Edit3DAction *> m_backgroundColorActions;
Edit3DAction *m_selectionModeAction = nullptr; Edit3DAction *m_selectionModeAction = nullptr;
Edit3DAction *m_moveToolAction = nullptr; Edit3DAction *m_moveToolAction = nullptr;
Edit3DAction *m_rotateToolAction = nullptr; Edit3DAction *m_rotateToolAction = nullptr;
@@ -99,6 +101,8 @@ private:
Edit3DAction *m_orientationModeAction = nullptr; Edit3DAction *m_orientationModeAction = nullptr;
Edit3DAction *m_editLightAction = nullptr; Edit3DAction *m_editLightAction = nullptr;
Edit3DAction *m_showGridAction = nullptr; Edit3DAction *m_showGridAction = nullptr;
Edit3DAction *m_backgroundColorSelectionAction = nullptr;
Edit3DAction *m_resetBackgroundColorAction = nullptr;
Edit3DAction *m_showSelectionBoxAction = nullptr; Edit3DAction *m_showSelectionBoxAction = nullptr;
Edit3DAction *m_showIconGizmoAction = nullptr; Edit3DAction *m_showIconGizmoAction = nullptr;
Edit3DAction *m_showCameraFrustumAction = nullptr; Edit3DAction *m_showCameraFrustumAction = nullptr;
@@ -108,6 +112,7 @@ private:
Edit3DAction *m_particlesPlayAction = nullptr; Edit3DAction *m_particlesPlayAction = nullptr;
Edit3DAction *m_particlesRestartAction = nullptr; Edit3DAction *m_particlesRestartAction = nullptr;
Edit3DAction *m_visibilityTogglesAction = nullptr; Edit3DAction *m_visibilityTogglesAction = nullptr;
Edit3DAction *m_backgrondColorMenuAction = nullptr;
SeekerSlider *m_seeker = nullptr; SeekerSlider *m_seeker = nullptr;
int particlemode; int particlemode;
ModelCache<QImage> m_canvasCache; ModelCache<QImage> m_canvasCache;

View File

@@ -141,6 +141,9 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) :
m_visibilityTogglesMenu = new Edit3DVisibilityTogglesMenu(this); m_visibilityTogglesMenu = new Edit3DVisibilityTogglesMenu(this);
handleActions(view->visibilityToggleActions(), m_visibilityTogglesMenu, false); handleActions(view->visibilityToggleActions(), m_visibilityTogglesMenu, false);
m_backgroundColorMenu = new Edit3DVisibilityTogglesMenu(this);
handleActions(view->backgroundColorActions(), m_backgroundColorMenu, false);
view->setSeeker(seeker); view->setSeeker(seeker);
seeker->setToolTip(QLatin1String("Seek particle system time when paused.")); seeker->setToolTip(QLatin1String("Seek particle system time when paused."));
@@ -201,6 +204,21 @@ void Edit3DWidget::showVisibilityTogglesMenu(bool show, const QPoint &pos)
m_visibilityTogglesMenu->close(); m_visibilityTogglesMenu->close();
} }
QMenu *Edit3DWidget::backgroundColorMenu() const
{
return m_backgroundColorMenu.data();
}
void Edit3DWidget::showBackgroundColorMenu(bool show, const QPoint &pos)
{
if (m_backgroundColorMenu.isNull())
return;
if (show)
m_backgroundColorMenu->popup(pos);
else
m_backgroundColorMenu->close();
}
void Edit3DWidget::linkActivated(const QString &link) void Edit3DWidget::linkActivated(const QString &link)
{ {
Q_UNUSED(link) Q_UNUSED(link)

View File

@@ -51,6 +51,9 @@ public:
QMenu *visibilityTogglesMenu() const; QMenu *visibilityTogglesMenu() const;
void showVisibilityTogglesMenu(bool show, const QPoint &pos); void showVisibilityTogglesMenu(bool show, const QPoint &pos);
QMenu *backgroundColorMenu() const;
void showBackgroundColorMenu(bool show, const QPoint &pos);
protected: protected:
void dragEnterEvent(QDragEnterEvent *dragEnterEvent) override; void dragEnterEvent(QDragEnterEvent *dragEnterEvent) override;
void dropEvent(QDropEvent *dropEvent) override; void dropEvent(QDropEvent *dropEvent) override;
@@ -65,6 +68,7 @@ private:
QPointer<ToolBox> m_toolBox; QPointer<ToolBox> m_toolBox;
Core::IContext *m_context = nullptr; Core::IContext *m_context = nullptr;
QPointer<QMenu> m_visibilityTogglesMenu; QPointer<QMenu> m_visibilityTogglesMenu;
QPointer<QMenu> m_backgroundColorMenu;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

View File

@@ -982,6 +982,17 @@ QList<ModelNode> filterNodesForSkipItems(const QList<ModelNode> &nodeList)
return filteredNodeList; return filteredNodeList;
} }
QList<QColor> readBackgroundColorConfiguration(const QVariant &var)
{
if (!var.isValid())
return {};
auto colorNameList = var.value<QList<QString>>();
QTC_ASSERT(colorNameList.size() == 2, return {});
return {colorNameList[0], colorNameList[1]};
}
CreateSceneCommand NodeInstanceView::createCreateSceneCommand() CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
{ {
QList<ModelNode> nodeList = allModelNodes(); QList<ModelNode> nodeList = allModelNodes();
@@ -1136,6 +1147,13 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0))
stateInstanceId = stateNode.internalId(); stateInstanceId = stateNode.internalId();
auto value = QmlDesigner::DesignerSettings::getValue(
QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR);
QList<QColor> edit3dBackgroundColor;
if (value.isValid())
edit3dBackgroundColor = readBackgroundColorConfiguration(value);
return CreateSceneCommand( return CreateSceneCommand(
instanceContainerList, instanceContainerList,
reparentContainerList, reparentContainerList,
@@ -1156,7 +1174,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
lastUsedLanguage, lastUsedLanguage,
m_captureImageMinimumSize, m_captureImageMinimumSize,
m_captureImageMaximumSize, m_captureImageMaximumSize,
stateInstanceId); stateInstanceId,
edit3dBackgroundColor);
} }
ClearSceneCommand NodeInstanceView::createClearSceneCommand() const ClearSceneCommand NodeInstanceView::createClearSceneCommand() const

View File

@@ -80,6 +80,7 @@ void DesignerSettings::fromSettings(QSettings *settings)
restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true); restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true);
restoreValue(settings, DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER, false); restoreValue(settings, DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER, false);
restoreValue(settings, DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET, true); restoreValue(settings, DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET, true);
restoreValue(settings, DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR, QList<QString>{"#222222", "#999999"});
settings->endGroup(); settings->endGroup();
settings->endGroup(); settings->endGroup();

View File

@@ -49,6 +49,7 @@ const char WARNING_FOR_QML_FILES_INSTEAD_OF_UIQML_FILES[] = "WarnAboutQmlFilesIn
const char WARNING_FOR_DESIGNER_FEATURES_IN_EDITOR[] = "WarnAboutQtQuickDesignerFeaturesInCodeEditor"; const char WARNING_FOR_DESIGNER_FEATURES_IN_EDITOR[] = "WarnAboutQtQuickDesignerFeaturesInCodeEditor";
const char SHOW_DEBUGVIEW[] = "ShowQtQuickDesignerDebugView"; const char SHOW_DEBUGVIEW[] = "ShowQtQuickDesignerDebugView";
const char ENABLE_DEBUGVIEW[] = "EnableQtQuickDesignerDebugView"; const char ENABLE_DEBUGVIEW[] = "EnableQtQuickDesignerDebugView";
const char EDIT3DVIEW_BACKGROUND_COLOR[] = "Edit3DViewBackgroundColor";
const char ALWAYS_SAVE_IN_CRUMBLEBAR[] = "AlwaysSaveInCrumbleBar"; const char ALWAYS_SAVE_IN_CRUMBLEBAR[] = "AlwaysSaveInCrumbleBar";
const char USE_DEFAULT_PUPPET[] = "UseDefaultQml2Puppet"; const char USE_DEFAULT_PUPPET[] = "UseDefaultQml2Puppet";
const char PUPPET_TOPLEVEL_BUILD_DIRECTORY[] = "PuppetToplevelBuildDirectory"; const char PUPPET_TOPLEVEL_BUILD_DIRECTORY[] = "PuppetToplevelBuildDirectory";

View File

@@ -65,6 +65,8 @@ const char EDIT3D_EDIT_CAMERA[] = "QmlDesigner.Editor3D.EditCameraToggle";
const char EDIT3D_ORIENTATION[] = "QmlDesigner.Editor3D.OrientationToggle"; const char EDIT3D_ORIENTATION[] = "QmlDesigner.Editor3D.OrientationToggle";
const char EDIT3D_EDIT_LIGHT[] = "QmlDesigner.Editor3D.EditLightToggle"; const char EDIT3D_EDIT_LIGHT[] = "QmlDesigner.Editor3D.EditLightToggle";
const char EDIT3D_EDIT_SHOW_GRID[] = "QmlDesigner.Editor3D.ToggleGrid"; const char EDIT3D_EDIT_SHOW_GRID[] = "QmlDesigner.Editor3D.ToggleGrid";
const char EDIT3D_EDIT_SELECT_BACKGROUND_COLOR[] = "QmlDesigner.Editor3D.SelectBackgroundColor";
const char EDIT3D_EDIT_RESET_BACKGROUND_COLOR[] = "QmlDesigner.Editor3D.ResetBackgroundColor";
const char EDIT3D_EDIT_SHOW_SELECTION_BOX[] = "QmlDesigner.Editor3D.ToggleSelectionBox"; const char EDIT3D_EDIT_SHOW_SELECTION_BOX[] = "QmlDesigner.Editor3D.ToggleSelectionBox";
const char EDIT3D_EDIT_SHOW_ICON_GIZMO[] = "QmlDesigner.Editor3D.ToggleIconGizmo"; const char EDIT3D_EDIT_SHOW_ICON_GIZMO[] = "QmlDesigner.Editor3D.ToggleIconGizmo";
const char EDIT3D_EDIT_SHOW_CAMERA_FRUSTUM[] = "QmlDesigner.Editor3D.ToggleCameraFrustum"; const char EDIT3D_EDIT_SHOW_CAMERA_FRUSTUM[] = "QmlDesigner.Editor3D.ToggleCameraFrustum";
@@ -74,6 +76,7 @@ const char EDIT3D_PARTICLE_MODE[] = "QmlDesigner.Editor3D.ParticleViewModeTo
const char EDIT3D_PARTICLES_PLAY[] = "QmlDesigner.Editor3D.ParticlesPlay"; const char EDIT3D_PARTICLES_PLAY[] = "QmlDesigner.Editor3D.ParticlesPlay";
const char EDIT3D_PARTICLES_RESTART[] = "QmlDesigner.Editor3D.ParticlesRestart"; const char EDIT3D_PARTICLES_RESTART[] = "QmlDesigner.Editor3D.ParticlesRestart";
const char EDIT3D_VISIBILITY_TOGGLES[] = "QmlDesigner.Editor3D.VisibilityToggles"; const char EDIT3D_VISIBILITY_TOGGLES[] = "QmlDesigner.Editor3D.VisibilityToggles";
const char EDIT3D_BACKGROUND_COLOR_ACTIONS[] = "QmlDesigner.Editor3D.BackgroundColorActions";
const char QML_DESIGNER_SUBFOLDER[] = "/designer/"; const char QML_DESIGNER_SUBFOLDER[] = "/designer/";

View File

@@ -91,6 +91,8 @@ const Utils::Icon EDIT3D_ALIGN_CAMERA_ON({
{":/edit3d/images/align_camera_on.png", Utils::Theme::IconsBaseColor}}); {":/edit3d/images/align_camera_on.png", Utils::Theme::IconsBaseColor}});
const Utils::Icon EDIT3D_ALIGN_VIEW_ON({ const Utils::Icon EDIT3D_ALIGN_VIEW_ON({
{":/edit3d/images/align_view_on.png", Utils::Theme::IconsBaseColor}}); {":/edit3d/images/align_view_on.png", Utils::Theme::IconsBaseColor}});
const Utils::Icon COLOR_PALETTE({
{":/edit3d/images/color_palette.png", Utils::Theme::IconsBaseColor}});
} // Icons } // Icons
} // QmlDesigner } // QmlDesigner

View File

@@ -526,6 +526,8 @@ Project {
"debugview/debugviewwidget.ui", "debugview/debugviewwidget.ui",
"edit3d/edit3dview.cpp", "edit3d/edit3dview.cpp",
"edit3d/edit3dview.h", "edit3d/edit3dview.h",
"edit3d/backgroundcolorselection.cpp",
"edit3d/backgroundcolorselection.h",
"edit3d/edit3dwidget.cpp", "edit3d/edit3dwidget.cpp",
"edit3d/edit3dwidget.h", "edit3d/edit3dwidget.h",
"edit3d/edit3dcanvas.cpp", "edit3d/edit3dcanvas.cpp",