mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ccc8b38b77 | ||
|
|
c6d1c8063b | ||
|
|
0ffb6d6362 | ||
|
|
252aaa500e | ||
|
|
d456908e37 | ||
|
|
cd13bfb429 | ||
|
|
ff87bc5889 | ||
|
|
42cd80c172 | ||
|
|
123cd3a092 | ||
|
|
cbc3c4e6eb | ||
|
|
b50e39e5cb | ||
|
|
bbe5ef451a | ||
|
|
c359c0e747 | ||
|
|
99ecb0b60f | ||
|
|
cfc7e45020 | ||
|
|
0307d064ad | ||
|
|
89cd824c70 | ||
|
|
1066e8a5e9 | ||
|
|
d2c31df106 | ||
|
|
a56ffee8f7 | ||
|
|
7c798126e3 |
@@ -2264,9 +2264,9 @@ SCAJ-20167:
|
||||
preloadFrameData: 1 # Fixes some missing effects.
|
||||
SCAJ-20168:
|
||||
name: "Rule of Rose"
|
||||
region: "NTSC-Unk"
|
||||
gsHWFixes:
|
||||
preloadFrameData: 1 # Fixes Black FMV's.
|
||||
region: "NTSC-C"
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes black FMVs in hardware and hash cache disabling itself.
|
||||
SCAJ-20169:
|
||||
name: "Dirge of Cerberus - Final Fantasy VII"
|
||||
region: "NTSC-Unk"
|
||||
@@ -8896,8 +8896,8 @@ SCPS-15093:
|
||||
name-en: "Rule of Rose"
|
||||
region: "NTSC-J"
|
||||
compat: 5
|
||||
gsHWFixes:
|
||||
preloadFrameData: 1 # Fixes Black FMV's.
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes black FMVs in hardware and hash cache disabling itself.
|
||||
SCPS-15094:
|
||||
name: "アイトーイ プレイ2 [ソフト単体]"
|
||||
name-sort: "あいとーい ぷれい2 [そふとたんたい]"
|
||||
@@ -17537,6 +17537,8 @@ SLES-51619:
|
||||
name: "Clock Tower 3"
|
||||
region: "PAL-M5"
|
||||
compat: 5
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
|
||||
SLES-51620:
|
||||
name: "Black and Bruised"
|
||||
region: "PAL-M5"
|
||||
@@ -24958,8 +24960,8 @@ SLES-54217:
|
||||
SLES-54218:
|
||||
name: "Rule of Rose"
|
||||
region: "PAL-M5"
|
||||
gsHWFixes:
|
||||
preloadFrameData: 1 # Fixes Black FMV's.
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes black FMVs in hardware and hash cache disabling itself.
|
||||
SLES-54221:
|
||||
name: "LEGO Star Wars II - The Original Trilogy"
|
||||
region: "PAL-M6"
|
||||
@@ -30036,6 +30038,8 @@ SLKA-25051:
|
||||
name: "Clock Tower 3"
|
||||
region: "NTSC-K"
|
||||
compat: 5
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
|
||||
SLKA-25052:
|
||||
name: "Air Ranger 2 - Rescue Helicopter"
|
||||
region: "NTSC-K"
|
||||
@@ -40428,6 +40432,8 @@ SLPM-65221:
|
||||
name-en: "Clock Tower 3"
|
||||
region: "NTSC-J"
|
||||
compat: 5
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
|
||||
SLPM-65222:
|
||||
name: "遊戯王真デュエルモンスターズⅡ 継承されし記憶 [コナミ殿堂セレクション]"
|
||||
name-sort: "ゆうぎおうしんでゅえるもんすたーず2 けいしょうされしきおく [こなみでんどうせれくしょん]"
|
||||
@@ -52313,6 +52319,8 @@ SLPM-74416:
|
||||
name-sort: "くろっくたわー3 [PlayStation2 the Best]"
|
||||
name-en: "Clock Tower 3 [PlayStation2 the Best]"
|
||||
region: "NTSC-J"
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
|
||||
SLPM-74420:
|
||||
name: "頭文字D Special Stage [PlayStation2 the Best]"
|
||||
name-sort: "いにしゃるD すぺしゃる すてーじ [PlayStation2 the Best]"
|
||||
@@ -64595,6 +64603,8 @@ SLUS-20633:
|
||||
name: "Clock Tower 3"
|
||||
region: "NTSC-U"
|
||||
compat: 5
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
|
||||
SLUS-20634:
|
||||
name: "Summer Heat Beach Volleyball"
|
||||
region: "NTSC-U"
|
||||
@@ -69585,8 +69595,8 @@ SLUS-21448:
|
||||
name: "Rule of Rose"
|
||||
region: "NTSC-U"
|
||||
compat: 5
|
||||
gsHWFixes:
|
||||
preloadFrameData: 1 # Fixes Black FMV's.
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes black FMVs in hardware and hash cache disabling itself.
|
||||
SLUS-21449:
|
||||
name: "The Fast and the Furious"
|
||||
name-sort: "Fast and the Furious, The"
|
||||
@@ -72357,8 +72367,8 @@ SLUS-28062:
|
||||
SLUS-28063:
|
||||
name: "Rule of Rose [Trade Demo]"
|
||||
region: "NTSC-U"
|
||||
gsHWFixes:
|
||||
preloadFrameData: 1 # Fixes Black FMV's.
|
||||
gameFixes:
|
||||
- SoftwareRendererFMVHack # Fixes black FMVs in hardware and hash cache disabling itself.
|
||||
SLUS-28064:
|
||||
name: "Shin Megami Tensei - Devil Summoner [Trade Demo]"
|
||||
region: "NTSC-U"
|
||||
|
||||
@@ -1590,6 +1590,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
||||
030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
||||
030000009b2800008000000020020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,
|
||||
030000009b2800008000000001010000,Raphnet Wii Classic Adapter V3,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,
|
||||
03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
|
||||
@@ -852,6 +852,8 @@ void ps_color_clamp_wrap(inout float3 C)
|
||||
else if (PS_COLCLIP == 1 || PS_HDR == 1)
|
||||
C = (float3)((int3)C & (int3)0xFF);
|
||||
}
|
||||
else if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0)
|
||||
C = (float3)((int3)C & (int3)0xF8);
|
||||
}
|
||||
|
||||
void ps_blend(inout float4 Color, inout float4 As_rgba, float2 pos_xy)
|
||||
|
||||
@@ -775,6 +775,8 @@ void ps_color_clamp_wrap(inout vec3 C)
|
||||
C = vec3(ivec3(C) & ivec3(0xFF));
|
||||
#endif
|
||||
|
||||
#elif PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0
|
||||
C = vec3(ivec3(C) & ivec3(0xF8));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1045,6 +1045,8 @@ void ps_color_clamp_wrap(inout vec3 C)
|
||||
C = vec3(ivec3(C) & ivec3(0xFF));
|
||||
#endif
|
||||
|
||||
#elif PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0
|
||||
C = vec3(ivec3(C) & ivec3(0xF8));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -59,23 +59,37 @@
|
||||
<Delete Files="@(ResFiles->'$(QtToolOutDir)qrc_%(Filename).cpp')" />
|
||||
</Target>
|
||||
|
||||
<!--Passes all .ui files to uic and puts output in the build directory-->
|
||||
<ItemGroup>
|
||||
<UiFiles Include="$(MSBuildProjectDirectory)\**\*.ui" />
|
||||
</ItemGroup>
|
||||
<!--Passes .ui files to uic and puts output in the build directory-->
|
||||
<!--We need to create tlogs so that VS knows the ui files are used-->
|
||||
<!--See https://learn.microsoft.com/en-us/visualstudio/extensibility/visual-cpp-project-extensibility?view=vs-2022#tlog-files-->
|
||||
<Target Name="QtUi"
|
||||
BeforeTargets="ClCompile"
|
||||
Inputs="@(UiFiles)"
|
||||
Condition="'@(QtUi)'!=''"
|
||||
Outputs="@(UiFiles->'$(QtToolOutDir)ui_%(Filename).h')">
|
||||
<Message Text="uic %(UiFiles.Filename)" Importance="High" />
|
||||
Condition="'@(QtUi)'!=''">
|
||||
<Error Condition="!$(QtDirValid)" Text="Qt directory non-existent (download/extract the zip)" />
|
||||
<MakeDir Directories="$(QtToolOutDir)" />
|
||||
<Exec Command=""$(QtHostBinDir)uic.exe" "%(UiFiles.FullPath)" -o "$(QtToolOutDir)ui_%(UiFiles.Filename).h"" />
|
||||
</Target>
|
||||
<!--Setup metadata for following tasks-->
|
||||
<ItemGroup>
|
||||
<QtUi>
|
||||
<Message>uic %(Filename)</Message>
|
||||
<Command>
|
||||
"$(QtHostBinDir)uic.exe" "%(FullPath)" -o "$(QtToolOutDir)ui_%(Filename).h"
|
||||
</Command>
|
||||
<Outputs>$(QtToolOutDir)ui_%(Filename).h</Outputs>
|
||||
</QtUi>
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="QtUiClean">
|
||||
<Delete Files="@(UiFiles->'$(QtToolOutDir)ui_%(Filename).h')" />
|
||||
<!--Helper for dealing with tlogs-->
|
||||
<!--https://learn.microsoft.com/en-us/visualstudio/msbuild/getoutofdateitems-task?view=vs-2022-->
|
||||
<GetOutOfDateItems Sources="@(QtUi)"
|
||||
OutputsMetadataName="Outputs"
|
||||
CommandMetadataName="Command"
|
||||
TLogDirectory="$(TLogLocation)"
|
||||
TLogNamePrefix="QtUi">
|
||||
<Output TaskParameter="OutOfDateSources" ItemName="OutOfDateQtUi"/>
|
||||
</GetOutOfDateItems>
|
||||
|
||||
<CustomBuild Condition="'@(OutOfDateQtUi)'!=''"
|
||||
Sources="@(OutOfDateQtUi)" />
|
||||
</Target>
|
||||
|
||||
<!--Compile files needed to MOC and output in the build directory-->
|
||||
@@ -88,7 +102,7 @@
|
||||
<Target Name="QtMoc"
|
||||
BeforeTargets="ClCompile"
|
||||
Condition="'@(QtMoc)'!=''"
|
||||
Inputs="%(QtMoc.Identity);%(QtMoc.AdditionalDependencies);$(MSBuildProjectFile)"
|
||||
Inputs="%(QtMoc.Identity);$(QtHostBinDir)moc.exe"
|
||||
Outputs="$(QtToolOutDir)%(QtMoc.RelativeDir)moc_%(QtMoc.Filename).cpp">
|
||||
<Message Text="moc %(QtMoc.Filename) $(QtToolOutDir)%(QtMoc.RelativeDir)moc_%(QtMoc.Filename).cpp" Importance="High" />
|
||||
<Error Condition="!$(QtDirValid)" Text="Qt directory non-existent (download/extract the zip)" />
|
||||
@@ -97,7 +111,7 @@
|
||||
</Target>
|
||||
|
||||
<ItemGroup>
|
||||
<MocOutputs Include="$(QtToolOutDir)moc_*.cpp" />
|
||||
<MocOutputs Include="$(QtToolOutDir)**/moc_*.cpp" />
|
||||
</ItemGroup>
|
||||
<Target Name="QtMocClean">
|
||||
<Delete Files="@(MocOutputs)" />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<CleanDependsOn>QtResourceClean;QtUiClean;QtMocClean;QtTsClean;$(CleanDependsOn)</CleanDependsOn>
|
||||
<CleanDependsOn>QtResourceClean;QtMocClean;QtTsClean;$(CleanDependsOn)</CleanDependsOn>
|
||||
<!--
|
||||
<ComputeLinkInputsTargets>$(ComputeLinkInputsTargets);QtComputeMocOutput;</ComputeLinkInputsTargets>
|
||||
<ComputeLibInputsTargets>$(ComputeLibInputsTargets);QtComputeMocOutput;</ComputeLibInputsTargets>
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
<ItemType Name="QtUi" DisplayName="Qt User Interface File" />
|
||||
<ItemType Name="QtMoc" DisplayName="Qt Meta Object File" />
|
||||
<ItemType Name="QtTs" DisplayName="Qt Translation File" />
|
||||
<ContentType Name="QtUi" DisplayName="Qt User Interface Compiler" />
|
||||
<ContentType Name="QtResource" DisplayName="Qt Resource Compiler" />
|
||||
<ContentType Name="QtMoc" DisplayName="Qt Meta Object Compiler" />
|
||||
<ContentType Name="QtTs" DisplayName="Qt Translation Compiler" />
|
||||
<ContentType Name="QtResource" DisplayName="Qt Resource Compiler" ItemType="QtResource" />
|
||||
<ContentType Name="QtUi" DisplayName="Qt User Interface Compiler" ItemType = "QtUi"/>
|
||||
<ContentType Name="QtMoc" DisplayName="Qt Meta Object Compiler" ItemType="QtMoc" />
|
||||
<ContentType Name="QtTs" DisplayName="Qt Translation Compiler" ItemType="QtTs" />
|
||||
<FileExtension Name="*.qrc" ContentType="QtResource" />
|
||||
<FileExtension Name="*.ui" ContentType="QtUi" />
|
||||
<FileExtension Name="*.ts" ContentType="QtTs" />
|
||||
|
||||
@@ -164,34 +164,34 @@ target_sources(pcsx2-qt PRIVATE
|
||||
Debugger/DebuggerSettingsManager.cpp
|
||||
Debugger/DebuggerSettingsManager.h
|
||||
Debugger/DebuggerEvents.h
|
||||
Debugger/DebuggerWidget.cpp
|
||||
Debugger/DebuggerWidget.h
|
||||
Debugger/DebuggerView.cpp
|
||||
Debugger/DebuggerView.h
|
||||
Debugger/DebuggerWindow.cpp
|
||||
Debugger/DebuggerWindow.h
|
||||
Debugger/DebuggerWindow.ui
|
||||
Debugger/DisassemblyWidget.cpp
|
||||
Debugger/DisassemblyWidget.h
|
||||
Debugger/DisassemblyWidget.ui
|
||||
Debugger/DisassemblyView.cpp
|
||||
Debugger/DisassemblyView.h
|
||||
Debugger/DisassemblyView.ui
|
||||
Debugger/JsonValueWrapper.h
|
||||
Debugger/RegisterWidget.cpp
|
||||
Debugger/RegisterWidget.h
|
||||
Debugger/RegisterWidget.ui
|
||||
Debugger/RegisterView.cpp
|
||||
Debugger/RegisterView.h
|
||||
Debugger/RegisterView.ui
|
||||
Debugger/StackModel.cpp
|
||||
Debugger/StackModel.h
|
||||
Debugger/StackWidget.cpp
|
||||
Debugger/StackWidget.h
|
||||
Debugger/StackView.cpp
|
||||
Debugger/StackView.h
|
||||
Debugger/ThreadModel.cpp
|
||||
Debugger/ThreadModel.h
|
||||
Debugger/ThreadWidget.cpp
|
||||
Debugger/ThreadWidget.h
|
||||
Debugger/ThreadView.cpp
|
||||
Debugger/ThreadView.h
|
||||
Debugger/Breakpoints/BreakpointDialog.cpp
|
||||
Debugger/Breakpoints/BreakpointDialog.h
|
||||
Debugger/Breakpoints/BreakpointDialog.ui
|
||||
Debugger/Breakpoints/BreakpointModel.cpp
|
||||
Debugger/Breakpoints/BreakpointModel.h
|
||||
Debugger/Breakpoints/BreakpointWidget.cpp
|
||||
Debugger/Breakpoints/BreakpointWidget.h
|
||||
Debugger/Breakpoints/BreakpointWidget.ui
|
||||
Debugger/Breakpoints/BreakpointView.cpp
|
||||
Debugger/Breakpoints/BreakpointView.h
|
||||
Debugger/Breakpoints/BreakpointView.ui
|
||||
Debugger/Docking/DockLayout.cpp
|
||||
Debugger/Docking/DockLayout.h
|
||||
Debugger/Docking/DockManager.cpp
|
||||
@@ -212,17 +212,17 @@ target_sources(pcsx2-qt PRIVATE
|
||||
Debugger/Docking/NoLayoutsWidget.cpp
|
||||
Debugger/Docking/NoLayoutsWidget.h
|
||||
Debugger/Docking/NoLayoutsWidget.ui
|
||||
Debugger/Memory/MemorySearchWidget.cpp
|
||||
Debugger/Memory/MemorySearchWidget.h
|
||||
Debugger/Memory/MemorySearchWidget.ui
|
||||
Debugger/Memory/MemoryViewWidget.cpp
|
||||
Debugger/Memory/MemoryViewWidget.h
|
||||
Debugger/Memory/MemoryViewWidget.ui
|
||||
Debugger/Memory/MemorySearchView.cpp
|
||||
Debugger/Memory/MemorySearchView.h
|
||||
Debugger/Memory/MemorySearchView.ui
|
||||
Debugger/Memory/MemoryView.cpp
|
||||
Debugger/Memory/MemoryView.h
|
||||
Debugger/Memory/MemoryView.ui
|
||||
Debugger/Memory/SavedAddressesModel.cpp
|
||||
Debugger/Memory/SavedAddressesModel.h
|
||||
Debugger/Memory/SavedAddressesWidget.cpp
|
||||
Debugger/Memory/SavedAddressesWidget.h
|
||||
Debugger/Memory/SavedAddressesWidget.ui
|
||||
Debugger/Memory/SavedAddressesView.cpp
|
||||
Debugger/Memory/SavedAddressesView.h
|
||||
Debugger/Memory/SavedAddressesView.ui
|
||||
Debugger/SymbolTree/NewSymbolDialogs.cpp
|
||||
Debugger/SymbolTree/NewSymbolDialogs.h
|
||||
Debugger/SymbolTree/NewSymbolDialog.ui
|
||||
@@ -234,9 +234,9 @@ target_sources(pcsx2-qt PRIVATE
|
||||
Debugger/SymbolTree/SymbolTreeNode.h
|
||||
Debugger/SymbolTree/SymbolTreeDelegates.cpp
|
||||
Debugger/SymbolTree/SymbolTreeDelegates.h
|
||||
Debugger/SymbolTree/SymbolTreeWidgets.cpp
|
||||
Debugger/SymbolTree/SymbolTreeWidgets.h
|
||||
Debugger/SymbolTree/SymbolTreeWidget.ui
|
||||
Debugger/SymbolTree/SymbolTreeViews.cpp
|
||||
Debugger/SymbolTree/SymbolTreeViews.h
|
||||
Debugger/SymbolTree/SymbolTreeView.ui
|
||||
Debugger/SymbolTree/TypeString.cpp
|
||||
Debugger/SymbolTree/TypeString.h
|
||||
Tools/InputRecording/NewInputRecordingDlg.cpp
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "BreakpointWidget.h"
|
||||
#include "BreakpointView.h"
|
||||
|
||||
#include "QtUtils.h"
|
||||
#include "Debugger/DebuggerSettingsManager.h"
|
||||
@@ -10,15 +10,15 @@
|
||||
|
||||
#include <QtGui/QClipboard>
|
||||
|
||||
BreakpointWidget::BreakpointWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, DISALLOW_MULTIPLE_INSTANCES)
|
||||
BreakpointView::BreakpointView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, DISALLOW_MULTIPLE_INSTANCES)
|
||||
, m_model(BreakpointModel::getInstance(cpu()))
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
|
||||
m_ui.breakpointList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.breakpointList, &QTableView::customContextMenuRequested, this, &BreakpointWidget::openContextMenu);
|
||||
connect(m_ui.breakpointList, &QTableView::doubleClicked, this, &BreakpointWidget::onDoubleClicked);
|
||||
connect(m_ui.breakpointList, &QTableView::customContextMenuRequested, this, &BreakpointView::openContextMenu);
|
||||
connect(m_ui.breakpointList, &QTableView::doubleClicked, this, &BreakpointView::onDoubleClicked);
|
||||
|
||||
m_ui.breakpointList->setModel(m_model);
|
||||
for (std::size_t i = 0; auto mode : BreakpointModel::HeaderResizeModes)
|
||||
@@ -28,13 +28,13 @@ BreakpointWidget::BreakpointWidget(const DebuggerWidgetParameters& parameters)
|
||||
}
|
||||
}
|
||||
|
||||
void BreakpointWidget::onDoubleClicked(const QModelIndex& index)
|
||||
void BreakpointView::onDoubleClicked(const QModelIndex& index)
|
||||
{
|
||||
if (index.isValid() && index.column() == BreakpointModel::OFFSET)
|
||||
goToInDisassembler(m_model->data(index, BreakpointModel::DataRole).toUInt(), true);
|
||||
}
|
||||
|
||||
void BreakpointWidget::openContextMenu(QPoint pos)
|
||||
void BreakpointView::openContextMenu(QPoint pos)
|
||||
{
|
||||
QMenu* menu = new QMenu(m_ui.breakpointList);
|
||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -42,23 +42,23 @@ void BreakpointWidget::openContextMenu(QPoint pos)
|
||||
if (cpu().isAlive())
|
||||
{
|
||||
QAction* newAction = menu->addAction(tr("New"));
|
||||
connect(newAction, &QAction::triggered, this, &BreakpointWidget::contextNew);
|
||||
connect(newAction, &QAction::triggered, this, &BreakpointView::contextNew);
|
||||
|
||||
const QItemSelectionModel* selModel = m_ui.breakpointList->selectionModel();
|
||||
|
||||
if (selModel->hasSelection())
|
||||
{
|
||||
QAction* editAction = menu->addAction(tr("Edit"));
|
||||
connect(editAction, &QAction::triggered, this, &BreakpointWidget::contextEdit);
|
||||
connect(editAction, &QAction::triggered, this, &BreakpointView::contextEdit);
|
||||
|
||||
if (selModel->selectedIndexes().count() == 1)
|
||||
{
|
||||
QAction* copyAction = menu->addAction(tr("Copy"));
|
||||
connect(copyAction, &QAction::triggered, this, &BreakpointWidget::contextCopy);
|
||||
connect(copyAction, &QAction::triggered, this, &BreakpointView::contextCopy);
|
||||
}
|
||||
|
||||
QAction* deleteAction = menu->addAction(tr("Delete"));
|
||||
connect(deleteAction, &QAction::triggered, this, &BreakpointWidget::contextDelete);
|
||||
connect(deleteAction, &QAction::triggered, this, &BreakpointView::contextDelete);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ void BreakpointWidget::openContextMenu(QPoint pos)
|
||||
if (cpu().isAlive())
|
||||
{
|
||||
QAction* actionImport = menu->addAction(tr("Paste from CSV"));
|
||||
connect(actionImport, &QAction::triggered, this, &BreakpointWidget::contextPasteCSV);
|
||||
connect(actionImport, &QAction::triggered, this, &BreakpointView::contextPasteCSV);
|
||||
|
||||
if (cpu().getCpuType() == BREAKPOINT_EE)
|
||||
{
|
||||
@@ -87,14 +87,14 @@ void BreakpointWidget::openContextMenu(QPoint pos)
|
||||
});
|
||||
|
||||
QAction* actionSave = menu->addAction(tr("Save to Settings"));
|
||||
connect(actionSave, &QAction::triggered, this, &BreakpointWidget::saveBreakpointsToDebuggerSettings);
|
||||
connect(actionSave, &QAction::triggered, this, &BreakpointView::saveBreakpointsToDebuggerSettings);
|
||||
}
|
||||
}
|
||||
|
||||
menu->popup(m_ui.breakpointList->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void BreakpointWidget::contextCopy()
|
||||
void BreakpointView::contextCopy()
|
||||
{
|
||||
const QItemSelectionModel* selModel = m_ui.breakpointList->selectionModel();
|
||||
|
||||
@@ -104,7 +104,7 @@ void BreakpointWidget::contextCopy()
|
||||
QGuiApplication::clipboard()->setText(m_model->data(selModel->currentIndex()).toString());
|
||||
}
|
||||
|
||||
void BreakpointWidget::contextDelete()
|
||||
void BreakpointView::contextDelete()
|
||||
{
|
||||
const QItemSelectionModel* selModel = m_ui.breakpointList->selectionModel();
|
||||
|
||||
@@ -121,14 +121,14 @@ void BreakpointWidget::contextDelete()
|
||||
m_model->removeRows(*row, 1);
|
||||
}
|
||||
|
||||
void BreakpointWidget::contextNew()
|
||||
void BreakpointView::contextNew()
|
||||
{
|
||||
BreakpointDialog* bpDialog = new BreakpointDialog(this, &cpu(), *m_model);
|
||||
bpDialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
bpDialog->show();
|
||||
}
|
||||
|
||||
void BreakpointWidget::contextEdit()
|
||||
void BreakpointView::contextEdit()
|
||||
{
|
||||
const QItemSelectionModel* selModel = m_ui.breakpointList->selectionModel();
|
||||
|
||||
@@ -144,7 +144,7 @@ void BreakpointWidget::contextEdit()
|
||||
bpDialog->show();
|
||||
}
|
||||
|
||||
void BreakpointWidget::contextPasteCSV()
|
||||
void BreakpointView::contextPasteCSV()
|
||||
{
|
||||
QString csv = QGuiApplication::clipboard()->text();
|
||||
// Skip header
|
||||
@@ -168,7 +168,7 @@ void BreakpointWidget::contextPasteCSV()
|
||||
}
|
||||
}
|
||||
|
||||
void BreakpointWidget::saveBreakpointsToDebuggerSettings()
|
||||
void BreakpointView::saveBreakpointsToDebuggerSettings()
|
||||
{
|
||||
DebuggerSettingsManager::saveGameSettings(m_model);
|
||||
}
|
||||
@@ -3,11 +3,11 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_BreakpointWidget.h"
|
||||
#include "ui_BreakpointView.h"
|
||||
|
||||
#include "BreakpointModel.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
#include "DebugTools/DisassemblyManager.h"
|
||||
@@ -16,12 +16,12 @@
|
||||
#include <QtWidgets/QTabBar>
|
||||
#include <QtGui/QPainter>
|
||||
|
||||
class BreakpointWidget : public DebuggerWidget
|
||||
class BreakpointView : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BreakpointWidget(const DebuggerWidgetParameters& parameters);
|
||||
BreakpointView(const DebuggerViewParameters& parameters);
|
||||
|
||||
void onDoubleClicked(const QModelIndex& index);
|
||||
void openContextMenu(QPoint pos);
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
void saveBreakpointsToDebuggerSettings();
|
||||
|
||||
private:
|
||||
Ui::BreakpointWidget m_ui;
|
||||
Ui::BreakpointView m_ui;
|
||||
|
||||
BreakpointModel* m_model;
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BreakpointWidget</class>
|
||||
<widget class="QWidget" name="BreakpointWidget">
|
||||
<class>BreakpointView</class>
|
||||
<widget class="QWidget" name="BreakpointView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -14,8 +14,8 @@ namespace DebuggerEvents
|
||||
virtual ~Event() = default;
|
||||
};
|
||||
|
||||
// Sent when a debugger widget is first created, and subsequently broadcast
|
||||
// to all debugger widgets at regular intervals.
|
||||
// Sent when a debugger view is first created, and subsequently broadcast to
|
||||
// all debugger views at regular intervals.
|
||||
struct Refresh : Event
|
||||
{
|
||||
};
|
||||
@@ -41,7 +41,7 @@ namespace DebuggerEvents
|
||||
static constexpr const char* ACTION_PREFIX = QT_TRANSLATE_NOOP("DebuggerEvents", "Go to in");
|
||||
};
|
||||
|
||||
// The state of the VM has changed and widgets should be updated to reflect
|
||||
// The state of the VM has changed and views should be updated to reflect
|
||||
// the new state (e.g. the VM has been paused).
|
||||
struct VMUpdate : Event
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "DebuggerWidget.h"
|
||||
#include "DebuggerView.h"
|
||||
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
@@ -12,8 +12,9 @@
|
||||
|
||||
#include "common/Assertions.h"
|
||||
|
||||
DebuggerWidget::DebuggerWidget(const DebuggerWidgetParameters& parameters, u32 flags)
|
||||
DebuggerView::DebuggerView(const DebuggerViewParameters& parameters, u32 flags)
|
||||
: QWidget(parameters.parent)
|
||||
, m_id(parameters.id)
|
||||
, m_unique_name(parameters.unique_name)
|
||||
, m_cpu(parameters.cpu)
|
||||
, m_cpu_override(parameters.cpu_override)
|
||||
@@ -22,25 +23,30 @@ DebuggerWidget::DebuggerWidget(const DebuggerWidgetParameters& parameters, u32 f
|
||||
updateStyleSheet();
|
||||
}
|
||||
|
||||
DebugInterface& DebuggerWidget::cpu() const
|
||||
DebugInterface& DebuggerView::cpu() const
|
||||
{
|
||||
if (m_cpu_override.has_value())
|
||||
return DebugInterface::get(*m_cpu_override);
|
||||
|
||||
pxAssertRel(m_cpu, "DebuggerWidget::cpu called on object with null cpu.");
|
||||
pxAssertRel(m_cpu, "DebuggerView::cpu called on object with null cpu.");
|
||||
return *m_cpu;
|
||||
}
|
||||
|
||||
QString DebuggerWidget::uniqueName() const
|
||||
QString DebuggerView::uniqueName() const
|
||||
{
|
||||
return m_unique_name;
|
||||
}
|
||||
|
||||
QString DebuggerWidget::displayName() const
|
||||
u64 DebuggerView::id() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
QString DebuggerView::displayName() const
|
||||
{
|
||||
QString name = displayNameWithoutSuffix();
|
||||
|
||||
// If there are multiple debugger widgets of the same name, append a number
|
||||
// If there are multiple debugger views with the same name, append a number
|
||||
// to the display name.
|
||||
if (m_display_name_suffix_number.has_value())
|
||||
name = tr("%1 #%2").arg(name).arg(*m_display_name_suffix_number);
|
||||
@@ -51,17 +57,17 @@ QString DebuggerWidget::displayName() const
|
||||
return name;
|
||||
}
|
||||
|
||||
QString DebuggerWidget::displayNameWithoutSuffix() const
|
||||
QString DebuggerView::displayNameWithoutSuffix() const
|
||||
{
|
||||
return m_translated_display_name;
|
||||
}
|
||||
|
||||
QString DebuggerWidget::customDisplayName() const
|
||||
QString DebuggerView::customDisplayName() const
|
||||
{
|
||||
return m_custom_display_name;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::setCustomDisplayName(QString display_name)
|
||||
bool DebuggerView::setCustomDisplayName(QString display_name)
|
||||
{
|
||||
if (display_name.size() > DockUtils::MAX_DOCK_WIDGET_NAME_SIZE)
|
||||
return false;
|
||||
@@ -70,17 +76,17 @@ bool DebuggerWidget::setCustomDisplayName(QString display_name)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::isPrimary() const
|
||||
bool DebuggerView::isPrimary() const
|
||||
{
|
||||
return m_is_primary;
|
||||
}
|
||||
|
||||
void DebuggerWidget::setPrimary(bool is_primary)
|
||||
void DebuggerView::setPrimary(bool is_primary)
|
||||
{
|
||||
m_is_primary = is_primary;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::setCpu(DebugInterface& new_cpu)
|
||||
bool DebuggerView::setCpu(DebugInterface& new_cpu)
|
||||
{
|
||||
BreakPointCpu before = cpu().getCpuType();
|
||||
m_cpu = &new_cpu;
|
||||
@@ -88,12 +94,12 @@ bool DebuggerWidget::setCpu(DebugInterface& new_cpu)
|
||||
return before == after;
|
||||
}
|
||||
|
||||
std::optional<BreakPointCpu> DebuggerWidget::cpuOverride() const
|
||||
std::optional<BreakPointCpu> DebuggerView::cpuOverride() const
|
||||
{
|
||||
return m_cpu_override;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::setCpuOverride(std::optional<BreakPointCpu> new_cpu)
|
||||
bool DebuggerView::setCpuOverride(std::optional<BreakPointCpu> new_cpu)
|
||||
{
|
||||
BreakPointCpu before = cpu().getCpuType();
|
||||
m_cpu_override = new_cpu;
|
||||
@@ -101,7 +107,7 @@ bool DebuggerWidget::setCpuOverride(std::optional<BreakPointCpu> new_cpu)
|
||||
return before == after;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::handleEvent(const DebuggerEvents::Event& event)
|
||||
bool DebuggerView::handleEvent(const DebuggerEvents::Event& event)
|
||||
{
|
||||
auto [begin, end] = m_event_handlers.equal_range(typeid(event).name());
|
||||
for (auto handler = begin; handler != end; handler++)
|
||||
@@ -111,14 +117,14 @@ bool DebuggerWidget::handleEvent(const DebuggerEvents::Event& event)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DebuggerWidget::acceptsEventType(const char* event_type)
|
||||
bool DebuggerView::acceptsEventType(const char* event_type)
|
||||
{
|
||||
auto [begin, end] = m_event_handlers.equal_range(event_type);
|
||||
return begin != end;
|
||||
}
|
||||
|
||||
|
||||
void DebuggerWidget::toJson(JsonValueWrapper& json)
|
||||
void DebuggerView::toJson(JsonValueWrapper& json)
|
||||
{
|
||||
std::string custom_display_name_str = m_custom_display_name.toStdString();
|
||||
rapidjson::Value custom_display_name;
|
||||
@@ -128,7 +134,7 @@ void DebuggerWidget::toJson(JsonValueWrapper& json)
|
||||
json.value().AddMember("isPrimary", m_is_primary, json.allocator());
|
||||
}
|
||||
|
||||
bool DebuggerWidget::fromJson(const JsonValueWrapper& json)
|
||||
bool DebuggerView::fromJson(const JsonValueWrapper& json)
|
||||
{
|
||||
auto custom_display_name = json.value().FindMember("customDisplayName");
|
||||
if (custom_display_name != json.value().MemberEnd() && custom_display_name->value.IsString())
|
||||
@@ -144,17 +150,17 @@ bool DebuggerWidget::fromJson(const JsonValueWrapper& json)
|
||||
return true;
|
||||
}
|
||||
|
||||
void DebuggerWidget::switchToThisTab()
|
||||
void DebuggerView::switchToThisTab()
|
||||
{
|
||||
g_debugger_window->dockManager().switchToDebuggerWidget(this);
|
||||
g_debugger_window->dockManager().switchToDebuggerView(this);
|
||||
}
|
||||
|
||||
bool DebuggerWidget::supportsMultipleInstances()
|
||||
bool DebuggerView::supportsMultipleInstances()
|
||||
{
|
||||
return !(m_flags & DISALLOW_MULTIPLE_INSTANCES);
|
||||
}
|
||||
|
||||
void DebuggerWidget::retranslateDisplayName()
|
||||
void DebuggerView::retranslateDisplayName()
|
||||
{
|
||||
if (!m_custom_display_name.isEmpty())
|
||||
{
|
||||
@@ -162,25 +168,25 @@ void DebuggerWidget::retranslateDisplayName()
|
||||
}
|
||||
else
|
||||
{
|
||||
auto description = DockTables::DEBUGGER_WIDGETS.find(metaObject()->className());
|
||||
if (description != DockTables::DEBUGGER_WIDGETS.end())
|
||||
m_translated_display_name = QCoreApplication::translate("DebuggerWidget", description->second.display_name);
|
||||
auto description = DockTables::DEBUGGER_VIEWS.find(metaObject()->className());
|
||||
if (description != DockTables::DEBUGGER_VIEWS.end())
|
||||
m_translated_display_name = QCoreApplication::translate("DebuggerView", description->second.display_name);
|
||||
else
|
||||
m_translated_display_name = QString();
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<int> DebuggerWidget::displayNameSuffixNumber() const
|
||||
std::optional<int> DebuggerView::displayNameSuffixNumber() const
|
||||
{
|
||||
return m_display_name_suffix_number;
|
||||
}
|
||||
|
||||
void DebuggerWidget::setDisplayNameSuffixNumber(std::optional<int> suffix_number)
|
||||
void DebuggerView::setDisplayNameSuffixNumber(std::optional<int> suffix_number)
|
||||
{
|
||||
m_display_name_suffix_number = suffix_number;
|
||||
}
|
||||
|
||||
void DebuggerWidget::updateStyleSheet()
|
||||
void DebuggerView::updateStyleSheet()
|
||||
{
|
||||
QString stylesheet;
|
||||
|
||||
@@ -205,48 +211,48 @@ void DebuggerWidget::updateStyleSheet()
|
||||
setStyleSheet(stylesheet);
|
||||
}
|
||||
|
||||
void DebuggerWidget::goToInDisassembler(u32 address, bool switch_to_tab)
|
||||
void DebuggerView::goToInDisassembler(u32 address, bool switch_to_tab)
|
||||
{
|
||||
DebuggerEvents::GoToAddress event;
|
||||
event.address = address;
|
||||
event.filter = DebuggerEvents::GoToAddress::DISASSEMBLER;
|
||||
event.switch_to_tab = switch_to_tab;
|
||||
DebuggerWidget::sendEvent(std::move(event));
|
||||
DebuggerView::sendEvent(std::move(event));
|
||||
}
|
||||
|
||||
void DebuggerWidget::goToInMemoryView(u32 address, bool switch_to_tab)
|
||||
void DebuggerView::goToInMemoryView(u32 address, bool switch_to_tab)
|
||||
{
|
||||
DebuggerEvents::GoToAddress event;
|
||||
event.address = address;
|
||||
event.filter = DebuggerEvents::GoToAddress::MEMORY_VIEW;
|
||||
event.switch_to_tab = switch_to_tab;
|
||||
DebuggerWidget::sendEvent(std::move(event));
|
||||
DebuggerView::sendEvent(std::move(event));
|
||||
}
|
||||
|
||||
void DebuggerWidget::sendEventImplementation(const DebuggerEvents::Event& event)
|
||||
void DebuggerView::sendEventImplementation(const DebuggerEvents::Event& event)
|
||||
{
|
||||
if (!g_debugger_window)
|
||||
return;
|
||||
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerWidgets())
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerViews())
|
||||
if (widget->isPrimary() && widget->handleEvent(event))
|
||||
return;
|
||||
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerWidgets())
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerViews())
|
||||
if (!widget->isPrimary() && widget->handleEvent(event))
|
||||
return;
|
||||
}
|
||||
|
||||
void DebuggerWidget::broadcastEventImplementation(const DebuggerEvents::Event& event)
|
||||
void DebuggerView::broadcastEventImplementation(const DebuggerEvents::Event& event)
|
||||
{
|
||||
if (!g_debugger_window)
|
||||
return;
|
||||
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerWidgets())
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerViews())
|
||||
widget->handleEvent(event);
|
||||
}
|
||||
|
||||
std::vector<QAction*> DebuggerWidget::createEventActionsImplementation(
|
||||
std::vector<QAction*> DebuggerView::createEventActionsImplementation(
|
||||
QMenu* menu,
|
||||
u32 max_top_level_actions,
|
||||
bool skip_self,
|
||||
@@ -257,12 +263,12 @@ std::vector<QAction*> DebuggerWidget::createEventActionsImplementation(
|
||||
if (!g_debugger_window)
|
||||
return {};
|
||||
|
||||
std::vector<DebuggerWidget*> receivers;
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerWidgets())
|
||||
std::vector<DebuggerView*> receivers;
|
||||
for (const auto& [unique_name, widget] : g_debugger_window->dockManager().debuggerViews())
|
||||
if ((!skip_self || widget != this) && widget->acceptsEventType(event_type))
|
||||
receivers.emplace_back(widget);
|
||||
|
||||
std::sort(receivers.begin(), receivers.end(), [&](const DebuggerWidget* lhs, const DebuggerWidget* rhs) {
|
||||
std::sort(receivers.begin(), receivers.end(), [&](const DebuggerView* lhs, const DebuggerView* rhs) {
|
||||
if (lhs->displayNameWithoutSuffix() == rhs->displayNameWithoutSuffix())
|
||||
return lhs->displayNameSuffixNumber() < rhs->displayNameSuffixNumber();
|
||||
|
||||
@@ -279,7 +285,7 @@ std::vector<QAction*> DebuggerWidget::createEventActionsImplementation(
|
||||
std::vector<QAction*> actions;
|
||||
for (size_t i = 0; i < receivers.size(); i++)
|
||||
{
|
||||
DebuggerWidget* receiver = receivers[i];
|
||||
DebuggerView* receiver = receivers[i];
|
||||
|
||||
QAction* action;
|
||||
if (!submenu || i + 1 < max_top_level_actions)
|
||||
@@ -12,24 +12,26 @@
|
||||
|
||||
class JsonValueWrapper;
|
||||
|
||||
// Container for variables to be passed to the constructor of DebuggerWidget.
|
||||
struct DebuggerWidgetParameters
|
||||
// Container for variables to be passed to the constructor of DebuggerView.
|
||||
struct DebuggerViewParameters
|
||||
{
|
||||
QString unique_name;
|
||||
u64 id = 0;
|
||||
DebugInterface* cpu = nullptr;
|
||||
std::optional<BreakPointCpu> cpu_override;
|
||||
QWidget* parent = nullptr;
|
||||
};
|
||||
|
||||
// The base class for the contents of the dock widgets in the debugger.
|
||||
class DebuggerWidget : public QWidget
|
||||
class DebuggerView : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QString uniqueName() const;
|
||||
u64 id() const;
|
||||
|
||||
// Get the translated name that should be displayed for this widget.
|
||||
// Get the translated name that should be displayed for this view.
|
||||
QString displayName() const;
|
||||
QString displayNameWithoutSuffix() const;
|
||||
|
||||
@@ -39,30 +41,30 @@ public:
|
||||
bool isPrimary() const;
|
||||
void setPrimary(bool is_primary);
|
||||
|
||||
// Get the effective debug interface associated with this particular widget
|
||||
// Get the effective debug interface associated with this particular view
|
||||
// if it's set, otherwise return the one associated with the layout that
|
||||
// contains this widget.
|
||||
// contains this view.
|
||||
DebugInterface& cpu() const;
|
||||
|
||||
// Set the debug interface associated with the layout. If false is returned,
|
||||
// we have to recreate the object.
|
||||
bool setCpu(DebugInterface& new_cpu);
|
||||
|
||||
// Get the CPU associated with this particular widget.
|
||||
// Get the CPU associated with this particular view.
|
||||
std::optional<BreakPointCpu> cpuOverride() const;
|
||||
|
||||
// Set the CPU associated with the individual dock widget. If false is
|
||||
// returned, we have to recreate the object.
|
||||
bool setCpuOverride(std::optional<BreakPointCpu> new_cpu);
|
||||
|
||||
// Send each open debugger widget an event in turn, until one handles it.
|
||||
// Send each open debugger view an event in turn, until one handles it.
|
||||
template <typename Event>
|
||||
static void sendEvent(Event event)
|
||||
{
|
||||
if (!QtHost::IsOnUIThread())
|
||||
{
|
||||
QtHost::RunOnUIThread([event = std::move(event)]() {
|
||||
DebuggerWidget::sendEventImplementation(event);
|
||||
DebuggerView::sendEventImplementation(event);
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -70,14 +72,14 @@ public:
|
||||
sendEventImplementation(event);
|
||||
}
|
||||
|
||||
// Send all open debugger widgets an event.
|
||||
// Send all open debugger views an event.
|
||||
template <typename Event>
|
||||
static void broadcastEvent(Event event)
|
||||
{
|
||||
if (!QtHost::IsOnUIThread())
|
||||
{
|
||||
QtHost::RunOnUIThread([event = std::move(event)]() {
|
||||
DebuggerWidget::broadcastEventImplementation(event);
|
||||
DebuggerView::broadcastEventImplementation(event);
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -110,10 +112,10 @@ public:
|
||||
// Call the handler callback for the specified event.
|
||||
bool handleEvent(const DebuggerEvents::Event& event);
|
||||
|
||||
// Check if this debugger widget can receive the specified type of event.
|
||||
// Check if this debugger view can receive the specified type of event.
|
||||
bool acceptsEventType(const char* event_type);
|
||||
|
||||
// Generates context menu actions to send an event to each debugger widget
|
||||
// Generates context menu actions to send an event to each debugger view
|
||||
// that can receive it. A submenu is generated if the number of possible
|
||||
// receivers exceeds max_top_level_actions. If skip_self is true, actions
|
||||
// are only generated if the sender and receiver aren't the same object.
|
||||
@@ -163,7 +165,7 @@ protected:
|
||||
MONOSPACE_FONT = 1 << 1
|
||||
};
|
||||
|
||||
DebuggerWidget(const DebuggerWidgetParameters& parameters, u32 flags);
|
||||
DebuggerView(const DebuggerViewParameters& parameters, u32 flags);
|
||||
|
||||
private:
|
||||
static void sendEventImplementation(const DebuggerEvents::Event& event);
|
||||
@@ -177,6 +179,12 @@ private:
|
||||
const char* action_prefix,
|
||||
std::function<const DebuggerEvents::Event*()> event_func);
|
||||
|
||||
// Used for sorting debugger views that have the same display name. Unique
|
||||
// within a single layout.
|
||||
u64 m_id;
|
||||
|
||||
// Identifier for the dock widget used by KDDockWidgets. Unique within a
|
||||
// single layout.
|
||||
QString m_unique_name;
|
||||
|
||||
// A user-defined name, or an empty string if no name was specified so that
|
||||
@@ -186,7 +194,7 @@ private:
|
||||
QString m_translated_display_name;
|
||||
std::optional<int> m_display_name_suffix_number;
|
||||
|
||||
// Primary debugger widgets will be chosen to handle events first. For
|
||||
// Primary debugger views will be chosen to handle events first. For
|
||||
// example, clicking on an address to go to it in the primary memory view.
|
||||
bool m_is_primary = false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "DebuggerWindow.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
#include "Debugger/Docking/DockManager.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
@@ -86,7 +86,7 @@ DebuggerWindow::DebuggerWindow(QWidget* parent)
|
||||
});
|
||||
|
||||
connect(g_emu_thread, &EmuThread::onVMPaused, this, []() {
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
|
||||
connect(g_emu_thread, &EmuThread::onVMStarting, this, &DebuggerWindow::onVMStarting);
|
||||
@@ -120,11 +120,7 @@ DebuggerWindow::DebuggerWindow(QWidget* parent)
|
||||
R5900SymbolImporter.OnDebuggerOpened();
|
||||
});
|
||||
|
||||
QTimer* refresh_timer = new QTimer(this);
|
||||
connect(refresh_timer, &QTimer::timeout, this, []() {
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::Refresh());
|
||||
});
|
||||
refresh_timer->start(1000);
|
||||
updateFromSettings();
|
||||
}
|
||||
|
||||
DebuggerWindow* DebuggerWindow::getInstance()
|
||||
@@ -285,6 +281,25 @@ bool DebuggerWindow::shouldSaveWindowGeometry()
|
||||
return Host::GetBaseBoolSettingValue("Debugger/UserInterface", "SaveWindowGeometry", true);
|
||||
}
|
||||
|
||||
void DebuggerWindow::updateFromSettings()
|
||||
{
|
||||
const int refresh_interval = Host::GetBaseIntSettingValue("Debugger/UserInterface", "RefreshInterval", 1000);
|
||||
const int effective_refresh_interval = std::clamp(refresh_interval, 10, 100000);
|
||||
|
||||
if (!m_refresh_timer)
|
||||
{
|
||||
m_refresh_timer = new QTimer(this);
|
||||
connect(m_refresh_timer, &QTimer::timeout, this, []() {
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::Refresh());
|
||||
});
|
||||
m_refresh_timer->start(effective_refresh_interval);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_refresh_timer->setInterval(effective_refresh_interval);
|
||||
}
|
||||
}
|
||||
|
||||
void DebuggerWindow::onVMStarting()
|
||||
{
|
||||
m_ui.actionRun->setEnabled(true);
|
||||
@@ -331,7 +346,7 @@ void DebuggerWindow::onVMPaused()
|
||||
});
|
||||
}
|
||||
|
||||
// Stops us from telling the disassembly widget to jump somwhere because
|
||||
// Stops us from telling the disassembly view to jump somwhere because
|
||||
// breakpoint code paused the core.
|
||||
if (!CBreakPoints::GetCorePaused())
|
||||
emit onVMActuallyPaused();
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
|
||||
#include <kddockwidgets/MainWindow.h>
|
||||
#include <QtCore/QTimer>
|
||||
|
||||
class DockManager;
|
||||
|
||||
@@ -37,6 +38,8 @@ public:
|
||||
void restoreWindowGeometry();
|
||||
bool shouldSaveWindowGeometry();
|
||||
|
||||
void updateFromSettings();
|
||||
|
||||
public slots:
|
||||
void onVMStarting();
|
||||
void onVMPaused();
|
||||
@@ -67,6 +70,7 @@ private:
|
||||
DockManager* m_dock_manager;
|
||||
|
||||
QByteArray m_default_toolbar_state;
|
||||
QTimer* m_refresh_timer = nullptr;
|
||||
|
||||
int m_font_size;
|
||||
static const constexpr int DEFAULT_FONT_SIZE = 10;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "DisassemblyWidget.h"
|
||||
#include "DisassemblyView.h"
|
||||
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
using namespace QtUtils;
|
||||
|
||||
DisassemblyWidget::DisassemblyWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, MONOSPACE_FONT)
|
||||
DisassemblyView::DisassemblyView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, MONOSPACE_FONT)
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
|
||||
@@ -34,10 +34,10 @@ DisassemblyWidget::DisassemblyWidget(const DebuggerWidgetParameters& parameters)
|
||||
setFocusPolicy(Qt::FocusPolicy::ClickFocus);
|
||||
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, &DisassemblyWidget::customContextMenuRequested, this, &DisassemblyWidget::openContextMenu);
|
||||
connect(this, &DisassemblyView::customContextMenuRequested, this, &DisassemblyView::openContextMenu);
|
||||
|
||||
connect(g_debugger_window, &DebuggerWindow::onVMActuallyPaused,
|
||||
this, &DisassemblyWidget::gotoProgramCounterOnPause);
|
||||
this, &DisassemblyView::gotoProgramCounterOnPause);
|
||||
|
||||
receiveEvent<DebuggerEvents::Refresh>([this](const DebuggerEvents::Refresh& event) -> bool {
|
||||
update();
|
||||
@@ -58,20 +58,20 @@ DisassemblyWidget::DisassemblyWidget(const DebuggerWidgetParameters& parameters)
|
||||
});
|
||||
}
|
||||
|
||||
DisassemblyWidget::~DisassemblyWidget() = default;
|
||||
DisassemblyView::~DisassemblyView() = default;
|
||||
|
||||
void DisassemblyWidget::toJson(JsonValueWrapper& json)
|
||||
void DisassemblyView::toJson(JsonValueWrapper& json)
|
||||
{
|
||||
DebuggerWidget::toJson(json);
|
||||
DebuggerView::toJson(json);
|
||||
|
||||
json.value().AddMember("startAddress", m_visibleStart, json.allocator());
|
||||
json.value().AddMember("goToPCOnPause", m_goToProgramCounterOnPause, json.allocator());
|
||||
json.value().AddMember("showInstructionBytes", m_showInstructionBytes, json.allocator());
|
||||
}
|
||||
|
||||
bool DisassemblyWidget::fromJson(const JsonValueWrapper& json)
|
||||
bool DisassemblyView::fromJson(const JsonValueWrapper& json)
|
||||
{
|
||||
if (!DebuggerWidget::fromJson(json))
|
||||
if (!DebuggerView::fromJson(json))
|
||||
return false;
|
||||
|
||||
auto start_address = json.value().FindMember("startAddress");
|
||||
@@ -91,22 +91,22 @@ bool DisassemblyWidget::fromJson(const JsonValueWrapper& json)
|
||||
return true;
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextCopyAddress()
|
||||
void DisassemblyView::contextCopyAddress()
|
||||
{
|
||||
QGuiApplication::clipboard()->setText(FetchSelectionInfo(SelectionInfo::ADDRESS));
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextCopyInstructionHex()
|
||||
void DisassemblyView::contextCopyInstructionHex()
|
||||
{
|
||||
QGuiApplication::clipboard()->setText(FetchSelectionInfo(SelectionInfo::INSTRUCTIONHEX));
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextCopyInstructionText()
|
||||
void DisassemblyView::contextCopyInstructionText()
|
||||
{
|
||||
QGuiApplication::clipboard()->setText(FetchSelectionInfo(SelectionInfo::INSTRUCTIONTEXT));
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextAssembleInstruction()
|
||||
void DisassemblyView::contextAssembleInstruction()
|
||||
{
|
||||
if (!cpu().isCpuPaused())
|
||||
{
|
||||
@@ -140,12 +140,12 @@ void DisassemblyWidget::contextAssembleInstruction()
|
||||
this->m_nopedInstructions.insert({i, cpu->read32(i)});
|
||||
cpu->write32(i, val);
|
||||
}
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextNoopInstruction()
|
||||
void DisassemblyView::contextNoopInstruction()
|
||||
{
|
||||
Host::RunOnCPUThread([this, start = m_selectedAddressStart, end = m_selectedAddressEnd, cpu = &cpu()] {
|
||||
for (u32 i = start; i <= end; i += 4)
|
||||
@@ -153,11 +153,11 @@ void DisassemblyWidget::contextNoopInstruction()
|
||||
this->m_nopedInstructions.insert({i, cpu->read32(i)});
|
||||
cpu->write32(i, 0x00);
|
||||
}
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextRestoreInstruction()
|
||||
void DisassemblyView::contextRestoreInstruction()
|
||||
{
|
||||
Host::RunOnCPUThread([this, start = m_selectedAddressStart, end = m_selectedAddressEnd, cpu = &cpu()] {
|
||||
for (u32 i = start; i <= end; i += 4)
|
||||
@@ -168,11 +168,11 @@ void DisassemblyWidget::contextRestoreInstruction()
|
||||
this->m_nopedInstructions.erase(i);
|
||||
}
|
||||
}
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextRunToCursor()
|
||||
void DisassemblyView::contextRunToCursor()
|
||||
{
|
||||
const u32 selectedAddressStart = m_selectedAddressStart;
|
||||
Host::RunOnCPUThread([cpu = &cpu(), selectedAddressStart] {
|
||||
@@ -181,18 +181,18 @@ void DisassemblyWidget::contextRunToCursor()
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextJumpToCursor()
|
||||
void DisassemblyView::contextJumpToCursor()
|
||||
{
|
||||
cpu().setPc(m_selectedAddressStart);
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextToggleBreakpoint()
|
||||
void DisassemblyView::contextToggleBreakpoint()
|
||||
{
|
||||
toggleBreakpoint(m_selectedAddressStart);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextFollowBranch()
|
||||
void DisassemblyView::contextFollowBranch()
|
||||
{
|
||||
DisassemblyLineInfo line;
|
||||
|
||||
@@ -207,7 +207,7 @@ void DisassemblyWidget::contextFollowBranch()
|
||||
}
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextGoToAddress()
|
||||
void DisassemblyView::contextGoToAddress()
|
||||
{
|
||||
bool ok;
|
||||
const QString targetString = QInputDialog::getText(this, tr("Go To In Disassembly"), "",
|
||||
@@ -227,7 +227,7 @@ void DisassemblyWidget::contextGoToAddress()
|
||||
gotoAddressAndSetFocus(static_cast<u32>(address) & ~3);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextAddFunction()
|
||||
void DisassemblyView::contextAddFunction()
|
||||
{
|
||||
NewFunctionDialog* dialog = new NewFunctionDialog(cpu(), this);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -239,13 +239,13 @@ void DisassemblyWidget::contextAddFunction()
|
||||
update();
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextCopyFunctionName()
|
||||
void DisassemblyView::contextCopyFunctionName()
|
||||
{
|
||||
std::string name = cpu().GetSymbolGuardian().FunctionStartingAtAddress(m_selectedAddressStart).name;
|
||||
QGuiApplication::clipboard()->setText(QString::fromStdString(name));
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextRemoveFunction()
|
||||
void DisassemblyView::contextRemoveFunction()
|
||||
{
|
||||
cpu().GetSymbolGuardian().ReadWrite([&](ccc::SymbolDatabase& database) {
|
||||
ccc::Function* curFunc = database.functions.symbol_overlapping_address(m_selectedAddressStart);
|
||||
@@ -261,7 +261,7 @@ void DisassemblyWidget::contextRemoveFunction()
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextRenameFunction()
|
||||
void DisassemblyView::contextRenameFunction()
|
||||
{
|
||||
const FunctionInfo curFunc = cpu().GetSymbolGuardian().FunctionOverlappingAddress(m_selectedAddressStart);
|
||||
|
||||
@@ -289,7 +289,7 @@ void DisassemblyWidget::contextRenameFunction()
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextStubFunction()
|
||||
void DisassemblyView::contextStubFunction()
|
||||
{
|
||||
FunctionInfo function = cpu().GetSymbolGuardian().FunctionOverlappingAddress(m_selectedAddressStart);
|
||||
u32 address = function.address.valid() ? function.address.value : m_selectedAddressStart;
|
||||
@@ -298,11 +298,11 @@ void DisassemblyWidget::contextStubFunction()
|
||||
this->m_stubbedFunctions.insert({address, {cpu->read32(address), cpu->read32(address + 4)}});
|
||||
cpu->write32(address, 0x03E00008); // jr ra
|
||||
cpu->write32(address + 4, 0x00000000); // nop
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextRestoreFunction()
|
||||
void DisassemblyView::contextRestoreFunction()
|
||||
{
|
||||
u32 address = m_selectedAddressStart;
|
||||
cpu().GetSymbolGuardian().Read([&](const ccc::SymbolDatabase& database) {
|
||||
@@ -319,7 +319,7 @@ void DisassemblyWidget::contextRestoreFunction()
|
||||
cpu->write32(address, first_instruction);
|
||||
cpu->write32(address + 4, second_instruction);
|
||||
this->m_stubbedFunctions.erase(address);
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
});
|
||||
}
|
||||
else
|
||||
@@ -328,13 +328,13 @@ void DisassemblyWidget::contextRestoreFunction()
|
||||
}
|
||||
}
|
||||
|
||||
void DisassemblyWidget::contextShowInstructionBytes()
|
||||
void DisassemblyView::contextShowInstructionBytes()
|
||||
{
|
||||
m_showInstructionBytes = !m_showInstructionBytes;
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
QString DisassemblyWidget::GetLineDisasm(u32 address)
|
||||
QString DisassemblyView::GetLineDisasm(u32 address)
|
||||
{
|
||||
DisassemblyLineInfo lineInfo;
|
||||
m_disassemblyManager.getLine(address, true, lineInfo);
|
||||
@@ -342,7 +342,7 @@ QString DisassemblyWidget::GetLineDisasm(u32 address)
|
||||
};
|
||||
|
||||
// Here we go!
|
||||
void DisassemblyWidget::paintEvent(QPaintEvent* event)
|
||||
void DisassemblyView::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
@@ -526,7 +526,7 @@ void DisassemblyWidget::paintEvent(QPaintEvent* event)
|
||||
painter.drawRect(0, 0, w, h);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::mousePressEvent(QMouseEvent* event)
|
||||
void DisassemblyView::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
// Calculate index of row that was clicked
|
||||
const u32 selectedRowIndex = static_cast<int>(event->position().y()) / m_rowHeight;
|
||||
@@ -567,7 +567,7 @@ void DisassemblyWidget::mousePressEvent(QMouseEvent* event)
|
||||
}
|
||||
}
|
||||
|
||||
void DisassemblyWidget::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
void DisassemblyView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
// Calculate index of row that was double clicked
|
||||
const u32 selectedRowIndex = static_cast<int>(event->position().y()) / m_rowHeight;
|
||||
@@ -580,7 +580,7 @@ void DisassemblyWidget::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
}
|
||||
}
|
||||
|
||||
void DisassemblyWidget::wheelEvent(QWheelEvent* event)
|
||||
void DisassemblyView::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
if (event->angleDelta().y() < 0) // todo: max address bounds check?
|
||||
{
|
||||
@@ -593,7 +593,7 @@ void DisassemblyWidget::wheelEvent(QWheelEvent* event)
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void DisassemblyWidget::keyPressEvent(QKeyEvent* event)
|
||||
void DisassemblyView::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
switch (event->key())
|
||||
{
|
||||
@@ -665,7 +665,7 @@ void DisassemblyWidget::keyPressEvent(QKeyEvent* event)
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void DisassemblyWidget::openContextMenu(QPoint pos)
|
||||
void DisassemblyView::openContextMenu(QPoint pos)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -678,19 +678,19 @@ void DisassemblyWidget::openContextMenu(QPoint pos)
|
||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
QAction* copy_address_action = menu->addAction(tr("Copy Address"));
|
||||
connect(copy_address_action, &QAction::triggered, this, &DisassemblyWidget::contextCopyAddress);
|
||||
connect(copy_address_action, &QAction::triggered, this, &DisassemblyView::contextCopyAddress);
|
||||
|
||||
QAction* copy_instruction_hex_action = menu->addAction(tr("Copy Instruction Hex"));
|
||||
connect(copy_instruction_hex_action, &QAction::triggered, this, &DisassemblyWidget::contextCopyInstructionHex);
|
||||
connect(copy_instruction_hex_action, &QAction::triggered, this, &DisassemblyView::contextCopyInstructionHex);
|
||||
|
||||
QAction* copy_instruction_text_action = menu->addAction(tr("&Copy Instruction Text"));
|
||||
copy_instruction_text_action->setShortcut(QKeySequence(Qt::Key_C));
|
||||
connect(copy_instruction_text_action, &QAction::triggered, this, &DisassemblyWidget::contextCopyInstructionText);
|
||||
connect(copy_instruction_text_action, &QAction::triggered, this, &DisassemblyView::contextCopyInstructionText);
|
||||
|
||||
if (cpu().GetSymbolGuardian().FunctionExistsWithStartingAddress(m_selectedAddressStart))
|
||||
{
|
||||
QAction* copy_function_name_action = menu->addAction(tr("Copy Function Name"));
|
||||
connect(copy_function_name_action, &QAction::triggered, this, &DisassemblyWidget::contextCopyFunctionName);
|
||||
connect(copy_function_name_action, &QAction::triggered, this, &DisassemblyView::contextCopyFunctionName);
|
||||
}
|
||||
|
||||
menu->addSeparator();
|
||||
@@ -698,37 +698,37 @@ void DisassemblyWidget::openContextMenu(QPoint pos)
|
||||
if (AddressCanRestore(m_selectedAddressStart, m_selectedAddressEnd))
|
||||
{
|
||||
QAction* restore_instruction_action = menu->addAction(tr("Restore Instruction(s)"));
|
||||
connect(restore_instruction_action, &QAction::triggered, this, &DisassemblyWidget::contextRestoreInstruction);
|
||||
connect(restore_instruction_action, &QAction::triggered, this, &DisassemblyView::contextRestoreInstruction);
|
||||
}
|
||||
|
||||
QAction* assemble_new_instruction = menu->addAction(tr("Asse&mble new Instruction(s)"));
|
||||
assemble_new_instruction->setShortcut(QKeySequence(Qt::Key_M));
|
||||
connect(assemble_new_instruction, &QAction::triggered, this, &DisassemblyWidget::contextAssembleInstruction);
|
||||
connect(assemble_new_instruction, &QAction::triggered, this, &DisassemblyView::contextAssembleInstruction);
|
||||
|
||||
QAction* nop_instruction_action = menu->addAction(tr("NOP Instruction(s)"));
|
||||
connect(nop_instruction_action, &QAction::triggered, this, &DisassemblyWidget::contextNoopInstruction);
|
||||
connect(nop_instruction_action, &QAction::triggered, this, &DisassemblyView::contextNoopInstruction);
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
QAction* run_to_cursor_action = menu->addAction(tr("Run to Cursor"));
|
||||
connect(run_to_cursor_action, &QAction::triggered, this, &DisassemblyWidget::contextRunToCursor);
|
||||
connect(run_to_cursor_action, &QAction::triggered, this, &DisassemblyView::contextRunToCursor);
|
||||
|
||||
QAction* jump_to_cursor_action = menu->addAction(tr("&Jump to Cursor"));
|
||||
jump_to_cursor_action->setShortcut(QKeySequence(Qt::Key_J));
|
||||
connect(jump_to_cursor_action, &QAction::triggered, this, &DisassemblyWidget::contextJumpToCursor);
|
||||
connect(jump_to_cursor_action, &QAction::triggered, this, &DisassemblyView::contextJumpToCursor);
|
||||
|
||||
QAction* toggle_breakpoint_action = menu->addAction(tr("Toggle &Breakpoint"));
|
||||
toggle_breakpoint_action->setShortcut(QKeySequence(Qt::Key_B));
|
||||
connect(toggle_breakpoint_action, &QAction::triggered, this, &DisassemblyWidget::contextToggleBreakpoint);
|
||||
connect(toggle_breakpoint_action, &QAction::triggered, this, &DisassemblyView::contextToggleBreakpoint);
|
||||
|
||||
QAction* follow_branch_action = menu->addAction(tr("Follow Branch"));
|
||||
connect(follow_branch_action, &QAction::triggered, this, &DisassemblyWidget::contextFollowBranch);
|
||||
connect(follow_branch_action, &QAction::triggered, this, &DisassemblyView::contextFollowBranch);
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
QAction* go_to_address_action = menu->addAction(tr("&Go to Address"));
|
||||
go_to_address_action->setShortcut(QKeySequence(Qt::Key_G));
|
||||
connect(go_to_address_action, &QAction::triggered, this, &DisassemblyWidget::contextGoToAddress);
|
||||
connect(go_to_address_action, &QAction::triggered, this, &DisassemblyView::contextGoToAddress);
|
||||
|
||||
createEventActions<DebuggerEvents::GoToAddress>(menu, [this]() {
|
||||
DebuggerEvents::GoToAddress event;
|
||||
@@ -745,24 +745,24 @@ void DisassemblyWidget::openContextMenu(QPoint pos)
|
||||
menu->addSeparator();
|
||||
|
||||
QAction* add_function_action = menu->addAction(tr("Add Function"));
|
||||
connect(add_function_action, &QAction::triggered, this, &DisassemblyWidget::contextAddFunction);
|
||||
connect(add_function_action, &QAction::triggered, this, &DisassemblyView::contextAddFunction);
|
||||
|
||||
QAction* rename_function_action = menu->addAction(tr("Rename Function"));
|
||||
connect(rename_function_action, &QAction::triggered, this, &DisassemblyWidget::contextRenameFunction);
|
||||
connect(rename_function_action, &QAction::triggered, this, &DisassemblyView::contextRenameFunction);
|
||||
|
||||
QAction* remove_function_action = menu->addAction(tr("Remove Function"));
|
||||
menu->addAction(remove_function_action);
|
||||
connect(remove_function_action, &QAction::triggered, this, &DisassemblyWidget::contextRemoveFunction);
|
||||
connect(remove_function_action, &QAction::triggered, this, &DisassemblyView::contextRemoveFunction);
|
||||
|
||||
if (FunctionCanRestore(m_selectedAddressStart))
|
||||
{
|
||||
QAction* restore_action = menu->addAction(tr("Restore Function"));
|
||||
connect(restore_action, &QAction::triggered, this, &DisassemblyWidget::contextRestoreFunction);
|
||||
connect(restore_action, &QAction::triggered, this, &DisassemblyView::contextRestoreFunction);
|
||||
}
|
||||
else
|
||||
{
|
||||
QAction* stub_action = menu->addAction(tr("Stub (NOP) Function"));
|
||||
connect(stub_action, &QAction::triggered, this, &DisassemblyWidget::contextStubFunction);
|
||||
connect(stub_action, &QAction::triggered, this, &DisassemblyView::contextStubFunction);
|
||||
}
|
||||
|
||||
menu->addSeparator();
|
||||
@@ -771,12 +771,12 @@ void DisassemblyWidget::openContextMenu(QPoint pos)
|
||||
show_instruction_bytes_action->setShortcut(QKeySequence(Qt::Key_I));
|
||||
show_instruction_bytes_action->setCheckable(true);
|
||||
show_instruction_bytes_action->setChecked(m_showInstructionBytes);
|
||||
connect(show_instruction_bytes_action, &QAction::triggered, this, &DisassemblyWidget::contextShowInstructionBytes);
|
||||
connect(show_instruction_bytes_action, &QAction::triggered, this, &DisassemblyView::contextShowInstructionBytes);
|
||||
|
||||
menu->popup(this->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
QString DisassemblyWidget::GetDisassemblyTitleLine()
|
||||
QString DisassemblyView::GetDisassemblyTitleLine()
|
||||
{
|
||||
// Disassembly column title line based on format created by DisassemblyStringFromAddress()
|
||||
QString title_line_string;
|
||||
@@ -785,11 +785,11 @@ QString DisassemblyWidget::GetDisassemblyTitleLine()
|
||||
const bool show_instruction_bytes = m_showInstructionBytes && cpu().isAlive();
|
||||
if (show_instruction_bytes)
|
||||
{
|
||||
title_line_string = QCoreApplication::translate("DisassemblyWidgetColumnTitle", " %1 %2 %3 %4");
|
||||
title_line_string = QCoreApplication::translate("DisassemblyViewColumnTitle", " %1 %2 %3 %4");
|
||||
}
|
||||
else
|
||||
{
|
||||
title_line_string = QCoreApplication::translate("DisassemblyWidgetColumnTitle", " %1 %2 %3");
|
||||
title_line_string = QCoreApplication::translate("DisassemblyViewColumnTitle", " %1 %2 %3");
|
||||
}
|
||||
|
||||
// First 2 chars in disassembly row is always for non-returning functions (NR)
|
||||
@@ -797,21 +797,21 @@ QString DisassemblyWidget::GetDisassemblyTitleLine()
|
||||
title_line_string = title_line_string.arg(" ");
|
||||
|
||||
// Second column title is always address of instruction
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyWidgetColumnTitle", "Location"));
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyViewColumnTitle", "Location"));
|
||||
|
||||
// If user specified to "Show Instruction Bytes", third column is opcode + args
|
||||
if (show_instruction_bytes)
|
||||
{
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyWidgetColumnTitle", "Bytes "));
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyViewColumnTitle", "Bytes "));
|
||||
}
|
||||
|
||||
// Last column title is always disassembled instruction
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyWidgetColumnTitle", "Instruction"));
|
||||
title_line_string = title_line_string.arg(QCoreApplication::translate("DisassemblyViewColumnTitle", "Instruction"));
|
||||
|
||||
return title_line_string;
|
||||
}
|
||||
|
||||
QColor DisassemblyWidget::GetDisassemblyTitleLineColor()
|
||||
QColor DisassemblyView::GetDisassemblyTitleLineColor()
|
||||
{
|
||||
// Determine color of column title line. Based on QFusionStyle.
|
||||
QColor title_line_color = this->palette().button().color();
|
||||
@@ -821,7 +821,7 @@ QColor DisassemblyWidget::GetDisassemblyTitleLineColor()
|
||||
return title_line_color.lighter(104);
|
||||
}
|
||||
|
||||
inline QString DisassemblyWidget::DisassemblyStringFromAddress(u32 address, QFont font, u32 pc, bool selected)
|
||||
inline QString DisassemblyView::DisassemblyStringFromAddress(u32 address, QFont font, u32 pc, bool selected)
|
||||
{
|
||||
DisassemblyLineInfo line;
|
||||
|
||||
@@ -882,7 +882,7 @@ inline QString DisassemblyWidget::DisassemblyStringFromAddress(u32 address, QFon
|
||||
return lineString;
|
||||
}
|
||||
|
||||
QColor DisassemblyWidget::GetAddressFunctionColor(u32 address)
|
||||
QColor DisassemblyView::GetAddressFunctionColor(u32 address)
|
||||
{
|
||||
std::array<QColor, 6> colors;
|
||||
if (QtUtils::IsLightTheme(palette()))
|
||||
@@ -920,7 +920,7 @@ QColor DisassemblyWidget::GetAddressFunctionColor(u32 address)
|
||||
return colors[(function_address.value >> 4) % colors.size()];
|
||||
}
|
||||
|
||||
QString DisassemblyWidget::FetchSelectionInfo(SelectionInfo selInfo)
|
||||
QString DisassemblyView::FetchSelectionInfo(SelectionInfo selInfo)
|
||||
{
|
||||
QString infoBlock;
|
||||
for (u32 i = m_selectedAddressStart; i <= m_selectedAddressEnd; i += 4)
|
||||
@@ -945,18 +945,18 @@ QString DisassemblyWidget::FetchSelectionInfo(SelectionInfo selInfo)
|
||||
return infoBlock;
|
||||
}
|
||||
|
||||
void DisassemblyWidget::gotoAddressAndSetFocus(u32 address)
|
||||
void DisassemblyView::gotoAddressAndSetFocus(u32 address)
|
||||
{
|
||||
gotoAddress(address, true);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::gotoProgramCounterOnPause()
|
||||
void DisassemblyView::gotoProgramCounterOnPause()
|
||||
{
|
||||
if (m_goToProgramCounterOnPause)
|
||||
gotoAddress(cpu().getPC(), false);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::gotoAddress(u32 address, bool should_set_focus)
|
||||
void DisassemblyView::gotoAddress(u32 address, bool should_set_focus)
|
||||
{
|
||||
const u32 destAddress = address & ~3;
|
||||
// Center the address
|
||||
@@ -969,12 +969,12 @@ void DisassemblyWidget::gotoAddress(u32 address, bool should_set_focus)
|
||||
this->setFocus();
|
||||
}
|
||||
|
||||
void DisassemblyWidget::toggleBreakpoint(u32 address)
|
||||
void DisassemblyView::toggleBreakpoint(u32 address)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
|
||||
QPointer<DisassemblyWidget> disassembly_widget(this);
|
||||
QPointer<DisassemblyView> disassembly_widget(this);
|
||||
|
||||
Host::RunOnCPUThread([cpu = &cpu(), address, disassembly_widget] {
|
||||
if (!CBreakPoints::IsAddressBreakPoint(cpu->getCpuType(), address))
|
||||
@@ -990,7 +990,7 @@ void DisassemblyWidget::toggleBreakpoint(u32 address)
|
||||
});
|
||||
}
|
||||
|
||||
bool DisassemblyWidget::AddressCanRestore(u32 start, u32 end)
|
||||
bool DisassemblyView::AddressCanRestore(u32 start, u32 end)
|
||||
{
|
||||
for (u32 i = start; i <= end; i += 4)
|
||||
{
|
||||
@@ -1002,7 +1002,7 @@ bool DisassemblyWidget::AddressCanRestore(u32 start, u32 end)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DisassemblyWidget::FunctionCanRestore(u32 address)
|
||||
bool DisassemblyView::FunctionCanRestore(u32 address)
|
||||
{
|
||||
FunctionInfo function = cpu().GetSymbolGuardian().FunctionOverlappingAddress(address);
|
||||
if (function.address.valid())
|
||||
@@ -3,22 +3,22 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_DisassemblyWidget.h"
|
||||
#include "ui_DisassemblyView.h"
|
||||
|
||||
#include "DebuggerWidget.h"
|
||||
#include "DebuggerView.h"
|
||||
|
||||
#include "pcsx2/DebugTools/DisassemblyManager.h"
|
||||
|
||||
#include <QtWidgets/QMenu>
|
||||
#include <QtGui/QPainter>
|
||||
|
||||
class DisassemblyWidget final : public DebuggerWidget
|
||||
class DisassemblyView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DisassemblyWidget(const DebuggerWidgetParameters& parameters);
|
||||
~DisassemblyWidget();
|
||||
DisassemblyView(const DebuggerViewParameters& parameters);
|
||||
~DisassemblyView();
|
||||
|
||||
void toJson(JsonValueWrapper& json) override;
|
||||
bool fromJson(const JsonValueWrapper& json) override;
|
||||
@@ -65,7 +65,7 @@ public slots:
|
||||
void toggleBreakpoint(u32 address);
|
||||
|
||||
private:
|
||||
Ui::DisassemblyWidget m_ui;
|
||||
Ui::DisassemblyView m_ui;
|
||||
|
||||
u32 m_visibleStart = 0x100000; // The address of the first instruction shown.
|
||||
u32 m_visibleRows;
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DisassemblyWidget</class>
|
||||
<widget class="QWidget" name="DisassemblyWidget">
|
||||
<class>DisassemblyView</class>
|
||||
<widget class="QWidget" name="DisassemblyView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "DockLayout.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
const char* DEBUGGER_LAYOUT_FILE_FORMAT = "PCSX2 Debugger User Interface Layout";
|
||||
|
||||
// Increment this whenever there is a breaking change to the JSON format.
|
||||
const u32 DEBUGGER_LAYOUT_FILE_VERSION_MAJOR = 1;
|
||||
const u32 DEBUGGER_LAYOUT_FILE_VERSION_MAJOR = 2;
|
||||
|
||||
// Increment this whenever there is a non-breaking change to the JSON format.
|
||||
const u32 DEBUGGER_LAYOUT_FILE_VERSION_MINOR = 0;
|
||||
@@ -70,23 +70,24 @@ DockLayout::DockLayout(
|
||||
: m_name(name)
|
||||
, m_cpu(cpu)
|
||||
, m_is_default(is_default)
|
||||
, m_next_unique_name(layout_to_clone.m_next_unique_name)
|
||||
, m_next_id(layout_to_clone.m_next_id)
|
||||
, m_base_layout(layout_to_clone.m_base_layout)
|
||||
, m_toolbars(layout_to_clone.m_toolbars)
|
||||
, m_geometry(layout_to_clone.m_geometry)
|
||||
{
|
||||
for (const auto& [unique_name, widget_to_clone] : layout_to_clone.m_widgets)
|
||||
{
|
||||
auto widget_description = DockTables::DEBUGGER_WIDGETS.find(widget_to_clone->metaObject()->className());
|
||||
if (widget_description == DockTables::DEBUGGER_WIDGETS.end())
|
||||
auto widget_description = DockTables::DEBUGGER_VIEWS.find(widget_to_clone->metaObject()->className());
|
||||
if (widget_description == DockTables::DEBUGGER_VIEWS.end())
|
||||
continue;
|
||||
|
||||
DebuggerWidgetParameters parameters;
|
||||
DebuggerViewParameters parameters;
|
||||
parameters.unique_name = unique_name;
|
||||
parameters.id = widget_to_clone->id();
|
||||
parameters.cpu = &DebugInterface::get(cpu);
|
||||
parameters.cpu_override = widget_to_clone->cpuOverride();
|
||||
|
||||
DebuggerWidget* new_widget = widget_description->second.create_widget(parameters);
|
||||
DebuggerView* new_widget = widget_description->second.create_widget(parameters);
|
||||
new_widget->setCustomDisplayName(widget_to_clone->customDisplayName());
|
||||
new_widget->setPrimary(widget_to_clone->isPrimary());
|
||||
m_widgets.emplace(unique_name, new_widget);
|
||||
@@ -143,7 +144,7 @@ void DockLayout::setCpu(BreakPointCpu cpu)
|
||||
pxAssert(widget.get());
|
||||
|
||||
if (!widget->setCpu(DebugInterface::get(cpu)))
|
||||
recreateDebuggerWidget(unique_name);
|
||||
recreateDebuggerView(unique_name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,24 +222,24 @@ void DockLayout::thaw()
|
||||
}
|
||||
|
||||
// Check that all the dock widgets have been restored correctly.
|
||||
std::vector<QString> orphaned_debugger_widgets;
|
||||
std::vector<QString> orphaned_debugger_views;
|
||||
for (auto& [unique_name, widget] : m_widgets)
|
||||
{
|
||||
auto [controller, view] = DockUtils::dockWidgetFromName(unique_name);
|
||||
if (!controller || !view)
|
||||
{
|
||||
Console.Error("Debugger: Failed to restore dock widget '%s'.", unique_name.toStdString().c_str());
|
||||
orphaned_debugger_widgets.emplace_back(unique_name);
|
||||
orphaned_debugger_views.emplace_back(unique_name);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete any debugger widgets that haven't been restored correctly.
|
||||
for (const QString& unique_name : orphaned_debugger_widgets)
|
||||
// Delete any debugger views that haven't been restored correctly.
|
||||
for (const QString& unique_name : orphaned_debugger_views)
|
||||
{
|
||||
auto widget_iterator = m_widgets.find(unique_name);
|
||||
pxAssert(widget_iterator != m_widgets.end());
|
||||
|
||||
setPrimaryDebuggerWidget(widget_iterator->second.get(), false);
|
||||
setPrimaryDebuggerView(widget_iterator->second.get(), false);
|
||||
delete widget_iterator->second.get();
|
||||
m_widgets.erase(widget_iterator);
|
||||
}
|
||||
@@ -262,7 +263,7 @@ void DockLayout::reset()
|
||||
delete widget;
|
||||
}
|
||||
|
||||
m_next_unique_name = 0;
|
||||
m_next_id = 0;
|
||||
m_toolbars.clear();
|
||||
m_widgets.clear();
|
||||
m_geometry.clear();
|
||||
@@ -273,18 +274,19 @@ void DockLayout::reset()
|
||||
|
||||
for (size_t i = 0; i < base_layout->widgets.size(); i++)
|
||||
{
|
||||
auto iterator = DockTables::DEBUGGER_WIDGETS.find(base_layout->widgets[i].type);
|
||||
pxAssertRel(iterator != DockTables::DEBUGGER_WIDGETS.end(), "Invalid default layout.");
|
||||
const DockTables::DebuggerWidgetDescription& dock_description = iterator->second;
|
||||
auto iterator = DockTables::DEBUGGER_VIEWS.find(base_layout->widgets[i].type);
|
||||
pxAssertRel(iterator != DockTables::DEBUGGER_VIEWS.end(), "Invalid default layout.");
|
||||
const DockTables::DebuggerViewDescription& dock_description = iterator->second;
|
||||
|
||||
DebuggerWidgetParameters parameters;
|
||||
parameters.unique_name = generateNewUniqueName(base_layout->widgets[i].type.c_str());
|
||||
DebuggerViewParameters parameters;
|
||||
std::tie(parameters.unique_name, parameters.id) =
|
||||
generateNewUniqueName(base_layout->widgets[i].type.c_str());
|
||||
parameters.cpu = &DebugInterface::get(m_cpu);
|
||||
|
||||
if (parameters.unique_name.isEmpty())
|
||||
continue;
|
||||
|
||||
DebuggerWidget* widget = dock_description.create_widget(parameters);
|
||||
DebuggerView* widget = dock_description.create_widget(parameters);
|
||||
widget->setPrimary(true);
|
||||
m_widgets.emplace(parameters.unique_name, widget);
|
||||
}
|
||||
@@ -299,7 +301,7 @@ KDDockWidgets::Core::DockWidget* DockLayout::createDockWidget(const QString& nam
|
||||
if (widget_iterator == m_widgets.end())
|
||||
return nullptr;
|
||||
|
||||
DebuggerWidget* widget = widget_iterator->second;
|
||||
DebuggerView* widget = widget_iterator->second;
|
||||
if (!widget)
|
||||
return nullptr;
|
||||
|
||||
@@ -317,20 +319,20 @@ void DockLayout::updateDockWidgetTitles()
|
||||
if (!m_is_active)
|
||||
return;
|
||||
|
||||
// Translate default debugger widget names.
|
||||
// Translate default debugger view names.
|
||||
for (auto& [unique_name, widget] : m_widgets)
|
||||
widget->retranslateDisplayName();
|
||||
|
||||
// Determine if any widgets have duplicate display names.
|
||||
std::map<QString, std::vector<DebuggerWidget*>> display_name_to_widgets;
|
||||
std::map<QString, std::vector<DebuggerView*>> display_name_to_widgets;
|
||||
for (auto& [unique_name, widget] : m_widgets)
|
||||
display_name_to_widgets[widget->displayNameWithoutSuffix()].emplace_back(widget.get());
|
||||
|
||||
for (auto& [display_name, widgets] : display_name_to_widgets)
|
||||
{
|
||||
std::sort(widgets.begin(), widgets.end(),
|
||||
[&](const DebuggerWidget* lhs, const DebuggerWidget* rhs) {
|
||||
return lhs->uniqueName() < rhs->uniqueName();
|
||||
[&](const DebuggerView* lhs, const DebuggerView* rhs) {
|
||||
return lhs->id() < rhs->id();
|
||||
});
|
||||
|
||||
for (size_t i = 0; i < widgets.size(); i++)
|
||||
@@ -343,7 +345,7 @@ void DockLayout::updateDockWidgetTitles()
|
||||
}
|
||||
}
|
||||
|
||||
// Propagate the new names from the debugger widgets to the dock widgets.
|
||||
// Propagate the new names from the debugger views to the dock widgets.
|
||||
for (auto& [unique_name, widget] : m_widgets)
|
||||
{
|
||||
auto [controller, view] = DockUtils::dockWidgetFromName(widget->uniqueName());
|
||||
@@ -354,17 +356,17 @@ void DockLayout::updateDockWidgetTitles()
|
||||
}
|
||||
}
|
||||
|
||||
const std::map<QString, QPointer<DebuggerWidget>>& DockLayout::debuggerWidgets()
|
||||
const std::map<QString, QPointer<DebuggerView>>& DockLayout::debuggerViews()
|
||||
{
|
||||
return m_widgets;
|
||||
}
|
||||
|
||||
bool DockLayout::hasDebuggerWidget(const QString& unique_name)
|
||||
bool DockLayout::hasDebuggerView(const QString& unique_name)
|
||||
{
|
||||
return m_widgets.find(unique_name) != m_widgets.end();
|
||||
}
|
||||
|
||||
size_t DockLayout::countDebuggerWidgetsOfType(const char* type)
|
||||
size_t DockLayout::countDebuggerViewsOfType(const char* type)
|
||||
{
|
||||
size_t count = 0;
|
||||
for (const auto& [unique_name, widget] : m_widgets)
|
||||
@@ -376,29 +378,29 @@ size_t DockLayout::countDebuggerWidgetsOfType(const char* type)
|
||||
return count;
|
||||
}
|
||||
|
||||
void DockLayout::createDebuggerWidget(const std::string& type)
|
||||
void DockLayout::createDebuggerView(const std::string& type)
|
||||
{
|
||||
pxAssert(m_is_active);
|
||||
|
||||
if (!g_debugger_window)
|
||||
return;
|
||||
|
||||
auto description_iterator = DockTables::DEBUGGER_WIDGETS.find(type);
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_WIDGETS.end());
|
||||
auto description_iterator = DockTables::DEBUGGER_VIEWS.find(type);
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_VIEWS.end());
|
||||
|
||||
const DockTables::DebuggerWidgetDescription& description = description_iterator->second;
|
||||
const DockTables::DebuggerViewDescription& description = description_iterator->second;
|
||||
|
||||
DebuggerWidgetParameters parameters;
|
||||
parameters.unique_name = generateNewUniqueName(type.c_str());
|
||||
DebuggerViewParameters parameters;
|
||||
std::tie(parameters.unique_name, parameters.id) = generateNewUniqueName(type.c_str());
|
||||
parameters.cpu = &DebugInterface::get(m_cpu);
|
||||
|
||||
if (parameters.unique_name.isEmpty())
|
||||
return;
|
||||
|
||||
DebuggerWidget* widget = description.create_widget(parameters);
|
||||
DebuggerView* widget = description.create_widget(parameters);
|
||||
m_widgets.emplace(parameters.unique_name, widget);
|
||||
|
||||
setPrimaryDebuggerWidget(widget, countDebuggerWidgetsOfType(type.c_str()) == 0);
|
||||
setPrimaryDebuggerView(widget, countDebuggerViewsOfType(type.c_str()) == 0);
|
||||
|
||||
auto view = static_cast<KDDockWidgets::QtWidgets::DockWidget*>(
|
||||
KDDockWidgets::Config::self().viewFactory()->createDockWidget(widget->uniqueName()));
|
||||
@@ -411,55 +413,56 @@ void DockLayout::createDebuggerWidget(const std::string& type)
|
||||
updateDockWidgetTitles();
|
||||
}
|
||||
|
||||
void DockLayout::recreateDebuggerWidget(const QString& unique_name)
|
||||
void DockLayout::recreateDebuggerView(const QString& unique_name)
|
||||
{
|
||||
if (!g_debugger_window)
|
||||
return;
|
||||
|
||||
auto debugger_widget_iterator = m_widgets.find(unique_name);
|
||||
pxAssert(debugger_widget_iterator != m_widgets.end());
|
||||
auto debugger_view_iterator = m_widgets.find(unique_name);
|
||||
pxAssert(debugger_view_iterator != m_widgets.end());
|
||||
|
||||
DebuggerWidget* old_debugger_widget = debugger_widget_iterator->second;
|
||||
DebuggerView* old_debugger_view = debugger_view_iterator->second;
|
||||
|
||||
auto description_iterator = DockTables::DEBUGGER_WIDGETS.find(old_debugger_widget->metaObject()->className());
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_WIDGETS.end());
|
||||
auto description_iterator = DockTables::DEBUGGER_VIEWS.find(old_debugger_view->metaObject()->className());
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_VIEWS.end());
|
||||
|
||||
const DockTables::DebuggerWidgetDescription& description = description_iterator->second;
|
||||
const DockTables::DebuggerViewDescription& description = description_iterator->second;
|
||||
|
||||
DebuggerWidgetParameters parameters;
|
||||
parameters.unique_name = old_debugger_widget->uniqueName();
|
||||
DebuggerViewParameters parameters;
|
||||
parameters.unique_name = old_debugger_view->uniqueName();
|
||||
parameters.id = old_debugger_view->id();
|
||||
parameters.cpu = &DebugInterface::get(m_cpu);
|
||||
parameters.cpu_override = old_debugger_widget->cpuOverride();
|
||||
parameters.cpu_override = old_debugger_view->cpuOverride();
|
||||
|
||||
DebuggerWidget* new_debugger_widget = description.create_widget(parameters);
|
||||
new_debugger_widget->setCustomDisplayName(old_debugger_widget->customDisplayName());
|
||||
new_debugger_widget->setPrimary(old_debugger_widget->isPrimary());
|
||||
debugger_widget_iterator->second = new_debugger_widget;
|
||||
DebuggerView* new_debugger_view = description.create_widget(parameters);
|
||||
new_debugger_view->setCustomDisplayName(old_debugger_view->customDisplayName());
|
||||
new_debugger_view->setPrimary(old_debugger_view->isPrimary());
|
||||
debugger_view_iterator->second = new_debugger_view;
|
||||
|
||||
if (m_is_active)
|
||||
{
|
||||
auto [controller, view] = DockUtils::dockWidgetFromName(unique_name);
|
||||
if (view)
|
||||
view->setWidget(new_debugger_widget);
|
||||
view->setWidget(new_debugger_view);
|
||||
}
|
||||
|
||||
delete old_debugger_widget;
|
||||
delete old_debugger_view;
|
||||
}
|
||||
|
||||
void DockLayout::destroyDebuggerWidget(const QString& unique_name)
|
||||
void DockLayout::destroyDebuggerView(const QString& unique_name)
|
||||
{
|
||||
pxAssert(m_is_active);
|
||||
|
||||
if (!g_debugger_window)
|
||||
return;
|
||||
|
||||
auto debugger_widget_iterator = m_widgets.find(unique_name);
|
||||
if (debugger_widget_iterator == m_widgets.end())
|
||||
auto debugger_view_iterator = m_widgets.find(unique_name);
|
||||
if (debugger_view_iterator == m_widgets.end())
|
||||
return;
|
||||
|
||||
setPrimaryDebuggerWidget(debugger_widget_iterator->second.get(), false);
|
||||
delete debugger_widget_iterator->second.get();
|
||||
m_widgets.erase(debugger_widget_iterator);
|
||||
setPrimaryDebuggerView(debugger_view_iterator->second.get(), false);
|
||||
delete debugger_view_iterator->second.get();
|
||||
m_widgets.erase(debugger_view_iterator);
|
||||
|
||||
auto [controller, view] = DockUtils::dockWidgetFromName(unique_name);
|
||||
if (!controller)
|
||||
@@ -470,7 +473,7 @@ void DockLayout::destroyDebuggerWidget(const QString& unique_name)
|
||||
updateDockWidgetTitles();
|
||||
}
|
||||
|
||||
void DockLayout::setPrimaryDebuggerWidget(DebuggerWidget* widget, bool is_primary)
|
||||
void DockLayout::setPrimaryDebuggerView(DebuggerView* widget, bool is_primary)
|
||||
{
|
||||
bool present = false;
|
||||
for (auto& [unique_name, test_widget] : m_widgets)
|
||||
@@ -545,24 +548,22 @@ bool DockLayout::save(DockLayout::Index layout_index)
|
||||
rapidjson::Document geometry;
|
||||
|
||||
const char* cpu_name = DebugInterface::cpuName(m_cpu);
|
||||
const std::string& default_layouts_hash = DockTables::hashDefaultLayouts();
|
||||
u32 default_layout_hash = DockTables::hashDefaultLayouts();
|
||||
|
||||
rapidjson::Value format;
|
||||
format.SetString(DEBUGGER_LAYOUT_FILE_FORMAT, strlen(DEBUGGER_LAYOUT_FILE_FORMAT));
|
||||
json.AddMember("format", format, json.GetAllocator());
|
||||
|
||||
json.AddMember("version_major", DEBUGGER_LAYOUT_FILE_VERSION_MAJOR, json.GetAllocator());
|
||||
json.AddMember("version_minor", DEBUGGER_LAYOUT_FILE_VERSION_MINOR, json.GetAllocator());
|
||||
rapidjson::Value version_hash;
|
||||
version_hash.SetString(default_layouts_hash.c_str(), default_layouts_hash.size());
|
||||
json.AddMember("version_hash", version_hash, json.GetAllocator());
|
||||
json.AddMember("versionMajor", DEBUGGER_LAYOUT_FILE_VERSION_MAJOR, json.GetAllocator());
|
||||
json.AddMember("versionMinor", DEBUGGER_LAYOUT_FILE_VERSION_MINOR, json.GetAllocator());
|
||||
json.AddMember("defaultLayoutHash", default_layout_hash, json.GetAllocator());
|
||||
|
||||
std::string name_str = m_name.toStdString();
|
||||
json.AddMember("name", rapidjson::Value().SetString(name_str.c_str(), name_str.size()), json.GetAllocator());
|
||||
json.AddMember("target", rapidjson::Value().SetString(cpu_name, strlen(cpu_name)), json.GetAllocator());
|
||||
json.AddMember("index", static_cast<int>(layout_index), json.GetAllocator());
|
||||
json.AddMember("isDefault", m_is_default, json.GetAllocator());
|
||||
json.AddMember("nextUniqueName", m_next_unique_name, json.GetAllocator());
|
||||
json.AddMember("nextId", m_next_id, json.GetAllocator());
|
||||
|
||||
if (!m_base_layout.empty())
|
||||
{
|
||||
@@ -579,7 +580,7 @@ bool DockLayout::save(DockLayout::Index layout_index)
|
||||
json.AddMember("toolbars", toolbars, json.GetAllocator());
|
||||
}
|
||||
|
||||
rapidjson::Value widgets(rapidjson::kArrayType);
|
||||
rapidjson::Value dock_widgets(rapidjson::kArrayType);
|
||||
for (auto& [unique_name, widget] : m_widgets)
|
||||
{
|
||||
pxAssert(widget.get());
|
||||
@@ -590,6 +591,7 @@ bool DockLayout::save(DockLayout::Index layout_index)
|
||||
rapidjson::Value name;
|
||||
name.SetString(name_str.c_str(), name_str.size(), json.GetAllocator());
|
||||
object.AddMember("uniqueName", name, json.GetAllocator());
|
||||
object.AddMember("id", widget->id(), json.GetAllocator());
|
||||
|
||||
const char* type_str = widget->metaObject()->className();
|
||||
rapidjson::Value type;
|
||||
@@ -608,9 +610,9 @@ bool DockLayout::save(DockLayout::Index layout_index)
|
||||
JsonValueWrapper wrapper(object, json.GetAllocator());
|
||||
widget->toJson(wrapper);
|
||||
|
||||
widgets.PushBack(object, json.GetAllocator());
|
||||
dock_widgets.PushBack(object, json.GetAllocator());
|
||||
}
|
||||
json.AddMember("widgets", widgets, json.GetAllocator());
|
||||
json.AddMember("dockWidgets", dock_widgets, json.GetAllocator());
|
||||
|
||||
if (!m_geometry.isEmpty() && !geometry.Parse(m_geometry).HasParseError())
|
||||
json.AddMember("geometry", geometry, json.GetAllocator());
|
||||
@@ -687,11 +689,11 @@ void DockLayout::load(
|
||||
return;
|
||||
}
|
||||
|
||||
auto version_major = json.FindMember("version_major");
|
||||
auto version_major = json.FindMember("versionMajor");
|
||||
if (version_major == json.MemberEnd() || !version_major->value.IsInt())
|
||||
{
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'version_major' property.", path.c_str());
|
||||
result = INVALID_FORMAT;
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'versionMajor' property.", path.c_str());
|
||||
result = MAJOR_VERSION_MISMATCH;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -701,23 +703,23 @@ void DockLayout::load(
|
||||
return;
|
||||
}
|
||||
|
||||
auto version_minor = json.FindMember("version_minor");
|
||||
auto version_minor = json.FindMember("versionMinor");
|
||||
if (version_minor == json.MemberEnd() || !version_minor->value.IsInt())
|
||||
{
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'version_minor' property.", path.c_str());
|
||||
result = INVALID_FORMAT;
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'versionMinor' property.", path.c_str());
|
||||
result = MAJOR_VERSION_MISMATCH;
|
||||
return;
|
||||
}
|
||||
|
||||
auto version_hash = json.FindMember("version_hash");
|
||||
if (version_hash == json.MemberEnd() || !version_hash->value.IsString())
|
||||
auto default_layout_hash = json.FindMember("defaultLayoutHash");
|
||||
if (default_layout_hash == json.MemberEnd() || !default_layout_hash->value.IsUint())
|
||||
{
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'version_hash' property.", path.c_str());
|
||||
result = INVALID_FORMAT;
|
||||
Console.Error("Debugger: Layout file '%s' has missing or invalid 'defaultLayoutHash' property.", path.c_str());
|
||||
result = MAJOR_VERSION_MISMATCH;
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(version_hash->value.GetString(), DockTables::hashDefaultLayouts().c_str()) != 0)
|
||||
if (default_layout_hash->value.GetUint() != DockTables::hashDefaultLayouts())
|
||||
result = DEFAULT_LAYOUT_HASH_MISMATCH;
|
||||
|
||||
auto name = json.FindMember("name");
|
||||
@@ -745,9 +747,9 @@ void DockLayout::load(
|
||||
if (is_default != json.MemberEnd() && is_default->value.IsBool())
|
||||
m_is_default = is_default->value.GetBool();
|
||||
|
||||
auto next_unique_name = json.FindMember("nextUniqueName");
|
||||
if (next_unique_name != json.MemberBegin() && next_unique_name->value.IsInt())
|
||||
m_next_unique_name = next_unique_name->value.GetInt();
|
||||
auto next_id = json.FindMember("nextId");
|
||||
if (next_id != json.MemberBegin() && next_id->value.IsUint64())
|
||||
m_next_id = next_id->value.GetUint64();
|
||||
|
||||
auto base_layout = json.FindMember("baseLayout");
|
||||
if (base_layout != json.MemberEnd() && base_layout->value.IsString())
|
||||
@@ -757,15 +759,19 @@ void DockLayout::load(
|
||||
if (toolbars != json.MemberEnd() && toolbars->value.IsString())
|
||||
m_toolbars = QByteArray::fromBase64(toolbars->value.GetString());
|
||||
|
||||
auto widgets = json.FindMember("widgets");
|
||||
if (widgets != json.MemberEnd() && widgets->value.IsArray())
|
||||
auto dock_widgets = json.FindMember("dockWidgets");
|
||||
if (dock_widgets != json.MemberEnd() && dock_widgets->value.IsArray())
|
||||
{
|
||||
for (rapidjson::Value& object : widgets->value.GetArray())
|
||||
for (rapidjson::Value& object : dock_widgets->value.GetArray())
|
||||
{
|
||||
auto unique_name = object.FindMember("uniqueName");
|
||||
if (unique_name == object.MemberEnd() || !unique_name->value.IsString())
|
||||
continue;
|
||||
|
||||
auto id = object.FindMember("id");
|
||||
if (id == object.MemberEnd() || !id->value.IsUint64())
|
||||
continue;
|
||||
|
||||
auto widgets_iterator = m_widgets.find(unique_name->value.GetString());
|
||||
if (widgets_iterator != m_widgets.end())
|
||||
continue;
|
||||
@@ -774,8 +780,8 @@ void DockLayout::load(
|
||||
if (type == object.MemberEnd() || !type->value.IsString())
|
||||
continue;
|
||||
|
||||
auto description = DockTables::DEBUGGER_WIDGETS.find(type->value.GetString());
|
||||
if (description == DockTables::DEBUGGER_WIDGETS.end())
|
||||
auto description = DockTables::DEBUGGER_VIEWS.find(type->value.GetString());
|
||||
if (description == DockTables::DEBUGGER_VIEWS.end())
|
||||
continue;
|
||||
|
||||
std::optional<BreakPointCpu> cpu_override;
|
||||
@@ -788,12 +794,13 @@ void DockLayout::load(
|
||||
cpu_override = cpu;
|
||||
}
|
||||
|
||||
DebuggerWidgetParameters parameters;
|
||||
DebuggerViewParameters parameters;
|
||||
parameters.unique_name = unique_name->value.GetString();
|
||||
parameters.id = id->value.GetUint64();
|
||||
parameters.cpu = &DebugInterface::get(m_cpu);
|
||||
parameters.cpu_override = cpu_override;
|
||||
|
||||
DebuggerWidget* widget = description->second.create_widget(parameters);
|
||||
DebuggerView* widget = description->second.create_widget(parameters);
|
||||
|
||||
JsonValueWrapper wrapper(object, json.GetAllocator());
|
||||
if (!widget->fromJson(wrapper))
|
||||
@@ -818,12 +825,12 @@ void DockLayout::load(
|
||||
|
||||
m_layout_file_path = path;
|
||||
|
||||
validatePrimaryDebuggerWidgets();
|
||||
validatePrimaryDebuggerViews();
|
||||
}
|
||||
|
||||
void DockLayout::validatePrimaryDebuggerWidgets()
|
||||
void DockLayout::validatePrimaryDebuggerViews()
|
||||
{
|
||||
std::map<std::string, std::vector<DebuggerWidget*>> type_to_widgets;
|
||||
std::map<std::string, std::vector<DebuggerView*>> type_to_widgets;
|
||||
for (const auto& [unique_name, widget] : m_widgets)
|
||||
type_to_widgets[widget->metaObject()->className()].emplace_back(widget.get());
|
||||
|
||||
@@ -832,7 +839,7 @@ void DockLayout::validatePrimaryDebuggerWidgets()
|
||||
u32 primary_widgets = 0;
|
||||
|
||||
// Make sure at most one widget is marked as primary.
|
||||
for (DebuggerWidget* widget : widgets)
|
||||
for (DebuggerView* widget : widgets)
|
||||
{
|
||||
if (widget->isPrimary())
|
||||
{
|
||||
@@ -868,7 +875,7 @@ void DockLayout::setupDefaultLayout()
|
||||
const DockTables::DefaultDockGroupDescription& group =
|
||||
base_layout->groups[static_cast<u32>(dock_description.group)];
|
||||
|
||||
DebuggerWidget* widget = nullptr;
|
||||
DebuggerView* widget = nullptr;
|
||||
for (auto& [unique_name, test_widget] : m_widgets)
|
||||
if (test_widget->metaObject()->className() == dock_description.type)
|
||||
widget = test_widget;
|
||||
@@ -900,19 +907,20 @@ void DockLayout::setupDefaultLayout()
|
||||
group->setCurrentTabIndex(0);
|
||||
}
|
||||
|
||||
QString DockLayout::generateNewUniqueName(const char* type)
|
||||
std::pair<QString, u64> DockLayout::generateNewUniqueName(const char* type)
|
||||
{
|
||||
QString name;
|
||||
u64 id;
|
||||
|
||||
do
|
||||
{
|
||||
if (m_next_unique_name == INT_MAX)
|
||||
return QString();
|
||||
if (m_next_id == INT_MAX)
|
||||
return {QString(), 0};
|
||||
|
||||
// Produce unique names that will lexicographically sort in the order
|
||||
// they were allocated. This ensures the #1, #2, etc suffixes for dock
|
||||
// widgets with conflicting names will be assigned in the correct order.
|
||||
name = QStringLiteral("%1-%2").arg(m_next_unique_name, 16, 10, QLatin1Char('0')).arg(type);
|
||||
m_next_unique_name++;
|
||||
} while (hasDebuggerWidget(name));
|
||||
return name;
|
||||
id = m_next_id;
|
||||
name = QStringLiteral("%1-%2").arg(type).arg(static_cast<qulonglong>(m_next_id));
|
||||
m_next_id++;
|
||||
} while (hasDebuggerView(name));
|
||||
|
||||
return {name, id};
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
#include <QtCore/QPointer>
|
||||
|
||||
class DebuggerWidget;
|
||||
class DebuggerView;
|
||||
class DebuggerWindow;
|
||||
|
||||
extern const char* DEBUGGER_LAYOUT_FILE_FORMAT;
|
||||
@@ -97,13 +97,13 @@ public:
|
||||
KDDockWidgets::Core::DockWidget* createDockWidget(const QString& name);
|
||||
void updateDockWidgetTitles();
|
||||
|
||||
const std::map<QString, QPointer<DebuggerWidget>>& debuggerWidgets();
|
||||
bool hasDebuggerWidget(const QString& unique_name);
|
||||
size_t countDebuggerWidgetsOfType(const char* type);
|
||||
void createDebuggerWidget(const std::string& type);
|
||||
void recreateDebuggerWidget(const QString& unique_name);
|
||||
void destroyDebuggerWidget(const QString& unique_name);
|
||||
void setPrimaryDebuggerWidget(DebuggerWidget* widget, bool is_primary);
|
||||
const std::map<QString, QPointer<DebuggerView>>& debuggerViews();
|
||||
bool hasDebuggerView(const QString& unique_name);
|
||||
size_t countDebuggerViewsOfType(const char* type);
|
||||
void createDebuggerView(const std::string& type);
|
||||
void recreateDebuggerView(const QString& unique_name);
|
||||
void destroyDebuggerView(const QString& unique_name);
|
||||
void setPrimaryDebuggerView(DebuggerView* widget, bool is_primary);
|
||||
|
||||
void deleteFile();
|
||||
|
||||
@@ -115,12 +115,12 @@ private:
|
||||
DockLayout::LoadResult& result,
|
||||
DockLayout::Index& index_last_session);
|
||||
|
||||
// Make sure there is only a single primary debugger widget of each type.
|
||||
void validatePrimaryDebuggerWidgets();
|
||||
// Make sure there is only a single primary debugger view of each type.
|
||||
void validatePrimaryDebuggerViews();
|
||||
|
||||
void setupDefaultLayout();
|
||||
|
||||
QString generateNewUniqueName(const char* type);
|
||||
std::pair<QString, u64> generateNewUniqueName(const char* type);
|
||||
|
||||
// The name displayed in the user interface. Also used to determine the
|
||||
// file name for the layout file.
|
||||
@@ -134,7 +134,7 @@ private:
|
||||
bool m_is_default = false;
|
||||
|
||||
// A counter used to generate new unique names for dock widgets.
|
||||
int m_next_unique_name = 0;
|
||||
u64 m_next_id = 0;
|
||||
|
||||
// The name of the default layout which this layout was based on. This will
|
||||
// be used if the m_geometry variable above is empty.
|
||||
@@ -147,7 +147,7 @@ private:
|
||||
// All the dock widgets currently open in this layout. If this is the active
|
||||
// layout then these will be owned by the docking system, otherwise they
|
||||
// won't be and will need to be cleaned up separately.
|
||||
std::map<QString, QPointer<DebuggerWidget>> m_widgets;
|
||||
std::map<QString, QPointer<DebuggerView>> m_widgets;
|
||||
|
||||
// The geometry of all the dock widgets, converted to JSON by the
|
||||
// LayoutSaver class from KDDockWidgets.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "DockManager.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
#include "Debugger/Docking/DockTables.h"
|
||||
#include "Debugger/Docking/DockViews.h"
|
||||
@@ -185,7 +185,6 @@ void DockManager::loadLayouts()
|
||||
&files);
|
||||
|
||||
bool needs_reset = false;
|
||||
bool order_changed = false;
|
||||
std::vector<DockLayout::Index> indices_last_session;
|
||||
|
||||
for (const FILESYSTEM_FIND_DATA& ffd : files)
|
||||
@@ -234,29 +233,30 @@ void DockManager::loadLayouts()
|
||||
layout.save(index);
|
||||
}
|
||||
|
||||
if (index_last_session != index)
|
||||
order_changed = true;
|
||||
|
||||
indices_last_session.emplace_back(index_last_session);
|
||||
}
|
||||
|
||||
// Make sure the layouts remain in the same order they were in previously.
|
||||
std::vector<DockLayout*> layout_pointers;
|
||||
for (DockLayout& layout : m_layouts)
|
||||
layout_pointers.emplace_back(&layout);
|
||||
std::vector<size_t> layout_indices;
|
||||
for (size_t i = 0; i < m_layouts.size(); i++)
|
||||
layout_indices.emplace_back(i);
|
||||
|
||||
std::sort(layout_pointers.begin(), layout_pointers.end(),
|
||||
[this, &indices_last_session](const DockLayout* lhs, const DockLayout* rhs) {
|
||||
size_t lhs_index = lhs - m_layouts.data();
|
||||
size_t rhs_index = rhs - m_layouts.data();
|
||||
DockLayout::Index lhs_index_last_session = indices_last_session.at(lhs_index);
|
||||
DockLayout::Index rhs_index_last_session = indices_last_session.at(rhs_index);
|
||||
std::sort(layout_indices.begin(), layout_indices.end(),
|
||||
[&indices_last_session](size_t lhs, size_t rhs) {
|
||||
DockLayout::Index lhs_index_last_session = indices_last_session.at(lhs);
|
||||
DockLayout::Index rhs_index_last_session = indices_last_session.at(rhs);
|
||||
return lhs_index_last_session < rhs_index_last_session;
|
||||
});
|
||||
|
||||
bool order_changed = false;
|
||||
std::vector<DockLayout> sorted_layouts;
|
||||
for (size_t i = 0; i < layout_pointers.size(); i++)
|
||||
sorted_layouts.emplace_back(std::move(*layout_pointers[i]));
|
||||
for (size_t i = 0; i < layout_indices.size(); i++)
|
||||
{
|
||||
if (i != indices_last_session[layout_indices[i]])
|
||||
order_changed = true;
|
||||
|
||||
sorted_layouts.emplace_back(std::move(m_layouts[layout_indices[i]]));
|
||||
}
|
||||
|
||||
m_layouts = std::move(sorted_layouts);
|
||||
|
||||
@@ -359,9 +359,9 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
// be opened.
|
||||
QMenu* add_another_menu = menu->addMenu(tr("Add Another..."));
|
||||
|
||||
std::vector<DebuggerWidget*> add_another_widgets;
|
||||
std::vector<DebuggerView*> add_another_widgets;
|
||||
std::set<std::string> add_another_types;
|
||||
for (const auto& [unique_name, widget] : layout.debuggerWidgets())
|
||||
for (const auto& [unique_name, widget] : layout.debuggerViews())
|
||||
{
|
||||
std::string type = widget->metaObject()->className();
|
||||
|
||||
@@ -373,26 +373,26 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
}
|
||||
|
||||
std::sort(add_another_widgets.begin(), add_another_widgets.end(),
|
||||
[](const DebuggerWidget* lhs, const DebuggerWidget* rhs) {
|
||||
[](const DebuggerView* lhs, const DebuggerView* rhs) {
|
||||
if (lhs->displayNameWithoutSuffix() == rhs->displayNameWithoutSuffix())
|
||||
return lhs->displayNameSuffixNumber() < rhs->displayNameSuffixNumber();
|
||||
|
||||
return lhs->displayNameWithoutSuffix() < rhs->displayNameWithoutSuffix();
|
||||
});
|
||||
|
||||
for (DebuggerWidget* widget : add_another_widgets)
|
||||
for (DebuggerView* widget : add_another_widgets)
|
||||
{
|
||||
const char* type = widget->metaObject()->className();
|
||||
|
||||
const auto description_iterator = DockTables::DEBUGGER_WIDGETS.find(type);
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_WIDGETS.end());
|
||||
const auto description_iterator = DockTables::DEBUGGER_VIEWS.find(type);
|
||||
pxAssert(description_iterator != DockTables::DEBUGGER_VIEWS.end());
|
||||
|
||||
QAction* action = add_another_menu->addAction(description_iterator->second.display_name);
|
||||
connect(action, &QAction::triggered, this, [this, type]() {
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).createDebuggerWidget(type);
|
||||
m_layouts.at(m_current_layout).createDebuggerView(type);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -401,18 +401,18 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
struct DebuggerWidgetToggle
|
||||
struct DebuggerViewToggle
|
||||
{
|
||||
QString display_name;
|
||||
std::optional<int> suffix_number;
|
||||
QAction* action;
|
||||
};
|
||||
|
||||
std::vector<DebuggerWidgetToggle> toggles;
|
||||
std::vector<DebuggerViewToggle> toggles;
|
||||
std::set<std::string> toggle_types;
|
||||
|
||||
// Create a menu item for each open debugger widget.
|
||||
for (const auto& [unique_name, widget] : layout.debuggerWidgets())
|
||||
// Create a menu item for each open debugger view.
|
||||
for (const auto& [unique_name, widget] : layout.debuggerViews())
|
||||
{
|
||||
QAction* action = new QAction(menu);
|
||||
action->setText(widget->displayName());
|
||||
@@ -422,10 +422,10 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).destroyDebuggerWidget(unique_name);
|
||||
m_layouts.at(m_current_layout).destroyDebuggerView(unique_name);
|
||||
});
|
||||
|
||||
DebuggerWidgetToggle& toggle = toggles.emplace_back();
|
||||
DebuggerViewToggle& toggle = toggles.emplace_back();
|
||||
toggle.display_name = widget->displayNameWithoutSuffix();
|
||||
toggle.suffix_number = widget->displayNameSuffixNumber();
|
||||
toggle.action = action;
|
||||
@@ -433,12 +433,12 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
toggle_types.emplace(widget->metaObject()->className());
|
||||
}
|
||||
|
||||
// Create menu items to open debugger widgets without any open instances.
|
||||
for (const auto& [type, desc] : DockTables::DEBUGGER_WIDGETS)
|
||||
// Create menu items to open debugger views without any open instances.
|
||||
for (const auto& [type, desc] : DockTables::DEBUGGER_VIEWS)
|
||||
{
|
||||
if (!toggle_types.contains(type))
|
||||
{
|
||||
QString display_name = QCoreApplication::translate("DebuggerWidget", desc.display_name);
|
||||
QString display_name = QCoreApplication::translate("DebuggerView", desc.display_name);
|
||||
|
||||
QAction* action = new QAction(menu);
|
||||
action->setText(display_name);
|
||||
@@ -448,10 +448,10 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).createDebuggerWidget(type);
|
||||
m_layouts.at(m_current_layout).createDebuggerView(type);
|
||||
});
|
||||
|
||||
DebuggerWidgetToggle& toggle = toggles.emplace_back();
|
||||
DebuggerViewToggle& toggle = toggles.emplace_back();
|
||||
toggle.display_name = display_name;
|
||||
toggle.suffix_number = std::nullopt;
|
||||
toggle.action = action;
|
||||
@@ -459,14 +459,14 @@ void DockManager::createWindowsMenu(QMenu* menu)
|
||||
}
|
||||
|
||||
std::sort(toggles.begin(), toggles.end(),
|
||||
[](const DebuggerWidgetToggle& lhs, const DebuggerWidgetToggle& rhs) {
|
||||
[](const DebuggerViewToggle& lhs, const DebuggerViewToggle& rhs) {
|
||||
if (lhs.display_name == rhs.display_name)
|
||||
return lhs.suffix_number < rhs.suffix_number;
|
||||
|
||||
return lhs.display_name < rhs.display_name;
|
||||
});
|
||||
|
||||
for (const DebuggerWidgetToggle& toggle : toggles)
|
||||
for (const DebuggerViewToggle& toggle : toggles)
|
||||
menu->addAction(toggle.action);
|
||||
}
|
||||
|
||||
@@ -702,53 +702,53 @@ void DockManager::updateDockWidgetTitles()
|
||||
m_layouts.at(m_current_layout).updateDockWidgetTitles();
|
||||
}
|
||||
|
||||
const std::map<QString, QPointer<DebuggerWidget>>& DockManager::debuggerWidgets()
|
||||
const std::map<QString, QPointer<DebuggerView>>& DockManager::debuggerViews()
|
||||
{
|
||||
static std::map<QString, QPointer<DebuggerWidget>> dummy;
|
||||
static std::map<QString, QPointer<DebuggerView>> dummy;
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return dummy;
|
||||
|
||||
return m_layouts.at(m_current_layout).debuggerWidgets();
|
||||
return m_layouts.at(m_current_layout).debuggerViews();
|
||||
}
|
||||
|
||||
size_t DockManager::countDebuggerWidgetsOfType(const char* type)
|
||||
size_t DockManager::countDebuggerViewsOfType(const char* type)
|
||||
{
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return 0;
|
||||
|
||||
return m_layouts.at(m_current_layout).countDebuggerWidgetsOfType(type);
|
||||
return m_layouts.at(m_current_layout).countDebuggerViewsOfType(type);
|
||||
}
|
||||
|
||||
void DockManager::recreateDebuggerWidget(const QString& unique_name)
|
||||
void DockManager::recreateDebuggerView(const QString& unique_name)
|
||||
{
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).recreateDebuggerWidget(unique_name);
|
||||
m_layouts.at(m_current_layout).recreateDebuggerView(unique_name);
|
||||
}
|
||||
|
||||
void DockManager::destroyDebuggerWidget(const QString& unique_name)
|
||||
void DockManager::destroyDebuggerView(const QString& unique_name)
|
||||
{
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).destroyDebuggerWidget(unique_name);
|
||||
m_layouts.at(m_current_layout).destroyDebuggerView(unique_name);
|
||||
}
|
||||
|
||||
void DockManager::setPrimaryDebuggerWidget(DebuggerWidget* widget, bool is_primary)
|
||||
void DockManager::setPrimaryDebuggerView(DebuggerView* widget, bool is_primary)
|
||||
{
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
m_layouts.at(m_current_layout).setPrimaryDebuggerWidget(widget, is_primary);
|
||||
m_layouts.at(m_current_layout).setPrimaryDebuggerView(widget, is_primary);
|
||||
}
|
||||
|
||||
void DockManager::switchToDebuggerWidget(DebuggerWidget* widget)
|
||||
void DockManager::switchToDebuggerView(DebuggerView* widget)
|
||||
{
|
||||
if (m_current_layout == DockLayout::INVALID_INDEX)
|
||||
return;
|
||||
|
||||
for (const auto& [unique_name, test_widget] : m_layouts.at(m_current_layout).debuggerWidgets())
|
||||
for (const auto& [unique_name, test_widget] : m_layouts.at(m_current_layout).debuggerViews())
|
||||
{
|
||||
if (widget == test_widget)
|
||||
{
|
||||
@@ -765,7 +765,7 @@ void DockManager::updateTheme()
|
||||
m_menu_bar->updateTheme();
|
||||
|
||||
for (DockLayout& layout : m_layouts)
|
||||
for (const auto& [unique_name, widget] : layout.debuggerWidgets())
|
||||
for (const auto& [unique_name, widget] : layout.debuggerViews())
|
||||
widget->updateStyleSheet();
|
||||
|
||||
// KDDockWidgets::QtWidgets::TabBar sets its own style to a subclass of
|
||||
|
||||
@@ -82,12 +82,12 @@ public:
|
||||
|
||||
void updateDockWidgetTitles();
|
||||
|
||||
const std::map<QString, QPointer<DebuggerWidget>>& debuggerWidgets();
|
||||
size_t countDebuggerWidgetsOfType(const char* type);
|
||||
void recreateDebuggerWidget(const QString& unique_name);
|
||||
void destroyDebuggerWidget(const QString& unique_name);
|
||||
void setPrimaryDebuggerWidget(DebuggerWidget* widget, bool is_primary);
|
||||
void switchToDebuggerWidget(DebuggerWidget* widget);
|
||||
const std::map<QString, QPointer<DebuggerView>>& debuggerViews();
|
||||
size_t countDebuggerViewsOfType(const char* type);
|
||||
void recreateDebuggerView(const QString& unique_name);
|
||||
void destroyDebuggerView(const QString& unique_name);
|
||||
void setPrimaryDebuggerView(DebuggerView* widget, bool is_primary);
|
||||
void switchToDebuggerView(DebuggerView* widget);
|
||||
|
||||
void updateTheme();
|
||||
|
||||
|
||||
@@ -4,28 +4,30 @@
|
||||
#include "DockTables.h"
|
||||
|
||||
#include "Debugger/DebuggerEvents.h"
|
||||
#include "Debugger/DisassemblyWidget.h"
|
||||
#include "Debugger/RegisterWidget.h"
|
||||
#include "Debugger/StackWidget.h"
|
||||
#include "Debugger/ThreadWidget.h"
|
||||
#include "Debugger/Breakpoints/BreakpointWidget.h"
|
||||
#include "Debugger/Memory/MemorySearchWidget.h"
|
||||
#include "Debugger/Memory/MemoryViewWidget.h"
|
||||
#include "Debugger/Memory/SavedAddressesWidget.h"
|
||||
#include "Debugger/SymbolTree/SymbolTreeWidgets.h"
|
||||
|
||||
#include "common/MD5Digest.h"
|
||||
|
||||
#include "fmt/format.h"
|
||||
#include "Debugger/DisassemblyView.h"
|
||||
#include "Debugger/RegisterView.h"
|
||||
#include "Debugger/StackView.h"
|
||||
#include "Debugger/ThreadView.h"
|
||||
#include "Debugger/Breakpoints/BreakpointView.h"
|
||||
#include "Debugger/Memory/MemorySearchView.h"
|
||||
#include "Debugger/Memory/MemoryView.h"
|
||||
#include "Debugger/Memory/SavedAddressesView.h"
|
||||
#include "Debugger/SymbolTree/SymbolTreeViews.h"
|
||||
|
||||
using namespace DockUtils;
|
||||
|
||||
#define DEBUGGER_WIDGET(type, display_name, preferred_location) \
|
||||
static void hashDefaultLayout(const DockTables::DefaultDockLayout& layout, u32& hash);
|
||||
static void hashDefaultGroup(const DockTables::DefaultDockGroupDescription& group, u32& hash);
|
||||
static void hashDefaultDockWidget(const DockTables::DefaultDockWidgetDescription& widget, u32& hash);
|
||||
static void hashNumber(u32 number, u32& hash);
|
||||
static void hashString(const char* string, u32& hash);
|
||||
|
||||
#define DEBUGGER_VIEW(type, display_name, preferred_location) \
|
||||
{ \
|
||||
#type, \
|
||||
{ \
|
||||
[](const DebuggerWidgetParameters& parameters) -> DebuggerWidget* { \
|
||||
DebuggerWidget* widget = new type(parameters); \
|
||||
[](const DebuggerViewParameters& parameters) -> DebuggerView* { \
|
||||
DebuggerView* widget = new type(parameters); \
|
||||
widget->handleEvent(DebuggerEvents::Refresh()); \
|
||||
return widget; \
|
||||
}, \
|
||||
@@ -34,22 +36,22 @@ using namespace DockUtils;
|
||||
} \
|
||||
}
|
||||
|
||||
const std::map<std::string, DockTables::DebuggerWidgetDescription> DockTables::DEBUGGER_WIDGETS = {
|
||||
DEBUGGER_WIDGET(BreakpointWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Breakpoints"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(DisassemblyWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Disassembly"), TOP_RIGHT),
|
||||
DEBUGGER_WIDGET(FunctionTreeWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Functions"), TOP_LEFT),
|
||||
DEBUGGER_WIDGET(GlobalVariableTreeWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Globals"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(LocalVariableTreeWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Locals"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(MemorySearchWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Memory Search"), TOP_LEFT),
|
||||
DEBUGGER_WIDGET(MemoryViewWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Memory"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(ParameterVariableTreeWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Parameters"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(RegisterWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Registers"), TOP_LEFT),
|
||||
DEBUGGER_WIDGET(SavedAddressesWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Saved Addresses"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(StackWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Stack"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_WIDGET(ThreadWidget, QT_TRANSLATE_NOOP("DebuggerWidget", "Threads"), BOTTOM_MIDDLE),
|
||||
const std::map<std::string, DockTables::DebuggerViewDescription> DockTables::DEBUGGER_VIEWS = {
|
||||
DEBUGGER_VIEW(BreakpointView, QT_TRANSLATE_NOOP("DebuggerView", "Breakpoints"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(DisassemblyView, QT_TRANSLATE_NOOP("DebuggerView", "Disassembly"), TOP_RIGHT),
|
||||
DEBUGGER_VIEW(FunctionTreeView, QT_TRANSLATE_NOOP("DebuggerView", "Functions"), TOP_LEFT),
|
||||
DEBUGGER_VIEW(GlobalVariableTreeView, QT_TRANSLATE_NOOP("DebuggerView", "Globals"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(LocalVariableTreeView, QT_TRANSLATE_NOOP("DebuggerView", "Locals"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(MemorySearchView, QT_TRANSLATE_NOOP("DebuggerView", "Memory Search"), TOP_LEFT),
|
||||
DEBUGGER_VIEW(MemoryView, QT_TRANSLATE_NOOP("DebuggerView", "Memory"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(ParameterVariableTreeView, QT_TRANSLATE_NOOP("DebuggerView", "Parameters"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(RegisterView, QT_TRANSLATE_NOOP("DebuggerView", "Registers"), TOP_LEFT),
|
||||
DEBUGGER_VIEW(SavedAddressesView, QT_TRANSLATE_NOOP("DebuggerView", "Saved Addresses"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(StackView, QT_TRANSLATE_NOOP("DebuggerView", "Stack"), BOTTOM_MIDDLE),
|
||||
DEBUGGER_VIEW(ThreadView, QT_TRANSLATE_NOOP("DebuggerView", "Threads"), BOTTOM_MIDDLE),
|
||||
};
|
||||
|
||||
#undef DEBUGGER_WIDGET
|
||||
#undef DEBUGGER_VIEW
|
||||
|
||||
const std::vector<DockTables::DefaultDockLayout> DockTables::DEFAULT_DOCK_LAYOUTS = {
|
||||
{
|
||||
@@ -62,20 +64,20 @@ const std::vector<DockTables::DefaultDockLayout> DockTables::DEFAULT_DOCK_LAYOUT
|
||||
},
|
||||
.widgets = {
|
||||
/* DefaultDockGroup::TOP_RIGHT */
|
||||
{"DisassemblyWidget", DefaultDockGroup::TOP_RIGHT},
|
||||
{"DisassemblyView", DefaultDockGroup::TOP_RIGHT},
|
||||
/* DefaultDockGroup::BOTTOM */
|
||||
{"MemoryViewWidget", DefaultDockGroup::BOTTOM},
|
||||
{"BreakpointWidget", DefaultDockGroup::BOTTOM},
|
||||
{"ThreadWidget", DefaultDockGroup::BOTTOM},
|
||||
{"StackWidget", DefaultDockGroup::BOTTOM},
|
||||
{"SavedAddressesWidget", DefaultDockGroup::BOTTOM},
|
||||
{"GlobalVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"LocalVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"ParameterVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"MemoryView", DefaultDockGroup::BOTTOM},
|
||||
{"BreakpointView", DefaultDockGroup::BOTTOM},
|
||||
{"ThreadView", DefaultDockGroup::BOTTOM},
|
||||
{"StackView", DefaultDockGroup::BOTTOM},
|
||||
{"SavedAddressesView", DefaultDockGroup::BOTTOM},
|
||||
{"GlobalVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
{"LocalVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
{"ParameterVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
/* DefaultDockGroup::TOP_LEFT */
|
||||
{"RegisterWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"FunctionTreeWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"MemorySearchWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"RegisterView", DefaultDockGroup::TOP_LEFT},
|
||||
{"FunctionTreeView", DefaultDockGroup::TOP_LEFT},
|
||||
{"MemorySearchView", DefaultDockGroup::TOP_LEFT},
|
||||
},
|
||||
.toolbars = {
|
||||
"toolBarDebug",
|
||||
@@ -92,20 +94,20 @@ const std::vector<DockTables::DefaultDockLayout> DockTables::DEFAULT_DOCK_LAYOUT
|
||||
},
|
||||
.widgets = {
|
||||
/* DefaultDockGroup::TOP_RIGHT */
|
||||
{"DisassemblyWidget", DefaultDockGroup::TOP_RIGHT},
|
||||
{"DisassemblyView", DefaultDockGroup::TOP_RIGHT},
|
||||
/* DefaultDockGroup::BOTTOM */
|
||||
{"MemoryViewWidget", DefaultDockGroup::BOTTOM},
|
||||
{"BreakpointWidget", DefaultDockGroup::BOTTOM},
|
||||
{"ThreadWidget", DefaultDockGroup::BOTTOM},
|
||||
{"StackWidget", DefaultDockGroup::BOTTOM},
|
||||
{"SavedAddressesWidget", DefaultDockGroup::BOTTOM},
|
||||
{"GlobalVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"LocalVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"ParameterVariableTreeWidget", DefaultDockGroup::BOTTOM},
|
||||
{"MemoryView", DefaultDockGroup::BOTTOM},
|
||||
{"BreakpointView", DefaultDockGroup::BOTTOM},
|
||||
{"ThreadView", DefaultDockGroup::BOTTOM},
|
||||
{"StackView", DefaultDockGroup::BOTTOM},
|
||||
{"SavedAddressesView", DefaultDockGroup::BOTTOM},
|
||||
{"GlobalVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
{"LocalVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
{"ParameterVariableTreeView", DefaultDockGroup::BOTTOM},
|
||||
/* DefaultDockGroup::TOP_LEFT */
|
||||
{"RegisterWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"FunctionTreeWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"MemorySearchWidget", DefaultDockGroup::TOP_LEFT},
|
||||
{"RegisterView", DefaultDockGroup::TOP_LEFT},
|
||||
{"FunctionTreeView", DefaultDockGroup::TOP_LEFT},
|
||||
{"MemorySearchView", DefaultDockGroup::TOP_LEFT},
|
||||
},
|
||||
.toolbars = {
|
||||
"toolBarDebug",
|
||||
@@ -123,67 +125,43 @@ const DockTables::DefaultDockLayout* DockTables::defaultLayout(const std::string
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const std::string& DockTables::hashDefaultLayouts()
|
||||
u32 DockTables::hashDefaultLayouts()
|
||||
{
|
||||
static std::string hash;
|
||||
if (!hash.empty())
|
||||
return hash;
|
||||
static std::optional<u32> hash;
|
||||
if (hash.has_value())
|
||||
return *hash;
|
||||
|
||||
MD5Digest md5;
|
||||
hash.emplace(0);
|
||||
|
||||
u32 hash_version = 1;
|
||||
md5.Update(&hash_version, sizeof(hash_version));
|
||||
|
||||
u32 layout_count = static_cast<u32>(DEFAULT_DOCK_LAYOUTS.size());
|
||||
md5.Update(&layout_count, sizeof(layout_count));
|
||||
u32 hash_version = 2;
|
||||
hashNumber(hash_version, *hash);
|
||||
|
||||
hashNumber(static_cast<u32>(DEFAULT_DOCK_LAYOUTS.size()), *hash);
|
||||
for (const DefaultDockLayout& layout : DEFAULT_DOCK_LAYOUTS)
|
||||
hashDefaultLayout(layout, md5);
|
||||
hashDefaultLayout(layout, *hash);
|
||||
|
||||
u8 digest[16];
|
||||
md5.Final(digest);
|
||||
hash = fmt::format(
|
||||
"{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}",
|
||||
digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7],
|
||||
digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]);
|
||||
|
||||
return hash;
|
||||
return *hash;
|
||||
}
|
||||
|
||||
void DockTables::hashDefaultLayout(const DefaultDockLayout& layout, MD5Digest& md5)
|
||||
static void hashDefaultLayout(const DockTables::DefaultDockLayout& layout, u32& hash)
|
||||
{
|
||||
u32 layout_name_size = static_cast<u32>(layout.name.size());
|
||||
md5.Update(&layout_name_size, sizeof(layout_name_size));
|
||||
md5.Update(layout.name.data(), layout_name_size);
|
||||
hashString(layout.name.c_str(), hash);
|
||||
hashString(DebugInterface::cpuName(layout.cpu), hash);
|
||||
|
||||
const char* cpu_name = DebugInterface::cpuName(layout.cpu);
|
||||
u32 cpu_name_size = static_cast<u32>(strlen(cpu_name));
|
||||
md5.Update(&cpu_name_size, sizeof(cpu_name_size));
|
||||
md5.Update(cpu_name, cpu_name_size);
|
||||
hashNumber(static_cast<u32>(layout.groups.size()), hash);
|
||||
for (const DockTables::DefaultDockGroupDescription& group : layout.groups)
|
||||
hashDefaultGroup(group, hash);
|
||||
|
||||
u32 group_count = static_cast<u32>(layout.groups.size());
|
||||
md5.Update(&group_count, sizeof(group_count));
|
||||
hashNumber(static_cast<u32>(layout.widgets.size()), hash);
|
||||
for (const DockTables::DefaultDockWidgetDescription& widget : layout.widgets)
|
||||
hashDefaultDockWidget(widget, hash);
|
||||
|
||||
for (const DefaultDockGroupDescription& group : layout.groups)
|
||||
hashDefaultGroup(group, md5);
|
||||
|
||||
u32 widget_count = static_cast<u32>(layout.widgets.size());
|
||||
md5.Update(&widget_count, sizeof(widget_count));
|
||||
|
||||
for (const DefaultDockWidgetDescription& widget : layout.widgets)
|
||||
hashDefaultDockWidget(widget, md5);
|
||||
|
||||
u32 toolbar_count = static_cast<u32>(layout.toolbars.size());
|
||||
md5.Update(&toolbar_count, sizeof(toolbar_count));
|
||||
hashNumber(static_cast<u32>(layout.toolbars.size()), hash);
|
||||
for (const std::string& toolbar : layout.toolbars)
|
||||
{
|
||||
u32 toolbar_size = toolbar.size();
|
||||
md5.Update(&toolbar_size, sizeof(toolbar_size));
|
||||
md5.Update(toolbar.data(), toolbar.size());
|
||||
}
|
||||
hashString(toolbar.c_str(), hash);
|
||||
}
|
||||
|
||||
void DockTables::hashDefaultGroup(const DefaultDockGroupDescription& group, MD5Digest& md5)
|
||||
static void hashDefaultGroup(const DockTables::DefaultDockGroupDescription& group, u32& hash)
|
||||
{
|
||||
// This is inline here so that it's obvious that changing it will affect the
|
||||
// result of the hash.
|
||||
@@ -207,20 +185,25 @@ void DockTables::hashDefaultGroup(const DefaultDockGroupDescription& group, MD5D
|
||||
break;
|
||||
}
|
||||
|
||||
u32 location_size = static_cast<u32>(strlen(location));
|
||||
md5.Update(&location_size, sizeof(location_size));
|
||||
md5.Update(location, location_size);
|
||||
|
||||
u32 parent = static_cast<u32>(group.parent);
|
||||
md5.Update(&parent, sizeof(parent));
|
||||
hashString(location, hash);
|
||||
hashNumber(static_cast<u32>(group.parent), hash);
|
||||
}
|
||||
|
||||
void DockTables::hashDefaultDockWidget(const DefaultDockWidgetDescription& widget, MD5Digest& md5)
|
||||
static void hashDefaultDockWidget(const DockTables::DefaultDockWidgetDescription& widget, u32& hash)
|
||||
{
|
||||
u32 type_size = static_cast<u32>(widget.type.size());
|
||||
md5.Update(&type_size, sizeof(type_size));
|
||||
md5.Update(widget.type.data(), type_size);
|
||||
|
||||
u32 group = static_cast<u32>(widget.group);
|
||||
md5.Update(&group, sizeof(group));
|
||||
hashString(widget.type.c_str(), hash);
|
||||
hashNumber(static_cast<u32>(widget.group), hash);
|
||||
}
|
||||
|
||||
static void hashNumber(u32 number, u32& hash)
|
||||
{
|
||||
hash = hash * 31 + number;
|
||||
}
|
||||
|
||||
static void hashString(const char* string, u32& hash)
|
||||
{
|
||||
u32 size = static_cast<u32>(strlen(string));
|
||||
hash = hash * 31 + size;
|
||||
for (u32 i = 0; i < size; i++)
|
||||
hash = hash * 31 + string[i];
|
||||
}
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
|
||||
class MD5Digest;
|
||||
|
||||
class DebuggerWidget;
|
||||
struct DebuggerWidgetParameters;
|
||||
class DebuggerView;
|
||||
struct DebuggerViewParameters;
|
||||
|
||||
namespace DockTables
|
||||
{
|
||||
struct DebuggerWidgetDescription
|
||||
struct DebuggerViewDescription
|
||||
{
|
||||
DebuggerWidget* (*create_widget)(const DebuggerWidgetParameters& parameters);
|
||||
DebuggerView* (*create_widget)(const DebuggerViewParameters& parameters);
|
||||
|
||||
// The untranslated string displayed as the dock widget tab text.
|
||||
const char* display_name;
|
||||
@@ -28,7 +28,7 @@ namespace DockTables
|
||||
DockUtils::PreferredLocation preferred_location;
|
||||
};
|
||||
|
||||
extern const std::map<std::string, DebuggerWidgetDescription> DEBUGGER_WIDGETS;
|
||||
extern const std::map<std::string, DebuggerViewDescription> DEBUGGER_VIEWS;
|
||||
|
||||
enum class DefaultDockGroup
|
||||
{
|
||||
@@ -67,9 +67,5 @@ namespace DockTables
|
||||
|
||||
// This is used to determine if the user has updated and we need to recreate
|
||||
// the default layouts.
|
||||
const std::string& hashDefaultLayouts();
|
||||
|
||||
void hashDefaultLayout(const DefaultDockLayout& layout, MD5Digest& md5);
|
||||
void hashDefaultGroup(const DefaultDockGroupDescription& group, MD5Digest& md5);
|
||||
void hashDefaultDockWidget(const DefaultDockWidgetDescription& widget, MD5Digest& md5);
|
||||
u32 hashDefaultLayouts();
|
||||
} // namespace DockTables
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "DockViews.h"
|
||||
|
||||
#include "QtUtils.h"
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
#include "Debugger/Docking/DockManager.h"
|
||||
#include "Debugger/Docking/DropIndicators.h"
|
||||
@@ -93,7 +93,7 @@ void DockWidget::openStateChanged(bool open)
|
||||
return;
|
||||
|
||||
if (!open && g_debugger_window)
|
||||
g_debugger_window->dockManager().destroyDebuggerWidget(uniqueName());
|
||||
g_debugger_window->dockManager().destroyDebuggerView(uniqueName());
|
||||
}
|
||||
|
||||
// *****************************************************************************
|
||||
@@ -166,7 +166,7 @@ void DockTabBar::openContextMenu(QPoint pos)
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
size_t dock_widgets_of_type = g_debugger_window->dockManager().countDebuggerWidgetsOfType(
|
||||
size_t dock_widgets_of_type = g_debugger_window->dockManager().countDebuggerViewsOfType(
|
||||
widget->metaObject()->className());
|
||||
|
||||
QMenu* menu = new QMenu(this);
|
||||
@@ -222,7 +222,7 @@ void DockTabBar::openContextMenu(QPoint pos)
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
g_debugger_window->dockManager().setPrimaryDebuggerWidget(widget, checked);
|
||||
g_debugger_window->dockManager().setPrimaryDebuggerView(widget, checked);
|
||||
});
|
||||
|
||||
QMenu* set_target_menu = menu->addMenu(tr("Set Target"));
|
||||
@@ -263,7 +263,7 @@ void DockTabBar::openContextMenu(QPoint pos)
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
g_debugger_window->dockManager().destroyDebuggerWidget(widget->uniqueName());
|
||||
g_debugger_window->dockManager().destroyDebuggerView(widget->uniqueName());
|
||||
});
|
||||
|
||||
menu->popup(mapToGlobal(pos));
|
||||
@@ -279,7 +279,7 @@ void DockTabBar::setCpuOverrideForTab(int tab_index, std::optional<BreakPointCpu
|
||||
return;
|
||||
|
||||
if (!widget->setCpuOverride(cpu_override))
|
||||
g_debugger_window->dockManager().recreateDebuggerWidget(view->uniqueName());
|
||||
g_debugger_window->dockManager().recreateDebuggerView(view->uniqueName());
|
||||
|
||||
g_debugger_window->dockManager().updateDockWidgetTitles();
|
||||
}
|
||||
@@ -296,7 +296,7 @@ DockTabBar::WidgetsFromTabIndexResult DockTabBar::widgetsFromTabIndex(int tab_in
|
||||
|
||||
auto dock_view = static_cast<KDDockWidgets::QtWidgets::DockWidget*>(dock_controller->view());
|
||||
|
||||
DebuggerWidget* widget = qobject_cast<DebuggerWidget*>(dock_view->widget());
|
||||
DebuggerView* widget = qobject_cast<DebuggerView*>(dock_view->widget());
|
||||
if (!widget)
|
||||
return {};
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include <kddockwidgets/qtwidgets/views/TitleBar.h>
|
||||
#include <kddockwidgets/qtwidgets/views/TabBar.h>
|
||||
|
||||
class DebuggerWidget;
|
||||
class DebuggerView;
|
||||
class DockManager;
|
||||
|
||||
class DockViewFactory : public KDDockWidgets::QtWidgets::ViewFactory
|
||||
@@ -101,7 +101,7 @@ protected:
|
||||
|
||||
struct WidgetsFromTabIndexResult
|
||||
{
|
||||
DebuggerWidget* debugger_widget = nullptr;
|
||||
DebuggerView* widget = nullptr;
|
||||
KDDockWidgets::Core::DockWidget* controller = nullptr;
|
||||
KDDockWidgets::QtWidgets::DockWidget* view = nullptr;
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "MemorySearchWidget.h"
|
||||
#include "MemorySearchView.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
|
||||
@@ -17,33 +17,33 @@
|
||||
#include <QtCore/QFutureWatcher>
|
||||
#include <QtGui/QPainter>
|
||||
|
||||
using SearchComparison = MemorySearchWidget::SearchComparison;
|
||||
using SearchType = MemorySearchWidget::SearchType;
|
||||
using SearchResult = MemorySearchWidget::SearchResult;
|
||||
using SearchComparison = MemorySearchView::SearchComparison;
|
||||
using SearchType = MemorySearchView::SearchType;
|
||||
using SearchResult = MemorySearchView::SearchResult;
|
||||
|
||||
using namespace QtUtils;
|
||||
|
||||
MemorySearchWidget::MemorySearchWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, MONOSPACE_FONT)
|
||||
MemorySearchView::MemorySearchView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, MONOSPACE_FONT)
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
this->repaint();
|
||||
|
||||
m_ui.listSearchResults->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.btnSearch, &QPushButton::clicked, this, &MemorySearchWidget::onSearchButtonClicked);
|
||||
connect(m_ui.btnFilterSearch, &QPushButton::clicked, this, &MemorySearchWidget::onSearchButtonClicked);
|
||||
connect(m_ui.btnSearch, &QPushButton::clicked, this, &MemorySearchView::onSearchButtonClicked);
|
||||
connect(m_ui.btnFilterSearch, &QPushButton::clicked, this, &MemorySearchView::onSearchButtonClicked);
|
||||
connect(m_ui.listSearchResults, &QListWidget::itemDoubleClicked, [](QListWidgetItem* item) {
|
||||
goToInMemoryView(item->text().toUInt(nullptr, 16), true);
|
||||
});
|
||||
connect(m_ui.listSearchResults->verticalScrollBar(), &QScrollBar::valueChanged, this, &MemorySearchWidget::onSearchResultsListScroll);
|
||||
connect(m_ui.listSearchResults, &QListView::customContextMenuRequested, this, &MemorySearchWidget::onListSearchResultsContextMenu);
|
||||
connect(m_ui.cmbSearchType, &QComboBox::currentIndexChanged, this, &MemorySearchWidget::onSearchTypeChanged);
|
||||
connect(m_ui.cmbSearchComparison, &QComboBox::currentIndexChanged, this, &MemorySearchWidget::onSearchComparisonChanged);
|
||||
connect(m_ui.listSearchResults->verticalScrollBar(), &QScrollBar::valueChanged, this, &MemorySearchView::onSearchResultsListScroll);
|
||||
connect(m_ui.listSearchResults, &QListView::customContextMenuRequested, this, &MemorySearchView::onListSearchResultsContextMenu);
|
||||
connect(m_ui.cmbSearchType, &QComboBox::currentIndexChanged, this, &MemorySearchView::onSearchTypeChanged);
|
||||
connect(m_ui.cmbSearchComparison, &QComboBox::currentIndexChanged, this, &MemorySearchView::onSearchComparisonChanged);
|
||||
|
||||
// Ensures we don't retrigger the load results function unintentionally
|
||||
m_resultsLoadTimer.setInterval(100);
|
||||
m_resultsLoadTimer.setSingleShot(true);
|
||||
connect(&m_resultsLoadTimer, &QTimer::timeout, this, &MemorySearchWidget::loadSearchResults);
|
||||
connect(&m_resultsLoadTimer, &QTimer::timeout, this, &MemorySearchView::loadSearchResults);
|
||||
|
||||
receiveEvent<DebuggerEvents::Refresh>([this](const DebuggerEvents::Refresh& event) -> bool {
|
||||
update();
|
||||
@@ -51,7 +51,7 @@ MemorySearchWidget::MemorySearchWidget(const DebuggerWidgetParameters& parameter
|
||||
});
|
||||
}
|
||||
|
||||
void MemorySearchWidget::contextRemoveSearchResult()
|
||||
void MemorySearchView::contextRemoveSearchResult()
|
||||
{
|
||||
const QItemSelectionModel* selModel = m_ui.listSearchResults->selectionModel();
|
||||
if (!selModel->hasSelection())
|
||||
@@ -67,7 +67,7 @@ void MemorySearchWidget::contextRemoveSearchResult()
|
||||
delete rowToRemove;
|
||||
}
|
||||
|
||||
void MemorySearchWidget::contextCopySearchResultAddress()
|
||||
void MemorySearchView::contextCopySearchResultAddress()
|
||||
{
|
||||
if (!m_ui.listSearchResults->selectionModel()->hasSelection())
|
||||
return;
|
||||
@@ -78,7 +78,7 @@ void MemorySearchWidget::contextCopySearchResultAddress()
|
||||
QApplication::clipboard()->setText(addressString);
|
||||
}
|
||||
|
||||
void MemorySearchWidget::onListSearchResultsContextMenu(QPoint pos)
|
||||
void MemorySearchView::onListSearchResultsContextMenu(QPoint pos)
|
||||
{
|
||||
const QItemSelectionModel* selection_model = m_ui.listSearchResults->selectionModel();
|
||||
const QListWidget* list_search_results = m_ui.listSearchResults;
|
||||
@@ -89,7 +89,7 @@ void MemorySearchWidget::onListSearchResultsContextMenu(QPoint pos)
|
||||
if (selection_model->hasSelection())
|
||||
{
|
||||
connect(menu->addAction(tr("Copy Address")), &QAction::triggered,
|
||||
this, &MemorySearchWidget::contextCopySearchResultAddress);
|
||||
this, &MemorySearchView::contextCopySearchResultAddress);
|
||||
|
||||
createEventActions<DebuggerEvents::GoToAddress>(menu, [list_search_results]() {
|
||||
u32 selected_address = list_search_results->selectedItems().first()->data(Qt::UserRole).toUInt();
|
||||
@@ -106,7 +106,7 @@ void MemorySearchWidget::onListSearchResultsContextMenu(QPoint pos)
|
||||
});
|
||||
|
||||
connect(menu->addAction(tr("Remove Result")), &QAction::triggered,
|
||||
this, &MemorySearchWidget::contextRemoveSearchResult);
|
||||
this, &MemorySearchView::contextRemoveSearchResult);
|
||||
}
|
||||
|
||||
menu->popup(m_ui.listSearchResults->viewport()->mapToGlobal(pos));
|
||||
@@ -297,7 +297,7 @@ void searchWorker(DebugInterface* cpu, std::vector<SearchResult>& searchResults,
|
||||
T readValue = readValueAtAddress<T>(cpu, addr);
|
||||
if (handleSearchComparison(searchComparison, addr, nullptr, searchValue, readValue))
|
||||
{
|
||||
searchResults.push_back(MemorySearchWidget::SearchResult(addr, QVariant::fromValue(readValue), searchType));
|
||||
searchResults.push_back(MemorySearchView::SearchResult(addr, QVariant::fromValue(readValue), searchType));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -312,7 +312,7 @@ void searchWorker(DebugInterface* cpu, std::vector<SearchResult>& searchResults,
|
||||
|
||||
const bool doesMatch = handleSearchComparison(searchComparison, addr, &searchResult, searchValue, readValue);
|
||||
if (!doesMatch)
|
||||
searchResult = MemorySearchWidget::SearchResult(addr, QVariant::fromValue(readValue), searchType);
|
||||
searchResult = MemorySearchView::SearchResult(addr, QVariant::fromValue(readValue), searchType);
|
||||
|
||||
return !doesMatch;
|
||||
});
|
||||
@@ -399,7 +399,7 @@ static void searchWorkerByteArray(DebugInterface* cpu, SearchType searchType, Se
|
||||
continue;
|
||||
if (handleArraySearchComparison(cpu, searchComparison, addr, nullptr, searchValue))
|
||||
{
|
||||
searchResults.push_back(MemorySearchWidget::SearchResult(addr, searchValue, searchType));
|
||||
searchResults.push_back(MemorySearchView::SearchResult(addr, searchValue, searchType));
|
||||
addr += searchValue.length() - 1;
|
||||
}
|
||||
}
|
||||
@@ -421,7 +421,7 @@ static void searchWorkerByteArray(DebugInterface* cpu, SearchType searchType, Se
|
||||
matchValue = searchResult.getArrayValue();
|
||||
else
|
||||
matchValue = readArrayAtAddress(cpu, addr, searchValue.length() - 1);
|
||||
searchResult = MemorySearchWidget::SearchResult(addr, matchValue, searchType);
|
||||
searchResult = MemorySearchView::SearchResult(addr, matchValue, searchType);
|
||||
}
|
||||
return !doesMatch;
|
||||
});
|
||||
@@ -465,7 +465,7 @@ std::vector<SearchResult> startWorker(DebugInterface* cpu, const SearchType type
|
||||
return searchResults;
|
||||
}
|
||||
|
||||
void MemorySearchWidget::onSearchButtonClicked()
|
||||
void MemorySearchView::onSearchButtonClicked()
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -612,7 +612,7 @@ void MemorySearchWidget::onSearchButtonClicked()
|
||||
m_ui.resultsCountLabel->setVisible(true);
|
||||
}
|
||||
|
||||
void MemorySearchWidget::onSearchResultsListScroll(u32 value)
|
||||
void MemorySearchView::onSearchResultsListScroll(u32 value)
|
||||
{
|
||||
const bool hasResultsToLoad = static_cast<size_t>(m_ui.listSearchResults->count()) < m_searchResults.size();
|
||||
const bool scrolledSufficiently = value > (m_ui.listSearchResults->verticalScrollBar()->maximum() * 0.95);
|
||||
@@ -623,7 +623,7 @@ void MemorySearchWidget::onSearchResultsListScroll(u32 value)
|
||||
}
|
||||
}
|
||||
|
||||
void MemorySearchWidget::loadSearchResults()
|
||||
void MemorySearchView::loadSearchResults()
|
||||
{
|
||||
const u32 numLoaded = m_ui.listSearchResults->count();
|
||||
const u32 amountLeftToLoad = m_searchResults.size() - numLoaded;
|
||||
@@ -643,18 +643,18 @@ void MemorySearchWidget::loadSearchResults()
|
||||
}
|
||||
}
|
||||
|
||||
SearchType MemorySearchWidget::getCurrentSearchType()
|
||||
SearchType MemorySearchView::getCurrentSearchType()
|
||||
{
|
||||
return static_cast<SearchType>(m_ui.cmbSearchType->currentIndex());
|
||||
}
|
||||
|
||||
SearchComparison MemorySearchWidget::getCurrentSearchComparison()
|
||||
SearchComparison MemorySearchView::getCurrentSearchComparison()
|
||||
{
|
||||
// Note: The index can't be converted directly to the enum value since we change what comparisons are shown.
|
||||
return m_searchComparisonLabelMap.labelToEnum(m_ui.cmbSearchComparison->currentText());
|
||||
}
|
||||
|
||||
bool MemorySearchWidget::doesSearchComparisonTakeInput(const SearchComparison comparison)
|
||||
bool MemorySearchView::doesSearchComparisonTakeInput(const SearchComparison comparison)
|
||||
{
|
||||
switch (comparison)
|
||||
{
|
||||
@@ -672,7 +672,7 @@ bool MemorySearchWidget::doesSearchComparisonTakeInput(const SearchComparison co
|
||||
}
|
||||
}
|
||||
|
||||
void MemorySearchWidget::onSearchTypeChanged(int newIndex)
|
||||
void MemorySearchView::onSearchTypeChanged(int newIndex)
|
||||
{
|
||||
if (newIndex < 4)
|
||||
m_ui.chkSearchHex->setEnabled(true);
|
||||
@@ -689,12 +689,12 @@ void MemorySearchWidget::onSearchTypeChanged(int newIndex)
|
||||
updateSearchComparisonSelections();
|
||||
}
|
||||
|
||||
void MemorySearchWidget::onSearchComparisonChanged(int newValue)
|
||||
void MemorySearchView::onSearchComparisonChanged(int newValue)
|
||||
{
|
||||
m_ui.txtSearchValue->setEnabled(getCurrentSearchComparison() != SearchComparison::UnknownValue);
|
||||
}
|
||||
|
||||
void MemorySearchWidget::updateSearchComparisonSelections()
|
||||
void MemorySearchView::updateSearchComparisonSelections()
|
||||
{
|
||||
const QString selectedComparisonLabel = m_ui.cmbSearchComparison->currentText();
|
||||
const SearchComparison selectedComparison = m_searchComparisonLabelMap.labelToEnum(selectedComparisonLabel);
|
||||
@@ -713,7 +713,7 @@ void MemorySearchWidget::updateSearchComparisonSelections()
|
||||
m_ui.cmbSearchComparison->setCurrentText(selectedComparisonLabel);
|
||||
}
|
||||
|
||||
std::vector<SearchComparison> MemorySearchWidget::getValidSearchComparisonsForState(SearchType type, std::vector<SearchResult>& existingResults)
|
||||
std::vector<SearchComparison> MemorySearchView::getValidSearchComparisonsForState(SearchType type, std::vector<SearchResult>& existingResults)
|
||||
{
|
||||
const bool hasResults = existingResults.size() > 0;
|
||||
std::vector<SearchComparison> comparisons = {SearchComparison::Equals};
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_MemorySearchWidget.h"
|
||||
#include "ui_MemorySearchView.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtCore/QMap>
|
||||
|
||||
class MemorySearchWidget final : public DebuggerWidget
|
||||
class MemorySearchView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MemorySearchWidget(const DebuggerWidgetParameters& parameters);
|
||||
~MemorySearchWidget() = default;
|
||||
MemorySearchView(const DebuggerViewParameters& parameters);
|
||||
~MemorySearchView() = default;
|
||||
|
||||
enum class SearchType
|
||||
{
|
||||
@@ -136,7 +136,7 @@ public slots:
|
||||
private:
|
||||
std::vector<SearchResult> m_searchResults;
|
||||
SearchComparisonLabelMap m_searchComparisonLabelMap;
|
||||
Ui::MemorySearchWidget m_ui;
|
||||
Ui::MemorySearchView m_ui;
|
||||
QTimer m_resultsLoadTimer;
|
||||
|
||||
u32 m_initialResultsLoadLimit = 20000;
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MemorySearchWidget</class>
|
||||
<widget class="QWidget" name="MemorySearchWidget">
|
||||
<class>MemorySearchView</class>
|
||||
<widget class="QWidget" name="MemorySearchView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "MemoryViewWidget.h"
|
||||
#include "MemoryView.h"
|
||||
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
|
||||
@@ -451,10 +451,10 @@ bool MemoryViewTable::KeyPress(int key, QChar keychar, DebugInterface& cpu)
|
||||
}
|
||||
|
||||
/*
|
||||
MemoryViewWidget
|
||||
MemoryView
|
||||
*/
|
||||
MemoryViewWidget::MemoryViewWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, MONOSPACE_FONT)
|
||||
MemoryView::MemoryView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, MONOSPACE_FONT)
|
||||
, m_table(this)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
@@ -462,7 +462,7 @@ MemoryViewWidget::MemoryViewWidget(const DebuggerWidgetParameters& parameters)
|
||||
setFocusPolicy(Qt::FocusPolicy::ClickFocus);
|
||||
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, &MemoryViewWidget::customContextMenuRequested, this, &MemoryViewWidget::openContextMenu);
|
||||
connect(this, &MemoryView::customContextMenuRequested, this, &MemoryView::openContextMenu);
|
||||
|
||||
m_table.UpdateStartAddress(0x100000);
|
||||
|
||||
@@ -485,20 +485,20 @@ MemoryViewWidget::MemoryViewWidget(const DebuggerWidgetParameters& parameters)
|
||||
});
|
||||
}
|
||||
|
||||
MemoryViewWidget::~MemoryViewWidget() = default;
|
||||
MemoryView::~MemoryView() = default;
|
||||
|
||||
void MemoryViewWidget::toJson(JsonValueWrapper& json)
|
||||
void MemoryView::toJson(JsonValueWrapper& json)
|
||||
{
|
||||
DebuggerWidget::toJson(json);
|
||||
DebuggerView::toJson(json);
|
||||
|
||||
json.value().AddMember("startAddress", m_table.startAddress, json.allocator());
|
||||
json.value().AddMember("viewType", static_cast<int>(m_table.GetViewType()), json.allocator());
|
||||
json.value().AddMember("littleEndian", m_table.GetLittleEndian(), json.allocator());
|
||||
}
|
||||
|
||||
bool MemoryViewWidget::fromJson(const JsonValueWrapper& json)
|
||||
bool MemoryView::fromJson(const JsonValueWrapper& json)
|
||||
{
|
||||
if (!DebuggerWidget::fromJson(json))
|
||||
if (!DebuggerView::fromJson(json))
|
||||
return false;
|
||||
|
||||
auto start_address = json.value().FindMember("startAddress");
|
||||
@@ -525,7 +525,7 @@ bool MemoryViewWidget::fromJson(const JsonValueWrapper& json)
|
||||
return true;
|
||||
}
|
||||
|
||||
void MemoryViewWidget::paintEvent(QPaintEvent* event)
|
||||
void MemoryView::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
@@ -537,7 +537,7 @@ void MemoryViewWidget::paintEvent(QPaintEvent* event)
|
||||
m_table.DrawTable(painter, this->palette(), this->height(), cpu());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::mousePressEvent(QMouseEvent* event)
|
||||
void MemoryView::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -546,7 +546,7 @@ void MemoryViewWidget::mousePressEvent(QMouseEvent* event)
|
||||
repaint();
|
||||
}
|
||||
|
||||
void MemoryViewWidget::openContextMenu(QPoint pos)
|
||||
void MemoryView::openContextMenu(QPoint pos)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -615,10 +615,10 @@ void MemoryViewWidget::openContextMenu(QPoint pos)
|
||||
return std::optional(event);
|
||||
});
|
||||
|
||||
connect(menu->addAction(tr("Copy Byte")), &QAction::triggered, this, &MemoryViewWidget::contextCopyByte);
|
||||
connect(menu->addAction(tr("Copy Segment")), &QAction::triggered, this, &MemoryViewWidget::contextCopySegment);
|
||||
connect(menu->addAction(tr("Copy Character")), &QAction::triggered, this, &MemoryViewWidget::contextCopyCharacter);
|
||||
connect(menu->addAction(tr("Paste")), &QAction::triggered, this, &MemoryViewWidget::contextPaste);
|
||||
connect(menu->addAction(tr("Copy Byte")), &QAction::triggered, this, &MemoryView::contextCopyByte);
|
||||
connect(menu->addAction(tr("Copy Segment")), &QAction::triggered, this, &MemoryView::contextCopySegment);
|
||||
connect(menu->addAction(tr("Copy Character")), &QAction::triggered, this, &MemoryView::contextCopyCharacter);
|
||||
connect(menu->addAction(tr("Paste")), &QAction::triggered, this, &MemoryView::contextPaste);
|
||||
|
||||
menu->popup(this->mapToGlobal(pos));
|
||||
|
||||
@@ -626,27 +626,27 @@ void MemoryViewWidget::openContextMenu(QPoint pos)
|
||||
return;
|
||||
}
|
||||
|
||||
void MemoryViewWidget::contextCopyByte()
|
||||
void MemoryView::contextCopyByte()
|
||||
{
|
||||
QApplication::clipboard()->setText(QString::number(cpu().read8(m_table.selectedAddress), 16).toUpper());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::contextCopySegment()
|
||||
void MemoryView::contextCopySegment()
|
||||
{
|
||||
QApplication::clipboard()->setText(QString::number(m_table.GetSelectedSegment(cpu()).lo, 16).toUpper());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::contextCopyCharacter()
|
||||
void MemoryView::contextCopyCharacter()
|
||||
{
|
||||
QApplication::clipboard()->setText(QChar::fromLatin1(cpu().read8(m_table.selectedAddress)).toUpper());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::contextPaste()
|
||||
void MemoryView::contextPaste()
|
||||
{
|
||||
m_table.InsertAtCurrentSelection(QApplication::clipboard()->text(), cpu());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::contextGoToAddress()
|
||||
void MemoryView::contextGoToAddress()
|
||||
{
|
||||
bool ok;
|
||||
QString targetString = QInputDialog::getText(this, tr("Go To In Memory View"), "",
|
||||
@@ -666,11 +666,11 @@ void MemoryViewWidget::contextGoToAddress()
|
||||
gotoAddress(static_cast<u32>(address));
|
||||
}
|
||||
|
||||
void MemoryViewWidget::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
void MemoryView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
}
|
||||
|
||||
void MemoryViewWidget::wheelEvent(QWheelEvent* event)
|
||||
void MemoryView::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
if (event->angleDelta().y() < 0)
|
||||
{
|
||||
@@ -683,7 +683,7 @@ void MemoryViewWidget::wheelEvent(QWheelEvent* event)
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void MemoryViewWidget::keyPressEvent(QKeyEvent* event)
|
||||
void MemoryView::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
if (!m_table.KeyPress(event->key(), event->text().size() ? event->text()[0] : '\0', cpu()))
|
||||
{
|
||||
@@ -701,10 +701,10 @@ void MemoryViewWidget::keyPressEvent(QKeyEvent* event)
|
||||
}
|
||||
}
|
||||
this->repaint();
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
}
|
||||
|
||||
void MemoryViewWidget::gotoAddress(u32 address)
|
||||
void MemoryView::gotoAddress(u32 address)
|
||||
{
|
||||
m_table.UpdateStartAddress(address & ~0xF);
|
||||
m_table.selectedAddress = address;
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_MemoryViewWidget.h"
|
||||
#include "ui_MemoryView.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
#include "DebugTools/DisassemblyManager.h"
|
||||
@@ -104,13 +104,13 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class MemoryViewWidget final : public DebuggerWidget
|
||||
class MemoryView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MemoryViewWidget(const DebuggerWidgetParameters& parameters);
|
||||
~MemoryViewWidget();
|
||||
MemoryView(const DebuggerViewParameters& parameters);
|
||||
~MemoryView();
|
||||
|
||||
void toJson(JsonValueWrapper& json) override;
|
||||
bool fromJson(const JsonValueWrapper& json) override;
|
||||
@@ -133,7 +133,7 @@ public slots:
|
||||
void gotoAddress(u32 address);
|
||||
|
||||
private:
|
||||
Ui::MemoryViewWidget ui;
|
||||
Ui::MemoryView ui;
|
||||
|
||||
MemoryViewTable m_table;
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MemoryViewWidget</class>
|
||||
<widget class="QWidget" name="MemoryViewWidget">
|
||||
<class>MemoryView</class>
|
||||
<widget class="QWidget" name="MemoryView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "SavedAddressesWidget.h"
|
||||
#include "SavedAddressesView.h"
|
||||
|
||||
#include "QtUtils.h"
|
||||
#include "Debugger/DebuggerSettingsManager.h"
|
||||
@@ -9,8 +9,8 @@
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtWidgets/QMenu>
|
||||
|
||||
SavedAddressesWidget::SavedAddressesWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, DISALLOW_MULTIPLE_INSTANCES)
|
||||
SavedAddressesView::SavedAddressesView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, DISALLOW_MULTIPLE_INSTANCES)
|
||||
, m_model(SavedAddressesModel::getInstance(cpu()))
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
@@ -19,7 +19,7 @@ SavedAddressesWidget::SavedAddressesWidget(const DebuggerWidgetParameters& param
|
||||
|
||||
m_ui.savedAddressesList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.savedAddressesList, &QTableView::customContextMenuRequested,
|
||||
this, &SavedAddressesWidget::openContextMenu);
|
||||
this, &SavedAddressesView::openContextMenu);
|
||||
|
||||
connect(g_emu_thread, &EmuThread::onGameChanged, this, [this](const QString& title) {
|
||||
if (title.isEmpty())
|
||||
@@ -51,13 +51,13 @@ SavedAddressesWidget::SavedAddressesWidget(const DebuggerWidgetParameters& param
|
||||
});
|
||||
}
|
||||
|
||||
void SavedAddressesWidget::openContextMenu(QPoint pos)
|
||||
void SavedAddressesView::openContextMenu(QPoint pos)
|
||||
{
|
||||
QMenu* menu = new QMenu(this);
|
||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
QAction* new_action = menu->addAction(tr("New"));
|
||||
connect(new_action, &QAction::triggered, this, &SavedAddressesWidget::contextNew);
|
||||
connect(new_action, &QAction::triggered, this, &SavedAddressesView::contextNew);
|
||||
|
||||
const QModelIndex index_at_pos = m_ui.savedAddressesList->indexAt(pos);
|
||||
const bool is_index_valid = index_at_pos.isValid();
|
||||
@@ -92,7 +92,7 @@ void SavedAddressesWidget::openContextMenu(QPoint pos)
|
||||
}
|
||||
|
||||
QAction* paste_from_csv_action = menu->addAction(tr("Paste from CSV"));
|
||||
connect(paste_from_csv_action, &QAction::triggered, this, &SavedAddressesWidget::contextPasteCSV);
|
||||
connect(paste_from_csv_action, &QAction::triggered, this, &SavedAddressesView::contextPasteCSV);
|
||||
|
||||
QAction* load_action = menu->addAction(tr("Load from Settings"));
|
||||
load_action->setEnabled(is_cpu_alive);
|
||||
@@ -103,7 +103,7 @@ void SavedAddressesWidget::openContextMenu(QPoint pos)
|
||||
|
||||
QAction* save_action = menu->addAction(tr("Save to Settings"));
|
||||
save_action->setEnabled(is_cpu_alive);
|
||||
connect(save_action, &QAction::triggered, this, &SavedAddressesWidget::saveToDebuggerSettings);
|
||||
connect(save_action, &QAction::triggered, this, &SavedAddressesView::saveToDebuggerSettings);
|
||||
|
||||
QAction* delete_action = menu->addAction(tr("Delete"));
|
||||
connect(delete_action, &QAction::triggered, this, [this, index_at_pos]() {
|
||||
@@ -114,7 +114,7 @@ void SavedAddressesWidget::openContextMenu(QPoint pos)
|
||||
menu->popup(m_ui.savedAddressesList->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void SavedAddressesWidget::contextPasteCSV()
|
||||
void SavedAddressesView::contextPasteCSV()
|
||||
{
|
||||
QString csv = QGuiApplication::clipboard()->text();
|
||||
// Skip header
|
||||
@@ -139,14 +139,14 @@ void SavedAddressesWidget::contextPasteCSV()
|
||||
}
|
||||
}
|
||||
|
||||
void SavedAddressesWidget::contextNew()
|
||||
void SavedAddressesView::contextNew()
|
||||
{
|
||||
m_model->addRow();
|
||||
const u32 row_count = m_model->rowCount();
|
||||
m_ui.savedAddressesList->edit(m_model->index(row_count - 1, 0));
|
||||
}
|
||||
|
||||
void SavedAddressesWidget::addAddress(u32 address)
|
||||
void SavedAddressesView::addAddress(u32 address)
|
||||
{
|
||||
m_model->addRow();
|
||||
|
||||
@@ -160,7 +160,7 @@ void SavedAddressesWidget::addAddress(u32 address)
|
||||
m_ui.savedAddressesList->edit(label_index);
|
||||
}
|
||||
|
||||
void SavedAddressesWidget::saveToDebuggerSettings()
|
||||
void SavedAddressesView::saveToDebuggerSettings()
|
||||
{
|
||||
DebuggerSettingsManager::saveGameSettings(m_model);
|
||||
}
|
||||
@@ -3,18 +3,18 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_SavedAddressesWidget.h"
|
||||
#include "ui_SavedAddressesView.h"
|
||||
|
||||
#include "SavedAddressesModel.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
|
||||
class SavedAddressesWidget : public DebuggerWidget
|
||||
class SavedAddressesView : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SavedAddressesWidget(const DebuggerWidgetParameters& parameters);
|
||||
SavedAddressesView(const DebuggerViewParameters& parameters);
|
||||
|
||||
void openContextMenu(QPoint pos);
|
||||
void contextPasteCSV();
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
void saveToDebuggerSettings();
|
||||
|
||||
private:
|
||||
Ui::SavedAddressesWidget m_ui;
|
||||
Ui::SavedAddressesView m_ui;
|
||||
|
||||
SavedAddressesModel* m_model;
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SavedAddressesWidget</class>
|
||||
<widget class="QWidget" name="SavedAddressesWidget">
|
||||
<class>SavedAddressesView</class>
|
||||
<widget class="QWidget" name="SavedAddressesView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "RegisterWidget.h"
|
||||
#include "RegisterView.h"
|
||||
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
|
||||
@@ -21,16 +21,16 @@
|
||||
|
||||
using namespace QtUtils;
|
||||
|
||||
RegisterWidget::RegisterWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, MONOSPACE_FONT)
|
||||
RegisterView::RegisterView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, MONOSPACE_FONT)
|
||||
{
|
||||
this->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
|
||||
|
||||
ui.setupUi(this);
|
||||
ui.registerTabs->setDrawBase(false);
|
||||
|
||||
connect(this, &RegisterWidget::customContextMenuRequested, this, &RegisterWidget::customMenuRequested);
|
||||
connect(ui.registerTabs, &QTabBar::currentChanged, this, &RegisterWidget::tabCurrentChanged);
|
||||
connect(this, &RegisterView::customContextMenuRequested, this, &RegisterView::customMenuRequested);
|
||||
connect(ui.registerTabs, &QTabBar::currentChanged, this, &RegisterView::tabCurrentChanged);
|
||||
|
||||
for (int i = 0; i < cpu().getRegisterCategoryCount(); i++)
|
||||
{
|
||||
@@ -45,21 +45,21 @@ RegisterWidget::RegisterWidget(const DebuggerWidgetParameters& parameters)
|
||||
});
|
||||
}
|
||||
|
||||
RegisterWidget::~RegisterWidget()
|
||||
RegisterView::~RegisterView()
|
||||
{
|
||||
}
|
||||
|
||||
void RegisterWidget::toJson(JsonValueWrapper& json)
|
||||
void RegisterView::toJson(JsonValueWrapper& json)
|
||||
{
|
||||
DebuggerWidget::toJson(json);
|
||||
DebuggerView::toJson(json);
|
||||
|
||||
json.value().AddMember("showVU0FFloat", m_showVU0FFloat, json.allocator());
|
||||
json.value().AddMember("showFPRFloat", m_showFPRFloat, json.allocator());
|
||||
}
|
||||
|
||||
bool RegisterWidget::fromJson(const JsonValueWrapper& json)
|
||||
bool RegisterView::fromJson(const JsonValueWrapper& json)
|
||||
{
|
||||
if (!DebuggerWidget::fromJson(json))
|
||||
if (!DebuggerView::fromJson(json))
|
||||
return false;
|
||||
|
||||
auto show_vu0f_float = json.value().FindMember("showVU0FFloat");
|
||||
@@ -75,12 +75,12 @@ bool RegisterWidget::fromJson(const JsonValueWrapper& json)
|
||||
return true;
|
||||
}
|
||||
|
||||
void RegisterWidget::tabCurrentChanged(int cur)
|
||||
void RegisterView::tabCurrentChanged(int cur)
|
||||
{
|
||||
m_rowStart = 0;
|
||||
}
|
||||
|
||||
void RegisterWidget::paintEvent(QPaintEvent* event)
|
||||
void RegisterView::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.setPen(this->palette().text().color());
|
||||
@@ -190,7 +190,7 @@ void RegisterWidget::paintEvent(QPaintEvent* event)
|
||||
painter.end();
|
||||
}
|
||||
|
||||
void RegisterWidget::mousePressEvent(QMouseEvent* event)
|
||||
void RegisterView::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
m_selectedRow = static_cast<int>(((event->position().y() - m_renderStart.y()) / m_rowHeight)) + m_rowStart;
|
||||
@@ -213,7 +213,7 @@ void RegisterWidget::mousePressEvent(QMouseEvent* event)
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void RegisterWidget::wheelEvent(QWheelEvent* event)
|
||||
void RegisterView::wheelEvent(QWheelEvent* event)
|
||||
{
|
||||
if (event->angleDelta().y() < 0 && m_rowEnd < cpu().getRegisterCount(ui.registerTabs->currentIndex()))
|
||||
{
|
||||
@@ -227,7 +227,7 @@ void RegisterWidget::wheelEvent(QWheelEvent* event)
|
||||
this->repaint();
|
||||
}
|
||||
|
||||
void RegisterWidget::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
void RegisterView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -240,7 +240,7 @@ void RegisterWidget::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
contextChangeValue();
|
||||
}
|
||||
|
||||
void RegisterWidget::customMenuRequested(QPoint pos)
|
||||
void RegisterView::customMenuRequested(QPoint pos)
|
||||
{
|
||||
if (!cpu().isAlive())
|
||||
return;
|
||||
@@ -281,13 +281,13 @@ void RegisterWidget::customMenuRequested(QPoint pos)
|
||||
|
||||
if (cpu().getRegisterSize(categoryIndex) == 128)
|
||||
{
|
||||
connect(menu->addAction(tr("Copy Top Half")), &QAction::triggered, this, &RegisterWidget::contextCopyTop);
|
||||
connect(menu->addAction(tr("Copy Bottom Half")), &QAction::triggered, this, &RegisterWidget::contextCopyBottom);
|
||||
connect(menu->addAction(tr("Copy Segment")), &QAction::triggered, this, &RegisterWidget::contextCopySegment);
|
||||
connect(menu->addAction(tr("Copy Top Half")), &QAction::triggered, this, &RegisterView::contextCopyTop);
|
||||
connect(menu->addAction(tr("Copy Bottom Half")), &QAction::triggered, this, &RegisterView::contextCopyBottom);
|
||||
connect(menu->addAction(tr("Copy Segment")), &QAction::triggered, this, &RegisterView::contextCopySegment);
|
||||
}
|
||||
else
|
||||
{
|
||||
connect(menu->addAction(tr("Copy Value")), &QAction::triggered, this, &RegisterWidget::contextCopyValue);
|
||||
connect(menu->addAction(tr("Copy Value")), &QAction::triggered, this, &RegisterView::contextCopyValue);
|
||||
}
|
||||
|
||||
menu->addSeparator();
|
||||
@@ -295,16 +295,16 @@ void RegisterWidget::customMenuRequested(QPoint pos)
|
||||
if (cpu().getRegisterSize(categoryIndex) == 128)
|
||||
{
|
||||
connect(menu->addAction(tr("Change Top Half")), &QAction::triggered,
|
||||
this, &RegisterWidget::contextChangeTop);
|
||||
this, &RegisterView::contextChangeTop);
|
||||
connect(menu->addAction(tr("Change Bottom Half")), &QAction::triggered,
|
||||
this, &RegisterWidget::contextChangeBottom);
|
||||
this, &RegisterView::contextChangeBottom);
|
||||
connect(menu->addAction(tr("Change Segment")), &QAction::triggered,
|
||||
this, &RegisterWidget::contextChangeSegment);
|
||||
this, &RegisterView::contextChangeSegment);
|
||||
}
|
||||
else
|
||||
{
|
||||
connect(menu->addAction(tr("Change Value")), &QAction::triggered,
|
||||
this, &RegisterWidget::contextChangeValue);
|
||||
this, &RegisterView::contextChangeValue);
|
||||
}
|
||||
|
||||
menu->addSeparator();
|
||||
@@ -317,7 +317,7 @@ void RegisterWidget::customMenuRequested(QPoint pos)
|
||||
}
|
||||
|
||||
|
||||
void RegisterWidget::contextCopyValue()
|
||||
void RegisterView::contextCopyValue()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
const u128 val = cpu().getRegister(categoryIndex, m_selectedRow);
|
||||
@@ -327,21 +327,21 @@ void RegisterWidget::contextCopyValue()
|
||||
QApplication::clipboard()->setText(QString("%1").arg(QString::number(val._u64[0], 16).toUpper(), 16));
|
||||
}
|
||||
|
||||
void RegisterWidget::contextCopyTop()
|
||||
void RegisterView::contextCopyTop()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
const u128 val = cpu().getRegister(categoryIndex, m_selectedRow);
|
||||
QApplication::clipboard()->setText(FilledQStringFromValue(val.hi, 16));
|
||||
}
|
||||
|
||||
void RegisterWidget::contextCopyBottom()
|
||||
void RegisterView::contextCopyBottom()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
const u128 val = cpu().getRegister(categoryIndex, m_selectedRow);
|
||||
QApplication::clipboard()->setText(FilledQStringFromValue(val.lo, 16));
|
||||
}
|
||||
|
||||
void RegisterWidget::contextCopySegment()
|
||||
void RegisterView::contextCopySegment()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
const u128 val = cpu().getRegister(categoryIndex, m_selectedRow);
|
||||
@@ -351,7 +351,7 @@ void RegisterWidget::contextCopySegment()
|
||||
QApplication::clipboard()->setText(FilledQStringFromValue(val._u32[3 - m_selected128Field], 16));
|
||||
}
|
||||
|
||||
bool RegisterWidget::contextFetchNewValue(u64& out, u64 currentValue, bool segment)
|
||||
bool RegisterView::contextFetchNewValue(u64& out, u64 currentValue, bool segment)
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
const bool floatingPoint = CAT_SHOW_FLOAT && segment;
|
||||
@@ -394,18 +394,18 @@ bool RegisterWidget::contextFetchNewValue(u64& out, u64 currentValue, bool segme
|
||||
return true;
|
||||
}
|
||||
|
||||
void RegisterWidget::contextChangeValue()
|
||||
void RegisterView::contextChangeValue()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
u64 newVal;
|
||||
if (contextFetchNewValue(newVal, cpu().getRegister(categoryIndex, m_selectedRow).lo))
|
||||
{
|
||||
cpu().setRegister(categoryIndex, m_selectedRow, u128::From64(newVal));
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterWidget::contextChangeTop()
|
||||
void RegisterView::contextChangeTop()
|
||||
{
|
||||
u64 newVal;
|
||||
u128 oldVal = cpu().getRegister(ui.registerTabs->currentIndex(), m_selectedRow);
|
||||
@@ -413,11 +413,11 @@ void RegisterWidget::contextChangeTop()
|
||||
{
|
||||
oldVal.hi = newVal;
|
||||
cpu().setRegister(ui.registerTabs->currentIndex(), m_selectedRow, oldVal);
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterWidget::contextChangeBottom()
|
||||
void RegisterView::contextChangeBottom()
|
||||
{
|
||||
u64 newVal;
|
||||
u128 oldVal = cpu().getRegister(ui.registerTabs->currentIndex(), m_selectedRow);
|
||||
@@ -425,11 +425,11 @@ void RegisterWidget::contextChangeBottom()
|
||||
{
|
||||
oldVal.lo = newVal;
|
||||
cpu().setRegister(ui.registerTabs->currentIndex(), m_selectedRow, oldVal);
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterWidget::contextChangeSegment()
|
||||
void RegisterView::contextChangeSegment()
|
||||
{
|
||||
u64 newVal;
|
||||
u128 oldVal = cpu().getRegister(ui.registerTabs->currentIndex(), m_selectedRow);
|
||||
@@ -437,11 +437,11 @@ void RegisterWidget::contextChangeSegment()
|
||||
{
|
||||
oldVal._u32[3 - m_selected128Field] = (u32)newVal;
|
||||
cpu().setRegister(ui.registerTabs->currentIndex(), m_selectedRow, oldVal);
|
||||
DebuggerWidget::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
DebuggerView::broadcastEvent(DebuggerEvents::VMUpdate());
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<DebuggerEvents::GoToAddress> RegisterWidget::contextCreateGotoEvent()
|
||||
std::optional<DebuggerEvents::GoToAddress> RegisterView::contextCreateGotoEvent()
|
||||
{
|
||||
const int categoryIndex = ui.registerTabs->currentIndex();
|
||||
u128 regVal = cpu().getRegister(categoryIndex, m_selectedRow);
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_RegisterWidget.h"
|
||||
#include "ui_RegisterView.h"
|
||||
|
||||
#include "DebuggerWidget.h"
|
||||
#include "DebuggerView.h"
|
||||
|
||||
#include "DebugTools/DebugInterface.h"
|
||||
#include "DebugTools/DisassemblyManager.h"
|
||||
@@ -14,13 +14,13 @@
|
||||
#include <QtWidgets/QTabBar>
|
||||
#include <QtGui/QPainter>
|
||||
|
||||
class RegisterWidget final : public DebuggerWidget
|
||||
class RegisterView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
RegisterWidget(const DebuggerWidgetParameters& parameters);
|
||||
~RegisterWidget();
|
||||
RegisterView(const DebuggerViewParameters& parameters);
|
||||
~RegisterView();
|
||||
|
||||
void toJson(JsonValueWrapper& json) override;
|
||||
bool fromJson(const JsonValueWrapper& json) override;
|
||||
@@ -47,7 +47,7 @@ public slots:
|
||||
void tabCurrentChanged(int cur);
|
||||
|
||||
private:
|
||||
Ui::RegisterWidget ui;
|
||||
Ui::RegisterView ui;
|
||||
|
||||
// Returns true on success
|
||||
bool contextFetchNewValue(u64& out, u64 currentValue, bool segment = false);
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>RegisterWidget</class>
|
||||
<widget class="QWidget" name="RegisterWidget">
|
||||
<class>RegisterView</class>
|
||||
<widget class="QWidget" name="RegisterView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,22 +1,22 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "StackWidget.h"
|
||||
#include "StackView.h"
|
||||
|
||||
#include "QtUtils.h"
|
||||
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtWidgets/QMenu>
|
||||
|
||||
StackWidget::StackWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, NO_DEBUGGER_FLAGS)
|
||||
StackView::StackView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, NO_DEBUGGER_FLAGS)
|
||||
, m_model(new StackModel(cpu()))
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
|
||||
m_ui.stackList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.stackList, &QTableView::customContextMenuRequested, this, &StackWidget::openContextMenu);
|
||||
connect(m_ui.stackList, &QTableView::doubleClicked, this, &StackWidget::onDoubleClick);
|
||||
connect(m_ui.stackList, &QTableView::customContextMenuRequested, this, &StackView::openContextMenu);
|
||||
connect(m_ui.stackList, &QTableView::doubleClicked, this, &StackView::onDoubleClick);
|
||||
|
||||
m_ui.stackList->setModel(m_model);
|
||||
for (std::size_t i = 0; auto mode : StackModel::HeaderResizeModes)
|
||||
@@ -31,7 +31,7 @@ StackWidget::StackWidget(const DebuggerWidgetParameters& parameters)
|
||||
});
|
||||
}
|
||||
|
||||
void StackWidget::openContextMenu(QPoint pos)
|
||||
void StackView::openContextMenu(QPoint pos)
|
||||
{
|
||||
if (!m_ui.stackList->selectionModel()->hasSelection())
|
||||
return;
|
||||
@@ -58,7 +58,7 @@ void StackWidget::openContextMenu(QPoint pos)
|
||||
menu->popup(m_ui.stackList->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void StackWidget::onDoubleClick(const QModelIndex& index)
|
||||
void StackView::onDoubleClick(const QModelIndex& index)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
@@ -3,24 +3,24 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_StackWidget.h"
|
||||
#include "ui_StackView.h"
|
||||
|
||||
#include "StackModel.h"
|
||||
|
||||
#include "DebuggerWidget.h"
|
||||
#include "DebuggerView.h"
|
||||
|
||||
class StackWidget final : public DebuggerWidget
|
||||
class StackView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
StackWidget(const DebuggerWidgetParameters& parameters);
|
||||
StackView(const DebuggerViewParameters& parameters);
|
||||
|
||||
void openContextMenu(QPoint pos);
|
||||
void onDoubleClick(const QModelIndex& index);
|
||||
|
||||
private:
|
||||
Ui::StackWidget m_ui;
|
||||
Ui::StackView m_ui;
|
||||
|
||||
StackModel* m_model;
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>StackWidget</class>
|
||||
<widget class="QWidget" name="StackWidget">
|
||||
<class>StackView</class>
|
||||
<widget class="QWidget" name="StackView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SymbolTreeWidget</class>
|
||||
<widget class="QWidget" name="SymbolTreeWidget">
|
||||
<class>SymbolTreeView</class>
|
||||
<widget class="QWidget" name="SymbolTreeView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "SymbolTreeWidgets.h"
|
||||
#include "SymbolTreeViews.h"
|
||||
|
||||
#include "Debugger/JsonValueWrapper.h"
|
||||
#include "Debugger/SymbolTree/NewSymbolDialogs.h"
|
||||
@@ -15,11 +15,11 @@
|
||||
|
||||
static bool testName(const QString& name, const QString& filter);
|
||||
|
||||
SymbolTreeWidget::SymbolTreeWidget(
|
||||
SymbolTreeView::SymbolTreeView(
|
||||
u32 flags,
|
||||
s32 symbol_address_alignment,
|
||||
const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, MONOSPACE_FONT)
|
||||
const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, MONOSPACE_FONT)
|
||||
, m_flags(flags)
|
||||
, m_symbol_address_alignment(symbol_address_alignment)
|
||||
, m_group_by_module(cpu().getCpuType() == BREAKPOINT_IOP)
|
||||
@@ -34,17 +34,17 @@ SymbolTreeWidget::SymbolTreeWidget(
|
||||
reset();
|
||||
});
|
||||
|
||||
connect(m_ui.filterBox, &QLineEdit::textEdited, this, &SymbolTreeWidget::reset);
|
||||
connect(m_ui.filterBox, &QLineEdit::textEdited, this, &SymbolTreeView::reset);
|
||||
|
||||
connect(m_ui.newButton, &QPushButton::clicked, this, &SymbolTreeWidget::onNewButtonPressed);
|
||||
connect(m_ui.deleteButton, &QPushButton::clicked, this, &SymbolTreeWidget::onDeleteButtonPressed);
|
||||
connect(m_ui.newButton, &QPushButton::clicked, this, &SymbolTreeView::onNewButtonPressed);
|
||||
connect(m_ui.deleteButton, &QPushButton::clicked, this, &SymbolTreeView::onDeleteButtonPressed);
|
||||
|
||||
connect(m_ui.treeView->verticalScrollBar(), &QScrollBar::valueChanged, this, [&]() {
|
||||
updateVisibleNodes(false);
|
||||
});
|
||||
|
||||
m_ui.treeView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.treeView, &QTreeView::customContextMenuRequested, this, &SymbolTreeWidget::openContextMenu);
|
||||
connect(m_ui.treeView, &QTreeView::customContextMenuRequested, this, &SymbolTreeView::openContextMenu);
|
||||
|
||||
connect(m_ui.treeView, &QTreeView::expanded, this, [&]() {
|
||||
updateVisibleNodes(true);
|
||||
@@ -56,18 +56,18 @@ SymbolTreeWidget::SymbolTreeWidget(
|
||||
});
|
||||
}
|
||||
|
||||
SymbolTreeWidget::~SymbolTreeWidget() = default;
|
||||
SymbolTreeView::~SymbolTreeView() = default;
|
||||
|
||||
void SymbolTreeWidget::resizeEvent(QResizeEvent* event)
|
||||
void SymbolTreeView::resizeEvent(QResizeEvent* event)
|
||||
{
|
||||
QWidget::resizeEvent(event);
|
||||
|
||||
updateVisibleNodes(false);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::toJson(JsonValueWrapper& json)
|
||||
void SymbolTreeView::toJson(JsonValueWrapper& json)
|
||||
{
|
||||
DebuggerWidget::toJson(json);
|
||||
DebuggerView::toJson(json);
|
||||
|
||||
json.value().AddMember("showSizeColumn", m_show_size_column, json.allocator());
|
||||
if (m_flags & ALLOW_GROUPING)
|
||||
@@ -83,9 +83,9 @@ void SymbolTreeWidget::toJson(JsonValueWrapper& json)
|
||||
}
|
||||
}
|
||||
|
||||
bool SymbolTreeWidget::fromJson(const JsonValueWrapper& json)
|
||||
bool SymbolTreeView::fromJson(const JsonValueWrapper& json)
|
||||
{
|
||||
if (!DebuggerWidget::fromJson(json))
|
||||
if (!DebuggerView::fromJson(json))
|
||||
return false;
|
||||
|
||||
bool needs_reset = false;
|
||||
@@ -137,7 +137,7 @@ bool SymbolTreeWidget::fromJson(const JsonValueWrapper& json)
|
||||
return true;
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::updateModel()
|
||||
void SymbolTreeView::updateModel()
|
||||
{
|
||||
if (needsReset())
|
||||
reset();
|
||||
@@ -145,7 +145,7 @@ void SymbolTreeWidget::updateModel()
|
||||
updateVisibleNodes(true);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::reset()
|
||||
void SymbolTreeView::reset()
|
||||
{
|
||||
if (!m_model)
|
||||
setupTree();
|
||||
@@ -170,7 +170,7 @@ void SymbolTreeWidget::reset()
|
||||
}
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::updateVisibleNodes(bool update_hashes)
|
||||
void SymbolTreeView::updateVisibleNodes(bool update_hashes)
|
||||
{
|
||||
if (!m_model)
|
||||
return;
|
||||
@@ -199,7 +199,7 @@ void SymbolTreeWidget::updateVisibleNodes(bool update_hashes)
|
||||
m_ui.treeView->update();
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::expandGroups(QModelIndex index)
|
||||
void SymbolTreeView::expandGroups(QModelIndex index)
|
||||
{
|
||||
if (!m_model)
|
||||
return;
|
||||
@@ -218,7 +218,7 @@ void SymbolTreeWidget::expandGroups(QModelIndex index)
|
||||
}
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::setupTree()
|
||||
void SymbolTreeView::setupTree()
|
||||
{
|
||||
m_model = new SymbolTreeModel(cpu(), this);
|
||||
m_ui.treeView->setModel(m_model);
|
||||
@@ -237,10 +237,10 @@ void SymbolTreeWidget::setupTree()
|
||||
|
||||
configureColumns();
|
||||
|
||||
connect(m_ui.treeView, &QTreeView::pressed, this, &SymbolTreeWidget::onTreeViewClicked);
|
||||
connect(m_ui.treeView, &QTreeView::pressed, this, &SymbolTreeView::onTreeViewClicked);
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::buildTree(const ccc::SymbolDatabase& database)
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeView::buildTree(const ccc::SymbolDatabase& database)
|
||||
{
|
||||
std::vector<SymbolWork> symbols = getSymbols(m_ui.filterBox->text(), database);
|
||||
|
||||
@@ -321,7 +321,7 @@ std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::buildTree(const ccc::SymbolDat
|
||||
return root;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupBySourceFile(
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeView::groupBySourceFile(
|
||||
std::unique_ptr<SymbolTreeNode> child,
|
||||
const SymbolWork& child_work,
|
||||
SymbolTreeNode*& prev_group,
|
||||
@@ -364,7 +364,7 @@ std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupBySourceFile(
|
||||
return child;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupBySection(
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeView::groupBySection(
|
||||
std::unique_ptr<SymbolTreeNode> child,
|
||||
const SymbolWork& child_work,
|
||||
SymbolTreeNode*& prev_group,
|
||||
@@ -403,7 +403,7 @@ std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupBySection(
|
||||
return child;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupByModule(
|
||||
std::unique_ptr<SymbolTreeNode> SymbolTreeView::groupByModule(
|
||||
std::unique_ptr<SymbolTreeNode> child,
|
||||
const SymbolWork& child_work,
|
||||
SymbolTreeNode*& prev_group,
|
||||
@@ -448,7 +448,7 @@ std::unique_ptr<SymbolTreeNode> SymbolTreeWidget::groupByModule(
|
||||
return child;
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::openContextMenu(QPoint pos)
|
||||
void SymbolTreeView::openContextMenu(QPoint pos)
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node)
|
||||
@@ -462,22 +462,22 @@ void SymbolTreeWidget::openContextMenu(QPoint pos)
|
||||
menu->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
QAction* copy_name = menu->addAction(tr("Copy Name"));
|
||||
connect(copy_name, &QAction::triggered, this, &SymbolTreeWidget::onCopyName);
|
||||
connect(copy_name, &QAction::triggered, this, &SymbolTreeView::onCopyName);
|
||||
|
||||
if (m_flags & ALLOW_MANGLED_NAME_ACTIONS)
|
||||
{
|
||||
QAction* copy_mangled_name = menu->addAction(tr("Copy Mangled Name"));
|
||||
connect(copy_mangled_name, &QAction::triggered, this, &SymbolTreeWidget::onCopyMangledName);
|
||||
connect(copy_mangled_name, &QAction::triggered, this, &SymbolTreeView::onCopyMangledName);
|
||||
}
|
||||
|
||||
QAction* copy_location = menu->addAction(tr("Copy Location"));
|
||||
connect(copy_location, &QAction::triggered, this, &SymbolTreeWidget::onCopyLocation);
|
||||
connect(copy_location, &QAction::triggered, this, &SymbolTreeView::onCopyLocation);
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
QAction* rename_symbol = menu->addAction(tr("Rename Symbol"));
|
||||
rename_symbol->setEnabled(node_is_symbol);
|
||||
connect(rename_symbol, &QAction::triggered, this, &SymbolTreeWidget::onRenameSymbol);
|
||||
connect(rename_symbol, &QAction::triggered, this, &SymbolTreeView::onRenameSymbol);
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
@@ -551,22 +551,22 @@ void SymbolTreeWidget::openContextMenu(QPoint pos)
|
||||
|
||||
QAction* reset_children = menu->addAction(tr("Reset Children"));
|
||||
reset_children->setEnabled(node_is_object);
|
||||
connect(reset_children, &QAction::triggered, this, &SymbolTreeWidget::onResetChildren);
|
||||
connect(reset_children, &QAction::triggered, this, &SymbolTreeView::onResetChildren);
|
||||
|
||||
QAction* change_type_temporarily = menu->addAction(tr("Change Type Temporarily"));
|
||||
change_type_temporarily->setEnabled(node_is_object);
|
||||
connect(change_type_temporarily, &QAction::triggered, this, &SymbolTreeWidget::onChangeTypeTemporarily);
|
||||
connect(change_type_temporarily, &QAction::triggered, this, &SymbolTreeView::onChangeTypeTemporarily);
|
||||
}
|
||||
|
||||
menu->popup(m_ui.treeView->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
bool SymbolTreeWidget::needsReset() const
|
||||
bool SymbolTreeView::needsReset() const
|
||||
{
|
||||
return !m_model || m_model->needsReset();
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onDeleteButtonPressed()
|
||||
void SymbolTreeView::onDeleteButtonPressed()
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node)
|
||||
@@ -585,7 +585,7 @@ void SymbolTreeWidget::onDeleteButtonPressed()
|
||||
reset();
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onCopyName()
|
||||
void SymbolTreeView::onCopyName()
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node)
|
||||
@@ -594,7 +594,7 @@ void SymbolTreeWidget::onCopyName()
|
||||
QApplication::clipboard()->setText(node->name);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onCopyMangledName()
|
||||
void SymbolTreeView::onCopyMangledName()
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node)
|
||||
@@ -606,7 +606,7 @@ void SymbolTreeWidget::onCopyMangledName()
|
||||
QApplication::clipboard()->setText(node->name);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onCopyLocation()
|
||||
void SymbolTreeView::onCopyLocation()
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node)
|
||||
@@ -615,7 +615,7 @@ void SymbolTreeWidget::onCopyLocation()
|
||||
QApplication::clipboard()->setText(node->location.toString(cpu()));
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onRenameSymbol()
|
||||
void SymbolTreeView::onRenameSymbol()
|
||||
{
|
||||
SymbolTreeNode* node = currentNode();
|
||||
if (!node || !node->symbol.valid())
|
||||
@@ -643,7 +643,7 @@ void SymbolTreeWidget::onRenameSymbol()
|
||||
});
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onResetChildren()
|
||||
void SymbolTreeView::onResetChildren()
|
||||
{
|
||||
if (!m_model)
|
||||
return;
|
||||
@@ -655,7 +655,7 @@ void SymbolTreeWidget::onResetChildren()
|
||||
m_model->resetChildren(index);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onChangeTypeTemporarily()
|
||||
void SymbolTreeView::onChangeTypeTemporarily()
|
||||
{
|
||||
if (!m_model)
|
||||
return;
|
||||
@@ -683,7 +683,7 @@ void SymbolTreeWidget::onChangeTypeTemporarily()
|
||||
QMessageBox::warning(this, tr("Cannot Change Type"), *error_message);
|
||||
}
|
||||
|
||||
void SymbolTreeWidget::onTreeViewClicked(const QModelIndex& index)
|
||||
void SymbolTreeView::onTreeViewClicked(const QModelIndex& index)
|
||||
{
|
||||
if (!index.isValid())
|
||||
return;
|
||||
@@ -701,7 +701,7 @@ void SymbolTreeWidget::onTreeViewClicked(const QModelIndex& index)
|
||||
goToInDisassembler(node->location.address, false);
|
||||
}
|
||||
|
||||
SymbolTreeNode* SymbolTreeWidget::currentNode()
|
||||
SymbolTreeNode* SymbolTreeView::currentNode()
|
||||
{
|
||||
if (!m_model)
|
||||
return nullptr;
|
||||
@@ -712,20 +712,20 @@ SymbolTreeNode* SymbolTreeWidget::currentNode()
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
FunctionTreeWidget::FunctionTreeWidget(const DebuggerWidgetParameters& parameters)
|
||||
: SymbolTreeWidget(
|
||||
FunctionTreeView::FunctionTreeView(const DebuggerViewParameters& parameters)
|
||||
: SymbolTreeView(
|
||||
ALLOW_GROUPING | ALLOW_MANGLED_NAME_ACTIONS | CLICK_TO_GO_TO_IN_DISASSEMBLER,
|
||||
4,
|
||||
parameters)
|
||||
{
|
||||
}
|
||||
|
||||
FunctionTreeWidget::~FunctionTreeWidget() = default;
|
||||
FunctionTreeView::~FunctionTreeView() = default;
|
||||
|
||||
std::vector<SymbolTreeWidget::SymbolWork> FunctionTreeWidget::getSymbols(
|
||||
std::vector<SymbolTreeView::SymbolWork> FunctionTreeView::getSymbols(
|
||||
const QString& filter, const ccc::SymbolDatabase& database)
|
||||
{
|
||||
std::vector<SymbolTreeWidget::SymbolWork> symbols;
|
||||
std::vector<SymbolTreeView::SymbolWork> symbols;
|
||||
|
||||
for (const ccc::Function& function : database.functions)
|
||||
{
|
||||
@@ -750,7 +750,7 @@ std::vector<SymbolTreeWidget::SymbolWork> FunctionTreeWidget::getSymbols(
|
||||
return symbols;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> FunctionTreeWidget::buildNode(
|
||||
std::unique_ptr<SymbolTreeNode> FunctionTreeView::buildNode(
|
||||
SymbolWork& work, const ccc::SymbolDatabase& database) const
|
||||
{
|
||||
const ccc::Function& function = static_cast<const ccc::Function&>(*work.symbol);
|
||||
@@ -777,7 +777,7 @@ std::unique_ptr<SymbolTreeNode> FunctionTreeWidget::buildNode(
|
||||
return node;
|
||||
}
|
||||
|
||||
void FunctionTreeWidget::configureColumns()
|
||||
void FunctionTreeView::configureColumns()
|
||||
{
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::NAME, false);
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::LOCATION, false);
|
||||
@@ -790,7 +790,7 @@ void FunctionTreeWidget::configureColumns()
|
||||
m_ui.treeView->header()->setStretchLastSection(false);
|
||||
}
|
||||
|
||||
void FunctionTreeWidget::onNewButtonPressed()
|
||||
void FunctionTreeView::onNewButtonPressed()
|
||||
{
|
||||
NewFunctionDialog* dialog = new NewFunctionDialog(cpu(), this);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -800,20 +800,20 @@ void FunctionTreeWidget::onNewButtonPressed()
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
GlobalVariableTreeWidget::GlobalVariableTreeWidget(const DebuggerWidgetParameters& parameters)
|
||||
: SymbolTreeWidget(
|
||||
GlobalVariableTreeView::GlobalVariableTreeView(const DebuggerViewParameters& parameters)
|
||||
: SymbolTreeView(
|
||||
ALLOW_GROUPING | ALLOW_SORTING_BY_IF_TYPE_IS_KNOWN | ALLOW_TYPE_ACTIONS | ALLOW_MANGLED_NAME_ACTIONS,
|
||||
1,
|
||||
parameters)
|
||||
{
|
||||
}
|
||||
|
||||
GlobalVariableTreeWidget::~GlobalVariableTreeWidget() = default;
|
||||
GlobalVariableTreeView::~GlobalVariableTreeView() = default;
|
||||
|
||||
std::vector<SymbolTreeWidget::SymbolWork> GlobalVariableTreeWidget::getSymbols(
|
||||
std::vector<SymbolTreeView::SymbolWork> GlobalVariableTreeView::getSymbols(
|
||||
const QString& filter, const ccc::SymbolDatabase& database)
|
||||
{
|
||||
std::vector<SymbolTreeWidget::SymbolWork> symbols;
|
||||
std::vector<SymbolTreeView::SymbolWork> symbols;
|
||||
|
||||
for (const ccc::GlobalVariable& global_variable : database.global_variables)
|
||||
{
|
||||
@@ -875,7 +875,7 @@ std::vector<SymbolTreeWidget::SymbolWork> GlobalVariableTreeWidget::getSymbols(
|
||||
return symbols;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> GlobalVariableTreeWidget::buildNode(
|
||||
std::unique_ptr<SymbolTreeNode> GlobalVariableTreeView::buildNode(
|
||||
SymbolWork& work, const ccc::SymbolDatabase& database) const
|
||||
{
|
||||
std::unique_ptr<SymbolTreeNode> node = std::make_unique<SymbolTreeNode>();
|
||||
@@ -918,7 +918,7 @@ std::unique_ptr<SymbolTreeNode> GlobalVariableTreeWidget::buildNode(
|
||||
return node;
|
||||
}
|
||||
|
||||
void GlobalVariableTreeWidget::configureColumns()
|
||||
void GlobalVariableTreeView::configureColumns()
|
||||
{
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::NAME, false);
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::LOCATION, false);
|
||||
@@ -933,7 +933,7 @@ void GlobalVariableTreeWidget::configureColumns()
|
||||
m_ui.treeView->header()->setStretchLastSection(false);
|
||||
}
|
||||
|
||||
void GlobalVariableTreeWidget::onNewButtonPressed()
|
||||
void GlobalVariableTreeView::onNewButtonPressed()
|
||||
{
|
||||
NewGlobalVariableDialog* dialog = new NewGlobalVariableDialog(cpu(), this);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -943,17 +943,17 @@ void GlobalVariableTreeWidget::onNewButtonPressed()
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
LocalVariableTreeWidget::LocalVariableTreeWidget(const DebuggerWidgetParameters& parameters)
|
||||
: SymbolTreeWidget(
|
||||
LocalVariableTreeView::LocalVariableTreeView(const DebuggerViewParameters& parameters)
|
||||
: SymbolTreeView(
|
||||
ALLOW_TYPE_ACTIONS,
|
||||
1,
|
||||
parameters)
|
||||
{
|
||||
}
|
||||
|
||||
LocalVariableTreeWidget::~LocalVariableTreeWidget() = default;
|
||||
LocalVariableTreeView::~LocalVariableTreeView() = default;
|
||||
|
||||
bool LocalVariableTreeWidget::needsReset() const
|
||||
bool LocalVariableTreeView::needsReset() const
|
||||
{
|
||||
if (!m_function.valid())
|
||||
return true;
|
||||
@@ -975,10 +975,10 @@ bool LocalVariableTreeWidget::needsReset() const
|
||||
if (left_function)
|
||||
return true;
|
||||
|
||||
return SymbolTreeWidget::needsReset();
|
||||
return SymbolTreeView::needsReset();
|
||||
}
|
||||
|
||||
std::vector<SymbolTreeWidget::SymbolWork> LocalVariableTreeWidget::getSymbols(
|
||||
std::vector<SymbolTreeView::SymbolWork> LocalVariableTreeView::getSymbols(
|
||||
const QString& filter, const ccc::SymbolDatabase& database)
|
||||
{
|
||||
u32 program_counter = cpu().getPC();
|
||||
@@ -992,7 +992,7 @@ std::vector<SymbolTreeWidget::SymbolWork> LocalVariableTreeWidget::getSymbols(
|
||||
m_function = function->handle();
|
||||
m_caller_stack_pointer = cpu().getCallerStackPointer(*function);
|
||||
|
||||
std::vector<SymbolTreeWidget::SymbolWork> symbols;
|
||||
std::vector<SymbolTreeView::SymbolWork> symbols;
|
||||
|
||||
for (const ccc::LocalVariableHandle local_variable_handle : *function->local_variables())
|
||||
{
|
||||
@@ -1024,7 +1024,7 @@ std::vector<SymbolTreeWidget::SymbolWork> LocalVariableTreeWidget::getSymbols(
|
||||
return symbols;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> LocalVariableTreeWidget::buildNode(
|
||||
std::unique_ptr<SymbolTreeNode> LocalVariableTreeView::buildNode(
|
||||
SymbolWork& work, const ccc::SymbolDatabase& database) const
|
||||
{
|
||||
const ccc::LocalVariable& local_variable = static_cast<const ccc::LocalVariable&>(*work.symbol);
|
||||
@@ -1047,7 +1047,7 @@ std::unique_ptr<SymbolTreeNode> LocalVariableTreeWidget::buildNode(
|
||||
return node;
|
||||
}
|
||||
|
||||
void LocalVariableTreeWidget::configureColumns()
|
||||
void LocalVariableTreeView::configureColumns()
|
||||
{
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::NAME, false);
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::LOCATION, false);
|
||||
@@ -1062,7 +1062,7 @@ void LocalVariableTreeWidget::configureColumns()
|
||||
m_ui.treeView->header()->setStretchLastSection(false);
|
||||
}
|
||||
|
||||
void LocalVariableTreeWidget::onNewButtonPressed()
|
||||
void LocalVariableTreeView::onNewButtonPressed()
|
||||
{
|
||||
NewLocalVariableDialog* dialog = new NewLocalVariableDialog(cpu(), this);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -1072,17 +1072,17 @@ void LocalVariableTreeWidget::onNewButtonPressed()
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
ParameterVariableTreeWidget::ParameterVariableTreeWidget(const DebuggerWidgetParameters& parameters)
|
||||
: SymbolTreeWidget(
|
||||
ParameterVariableTreeView::ParameterVariableTreeView(const DebuggerViewParameters& parameters)
|
||||
: SymbolTreeView(
|
||||
ALLOW_TYPE_ACTIONS,
|
||||
1,
|
||||
parameters)
|
||||
{
|
||||
}
|
||||
|
||||
ParameterVariableTreeWidget::~ParameterVariableTreeWidget() = default;
|
||||
ParameterVariableTreeView::~ParameterVariableTreeView() = default;
|
||||
|
||||
bool ParameterVariableTreeWidget::needsReset() const
|
||||
bool ParameterVariableTreeView::needsReset() const
|
||||
{
|
||||
if (!m_function.valid())
|
||||
return true;
|
||||
@@ -1104,13 +1104,13 @@ bool ParameterVariableTreeWidget::needsReset() const
|
||||
if (left_function)
|
||||
return true;
|
||||
|
||||
return SymbolTreeWidget::needsReset();
|
||||
return SymbolTreeView::needsReset();
|
||||
}
|
||||
|
||||
std::vector<SymbolTreeWidget::SymbolWork> ParameterVariableTreeWidget::getSymbols(
|
||||
std::vector<SymbolTreeView::SymbolWork> ParameterVariableTreeView::getSymbols(
|
||||
const QString& filter, const ccc::SymbolDatabase& database)
|
||||
{
|
||||
std::vector<SymbolTreeWidget::SymbolWork> symbols;
|
||||
std::vector<SymbolTreeView::SymbolWork> symbols;
|
||||
|
||||
u32 program_counter = cpu().getPC();
|
||||
const ccc::Function* function = database.functions.symbol_overlapping_address(program_counter);
|
||||
@@ -1154,7 +1154,7 @@ std::vector<SymbolTreeWidget::SymbolWork> ParameterVariableTreeWidget::getSymbol
|
||||
return symbols;
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolTreeNode> ParameterVariableTreeWidget::buildNode(
|
||||
std::unique_ptr<SymbolTreeNode> ParameterVariableTreeView::buildNode(
|
||||
SymbolWork& work, const ccc::SymbolDatabase& database) const
|
||||
{
|
||||
const ccc::ParameterVariable& parameter_variable = static_cast<const ccc::ParameterVariable&>(*work.symbol);
|
||||
@@ -1174,7 +1174,7 @@ std::unique_ptr<SymbolTreeNode> ParameterVariableTreeWidget::buildNode(
|
||||
return node;
|
||||
}
|
||||
|
||||
void ParameterVariableTreeWidget::configureColumns()
|
||||
void ParameterVariableTreeView::configureColumns()
|
||||
{
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::NAME, false);
|
||||
m_ui.treeView->setColumnHidden(SymbolTreeModel::LOCATION, false);
|
||||
@@ -1189,7 +1189,7 @@ void ParameterVariableTreeWidget::configureColumns()
|
||||
m_ui.treeView->header()->setStretchLastSection(false);
|
||||
}
|
||||
|
||||
void ParameterVariableTreeWidget::onNewButtonPressed()
|
||||
void ParameterVariableTreeView::onNewButtonPressed()
|
||||
{
|
||||
NewParameterVariableDialog* dialog = new NewParameterVariableDialog(cpu(), this);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
@@ -3,19 +3,19 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_SymbolTreeWidget.h"
|
||||
#include "ui_SymbolTreeView.h"
|
||||
|
||||
#include "Debugger/DebuggerWidget.h"
|
||||
#include "Debugger/DebuggerView.h"
|
||||
#include "Debugger/SymbolTree/SymbolTreeModel.h"
|
||||
|
||||
// A symbol tree widget with its associated refresh button, filter box and
|
||||
// A symbol tree view with its associated refresh button, filter box and
|
||||
// right-click menu. Supports grouping, sorting and various other settings.
|
||||
class SymbolTreeWidget : public DebuggerWidget
|
||||
class SymbolTreeView : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
virtual ~SymbolTreeWidget();
|
||||
virtual ~SymbolTreeView();
|
||||
|
||||
void updateModel();
|
||||
void reset();
|
||||
@@ -33,10 +33,10 @@ protected:
|
||||
const ccc::SourceFile* source_file = nullptr;
|
||||
};
|
||||
|
||||
SymbolTreeWidget(
|
||||
SymbolTreeView(
|
||||
u32 flags,
|
||||
s32 symbol_address_alignment,
|
||||
const DebuggerWidgetParameters& parameters);
|
||||
const DebuggerViewParameters& parameters);
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
|
||||
@@ -90,7 +90,7 @@ protected:
|
||||
|
||||
SymbolTreeNode* currentNode();
|
||||
|
||||
Ui::SymbolTreeWidget m_ui;
|
||||
Ui::SymbolTreeView m_ui;
|
||||
|
||||
SymbolTreeModel* m_model = nullptr;
|
||||
|
||||
@@ -114,12 +114,12 @@ protected:
|
||||
bool m_sort_by_if_type_is_known = false;
|
||||
};
|
||||
|
||||
class FunctionTreeWidget : public SymbolTreeWidget
|
||||
class FunctionTreeView : public SymbolTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FunctionTreeWidget(const DebuggerWidgetParameters& parameters);
|
||||
virtual ~FunctionTreeWidget();
|
||||
explicit FunctionTreeView(const DebuggerViewParameters& parameters);
|
||||
virtual ~FunctionTreeView();
|
||||
|
||||
protected:
|
||||
std::vector<SymbolWork> getSymbols(
|
||||
@@ -133,12 +133,12 @@ protected:
|
||||
void onNewButtonPressed() override;
|
||||
};
|
||||
|
||||
class GlobalVariableTreeWidget : public SymbolTreeWidget
|
||||
class GlobalVariableTreeView : public SymbolTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit GlobalVariableTreeWidget(const DebuggerWidgetParameters& parameters);
|
||||
virtual ~GlobalVariableTreeWidget();
|
||||
explicit GlobalVariableTreeView(const DebuggerViewParameters& parameters);
|
||||
virtual ~GlobalVariableTreeView();
|
||||
|
||||
protected:
|
||||
std::vector<SymbolWork> getSymbols(
|
||||
@@ -152,12 +152,12 @@ protected:
|
||||
void onNewButtonPressed() override;
|
||||
};
|
||||
|
||||
class LocalVariableTreeWidget : public SymbolTreeWidget
|
||||
class LocalVariableTreeView : public SymbolTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit LocalVariableTreeWidget(const DebuggerWidgetParameters& parameters);
|
||||
virtual ~LocalVariableTreeWidget();
|
||||
explicit LocalVariableTreeView(const DebuggerViewParameters& parameters);
|
||||
virtual ~LocalVariableTreeView();
|
||||
|
||||
protected:
|
||||
bool needsReset() const override;
|
||||
@@ -176,12 +176,12 @@ protected:
|
||||
std::optional<u32> m_caller_stack_pointer;
|
||||
};
|
||||
|
||||
class ParameterVariableTreeWidget : public SymbolTreeWidget
|
||||
class ParameterVariableTreeView : public SymbolTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ParameterVariableTreeWidget(const DebuggerWidgetParameters& parameters);
|
||||
virtual ~ParameterVariableTreeWidget();
|
||||
explicit ParameterVariableTreeView(const DebuggerViewParameters& parameters);
|
||||
virtual ~ParameterVariableTreeView();
|
||||
|
||||
protected:
|
||||
bool needsReset() const override;
|
||||
@@ -1,23 +1,23 @@
|
||||
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
|
||||
// SPDX-License-Identifier: GPL-3.0+
|
||||
|
||||
#include "ThreadWidget.h"
|
||||
#include "ThreadView.h"
|
||||
|
||||
#include "QtUtils.h"
|
||||
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtWidgets/QMenu>
|
||||
|
||||
ThreadWidget::ThreadWidget(const DebuggerWidgetParameters& parameters)
|
||||
: DebuggerWidget(parameters, NO_DEBUGGER_FLAGS)
|
||||
ThreadView::ThreadView(const DebuggerViewParameters& parameters)
|
||||
: DebuggerView(parameters, NO_DEBUGGER_FLAGS)
|
||||
, m_model(new ThreadModel(cpu()))
|
||||
, m_proxy_model(new QSortFilterProxyModel())
|
||||
{
|
||||
m_ui.setupUi(this);
|
||||
|
||||
m_ui.threadList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui.threadList, &QTableView::customContextMenuRequested, this, &ThreadWidget::openContextMenu);
|
||||
connect(m_ui.threadList, &QTableView::doubleClicked, this, &ThreadWidget::onDoubleClick);
|
||||
connect(m_ui.threadList, &QTableView::customContextMenuRequested, this, &ThreadView::openContextMenu);
|
||||
connect(m_ui.threadList, &QTableView::doubleClicked, this, &ThreadView::onDoubleClick);
|
||||
|
||||
m_proxy_model->setSourceModel(m_model);
|
||||
m_proxy_model->setSortRole(Qt::UserRole);
|
||||
@@ -36,7 +36,7 @@ ThreadWidget::ThreadWidget(const DebuggerWidgetParameters& parameters)
|
||||
});
|
||||
}
|
||||
|
||||
void ThreadWidget::openContextMenu(QPoint pos)
|
||||
void ThreadView::openContextMenu(QPoint pos)
|
||||
{
|
||||
if (!m_ui.threadList->selectionModel()->hasSelection())
|
||||
return;
|
||||
@@ -63,7 +63,7 @@ void ThreadWidget::openContextMenu(QPoint pos)
|
||||
menu->popup(m_ui.threadList->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void ThreadWidget::onDoubleClick(const QModelIndex& index)
|
||||
void ThreadView::onDoubleClick(const QModelIndex& index)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
@@ -3,25 +3,25 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ui_ThreadWidget.h"
|
||||
#include "ui_ThreadView.h"
|
||||
|
||||
#include "DebuggerWidget.h"
|
||||
#include "DebuggerView.h"
|
||||
#include "ThreadModel.h"
|
||||
|
||||
#include <QtCore/QSortFilterProxyModel>
|
||||
|
||||
class ThreadWidget final : public DebuggerWidget
|
||||
class ThreadView final : public DebuggerView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ThreadWidget(const DebuggerWidgetParameters& parameters);
|
||||
ThreadView(const DebuggerViewParameters& parameters);
|
||||
|
||||
void openContextMenu(QPoint pos);
|
||||
void onDoubleClick(const QModelIndex& index);
|
||||
|
||||
private:
|
||||
Ui::ThreadWidget m_ui;
|
||||
Ui::ThreadView m_ui;
|
||||
|
||||
ThreadModel* m_model;
|
||||
QSortFilterProxyModel* m_proxy_model;
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ThreadWidget</class>
|
||||
<widget class="QWidget" name="ThreadWidget">
|
||||
<class>ThreadView</class>
|
||||
<widget class="QWidget" name="ThreadView">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <QtCore/QSortFilterProxyModel>
|
||||
#include <QtGui/QPainter>
|
||||
#include <QtGui/QPixmap>
|
||||
#include <QtGui/QPixmapCache>
|
||||
#include <QtGui/QWheelEvent>
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QtWidgets/QHeaderView>
|
||||
@@ -113,20 +114,51 @@ namespace
|
||||
// https://stackoverflow.com/questions/32216568/how-to-set-icon-center-in-qtableview
|
||||
Q_ASSERT(index.isValid());
|
||||
|
||||
// draw default item
|
||||
// Draw the base item, with a blank icon
|
||||
QStyleOptionViewItem opt = option;
|
||||
initStyleOption(&opt, index);
|
||||
opt.type = QStyleOption::SO_Default;
|
||||
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, 0);
|
||||
opt.icon = QIcon();
|
||||
// Based on QStyledItemDelegate::paint()
|
||||
const QStyle* style = option.widget ? option.widget->style() : QApplication::style();
|
||||
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, option.widget);
|
||||
|
||||
// Fetch icon pixmap
|
||||
const QRect r = option.rect;
|
||||
const QPixmap pix = qvariant_cast<QPixmap>(index.data(Qt::DecorationRole));
|
||||
const int pix_width = static_cast<int>(pix.width() / pix.devicePixelRatio());
|
||||
const int pix_height = static_cast<int>(pix.width() / pix.devicePixelRatio());
|
||||
const int pix_height = static_cast<int>(pix.height() / pix.devicePixelRatio());
|
||||
|
||||
// draw pixmap at center of item
|
||||
// Draw the icon, using code derived from QItemDelegate::drawDecoration()
|
||||
const bool enabled = option.state & QStyle::State_Enabled;
|
||||
const QPoint p = QPoint((r.width() - pix_width) / 2, (r.height() - pix_height) / 2);
|
||||
painter->drawPixmap(r.topLeft() + p, pix);
|
||||
if (option.state & QStyle::State_Selected)
|
||||
{
|
||||
// See QItemDelegate::selectedPixmap()
|
||||
QString key = QString::fromStdString(fmt::format("{:016X}-{:d}", pix.cacheKey(), enabled));
|
||||
QPixmap pm;
|
||||
if (!QPixmapCache::find(key, &pm))
|
||||
{
|
||||
QImage img = pix.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
|
||||
|
||||
QColor color = option.palette.color(enabled ? QPalette::Normal : QPalette::Disabled,
|
||||
QPalette::Highlight);
|
||||
color.setAlphaF(0.3f);
|
||||
|
||||
QPainter tinted_painter(&img);
|
||||
tinted_painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
|
||||
tinted_painter.fillRect(0, 0, img.width(), img.height(), color);
|
||||
tinted_painter.end();
|
||||
|
||||
pm = QPixmap(QPixmap::fromImage(img));
|
||||
QPixmapCache::insert(key, pm);
|
||||
}
|
||||
|
||||
painter->drawPixmap(r.topLeft() + p, pm);
|
||||
}
|
||||
else
|
||||
{
|
||||
painter->drawPixmap(r.topLeft() + p, pix);
|
||||
}
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
@@ -190,6 +222,7 @@ void GameListWidget::initialize()
|
||||
m_table_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
||||
m_table_view->setVerticalScrollMode(QAbstractItemView::ScrollMode::ScrollPerPixel);
|
||||
m_table_view->setItemDelegateForColumn(0, new GameListIconStyleDelegate(this));
|
||||
m_table_view->setItemDelegateForColumn(8, new GameListIconStyleDelegate(this));
|
||||
|
||||
loadTableViewColumnVisibilitySettings();
|
||||
loadTableViewColumnSortSettings();
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "DebugUserInterfaceSettingsWidget.h"
|
||||
|
||||
#include "SettingWidgetBinder.h"
|
||||
#include "Debugger/DebuggerWindow.h"
|
||||
|
||||
static const char* s_drop_indicators[] = {
|
||||
QT_TRANSLATE_NOOP("DebugUserInterfaceSettingsWidget", "Classic"),
|
||||
@@ -19,32 +20,40 @@ DebugUserInterfaceSettingsWidget::DebugUserInterfaceSettingsWidget(SettingsWindo
|
||||
|
||||
m_ui.setupUi(this);
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(
|
||||
sif, m_ui.showOnStartupCheckBox, "Debugger/UserInterface", "ShowOnStartup", false);
|
||||
|
||||
SettingWidgetBinder::BindWidgetToIntSetting(
|
||||
sif, m_ui.refreshInterval, "Debugger/UserInterface", "RefreshInterval", 1000);
|
||||
connect(m_ui.refreshInterval, &QSpinBox::valueChanged, this, []() {
|
||||
if (g_debugger_window)
|
||||
g_debugger_window->updateFromSettings();
|
||||
});
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.showOnStartupCheckBox, tr("Show On Startup"), tr("Unchecked"),
|
||||
m_ui.refreshInterval, tr("Refresh Interval"), tr("1000ms"),
|
||||
tr("The amount of time to wait between subsequent attempts to update the user interface to reflect the state "
|
||||
"of the virtual machine."));
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(
|
||||
sif, m_ui.showOnStartup, "Debugger/UserInterface", "ShowOnStartup", false);
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.showOnStartup, tr("Show On Startup"), tr("Unchecked"),
|
||||
tr("Open the debugger window automatically when PCSX2 starts."));
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(
|
||||
sif, m_ui.saveWindowGeometryCheckBox, "Debugger/UserInterface", "SaveWindowGeometry", true);
|
||||
|
||||
sif, m_ui.saveWindowGeometry, "Debugger/UserInterface", "SaveWindowGeometry", true);
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.saveWindowGeometryCheckBox, tr("Save Window Geometry"), tr("Checked"),
|
||||
m_ui.saveWindowGeometry, tr("Save Window Geometry"), tr("Checked"),
|
||||
tr("Save the position and size of the debugger window when it is closed so that it can be restored later."));
|
||||
|
||||
SettingWidgetBinder::BindWidgetToEnumSetting(
|
||||
sif,
|
||||
m_ui.dropIndicatorCombo,
|
||||
m_ui.dropIndicator,
|
||||
"Debugger/UserInterface",
|
||||
"DropIndicatorStyle",
|
||||
s_drop_indicators,
|
||||
s_drop_indicators,
|
||||
s_drop_indicators[0],
|
||||
"DebugUserInterfaceSettingsWidget");
|
||||
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.dropIndicatorCombo, tr("Drop Indicator Style"), tr("Classic"),
|
||||
m_ui.dropIndicator, tr("Drop Indicator Style"), tr("Classic"),
|
||||
tr("Choose how the drop indicators that appear when you drag dock windows in the debugger are styled. "
|
||||
"You will have to restart the debugger for this option to take effect."));
|
||||
}
|
||||
|
||||
@@ -38,15 +38,8 @@
|
||||
<string>Debugger Window</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="saveWindowGeometryCheckBox">
|
||||
<property name="text">
|
||||
<string>Save Window Geometry</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="showOnStartupCheckBox">
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="showOnStartup">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
@@ -58,6 +51,36 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="saveWindowGeometry">
|
||||
<property name="text">
|
||||
<string>Save Window Geometry</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="refreshIntervalLabel">
|
||||
<property name="text">
|
||||
<string>Refresh Interval:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="refreshInterval">
|
||||
<property name="suffix">
|
||||
<string>ms</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -76,12 +99,12 @@
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="dropIndicatorLabel">
|
||||
<property name="text">
|
||||
<string>Drop Indicator Style</string>
|
||||
<string>Drop Indicator Style:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="dropIndicatorCombo"/>
|
||||
<widget class="QComboBox" name="dropIndicator"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -95,7 +95,7 @@
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeLocation.cpp" />
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeModel.cpp" />
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeNode.cpp" />
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeWidgets.cpp" />
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeViews.cpp" />
|
||||
<ClCompile Include="Debugger\SymbolTree\TypeString.cpp" />
|
||||
<ClCompile Include="EarlyHardwareCheck.cpp" />
|
||||
<ClCompile Include="LogWindow.cpp" />
|
||||
@@ -112,18 +112,18 @@
|
||||
<ClCompile Include="Tools\InputRecording\InputRecordingViewer.cpp" />
|
||||
<ClCompile Include="Tools\InputRecording\NewInputRecordingDlg.cpp" />
|
||||
<ClCompile Include="Debugger\AnalysisOptionsDialog.cpp" />
|
||||
<ClCompile Include="Debugger\DebuggerWidget.cpp" />
|
||||
<ClCompile Include="Debugger\DebuggerView.cpp" />
|
||||
<ClCompile Include="Debugger\DebuggerWindow.cpp" />
|
||||
<ClCompile Include="Debugger\DisassemblyWidget.cpp" />
|
||||
<ClCompile Include="Debugger\RegisterWidget.cpp" />
|
||||
<ClCompile Include="Debugger\DisassemblyView.cpp" />
|
||||
<ClCompile Include="Debugger\RegisterView.cpp" />
|
||||
<ClCompile Include="Debugger\DebuggerSettingsManager.cpp" />
|
||||
<ClCompile Include="Debugger\StackModel.cpp" />
|
||||
<ClCompile Include="Debugger\StackWidget.cpp" />
|
||||
<ClCompile Include="Debugger\StackView.cpp" />
|
||||
<ClCompile Include="Debugger\ThreadModel.cpp" />
|
||||
<ClCompile Include="Debugger\ThreadWidget.cpp" />
|
||||
<ClCompile Include="Debugger\ThreadView.cpp" />
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointDialog.cpp" />
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointModel.cpp" />
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointWidget.cpp" />
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointView.cpp" />
|
||||
<ClCompile Include="Debugger\Docking\DockLayout.cpp" />
|
||||
<ClCompile Include="Debugger\Docking\DockManager.cpp" />
|
||||
<ClCompile Include="Debugger\Docking\DockMenuBar.cpp" />
|
||||
@@ -133,10 +133,10 @@
|
||||
<ClCompile Include="Debugger\Docking\DropIndicators.cpp" />
|
||||
<ClCompile Include="Debugger\Docking\LayoutEditorDialog.cpp" />
|
||||
<ClCompile Include="Debugger\Docking\NoLayoutsWidget.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\MemorySearchWidget.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\MemoryViewWidget.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\MemorySearchView.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\MemoryView.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesModel.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesWidget.cpp" />
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesView.cpp" />
|
||||
<ClCompile Include="Settings\BIOSSettingsWidget.cpp" />
|
||||
<ClCompile Include="Settings\ControllerBindingWidget.cpp" />
|
||||
<ClCompile Include="Settings\ControllerGlobalSettingsWidget.cpp" />
|
||||
@@ -207,7 +207,7 @@
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeLocation.h" />
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeModel.h" />
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeNode.h" />
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeWidgets.h" />
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeViews.h" />
|
||||
<QtMoc Include="Debugger\SymbolTree\TypeString.h" />
|
||||
<ClInclude Include="Settings\ControllerSettingWidgetBinder.h" />
|
||||
<QtMoc Include="Settings\FolderSettingsWidget.h" />
|
||||
@@ -229,18 +229,18 @@
|
||||
<ClInclude Include="QtUtils.h" />
|
||||
<QtMoc Include="Debugger\AnalysisOptionsDialog.h" />
|
||||
<QtMoc Include="Debugger\DebuggerEvents.h" />
|
||||
<QtMoc Include="Debugger\DebuggerWidget.h" />
|
||||
<QtMoc Include="Debugger\DebuggerView.h" />
|
||||
<QtMoc Include="Debugger\DebuggerWindow.h" />
|
||||
<QtMoc Include="Debugger\DisassemblyWidget.h" />
|
||||
<QtMoc Include="Debugger\RegisterWidget.h" />
|
||||
<QtMoc Include="Debugger\DisassemblyView.h" />
|
||||
<QtMoc Include="Debugger\RegisterView.h" />
|
||||
<QtMoc Include="Debugger\StackModel.h" />
|
||||
<QtMoc Include="Debugger\StackWidget.h" />
|
||||
<QtMoc Include="Debugger\StackView.h" />
|
||||
<QtMoc Include="Debugger\ThreadModel.h" />
|
||||
<QtMoc Include="Debugger\ThreadWidget.h" />
|
||||
<QtMoc Include="Debugger\ThreadView.h" />
|
||||
<ClInclude Include="Debugger\DebuggerSettingsManager.h" />
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointDialog.h" />
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointModel.h" />
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointWidget.h" />
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointView.h" />
|
||||
<QtMoc Include="Debugger\Docking\DockLayout.h" />
|
||||
<QtMoc Include="Debugger\Docking\DockManager.h" />
|
||||
<QtMoc Include="Debugger\Docking\DockMenuBar.h" />
|
||||
@@ -250,10 +250,10 @@
|
||||
<QtMoc Include="Debugger\Docking\DropIndicators.h" />
|
||||
<QtMoc Include="Debugger\Docking\LayoutEditorDialog.h" />
|
||||
<QtMoc Include="Debugger\Docking\NoLayoutsWidget.h" />
|
||||
<QtMoc Include="Debugger\Memory\MemorySearchWidget.h" />
|
||||
<QtMoc Include="Debugger\Memory\MemoryViewWidget.h" />
|
||||
<QtMoc Include="Debugger\Memory\MemorySearchView.h" />
|
||||
<QtMoc Include="Debugger\Memory\MemoryView.h" />
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesModel.h" />
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesWidget.h" />
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesView.h" />
|
||||
<QtMoc Include="Settings\ControllerBindingWidget.h" />
|
||||
<QtMoc Include="Settings\ControllerGlobalSettingsWidget.h" />
|
||||
<ClInclude Include="Settings\MemoryCardConvertWorker.h" />
|
||||
@@ -303,33 +303,33 @@
|
||||
<ClCompile Include="$(IntDir)Settings\moc_DebugUserInterfaceSettingsWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Settings\moc_DebugSettingsWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_AnalysisOptionsDialog.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerWindow.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DisassemblyWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_RegisterWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DisassemblyView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_RegisterView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointDialog.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_DockManager.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_DockMenuBar.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_DockViews.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_DropIndicators.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_LayoutEditorDialog.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_NoLayoutsWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemorySearchWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemoryViewWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemorySearchView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemoryView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesWidget.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesView.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_NewSymbolDialogs.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeDelegates.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeLocation.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeNode.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeWidgets.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeViews.cpp" />
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_TypeString.cpp" />
|
||||
<ClCompile Include="$(IntDir)GameList\moc_GameListModel.cpp" />
|
||||
<ClCompile Include="$(IntDir)GameList\moc_GameListRefreshThread.cpp" />
|
||||
@@ -351,208 +351,85 @@
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUi Include="MainWindow.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\EmptyGameListWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\GameListWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\SettingsWindow.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameListSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\BIOSSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\EmulationSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AdvancedSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameFixSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InputBindingDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerSettingsWindow.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AudioSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DEV9DnsHostDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DEV9SettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameSummaryWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="AutoUpdaterDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="CoverDownloadDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AchievementLoginDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AchievementSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\AnalysisOptionsDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DebuggerWindow.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DisassemblyWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\RegisterWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUi Include="SetupWizardDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="AboutDialog.ui" />
|
||||
<QtUi Include="AutoUpdaterDialog.ui" />
|
||||
<QtUi Include="CoverDownloadDialog.ui" />
|
||||
<QtUi Include="Debugger\AnalysisOptionsDialog.ui" />
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui" />
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointView.ui" />
|
||||
<QtUi Include="Debugger\DebuggerWindow.ui" />
|
||||
<QtUi Include="Debugger\DisassemblyView.ui" />
|
||||
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui" />
|
||||
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui" />
|
||||
<QtUi Include="Debugger\Memory\MemorySearchView.ui" />
|
||||
<QtUi Include="Debugger\Memory\MemoryView.ui" />
|
||||
<QtUi Include="Debugger\Memory\SavedAddressesView.ui" />
|
||||
<QtUi Include="Debugger\RegisterView.ui" />
|
||||
<QtUi Include="Debugger\StackView.ui" />
|
||||
<QtUi Include="Debugger\SymbolTree\NewSymbolDialog.ui" />
|
||||
<QtUi Include="Debugger\SymbolTree\SymbolTreeView.ui" />
|
||||
<QtUi Include="Debugger\ThreadView.ui" />
|
||||
<QtUi Include="GameList\EmptyGameListWidget.ui" />
|
||||
<QtUi Include="GameList\GameListWidget.ui" />
|
||||
<QtUi Include="MainWindow.ui" />
|
||||
<QtUi Include="Settings\AchievementLoginDialog.ui" />
|
||||
<QtUi Include="Settings\AchievementSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\AdvancedSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui" />
|
||||
<QtUi Include="Settings\AudioSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\AudioStretchSettingsDialog.ui" />
|
||||
<QtUi Include="Settings\BIOSSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Jogcon.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Negcon.ui" />
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Popn.ui" />
|
||||
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui" />
|
||||
<QtUi Include="Settings\ControllerMacroEditWidget.ui" />
|
||||
<QtUi Include="Settings\ControllerMacroWidget.ui" />
|
||||
<QtUi Include="Settings\ControllerMappingSettingsDialog.ui" />
|
||||
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui" />
|
||||
<QtUi Include="Settings\ControllerSettingsWindow.ui" />
|
||||
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\DebugSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\DEV9DnsHostDialog.ui" />
|
||||
<QtUi Include="Settings\DEV9SettingsWidget.ui" />
|
||||
<QtUi Include="Settings\EmulationSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\FolderSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\GameCheatSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\GameFixSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\GameListSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\GamePatchDetailsWidget.ui" />
|
||||
<QtUi Include="Settings\GamePatchSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\GameSummaryWidget.ui" />
|
||||
<QtUi Include="Settings\GraphicsSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\InputBindingDialog.ui" />
|
||||
<QtUi Include="Settings\InterfaceSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\MemoryCardConvertDialog.ui" />
|
||||
<QtUi Include="Settings\MemoryCardCreateDialog.ui" />
|
||||
<QtUi Include="Settings\MemoryCardSettingsWidget.ui" />
|
||||
<QtUi Include="Settings\PatchDetailsWidget.ui" />
|
||||
<QtUi Include="Settings\SettingsWindow.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_Buzz.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_DenshaCon.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_DrivingForce.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_Gametrak.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_GTForce.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_GunCon2.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_RealPlay.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_RyojouhenCon.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_ShinkansenCon.ui" />
|
||||
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui" />
|
||||
<QtUi Include="Settings\USBDeviceWidget.ui" />
|
||||
<QtTs Include="Translations\pcsx2-qt_en.ts">
|
||||
<FileType>Document</FileType>
|
||||
</QtTs>
|
||||
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameCheatSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GamePatchSettingsWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_Buzz.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_DenshaCon.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_DrivingForce.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_Gametrak.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_GTForce.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_GunCon2.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_RealPlay.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_RyojouhenCon.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_ShinkansenCon.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBDeviceWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMacroWidget.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<None Include="Debugger\SymbolTree\NewSymbolDialog.ui" />
|
||||
<None Include="Debugger\SymbolTree\SymbolTreeWidget.ui" />
|
||||
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
|
||||
<FileType>Document</FileType>
|
||||
</QtUi>
|
||||
<None Include="Settings\ControllerBindingWidget_Popn.ui" />
|
||||
<None Include="Settings\ControllerMappingSettingsDialog.ui" />
|
||||
<None Include="Settings\FolderSettingsWidget.ui" />
|
||||
<QtUi Include="SetupWizardDialog.ui" />
|
||||
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui" />
|
||||
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<Import Project="$(SolutionDir)common\vsprops\QtCompile.targets" />
|
||||
|
||||
@@ -284,64 +284,40 @@
|
||||
<ClCompile Include="Debugger\AnalysisOptionsDialog.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\DebuggerWidget.cpp">
|
||||
<ClCompile Include="Debugger\DebuggerView.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\DebuggerWindow.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\DisassemblyWidget.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\RegisterWidget.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\StackModel.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\StackWidget.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\ThreadModel.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\ThreadWidget.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_AnalysisOptionsDialog.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerWidget.cpp">
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DebuggerWindow.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DisassemblyWidget.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_RegisterWidget.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackModel.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackWidget.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadModel.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadWidget.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointDialog.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointModel.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointWidget.cpp">
|
||||
<ClCompile Include="$(IntDir)Debugger\Breakpoints\moc_BreakpointView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_DockManager.cpp">
|
||||
@@ -359,16 +335,16 @@
|
||||
<ClCompile Include="$(IntDir)Debugger\Docking\moc_NoLayoutsWidget.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemorySearchWidget.cpp">
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemorySearchView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemoryViewWidget.cpp">
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_MemoryView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesModel.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesWidget.cpp">
|
||||
<ClCompile Include="$(IntDir)Debugger\Memory\moc_SavedAddressesView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ColorPickerButton.cpp" />
|
||||
@@ -415,9 +391,6 @@
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeNode.cpp">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeWidgets.cpp">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\SymbolTree\TypeString.cpp">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</ClCompile>
|
||||
@@ -428,7 +401,7 @@
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointModel.cpp">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointWidget.cpp">
|
||||
<ClCompile Include="Debugger\Breakpoints\BreakpointView.cpp">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Docking\DockLayout.cpp">
|
||||
@@ -452,13 +425,13 @@
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesModel.cpp">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesWidget.cpp">
|
||||
<ClCompile Include="Debugger\Memory\SavedAddressesView.cpp">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Memory\MemorySearchWidget.cpp">
|
||||
<ClCompile Include="Debugger\Memory\MemorySearchView.cpp">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Memory\MemoryViewWidget.cpp">
|
||||
<ClCompile Include="Debugger\Memory\MemoryView.cpp">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\Docking\LayoutEditorDialog.cpp">
|
||||
@@ -482,9 +455,6 @@
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeNode.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeWidgets.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_TypeString.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
@@ -494,6 +464,36 @@
|
||||
<ClCompile Include="Debugger\Docking\DockMenuBar.cpp">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\StackView.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\SymbolTree\SymbolTreeViews.cpp">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_DisassemblyView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_RegisterView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_StackView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\SymbolTree\moc_SymbolTreeViews.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(IntDir)Debugger\moc_ThreadView.cpp">
|
||||
<Filter>moc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\DisassemblyView.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\RegisterView.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Debugger\ThreadView.cpp">
|
||||
<Filter>Debugger</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="..\pcsx2\windows\PCSX2.manifest">
|
||||
@@ -628,30 +628,18 @@
|
||||
<QtMoc Include="Debugger\DebuggerEvents.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\DebuggerWidget.h">
|
||||
<QtMoc Include="Debugger\DebuggerView.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\DebuggerWindow.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\DisassemblyWidget.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\RegisterWidget.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\StackModel.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\StackWidget.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\ThreadModel.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\ThreadWidget.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="ColorPickerButton.h" />
|
||||
<QtMoc Include="SetupWizardDialog.h" />
|
||||
<QtMoc Include="Settings\GameCheatSettingsWidget.h">
|
||||
@@ -668,7 +656,7 @@
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointModel.h">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointWidget.h">
|
||||
<QtMoc Include="Debugger\Breakpoints\BreakpointView.h">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Docking\DockLayout.h">
|
||||
@@ -689,9 +677,6 @@
|
||||
<QtMoc Include="Debugger\Docking\DropIndicators.h">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeWidgets.h">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeDelegates.h">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</QtMoc>
|
||||
@@ -707,13 +692,13 @@
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesModel.h">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesWidget.h">
|
||||
<QtMoc Include="Debugger\Memory\SavedAddressesView.h">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Memory\MemorySearchWidget.h">
|
||||
<QtMoc Include="Debugger\Memory\MemorySearchView.h">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Memory\MemoryViewWidget.h">
|
||||
<QtMoc Include="Debugger\Memory\MemoryView.h">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\Docking\LayoutEditorDialog.h">
|
||||
@@ -728,6 +713,21 @@
|
||||
<QtMoc Include="Debugger\Docking\DockMenuBar.h">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\StackView.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\SymbolTree\SymbolTreeViews.h">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\DisassemblyView.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\RegisterView.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Debugger\ThreadView.h">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtResource Include="resources\resources.qrc">
|
||||
@@ -735,35 +735,64 @@
|
||||
</QtResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUi Include="mainwindow.ui" />
|
||||
<QtUi Include="Settings\BIOSSettingsWidget.ui">
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointView.ui">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemorySearchView.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemoryView.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\SavedAddressesView.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\SymbolTree\NewSymbolDialog.ui">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\AnalysisOptionsDialog.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DebuggerWindow.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\EmptyGameListWidget.ui">
|
||||
<Filter>GameList</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\GameListWidget.ui">
|
||||
<Filter>GameList</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AchievementLoginDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\EmulationSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameListSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\SettingsWindow.ui">
|
||||
<QtUi Include="Settings\AchievementSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AdvancedSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameFixSettingsWidget.ui">
|
||||
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InputBindingDialog.ui">
|
||||
<QtUi Include="Settings\AudioSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerSettingsWindow.ui">
|
||||
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\BIOSSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui">
|
||||
@@ -772,25 +801,43 @@
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget.ui">
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Jogcon.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Negcon.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerBindingWidget_Popn.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameSummaryWidget.ui">
|
||||
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
|
||||
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
|
||||
<QtUi Include="Settings\ControllerMacroWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AudioSettingsWidget.ui">
|
||||
<QtUi Include="Settings\ControllerMappingSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
|
||||
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerSettingsWindow.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DEV9DnsHostDialog.ui">
|
||||
@@ -799,69 +846,54 @@
|
||||
<QtUi Include="Settings\DEV9SettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\EmptyGameListWidget.ui">
|
||||
<Filter>GameList</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="GameList\GameListWidget.ui">
|
||||
<Filter>GameList</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="AutoUpdaterDialog.ui" />
|
||||
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
|
||||
<Filter>Tools\Input Recording</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMacroWidget.ui">
|
||||
<QtUi Include="Settings\EmulationSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AchievementSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AchievementLoginDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="CoverDownloadDialog.ui" />
|
||||
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
|
||||
<Filter>Tools\Input Recording</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBDeviceWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\DebugSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\AnalysisOptionsDialog.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DebuggerWindow.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DisassemblyWidget.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\RegisterWidget.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui">
|
||||
<QtUi Include="Settings\FolderSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameCheatSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameFixSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GameListSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GamePatchDetailsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GamePatchSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="SetupWizardDialog.ui" />
|
||||
<QtUi Include="Settings\GameSummaryWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InputBindingDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\PatchDetailsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\SettingsWindow.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\USBBindingWidget_Buzz.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
@@ -892,50 +924,35 @@
|
||||
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
|
||||
<QtUi Include="Settings\USBDeviceWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
|
||||
<Filter>Tools\Input Recording</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
|
||||
<Filter>Tools\Input Recording</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui">
|
||||
<Filter>Debugger\Breakpoints</Filter>
|
||||
<QtUi Include="AboutDialog.ui" />
|
||||
<QtUi Include="AutoUpdaterDialog.ui" />
|
||||
<QtUi Include="CoverDownloadDialog.ui" />
|
||||
<QtUi Include="MainWindow.ui" />
|
||||
<QtUi Include="SetupWizardDialog.ui" />
|
||||
<QtUi Include="Debugger\StackView.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui">
|
||||
<Filter>Debugger\Memory</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
|
||||
<Filter>Debugger\Docking</Filter>
|
||||
</QtUi>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Settings\FolderSettingsWidget.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</None>
|
||||
<None Include="Settings\ControllerBindingWidget_Popn.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</None>
|
||||
<None Include="Settings\ControllerMappingSettingsDialog.ui">
|
||||
<Filter>Settings</Filter>
|
||||
</None>
|
||||
<None Include="Debugger\SymbolTree\NewSymbolDialog.ui">
|
||||
<QtUi Include="Debugger\SymbolTree\SymbolTreeView.ui">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</None>
|
||||
<None Include="Debugger\SymbolTree\SymbolTreeWidget.ui">
|
||||
<Filter>Debugger\SymbolTree</Filter>
|
||||
</None>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\DisassemblyView.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\RegisterView.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
<QtUi Include="Debugger\ThreadView.ui">
|
||||
<Filter>Debugger</Filter>
|
||||
</QtUi>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtTs Include="Translations\pcsx2-qt_en.ts">
|
||||
|
||||
@@ -2266,7 +2266,9 @@ void Achievements::DrawAchievementsWindow()
|
||||
ImGui::GetColorU32(ImGuiFullscreen::UISecondaryColor));
|
||||
|
||||
text.format("{}%", static_cast<int>(std::round(fraction * 100.0f)));
|
||||
ImGui::PushFont(g_medium_font);
|
||||
text_size = ImGui::CalcTextSize(text.c_str(), text.end_ptr());
|
||||
ImGui::PopFont();
|
||||
const ImVec2 text_pos(progress_bb.Min.x + ((progress_bb.Max.x - progress_bb.Min.x) / 2.0f) - (text_size.x / 2.0f),
|
||||
progress_bb.Min.y + ((progress_bb.Max.y - progress_bb.Min.y) / 2.0f) - (text_size.y / 2.0f));
|
||||
dl->AddText(g_medium_font, g_medium_font->FontSize, text_pos, ImGui::GetColorU32(ImGuiFullscreen::UIPrimaryTextColor),
|
||||
|
||||
@@ -3929,8 +3929,9 @@ GSState::TextureMinMaxResult GSState::GetTextureMinMax(GIFRegTEX0 TEX0, GIFRegCL
|
||||
|
||||
// Need to make sure we don't oversample, this can cause trouble in grabbing textures.
|
||||
// This may be inaccurate depending on the draw, but adding 1 all the time is wrong too.
|
||||
const int inclusive_x_req = ((m_vt.m_primclass < GS_TRIANGLE_CLASS) || (grad.x < 1.0f || (grad.x == 1.0f && m_vt.m_max.p.x != floor(m_vt.m_max.p.x)))) ? 1 : 0;
|
||||
const int inclusive_y_req = ((m_vt.m_primclass < GS_TRIANGLE_CLASS) || (grad.y < 1.0f || (grad.y == 1.0f && m_vt.m_max.p.y != floor(m_vt.m_max.p.y)))) ? 1 : 0;
|
||||
// FIXME: It breaks sw renderer so let's still use 1 for SW mode for now.
|
||||
const int inclusive_x_req = GSIsHardwareRenderer() ? (((m_vt.m_primclass < GS_TRIANGLE_CLASS) || (grad.x < 1.0f || (grad.x == 1.0f && m_vt.m_max.p.x != floor(m_vt.m_max.p.x)))) ? 1 : 0) : 1;
|
||||
const int inclusive_y_req = GSIsHardwareRenderer() ? (((m_vt.m_primclass < GS_TRIANGLE_CLASS) || (grad.y < 1.0f || (grad.y == 1.0f && m_vt.m_max.p.y != floor(m_vt.m_max.p.y)))) ? 1 : 0) : 1;
|
||||
|
||||
// Roughly cut out the min/max of the read (Clamp)
|
||||
switch (wms)
|
||||
|
||||
@@ -890,28 +890,31 @@ struct PSMain
|
||||
|
||||
void ps_color_clamp_wrap(thread float4& C)
|
||||
{
|
||||
// When dithering the bottom 3 bits become meaningless and cause lines in the picture so we need to limit the color depth on dithered items
|
||||
if (!SW_BLEND && !(PS_DITHER > 0 && PS_DITHER < 3) && !PS_FBMASK)
|
||||
return;
|
||||
// When dithering the bottom 3 bits become meaningless and cause lines in the picture
|
||||
// so we need to limit the color depth on dithered items
|
||||
if (SW_BLEND || (PS_DITHER > 0 && PS_DITHER < 3) || PS_FBMASK)
|
||||
{
|
||||
if (PS_DST_FMT == FMT_16 && PS_BLEND_MIX == 0 && PS_ROUND_INV)
|
||||
C.rgb += 7.f; // Need to round up, not down since the shader will invert
|
||||
|
||||
if (PS_DST_FMT == FMT_16 && PS_BLEND_MIX == 0 && PS_ROUND_INV)
|
||||
C.rgb += 7.f; // Need to round up, not down since the shader will invert
|
||||
// Correct the Color value based on the output format
|
||||
if (PS_COLCLIP == 0 && PS_HDR == 0)
|
||||
C.rgb = clamp(C.rgb, 0.f, 255.f); // Standard Clamp
|
||||
|
||||
// Correct the Color value based on the output format
|
||||
if (!PS_COLCLIP && !PS_HDR)
|
||||
C.rgb = clamp(C.rgb, 0.f, 255.f); // Standard Clamp
|
||||
// FIXME rouding of negative float?
|
||||
// compiler uses trunc but it might need floor
|
||||
|
||||
// FIXME rouding of negative float?
|
||||
// compiler uses trunc but it might need floor
|
||||
|
||||
// Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy
|
||||
// GS: Color = 1, Alpha = 255 => output 1
|
||||
// GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875
|
||||
if (PS_DST_FMT == FMT_16 && PS_DITHER < 3 && (PS_BLEND_MIX == 0 || PS_DITHER))
|
||||
// Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy
|
||||
// GS: Color = 1, Alpha = 255 => output 1
|
||||
// GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875
|
||||
// In 16 bits format, only 5 bits of colors are used. It impacts shadows computation of Castlevania
|
||||
if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && (PS_BLEND_MIX == 0 || PS_DITHER))
|
||||
C.rgb = float3(short3(C.rgb) & 0xF8);
|
||||
else if (PS_COLCLIP == 1 || PS_HDR == 1)
|
||||
C.rgb = float3(short3(C.rgb) & 0xFF);
|
||||
}
|
||||
else if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0)
|
||||
C.rgb = float3(short3(C.rgb) & 0xF8);
|
||||
else if (PS_COLCLIP || PS_HDR)
|
||||
C.rgb = float3(short3(C.rgb) & 0xFF);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
||||
@@ -237,7 +237,7 @@ namespace FullscreenUI
|
||||
static void DrawAboutWindow();
|
||||
static void OpenAboutWindow();
|
||||
static void GetStandardSelectionFooterText(SmallStringBase& dest, bool back_instead_of_cancel);
|
||||
static void ApplyConfirmSetting(const SettingsInterface* bsi = nullptr);
|
||||
static void ApplyLayoutSettings(const SettingsInterface* bsi = nullptr);
|
||||
|
||||
static MainWindowType s_current_main_window = MainWindowType::None;
|
||||
static PauseSubMenu s_current_pause_submenu = PauseSubMenu::None;
|
||||
@@ -543,10 +543,11 @@ void ImGuiFullscreen::GetFileSelectorHelpText(SmallStringBase& dest)
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
|
||||
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
|
||||
ImGuiFullscreen::CreateFooterTextString(
|
||||
dest, std::array{
|
||||
std::make_pair(ICON_PF_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
|
||||
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Parent Directory")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Cancel")),
|
||||
});
|
||||
@@ -585,7 +586,7 @@ void ImGuiFullscreen::GetInputDialogHelpText(SmallStringBase& dest)
|
||||
}
|
||||
}
|
||||
|
||||
void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
|
||||
void FullscreenUI::ApplyLayoutSettings(const SettingsInterface* bsi)
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
SmallString swap_mode;
|
||||
@@ -594,12 +595,43 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
|
||||
else
|
||||
swap_mode = Host::GetBaseSmallStringSettingValue("UI", "SwapOKFullscreenUI", "auto");
|
||||
|
||||
// Check Nintendo Setting
|
||||
SmallString sdl2_nintendo_mode;
|
||||
if (bsi)
|
||||
sdl2_nintendo_mode = bsi->GetSmallStringValue("UI", "SDL2NintendoLayout", "false");
|
||||
else
|
||||
sdl2_nintendo_mode = Host::GetBaseSmallStringSettingValue("UI", "SDL2NintendoLayout", "false");
|
||||
|
||||
const InputLayout layout = ImGuiFullscreen::GetGamepadLayout();
|
||||
|
||||
if (sdl2_nintendo_mode == "true" || (sdl2_nintendo_mode == "auto") && layout == InputLayout::Nintendo)
|
||||
{
|
||||
// Apply
|
||||
ImGuiManager::SwapGamepadNorthWest(true);
|
||||
|
||||
// Check swap_mode if A/B should also be swapped
|
||||
if (swap_mode == "auto")
|
||||
{
|
||||
io.ConfigNavSwapGamepadButtons = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
ImGuiManager::SwapGamepadNorthWest(false);
|
||||
|
||||
if (swap_mode == "true")
|
||||
io.ConfigNavSwapGamepadButtons = true;
|
||||
else if (swap_mode == "false")
|
||||
io.ConfigNavSwapGamepadButtons = false;
|
||||
else if (swap_mode == "auto")
|
||||
{
|
||||
// Check gamepad
|
||||
if (layout == InputLayout::Nintendo)
|
||||
{
|
||||
io.ConfigNavSwapGamepadButtons = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check language
|
||||
if (Host::LocaleCircleConfirm())
|
||||
{
|
||||
@@ -629,14 +661,6 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
|
||||
}
|
||||
}
|
||||
|
||||
// Check gamepad
|
||||
const InputLayout layout = ImGuiFullscreen::GetGamepadLayout();
|
||||
if (layout == InputLayout::Nintendo)
|
||||
{
|
||||
io.ConfigNavSwapGamepadButtons = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// X is confirm
|
||||
io.ConfigNavSwapGamepadButtons = false;
|
||||
return;
|
||||
@@ -648,12 +672,12 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
|
||||
|
||||
void FullscreenUI::LocaleChanged()
|
||||
{
|
||||
ApplyConfirmSetting();
|
||||
ApplyLayoutSettings();
|
||||
}
|
||||
|
||||
void FullscreenUI::GamepadLayoutChanged()
|
||||
{
|
||||
ApplyConfirmSetting();
|
||||
ApplyLayoutSettings();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -670,7 +694,7 @@ bool FullscreenUI::Initialize()
|
||||
|
||||
ImGuiFullscreen::SetTheme(Host::GetBaseStringSettingValue("UI", "FullscreenUITheme", "Dark"));
|
||||
ImGuiFullscreen::UpdateLayoutScale();
|
||||
ApplyConfirmSetting();
|
||||
ApplyLayoutSettings();
|
||||
|
||||
if (!ImGuiManager::AddFullscreenFontsIfMissing() || !ImGuiFullscreen::Initialize("fullscreenui/placeholder.png") || !LoadResources())
|
||||
{
|
||||
@@ -741,7 +765,7 @@ void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config)
|
||||
if (old_config.FullpathToBios() != EmuConfig.FullpathToBios())
|
||||
{
|
||||
MTGS::RunOnGSThread([]() {
|
||||
ApplyConfirmSetting();
|
||||
ApplyLayoutSettings();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1411,11 +1435,12 @@ void FullscreenUI::DrawLandingWindow()
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
|
||||
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_SELECT_SHARE, FSUI_VSTR("About")),
|
||||
std::make_pair(ICON_PF_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Game List")),
|
||||
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Toggle Fullscreen")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Game List")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Toggle Fullscreen")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Exit")),
|
||||
});
|
||||
@@ -1484,9 +1509,10 @@ void FullscreenUI::DrawStartGameWindow()
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
|
||||
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
|
||||
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Load Global State")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Load Global State")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Back")),
|
||||
});
|
||||
@@ -3424,7 +3450,40 @@ void FullscreenUI::DrawInterfaceSettingsPage()
|
||||
SettingsInterface* bsi = GetEditingSettingsInterface(false);
|
||||
bsi->SetStringValue("UI", "SwapOKFullscreenUI", swap_values[index]);
|
||||
SetSettingsChanged(bsi);
|
||||
ApplyConfirmSetting(bsi);
|
||||
ApplyLayoutSettings(bsi);
|
||||
}
|
||||
|
||||
CloseChoiceDialog();
|
||||
});
|
||||
}
|
||||
|
||||
const SmallString nintendo_mode = bsi->GetSmallStringValue("UI", "SDL2NintendoLayout", "false");
|
||||
size_t nintendo_index = std::size(swap_values);
|
||||
for (size_t i = 0; i < std::size(swap_values); i++)
|
||||
{
|
||||
if (nintendo_mode == swap_values[i])
|
||||
{
|
||||
nintendo_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
swap_summery.format(FSUI_FSTR("Swaps both {}/{} (When Swap OK/Cancel is set to automatic) and {}/{} buttons"), ICON_PF_BUTTON_CROSS, ICON_PF_BUTTON_CIRCLE, ICON_PF_BUTTON_SQUARE, ICON_PF_BUTTON_TRIANGLE);
|
||||
if (MenuButtonWithValue(FSUI_ICONSTR(ICON_FA_GAMEPAD, "Use Legacy Nintendo Layout in Big Picture Mode"), swap_summery.c_str(),
|
||||
(nintendo_index < std::size(swap_values)) ? Host::TranslateToCString(TR_CONTEXT, swap_names[nintendo_index]) : FSUI_CSTR("Unknown")))
|
||||
{
|
||||
ImGuiFullscreen::ChoiceDialogOptions cd_options;
|
||||
cd_options.reserve(std::size(swap_values));
|
||||
for (size_t i = 0; i < std::size(swap_values); i++)
|
||||
cd_options.emplace_back(Host::TranslateToString(TR_CONTEXT, swap_names[i]), i == static_cast<size_t>(nintendo_index));
|
||||
|
||||
OpenChoiceDialog(FSUI_ICONSTR(ICON_FA_GAMEPAD, "Use Legacy Nintendo Layout in Big Picture Mode"), false, std::move(cd_options), [](s32 index, const std::string& title, bool checked) {
|
||||
if (index >= 0)
|
||||
{
|
||||
auto lock = Host::GetSettingsLock();
|
||||
SettingsInterface* bsi = GetEditingSettingsInterface(false);
|
||||
bsi->SetStringValue("UI", "SDL2NintendoLayout", swap_values[index]);
|
||||
SetSettingsChanged(bsi);
|
||||
ApplyLayoutSettings(bsi);
|
||||
}
|
||||
|
||||
CloseChoiceDialog();
|
||||
@@ -3548,7 +3607,7 @@ void FullscreenUI::DrawBIOSSettingsPage()
|
||||
SettingsInterface* bsi = GetEditingSettingsInterface(game_settings);
|
||||
bsi->SetStringValue("Filenames", "BIOS", values[index].c_str());
|
||||
SetSettingsChanged(bsi);
|
||||
ApplyConfirmSetting(bsi);
|
||||
ApplyLayoutSettings(bsi);
|
||||
CloseChoiceDialog();
|
||||
});
|
||||
}
|
||||
@@ -5977,9 +6036,10 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading)
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
|
||||
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_DPAD, FSUI_VSTR("Select State")),
|
||||
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Options")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Options")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Load/Save State")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Cancel")),
|
||||
});
|
||||
@@ -6276,11 +6336,12 @@ void FullscreenUI::DrawGameListWindow()
|
||||
if (IsGamepadInputSource())
|
||||
{
|
||||
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
|
||||
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
|
||||
SetFullscreenFooterText(std::array{
|
||||
std::make_pair(ICON_PF_DPAD, FSUI_VSTR("Select Game")),
|
||||
std::make_pair(ICON_PF_START, FSUI_VSTR("Settings")),
|
||||
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Change View")),
|
||||
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Launch Options")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Change View")),
|
||||
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Launch Options")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Start Game")),
|
||||
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Back")),
|
||||
});
|
||||
@@ -7715,6 +7776,7 @@ TRANSLATE_NOOP("FullscreenUI", "Shows icons in the lower-right corner of the scr
|
||||
TRANSLATE_NOOP("FullscreenUI", "When enabled, each session will behave as if no achievements have been unlocked.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "When enabled, PCSX2 will assume all achievements are locked and not send any unlock notifications to the server.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "When enabled, PCSX2 will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Sound Effects");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Account");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Logs out of RetroAchievements.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Logs in to RetroAchievements.");
|
||||
@@ -7729,6 +7791,7 @@ TRANSLATE_NOOP("FullscreenUI", "Automatic mapping failed for {}.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Game settings initialized with global settings for '{}'.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Game settings have been cleared for '{}'.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Uses {} as confirm when using a controller");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Swaps both {}/{} (When Swap OK/Cancel is set to automatic) and {}/{} buttons");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Slot {}");
|
||||
TRANSLATE_NOOP("FullscreenUI", "{} (Current)");
|
||||
TRANSLATE_NOOP("FullscreenUI", "{} (Folder)");
|
||||
@@ -8001,6 +8064,7 @@ TRANSLATE_NOOP("FullscreenUI", "Confirm Shutdown");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Save State On Shutdown");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Create Save State Backups");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Swap OK/Cancel in Big Picture Mode");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Use Legacy Nintendo Layout in Big Picture Mode");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Discord Presence");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Start Fullscreen");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Double-Click Toggles Fullscreen");
|
||||
@@ -8127,11 +8191,16 @@ TRANSLATE_NOOP("FullscreenUI", "Enable Achievements");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Hardcore Mode");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Achievement Notifications");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Leaderboard Notifications");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Sound Effects");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable In-Game Overlays");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Encore Mode");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Spectator Mode");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Test Unofficial Achievements");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Notification Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Select Notification Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Unlock Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Select Unlock Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Leaderboard Submit Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Select Leaderboard Submit Sound");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Username: {}");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Login token generated on {}");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Logout");
|
||||
|
||||
@@ -89,6 +89,8 @@ static std::atomic_bool s_imgui_wants_keyboard{false};
|
||||
static std::atomic_bool s_imgui_wants_mouse{false};
|
||||
static std::atomic_bool s_imgui_wants_text{false};
|
||||
|
||||
static bool s_gamepad_swap_noth_west = false;
|
||||
|
||||
// mapping of host key -> imgui key
|
||||
static std::unordered_map<u32, ImGuiKey> s_imgui_key_map;
|
||||
|
||||
@@ -959,7 +961,15 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, InputLayout
|
||||
return false;
|
||||
|
||||
MTGS::RunOnGSThread(
|
||||
[key = key_map[static_cast<u32>(key)], value, layout]() {
|
||||
[key = key_map[static_cast<u32>(key)], value, layout]() mutable {
|
||||
if (s_gamepad_swap_noth_west)
|
||||
{
|
||||
if (key == ImGuiKey_GamepadFaceUp)
|
||||
key = ImGuiKey_GamepadFaceLeft;
|
||||
else if (key == ImGuiKey_GamepadFaceLeft)
|
||||
key = ImGuiKey_GamepadFaceUp;
|
||||
}
|
||||
|
||||
ImGuiFullscreen::ReportGamepadLayout(layout);
|
||||
ImGui::GetIO().AddKeyAnalogEvent(key, (value > 0.0f), value);
|
||||
});
|
||||
@@ -967,6 +977,16 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, InputLayout
|
||||
return s_imgui_wants_keyboard.load(std::memory_order_acquire);
|
||||
}
|
||||
|
||||
void ImGuiManager::SwapGamepadNorthWest(bool value)
|
||||
{
|
||||
s_gamepad_swap_noth_west = value;
|
||||
}
|
||||
|
||||
bool ImGuiManager::IsGamepadNorthWestSwapped()
|
||||
{
|
||||
return s_gamepad_swap_noth_west;
|
||||
}
|
||||
|
||||
void ImGuiManager::CreateSoftwareCursorTextures()
|
||||
{
|
||||
for (u32 i = 0; i < InputManager::MAX_POINTER_DEVICES; i++)
|
||||
|
||||
@@ -97,6 +97,12 @@ namespace ImGuiManager
|
||||
/// Called on the CPU thread when any input event fires. Allows imgui to take over controller navigation.
|
||||
bool ProcessGenericInputEvent(GenericInputBinding key, InputLayout layout, float value);
|
||||
|
||||
/// Called to swap North/West gamepad buttons within ImGui
|
||||
void SwapGamepadNorthWest(bool value);
|
||||
|
||||
/// Checks if the North/West gamepad buttons are swapped within ImGui
|
||||
bool IsGamepadNorthWestSwapped();
|
||||
|
||||
/// Sets an image and scale for a software cursor. Software cursors can be used for things like crosshairs.
|
||||
void SetSoftwareCursor(u32 index, std::string image_path, float image_scale, u32 multiply_color = 0xFFFFFF);
|
||||
bool HasSoftwareCursor(u32 index);
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include "Input/InputManager.h"
|
||||
#include "Host.h"
|
||||
|
||||
#include "ImGui/FullscreenUI.h"
|
||||
|
||||
#include "common/Assertions.h"
|
||||
#include "common/Console.h"
|
||||
#include "common/Error.h"
|
||||
@@ -700,6 +702,20 @@ std::optional<InputBindingKey> SDLInputSource::ParseKeyString(const std::string_
|
||||
TRANSLATE("SDLInputSource", "As part of our upgrade to SDL3, we've had to migrate your binds\n"
|
||||
"Your controller did not match the Xbox layout and may need rebinding\n"
|
||||
"Please verify your controller settings and amend if required"));
|
||||
|
||||
// Also apply BPM setting for legacy binds
|
||||
// We assume this is a Nintendo controller, BPM will check if it is
|
||||
// Defer this, as we are probably under a setting lock
|
||||
Host::RunOnCPUThread([] {
|
||||
if (!Host::ContainsBaseSettingValue("UI", "SDL2NintendoLayout"))
|
||||
{
|
||||
Host::SetBaseStringSettingValue("UI", "SDL2NintendoLayout", "auto");
|
||||
Host::CommitBaseSettingChanges();
|
||||
// Get FSUI to recheck setting
|
||||
if (FullscreenUI::IsInitialized())
|
||||
FullscreenUI::GamepadLayoutChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
key.data = pos;
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
/// Version number for GS and other shaders. Increment whenever any of the contents of the
|
||||
/// shaders change, to invalidate the cache.
|
||||
static constexpr u32 SHADER_CACHE_VERSION = 60;
|
||||
static constexpr u32 SHADER_CACHE_VERSION = 61;
|
||||
|
||||
Reference in New Issue
Block a user