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
+54
View File
@@ -0,0 +1,54 @@
#
# 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.
#
if(NOT PAL_TRAIT_BUILD_HOST_TOOLS)
return()
endif()
ly_get_list_relative_pal_filename(common_source_dir ${CMAKE_CURRENT_LIST_DIR}/Source/Platform/Common)
include(${CMAKE_CURRENT_SOURCE_DIR}/Source/Platform/${PAL_PLATFORM_NAME}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
if(NOT PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED)
return()
endif()
ly_add_target(
NAME QtForPython.Editor.Static STATIC
NAMESPACE Gem
FILES_CMAKE
qtforpython_editor_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
PLATFORM_INCLUDE_FILES
${common_source_dir}/${PAL_TRAIT_COMPILER_ID}/qtforpython_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
INCLUDE_DIRECTORIES
PUBLIC
Include
Source
BUILD_DEPENDENCIES
PUBLIC
AZ::AzCore
AZ::AzFramework
AZ::AzToolsFramework
3rdParty::Qt::Widgets
Gem::EditorPythonBindings.Static
RUNTIME_DEPENDENCIES
3rdParty::pyside2
)
ly_add_target(
NAME QtForPython.Editor MODULE
NAMESPACE Gem
OUTPUT_NAME Gem.QtForPython.Editor.cd50c7a1e31f4c9495dcffdacc3bde92.v0.1.0
FILES_CMAKE
qtforpython_shared_files.cmake
BUILD_DEPENDENCIES
PRIVATE
Gem::QtForPython.Editor.Static
)
@@ -0,0 +1,59 @@
/*
* 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 <AzCore/RTTI/RTTI.h>
namespace QtForPython
{
//////////////////////////////////////////////////////////////////////////
// Used to fetch the data points a bootstrap script requires to hook in
// QtForPython (aka PySide2)
struct QtBootstrapParameters
{
AZ_TYPE_INFO(QtBootstrapParameters, "{4103CF43-6CF7-413D-B2C8-D511E23BAB50}");
//! The path of the Qt binary files such as qt5core.dll
AZStd::string m_qtBinaryFolder;
//! The path of the Qt plugins such as /qtlibs/plugins
AZStd::string m_qtPluginsFolder;
//! The 'winId' of the main Qt window in the Lumberyard editor
AZ::u64 m_mainWindowId;
//! PySide package folder to attach to the Python system path
AZStd::string m_pySidePackageFolder;
};
//! Used to fetch tools framework data
class QtForPythonRequests
: public AZ::EBusTraits
{
public:
//////////////////////////////////////////////////////////////////////////
// EBusTraits overrides
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
//////////////////////////////////////////////////////////////////////////
//! Check to make sure Python is ready and active
virtual bool IsActive() const = 0;
//! Fetches the data a bootstrap script requires to hook in QtForPython
virtual QtBootstrapParameters GetQtBootstrapParameters() const = 0;
};
using QtForPythonRequestBus = AZ::EBus<QtForPythonRequests>;
}
@@ -0,0 +1,15 @@
#
# 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.
#
set(LY_COMPILE_OPTIONS
PRIVATE
-fexceptions # QtForPythonSystemComponent uses a try catch block
)
@@ -0,0 +1,15 @@
#
# 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.
#
set(LY_COMPILE_OPTIONS
PRIVATE
/EHsc # QtForPythonSystemComponent uses a try catch block
)
@@ -0,0 +1,12 @@
#
# 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.
#
set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE)
@@ -0,0 +1,12 @@
#
# 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.
#
set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE)
@@ -0,0 +1,12 @@
#
# 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.
#
set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED TRUE)
@@ -0,0 +1,51 @@
/*
* 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.
*
*/
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Module/Module.h>
#include <QtForPythonSystemComponent.h>
namespace QtForPython
{
class QtForPythonModule
: public AZ::Module
{
public:
AZ_RTTI(QtForPythonModule, "{81545CD5-79FA-47CE-96F2-1A9C5D59B4B9}", AZ::Module);
AZ_CLASS_ALLOCATOR(QtForPythonModule, AZ::SystemAllocator, 0);
QtForPythonModule()
: AZ::Module()
{
m_descriptors.insert(m_descriptors.end(), {
QtForPythonSystemComponent::CreateDescriptor(),
});
}
/**
* Add required SystemComponents to the SystemEntity.
*/
AZ::ComponentTypeList GetRequiredSystemComponents() const override
{
return AZ::ComponentTypeList
{
azrtti_typeid<QtForPythonSystemComponent>(),
};
}
};
}
// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM
// The first parameter should be GemName_GemIdLower
// The second should be the fully qualified name of the class above
AZ_DECLARE_MODULE_CLASS(Gem_QtForPython, QtForPython::QtForPythonModule)
@@ -0,0 +1,296 @@
/*
* 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.
*
*/
#include <QtForPythonSystemComponent.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzToolsFramework/API/EditorWindowRequestBus.h>
#include <AzToolsFramework/API/EditorPythonRunnerRequestsBus.h>
#include <AzCore/IO/SystemFile.h>
#include <AzFramework/IO/LocalFileIO.h>
#include <EditorPythonBindings/EditorPythonBindingsSymbols.h>
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // (qwidget.h) 'uint': forcing value to bool 'true' or 'false' (performance warning)
#include <QPointer>
#include <QWidget>
#include <QApplication>
#include <QDateTime>
AZ_POP_DISABLE_WARNING
// Qt defines slots, which interferes with the use here.
#pragma push_macro("slots")
#undef slots
#include <Python.h>
#include <pybind11/pybind11.h>
#include <pybind11/functional.h>
#pragma pop_macro("slots")
namespace QtForPython
{
static const constexpr int s_loopTimerInterval = 5;
static const constexpr float s_maxTime = 25.f * 60.f * 60.f;
class QtForPythonEventHandler : public QObject
{
private:
std::function<void()> m_loopCallback;
float m_time = 0.f;
QPointer<QObject> m_lastTimerParent = nullptr;
int m_lastTimerId = 0;
public:
void SetupTimer(QObject* parent)
{
if (parent == m_lastTimerParent)
{
return;
}
if (m_lastTimerParent)
{
m_lastTimerParent->killTimer(m_lastTimerId);
}
m_lastTimerId = parent->startTimer(s_loopTimerInterval, Qt::CoarseTimer);
m_lastTimerParent = parent;
}
QtForPythonEventHandler(QObject* parent = nullptr)
: QObject(parent)
{
qApp->installEventFilter(this);
SetupTimer(this);
}
float GetTime() const
{
return m_time;
}
void RunEventLoop()
{
if (m_loopCallback)
{
try
{
m_loopCallback();
}
catch (pybind11::error_already_set& pythonError)
{
// Release the exception stack and let Python print it
pythonError.restore();
PyErr_Print();
}
}
}
bool eventFilter(QObject* obj, QEvent* event)
{
// Determine which object should own our event loop timer
// By default it's this object
QObject* activeTimerParent = this;
// If it's a modal or popup widget, use that to ensure we get timer events
if (qApp->activePopupWidget())
{
activeTimerParent = qApp->activePopupWidget();
}
else if (qApp->activeModalWidget())
{
activeTimerParent = qApp->activeModalWidget();
}
SetupTimer(activeTimerParent);
if (obj == m_lastTimerParent && event->type() == QEvent::Timer && static_cast<QTimerEvent*>(event)->timerId() == m_lastTimerId)
{
m_time += s_loopTimerInterval / 1000.f;
if (m_time > s_maxTime)
{
m_time = 0.f;
}
RunEventLoop();
}
return false;
}
void SetLoopCallback(std::function<void()> callback)
{
m_loopCallback = callback;
}
void ClearLoopCallback()
{
m_loopCallback = {};
}
bool HasLoopCallback() const
{
return m_loopCallback.operator bool();
}
};
void QtForPythonSystemComponent::Reflect(AZ::ReflectContext* context)
{
if (auto* serialize = azrtti_cast<AZ::SerializeContext*>(context))
{
serialize->Class<QtForPythonSystemComponent, AZ::Component>()
->Version(0)
;
serialize->RegisterGenericType<QWidget>();
}
if (AZ::BehaviorContext* behavior = azrtti_cast<AZ::BehaviorContext*>(context))
{
behavior->EBus<QtForPythonRequestBus>("QtForPythonRequestBus")
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
->Attribute(AZ::Script::Attributes::Module, "qt")
->Event("IsActive", &QtForPythonRequestBus::Events::IsActive)
->Event("GetQtBootstrapParameters", &QtForPythonRequestBus::Events::GetQtBootstrapParameters)
;
behavior->Class<QtBootstrapParameters>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
->Attribute(AZ::Script::Attributes::Module, "qt")
->Property("qtBinaryFolder", BehaviorValueProperty(&QtBootstrapParameters::m_qtBinaryFolder))
->Property("qtPluginsFolder", BehaviorValueProperty(&QtBootstrapParameters::m_qtPluginsFolder))
->Property("mainWindowId", BehaviorValueProperty(&QtBootstrapParameters::m_mainWindowId))
->Property("pySidePackageFolder", BehaviorValueProperty(&QtBootstrapParameters::m_pySidePackageFolder))
;
}
}
void QtForPythonSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
provided.push_back(AZ_CRC_CE("QtForPythonService"));
}
void QtForPythonSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
{
incompatible.push_back(AZ_CRC_CE("QtForPythonService"));
}
void QtForPythonSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
{
required.push_back(EditorPythonBindings::PythonEmbeddedService);
}
void QtForPythonSystemComponent::Activate()
{
m_eventHandler = new QtForPythonEventHandler;
QtForPythonRequestBus::Handler::BusConnect();
EditorPythonBindings::EditorPythonBindingsNotificationBus::Handler::BusConnect();
}
void QtForPythonSystemComponent::Deactivate()
{
QtForPythonRequestBus::Handler::BusDisconnect();
EditorPythonBindings::EditorPythonBindingsNotificationBus::Handler::BusDisconnect();
delete m_eventHandler;
}
bool QtForPythonSystemComponent::IsActive() const
{
return AzToolsFramework::EditorPythonRunnerRequestBus::HasHandlers();
}
QtBootstrapParameters QtForPythonSystemComponent::GetQtBootstrapParameters() const
{
QtBootstrapParameters params;
char devroot[AZ_MAX_PATH_LEN];
AZ::IO::FileIOBase::GetInstance()->ResolvePath("@devroot@", devroot, AZ_MAX_PATH_LEN);
#if defined(Q_OS_WIN)
const char* platform = "windows";
#else
#error Unsupported OS platform for this QtForPython gem
#endif
#if defined(AZ_DEBUG_BUILD)
const char* build = "debug";
#else
const char* build = "release";
#endif
// prepare the platform and build specific PySide2 package folder
AZ::StringFunc::Path::Join(devroot, "Gems/QtForPython/3rdParty/pyside2", params.m_pySidePackageFolder);
AZ::StringFunc::Path::Join(params.m_pySidePackageFolder.c_str(), platform, params.m_pySidePackageFolder);
AZ::StringFunc::Path::Join(params.m_pySidePackageFolder.c_str(), build, params.m_pySidePackageFolder);
params.m_mainWindowId = 0;
using namespace AzToolsFramework;
QWidget* activeWindow = nullptr;
EditorWindowRequestBus::BroadcastResult(activeWindow, &EditorWindowRequests::GetAppMainWindow);
if (activeWindow)
{
// store the Qt main window so that scripts can hook into the main menu and/or docking framework
params.m_mainWindowId = aznumeric_cast<AZ::u64>(activeWindow->winId());
}
// prepare the folder where the build system placed the QT binary files
AZ::ComponentApplicationBus::BroadcastResult(params.m_qtBinaryFolder, &AZ::ComponentApplicationBus::Events::GetExecutableFolder);
// prepare the QT plugins folder
AZ::StringFunc::Path::Join(params.m_qtBinaryFolder.c_str(), "EditorPlugins", params.m_qtPluginsFolder);
return params;
}
void QtForPythonSystemComponent::OnImportModule(PyObject* module)
{
// Register azlmbr.qt_helpers for our event loop callback
pybind11::module parentModule = pybind11::cast<pybind11::module>(module);
std::string pythonModuleName = pybind11::cast<std::string>(parentModule.attr("__name__"));
if (AzFramework::StringFunc::Equal(pythonModuleName.c_str(), "azlmbr"))
{
pybind11::module helperModule = parentModule.def_submodule("qt_helpers");
helperModule.def("set_loop_callback", [this](std::function<void()> callback)
{
if (m_eventHandler)
{
m_eventHandler->SetLoopCallback(callback);
}
}, R"delim(
Sets a callback that will be invoked periodically during the course of Qt's event loop (even if a nested event loop is running).
This is intended for internal use in pyside_utils and should generally not be used directly.)delim");
helperModule.def("clear_loop_callback", [this]()
{
if (m_eventHandler)
{
m_eventHandler->ClearLoopCallback();
}
}, R"delim(
Clears callback that will be invoked periodically during the course of Qt's event loop.
This is intended for internal use in pyside_utils and should generally not be used directly.)delim");
helperModule.def("loop_is_running", [this]()
{
if (m_eventHandler)
{
return m_eventHandler->HasLoopCallback();
}
return false;
}, R"delim(
Returns True if the qt_helper event_loop callback is set and running.
This is intended for internal use in pyside_utils and should generally not be used directly.)delim");
helperModule.def("time", [this]()
{
if (m_eventHandler)
{
return m_eventHandler->GetTime();
}
return -1.f;
}, R"delim(
Returns a floating timestamp, measured in seconds, that updates with the Qt event loop.
This is intended for internal use in pyside_utils and should generally not be used directly.)delim");
}
}
}
@@ -0,0 +1,54 @@
/*
* 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/Component/Component.h>
#include <QtForPython/QtForPythonBus.h>
#include <EditorPythonBindings/EditorPythonBindingsBus.h>
namespace QtForPython
{
class QtForPythonEventHandler;
class QtForPythonSystemComponent
: public AZ::Component
, protected QtForPythonRequestBus::Handler
, protected EditorPythonBindings::EditorPythonBindingsNotificationBus::Handler
{
public:
AZ_COMPONENT(QtForPythonSystemComponent, "{0C939FBF-8BC9-4CB0-93B8-04140155AA8C}");
static void Reflect(AZ::ReflectContext* context);
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
protected:
////////////////////////////////////////////////////////////////////////
// QtForPythonRequestBus interface implementation
bool IsActive() const override;
QtBootstrapParameters GetQtBootstrapParameters() const override;
////////////////////////////////////////////////////////////////////////
// AZ::Component interface implementation
void Activate() override;
void Deactivate() override;
////////////////////////////////////////////////////////////////////////
// EditorPythonBindings::EditorPythonBindingsNotificationBus interface implementation
void OnImportModule(PyObject* module) override;
private:
QtForPythonEventHandler* m_eventHandler = nullptr;
};
}
@@ -0,0 +1,63 @@
"""
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.
"""
#
# This is a pytest module to test the basic integration of PySide2 (aka Qt for Python)
#
import pytest
import time
import logging
import os
import shutil
from test_tools import WINDOWS_LAUNCHER
import test_tools.shared.log_monitor
import test_tools.launchers.phase
import test_tools.builtin.fixtures as fixtures
# Use the built-in workspace and editor fixtures.
# These will configure the requested project and run the editor.
workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function')
editor = fixtures.use_fixture(fixtures.editor, scope='function')
logger = logging.getLogger(__name__)
@pytest.mark.parametrize("platform,configuration,project,spec", [
pytest.param("win_x64_vs2017", "profile", "AutomatedTesting", "all", marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")),
])
class TestEditorMenuBarAutomation(object):
def test_MenuBar(self, request, editor, project):
logger.debug("Running automated test")
request.addfinalizer(editor.ensure_stopped)
editor.deploy()
editor.launch(["--runpython", "@engroot@/Gems/QtForPython/Code/Tests/pyside_auto_menubar_test_case.py"])
editorlog_file = os.path.join(editor.workspace.release.paths.project_log(), 'Editor.log')
expected_lines = [
"QtForPython Is Ready",
"Value allWindows greater than zero",
"GetMainWindowId",
"Get QtWidgets.QMainWindow",
"Value menuBar is valid",
"Found File action",
"Found Edit action",
"Found Game action",
"Found Tools action"
]
test_tools.shared.log_monitor.monitor_for_expected_lines(editor, editorlog_file, expected_lines)
# Rely on the test script to quit after running
editor.run(test_tools.launchers.phase.WaitForLauncherToQuit(editor, 10))
@@ -0,0 +1,61 @@
"""
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.
"""
# Import the Editor API to test the PySide2 & Qt 5.12.x integration
import azlmbr.bus
import azlmbr.editor as editor
import azlmbr.legacy.general as general
def printOrExcept(expression, message):
if(expression):
print (message)
return
failed = 'FAILED - '.format(message)
print (failed)
general.exit_no_prompt()
raise Exception(failed)
printOrExcept(azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'IsActive'), 'QtForPython Is Ready')
# the PySide2 and shiboken2 libraries should import cleanly
try:
from shiboken2 import wrapInstance, getCppPointer
from PySide2 import QtWidgets
from PySide2 import QtGui
except:
printOrExcept(False, 'Importing PySide2 and Shiboken2')
allWindows = QtGui.QGuiApplication.allWindows()
printOrExcept(len(allWindows) > 0, 'Value allWindows greater than zero')
azMainWidgetId = azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'GetMainWindowId')
printOrExcept(azMainWidgetId is not 0, 'GetMainWindowId')
mainWidgetWindow = QtWidgets.QWidget.find(azMainWidgetId)
mainWindow = wrapInstance(int(getCppPointer(mainWidgetWindow)[0]), QtWidgets.QMainWindow)
printOrExcept(mainWindow is not None, 'Get QtWidgets.QMainWindow')
menuBar = mainWindow.menuBar()
printOrExcept(menuBar is not None, 'Value menuBar is valid')
for action in menuBar.actions():
if("File" in action.text()):
print('Found File action')
elif("Edit" in action.text()):
print('Found Edit action')
elif("Game" in action.text()):
print('Found Game action')
elif("Tools" in action.text()):
print('Found Tools action')
general.exit_no_prompt()
@@ -0,0 +1,16 @@
#
# 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.
#
set(FILES
Include/QtForPython/QtForPythonBus.h
Source/QtForPythonSystemComponent.cpp
Source/QtForPythonSystemComponent.h
)
@@ -0,0 +1,16 @@
#
# 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.
#
set(FILES
Include/QtForPython/QtForPythonBus.h
Source/QtForPythonSystemComponent.cpp
Source/QtForPythonSystemComponent.h
)
@@ -0,0 +1,14 @@
#
# 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.
#
set(FILES
Source/QtForPythonModule.cpp
)