1f9b284de2
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> # Conflicts: # Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h # Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h # Code/Editor/Plugins/EditorCommon/stdafx.cpp # Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h # Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h # Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h # Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h # Code/Tools/AssetProcessor/native/precompiled.h # Code/Tools/Standalone/StandaloneTools_precompiled.h # Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h # Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h # Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h # Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h # Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake # Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h # Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h # Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp # Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake # Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h # Gems/Blast/Code/Source/StdAfx.cpp # Gems/Camera/Code/Source/Camera_precompiled.h # Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h # Gems/FastNoise/Code/Source/FastNoise_precompiled.h # Gems/Gestures/Code/Source/Gestures_precompiled.h # Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h # Gems/GraphCanvas/Code/precompiled.h # Gems/ImGui/Code/Source/ImGui_precompiled.h # Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h # Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h # Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp # Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h # Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h # Gems/LyShine/Code/Source/LyShine_precompiled.h # Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h # Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h # Gems/Maestro/Code/Source/Maestro_precompiled.h # Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h # Gems/Metastream/Code/Source/Metastream_precompiled.h # Gems/Microphone/Code/Source/Microphone_precompiled.h # Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h # Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h # Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h # Gems/PhysX/Code/Source/PhysX_precompiled.h # Gems/PhysX/Code/physx_unsupported_files.cmake # Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h # Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h # Gems/ScriptCanvas/Code/Editor/precompiled.h # Gems/ScriptCanvas/Code/Source/precompiled.h # Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h # Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h # Gems/ScriptEvents/Code/Source/precompiled.h # Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp # Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h # Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h # Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h # Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h # Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h # Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h # Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h # Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h # Gems/Twitch/Code/Source/Twitch_precompiled.h # Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
202 lines
7.5 KiB
C++
202 lines
7.5 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#include "LUAEditorFindResults.hxx"
|
|
#include "LUAEditorStyleMessages.h"
|
|
#include "LUAEditorBlockState.h"
|
|
|
|
#include <Source/LUA/moc_LUAEditorFindResults.cpp>
|
|
|
|
#include <Source/LUA/ui_LUAEditorFindResults.h>
|
|
|
|
namespace LUAEditor
|
|
{
|
|
void FindResultsHighlighter::SetSearchString(const QString& searchString, bool regEx, bool wholeWord, bool caseSensitive)
|
|
{
|
|
m_searchString = searchString;
|
|
m_regEx = regEx;
|
|
m_wholeWord = wholeWord;
|
|
m_caseSensitive = caseSensitive;
|
|
}
|
|
|
|
void FindResultsHighlighter::highlightBlock(const QString& text)
|
|
{
|
|
auto colors = AZ::UserSettings::CreateFind<SyntaxStyleSettings>(AZ_CRC("LUA Editor Text Settings", 0xb6e15565), AZ::UserSettings::CT_GLOBAL);
|
|
|
|
auto block = currentBlock();
|
|
QTBlockState blockState;
|
|
blockState.m_qtBlockState = block.userState();
|
|
|
|
QTextCharFormat textFormat;
|
|
textFormat.setFont(m_font);
|
|
if (!blockState.m_blockState.m_uninitialized)
|
|
{
|
|
if (blockState.m_blockState.m_syntaxHighlighterState == 0)
|
|
{
|
|
textFormat.setForeground(colors->GetFindResultsHeaderColor());
|
|
setFormat(0, block.length(), textFormat);
|
|
}
|
|
else if (blockState.m_blockState.m_syntaxHighlighterState == 1)
|
|
{
|
|
textFormat.setForeground(colors->GetFindResultsFileColor());
|
|
setFormat(0, block.length(), textFormat);
|
|
}
|
|
else
|
|
{
|
|
textFormat.setForeground(colors->GetTextColor());
|
|
setFormat(0, block.length(), textFormat);
|
|
|
|
textFormat.setForeground(colors->GetFindResultsMatchColor());
|
|
QRegExp regex(m_searchString, m_caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
|
|
int index = 0;
|
|
if (m_regEx || m_wholeWord)
|
|
{
|
|
index = text.indexOf(regex, index);
|
|
}
|
|
else
|
|
{
|
|
index = text.indexOf(m_searchString, index, m_caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
|
|
}
|
|
while (index > 1)
|
|
{
|
|
if (m_regEx || m_wholeWord)
|
|
{
|
|
setFormat(index, regex.matchedLength(), textFormat);
|
|
}
|
|
else
|
|
{
|
|
setFormat(index, m_searchString.length(), textFormat);
|
|
}
|
|
|
|
++index;
|
|
if (m_regEx || m_wholeWord)
|
|
{
|
|
index = text.indexOf(regex, index);
|
|
}
|
|
else
|
|
{
|
|
index = text.indexOf(m_searchString, index, m_caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
FindResults::FindResults(QWidget* parent)
|
|
: QWidget(parent)
|
|
{
|
|
m_gui = azcreate(Ui::LUAEditorFindResults, ());
|
|
m_gui->setupUi(this);
|
|
|
|
m_gui->m_foldingWidget->setEnabled(true);
|
|
m_gui->m_foldingWidget->SetTextEdit(m_gui->m_resultsList);
|
|
connect(m_gui->m_resultsList, &AzToolsFramework::PlainTextEdit::BlockDoubleClicked, this, &FindResults::OnBlockDoubleClicked);
|
|
connect(m_gui->m_resultsList, &AzToolsFramework::PlainTextEdit::cursorPositionChanged, this, [&]() { m_gui->m_foldingWidget->update(); });
|
|
connect(m_gui->m_resultsList, &AzToolsFramework::PlainTextEdit::Scrolled, this, [&]() { m_gui->m_foldingWidget->update(); });
|
|
connect(m_gui->m_foldingWidget, &FoldingWidget::TextBlockFoldingChanged, this, [&]() {m_gui->m_resultsList->update(); });
|
|
connect(m_gui->m_resultsList->document(), &QTextDocument::contentsChange, m_gui->m_foldingWidget, &FoldingWidget::OnContentChanged);
|
|
|
|
auto settings = AZ::UserSettings::CreateFind<SyntaxStyleSettings>(AZ_CRC("LUA Editor Text Settings", 0xb6e15565), AZ::UserSettings::CT_GLOBAL);
|
|
m_gui->m_resultsList->setFont(settings->GetFont());
|
|
m_gui->m_foldingWidget->SetFont(settings->GetFont());
|
|
|
|
QString styleSheet = QString(R"(
|
|
QPlainTextEdit[readOnly="true"]:focus
|
|
{
|
|
background-color: %1;
|
|
selection-color: %3;
|
|
selection-background-color: %4;
|
|
}
|
|
|
|
QPlainTextEdit[readOnly="true"]:!focus
|
|
{
|
|
background-color: %2;
|
|
selection-color: %3;
|
|
selection-background-color: %4;
|
|
}
|
|
)");
|
|
styleSheet = styleSheet.arg(settings->GetTextReadOnlyFocusedBackgroundColor().name())
|
|
.arg(settings->GetTextReadOnlyUnfocusedBackgroundColor().name())
|
|
.arg(settings->GetTextSelectedColor().name())
|
|
.arg(settings->GetTextSelectedBackgroundColor().name());
|
|
|
|
m_gui->m_resultsList->setStyleSheet(styleSheet);
|
|
m_resultLineHighlightColor = settings->GetFindResultsLineHighlightColor();
|
|
|
|
m_highlighter = aznew FindResultsHighlighter(m_gui->m_resultsList->document());
|
|
}
|
|
|
|
FindResults::~FindResults()
|
|
{
|
|
delete m_highlighter;
|
|
azdestroy(m_gui);
|
|
}
|
|
|
|
void FindResults::OnBlockDoubleClicked(QMouseEvent* event, const QTextBlock& block)
|
|
{
|
|
if (block.isValid())
|
|
{
|
|
auto userData = block.userData();
|
|
if (userData)
|
|
{
|
|
auto blockInfo = static_cast<FindResultsBlockInfo*>(userData);
|
|
|
|
// highlight the line
|
|
QTextEdit::ExtraSelection selection;
|
|
selection.format.setBackground(m_resultLineHighlightColor);
|
|
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
|
|
selection.cursor = m_gui->m_resultsList->textCursor();
|
|
selection.cursor.clearSelection();
|
|
QList<QTextEdit::ExtraSelection> extraSelections;
|
|
extraSelections.append(selection);
|
|
m_gui->m_resultsList->setExtraSelections(extraSelections);
|
|
|
|
emit ResultSelected(*blockInfo);
|
|
event->accept();
|
|
}
|
|
}
|
|
}
|
|
|
|
void FindResults::AssignAssetId(const AZStd::string& assetName, const AZStd::string& assetId)
|
|
{
|
|
for (auto block = m_gui->m_resultsList->document()->begin(); block != m_gui->m_resultsList->document()->end(); block = block.next())
|
|
{
|
|
auto userData = block.userData();
|
|
if (userData)
|
|
{
|
|
auto blockInfo = static_cast<FindResultsBlockInfo*>(userData);
|
|
if (blockInfo->m_assetName == assetName)
|
|
{
|
|
blockInfo->m_assetId = assetId;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void FindResults::FinishedAddingText(const QString& searchString, bool regEx, bool wholeWord, bool caseSensitive)
|
|
{
|
|
m_highlighter->SetSearchString(searchString, regEx, wholeWord, caseSensitive);
|
|
m_highlighter->rehighlight();
|
|
}
|
|
|
|
void FindResults::Clear()
|
|
{
|
|
m_gui->m_resultsList->clear();
|
|
}
|
|
|
|
QTextDocument* FindResults::Document()
|
|
{
|
|
return m_gui->m_resultsList->document();
|
|
}
|
|
|
|
void FindResults::AppendPlainText(const QString& text)
|
|
{
|
|
m_gui->m_resultsList->appendPlainText(text);
|
|
}
|
|
}
|