Initial commit

This commit is contained in:
alexpete
2021-03-05 11:26:34 -08:00
commit a10351f38d
27091 changed files with 5521199 additions and 0 deletions
@@ -0,0 +1,252 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#if !defined(Q_MOC_RUN)
#include <QAbstractItemModel>
#include <QIcon>
#include <QSortFilterProxyModel>
#include <AzQtComponents/Components/StyledDockWidget.h>
#include <GraphCanvas/Editor/AssetEditorBus.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Components/ToastBus.h>
#include <ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h>
#include <ScriptCanvas/Debugger/StatusBus.h>
#endif
namespace Ui
{
class GraphValidationPanel;
}
namespace ScriptCanvas
{
class ScopedDataConnectionEvent;
class InvalidVariableTypeEvent;
class ScriptEventVersionMismatch;
}
namespace ScriptCanvasEditor
{
class ValidationEffect
{
public:
AZ_CLASS_ALLOCATOR(ValidationEffect, AZ::SystemAllocator, 0);
virtual ~ValidationEffect() = default;
virtual void DisplayEffect(const GraphCanvas::GraphId& graphId) = 0;
virtual void CancelEffect() = 0;
};
class HighlightElementValidationEffect
: public ValidationEffect
{
public:
AZ_CLASS_ALLOCATOR(HighlightElementValidationEffect, AZ::SystemAllocator, 0);
HighlightElementValidationEffect();
HighlightElementValidationEffect(const QColor& color);
HighlightElementValidationEffect(const GraphCanvas::SceneMemberGlowOutlineConfiguration& glowConfiguration);
void AddTarget(const AZ::EntityId& targetId);
void DisplayEffect(const GraphCanvas::GraphId& graphId) override;
void CancelEffect() override;
private:
AZStd::vector< AZ::EntityId > m_targets;
GraphCanvas::GraphId m_graphId;
AZStd::vector< GraphCanvas::GraphicsEffectId > m_graphicEffectIds;
GraphCanvas::SceneMemberGlowOutlineConfiguration m_templateConfiguration;
};
class UnusedNodeValidationEffect
: public ValidationEffect
{
public:
void AddUnusedNode(const AZ::EntityId& graphCanvasNodeId);
void RemoveUnusedNode(const AZ::EntityId& graphCanvasNodeId);
void DisplayEffect(const GraphCanvas::GraphId& graphId) override;
void CancelEffect() override;
public:
void ClearStyleSelectors();
void ApplySelector(const AZ::EntityId& nodeId, AZStd::string_view styleSelector);
void RemoveSelector(const AZ::EntityId& nodeId);
bool m_isDirty;
AZStd::unordered_set< AZ::EntityId > m_unprocessedIds;
AZStd::unordered_set< AZ::EntityId > m_rootUnusedNodes;
AZStd::unordered_set< AZ::EntityId > m_inactiveNodes;
AZStd::unordered_map< AZ::EntityId, AZStd::string > m_styleSelectors;
};
class GraphValidationModel
: public QAbstractItemModel
{
Q_OBJECT
public:
AZ_CLASS_ALLOCATOR(GraphValidationModel, AZ::SystemAllocator, 0);
enum ColumnIndex
{
IndexForce = -1,
Description,
AutoFix,
Count
};
GraphValidationModel();
~GraphValidationModel() override;
void RunValidation(const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
// QAbstractItemModel
QModelIndex index(int row, int column, const QModelIndex& parent) const override;
QModelIndex parent(const QModelIndex& index = QModelIndex()) const override;
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
////
const ScriptCanvas::ValidationEvent* FindItemForIndex(const QModelIndex& index) const;
const ScriptCanvas::ValidationEvent* FindItemForRow(int row) const;
const ScriptCanvas::ValidationResults& GetValidationResults() const;
private:
ScriptCanvas::ValidationResults m_validationResults;
QIcon m_errorIcon;
QIcon m_warningIcon;
QIcon m_messageIcon;
QIcon m_autoFixIcon;
};
class GraphValidationSortFilterProxyModel
: public QSortFilterProxyModel
{
Q_OBJECT
public:
AZ_CLASS_ALLOCATOR(GraphValidationSortFilterProxyModel, AZ::SystemAllocator, 0);
GraphValidationSortFilterProxyModel();
bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;
void SetFilter(const QString& filterString);
void SetSeverityFilter(ScriptCanvas::ValidationSeverity severityFilter);
ScriptCanvas::ValidationSeverity GetSeverityFilter() const;
bool IsShowingErrors();
bool IsShowingWarnings();
private:
ScriptCanvas::ValidationSeverity m_severityFilter;
QString m_filter;
QRegExp m_regex;
};
class GraphValidationDockWidget
: public AzQtComponents::StyledDockWidget
, public GraphCanvas::AssetEditorNotificationBus::Handler
, public GraphCanvas::SceneNotificationBus::Handler
, public GraphCanvas::ToastNotificationBus::MultiHandler
{
Q_OBJECT
public:
AZ_CLASS_ALLOCATOR(GraphValidationDockWidget, AZ::SystemAllocator, 0);
GraphValidationDockWidget(QWidget* parent = nullptr);
~GraphValidationDockWidget();
// GraphCanvas::AssetEditorNotificationBus::Handler
void OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) override;
////
// GrpahCanvas::SceneNotificationBus
void OnSelectionChanged() override;
void OnConnectionDragBegin() override;
////
// ToastNotification
void OnToastInteraction() override;
void OnToastDismissed() override;
////
bool HasValidationIssues() const;
public slots:
void OnRunValidator(bool displayAsNotification = false);
void OnShowErrors();
void OnShowWarnings();
void OnTableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
void FocusOnEvent(const QModelIndex& modelIndex);
void TryAutoFixEvent(const QModelIndex& modelIndex);
void FixSelected();
void OnSeverityFilterChanged();
void OnFilterChanged(const QString& filterString);
private:
// AutoFixes
void AutoFixEvent(const ScriptCanvas::ValidationEvent* validationEvent);
void AutoFixScopedDataConnection(const ScriptCanvas::ScopedDataConnectionEvent* connectionEvent);
void AutoFixDeleteInvalidVariables(const ScriptCanvas::InvalidVariableTypeEvent* invalidVariableEvent);
void AutoFixScriptEventVersionMismatch(const ScriptCanvas::ScriptEventVersionMismatch* scriptEventMismatchEvent);
////
void UpdateText();
void OnRowSelected(int row);
void OnRowDeselected(int row);
void UpdateSelectedText();
GraphValidationModel* m_model;
GraphValidationSortFilterProxyModel* m_proxyModel;
ScriptCanvas::ScriptCanvasId m_scriptCanvasId;
GraphCanvas::GraphId m_graphCanvasGraphId;
UnusedNodeValidationEffect m_unusedNodeValidationEffect;
AZStd::unordered_map< int, ValidationEffect* > m_validationEffects;
AZStd::unique_ptr<Ui::GraphValidationPanel> ui;
};
}
@@ -0,0 +1,30 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/EBus/EBus.h>
#include <GraphCanvas/Editor/EditorTypes.h>
namespace ScriptCanvasEditor
{
class GraphValidatorDockWidgetNotifications : public AZ::EBusTraits
{
public:
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
using BusIdType = GraphCanvas::EditorId;
virtual void OnResultsChanged(int erorrCount, int warningCount) = 0;
};
using GraphValidatorDockWidgetNotificationBus = AZ::EBus<GraphValidatorDockWidgetNotifications>;
}
@@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GraphValidationPanel</class>
<widget class="QDockWidget" name="GraphValidationPanel">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>720</width>
<height>307</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>694</width>
<height>175</height>
</size>
</property>
<property name="allowedAreas">
<set>Qt::AllDockWidgetAreas</set>
</property>
<property name="windowTitle">
<string>Graph Validation</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>5</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>710</width>
<height>242</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="frame_3">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="allFilter">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>All</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="errorOnlyFilter">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>999 Errors</string>
</property>
<property name="icon">
<iconset resource="../../Windows/ScriptCanvasEditorResources.qrc">
<normaloff>:/ScriptCanvasEditorResources/Resources/error_icon.png</normaloff>:/ScriptCanvasEditorResources/Resources/error_icon.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="warningOnlyFilter">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>999 Warnings</string>
</property>
<property name="icon">
<iconset resource="../../Windows/ScriptCanvasEditorResources.qrc">
<normaloff>:/ScriptCanvasEditorResources/Resources/warning_symbol.png</normaloff>:/ScriptCanvasEditorResources/Resources/warning_symbol.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="runValidation">
<property name="toolTip">
<string>Will run a validation check on the current graph and report any warnings/errors discovered.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../Windows/ScriptCanvasEditorResources.qrc">
<normaloff>:/ScriptCanvasEditorResources/Resources/validate_icon.png</normaloff>:/ScriptCanvasEditorResources/Resources/validate_icon.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="AzQtComponents::FilteredSearchWidget" name="searchWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="statusTableView">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>3</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="fixSelectedText">
<property name="text">
<string>999 Selected</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="fixSelected">
<property name="text">
<string>Fix Selected</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>AzQtComponents::FilteredSearchWidget</class>
<extends>QWidget</extends>
<header location="global">AzQtComponents/Components/FilteredSearchWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="../../Windows/ScriptCanvasEditorResources.qrc"/>
</resources>
<connections/>
</ui>