Compare commits

..

No commits in common. "main" and "feature/bo3_ff_processing" have entirely different histories.

1051 changed files with 53850 additions and 292931 deletions

37
.gitignore vendored
View File

@ -1,25 +1,12 @@
/build/ /build/
/data/dlls/ /data/dlls/
/data/fastfiles/ /data/fastfiles/
/releases/
# Ignore Qt Creator user files
.vscode/* *.pro.user
.qmake.stash *.pro.user.*
*.qbs.user
# Ignore Qt Creator user files *.qbs.user.*
*.pro.user *.creator.user
*.pro.user.* *.creator.user.*
*.qbs.user *.creator.*
*.qbs.user.*
*.creator.user
*.creator.user.*
*.creator.*
*.ps1
version.txt
*.autosave
*.XMODEL_EXPORT
data/obj/*
libs/*/release/*
libs/*/debug/*
.git.stash
*Makefile*

View File

@ -1,10 +1,10 @@
TEMPLATE = subdirs TEMPLATE = subdirs
SUBDIRS += libs \ SUBDIRS += libs \
app \ app \
#tools \ tools \
#tests tests
#tests.depends = libs tests.depends = libs
app.depends = libs app.depends = libs
#tools.depends = libs tools.depends = libs

625
XPlor.pro.user.40d992c Normal file
View File

@ -0,0 +1,625 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 15.0.0, 2025-04-04T21:57:41. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{40d992cb-ac11-4385-a22b-016f1b4251a7}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates">
<value type="Qt::CheckState" key="1@G:/Projects/Qt/XPlor/tests/autotest_cod.h:AutoTest_COD">Unchecked</value>
</valuemap>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">16</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
<valuemap type="QVariantMap" key="CppEditor.QuickFix">
<value type="bool" key="UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.8.2 MSVC2022 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.8.2 MSVC2022 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.682.win64_msvc2022_64_kit</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_MSVC2022_64bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_MSVC2022_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_MSVC2022_64bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_MSVC2022_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_MSVC2022_64bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_MSVC2022_64bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/app/app.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_MSVC2022_64bit-Debug/app</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/tests/tests.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_MSVC2022_64bit-Debug/tests</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.1</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.8.2 llvm-mingw 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.8.2 llvm-mingw 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.682.win64_llvm_mingw_kit</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_llvm_mingw_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_llvm_mingw_64_bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_llvm_mingw_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_llvm_mingw_64_bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_2_llvm_mingw_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_2_llvm_mingw_64_bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/app/app.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/tests/tests.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.2</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.8.1 MSVC2022 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.8.1 MSVC2022 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.681.win64_msvc2022_64_kit</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_1_MSVC2022_64bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">G:\Projects\Qt\XPlor\build\Desktop_Qt_6_8_1_MSVC2022_64bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/app/app.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Debug/app</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">G:/Projects/Qt/XPlor/tests/tests.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">G:/Projects/Qt/XPlor/build/Desktop_Qt_6_8_1_MSVC2022_64bit-Debug/tests</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">3</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -1,36 +0,0 @@
#!/bin/bash
set -e
# 1. Stage everything
git add -A
# 2. Get list of staged files
FILES=$(git diff --cached --name-only)
if [ -z "$FILES" ]; then
echo "No changes to commit."
exit 0
fi
# 3. Loop file by file
for FILE in $FILES; do
# Get diff for this file
DIFF=$(git diff --cached -- "$FILE")
if [ -z "$DIFF" ]; then
continue
fi
# Ask Ollama for a commit message describing this file change
MSG=$(echo "$DIFF" | ollama run gemma3 \
"You are a commit bot. Write a SHORT, clear, concise Git commit message for changes in file: $FILE.
Only output the commit message, nothing else.
Diff:
$DIFF")
# Commit just this file with its message
git commit -m "$MSG" -- "$FILE"
echo "✅ Committed $FILE with message:"
echo "$MSG"
done

View File

@ -1,201 +1,201 @@
Apache License Apache License
Version 2.0, January 2004 Version 2.0, January 2004
http://www.apache.org/licenses/ http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions. 1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, "License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document. and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by "Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License. the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all "Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition, control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the "control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity. outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity "You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License. exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, "Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation including but not limited to software source code, documentation
source, and configuration files. source, and configuration files.
"Object" form shall mean any form resulting from mechanical "Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation, not limited to compiled object code, generated documentation,
and conversions to other media types. and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or "Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work copyright notice that is included in or attached to the work
(an example is provided in the Appendix below). (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object "Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of, separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof. the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including "Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted" the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution." designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity "Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work. subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of 2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual, this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of, copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form. Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of 3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual, this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made, (except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work, use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s) Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate granted to You under this License for that Work shall terminate
as of the date such litigation is filed. as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the 4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You modifications, and in Source or Object form, provided that You
meet the following conditions: meet the following conditions:
(a) You must give any other recipients of the Work or (a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices (b) You must cause any modified files to carry prominent notices
stating that You changed the files; and stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works (c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work, attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of excluding those notices that do not pertain to any part of
the Derivative Works; and the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its (d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or, documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed that such additional attribution notices cannot be construed
as modifying the License. as modifying the License.
You may add Your own copyright statement to Your modifications and You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use, for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License. the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, 5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions. this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions. with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade 6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor, names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file. origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or 7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS, Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License. risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, 8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise, whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill, Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages. has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing 9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer, the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity, and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify, of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability. of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work. APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]" boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier same "printed page" as the copyright notice for easier
identification within third-party archives. identification within third-party archives.
Copyright [yyyy] [name of copyright owner] Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.

View File

@ -1,14 +1,14 @@
#include "aboutdialog.h" #include "aboutdialog.h"
#include "ui_aboutdialog.h" #include "ui_aboutdialog.h"
AboutDialog::AboutDialog(QWidget *parent) AboutDialog::AboutDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, ui(new Ui::AboutDialog) , ui(new Ui::AboutDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
AboutDialog::~AboutDialog() AboutDialog::~AboutDialog()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef ABOUTDIALOG_H #ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H #define ABOUTDIALOG_H
#include <QDialog> #include <QDialog>
namespace Ui { namespace Ui {
class AboutDialog; class AboutDialog;
} }
class AboutDialog : public QDialog class AboutDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AboutDialog(QWidget *parent = nullptr); explicit AboutDialog(QWidget *parent = nullptr);
~AboutDialog(); ~AboutDialog();
private: private:
Ui::AboutDialog *ui; Ui::AboutDialog *ui;
}; };
#endif // ABOUTDIALOG_H #endif // ABOUTDIALOG_H

View File

@ -1,241 +1,241 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>AboutDialog</class> <class>AboutDialog</class>
<widget class="QDialog" name="AboutDialog"> <widget class="QDialog" name="AboutDialog">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>350</width> <width>350</width>
<height>200</height> <height>200</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>About XPlor</string> <string>About XPlor</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>80</width> <width>80</width>
<height>80</height> <height>80</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>80</width> <width>80</width>
<height>80</height> <height>80</height>
</size> </size>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="pixmap"> <property name="pixmap">
<pixmap resource="Data.qrc">:/images/data/images/XPlor.png</pixmap> <pixmap resource="Data.qrc">:/images/data/images/XPlor.png</pixmap>
</property> </property>
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set> <set>Qt::AlignmentFlag::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>XPlor v1.5</string> <string>XPlor v1.5</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Copyright © 2024 RedLine Solutions LLC</string> <string>Copyright © 2024 RedLine Solutions LLC</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>For more, check out redline.llc</string> <string>For more, check out redline.llc</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_3"> <spacer name="verticalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum> <enum>QSizePolicy::Policy::Fixed</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>10</height> <height>10</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>With Help From:</string> <string>With Help From:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- Paging Red</string> <string>- Paging Red</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- ISOCheated</string> <string>- ISOCheated</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>- SureShotIan</string> <string>- SureShotIan</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources> <resources>
<include location="Data.qrc"/> <include location="Data.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,61 +1,112 @@
QT += core widgets gui multimedia QT += core widgets gui multimedia
RC_ICONS = app.ico RC_ICONS = app.ico
SUBDIRS += app SUBDIRS += app
CONFIG += c++17 CONFIG += c++17
SOURCES += $$files($$PWD/*.cpp) SOURCES += \
HEADERS += $$files($$PWD/*.h) aboutdialog.cpp \
FORMS += $$files($$PWD/*.ui) ddsviewer.cpp \
fastfileviewer.cpp \
RESOURCES += ../data/data.qrc imagewidget.cpp \
iwiviewer.cpp \
LIBS += \ localstringviewer.cpp \
-L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \ main.cpp \
-L$$PWD/../third_party/zlib/lib/ -lzlib \ mainwindow.cpp \
-L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \ materialviewer.cpp \
-L$$OUT_PWD/../libs/ -lcore \ preferenceeditor.cpp \
-L$$OUT_PWD/../libs/ -lxassets\ soundviewer.cpp \
-L$$OUT_PWD/../libs/ -lcompression \ stringtableviewer.cpp \
-L$$OUT_PWD/../libs/ -lencryption \ techsetviewer.cpp \
-L$$OUT_PWD/../libs/ -lfastfile \ xtreewidget.cpp \
-L$$OUT_PWD/../libs/ -lddsfile \ xtreewidgetitem.cpp \
-L$$OUT_PWD/../libs/ -lipakfile \ zonefileviewer.cpp
-L$$OUT_PWD/../libs/ -liwifile \
-L$$OUT_PWD/../libs/ -lzonefile HEADERS += \
aboutdialog.h \
INCLUDEPATH += \ d3dbsp_structs.h \
$$PWD/../third_party/devil_sdk/include/ \ ddsviewer.h \
$$PWD/../third_party/zlib/include \ fastfileviewer.h \
$$PWD/../third_party/xbox_sdk/include \ imagewidget.h \
$$PWD/../libs/core \ iwiviewer.h \
$$PWD/../libs/compression \ localstringviewer.h \
$$PWD/../libs/encryption \ mainwindow.h \
$$PWD/../libs/fastfile \ materialviewer.h \
$$PWD/../libs/ddsfile \ preferenceeditor.h \
$$PWD/../libs/ipakfile \ soundviewer.h \
$$PWD/../libs/iwifile \ stringtableviewer.h \
$$PWD/../libs/xassets \ techsetviewer.h \
$$PWD/../libs/zonefile xtreewidget.h \
xtreewidgetitem.h \
DEPENDPATH += \ zonefileviewer.h
$$PWD/../third_party/devil_sdk/include/ \
$$PWD/../third_party/zlib/include \ FORMS += \
$$PWD/../third_party/xbox_sdk/include \ aboutdialog.ui \
$$PWD/../libs/core \ ddsviewer.ui \
$$PWD/../libs/compression \ fastfileviewer.ui \
$$PWD/../libs/encryption \ imagewidget.ui \
$$PWD/../libs/fastfile \ iwiviewer.ui \
$$PWD/../libs/ddsfile \ localstringviewer.ui \
$$PWD/../libs/ipakfile \ mainwindow.ui \
$$PWD/../libs/iwifile \ materialviewer.ui \
$$PWD/../libs/xassets \ modelviewer.ui \
$$PWD/../libs/zonefile preferenceeditor.ui \
soundviewer.ui \
stringtableviewer.ui \
win32 { techsetviewer.ui \
QMAKE_POST_LINK = zonefileviewer.ui
QMAKE_POST_LINK += for /D %%G in (\"$$PWD/../third_party/*/lib\") do copy /Y \"%%~G\*.dll\" \"$$OUT_PWD/$$DESTDIR/\" >NUL $$escape_expand(\\n\\t)
} RESOURCES += ../data/data.qrc
LIBS += \
-L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \
-L$$PWD/../third_party/zlib/lib/ -lzlib \
-L$$PWD/../third_party/xbox_sdk/lib -lxcompress64 \
-L$$OUT_PWD/../libs/ -lcore \
-L$$OUT_PWD/../libs/ -lcompression \
-L$$OUT_PWD/../libs/ -lencryption \
-L$$OUT_PWD/../libs/ -lfastfile \
-L$$OUT_PWD/../libs/ -lddsfile \
-L$$OUT_PWD/../libs/ -lipakfile \
-L$$OUT_PWD/../libs/ -liwifile \
-L$$OUT_PWD/../libs/ -lzonefile
INCLUDEPATH += \
$$PWD/../third_party/devil_sdk/include/ \
$$PWD/../third_party/zlib/include \
$$PWD/../third_party/xbox_sdk/include \
$$PWD/../libs/core \
$$PWD/../libs/compression \
$$PWD/../libs/encryption \
$$PWD/../libs/fastfile \
$$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \
$$PWD/../libs/zonefile
DEPENDPATH += \
$$PWD/../third_party/devil_sdk/include/ \
$$PWD/../third_party/zlib/include \
$$PWD/../third_party/xbox_sdk/include \
$$PWD/../libs/core \
$$PWD/../libs/compression \
$$PWD/../libs/encryption \
$$PWD/../libs/fastfile \
$$PWD/../libs/ddsfile \
$$PWD/../libs/ipakfile \
$$PWD/../libs/iwifile \
$$PWD/../libs/zonefile
# Copy DLLs to Debug folder
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/debug/\" $$escape_expand(\\n\\t)
# Copy DLLs to Release folder
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/devil_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/zlib/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"G:/Projects/Qt/XPlor/third_party/xna/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)
QMAKE_POST_LINK += xcopy /Y /E /I \"$$PWD/../third_party/xbox_sdk/lib\\*.dll\" \"$$OUT_PWD/release/\" $$escape_expand(\\n\\t)

View File

@ -1,41 +1,41 @@
#ifndef D3DBSP_STRUCTS_H #ifndef D3DBSP_STRUCTS_H
#define D3DBSP_STRUCTS_H #define D3DBSP_STRUCTS_H
#include <QByteArray> #include <QByteArray>
// Define Lump Structure // Define Lump Structure
struct Lump { struct Lump {
QByteArray content; QByteArray content;
quint32 size = 0; quint32 size = 0;
bool isEmpty = true; bool isEmpty = true;
}; };
// Lump Index Entry Structure // Lump Index Entry Structure
struct LumpIndexEntry { struct LumpIndexEntry {
quint32 type; quint32 type;
quint32 length; quint32 length;
}; };
// Bink structure definitions // Bink structure definitions
struct BINKRECT { struct BINKRECT {
int Left; int Left;
int Top; int Top;
int Width; int Width;
int Height; int Height;
}; };
struct BINK { struct BINK {
int Width; int Width;
int Height; int Height;
uint32_t Frames; uint32_t Frames;
uint32_t FrameNum; uint32_t FrameNum;
uint32_t FrameRate; uint32_t FrameRate;
uint32_t FrameRateDiv; uint32_t FrameRateDiv;
uint32_t ReadError; uint32_t ReadError;
uint32_t OpenFlags; uint32_t OpenFlags;
BINKRECT FrameRects; BINKRECT FrameRects;
uint32_t NumRects; uint32_t NumRects;
uint32_t FrameChangePercent; uint32_t FrameChangePercent;
}; };
#endif // D3DBSP_STRUCTS_H #endif // D3DBSP_STRUCTS_H

View File

@ -1,182 +1,182 @@
#include "ddsviewer.h" #include "ddsviewer.h"
#include "enums.h" #include "enums.h"
#include "ui_ddsviewer.h" #include "ui_ddsviewer.h"
DDSViewer::DDSViewer(QWidget *parent) DDSViewer::DDSViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::DDSViewer) , ui(new Ui::DDSViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
mDDSFile = nullptr; mDDSFile = nullptr;
} }
DDSViewer::~DDSViewer() { DDSViewer::~DDSViewer() {
delete ui; delete ui;
} }
void DDSViewer::SetDDSFile(const DDSFile* aDDSFile) { void DDSViewer::SetDDSFile(std::shared_ptr<DDSFile> aDDSFile) {
mDDSFile = aDDSFile; mDDSFile.swap(aDDSFile);
ui->label_Title->setText(mDDSFile->fileStem + ".dds"); ui->label_Title->setText(mDDSFile->fileStem + ".dds");
char magicData[5]; char magicData[5];
magicData[0] = static_cast<char>(mDDSFile->header.magic & 0xFF); magicData[0] = static_cast<char>(mDDSFile->header.magic & 0xFF);
magicData[1] = static_cast<char>((mDDSFile->header.magic >> 8) & 0xFF); magicData[1] = static_cast<char>((mDDSFile->header.magic >> 8) & 0xFF);
magicData[2] = static_cast<char>((mDDSFile->header.magic >> 16) & 0xFF); magicData[2] = static_cast<char>((mDDSFile->header.magic >> 16) & 0xFF);
magicData[3] = static_cast<char>((mDDSFile->header.magic >> 24) & 0xFF); magicData[3] = static_cast<char>((mDDSFile->header.magic >> 24) & 0xFF);
magicData[4] = '\0'; magicData[4] = '\0';
// If youre using Qt and want a QString: // If youre using Qt and want a QString:
QString magicStr = QString::fromLatin1(magicData); QString magicStr = QString::fromLatin1(magicData);
ui->lineEdit_Magic->setText(magicStr); ui->lineEdit_Magic->setText(magicStr);
ui->spinBox_Size->setValue(mDDSFile->header.size); ui->spinBox_Size->setValue(mDDSFile->header.size);
ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0); ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0);
ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0); ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0);
ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0); ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0);
ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0); ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0);
ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0); ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0);
ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0); ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0);
ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0); ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0);
ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0); ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0);
ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize); ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize);
ui->spinBox_Depth->setValue(mDDSFile->header.depth); ui->spinBox_Depth->setValue(mDDSFile->header.depth);
ui->spinBox_Width->setValue(mDDSFile->header.width); ui->spinBox_Width->setValue(mDDSFile->header.width);
ui->spinBox_Height->setValue(mDDSFile->header.height); ui->spinBox_Height->setValue(mDDSFile->header.height);
ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount); ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount);
ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]); ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]);
ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]); ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]);
ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]); ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]);
ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]); ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]);
ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]); ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]);
ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]); ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]);
ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]); ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]);
ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]); ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]);
ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]); ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]);
ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]); ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]);
ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]); ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]);
ui->spinBox_Res12->setValue(mDDSFile->header.reserved2); ui->spinBox_Res12->setValue(mDDSFile->header.reserved2);
ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size); ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size);
ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0); ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0);
ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0); ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0);
ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0); ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0);
ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0); ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0);
ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0); ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0);
ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0); ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0);
QString formatStr = QString::number(mDDSFile->header.pixelFormat.format); QString formatStr = QString::number(mDDSFile->header.pixelFormat.format);
switch (mDDSFile->header.pixelFormat.format) { switch (mDDSFile->header.pixelFormat.format) {
case IWI_FORMAT_ARGB32: case IWI_FORMAT_ARGB32:
formatStr = "ARGB32"; formatStr = "ARGB32";
break; break;
case IWI_FORMAT_RGB24: case IWI_FORMAT_RGB24:
formatStr = "RGB24"; formatStr = "RGB24";
break; break;
case IWI_FORMAT_GA16: case IWI_FORMAT_GA16:
formatStr = "GA16"; formatStr = "GA16";
break; break;
case IWI_FORMAT_A8: case IWI_FORMAT_A8:
formatStr = "A8"; formatStr = "A8";
break; break;
case IWI_FORMAT_DXT1: case IWI_FORMAT_DXT1:
formatStr = "DXT1"; formatStr = "DXT1";
break; break;
case IWI_FORMAT_DXT3: case IWI_FORMAT_DXT3:
formatStr = "DXT3"; formatStr = "DXT3";
break; break;
case IWI_FORMAT_DXT5: case IWI_FORMAT_DXT5:
formatStr = "DXT5"; formatStr = "DXT5";
break; break;
} }
ui->lineEdit_PF_Format->setText(formatStr); ui->lineEdit_PF_Format->setText(formatStr);
ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount); ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount);
ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask); ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask);
ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask); ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask);
ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask); ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask);
ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask); ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask);
ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0); ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0);
ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0); ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0);
ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0); ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0);
ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0); ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0);
ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0); ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0);
ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0); ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0);
ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0); ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0);
ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0); ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0);
ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0); ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0);
ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0); ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0);
ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0); ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0);
ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX); ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX);
ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved); ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved);
ui->comboBox_Mipmap->clear(); ui->comboBox_Mipmap->clear();
for (auto mipmap : mDDSFile->mipmaps) { for (auto mipmap : mDDSFile->mipmaps) {
ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height)); ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height));
} }
connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged); connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged);
if (!mDDSFile->mipmaps.empty()) { if (!mDDSFile->mipmaps.empty()) {
MipmapIndexChanged(0); MipmapIndexChanged(0);
} }
} }
void DDSViewer::MipmapIndexChanged(int aMipmapIndex) { void DDSViewer::MipmapIndexChanged(int aMipmapIndex) {
if (aMipmapIndex == -1) { return; } if (aMipmapIndex == -1) { return; }
auto mipmaps = mDDSFile->mipmaps; auto mipmaps = mDDSFile->mipmaps;
auto mipmap = mipmaps[aMipmapIndex]; auto mipmap = mipmaps[aMipmapIndex];
ui->spinBox_MipmapSize->setValue(mipmap.size); ui->spinBox_MipmapSize->setValue(mipmap.size);
ui->spinBox_MipmapWidth->setValue(mipmap.width); ui->spinBox_MipmapWidth->setValue(mipmap.width);
ui->spinBox_MipmapHeight->setValue(mipmap.height); ui->spinBox_MipmapHeight->setValue(mipmap.height);
// Validate Data // Validate Data
if (mipmap.size <= 0) { if (mipmap.size <= 0) {
qDebug() << "Error: Mipmap data is empty!"; qDebug() << "Error: Mipmap data is empty!";
return; return;
} }
if (mipmap.width <= 0 || mipmap.height <= 0) { if (mipmap.width <= 0 || mipmap.height <= 0) {
qDebug() << "Error: Invalid mipmap dimensions!"; qDebug() << "Error: Invalid mipmap dimensions!";
return; return;
} }
// Ensure data size matches expected size // Ensure data size matches expected size
int bytesPerPixel = 4; // RGBA8888 int bytesPerPixel = 4; // RGBA8888
quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel; quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel;
if (mipmap.size < expectedSize) { if (mipmap.size < expectedSize) {
qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size; qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size;
return; return;
} }
// Create QImage // Create QImage
const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData()); const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData());
QImage image(reinterpret_cast<const uchar*>(imageData), QImage image(reinterpret_cast<const uchar*>(imageData),
mipmap.width, mipmap.height, mipmap.width, mipmap.height,
mipmap.width * bytesPerPixel, // Stride mipmap.width * bytesPerPixel, // Stride
QImage::Format_RGBA8888); QImage::Format_RGBA8888);
if (image.isNull()) { if (image.isNull()) {
qDebug() << "Error: QImage creation failed!"; qDebug() << "Error: QImage creation failed!";
return; return;
} }
// Convert to QPixmap // Convert to QPixmap
QPixmap pixmap = QPixmap::fromImage(image); QPixmap pixmap = QPixmap::fromImage(image);
if (pixmap.isNull()) { if (pixmap.isNull()) {
qDebug() << "Error: QPixmap conversion failed!"; qDebug() << "Error: QPixmap conversion failed!";
return; return;
} }
// Scale and display // Scale and display
pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_Image->setPixmap(pixmap); ui->label_Image->setPixmap(pixmap);
} }

View File

@ -1,29 +1,29 @@
#ifndef DDSVIEWER_H #ifndef DDSVIEWER_H
#define DDSVIEWER_H #define DDSVIEWER_H
#include "ddsfile.h" #include "ddsfile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class DDSViewer; class DDSViewer;
} }
class DDSViewer : public QWidget class DDSViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit DDSViewer(QWidget *parent = nullptr); explicit DDSViewer(QWidget *parent = nullptr);
~DDSViewer(); ~DDSViewer();
void SetDDSFile(const DDSFile *aDDSFile); void SetDDSFile(std::shared_ptr<DDSFile> aDDSFile);
private slots: private slots:
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
private: private:
Ui::DDSViewer *ui; Ui::DDSViewer *ui;
const DDSFile* mDDSFile; std::shared_ptr<DDSFile> mDDSFile;
}; };
#endif // DDSVIEWER_H #endif // DDSVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +1,27 @@
#include "fastfileviewer.h" #include "fastfileviewer.h"
#include "ui_fastfileviewer.h" #include "asset_structs.h"
#include "ui_fastfileviewer.h"
FastFileViewer::FastFileViewer(QWidget *parent)
: QWidget(parent) FastFileViewer::FastFileViewer(QWidget *parent)
, ui(new Ui::FFViewer) : QWidget(parent)
, mFastFile(nullptr) , ui(new Ui::FFViewer)
{ , mFastFile(nullptr)
ui->setupUi(this); {
} ui->setupUi(this);
}
FastFileViewer::~FastFileViewer()
{ FastFileViewer::~FastFileViewer()
delete ui; {
} delete ui;
}
void FastFileViewer::SetFastFile(const FastFile* aFastFile) {
mFastFile = aFastFile; void FastFileViewer::SetFastFile(std::shared_ptr<FastFile> aFastFile) {
mFastFile.swap(aFastFile);
ui->label_Title->setText(mFastFile->GetStem());
ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany()); ui->label_Title->setText(mFastFile->GetStem());
ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType()); ui->comboBox_Company->setCurrentIndex(mFastFile->GetCompany());
ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED); ui->comboBox_FileType->setCurrentIndex(mFastFile->GetType());
ui->lineEdit_Magic->setText(mFastFile->GetMagic()); ui->checkBox_Signed->setChecked(mFastFile->GetSignage() == SIGNAGE_SIGNED);
ui->spinBox_Version->setValue(mFastFile->GetVersion()); ui->lineEdit_Magic->setText(mFastFile->GetMagic());
} ui->spinBox_Version->setValue(mFastFile->GetVersion());
}

View File

@ -1,25 +1,26 @@
#ifndef FASTFILEVIEWER_H #ifndef FASTFILEVIEWER_H
#define FASTFILEVIEWER_H #define FASTFILEVIEWER_H
#include "fastfile.h" #include "asset_structs.h"
#include <QWidget> #include "fastfile.h"
#include <QWidget>
namespace Ui {
class FFViewer; namespace Ui {
} class FFViewer;
}
class FastFileViewer : public QWidget
{ class FastFileViewer : public QWidget
Q_OBJECT {
Q_OBJECT
public:
explicit FastFileViewer(QWidget *parent = nullptr); public:
~FastFileViewer(); explicit FastFileViewer(QWidget *parent = nullptr);
~FastFileViewer();
void SetFastFile(const FastFile *aFastFile);
private: void SetFastFile(std::shared_ptr<FastFile> aFastFile);
Ui::FFViewer *ui; private:
const FastFile* mFastFile; Ui::FFViewer *ui;
}; std::shared_ptr<FastFile> mFastFile;
};
#endif // FASTFILEVIEWER_H
#endif // FASTFILEVIEWER_H

View File

@ -1,197 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>FFViewer</class> <class>FFViewer</class>
<widget class="QWidget" name="FFViewer"> <widget class="QWidget" name="FFViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>428</width> <width>428</width>
<height>459</height> <height>459</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>FastFile 0</string> <string>FastFile 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Company:</string> <string>Company:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="comboBox_Company"> <widget class="QComboBox" name="comboBox_Company">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Infinity Ward</string> <string>Infinity Ward</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Treyarch</string> <string>Treyarch</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Sledgehammer</string> <string>Sledgehammer</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Neversoft</string> <string>Neversoft</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>File Type:</string> <string>File Type:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QComboBox" name="comboBox_FileType"> <widget class="QComboBox" name="comboBox_FileType">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>FastFile</string> <string>FastFile</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Signed:</string> <string>Signed:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="checkBox_Signed"> <widget class="QCheckBox" name="checkBox_Signed">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Is signed</string> <string>Is signed</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Magic:</string> <string>Magic:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_Magic"/> <widget class="QLineEdit" name="lineEdit_Magic"/>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Version:</string> <string>Version:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QSpinBox" name="spinBox_Version"> <widget class="QSpinBox" name="spinBox_Version">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>1</height> <height>1</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,28 +1,28 @@
#include "imagewidget.h" #include "imagewidget.h"
#include "ui_imagewidget.h" #include "ui_imagewidget.h"
ImageWidget::ImageWidget(QWidget *parent) ImageWidget::ImageWidget(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::ImageWidget) , ui(new Ui::ImageWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
ImageWidget::~ImageWidget() ImageWidget::~ImageWidget()
{ {
delete ui; delete ui;
} }
void ImageWidget::SetImage(std::shared_ptr<QImage> aImage) void ImageWidget::SetImage(std::shared_ptr<Image> aImage)
{ {
mImage = aImage; mImage = aImage;
//ui->lineEdit_Name->setText(aImage->name); ui->lineEdit_Name->setText(aImage->name);
//ui->lineEdit_Role->setText(aImage->materialName); ui->lineEdit_Role->setText(aImage->materialName);
//ui->comboBox_Compression->setCurrentIndex(aImage->compression); ui->comboBox_Compression->setCurrentIndex(aImage->compression);
} }
std::shared_ptr<QImage> ImageWidget::GetImage() std::shared_ptr<Image> ImageWidget::GetImage()
{ {
return mImage; return mImage;
} }

View File

@ -1,31 +1,32 @@
#ifndef IMAGEWIDGET_H #ifndef IMAGEWIDGET_H
#define IMAGEWIDGET_H #define IMAGEWIDGET_H
#include "enums.h" #include "enums.h"
#include "dds_structs.h" #include "dds_structs.h"
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "ipak_structs.h" #include "asset_structs.h"
#include "ipak_structs.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
class ImageWidget; namespace Ui {
} class ImageWidget;
}
class ImageWidget : public QWidget
{ class ImageWidget : public QWidget
Q_OBJECT {
Q_OBJECT
public:
explicit ImageWidget(QWidget *parent = nullptr); public:
~ImageWidget(); explicit ImageWidget(QWidget *parent = nullptr);
~ImageWidget();
void SetImage(std::shared_ptr<QImage> aImage);
std::shared_ptr<QImage> GetImage(); void SetImage(std::shared_ptr<Image> aImage);
std::shared_ptr<Image> GetImage();
private:
std::shared_ptr<QImage> mImage; private:
Ui::ImageWidget *ui; std::shared_ptr<Image> mImage;
}; Ui::ImageWidget *ui;
};
#endif // IMAGEWIDGET_H
#endif // IMAGEWIDGET_H

View File

@ -1,144 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ImageWidget</class> <class>ImageWidget</class>
<widget class="QWidget" name="ImageWidget"> <widget class="QWidget" name="ImageWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>589</width> <width>589</width>
<height>422</height> <height>422</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Image Role:</string> <string>Image Role:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_Role"/> <widget class="QLineEdit" name="lineEdit_Role"/>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Name:</string> <string>Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_Name"/> <widget class="QLineEdit" name="lineEdit_Name"/>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Compression:</string> <string>Compression:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="comboBox_Compression"> <widget class="QComboBox" name="comboBox_Compression">
<item> <item>
<property name="text"> <property name="text">
<string>None</string> <string>None</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT1</string> <string>DXT1</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT3</string> <string>DXT3</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>DXT5</string> <string>DXT5</string>
</property> </property>
</item> </item>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="Line" name="line"> <widget class="Line" name="line">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_Preview"> <widget class="QLabel" name="label_Preview">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>250</width> <width>250</width>
<height>250</height> <height>250</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>250</width> <width>250</width>
<height>250</height> <height>250</height>
</size> </size>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,98 +1,98 @@
#include "iwiviewer.h" #include "iwiviewer.h"
#include "enums.h" #include "enums.h"
#include "ui_iwiviewer.h" #include "ui_iwiviewer.h"
IWIViewer::IWIViewer(QWidget *parent) IWIViewer::IWIViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::IWIViewer) , ui(new Ui::IWIViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
IWIViewer::~IWIViewer() IWIViewer::~IWIViewer()
{ {
delete ui; delete ui;
} }
void IWIViewer::SetIWIFile(const IWIFile* aIWIFile) { void IWIViewer::SetIWIFile(std::shared_ptr<IWIFile> aIWIFile) {
mIWIFile = aIWIFile; mIWIFile.swap(aIWIFile);
ui->label_Title->setText(mIWIFile->fileStem + ".iwi"); ui->label_Title->setText(mIWIFile->fileStem + ".iwi");
// If youre using Qt and want a QString: // If youre using Qt and want a QString:
QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3); QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3);
ui->lineEdit_Magic->setText(magicStr); ui->lineEdit_Magic->setText(magicStr);
ui->spinBox_Version->setValue(mIWIFile->header.Version); ui->spinBox_Version->setValue(mIWIFile->header.Version);
ui->spinBox_Depth->setValue(mIWIFile->info.Depth); ui->spinBox_Depth->setValue(mIWIFile->info.Depth);
QString formatStr = ""; QString formatStr = "";
switch (mIWIFile->info.Format) { switch (mIWIFile->info.Format) {
case IWI_FORMAT_ARGB32: case IWI_FORMAT_ARGB32:
formatStr = "ARGB32"; formatStr = "ARGB32";
break; break;
case IWI_FORMAT_RGB24: case IWI_FORMAT_RGB24:
formatStr = "RGB24"; formatStr = "RGB24";
break; break;
case IWI_FORMAT_GA16: case IWI_FORMAT_GA16:
formatStr = "GA16"; formatStr = "GA16";
break; break;
case IWI_FORMAT_A8: case IWI_FORMAT_A8:
formatStr = "A8"; formatStr = "A8";
break; break;
case IWI_FORMAT_DXT1: case IWI_FORMAT_DXT1:
formatStr = "DXT1"; formatStr = "DXT1";
break; break;
case IWI_FORMAT_DXT3: case IWI_FORMAT_DXT3:
formatStr = "DXT3"; formatStr = "DXT3";
break; break;
case IWI_FORMAT_DXT5: case IWI_FORMAT_DXT5:
formatStr = "DXT5"; formatStr = "DXT5";
break; break;
} }
ui->lineEdit_Format->setText(formatStr); ui->lineEdit_Format->setText(formatStr);
ui->spinBox_Height->setValue(mIWIFile->info.Height); ui->spinBox_Height->setValue(mIWIFile->info.Height);
ui->spinBox_Width->setValue(mIWIFile->info.Width); ui->spinBox_Width->setValue(mIWIFile->info.Width);
ui->spinBox_Usage->setValue(mIWIFile->info.Usage); ui->spinBox_Usage->setValue(mIWIFile->info.Usage);
ui->comboBox_Mipmap->clear(); ui->comboBox_Mipmap->clear();
for (auto mipmap : mIWIFile->mipmaps) { for (auto mipmap : mIWIFile->mipmaps) {
ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset)); ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset));
} }
connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged); connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged);
if (!mIWIFile->mipmaps.empty()) { if (!mIWIFile->mipmaps.empty()) {
MipmapIndexChanged(0); MipmapIndexChanged(0);
} }
} }
void IWIViewer::MipmapIndexChanged(int aMipmapIndex) { void IWIViewer::MipmapIndexChanged(int aMipmapIndex) {
auto mipmaps = mIWIFile->mipmaps; auto mipmaps = mIWIFile->mipmaps;
if (aMipmapIndex == -1) { return; } if (aMipmapIndex == -1) { return; }
auto mipmap = mipmaps[aMipmapIndex]; auto mipmap = mipmaps[aMipmapIndex];
ui->spinBox_MipmapSize->setValue(mipmap.size); ui->spinBox_MipmapSize->setValue(mipmap.size);
ui->spinBox_MipmapOffset->setValue(mipmap.offset); ui->spinBox_MipmapOffset->setValue(mipmap.offset);
const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData()); const unsigned char* imageData = reinterpret_cast<const unsigned char*>(mipmap.data.constData());
QImage image(reinterpret_cast<const uchar*>(imageData), QImage image(reinterpret_cast<const uchar*>(imageData),
mIWIFile->info.Width, mIWIFile->info.Height, mIWIFile->info.Width, mIWIFile->info.Height,
QImage::Format_RGBA8888); QImage::Format_RGBA8888);
if (image.isNull()) { if (image.isNull()) {
qDebug() << "Error: QImage creation failed!"; qDebug() << "Error: QImage creation failed!";
return; return;
} }
// Convert to QPixmap // Convert to QPixmap
QPixmap pixmap = QPixmap::fromImage(image); QPixmap pixmap = QPixmap::fromImage(image);
if (pixmap.isNull()) { if (pixmap.isNull()) {
qDebug() << "Error: QPixmap conversion failed!"; qDebug() << "Error: QPixmap conversion failed!";
return; return;
} }
// Scale and display // Scale and display
pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_Image->setPixmap(pixmap); ui->label_Image->setPixmap(pixmap);
} }

View File

@ -1,27 +1,27 @@
#ifndef IWIVIEWER_H #ifndef IWIVIEWER_H
#define IWIVIEWER_H #define IWIVIEWER_H
#include "iwifile.h" #include "iwifile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class IWIViewer; class IWIViewer;
} }
class IWIViewer : public QWidget class IWIViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit IWIViewer(QWidget *parent = nullptr); explicit IWIViewer(QWidget *parent = nullptr);
~IWIViewer(); ~IWIViewer();
void MipmapIndexChanged(int aMipmapIndex); void MipmapIndexChanged(int aMipmapIndex);
void SetIWIFile(const IWIFile *aIWIFile); void SetIWIFile(std::shared_ptr<IWIFile> aIWIFile);
private: private:
Ui::IWIViewer *ui; Ui::IWIViewer *ui;
const IWIFile* mIWIFile; std::shared_ptr<IWIFile> mIWIFile;
}; };
#endif // IWIVIEWER_H #endif // IWIVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,58 +1,59 @@
#include "localstringviewer.h" #include "localstringviewer.h"
#include "ui_localstringviewer.h" #include "ui_localstringviewer.h"
LocalStringViewer::LocalStringViewer(QWidget *parent) LocalStringViewer::LocalStringViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::LocalStringViewer), , ui(new Ui::LocalStringViewer),
mVersion(), mVersion(),
mConfigPath(), mConfigPath(),
mFileNotes() { mFileNotes() {
ui->setupUi(this); ui->setupUi(this);
ui->tableWidget_Strings->setColumnCount(2); ui->tableWidget_Strings->setColumnCount(2);
ui->tableWidget_Strings->setRowCount(0); ui->tableWidget_Strings->setColumnWidth(0, 200);
ui->tableWidget_Strings->setColumnWidth(0, 200); ui->tableWidget_Strings->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget_Strings->horizontalHeader()->setStretchLastSection(true); }
}
LocalStringViewer::~LocalStringViewer() {
LocalStringViewer::~LocalStringViewer() { delete ui;
delete ui; }
}
void LocalStringViewer::SetVersion(quint32 aVersion) {
void LocalStringViewer::SetVersion(quint32 aVersion) { mVersion = aVersion;
mVersion = aVersion;
ui->spinBox_Version->setValue(mVersion);
ui->spinBox_Version->setValue(mVersion); }
}
void LocalStringViewer::SetConfigPath(const QString aConfigPath) {
void LocalStringViewer::SetConfigPath(const QString aConfigPath) { mConfigPath = aConfigPath;
mConfigPath = aConfigPath;
ui->lineEdit_Config->setText(mConfigPath);
ui->lineEdit_Config->setText(mConfigPath); }
}
void LocalStringViewer::SetFileNotes(const QString aFileNotes) {
void LocalStringViewer::SetFileNotes(const QString aFileNotes) { mFileNotes = aFileNotes;
mFileNotes = aFileNotes;
ui->plainTextEdit_FileNotes->setPlainText(mFileNotes);
ui->plainTextEdit_FileNotes->setPlainText(mFileNotes); }
}
void LocalStringViewer::AddLocalString(LocalString aLocalString) {
void LocalStringViewer::AddLocalString(XLocalizeEntry aLocalString) { mLocalStrings << aLocalString;
mLocalStrings.append(aLocalString);
ui->tableWidget_Strings->setRowCount(mLocalStrings.size()); ui->tableWidget_Strings->setRowCount(mLocalStrings.size());
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size()));
QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.GetValue()->GetString()); QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.alias);
QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.GetName()->GetString()); QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.string);
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem);
} ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem);
}
void LocalStringViewer::SetZoneFile(const ZoneFile* aZoneFile) {
mLocalStrings.clear(); void LocalStringViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
ui->tableWidget_Strings->clear(); mLocalStrings.clear();
ui->tableWidget_Strings->clear();
ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
// for (const LocalString &localStr : aZoneFile->GetAssetMap().localStrings) { ui->label_Title->setText(aZoneFile->GetStem().section('.', 0, 0) + ".str");
// AddLocalString(localStr); for (LocalString localStr : aZoneFile->GetAssetMap().localStrings) {
// } AddLocalString(localStr);
} }
}

View File

@ -1,34 +1,34 @@
#ifndef LOCALSTRINGVIEWER_H #ifndef LOCALSTRINGVIEWER_H
#define LOCALSTRINGVIEWER_H #define LOCALSTRINGVIEWER_H
#include "xlocalizeentry.h" #include "asset_structs.h"
#include "zonefile.h" #include "zonefile.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class LocalStringViewer; class LocalStringViewer;
} }
class LocalStringViewer : public QWidget class LocalStringViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LocalStringViewer(QWidget *parent = nullptr); explicit LocalStringViewer(QWidget *parent = nullptr);
~LocalStringViewer(); ~LocalStringViewer();
void SetVersion(quint32 aVersion); void SetVersion(quint32 aVersion);
void SetConfigPath(const QString aConfigPath); void SetConfigPath(const QString aConfigPath);
void SetFileNotes(const QString aFileNotes); void SetFileNotes(const QString aFileNotes);
void AddLocalString(XLocalizeEntry aLocalString); void AddLocalString(LocalString aLocalString);
void SetZoneFile(const ZoneFile *aZoneFile); void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile);
private: private:
Ui::LocalStringViewer *ui; Ui::LocalStringViewer *ui;
quint32 mVersion; quint32 mVersion;
QString mConfigPath; QString mConfigPath;
QString mFileNotes; QString mFileNotes;
QVector<XLocalizeEntry> mLocalStrings; QVector<LocalString> mLocalStrings;
}; };
#endif // LOCALSTRINGVIEWER_H #endif // LOCALSTRINGVIEWER_H

View File

@ -1,194 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>LocalStringViewer</class> <class>LocalStringViewer</class>
<widget class="QWidget" name="LocalStringViewer"> <widget class="QWidget" name="LocalStringViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>841</width> <width>841</width>
<height>457</height> <height>457</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>LocalString File 0</string> <string>LocalString File 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>File Notes:</string> <string>File Notes:</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set> <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>Version:</string> <string>Version:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_Config"> <widget class="QLineEdit" name="lineEdit_Config">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>C:\cod5\cod\cod5\bin\StringEd.cfg</string> <string>C:\cod5\cod\cod5\bin\StringEd.cfg</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Config:</string> <string>Config:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QToolButton" name="toolButton"> <widget class="QToolButton" name="toolButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1" colspan="2"> <item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Version"> <widget class="QSpinBox" name="spinBox_Version">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>10000</number>
</property> </property>
<property name="value"> <property name="value">
<number>1</number> <number>1</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1" colspan="2"> <item row="3" column="1" colspan="2">
<widget class="QPlainTextEdit" name="plainTextEdit_FileNotes"> <widget class="QPlainTextEdit" name="plainTextEdit_FileNotes">
<property name="placeholderText"> <property name="placeholderText">
<string>Files notes...</string> <string>Files notes...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="3"> <item row="4" column="0" colspan="3">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer"> <widget class="QGroupBox" name="groupBox_2">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Entries</string> <string>Entries</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Strings"> <widget class="QTableWidget" name="tableWidget_Strings">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_5"> <spacer name="verticalSpacer_5">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,11 +1,11 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QApplication> #include <QApplication>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
MainWindow w; MainWindow w;
w.show(); w.show();
return a.exec(); return a.exec();
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,78 +1,79 @@
#ifndef MAINWINDOW_H #ifndef MAINWINDOW_H
#define MAINWINDOW_H #define MAINWINDOW_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "xtreewidget.h" #include "asset_structs.h"
#include "xtreewidget.h"
#include <QMainWindow>
#include <QFileDialog> #include <QMainWindow>
#include <QStandardPaths> #include <QFileDialog>
#include <QMessageBox> #include <QStandardPaths>
#include <QDebug> #include <QMessageBox>
#include <QTableWidgetItem> #include <QDebug>
#include <QTreeWidgetItem> #include <QTableWidgetItem>
#include <QDockWidget> #include <QTreeWidgetItem>
#include <QPlainTextEdit> #include <QDockWidget>
#include <QMimeData> #include <QPlainTextEdit>
#include <QProgressBar> #include <QMimeData>
#include <QProgressBar>
QT_BEGIN_NAMESPACE #include <windows.h>
namespace Ui {
class MainWindow; QT_BEGIN_NAMESPACE
} namespace Ui {
QT_END_NAMESPACE class MainWindow;
}
class MainWindow : public QMainWindow QT_END_NAMESPACE
{
Q_OBJECT class MainWindow : public QMainWindow
{
public: Q_OBJECT
MainWindow(QWidget *parent = nullptr);
~MainWindow(); public:
void Reset(); MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots: void Reset();
bool OpenFastFile(const QString aFastFilePath);
bool OpenFastFile(const QByteArray& aFastFileData, const QString aFastFilePath); private slots:
bool OpenFastFile(); bool OpenFastFile(const QString aFastFilePath);
bool OpenFastFile();
bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false);
bool OpenZoneFile(); bool OpenZoneFile(const QString aZoneFilePath, bool fromFF = false);
bool OpenZoneFile();
int LoadFile_D3DBSP(const QString aFilePath);
int LoadFile_IPAK(const QString aFilePath); int LoadFile_D3DBSP(const QString aFilePath);
int LoadFile_XSUB(const QString aFilePath); int LoadFile_IPAK(const QString aFilePath);
int LoadFile_IWI(const QString aFilePath); int LoadFile_XSUB(const QString aFilePath);
int LoadFile_DDS(const QString aFilePath); int LoadFile_IWI(const QString aFilePath);
int LoadFile_DDSFiles(const QStringList aFilePaths); int LoadFile_DDS(const QString aFilePath);
int LoadFile_DDSFiles(const QStringList aFilePaths);
void HandleLogEntry(const QString &entry);
void HandleStatusUpdate(const QString &message, int timeout); void HandleLogEntry(const QString &entry);
void HandleProgressUpdate(const QString &message, int progress, int max); void HandleStatusUpdate(const QString &message, int timeout);
void HandleProgressUpdate(const QString &message, int progress, int max);
protected:
void dragEnterEvent(QDragEnterEvent *event) override; protected:
void dragMoveEvent(QDragMoveEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override;
void dragLeaveEvent(QDragLeaveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override;
void dropEvent(QDropEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override;
void dropEvent(QDropEvent *event) override;
private:
Ui::MainWindow *ui; private:
QMap<QString, int> mTypeMap; Ui::MainWindow *ui;
QStringList mTypeOrder; QMap<QString, int> mTypeMap;
quint32 mTagCount; QStringList mTypeOrder;
quint32 mRecordCount; quint32 mTagCount;
QMap<QString, QString> mRawFileMap; quint32 mRecordCount;
//QMap<QString, Image> mImageMap; QMap<QString, QString> mRawFileMap;
QMap<QString, QTreeWidgetItem*> mTreeMap; QMap<QString, Image> mImageMap;
QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap; QMap<QString, QTreeWidgetItem*> mTreeMap;
XTreeWidget *mTreeWidget; QMap<QString, QVector<QPair<QString, QString>>> mStrTableMap;
QPlainTextEdit *mLogWidget; XTreeWidget *mTreeWidget;
QProgressBar *mProgressBar; QPlainTextEdit *mLogWidget;
QProgressBar *mProgressBar;
quint32 mBSPVersion;
quint32 mDiskLumpCount; quint32 mBSPVersion;
QVector<quint32> mDiskLumpOrder; quint32 mDiskLumpCount;
QMap<quint32, Lump> mLumps; QVector<quint32> mDiskLumpOrder;
}; QMap<quint32, Lump> mLumps;
#endif // MAINWINDOW_H };
#endif // MAINWINDOW_H

View File

@ -1,379 +1,361 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>MainWindow</class> <class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow"> <widget class="QMainWindow" name="MainWindow">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1579</width> <width>1579</width>
<height>857</height> <height>857</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>550</width> <width>550</width>
<height>300</height> <height>300</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>XPlor</string> <string>XPlor</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QMainWindow { <string notr="true">QMainWindow {
}</string> }</string>
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>-1</number> <number>-1</number>
</property> </property>
<property name="tabsClosable"> <property name="tabsClosable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="movable"> <property name="movable">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1579</width> <width>1579</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="MenuDef"> <widget class="QMenu" name="menuFile">
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
<widget class="QMenu" name="menuRecent"> <widget class="QMenu" name="menuRecent">
<property name="title"> <property name="title">
<string>Recent...</string> <string>Recent...</string>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="menuImport"> <widget class="QMenu" name="menuImport">
<property name="title"> <property name="title">
<string>Import...</string> <string>Import...</string>
</property> </property>
</widget> </widget>
<addaction name="actionNew_File_2"/> <addaction name="actionNew_File_2"/>
<addaction name="actionNew_Fast_File"/> <addaction name="actionNew_Fast_File"/>
<addaction name="actionNew_Zone_File"/> <addaction name="actionNew_Zone_File"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionOpen_Fast_File"/> <addaction name="actionOpen_Fast_File"/>
<addaction name="actionOpen_Zone_File"/> <addaction name="actionOpen_Zone_File"/>
<addaction name="actionOpen_Folder"/> <addaction name="actionOpen_Folder"/>
<addaction name="menuImport"/> <addaction name="menuImport"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionSave"/> <addaction name="actionSave"/>
<addaction name="actionSave_As"/> <addaction name="actionSave_As"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="menuRecent"/> <addaction name="menuRecent"/>
</widget> </widget>
<widget class="QMenu" name="menuEdit"> <widget class="QMenu" name="menuEdit">
<property name="title"> <property name="title">
<string>Edit</string> <string>Edit</string>
</property> </property>
<widget class="QMenu" name="menuUndo_History"> <widget class="QMenu" name="menuUndo_History">
<property name="title"> <property name="title">
<string>Undo History...</string> <string>Undo History...</string>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="menuRedo_History"> <widget class="QMenu" name="menuRedo_History">
<property name="title"> <property name="title">
<string>Redo History...</string> <string>Redo History...</string>
</property> </property>
</widget> </widget>
<addaction name="actionUndo"/> <addaction name="actionUndo"/>
<addaction name="actionRedo"/> <addaction name="actionRedo"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionCut"/> <addaction name="actionCut"/>
<addaction name="actionCopy"/> <addaction name="actionCopy"/>
<addaction name="actionPaste"/> <addaction name="actionPaste"/>
<addaction name="actionRename"/> <addaction name="actionRename"/>
<addaction name="actionDelete"/> <addaction name="actionDelete"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionFind_2"/> <addaction name="actionFind_2"/>
<addaction name="actionEdit_Value"/> <addaction name="actionEdit_Value"/>
<addaction name="actionEdit_as_Hex"/> <addaction name="actionEdit_as_Hex"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="menuUndo_History"/> <addaction name="menuUndo_History"/>
<addaction name="menuRedo_History"/> <addaction name="menuRedo_History"/>
<addaction name="actionClear_Undo_History"/> <addaction name="actionClear_Undo_History"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionPreferences"/> <addaction name="actionPreferences"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp"> <widget class="QMenu" name="menuHelp">
<property name="title"> <property name="title">
<string>Help</string> <string>Help</string>
</property> </property>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionCheck_for_Updates"/> <addaction name="actionCheck_for_Updates"/>
<addaction name="actionReport_Issue"/> </widget>
</widget> <addaction name="menuFile"/>
<widget class="QMenu" name="menuTools"> <addaction name="menuEdit"/>
<property name="title"> <addaction name="menuHelp"/>
<string>Tools</string> </widget>
</property> <widget class="QToolBar" name="toolBar">
<addaction name="actionRun_Tests"/> <property name="windowTitle">
</widget> <string>toolBar</string>
<addaction name="MenuDef"/> </property>
<addaction name="menuEdit"/> <attribute name="toolBarArea">
<addaction name="menuTools"/> <enum>TopToolBarArea</enum>
<addaction name="menuHelp"/> </attribute>
</widget> <attribute name="toolBarBreak">
<widget class="QToolBar" name="toolBar"> <bool>false</bool>
<property name="windowTitle"> </attribute>
<string>toolBar</string> </widget>
</property> <widget class="QStatusBar" name="statusBar"/>
<attribute name="toolBarArea"> <action name="actionNew_File_2">
<enum>TopToolBarArea</enum> <property name="icon">
</attribute> <iconset resource="../data/data.qrc">
<attribute name="toolBarBreak"> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<bool>false</bool> </property>
</attribute> <property name="text">
</widget> <string>New</string>
<widget class="QStatusBar" name="statusBar"/> </property>
<action name="actionNew_File_2"> </action>
<property name="icon"> <action name="actionNew_Fast_File">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<property name="text"> </property>
<string>New</string> <property name="text">
</property> <string>New Fast File</string>
</action> </property>
<action name="actionNew_Fast_File"> </action>
<property name="icon"> <action name="actionNew_Zone_File">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset>
<property name="text"> </property>
<string>New Fast File</string> <property name="text">
</property> <string>New Zone File</string>
</action> </property>
<action name="actionNew_Zone_File"> </action>
<property name="icon"> <action name="actionOpen_Fast_File">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_NewFile.png</normaloff>:/icons/icons/Icon_NewFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<property name="text"> </property>
<string>New Zone File</string> <property name="text">
</property> <string>Open Fast File</string>
</action> </property>
<action name="actionOpen_Fast_File"> </action>
<property name="icon"> <action name="actionOpen_Zone_File">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<property name="text"> </property>
<string>Open Fast File</string> <property name="text">
</property> <string>Open Zone File</string>
</action> </property>
<action name="actionOpen_Zone_File"> </action>
<property name="icon"> <action name="actionOpen_Folder">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset>
<property name="text"> </property>
<string>Open Zone File</string> <property name="text">
</property> <string>Open Folder</string>
</action> </property>
<action name="actionOpen_Folder"> </action>
<property name="icon"> <action name="actionSave">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_OpenFile.png</normaloff>:/icons/icons/Icon_OpenFile.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset>
<property name="text"> </property>
<string>Open Folder</string> <property name="text">
</property> <string>Save</string>
</action> </property>
<action name="actionSave"> </action>
<property name="icon"> <action name="actionSave_As">
<iconset resource="../data/data.qrc"> <property name="text">
<normaloff>:/icons/icons/Icon_Save.png</normaloff>:/icons/icons/Icon_Save.png</iconset> <string>Save As</string>
</property> </property>
<property name="text"> </action>
<string>Save</string> <action name="actione">
</property> <property name="text">
</action> <string>e</string>
<action name="actionSave_As"> </property>
<property name="text"> </action>
<string>Save As</string> <action name="actionFile">
</property> <property name="text">
</action> <string>File</string>
<action name="actione"> </property>
<property name="text"> </action>
<string>e</string> <action name="actionFolder">
</property> <property name="text">
</action> <string>Folder</string>
<action name="actionFile"> </property>
<property name="text"> </action>
<string>File</string> <action name="actionNew_File">
</property> <property name="text">
</action> <string>New File</string>
<action name="actionFolder"> </property>
<property name="text"> </action>
<string>Folder</string> <action name="actionNew_Fast_File_2">
</property> <property name="text">
</action> <string>New Fast File</string>
<action name="actionNew_File"> </property>
<property name="text"> </action>
<string>New File</string> <action name="actionNew_Zone_File_2">
</property> <property name="text">
</action> <string>New Zone File</string>
<action name="actionNew_Fast_File_2"> </property>
<property name="text"> </action>
<string>New Fast File</string> <action name="actionFrom_Clipboard">
</property> <property name="text">
</action> <string>From Clipboard</string>
<action name="actionNew_Zone_File_2"> </property>
<property name="text"> </action>
<string>New Zone File</string> <action name="actionMaterial">
</property> <property name="text">
</action> <string>Material</string>
<action name="actionFrom_Clipboard"> </property>
<property name="text"> </action>
<string>From Clipboard</string> <action name="actionSound">
</property> <property name="text">
</action> <string>Sound</string>
<action name="actionMaterial"> </property>
<property name="text"> </action>
<string>Material</string> <action name="actionUndo">
</property> <property name="text">
</action> <string>Undo</string>
<action name="actionSound"> </property>
<property name="text"> </action>
<string>Sound</string> <action name="actionRedo">
</property> <property name="text">
</action> <string>Redo</string>
<action name="actionUndo"> </property>
<property name="text"> </action>
<string>Undo</string> <action name="actionCut">
</property> <property name="icon">
</action> <iconset resource="../data/data.qrc">
<action name="actionRedo"> <normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset>
<property name="text"> </property>
<string>Redo</string> <property name="text">
</property> <string>Cut</string>
</action> </property>
<action name="actionCut"> </action>
<property name="icon"> <action name="actionCopy">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_Cut.png</normaloff>:/icons/icons/Icon_Cut.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset>
<property name="text"> </property>
<string>Cut</string> <property name="text">
</property> <string>Copy</string>
</action> </property>
<action name="actionCopy"> </action>
<property name="icon"> <action name="actionPaste">
<iconset resource="../data/data.qrc"> <property name="icon">
<normaloff>:/icons/icons/Icon_Copy.png</normaloff>:/icons/icons/Icon_Copy.png</iconset> <iconset resource="../data/data.qrc">
</property> <normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset>
<property name="text"> </property>
<string>Copy</string> <property name="text">
</property> <string>Paste</string>
</action> </property>
<action name="actionPaste"> </action>
<property name="icon"> <action name="actionRename">
<iconset resource="../data/data.qrc"> <property name="text">
<normaloff>:/icons/icons/Icon_Paste.png</normaloff>:/icons/icons/Icon_Paste.png</iconset> <string>Rename</string>
</property> </property>
<property name="text"> </action>
<string>Paste</string> <action name="actionEdit_Value">
</property> <property name="text">
</action> <string>Edit Value</string>
<action name="actionRename"> </property>
<property name="text"> </action>
<string>Rename</string> <action name="actionEdit_as_Hex">
</property> <property name="text">
</action> <string>Edit as Hex</string>
<action name="actionEdit_Value"> </property>
<property name="text"> </action>
<string>Edit Value</string> <action name="actionDelete">
</property> <property name="text">
</action> <string>Delete</string>
<action name="actionEdit_as_Hex"> </property>
<property name="text"> </action>
<string>Edit as Hex</string> <action name="actiond">
</property> <property name="text">
</action> <string>d</string>
<action name="actionDelete"> </property>
<property name="text"> </action>
<string>Delete</string> <action name="actiond_2">
</property> <property name="text">
</action> <string>d</string>
<action name="actiond"> </property>
<property name="text"> </action>
<string>d</string> <action name="actionClear_Undo_History">
</property> <property name="text">
</action> <string>Clear Undo History</string>
<action name="actiond_2"> </property>
<property name="text"> </action>
<string>d</string> <action name="actionFind">
</property> <property name="text">
</action> <string>Find</string>
<action name="actionClear_Undo_History"> </property>
<property name="text"> </action>
<string>Clear Undo History</string> <action name="actionAbout">
</property> <property name="text">
</action> <string>About</string>
<action name="actionFind"> </property>
<property name="text"> </action>
<string>Find</string> <action name="actionChange_Icons">
</property> <property name="text">
</action> <string>Change Icons</string>
<action name="actionAbout"> </property>
<property name="text"> </action>
<string>About</string> <action name="actionCheck_for_Updates">
</property> <property name="text">
</action> <string>Check for Updates</string>
<action name="actionChange_Icons"> </property>
<property name="text"> </action>
<string>Change Icons</string> <action name="actionFind_2">
</property> <property name="icon">
</action> <iconset resource="../data/data.qrc">
<action name="actionCheck_for_Updates"> <normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset>
<property name="text"> </property>
<string>Check for Updates</string> <property name="text">
</property> <string>Find</string>
</action> </property>
<action name="actionFind_2"> </action>
<property name="icon"> <action name="actionPreferences">
<iconset resource="../data/data.qrc"> <property name="text">
<normaloff>:/icons/icons/Icon_Find.png</normaloff>:/icons/icons/Icon_Find.png</iconset> <string>Preferences...</string>
</property> </property>
<property name="text"> </action>
<string>Find</string> </widget>
</property> <resources>
</action> <include location="../data/data.qrc"/>
<action name="actionPreferences"> </resources>
<property name="text"> <connections/>
<string>Preferences...</string> </ui>
</property>
</action>
<action name="actionReport_Issue">
<property name="text">
<string>Report Issue</string>
</property>
</action>
<action name="actionRun_Tests">
<property name="text">
<string>Run Tests</string>
</property>
</action>
</widget>
<resources>
<include location="../data/data.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -1,43 +1,35 @@
#include "materialviewer.h" #include "materialviewer.h"
#include "ui_materialviewer.h" #include "ui_materialviewer.h"
MaterialViewer::MaterialViewer(QWidget *parent) MaterialViewer::MaterialViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::MaterialViewer) , ui(new Ui::MaterialViewer) {
{ ui->setupUi(this);
ui->setupUi(this); }
}
MaterialViewer::~MaterialViewer() {
MaterialViewer::~MaterialViewer() delete ui;
{ }
delete ui;
} QString ToHexStr(quint32 in) {
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper();
QString ToHexStr(quint32 in) }
{
return QString("%1").arg(in, 8, 16, QChar('0')).toUpper(); void MaterialViewer::SetMaterial(std::shared_ptr<Material> aMaterial) {
} ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr));
ui->lineEdit_Name->setText(aMaterial->name);
void MaterialViewer::SetMaterial(const XMaterial* aMaterial) ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr));
{ ui->lineEdit_RefName->setText(aMaterial->refName);
Q_UNUSED(aMaterial); QString unknownStr = "";
foreach (quint32 unknownPtr, aMaterial->pointers) {
// TODO: Fill in MaterialViewer::SetMaterial unknownStr += ToHexStr(unknownPtr) + "\n";
}
// ui->lineEdit_NamePtr->setText(ToHexStr(aMaterial->namePtr)); ui->lineEdit_Unknowns->setText(unknownStr);
// ui->lineEdit_Name->setText(aMaterial->name); ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
// ui->lineEdit_RefPtr->setText(ToHexStr(aMaterial->refNamePtr)); ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
// ui->lineEdit_RefName->setText(aMaterial->refName); ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
// QString unknownStr = ""; ui->spinBox_ConstCount->setValue(aMaterial->constCount);
// foreach (quint32 unknownPtr, aMaterial->pointers) { ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
// unknownStr += ToHexStr(unknownPtr) + "\n"; ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
// } ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
// ui->lineEdit_Unknowns->setText(unknownStr); }
// ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[0]));
// ui->lineEdit_StateA->setText(ToHexStr(aMaterial->stateBits[1]));
// ui->spinBox_TextureCount->setValue(aMaterial->textureCount);
// ui->spinBox_ConstCount->setValue(aMaterial->constCount);
// ui->lineEdit_TechSetPtr->setText(ToHexStr(aMaterial->techSetPtr));
// ui->lineEdit_TexturePtr->setText(ToHexStr(aMaterial->texturePtr));
// ui->lineEdit_ConstantPtr->setText(ToHexStr(aMaterial->constPtr));
}

View File

@ -1,27 +1,27 @@
#ifndef MATERIALVIEWER_H #ifndef MATERIALVIEWER_H
#define MATERIALVIEWER_H #define MATERIALVIEWER_H
#include "xmaterial.h" #include "asset_structs.h"
#include <QWidget> #include <QWidget>
#include <QScrollArea> #include <QScrollArea>
namespace Ui { namespace Ui {
class MaterialViewer; class MaterialViewer;
} }
class MaterialViewer : public QWidget class MaterialViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MaterialViewer(QWidget *parent = nullptr); explicit MaterialViewer(QWidget *parent = nullptr);
~MaterialViewer(); ~MaterialViewer();
void SetMaterial(const XMaterial *aMaterial); void SetMaterial(std::shared_ptr<Material> aMaterial);
private: private:
Ui::MaterialViewer *ui; Ui::MaterialViewer *ui;
}; };
#endif // MATERIALVIEWER_H #endif // MATERIALVIEWER_H

View File

@ -1,236 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>MaterialViewer</class> <class>MaterialViewer</class>
<widget class="QWidget" name="MaterialViewer"> <widget class="QWidget" name="MaterialViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1001</width> <width>1001</width>
<height>650</height> <height>650</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Material 0</string> <string>Material 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>398</height> <height>398</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>325</width> <width>325</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Header</string> <string>Header</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Name Ptr:</string> <string>Name Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_NamePtr"/> <widget class="QLineEdit" name="lineEdit_NamePtr"/>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Name:</string> <string>Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>Ref Ptr:</string> <string>Ref Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Ref Name:</string> <string>Ref Name:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Unknowns:</string> <string>Unknowns:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>State A:</string> <string>State A:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>State B:</string> <string>State B:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0"> <item row="7" column="0">
<widget class="QLabel" name="label_11"> <widget class="QLabel" name="label_11">
<property name="text"> <property name="text">
<string>Texture Count:</string> <string>Texture Count:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLineEdit" name="lineEdit_Name"/> <widget class="QLineEdit" name="lineEdit_Name"/>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_RefPtr"/> <widget class="QLineEdit" name="lineEdit_RefPtr"/>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_RefName"/> <widget class="QLineEdit" name="lineEdit_RefName"/>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_Unknowns"/> <widget class="QLineEdit" name="lineEdit_Unknowns"/>
</item> </item>
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLineEdit" name="lineEdit_StateA"/> <widget class="QLineEdit" name="lineEdit_StateA"/>
</item> </item>
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLineEdit" name="lineEdit_StateB"/> <widget class="QLineEdit" name="lineEdit_StateB"/>
</item> </item>
<item row="7" column="1"> <item row="7" column="1">
<widget class="QSpinBox" name="spinBox_TextureCount"/> <widget class="QSpinBox" name="spinBox_TextureCount"/>
</item> </item>
<item row="8" column="1"> <item row="8" column="1">
<widget class="QSpinBox" name="spinBox_ConstCount"/> <widget class="QSpinBox" name="spinBox_ConstCount"/>
</item> </item>
<item row="9" column="1"> <item row="9" column="1">
<widget class="QLineEdit" name="lineEdit_TechSetPtr"/> <widget class="QLineEdit" name="lineEdit_TechSetPtr"/>
</item> </item>
<item row="8" column="0"> <item row="8" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>Constant Count:</string> <string>Constant Count:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0"> <item row="9" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>Tech Set Ptr:</string> <string>Tech Set Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="0"> <item row="10" column="0">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="text"> <property name="text">
<string>Texture Ptr:</string> <string>Texture Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="11" column="0"> <item row="11" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
<property name="text"> <property name="text">
<string>Constant Ptr:</string> <string>Constant Ptr:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1"> <item row="10" column="1">
<widget class="QLineEdit" name="lineEdit_TexturePtr"/> <widget class="QLineEdit" name="lineEdit_TexturePtr"/>
</item> </item>
<item row="11" column="1"> <item row="11" column="1">
<widget class="QLineEdit" name="lineEdit_ConstantPtr"/> <widget class="QLineEdit" name="lineEdit_ConstantPtr"/>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_4"> <widget class="QGroupBox" name="groupBox_4">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>400</height> <height>400</height>
</size> </size>
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Data</string> <string>Data</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_6"/> <layout class="QGridLayout" name="gridLayout_6"/>
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>143</height> <height>143</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,14 +1,14 @@
#include "modelviewer.h" #include "modelviewer.h"
#include "ui_modelviewer.h" #include "ui_modelviewer.h"
ModelViewer::ModelViewer(QWidget *parent) ModelViewer::ModelViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::ModelViewer) , ui(new Ui::ModelViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
ModelViewer::~ModelViewer() ModelViewer::~ModelViewer()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef MODELVIEWER_H #ifndef MODELVIEWER_H
#define MODELVIEWER_H #define MODELVIEWER_H
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class ModelViewer; class ModelViewer;
} }
class ModelViewer : public QWidget class ModelViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ModelViewer(QWidget *parent = nullptr); explicit ModelViewer(QWidget *parent = nullptr);
~ModelViewer(); ~ModelViewer();
private: private:
Ui::ModelViewer *ui; Ui::ModelViewer *ui;
}; };
#endif // MODELVIEWER_H #endif // MODELVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,35 @@
#include "preferenceeditor.h" #include "preferenceeditor.h"
#include "ui_preferenceeditor.h" #include "ui_preferenceeditor.h"
PreferenceEditor::PreferenceEditor(QWidget *parent) PreferenceEditor::PreferenceEditor(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, ui(new Ui::PreferenceEditor) , ui(new Ui::PreferenceEditor)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->frame_View->show(); ui->frame_View->show();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
connect(ui->listWidget_Categories, &QListWidget::itemSelectionChanged, this, [this]() { connect(ui->listWidget_Categories, &QListWidget::itemSelectionChanged, this, [this]() {
const QString itemText = ui->listWidget_Categories->selectedItems().first()->text(); const QString itemText = ui->listWidget_Categories->selectedItems().first()->text();
if (itemText == "View") { if (itemText == "View") {
ui->frame_View->show(); ui->frame_View->show();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
} else if (itemText == "Tree Widget") { } else if (itemText == "Tree Widget") {
ui->frame_View->hide(); ui->frame_View->hide();
ui->frame_TreeWidget->show(); ui->frame_TreeWidget->show();
ui->frame_FileEditors->hide(); ui->frame_FileEditors->hide();
} else if (itemText == "File Editors") { } else if (itemText == "File Editors") {
ui->frame_View->hide(); ui->frame_View->hide();
ui->frame_TreeWidget->hide(); ui->frame_TreeWidget->hide();
ui->frame_FileEditors->show(); ui->frame_FileEditors->show();
} }
}); });
} }
PreferenceEditor::~PreferenceEditor() PreferenceEditor::~PreferenceEditor()
{ {
delete ui; delete ui;
} }

View File

@ -1,22 +1,22 @@
#ifndef PREFERENCEEDITOR_H #ifndef PREFERENCEEDITOR_H
#define PREFERENCEEDITOR_H #define PREFERENCEEDITOR_H
#include <QDialog> #include <QDialog>
namespace Ui { namespace Ui {
class PreferenceEditor; class PreferenceEditor;
} }
class PreferenceEditor : public QDialog class PreferenceEditor : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PreferenceEditor(QWidget *parent = nullptr); explicit PreferenceEditor(QWidget *parent = nullptr);
~PreferenceEditor(); ~PreferenceEditor();
private: private:
Ui::PreferenceEditor *ui; Ui::PreferenceEditor *ui;
}; };
#endif // PREFERENCEEDITOR_H #endif // PREFERENCEEDITOR_H

File diff suppressed because it is too large Load Diff

View File

@ -1,103 +0,0 @@
#include "reportissuedialog.h"
#include "qjsonarray.h"
#include "ui_reportissuedialog.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QMessageBox>
#include <QNetworkRequest>
ReportIssueDialog::ReportIssueDialog(const QString &giteaBaseUrl,
const QString &repoOwner,
const QString &repoName,
const QString &accessToken,
QWidget *parent) :
QDialog(parent),
ui(new Ui::ReportIssueDialog),
networkManager(new QNetworkAccessManager(this)),
giteaBaseUrl(giteaBaseUrl),
repoOwner(repoOwner),
repoName(repoName),
accessToken(accessToken)
{
ui->setupUi(this);
connect(networkManager, &QNetworkAccessManager::finished, this, &ReportIssueDialog::onNetworkReplyFinished);
}
ReportIssueDialog::~ReportIssueDialog()
{
delete ui;
}
void ReportIssueDialog::on_buttonSend_clicked()
{
QString title = ui->lineEditSummary->text().trimmed();
QString details = ui->textEditDetails->toPlainText().trimmed();
QString contact = ui->lineEditContact->text().trimmed();
if (title.isEmpty()) {
QMessageBox::warning(this, tr("Input Error"), tr("Please enter a summary/title for the issue."));
return;
}
QString body = details;
if (!contact.isEmpty()) {
body += QString("\n\nContact info:\n%1").arg(contact);
}
ui->buttonSend->setEnabled(false);
sendIssueReport(title, body, contact);
}
void ReportIssueDialog::on_buttonCancel_clicked()
{
reject();
}
void ReportIssueDialog::sendIssueReport(const QString &title, const QString &body, const QString &/*contact*/)
{
// Compose URL: e.g. https://gitea.example.com/api/v1/repos/{owner}/{repo}/issues
QUrl url(QString("%1/api/v1/repos/%2/%3/issues").arg(giteaBaseUrl).arg(repoOwner).arg(repoName));
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
if (!accessToken.isEmpty()) {
request.setRawHeader("Authorization", "token " + accessToken.toUtf8());
}
// Compose JSON body
QJsonObject json;
json["title"] = title;
json["body"] = body;
json["labels"] = QJsonArray{12};
QJsonDocument doc(json);
QByteArray data = doc.toJson();
networkManager->post(request, data);
}
void ReportIssueDialog::onNetworkReplyFinished(QNetworkReply *reply)
{
ui->buttonSend->setEnabled(true);
QByteArray responseData = reply->readAll();
QString responseStr = QString::fromUtf8(responseData);
if (reply->error() != QNetworkReply::NoError) {
QString errorStr = reply->errorString();
if (errorStr.isEmpty()) errorStr = "Unknown network error";
QMessageBox::critical(this, tr("Error"), tr("Failed to send issue report:\n%1\nResponse:\n%2").arg(errorStr).arg(responseStr));
} else {
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (status == 201) {
QMessageBox::information(this, tr("Success"), tr("Issue reported successfully!"));
accept();
} else {
QMessageBox::warning(this, tr("Failed"), tr("Unexpected response from server (%1):\n%2").arg(status).arg(responseStr));
}
}
reply->deleteLater();
}

View File

@ -1,43 +0,0 @@
#ifndef REPORTISSUEDIALOG_H
#define REPORTISSUEDIALOG_H
#include <QDialog>
#include <QNetworkAccessManager>
#include <QNetworkReply>
namespace Ui {
class ReportIssueDialog;
}
class ReportIssueDialog : public QDialog
{
Q_OBJECT
public:
explicit ReportIssueDialog(const QString &giteaBaseUrl,
const QString &repoOwner,
const QString &repoName,
const QString &accessToken,
QWidget *parent = nullptr);
~ReportIssueDialog();
private slots:
void on_buttonSend_clicked();
void on_buttonCancel_clicked();
void onNetworkReplyFinished(QNetworkReply *reply);
private:
Ui::ReportIssueDialog *ui;
QNetworkAccessManager *networkManager;
QString giteaBaseUrl;
QString repoOwner;
QString repoName;
QString accessToken;
void sendIssueReport(const QString &title, const QString &body, const QString &contact);
};
#endif // REPORTISSUEDIALOG_H

View File

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ReportIssueDialog</class>
<widget class="QDialog" name="ReportIssueDialog">
<property name="windowTitle">
<string>Report a Problem</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="labelInstructions">
<property name="text">
<string>Please describe the problem you encountered. Well use this info to help fix it.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelSummary">
<property name="text">
<string>Summary (short title):</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEditSummary" />
</item>
<item>
<widget class="QLabel" name="labelDetails">
<property name="text">
<string>Details (what happened?):</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEditDetails" />
</item>
<item>
<widget class="QLabel" name="labelContact">
<property name="text">
<string>Your contact (email or name, optional):</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEditContact" />
</item>
<item>
<layout class="QHBoxLayout" name="buttonLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="buttonSend">
<property name="text">
<string>Send Report</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonCancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,58 +0,0 @@
#include "rumblefileviewer.h"
#include "ui_rumblefileviewer.h"
RumbleFileViewer::RumbleFileViewer(QWidget *parent)
: QWidget(parent)
, ui(new Ui::RumbleFileViewer)
, mPropertyCount()
, mRumbleFile(nullptr) {
ui->setupUi(this);
ui->tableWidget_Properties->setColumnCount(2);
ui->tableWidget_Properties->setRowCount(0);
ui->tableWidget_Properties->setColumnWidth(0, 200);
ui->tableWidget_Properties->horizontalHeader()->setStretchLastSection(true);
}
RumbleFileViewer::~RumbleFileViewer() {
delete ui;
}
void RumbleFileViewer::SetRumbleFile(XRawFile *aRumbleFile) {
mRumbleFile = aRumbleFile;
ui->tableWidget_Properties->clear();
// const QString magic = aRumbleFile->contents.left(6);
// if (magic != "RUMBLE") {
// qDebug() << "Rumble file has invalid magic: " << magic;
// return;
// }
// int firstIndex = 0;
// int secondIndex = 0;
// int thirdIndex = 0;
// int startIndex = 0;
// for (int i = 0; i < aRumbleFile->contents.count("\\") / 2; i++) {
// ui->tableWidget_Properties->setRowCount(i + 1);
// ui->spinBox_Entries->setValue(i + 1);
// firstIndex = aRumbleFile->contents.indexOf("\\", startIndex);
// secondIndex = aRumbleFile->contents.indexOf("\\", firstIndex + 1);
// thirdIndex = aRumbleFile->contents.indexOf("\\", secondIndex + 1);
// if (thirdIndex == -1) {
// thirdIndex = aRumbleFile->contents.size();
// }
// const QString keyStr = aRumbleFile->contents.mid(firstIndex + 1, secondIndex - firstIndex - 1);
// QTableWidgetItem *keyItem = new QTableWidgetItem(keyStr);
// ui->tableWidget_Properties->setItem(i, 0, keyItem);
// const QString valStr = aRumbleFile->contents.mid(secondIndex + 1, thirdIndex - secondIndex - 1);
// QTableWidgetItem *valueItem = new QTableWidgetItem(valStr);
// ui->tableWidget_Properties->setItem(i, 1, valueItem);
// startIndex = thirdIndex;
// }
}

View File

@ -1,28 +0,0 @@
#ifndef RUMBLEFILEVIEWER_H
#define RUMBLEFILEVIEWER_H
#include "xrawfile.h"
#include <QWidget>
namespace Ui {
class RumbleFileViewer;
}
class RumbleFileViewer : public QWidget
{
Q_OBJECT
public:
explicit RumbleFileViewer(QWidget *parent = nullptr);
~RumbleFileViewer();
void SetRumbleFile(XRawFile* aRumbleFile);
private:
Ui::RumbleFileViewer *ui;
quint32 mPropertyCount;
XRawFile* mRumbleFile;
};
#endif // RUMBLEFILEVIEWER_H

View File

@ -1,153 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RumbleFileViewer</class>
<widget class="QWidget" name="RumbleFileViewer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>841</width>
<height>457</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>841</width>
<height>457</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_Title">
<property name="font">
<font>
<family>Roboto</family>
<pointsize>16</pointsize>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Rumble File Viewer</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="minimumSize">
<size>
<width>325</width>
<height>398</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>325</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<family>Roboto</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="title">
<string>Header</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0" colspan="3">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Entries">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Entries:</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer">
<property name="minimumSize">
<size>
<width>400</width>
<height>400</height>
</size>
</property>
<property name="font">
<font>
<family>Roboto</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="title">
<string>Properties</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Properties">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,54 +0,0 @@
#include "rumblegraphviewer.h"
#include "ui_rumblegraphviewer.h"
RumbleGraphViewer::RumbleGraphViewer(QWidget *parent)
: QWidget(parent)
, ui(new Ui::RumbleGraphViewer),
mEntryCount(),
mRumbleGraphFile(nullptr) {
ui->setupUi(this);
ui->tableWidget_Entries->setColumnCount(2);
ui->tableWidget_Entries->setHorizontalHeaderLabels({ "X", "Y" });
ui->tableWidget_Entries->setRowCount(0);
ui->tableWidget_Entries->setColumnWidth(0, 200);
ui->tableWidget_Entries->horizontalHeader()->setStretchLastSection(true);
}
RumbleGraphViewer::~RumbleGraphViewer() {
delete ui;
}
void RumbleGraphViewer::SetRumbleGraphFile(const XRawFile* aRawFile) {
mRumbleGraphFile = aRawFile;
XDataStream rawFileStream;//(mRumbleGraphFile->contents.toLatin1());
QByteArray magic(15, Qt::Uninitialized);
rawFileStream.readRawData(magic.data(), 15);
rawFileStream.skipRawData(4);
char sectionChar;
rawFileStream >> sectionChar;
int sectionCount = sectionChar - '0';
ui->tableWidget_Entries->setRowCount(sectionCount);
ui->spinBox_Entries->setValue(sectionCount);
ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(sectionCount));
rawFileStream.skipRawData(2);
for (int i = 0; i < sectionCount; i++) {
QByteArray xVal(6, Qt::Uninitialized), yVal(6, Qt::Uninitialized);
rawFileStream.readRawData(xVal.data(), 6);
rawFileStream.skipRawData(1);
rawFileStream.readRawData(yVal.data(), 6);
rawFileStream.skipRawData(2);
QTableWidgetItem *xItem = new QTableWidgetItem(xVal);
QTableWidgetItem *yItem = new QTableWidgetItem(yVal);
ui->tableWidget_Entries->setItem(i, 0, xItem);
ui->tableWidget_Entries->setItem(i, 1, yItem);
}
}

View File

@ -1,30 +0,0 @@
#ifndef RUMBLEGRAPHVIEWER_H
#define RUMBLEGRAPHVIEWER_H
#include "xrawfile.h"
#include "zonefile.h"
#include <QWidget>
namespace Ui {
class RumbleGraphViewer;
}
class RumbleGraphViewer : public QWidget
{
Q_OBJECT
public:
explicit RumbleGraphViewer(QWidget *parent = nullptr);
~RumbleGraphViewer();
void SetEntryCount(quint32 aCount);
void SetRumbleGraphFile(const XRawFile *aRawFile);
void SetZoneFile(ZoneFile* aZoneFile);
private:
Ui::RumbleGraphViewer *ui;
quint32 mEntryCount;
const XRawFile* mRumbleGraphFile;
};
#endif // RUMBLEGRAPHVIEWER_H

View File

@ -1,153 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RumbleGraphViewer</class>
<widget class="QWidget" name="RumbleGraphViewer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>841</width>
<height>457</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>841</width>
<height>457</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_Title">
<property name="font">
<font>
<family>Roboto</family>
<pointsize>16</pointsize>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Rumble Graph File </string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="minimumSize">
<size>
<width>325</width>
<height>398</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>325</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<family>Roboto</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="title">
<string>Header</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Entry Count: </string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QSpinBox" name="spinBox_Entries">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_LocalStrViewer">
<property name="minimumSize">
<size>
<width>400</width>
<height>400</height>
</size>
</property>
<property name="font">
<font>
<family>Roboto</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="title">
<string>Entries</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Entries">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,80 +1,80 @@
#include "soundviewer.h" #include "soundviewer.h"
#include "ui_soundviewer.h" #include "ui_soundviewer.h"
SoundViewer::SoundViewer(QWidget *parent) SoundViewer::SoundViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::SoundViewer) , ui(new Ui::SoundViewer)
, player(new QMediaPlayer()) , player(new QMediaPlayer())
, buffer(new QBuffer()) , buffer(new QBuffer())
{ {
ui->setupUi(this); ui->setupUi(this);
connect(ui->pushButton_Play, &QPushButton::clicked, player, &QMediaPlayer::play); connect(ui->pushButton_Play, &QPushButton::clicked, player, &QMediaPlayer::play);
connect(ui->pushButton_Pause, &QPushButton::clicked, player, &QMediaPlayer::pause); connect(ui->pushButton_Pause, &QPushButton::clicked, player, &QMediaPlayer::pause);
connect(ui->pushButton_Stop, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_Stop, &QPushButton::clicked, this, [this]() {
if (player->isPlaying()) { if (player->isPlaying()) {
player->stop(); player->stop();
} }
}); });
connect(ui->pushButton_SkipForward, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_SkipForward, &QPushButton::clicked, this, [this]() {
player->setPosition(player->position() + 30); player->setPosition(player->position() + 30);
}); });
connect(ui->pushButton_SkipBack, &QPushButton::clicked, this, [this]() { connect(ui->pushButton_SkipBack, &QPushButton::clicked, this, [this]() {
player->setPosition(player->position() - 30); player->setPosition(player->position() - 30);
}); });
connect(player, &QMediaPlayer::positionChanged, player, [this](qint64 position) { connect(player, &QMediaPlayer::positionChanged, player, [this](qint64 position) {
ui->horizontalSlider->setSliderPosition(position); ui->horizontalSlider->setSliderPosition(position);
ui->label_Time->setText(QString("%1:%2:%3") ui->label_Time->setText(QString("%1:%2:%3")
.arg(position / 60000) .arg(position / 60000)
.arg((position % 60000) / 1000) .arg((position % 60000) / 1000)
.arg(position % 1000)); .arg(position % 1000));
}); });
connect(player, &QMediaPlayer::durationChanged, player, [this](qint64 duration) { connect(player, &QMediaPlayer::durationChanged, player, [this](qint64 duration) {
ui->horizontalSlider->setMaximum(duration); ui->horizontalSlider->setMaximum(duration);
ui->label_TimeMax->setText(QString("%1:%2:%3") ui->label_TimeMax->setText(QString("%1:%2:%3")
.arg(duration / 60000) .arg(duration / 60000)
.arg((duration % 60000) / 1000) .arg((duration % 60000) / 1000)
.arg(duration % 1000)); .arg(duration % 1000));
}); });
connect(ui->horizontalSlider, &QSlider::sliderMoved, this, [this](int position) { connect(ui->horizontalSlider, &QSlider::sliderMoved, this, [this](int position) {
player->setPosition(position); player->setPosition(position);
}); });
for (auto outputDevice : QMediaDevices::audioOutputs()) { for (auto outputDevice : QMediaDevices::audioOutputs()) {
ui->comboBox_Output->addItem(outputDevice.description()); ui->comboBox_Output->addItem(outputDevice.description());
} }
connect(ui->comboBox_Output, &QComboBox::currentIndexChanged, this, [this](int index) { connect(ui->comboBox_Output, &QComboBox::currentIndexChanged, this, [this](int index) {
auto outputDevice = QMediaDevices::audioOutputs()[index]; auto outputDevice = QMediaDevices::audioOutputs()[index];
QAudioOutput *audioOutput = new QAudioOutput(outputDevice); QAudioOutput *audioOutput = new QAudioOutput(outputDevice);
player->setAudioOutput(audioOutput); player->setAudioOutput(audioOutput);
}); });
auto outputDevice = QMediaDevices::defaultAudioOutput(); auto outputDevice = QMediaDevices::defaultAudioOutput();
QAudioOutput *audioOutput = new QAudioOutput(outputDevice); QAudioOutput *audioOutput = new QAudioOutput(outputDevice);
player->setAudioOutput(audioOutput); player->setAudioOutput(audioOutput);
} }
SoundViewer::~SoundViewer() SoundViewer::~SoundViewer()
{ {
delete buffer; delete buffer;
delete player; delete player;
delete ui; delete ui;
} }
// void SoundViewer::SetSound(std::shared_ptr<Sound> aSound) void SoundViewer::SetSound(std::shared_ptr<Sound> aSound)
// { {
// buffer->setData(aSound->data); buffer->setData(aSound->data);
// if (!buffer->open(QIODevice::ReadOnly)) { if (!buffer->open(QIODevice::ReadOnly)) {
// qWarning() << "Failed to open QBuffer."; qWarning() << "Failed to open QBuffer.";
// return; return;
// } }
// ui->groupBox->setTitle(aSound->path); ui->groupBox->setTitle(aSound->path);
// player->setSourceDevice(buffer); player->setSourceDevice(buffer);
// } }
void SoundViewer::SetOutput(QAudioOutput *aOutput) { void SoundViewer::SetOutput(QAudioOutput *aOutput) {
if (!aOutput) { return; } if (!aOutput) { return; }
player->setAudioOutput(aOutput); player->setAudioOutput(aOutput);
} }

View File

@ -1,32 +1,34 @@
#ifndef SOUNDVIEWER_H #ifndef SOUNDVIEWER_H
#define SOUNDVIEWER_H #define SOUNDVIEWER_H
#include <QWidget> #include "asset_structs.h"
#include <QMediaPlayer>
#include <QBuffer> #include <QWidget>
#include <QAudioDevice> #include <QMediaPlayer>
#include <QMediaDevices> #include <QBuffer>
#include <QAudioOutput> #include <QAudioDevice>
#include <QMediaDevices>
namespace Ui { #include <QAudioOutput>
class SoundViewer;
} namespace Ui {
class SoundViewer;
class SoundViewer : public QWidget }
{
Q_OBJECT class SoundViewer : public QWidget
{
public: Q_OBJECT
explicit SoundViewer(QWidget *parent = nullptr);
~SoundViewer(); public:
explicit SoundViewer(QWidget *parent = nullptr);
//void SetSound(std::shared_ptr<Sound> aSound); ~SoundViewer();
void SetOutput(QAudioOutput *aOutput); void SetSound(std::shared_ptr<Sound> aSound);
private:
Ui::SoundViewer *ui; void SetOutput(QAudioOutput *aOutput);
QMediaPlayer *player; private:
QBuffer *buffer; Ui::SoundViewer *ui;
}; QMediaPlayer *player;
QBuffer *buffer;
#endif // SOUNDVIEWER_H };
#endif // SOUNDVIEWER_H

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,36 @@
#include "stringtableviewer.h" #include "stringtableviewer.h"
#include "ui_stringtableviewer.h" #include "ui_stringtableviewer.h"
StringTableViewer::StringTableViewer(QWidget *parent) StringTableViewer::StringTableViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::StringTableViewer) , ui(new Ui::StringTableViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
StringTableViewer::~StringTableViewer() StringTableViewer::~StringTableViewer()
{ {
delete ui; delete ui;
} }
void StringTableViewer::SetStringTable(const XStringTable *aStringTable) { void StringTableViewer::SetStringTable(std::shared_ptr<StringTable> aStringTable) {
ui->tableWidget_Strings->clear(); ui->tableWidget_Strings->clear();
ui->tableWidget_Strings->setRowCount(aStringTable->GetRowCount()); ui->tableWidget_Strings->setRowCount(aStringTable->rowCount);
ui->tableWidget_Strings->setColumnCount(aStringTable->GetColumnCount()); ui->tableWidget_Strings->setColumnCount(aStringTable->columnCount);
int currentIndex = 0; int currentIndex = 0;
for (auto value : *aStringTable->GetValues()) { for (const QString &key : aStringTable->content.keys()) {
const QString value = aStringTable->content[key];
QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
tableKeyItem->setText(value->GetName()); QTableWidgetItem *tableKeyItem = new QTableWidgetItem();
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem); tableKeyItem->setText(key);
ui->tableWidget_Strings->setItem(currentIndex, 0, tableKeyItem);
QTableWidgetItem *tableValItem = new QTableWidgetItem();
tableValItem->setText(value->GetString()); QTableWidgetItem *tableValItem = new QTableWidgetItem();
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem); tableValItem->setText(value);
ui->tableWidget_Strings->setItem(currentIndex, 1, tableValItem);
currentIndex++;
} currentIndex++;
} }
}

View File

@ -1,26 +1,25 @@
#ifndef STRINGTABLEVIEWER_H #ifndef STRINGTABLEVIEWER_H
#define STRINGTABLEVIEWER_H #define STRINGTABLEVIEWER_H
#include "xstringtable.h" #include "asset_structs.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
namespace Ui { class StringTableViewer;
class StringTableViewer; }
}
class StringTableViewer : public QWidget
class StringTableViewer : public QWidget {
{ Q_OBJECT
Q_OBJECT
public:
public: explicit StringTableViewer(QWidget *parent = nullptr);
explicit StringTableViewer(QWidget *parent = nullptr); ~StringTableViewer();
~StringTableViewer();
void SetStringTable(std::shared_ptr<StringTable> aStringTable);
void SetStringTable(const XStringTable *aStringTable);
private:
private: Ui::StringTableViewer *ui;
Ui::StringTableViewer *ui; };
};
#endif // STRINGTABLEVIEWER_H
#endif // STRINGTABLEVIEWER_H

View File

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>StringTableViewer</class> <class>StringTableViewer</class>
<widget class="QWidget" name="StringTableViewer"> <widget class="QWidget" name="StringTableViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>525</width> <width>525</width>
<height>752</height> <height>752</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_Strings"/> <widget class="QTableWidget" name="tableWidget_Strings"/>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@ -1,25 +1,25 @@
#include "techsetviewer.h" #include "techsetviewer.h"
#include "ui_techsetviewer.h" #include "ui_techsetviewer.h"
TechSetViewer::TechSetViewer(QWidget *parent) TechSetViewer::TechSetViewer(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::TechSetViewer) , ui(new Ui::TechSetViewer)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
TechSetViewer::~TechSetViewer() TechSetViewer::~TechSetViewer()
{ {
delete ui; delete ui;
} }
void TechSetViewer::SetTechSet(const XMaterialTechniqueSet* aTechSet) { void TechSetViewer::SetTechSet(std::shared_ptr<TechSet> aTechSet) {
//ui->listWidget_Ptrs->clear(); ui->listWidget_Ptrs->clear();
ui->label_Title->setText(aTechSet->GetName()); ui->label_Title->setText(aTechSet->name);
// int ptrIndex = 1; int ptrIndex = 1;
//for (auto ptr : aTechSet->pointers) { for (auto ptr : aTechSet->pointers) {
// ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr)); ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr));
// ptrIndex++; ptrIndex++;
//} }
} }

View File

@ -1,26 +1,25 @@
#ifndef TECHSETVIEWER_H #ifndef TECHSETVIEWER_H
#define TECHSETVIEWER_H #define TECHSETVIEWER_H
#include "xmaterialtechniqueset.h" #include "asset_structs.h"
#include <QWidget>
#include <QWidget>
namespace Ui {
namespace Ui { class TechSetViewer;
class TechSetViewer; }
}
class TechSetViewer : public QWidget
class TechSetViewer : public QWidget {
{ Q_OBJECT
Q_OBJECT
public:
public: explicit TechSetViewer(QWidget *parent = nullptr);
explicit TechSetViewer(QWidget *parent = nullptr); ~TechSetViewer();
~TechSetViewer();
void SetTechSet(std::shared_ptr<TechSet> aTechSet);
void SetTechSet(const XMaterialTechniqueSet *aTechSet);
private:
private: Ui::TechSetViewer *ui;
Ui::TechSetViewer *ui; };
};
#endif // TECHSETVIEWER_H
#endif // TECHSETVIEWER_H

View File

@ -1,151 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>TechSetViewer</class> <class>TechSetViewer</class>
<widget class="QWidget" name="TechSetViewer"> <widget class="QWidget" name="TechSetViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>880</width> <width>961</width>
<height>559</height> <height>756</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Technique Set 0</string> <string>Technique Set 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_7"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="title"> <property name="title">
<string>Set Parameters</string> <string>Unknown Pointers:</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <widget class="QListWidget" name="listWidget_Ptrs"/>
<item> </item>
<widget class="QLabel" name="label"> </layout>
<property name="text"> </widget>
<string>Name:</string> </item>
</property> <item>
</widget> <spacer name="horizontalSpacer">
</item> <property name="orientation">
<item> <enum>Qt::Orientation::Horizontal</enum>
<widget class="QLineEdit" name="lineEdit_Name"> </property>
<property name="placeholderText"> <property name="sizeHint" stdset="0">
<string>Technique set name</string> <size>
</property> <width>40</width>
</widget> <height>20</height>
</item> </size>
</layout> </property>
</item> </spacer>
<item> </item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> </layout>
<item> </item>
<widget class="QLabel" name="label_2"> <item>
<property name="text"> <spacer name="verticalSpacer">
<string>World Vertex Format:</string> <property name="orientation">
</property> <enum>Qt::Orientation::Vertical</enum>
</widget> </property>
</item> <property name="sizeHint" stdset="0">
<item> <size>
<widget class="QSpinBox" name="spinBox_WorldVertFormat"/> <width>20</width>
</item> <height>363</height>
</layout> </size>
</item> </property>
<item> </spacer>
<widget class="QListWidget" name="listWidget_Techniques"/> </item>
</item> </layout>
</layout> </widget>
</widget> <resources/>
</item> <connections/>
<item> </ui>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Current Technique</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_TechniqueName">
<property name="placeholderText">
<string>Technique set name</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Flags:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_Flags"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Pass Count:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_PassCount"/>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Material Pass</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +1,63 @@
#ifndef XTREEWIDGET_H #ifndef XTREEWIDGET_H
#define XTREEWIDGET_H #define XTREEWIDGET_H
#include "d3dbsp_structs.h" #include "d3dbsp_structs.h"
#include "ddsfile.h" #include "asset_structs.h"
#include "iwifile.h" #include "ddsfile.h"
#include "fastfile.h" #include "iwifile.h"
#include "xloadedsound.h" #include "fastfile.h"
#include "xtreewidgetitem.h" #include "xtreewidgetitem.h"
#include "zonefile.h" #include "zonefile.h"
#include "xrawfile.h"
#include "xgfximage.h" #include <QTreeWidget>
#include "xstringtable.h" #include <QFileDialog>
#include "xmenudef.h"
class XTreeWidget : public QTreeWidget
#include <QTreeWidget> {
#include <QFileDialog> Q_OBJECT
public:
class XTreeWidget : public QTreeWidget explicit XTreeWidget(QWidget *parent = nullptr);
{ ~XTreeWidget();
Q_OBJECT
public: void AddFastFile(std::shared_ptr<FastFile> aFastFile);
explicit XTreeWidget(QWidget *parent = nullptr); void AddZoneFile(std::shared_ptr<ZoneFile> aZoneFile, XTreeWidgetItem *aParentItem = nullptr);
~XTreeWidget(); void AddIWIFile(std::shared_ptr<IWIFile> aIWIFile);
void AddDDSFile(std::shared_ptr<DDSFile> aDDSFile);
void AddFastFile(FastFile* aFastFile);
void AddZoneFile(const ZoneFile *aZoneFile, XTreeWidgetItem *aParentItem = nullptr); std::shared_ptr<ZoneFile> FindZoneFile(const QString aStem);
void AddIWIFile(IWIFile* aIWIFile); std::shared_ptr<FastFile> FindFastFile(const QString aStem);
void AddDDSFile(DDSFile* aDDSFile);
bool HasZoneFile(const QString aStem);
const ZoneFile *FindZoneFile(const QString aStem); bool HasFastFile(const QString aStem);
const FastFile* FindFastFile(const QString aStem);
void CloseFastFile(const QString aFFName);
bool HasZoneFile(const QString aStem); signals:
bool HasFastFile(const QString aStem); void DDSFileSelected(std::shared_ptr<DDSFile> aDDSFile, const QString aParentName);
void IWIFileSelected(std::shared_ptr<IWIFile> aIWIFile, const QString aParentName);
void CloseFastFile(const QString aFFName); void FastFileSelected(std::shared_ptr<FastFile> aFastFile, const QString aParentName);
signals: void ZoneFileSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName);
void DDSFileSelected(const DDSFile* aDDSFile, const QString aParentName); void LocalStringSelected(std::shared_ptr<ZoneFile> aZoneFile, const QString aParentName);
void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName); void RawFileSelected(std::shared_ptr<RawFile> aRawFile, const QString aParentName);
void FastFileSelected(const FastFile* aFastFile, const QString aParentName); void ImageSelected(std::shared_ptr<Image> aImage, const QString aParentName);
void ZoneFileSelected(const ZoneFile* aZoneFile, const QString aParentName); void TechSetSelected(std::shared_ptr<TechSet> aZoneFile, const QString aParentName);
void LocalStringSelected(const ZoneFile* aZoneFile, const QString aParentName); void StrTableSelected(std::shared_ptr<StringTable> aStrTable, const QString aParentName);
void RawFileSelected(const XRawFile* aRawFile, const QString aParentName); void MenuSelected(std::shared_ptr<Menu> aMenu, const QString aParentName);
void ImageSelected(const XGfxImage* aImage, const QString aParentName); void SoundSelected(std::shared_ptr<Sound> aSound, const QString aParentName);
void TechSetSelected(const XMaterialTechniqueSet* aZoneFile, const QString aParentName); void MaterialSelected(std::shared_ptr<Material> aMaterial, const QString aParentName);
void StrTableSelected(const XStringTable* aStrTable, const QString aParentName); void ItemSelected(const QString itemText);
void MenuSelected(const XMenuDef* aMenu, const QString aParentName);
void SoundSelected(const XLoadedSound* aSound, const QString aParentName); void ItemClosed(const QString itemText);
void MaterialSelected(const XMaterial* aMaterial, const QString aParentName); void Cleared();
void ItemSelected(const QString itemText);
protected:
void ItemClosed(const QString itemText); void ItemSelectionChanged();
void Cleared(); void PrepareContextMenu(const QPoint &pos);
protected: private:
void ItemSelectionChanged(); QMap<QString, std::shared_ptr<FastFile>> mFastFiles;
void PrepareContextMenu(const QPoint &pos); QMap<QString, std::shared_ptr<ZoneFile>> mZoneFiles;
QMap<QString, std::shared_ptr<DDSFile>> mDDSFiles;
private: QMap<QString, std::shared_ptr<IWIFile>> mIWIFiles;
QMap<QString, const FastFile*> mFastFiles; };
QMap<QString, const ZoneFile*> mZoneFiles;
QMap<QString, const DDSFile*> mDDSFiles; #endif // XTREEWIDGET_H
QMap<QString, const IWIFile*> mIWIFiles;
};
#endif // XTREEWIDGET_H

View File

@ -1,56 +1,42 @@
#include "xtreewidgetitem.h" #include "xtreewidgetitem.h"
XTreeWidgetItem::XTreeWidgetItem(QTreeWidget *parent, bool group) XTreeWidgetItem::XTreeWidgetItem(QTreeWidget *parent, bool group)
: QTreeWidgetItem(parent) : QTreeWidgetItem(parent), isGroup(group) {
, isGroup(group)
, mCategory(CATEGORY_NONE) { }
} XTreeWidgetItem::XTreeWidgetItem(QTreeWidgetItem *parent, bool group)
: QTreeWidgetItem(parent), isGroup(group) {
XTreeWidgetItem::XTreeWidgetItem(QTreeWidgetItem *parent, bool group)
: QTreeWidgetItem(parent) }
, isGroup(group)
, mCategory(CATEGORY_NONE) { bool XTreeWidgetItem::operator<(const QTreeWidgetItem &other) const {
// Attempt to cast the other item to our custom type.
} const XTreeWidgetItem* otherItem = dynamic_cast<const XTreeWidgetItem*>(&other);
if (otherItem) {
void XTreeWidgetItem::SetCategory(TREE_CATEGORY category) bool thisIsGroup = this->childCount() > 0;
{ bool otherIsGroup = otherItem->childCount() > 0;
mCategory = category;
} if (thisIsGroup != otherIsGroup) {
return otherIsGroup; // Groups should come before non-groups
TREE_CATEGORY XTreeWidgetItem::GetCategory() }
{ }
return mCategory; // Fallback to the default string comparison on the current sort column.
} return QTreeWidgetItem::operator<(other);
}
bool XTreeWidgetItem::operator<(const QTreeWidgetItem &other) const {
// Attempt to cast the other item to our custom type.
const XTreeWidgetItem* otherItem = dynamic_cast<const XTreeWidgetItem*>(&other); XTreeWidgetItem& XTreeWidgetItem::operator=(const XTreeWidgetItem &other)
if (otherItem) { {
bool thisIsGroup = this->childCount() > 0; if (this != &other) {
bool otherIsGroup = otherItem->childCount() > 0; // Copy text and icon for each column.
const int colCount = other.columnCount();
if (thisIsGroup != otherIsGroup) { for (int i = 0; i < colCount; ++i) {
return otherIsGroup; // Groups should come before non-groups setText(i, other.text(i));
} setIcon(i, other.icon(i));
} }
// Fallback to the default string comparison on the current sort column. // Copy custom members.
return QTreeWidgetItem::operator<(other); this->isGroup = other.isGroup;
} }
return *this;
}
XTreeWidgetItem& XTreeWidgetItem::operator=(const XTreeWidgetItem &other)
{
if (this != &other) {
// Copy text and icon for each column.
const int colCount = other.columnCount();
for (int i = 0; i < colCount; ++i) {
setText(i, other.text(i));
setIcon(i, other.icon(i));
}
// Copy custom members.
this->isGroup = other.isGroup;
}
return *this;
}

View File

@ -1,36 +1,24 @@
#ifndef XTREEWIDGETITEM_H #ifndef XTREEWIDGETITEM_H
#define XTREEWIDGETITEM_H #define XTREEWIDGETITEM_H
#include <QTreeWidget> #include <QTreeWidget>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
enum TREE_CATEGORY { // Custom item class
CATEGORY_NONE = 0x00, class XTreeWidgetItem : public QTreeWidgetItem
CATEGORY_FILE = 0x01, {
CATEGORY_TYPE = 0x02 public:
}; // Flag to indicate if the item is a collapsible group/header.
bool isGroup;
// Custom item class
class XTreeWidgetItem : public QTreeWidgetItem // Constructors: default to non-group unless specified.
{ XTreeWidgetItem(QTreeWidget *parent, bool group = false);
public: XTreeWidgetItem(QTreeWidgetItem *parent, bool group = false);
// Flag to indicate if the item is a collapsible group/header.
bool isGroup; // Override the less-than operator to customize sorting.
bool operator<(const QTreeWidgetItem &other) const override;
// Constructors: default to non-group unless specified. XTreeWidgetItem &operator =(const XTreeWidgetItem &other);
XTreeWidgetItem(QTreeWidget *parent, bool group = false); };
XTreeWidgetItem(QTreeWidgetItem *parent, bool group = false);
void SetCategory(TREE_CATEGORY category); #endif // XTREEWIDGETITEM_H
TREE_CATEGORY GetCategory();
// Override the less-than operator to customize sorting.
bool operator<(const QTreeWidgetItem &other) const override;
XTreeWidgetItem &operator =(const XTreeWidgetItem &other);
private:
TREE_CATEGORY mCategory;
};
#endif // XTREEWIDGETITEM_H

View File

@ -1,156 +1,154 @@
#include "zonefileviewer.h" #include "zonefileviewer.h"
#include "ui_zonefileviewer.h" #include "ui_zonefileviewer.h"
#include "statusbarmanager.h" ZoneFileViewer::ZoneFileViewer(QWidget *parent)
: QWidget(parent)
ZoneFileViewer::ZoneFileViewer(QWidget *parent) , ui(new Ui::ZoneFileViewer) {
: QWidget(parent) ui->setupUi(this);
, ui(new Ui::ZoneFileViewer) {
ui->setupUi(this); mZoneFile = nullptr;
mZoneFile = nullptr; ui->tableWidget_RecordCounts->setColumnCount(4);
ui->tableWidget_RecordCounts->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count", "Icon" });
ui->tableWidget_RecordCounts->setColumnCount(3); ui->tableWidget_RecordCounts->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget_RecordCounts->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
ui->tableWidget_RecordCounts->horizontalHeader()->setStretchLastSection(true); ui->tableWidget_RecordOrder->setColumnCount(4);
ui->tableWidget_RecordOrder->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count", "Icon" });
ui->tableWidget_RecordOrder->setColumnCount(3); ui->tableWidget_RecordOrder->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget_RecordOrder->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
ui->tableWidget_RecordOrder->horizontalHeader()->setStretchLastSection(true); connect(ui->lineEdit_TagSearch, &QLineEdit::textChanged, this, &ZoneFileViewer::SortTags);
connect(ui->tableWidget_RecordCounts, &QTableWidget::itemSelectionChanged, this, &ZoneFileViewer::HighlightRecordInOrder);
connect(ui->lineEdit_TagSearch, &QLineEdit::textChanged, this, &ZoneFileViewer::SortTags); }
connect(ui->tableWidget_RecordCounts, &QTableWidget::itemSelectionChanged, this, &ZoneFileViewer::HighlightRecordInOrder);
connect(ui->listWidget_Tags, &QListWidget::currentTextChanged, this, [this](const QString &aCurrentText) { ZoneFileViewer::~ZoneFileViewer() {
StatusBarManager::instance().updateStatus(QString("Selected tag '%1' with index %2").arg(aCurrentText).arg(mZoneFile->GetTags().indexOf(aCurrentText))); delete ui;
}); }
}
void ZoneFileViewer::HighlightRecordInOrder() {
ZoneFileViewer::~ZoneFileViewer() { ui->tableWidget_RecordOrder->clearSelection();
delete ui;
} foreach (auto selectedItem, ui->tableWidget_RecordCounts->selectedItems()) {
int selectedRow = selectedItem->row();
void ZoneFileViewer::HighlightRecordInOrder() { const QString assetId = ui->tableWidget_RecordCounts->item(selectedRow, 0)->text();
ui->tableWidget_RecordOrder->clearSelection();
for (int i = 0; i < ui->tableWidget_RecordOrder->rowCount(); i++) {
foreach (auto selectedItem, ui->tableWidget_RecordCounts->selectedItems()) { const QString testAssetId = ui->tableWidget_RecordOrder->item(i, 0)->text();
int selectedRow = selectedItem->row(); if (testAssetId != assetId) { continue; }
const QString assetId = ui->tableWidget_RecordCounts->item(selectedRow, 0)->text();
ui->tableWidget_RecordOrder->selectRow(i);
for (int i = 0; i < ui->tableWidget_RecordOrder->rowCount(); i++) { ui->tableWidget_RecordOrder->item(i, 0)->setSelected(true);
const QString testAssetId = ui->tableWidget_RecordOrder->item(i, 0)->text(); ui->tableWidget_RecordOrder->item(i, 1)->setSelected(true);
if (testAssetId != assetId) { continue; } ui->tableWidget_RecordOrder->item(i, 2)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 3)->setSelected(true);
ui->tableWidget_RecordOrder->selectRow(i); }
ui->tableWidget_RecordOrder->item(i, 0)->setSelected(true); }
ui->tableWidget_RecordOrder->item(i, 1)->setSelected(true); }
ui->tableWidget_RecordOrder->item(i, 2)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 3)->setSelected(true); void ZoneFileViewer::SortTags(const QString &aSearchText) {
} ui->listWidget_Tags->clear();
}
} const QStringList tags = mZoneFile->GetTags();
if (aSearchText.isEmpty()) {
void ZoneFileViewer::SortTags(const QString &aSearchText) { ui->listWidget_Tags->addItems(tags);
ui->listWidget_Tags->clear(); return;
}
const QStringList tags = mZoneFile->GetTags();
if (aSearchText.isEmpty()) { QStringList sortedTags;
ui->listWidget_Tags->addItems(tags); foreach (const QString tag, tags) {
return; if (tag.contains(aSearchText)) {
} sortedTags << tag;
}
QStringList sortedTags; }
foreach (const QString tag, tags) {
if (tag.contains(aSearchText)) { ui->listWidget_Tags->addItems(sortedTags);
sortedTags << tag; }
}
} void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
mZoneFile = aZoneFile;
StatusBarManager::instance().updateStatus(QString("Found %1 tags.").arg(sortedTags.size()));
ui->listWidget_Tags->addItems(sortedTags); ui->tableWidget_RecordCounts->clearContents();
} ui->tableWidget_RecordOrder->clearContents();
ui->listWidget_Tags->clear();
void ZoneFileViewer::SetZoneFile(const ZoneFile* aZoneFile) {
mZoneFile = aZoneFile; const QStringList tags = mZoneFile->GetTags();
ui->listWidget_Tags->addItems(tags);
ui->tableWidget_RecordCounts->clearContents(); ui->label_Title->setText(mZoneFile->GetStem() + ".zone");
ui->tableWidget_RecordOrder->clearContents();
ui->listWidget_Tags->clear(); if (tags.isEmpty()) {
ui->groupBox_Tags->hide();
const QStringList tags = mZoneFile->GetTags(); } else {
ui->listWidget_Tags->addItems(tags); ui->groupBox_Tags->show();
ui->label_Title->setText(mZoneFile->GetBaseStem() + ".zone"); }
ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(tags.size())); QMap<QString, int> recordCounts = QMap<QString, int>();
QVector<QPair<QString, int>> assetOccurances = QVector<QPair<QString, int>>();
if (tags.isEmpty()) { for (const QString &record : mZoneFile->GetRecords()) {
ui->groupBox_Tags->hide(); if (!recordCounts.contains(record)) {
} else { recordCounts[record] = 0;
ui->groupBox_Tags->show(); }
} recordCounts[record]++;
QMap<XAssetType, int> recordCounts = QMap<XAssetType, int>(); if (!assetOccurances.isEmpty() && assetOccurances.last().first == record) {
QVector<QPair<XAssetType, int>> assetOccurances = QVector<QPair<XAssetType, int>>(); assetOccurances.last().second++;
for (XAssetType type : mZoneFile->GetTypes()) { continue;
if (!recordCounts.contains(type)) { }
recordCounts[type] = 0;
} QPair<QString, int> assetOccurance(record, 1);
recordCounts[type]++; assetOccurances << assetOccurance;
}
if (!assetOccurances.isEmpty() && assetOccurances.last().first == type) { ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size());
assetOccurances.last().second++;
continue; int assetIndex = 0;
} foreach (auto assetOccurance, assetOccurances) {
const QString record = assetOccurance.first;
QPair<XAssetType, int> assetOccurance(type, 1); AssetType assetType = mZoneFile->AssetStrToEnum(record);
assetOccurances << assetOccurance; int assetCount = assetOccurance.second;
}
ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size()); QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType);
if (assetIcon.isNull()) {
int assetIndex = 0; qDebug() << "Icon is null for record: " << record;
foreach (auto assetOccurance, assetOccurances) { }
XAssetType assetType = assetOccurance.first;
int assetCount = assetOccurance.second; QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
QTableWidgetItem *recordStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType));
QIcon assetIcon = Utils::CreateAssetIcon(assetType); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
if (assetIcon.isNull()) { QTableWidgetItem *recordIconItem = new QTableWidgetItem();
qDebug() << "Icon is null for record: " << assetType; recordIconItem->setIcon(assetIcon);
}
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem);
QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16)); ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
QTableWidgetItem *recordStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType)); ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount)); ui->tableWidget_RecordOrder->setItem(assetIndex, 3, recordIconItem);
recordItem->setIcon(assetIcon);
assetIndex++;
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem); }
ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem); int recordIndex = 0;
for (const QString &record : recordCounts.keys()) {
assetIndex++; int recordCount = recordCounts[record];
}
AssetType assetType = mZoneFile->AssetStrToEnum(record);
int recordIndex = 0; QIcon assetIcon = mZoneFile->AssetTypeToIcon(assetType);
for (XAssetType assetType : recordCounts.keys()) { if (assetIcon.isNull()) {
int recordCount = recordCounts[assetType]; qDebug() << "Icon is null for record: " << record;
}
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
if (assetIcon.isNull()) { ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
qDebug() << "Icon is null for record: " << assetType;
} QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(mZoneFile->AssetEnumToStr(assetType));
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1); QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
QTableWidgetItem *recordIconItem = new QTableWidgetItem();
QTableWidgetItem *recordItem = new QTableWidgetItem(QString::number(assetType, 16)); recordIconItem->setIcon(assetIcon);
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(XAsset::XAssetTypeToString(assetType));
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount)); ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem);
recordItem->setIcon(assetIcon); ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem); ui->tableWidget_RecordCounts->setItem(recordIndex, 3, recordIconItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem); recordIndex++;
}
recordIndex++;
} ui->tableWidget_RecordOrder->resizeColumnsToContents();
ui->tableWidget_RecordCounts->resizeColumnsToContents();
ui->tableWidget_RecordOrder->resizeColumnsToContents(); }
ui->tableWidget_RecordCounts->resizeColumnsToContents();
}

View File

@ -1,33 +1,33 @@
#ifndef ZONEFILEVIEWER_H #ifndef ZONEFILEVIEWER_H
#define ZONEFILEVIEWER_H #define ZONEFILEVIEWER_H
#include "zonefile.h" #include "zonefile.h"
#include "utils.h" #include "utils.h"
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class ZoneFileViewer; class ZoneFileViewer;
} }
class ZoneFileViewer : public QWidget class ZoneFileViewer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ZoneFileViewer(QWidget *parent = nullptr); explicit ZoneFileViewer(QWidget *parent = nullptr);
~ZoneFileViewer(); ~ZoneFileViewer();
void SetZoneFile(const ZoneFile *aZoneFile); void SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile);
public slots: public slots:
void SortTags(const QString &aSearchText); void SortTags(const QString &aSearchText);
void HighlightRecordInOrder(); void HighlightRecordInOrder();
private: private:
Ui::ZoneFileViewer *ui; Ui::ZoneFileViewer *ui;
const ZoneFile* mZoneFile; std::shared_ptr<ZoneFile> mZoneFile;
}; };
#endif // ZONEFILEVIEWER_H #endif // ZONEFILEVIEWER_H

View File

@ -1,129 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ZoneFileViewer</class> <class>ZoneFileViewer</class>
<widget class="QWidget" name="ZoneFileViewer"> <widget class="QWidget" name="ZoneFileViewer">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>556</width> <width>556</width>
<height>428</height> <height>428</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="label_Title"> <widget class="QLabel" name="label_Title">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>16</pointsize> <pointsize>16</pointsize>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>ZoneFile 0</string> <string>ZoneFile 0</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QGroupBox" name="groupBox_Tags"> <widget class="QGroupBox" name="groupBox_Tags">
<property name="font"> <property name="font">
<font> <font>
<family>Roboto</family> <family>Roboto</family>
<pointsize>9</pointsize> <pointsize>9</pointsize>
</font> </font>
</property> </property>
<property name="title"> <property name="title">
<string>Tags</string> <string>Tags</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>Search:</string> <string>Search:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="lineEdit_TagSearch"> <widget class="QLineEdit" name="lineEdit_TagSearch">
<property name="placeholderText"> <property name="placeholderText">
<string>Search tags...</string> <string>Search tags...</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QListWidget" name="listWidget_Tags"> <widget class="QListWidget" name="listWidget_Tags">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_RecordCounts"> <widget class="QGroupBox" name="groupBox_RecordCounts">
<property name="title"> <property name="title">
<string>Record Counts</string> <string>Record Counts</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QTableWidget" name="tableWidget_RecordCounts"> <widget class="QTableWidget" name="tableWidget_RecordCounts">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum> <enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
</property> </property>
<property name="selectionBehavior"> <property name="selectionBehavior">
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum> <enum>QAbstractItemView::SelectionBehavior::SelectRows</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_RecordOrder"> <widget class="QGroupBox" name="groupBox_RecordOrder">
<property name="title"> <property name="title">
<string>Record Order</string> <string>Record Order</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QTableWidget" name="tableWidget_RecordOrder"> <widget class="QTableWidget" name="tableWidget_RecordOrder">
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set> <set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property> </property>
<property name="alternatingRowColors"> <property name="alternatingRowColors">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::NoSelection</enum> <enum>QAbstractItemView::SelectionMode::NoSelection</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

396
bink.h Normal file
View File

@ -0,0 +1,396 @@
/* xoreos - A reimplementation of BioWare's Aurora engine
*
* xoreos is the legal property of its developers, whose names
* can be found in the AUTHORS file distributed with this source
* distribution.
*
* xoreos is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* xoreos is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with xoreos. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file
* Decoding RAD Game Tools' Bink videos.
*/
/* Based on the Bink implementation in FFmpeg (<https://ffmpeg.org/)>,
* which is released under the terms of version 2 or later of the GNU
* Lesser General Public License.
*
* The original copyright notes in the files
* - libavformat/bink.c
* - libavcodec/bink.c
* - libavcodec/binkdata.h
* - libavcodec/binkdsp.c
* - libavcodec/binkdsp.h
* - libavcodec/binkaudio.c
* read as follows:
*
* Bink demuxer
* Copyright (c) 2008-2010 Peter Ross (pross@xvid.org)
* Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
*
* Bink video decoder
* Copyright (c) 2009 Konstantin Shishkov
* Copyright (C) 2011 Peter Ross <pross@xvid.org>
*
* Bink video decoder
* Copyright (C) 2009 Konstantin Shishkov
*
* Bink DSP routines
* Copyright (c) 2009 Konstantin Shishkov
*
* Bink Audio decoder
* Copyright (c) 2007-2011 Peter Ross (pross@xvid.org)
* Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef VIDEO_BINK_H
#define VIDEO_BINK_H
#include <vector>
#include <memory>
#include "src/common/types.h"
#include "src/common/rational.h"
#include "src/video/decoder.h"
namespace Common {
class SeekableReadStream;
class BitStream;
class Huffman;
class RDFT;
class DCT;
}
namespace Sound {
class PacketizedAudioStream;
}
namespace Video {
/** A decoder for RAD Game Tools' Bink videos. */
class Bink : public VideoDecoder {
public:
Bink(Common::SeekableReadStream *bink);
~Bink();
protected:
void decodeNextTrackFrame(VideoTrack &track);
void checkAudioBuffer(AudioTrack &track, const Common::Timestamp &endTime);
private:
static const int kAudioChannelsMax = 2;
static const int kAudioBlockSizeMax = (kAudioChannelsMax << 11);
enum AudioCodec {
kAudioCodecDCT,
kAudioCodecRDFT
};
/** An audio track. */
struct AudioInfo {
uint16_t flags;
uint32_t sampleRate;
uint8_t channels;
uint32_t outSampleRate;
uint8_t outChannels;
AudioCodec codec;
bool first;
uint32_t frameLen;
uint32_t overlapLen;
uint32_t blockSize;
uint32_t bandCount;
uint32_t *bands;
float root;
float coeffs[16 * kAudioBlockSizeMax];
int16_t prevCoeffs[kAudioBlockSizeMax];
float *coeffsPtr[kAudioChannelsMax];
Common::RDFT *rdft;
Common::DCT *dct;
AudioInfo();
AudioInfo(const AudioInfo &audioInfo) = default;
~AudioInfo();
};
/** A video frame. */
struct VideoFrame {
bool keyFrame;
uint32_t offset;
uint32_t size;
Common::BitStream *bits;
VideoFrame();
VideoFrame(const VideoFrame &videoFrame) = default;
~VideoFrame();
};
std::unique_ptr<Common::SeekableReadStream> _bink;
std::vector<AudioInfo> _audioTracks; ///< All audio tracks.
std::vector<VideoFrame> _frames; ///< All video frames.
uint32_t _audioTrack; ///< Audio track to use.
/** Load a Bink file. */
void load();
class BinkVideoTrack : public FixedRateVideoTrack {
public:
BinkVideoTrack(uint32_t width, uint32_t height, uint32_t frameCount, const Common::Rational &frameRate, bool swapPlanes, bool hasAlpha, uint32_t id);
uint32_t getWidth() const { return _width; }
uint32_t getHeight() const { return _height; }
int getCurFrame() const { return _curFrame; }
int getFrameCount() const { return _frameCount; }
/** Decode a video packet. */
void decodePacket(Graphics::Surface &surface, VideoFrame &frame);
protected:
Common::Rational getFrameRate() const { return _frameRate; }
private:
/** A decoder state. */
struct DecodeContext {
VideoFrame *video;
uint32_t planeIdx;
uint32_t blockX;
uint32_t blockY;
byte *dest;
byte *prev;
byte *destStart, *destEnd;
byte *prevStart, *prevEnd;
uint32_t pitch;
int coordMap[64];
int coordScaledMap1[64];
int coordScaledMap2[64];
int coordScaledMap3[64];
int coordScaledMap4[64];
};
/** IDs for different data types used in Bink video codec. */
enum Source {
kSourceBlockTypes = 0, ///< 8x8 block types.
kSourceSubBlockTypes , ///< 16x16 block types (a subset of 8x8 block types).
kSourceColors , ///< Pixel values used for different block types.
kSourcePattern , ///< 8-bit values for 2-color pattern fill.
kSourceXOff , ///< X components of motion value.
kSourceYOff , ///< Y components of motion value.
kSourceIntraDC , ///< DC values for intrablocks with DCT.
kSourceInterDC , ///< DC values for interblocks with DCT.
kSourceRun , ///< Run lengths for special fill block.
kSourceMAX
};
/** Bink video block types. */
enum BlockType {
kBlockSkip = 0, ///< Skipped block.
kBlockScaled , ///< Block has size 16x16.
kBlockMotion , ///< Block is copied from previous frame with some offset.
kBlockRun , ///< Block is composed from runs of colors with custom scan order.
kBlockResidue , ///< Motion block with some difference added.
kBlockIntra , ///< Intra DCT block.
kBlockFill , ///< Block is filled with single color.
kBlockInter , ///< Motion block with DCT applied to the difference.
kBlockPattern , ///< Block is filled with two colors following custom pattern.
kBlockRaw ///< Uncoded 8x8 block.
};
/** Data structure for decoding and translating Huffman'd data. */
struct Huffman {
int index; ///< Index of the Huffman codebook to use.
byte symbols[16]; ///< Huffman symbol => Bink symbol translation list.
Huffman();
};
/** Data structure used for decoding a single Bink data type. */
struct Bundle {
int countLengths[2]; ///< Lengths of number of entries to decode (in bits).
int countLength; ///< Length of number of entries to decode (in bits) for the current plane.
Huffman huffman; ///< Huffman codebook.
std::unique_ptr<byte[]> data; ///< Buffer for decoded symbols.
byte *dataEnd; ///< Pointer to the data end end.
byte *curDec; ///< Pointer to the data that wasn't yet decoded.
byte *curPtr; ///< Pointer to the data that wasn't yet read.
Bundle();
};
uint32_t _width;
uint32_t _height;
int _curFrame; ///< Current Frame.
int _frameCount;
Common::Rational _frameRate; ///< The frame rate of the video.
bool _swapPlanes; ///< Are the planes ordered (A)YVU instead of (A)YUV?
bool _hasAlpha; ///< Do video frames have alpha?
uint32_t _id; ///< The BIK FourCC.
Bundle _bundles[kSourceMAX]; ///< Bundles for decoding all data types.
std::unique_ptr<Common::Huffman> _huffman[16]; ///< The 16 Huffman codebooks used in Bink decoding.
/** Huffman codebooks to use for decoding high nibbles in color data types. */
Huffman _colHighHuffman[16];
/** Value of the last decoded high nibble in color data types. */
int _colLastVal;
std::unique_ptr<byte[]> _curPlanes[4]; ///< The 4 color planes, YUVA, current frame.
std::unique_ptr<byte[]> _oldPlanes[4]; ///< The 4 color planes, YUVA, last frame.
/** Initialize the bundles. */
void initBundles();
/** Initialize the Huffman decoders. */
void initHuffman();
/** Decode a video packet. */
void videoPacket(VideoFrame &video);
/** Decode a plane. */
void decodePlane(VideoFrame &video, int planeIdx, bool isChroma);
/** Read/Initialize a bundle for decoding a plane. */
void readBundle(VideoFrame &video, Source source);
/** Read the symbols for a Huffman code. */
void readHuffman(VideoFrame &video, Huffman &huffman);
/** Merge two Huffman symbol lists. */
void mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size);
/** Read and translate a symbol out of a Huffman code. */
byte getHuffmanSymbol(VideoFrame &video, Huffman &huffman);
/** Get a direct value out of a bundle. */
int32_t getBundleValue(Source source);
/** Read a count value out of a bundle. */
uint32_t readBundleCount(VideoFrame &video, Bundle &bundle);
// Handle the block types
void blockSkip (DecodeContext &ctx);
void blockScaledSkip (DecodeContext &ctx);
void blockScaledRun (DecodeContext &ctx);
void blockScaledIntra (DecodeContext &ctx);
void blockScaledFill (DecodeContext &ctx);
void blockScaledPattern(DecodeContext &ctx);
void blockScaledRaw (DecodeContext &ctx);
void blockScaled (DecodeContext &ctx);
void blockMotion (DecodeContext &ctx);
void blockRun (DecodeContext &ctx);
void blockResidue (DecodeContext &ctx);
void blockIntra (DecodeContext &ctx);
void blockFill (DecodeContext &ctx);
void blockInter (DecodeContext &ctx);
void blockPattern (DecodeContext &ctx);
void blockRaw (DecodeContext &ctx);
// Read the bundles
void readRuns (VideoFrame &video, Bundle &bundle);
void readMotionValues(VideoFrame &video, Bundle &bundle);
void readBlockTypes (VideoFrame &video, Bundle &bundle);
void readPatterns (VideoFrame &video, Bundle &bundle);
void readColors (VideoFrame &video, Bundle &bundle);
void readDCS (VideoFrame &video, Bundle &bundle, int startBits, bool hasSign);
void readDCTCoeffs (VideoFrame &video, int16_t *block, bool isIntra);
void readResidue (VideoFrame &video, int16_t *block, int masksCount);
// Bink video IDCT
void IDCT(int16_t *block);
void IDCTPut(DecodeContext &ctx, int16_t *block);
void IDCTAdd(DecodeContext &ctx, int16_t *block);
};
class BinkAudioTrack : public AudioTrack {
public:
BinkAudioTrack(size_t index, AudioInfo &audio);
~BinkAudioTrack();
bool canBufferData() const;
/** Decode audio data up to endTime. */
void decodeAudio(Common::SeekableReadStream& bink, const std::vector<VideoFrame>& frames, const std::vector<AudioInfo>& audioTracks, const Common::Timestamp& endTime);
protected:
Sound::AudioStream *getAudioStream() const;
private:
size_t _index;
AudioInfo &_info;
Sound::PacketizedAudioStream *_audioStream;
uint32_t _curFrame;
Common::Timestamp _audioBuffered;
float getFloat(Common::BitStream &bits);
/** Decode an audio block. */
void audioBlock(Common::BitStream &bits, int16_t *out);
/** Decode a DCT'd audio block. */
void audioBlockDCT(Common::BitStream &bits);
/** Decode a RDFT'd audio block. */
void audioBlockRDFT(Common::BitStream &bits);
void readAudioCoeffs(Common::BitStream &bits, float *coeffs);
static void floatToInt16Interleave(int16_t *dst, const float **src, uint32_t length, uint8_t channels);
};
void initAudioTrack(AudioInfo &audio);
};
} // End of namespace Video
#endif // VIDEO_BINK_H

View File

@ -1,30 +1,94 @@
<RCC> <RCC>
<qresource prefix="/images"> <qresource prefix="/obj">
<file>images/XPlor.png</file> <file>obj/defaultactor_LOD0.XMODEL_BIN</file>
<file>images/copy.svg</file> <file>obj/defaultactor_LOD0.XMODEL_EXPORT</file>
<file>images/cut.svg</file> <file>obj/defaultactor_LOD0.bin</file>
<file>images/multiple.png</file> <file>obj/defaultactor_LOD0.cast</file>
<file>images/new_file.svg</file> <file>obj/defaultactor_LOD0.gltf</file>
<file>images/open_file.svg</file> <file>obj/defaultactor_LOD0.ma</file>
<file>images/open_folder.svg</file> <file>obj/defaultactor_LOD0.mesh.ascii</file>
<file>images/paste.svg</file> <file>obj/defaultactor_LOD0.obj</file>
<file>images/refresh.svg</file> <file>obj/defaultactor_LOD0.semodel</file>
<file>images/save.svg</file> <file>obj/defaultactor_LOD0.smd</file>
</qresource> <file>obj/defaultactor_LOD0_BIND.mel</file>
<qresource prefix="/icons"> <file>obj/defaultactor_LOD0_cosmetics.mel</file>
<file>icons/Icon_Pause.png</file> <file>obj/diffusemap.png</file>
<file>icons/Icon_Play.png</file> <file>obj/mtl_body_default_character.mtl</file>
<file>icons/Icon_SkipBack.png</file> <file>obj/mtl_body_default_character_images.txt</file>
<file>icons/Icon_SkipForward.png</file> <file>obj/normalmap.png</file>
<file>icons/Icon_Stop.png</file> </qresource>
<file>icons/Icon_Editor.png</file> <qresource prefix="/d3dbsp">
<file>icons/Icon_Views.png</file> <file>d3dbsp/asset_viewer.d3dbsp</file>
<file>icons/Icon_Tree.png</file> <file>d3dbsp/barebones.d3dbsp</file>
<file>icons/Icon_Cut.png</file> </qresource>
<file>icons/Icon_Find.png</file> <qresource prefix="/images">
<file>icons/Icon_NewFile.png</file> <file>images/XPlor.png</file>
<file>icons/Icon_Paste.png</file> <file>images/copy.svg</file>
<file>icons/Icon_Save.png</file> <file>images/cut.svg</file>
<file>icons/Icon_OpenFile.png</file> <file>images/multiple.png</file>
</qresource> <file>images/new_file.svg</file>
</RCC> <file>images/open_file.svg</file>
<file>images/open_folder.svg</file>
<file>images/paste.svg</file>
<file>images/refresh.svg</file>
<file>images/save.svg</file>
</qresource>
<qresource prefix="/icons">
<file>icons/Icon_COD4.png</file>
<file>icons/Icon_COD5.png</file>
<file>icons/Icon_COD6.png</file>
<file>icons/Icon_COD7.png</file>
<file>icons/Icon_COD8.png</file>
<file>icons/Icon_COD9.png</file>
<file>icons/Icon_DDSFile.png</file>
<file>icons/Icon_FastFile.png</file>
<file>icons/Icon_IWIFile.png</file>
<file>icons/Icon_PC.png</file>
<file>icons/Icon_Playstation.png</file>
<file>icons/Icon_Xbox.png</file>
<file>icons/Icon_ZoneFile.png</file>
<file>icons/Icon_GSCFile.png</file>
<file>icons/Icon_StringFile.png</file>
<file>icons/Icon_TechSetFile.png</file>
<file>icons/Icon_WAVFile.png</file>
<file>icons/Icon_MenuFile.png</file>
<file>icons/Icon_Image.png</file>
<file>icons/Icon_Model.png</file>
<file>icons/Icon_StringTable.png</file>
<file>icons/Icon_Sound.png</file>
<file>icons/Icon_Pause.png</file>
<file>icons/Icon_Play.png</file>
<file>icons/Icon_SkipBack.png</file>
<file>icons/Icon_SkipForward.png</file>
<file>icons/Icon_Stop.png</file>
<file>icons/Icon_Editor.png</file>
<file>icons/Icon_Views.png</file>
<file>icons/Icon_Tree.png</file>
<file>icons/Icon_Copy.png</file>
<file>icons/Icon_Cut.png</file>
<file>icons/Icon_Find.png</file>
<file>icons/Icon_NewFile.png</file>
<file>icons/Icon_Paste.png</file>
<file>icons/Icon_Save.png</file>
<file>icons/Icon_OpenFile.png</file>
<file>icons/Icon_COD2.png</file>
<file>icons/Icon_Material.png</file>
<file>icons/Icon_Animation.png</file>
<file>icons/Icon_BSP.png</file>
<file>icons/Icon_ColMapSp.png</file>
<file>icons/Icon_Effect.png</file>
<file>icons/Icon_GameMapSp.png</file>
<file>icons/Icon_Font.png</file>
<file>icons/Icon_FXMap.png</file>
<file>icons/Icon_LightDef.png</file>
<file>icons/Icon_Weapon.png</file>
<file>icons/Icon_RawFile.png</file>
<file>icons/Icon_Destructible.png</file>
<file>icons/Icon_PhysPreset.png</file>
<file>icons/Icon_Wii.png</file>
<file>icons/Icon_WiiU.png</file>
<file>icons/Icon_COD10.png</file>
<file>icons/Icon_COD11.png</file>
<file>icons/Icon_COD12.png</file>
</qresource>
</RCC>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
data/icons/Icon_BSP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
data/icons/Icon_COD10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
data/icons/Icon_COD11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
data/icons/Icon_COD12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
data/icons/Icon_COD2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
data/icons/Icon_COD4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
data/icons/Icon_COD5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
data/icons/Icon_COD6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
data/icons/Icon_COD7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
data/icons/Icon_COD8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
data/icons/Icon_COD9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
data/icons/Icon_Copy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

BIN
data/icons/Icon_DDSFile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
data/icons/Icon_Effect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
data/icons/Icon_FXMap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

BIN
data/icons/Icon_Font.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
data/icons/Icon_GSCFile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
data/icons/Icon_IWIFile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
data/icons/Icon_Image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
data/icons/Icon_Model.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
data/icons/Icon_PC.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
data/icons/Icon_RawFile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
data/icons/Icon_Sound.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Some files were not shown because too many files have changed in this diff Show More