Files
o3de/Code/Tools/Standalone/Source/LUA/LUAEditorFindResults.cpp
T
Esteban Papp 1f9b284de2 Merge branch 'development' into cmake/SPEC-7179
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
2021-07-16 15:42:37 -07:00

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);
}
}