Add settings dialog for Qt

This commit is contained in:
baldurk
2017-02-03 20:10:08 +00:00
parent 923dfbd6fb
commit cf1ef45a5e
13 changed files with 1455 additions and 15 deletions
+7 -2
View File
@@ -90,6 +90,8 @@ bool PersistantConfig::Deserialize(QString filename)
{
QFile f(filename);
m_Filename = filename;
// silently allow missing configs
if(!f.exists())
return true;
@@ -115,13 +117,16 @@ bool PersistantConfig::Deserialize(QString filename)
bool PersistantConfig::Serialize(QString filename)
{
if(filename != "")
m_Filename = filename;
QVariantMap values = storeValues();
QFile f(filename);
QFile f(m_Filename);
if(f.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
return SaveToJSON(values, f, JSON_ID, JSON_VER);
qWarning() << "Couldn't write to " << filename << " " << f.errorString();
qWarning() << "Couldn't write to " << m_Filename << " " << f.errorString();
return false;
}
+10 -1
View File
@@ -71,6 +71,8 @@ typedef QMap<QString, QString> QStringMap;
\
CONFIG_SETTING_VAL(public, bool, bool, EventBrowser_HideEmpty, false) \
\
CONFIG_SETTING_VAL(public, bool, bool, EventBrowser_HideAPICalls, false) \
\
CONFIG_SETTING_VAL(public, bool, bool, EventBrowser_ApplyColours, true) \
\
CONFIG_SETTING_VAL(public, bool, bool, EventBrowser_ColourEventRow, true) \
@@ -85,6 +87,10 @@ typedef QMap<QString, QString> QStringMap;
\
CONFIG_SETTING_VAL(public, bool, bool, Font_PreferMonospaced, false) \
\
CONFIG_SETTING_VAL(public, QString, QString, Android_AdbExecutablePath, "") \
\
CONFIG_SETTING_VAL(public, int, int, Android_MaxConnectTimeout, 30) \
\
CONFIG_SETTING_VAL(public, bool, bool, CheckUpdate_AllowChecks, true) \
\
CONFIG_SETTING_VAL(public, bool, bool, CheckUpdate_UpdateAvailable, false) \
@@ -112,6 +118,7 @@ public:
Milliseconds,
Microseconds,
Nanoseconds,
Count,
};
CONFIG_SETTINGS()
@@ -119,7 +126,7 @@ public:
public:
PersistantConfig() {}
bool Deserialize(QString filename);
bool Serialize(QString filename);
bool Serialize(QString filename = "");
void SetupFormatting();
@@ -145,4 +152,6 @@ public:
private:
QVariantMap storeValues() const;
void applyValues(const QVariantMap &values);
QString m_Filename;
};
+1 -1
View File
@@ -151,7 +151,7 @@ int main(int argc, char *argv[])
QCoreApplication::sendPostedEvents();
}
config.Serialize(configFilename);
config.Serialize();
}
delete[] argv_mod;
+2 -1
View File
@@ -74,6 +74,8 @@ public:
void setExecutableFilename(QString filename);
void loadSettings(QString filename);
void updateGlobalHook();
private slots:
// automatic slots
void on_exePathBrowse_clicked();
@@ -105,7 +107,6 @@ private:
OnCaptureMethod m_CaptureCallback;
OnInjectMethod m_InjectCallback;
void updateGlobalHook();
void setEnvironmentModifications(const QList<EnvironmentModification> &modifications);
void triggerCapture();
@@ -0,0 +1,336 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2017 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#include "SettingsDialog.h"
#include "Code/CaptureContext.h"
#include "Code/PersistantConfig.h"
#include "Code/QRDUtils.h"
#include "CaptureDialog.h"
#include "ui_SettingsDialog.h"
SettingsDialog::SettingsDialog(CaptureContext *ctx, QWidget *parent)
: QDialog(parent), ui(new Ui::SettingsDialog)
{
m_Ctx = ctx;
ui->setupUi(this);
ui->tabWidget->tabBar()->setVisible(false);
for(int i = 0; i < ui->tabWidget->count(); i++)
ui->pages->addItem(ui->tabWidget->tabText(i));
m_Init = true;
for(int i = 0; i < (int)PersistantConfig::TimeUnit::Count; i++)
{
ui->EventBrowser_TimeUnit->addItem(PersistantConfig::UnitPrefix((PersistantConfig::TimeUnit)i));
}
ui->pages->clearSelection();
ui->pages->setItemSelected(ui->pages->item(0), true);
ui->tabWidget->setCurrentIndex(0);
ui->saveDirectory->setText(m_Ctx->Config.DefaultCaptureSaveDirectory);
ui->tempDirectory->setText(m_Ctx->Config.TemporaryCaptureDirectory);
// TODO external disassembler
/*
ui->ExternalDisassemblerEnabled->setChecked(m_Ctx->Config.ExternalDisassemblerEnabled);
ui->externalDisassemblerArgs->setText(m_Ctx->Config.GetDefaultExternalDisassembler().args);
ui->externalDisassemblePath->setText(m_Ctx->Config.GetDefaultExternalDisassembler().executable);
*/
ui->Android_AdbExecutablePath->setText(m_Ctx->Config.Android_AdbExecutablePath);
ui->Android_MaxConnectTimeout->setValue(m_Ctx->Config.Android_MaxConnectTimeout);
ui->TextureViewer_ResetRange->setChecked(m_Ctx->Config.TextureViewer_ResetRange);
ui->TextureViewer_PerTexSettings->setChecked(m_Ctx->Config.TextureViewer_PerTexSettings);
ui->ShaderViewer_FriendlyNaming->setChecked(m_Ctx->Config.ShaderViewer_FriendlyNaming);
ui->CheckUpdate_AllowChecks->setChecked(m_Ctx->Config.CheckUpdate_AllowChecks);
ui->Font_PreferMonospaced->setChecked(m_Ctx->Config.Font_PreferMonospaced);
ui->AlwaysReplayLocally->setChecked(m_Ctx->Config.AlwaysReplayLocally);
ui->AllowGlobalHook->setChecked(m_Ctx->Config.AllowGlobalHook);
ui->EventBrowser_TimeUnit->setCurrentIndex((int)m_Ctx->Config.EventBrowser_TimeUnit);
ui->EventBrowser_HideEmpty->setChecked(m_Ctx->Config.EventBrowser_HideEmpty);
ui->EventBrowser_HideAPICalls->setChecked(m_Ctx->Config.EventBrowser_HideAPICalls);
ui->EventBrowser_ApplyColours->setChecked(m_Ctx->Config.EventBrowser_ApplyColours);
ui->EventBrowser_ColourEventRow->setChecked(m_Ctx->Config.EventBrowser_ColourEventRow);
// disable sub-checkbox
ui->EventBrowser_ColourEventRow->setEnabled(ui->EventBrowser_ApplyColours->isChecked());
ui->Formatter_MinFigures->setValue(m_Ctx->Config.Formatter_MinFigures);
ui->Formatter_MaxFigures->setValue(m_Ctx->Config.Formatter_MaxFigures);
ui->Formatter_NegExp->setValue(m_Ctx->Config.Formatter_NegExp);
ui->Formatter_PosExp->setValue(m_Ctx->Config.Formatter_PosExp);
m_Init = false;
QObject::connect(ui->Formatter_MinFigures, OverloadedSlot<int>::of(&QSpinBox::valueChanged), this,
&SettingsDialog::formatter_valueChanged);
QObject::connect(ui->Formatter_MaxFigures, OverloadedSlot<int>::of(&QSpinBox::valueChanged), this,
&SettingsDialog::formatter_valueChanged);
QObject::connect(ui->Formatter_NegExp, OverloadedSlot<int>::of(&QSpinBox::valueChanged), this,
&SettingsDialog::formatter_valueChanged);
QObject::connect(ui->Formatter_PosExp, OverloadedSlot<int>::of(&QSpinBox::valueChanged), this,
&SettingsDialog::formatter_valueChanged);
}
SettingsDialog::~SettingsDialog()
{
delete ui;
}
void SettingsDialog::on_pages_itemSelectionChanged()
{
QList<QListWidgetItem *> sel = ui->pages->selectedItems();
if(sel.empty())
{
ui->pages->setItemSelected(ui->pages->item(ui->tabWidget->currentIndex()), true);
}
else
{
ui->tabWidget->setCurrentIndex(ui->pages->row(sel[0]));
}
}
void SettingsDialog::on_okButton_accepted()
{
setResult(1);
accept();
}
// general
void SettingsDialog::formatter_valueChanged(int val)
{
m_Ctx->Config.Formatter_MinFigures = ui->Formatter_MinFigures->value();
m_Ctx->Config.Formatter_MaxFigures = ui->Formatter_MaxFigures->value();
m_Ctx->Config.Formatter_NegExp = ui->Formatter_NegExp->value();
m_Ctx->Config.Formatter_PosExp = ui->Formatter_PosExp->value();
m_Ctx->Config.SetupFormatting();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_tempDirectory_textEdited(const QString &dir)
{
if(QDir(dir).exists())
m_Ctx->Config.TemporaryCaptureDirectory = dir;
else
m_Ctx->Config.TemporaryCaptureDirectory = "";
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_saveDirectory_textEdited(const QString &dir)
{
if(QDir(dir).exists() || dir == "")
m_Ctx->Config.DefaultCaptureSaveDirectory = dir;
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_browseSaveCaptureDirectory_clicked()
{
QString dir = RDDialog::getExistingDirectory(this, "Choose default directory for saving captures",
m_Ctx->Config.DefaultCaptureSaveDirectory);
if(dir != "")
m_Ctx->Config.DefaultCaptureSaveDirectory = dir;
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_AllowGlobalHook_toggled(bool checked)
{
m_Ctx->Config.AllowGlobalHook = ui->AllowGlobalHook->isChecked();
m_Ctx->Config.Serialize();
if(m_Ctx->hasCaptureDialog())
m_Ctx->captureDialog()->updateGlobalHook();
}
void SettingsDialog::on_CheckUpdate_AllowChecks_toggled(bool checked)
{
m_Ctx->Config.CheckUpdate_AllowChecks = ui->CheckUpdate_AllowChecks->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_Font_PreferMonospaced_toggled(bool checked)
{
m_Ctx->Config.Font_PreferMonospaced = ui->Font_PreferMonospaced->isChecked();
m_Ctx->Config.SetupFormatting();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_AlwaysReplayLocally_toggled(bool checked)
{
m_Ctx->Config.AlwaysReplayLocally = ui->AlwaysReplayLocally->isChecked();
m_Ctx->Config.Serialize();
}
// core
void SettingsDialog::on_chooseSearchPaths_clicked()
{
// TODO ordered list editor
}
// texture viewer
void SettingsDialog::on_TextureViewer_PerTexSettings_toggled(bool checked)
{
m_Ctx->Config.TextureViewer_PerTexSettings = ui->TextureViewer_PerTexSettings->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_TextureViewer_ResetRange_toggled(bool checked)
{
m_Ctx->Config.TextureViewer_ResetRange = ui->TextureViewer_ResetRange->isChecked();
m_Ctx->Config.Serialize();
}
// shader viewer
void SettingsDialog::on_ShaderViewer_FriendlyNaming_toggled(bool checked)
{
m_Ctx->Config.ShaderViewer_FriendlyNaming = ui->ShaderViewer_FriendlyNaming->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_ExternalDisassemblerEnabled_toggled(bool checked)
{
// TODO external disassembler
// m_Ctx->Config.ExternalDisassemblerEnabled = ui->ExternalDisassemblerEnabled->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_browseExtDisasemble_clicked()
{
// TODO external disassembler
}
void SettingsDialog::on_externalDisassemblePath_textEdited(const QString &disasm)
{
// TODO external disassembler
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_externalDisassemblerArgs_textEdited(const QString &args)
{
// TODO external disassembler
m_Ctx->Config.Serialize();
}
// event browser
void SettingsDialog::on_EventBrowser_TimeUnit_currentIndexChanged(int index)
{
if(m_Init)
return;
m_Ctx->Config.EventBrowser_TimeUnit =
(PersistantConfig::TimeUnit)ui->EventBrowser_TimeUnit->currentIndex();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_EventBrowser_HideEmpty_toggled(bool checked)
{
m_Ctx->Config.EventBrowser_HideEmpty = ui->EventBrowser_HideEmpty->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_EventBrowser_HideAPICalls_toggled(bool checked)
{
m_Ctx->Config.EventBrowser_HideAPICalls = ui->EventBrowser_HideAPICalls->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_EventBrowser_ApplyColours_toggled(bool checked)
{
m_Ctx->Config.EventBrowser_ApplyColours = ui->EventBrowser_ApplyColours->isChecked();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_EventBrowser_ColourEventRow_toggled(bool checked)
{
m_Ctx->Config.EventBrowser_ColourEventRow = ui->EventBrowser_ColourEventRow->isChecked();
m_Ctx->Config.Serialize();
}
// android
void SettingsDialog::on_browseTempCaptureDirectory_clicked()
{
QString dir = RDDialog::getExistingDirectory(this, "Choose directory for temporary captures",
m_Ctx->Config.TemporaryCaptureDirectory);
if(dir != "")
m_Ctx->Config.TemporaryCaptureDirectory = dir;
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_browseAdbPath_clicked()
{
QString adb = RDDialog::getExecutableFileName(
this, "Locate adb executable",
QFileInfo(m_Ctx->Config.Android_AdbExecutablePath).absoluteDir().path());
if(adb != "")
m_Ctx->Config.Android_AdbExecutablePath = adb;
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_MaxConnectTimeout_valueChanged(double timeout)
{
m_Ctx->Config.Android_MaxConnectTimeout = ui->Android_MaxConnectTimeout->value();
m_Ctx->Config.Serialize();
}
void SettingsDialog::on_Android_AdbExecutablePath_textEdited(const QString &adb)
{
if(QFileInfo::exists(adb))
m_Ctx->Config.Android_AdbExecutablePath = adb;
m_Ctx->Config.Serialize();
}
@@ -0,0 +1,98 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2017 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#pragma once
#include <QDialog>
namespace Ui
{
class SettingsDialog;
}
class QListWidgetItem;
class CaptureContext;
class SettingsDialog : public QDialog
{
Q_OBJECT
public:
explicit SettingsDialog(CaptureContext *ctx, QWidget *parent = 0);
~SettingsDialog();
private slots:
// automatic slots
// global
void on_pages_itemSelectionChanged();
void on_okButton_accepted();
// general
void on_tempDirectory_textEdited(const QString &temp);
void on_saveDirectory_textEdited(const QString &save);
void on_browseSaveCaptureDirectory_clicked();
void on_AllowGlobalHook_toggled(bool checked);
void on_CheckUpdate_AllowChecks_toggled(bool checked);
void on_Font_PreferMonospaced_toggled(bool checked);
void on_AlwaysReplayLocally_toggled(bool checked);
// core
void on_chooseSearchPaths_clicked();
// texture viewer
void on_TextureViewer_PerTexSettings_toggled(bool checked);
void on_TextureViewer_ResetRange_toggled(bool checked);
// shader viewer
void on_ShaderViewer_FriendlyNaming_toggled(bool checked);
void on_ExternalDisassemblerEnabled_toggled(bool checked);
void on_browseExtDisasemble_clicked();
void on_externalDisassemblePath_textEdited(const QString &path);
void on_externalDisassemblerArgs_textEdited(const QString &args);
// event browser
void on_EventBrowser_TimeUnit_currentIndexChanged(int index);
void on_EventBrowser_HideEmpty_toggled(bool checked);
void on_EventBrowser_HideAPICalls_toggled(bool checked);
void on_EventBrowser_ApplyColours_toggled(bool checked);
void on_EventBrowser_ColourEventRow_toggled(bool checked);
// android
void on_browseTempCaptureDirectory_clicked();
void on_browseAdbPath_clicked();
void on_MaxConnectTimeout_valueChanged(double timeout);
void on_Android_AdbExecutablePath_textEdited(const QString &path);
// manual slots
void formatter_valueChanged(int value);
private:
Ui::SettingsDialog *ui;
CaptureContext *m_Ctx;
bool m_Init = false;
};
@@ -0,0 +1,954 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SettingsDialog</class>
<widget class="QWidget" name="SettingsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>614</width>
<height>470</height>
</rect>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item row="1" column="2">
<widget class="QDialogButtonBox" name="okButton">
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QListWidget" name="pages">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::West</enum>
</property>
<property name="currentIndex">
<number>5</number>
</property>
<property name="documentMode">
<bool>true</bool>
</property>
<widget class="QWidget" name="general">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>General</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<property name="topMargin">
<number>0</number>
</property>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="toolTip">
<string>Any numbers larger than this exponent will be displayed in scientific notation.
e.g. 1000 * 10 = 1e4</string>
</property>
<property name="text">
<string>Positive exponential cutoff value</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_9">
<property name="toolTip">
<string>Wherever possible a monospaced font will be used instead of the default font</string>
</property>
<property name="text">
<string>Prefer monospaced fonts in UI (restart required)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="Formatter_MinFigures">
<property name="toolTip">
<string>Decimals will display at least this many digits.
e.g. a value of 2 means 0 will display as 0.00, 0.5 as 0.50</string>
</property>
<property name="value">
<number>2</number>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_6">
<property name="toolTip">
<string>Changes the default directory for the save dialog when saving capture files.
Defaults to blank, which follows system default behaviour.</string>
</property>
<property name="text">
<string>Default save directory for captures</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="toolTip">
<string>Any numbers smaller than this exponent will be displayed in scientific notation.
E.g. a value of 3 means 0.005 / 10 = 5E-4</string>
</property>
<property name="text">
<string>Negative exponential cutoff value</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>Decimals will display at least this many digits.
e.g. a value of 2 means 0 will display as 0.00, 0.5 as 0.50</string>
</property>
<property name="text">
<string>Minimum decimal places on float values</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_7">
<property name="toolTip">
<string>Enables functionality on the capture application window that will insert RenderDoc automatically
into all new processes created - then inject into the target (matching) executable.
Useful for capturing programs indirectly that can't easily be launched directly by RenderDoc
Since this is a global system hook it must be used carefully and only when necessary!</string>
</property>
<property name="text">
<string>Allow global process hooking - be careful!</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="toolTip">
<string>No more significant figures than this will be displayed on floats.
e.g. a value of 5 means 0.123456789 will display as 0.12345</string>
</property>
<property name="text">
<string>Maximum significant figures on decimals</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_8">
<property name="toolTip">
<string>Allows RenderDoc to phone home to https://renderdoc.org to anonymously check for new versions.</string>
</property>
<property name="text">
<string>Allow periodic anonymous update checks</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="toolTip">
<string>Changes the directory where capture files are saved after being created, until saved manually or deleted.
Defaults to %TEMP%.</string>
</property>
<property name="text">
<string>Directory for temporary capture files</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="Formatter_NegExp">
<property name="toolTip">
<string>Any numbers smaller than this exponent will be displayed in scientific notation.
E.g. a value of 3 means 0.005 / 10 = 5E-4</string>
</property>
<property name="value">
<number>5</number>
</property>
</widget>
</item>
<item row="12" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>216</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLineEdit" name="tempDirectory">
<property name="toolTip">
<string>Changes the directory where capture files are saved after being created, until saved manually or deleted.
Defaults to %TEMP%.</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="browseTempCaptureDirectory">
<property name="toolTip">
<string>Changes the directory where capture files are saved after being created, until saved manually or deleted.
Defaults to %TEMP%.</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QPushButton" name="browseSaveCaptureDirectory">
<property name="toolTip">
<string>Changes the default directory for the save dialog when saving capture files.
Defaults to blank, which follows system default behaviour.</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QCheckBox" name="AllowGlobalHook">
<property name="toolTip">
<string>Enables functionality on the capture application window that will insert RenderDoc automatically
into all new processes created - then inject into the target (matching) executable.
Useful for capturing programs indirectly that can't easily be launched directly by RenderDoc
Since this is a global system hook it must be used carefully and only when necessary!</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QCheckBox" name="CheckUpdate_AllowChecks">
<property name="toolTip">
<string>Allows RenderDoc to phone home to https://renderdoc.org to anonymously check for new versions.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QCheckBox" name="Font_PreferMonospaced">
<property name="toolTip">
<string>Wherever possible a monospaced font will be used instead of the default font</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="Formatter_MaxFigures">
<property name="toolTip">
<string>No more significant figures than this will be displayed on floats.
e.g. a value of 5 means 0.123456789 will display as 0.12345</string>
</property>
<property name="value">
<number>5</number>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLineEdit" name="saveDirectory">
<property name="toolTip">
<string>Changes the default directory for the save dialog when saving capture files.
Defaults to blank, which follows system default behaviour.</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="Formatter_PosExp">
<property name="toolTip">
<string>Any numbers larger than this exponent will be displayed in scientific notation.
e.g. 1000 * 10 = 1e4</string>
</property>
<property name="value">
<number>7</number>
</property>
<property name="displayIntegerBase">
<number>10</number>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="label_10">
<property name="toolTip">
<string>If a capture is marked as being created on a significantly different system (different OS or platform)
as is currently running, then by default the UI will prompt to ask if you want to replay on a remote context.
This option overrides that and will always replay locally if the local context is selected.</string>
</property>
<property name="text">
<string>Always replay logs locally, never prompt about it</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QCheckBox" name="AlwaysReplayLocally">
<property name="toolTip">
<string>If a capture is marked as being created on a significantly different system (different OS or platform)
as is currently running, then by default the UI will prompt to ask if you want to replay on a remote context.
This option overrides that and will always replay locally if the local context is selected.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="core">
<attribute name="title">
<string>Core</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Core</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="topMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Shader debug search paths</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="chooseSearchPaths">
<property name="text">
<string>Choose paths</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>387</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="textureTab">
<attribute name="title">
<string>Texture Viewer</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Texture Viewer</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_12">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Reset visible range when changing event or texture</string>
</property>
<property name="text">
<string>Reset Range on changing selection</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="TextureViewer_ResetRange">
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Reset visible range when changing event or texture</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_13">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>The visible channels (RGBA) and selected mip/slice are remembered and restored per-texture.</string>
</property>
<property name="text">
<string>Visible channels &amp; mip/slice saved per-texture</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="TextureViewer_PerTexSettings">
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>The visible channels (RGBA) and selected mip/slice are remembered and restored per-texture.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>378</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="shaderTab">
<attribute name="title">
<string>Shader Viewer</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Shader Viewer</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QLabel" name="label_14">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>In disassembly view, rename constant registers to their names from shader reflection data</string>
</property>
<property name="text">
<string>Rename disassembly registers</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="ShaderViewer_FriendlyNaming">
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>In disassembly view, rename constant registers to their names from shader reflection data</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Vulkan Shaders</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_15">
<property name="toolTip">
<string>Use an external tool to disassemble SPIR-V instead of RenderDoc's built-in disassembly.
This is useful if you want to disassemble directly to a high level language like GLSL or HLSL that can be compiled for editing.</string>
</property>
<property name="text">
<string>Use External Disassembler</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="ExternalDisassemblerEnabled">
<property name="toolTip">
<string>Use an external tool to disassemble SPIR-V instead of RenderDoc's built-in disassembly.
This is useful if you want to disassemble directly to a high level language like GLSL or HLSL that can be compiled for editing.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLineEdit" name="externalDisassemblePath">
<property name="toolTip">
<string>Choose the executable file to invoke every time a shader needs to be disassembled</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>External Disassembler command line arguments</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="browseExtDisasemble">
<property name="toolTip">
<string>Choose the executable file to invoke every time a shader needs to be disassembled</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>External Disassembler executable</string>
</property>
</widget>
</item>
<item row="6" column="0">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<widget class="QLineEdit" name="externalDisassemblerArgs">
<property name="toolTip">
<string>The command line arguments to the executable.
The {spv_bin} and {spv_disas} tags indicate the (temporary) path to the SPIR-V binary file, and the expected SPIR-V disassembled file to create.
If {spv_disas} is not used, the tool is expected to output the disassembly on stdout.</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>NOTE: Use the {spv_bin} and {spv_disas} tags to indicate to the external disassembler the input SPIR-V binary and the output SPIR-V disassembly respectively.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="eventTab">
<attribute name="title">
<string>Event Browser</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_6">
<property name="title">
<string>Event Browser</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<widget class="QLabel" name="label_19">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>The time unit to use when displaying the duration column in the event browser</string>
</property>
<property name="text">
<string>Time unit used for drawcall durations</string>
</property>
</widget>
</item>
<item row="6" column="0">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>297</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="EventBrowser_TimeUnit">
<property name="toolTip">
<string>The time unit to use when displaying the duration column in the event browser</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_20">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections that contain no API calls or drawcalls will be completely removed</string>
</property>
<property name="text">
<string>Hide empty marker sections (requires file reload)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="EventBrowser_HideEmpty">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections that contain no API calls or drawcalls will be completely removed</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="EventBrowser_HideAPICalls">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections that contain only non-draw API calls - e.g. only queries, or only state setting - will be completely removed</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_21">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections that contain only non-draw API calls - e.g. only queries, or only state setting - will be completely removed</string>
</property>
<property name="text">
<string>Hide marker sections with only non-draw API calls (requires file reload)</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="EventBrowser_ApplyColours">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections and marker labels will be coloured with an API-specified colour.
</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="EventBrowser_ColourEventRow">
<property name="toolTip">
<string>When colouring marker sections in the Event Browser, the whole row of a marker region will be coloured, not just a bar to the left of its children.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_22">
<property name="toolTip">
<string>In the Event Browser and Timeline Bar, marker sections and marker labels will be coloured with an API-specified colour.
</string>
</property>
<property name="text">
<string>Apply marker colours (requires file reload)</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_23">
<property name="toolTip">
<string>When colouring marker sections in the Event Browser, the whole row of a marker region will be coloured, not just a bar to the left of its children.</string>
</property>
<property name="text">
<string> - Colourise whole row for marker regions</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="androidTab">
<attribute name="title">
<string>Android</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_7">
<property name="title">
<string>Android</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="0" column="0">
<widget class="QLabel" name="label_24">
<property name="toolTip">
<string>The location of adb.exe, used to control Android devices.</string>
</property>
<property name="text">
<string>Android ADB executable path</string>
</property>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>325</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_25">
<property name="toolTip">
<string>Maximum time to try connecting to the target app.</string>
</property>
<property name="text">
<string>Max Connection Timeout (seconds)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="Android_MaxConnectTimeout">
<property name="toolTip">
<string>Maximum time to try connecting to the target app.</string>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="Android_AdbExecutablePath">
<property name="toolTip">
<string>The location of adb.exe, used to control Android devices.</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="browseAdbPath">
<property name="toolTip">
<string>The location of adb.exe, used to control Android devices.</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
+7
View File
@@ -36,6 +36,7 @@
#include "Windows/Dialogs/AboutDialog.h"
#include "Windows/Dialogs/CaptureDialog.h"
#include "Windows/Dialogs/LiveCapture.h"
#include "Windows/Dialogs/SettingsDialog.h"
#include "APIInspector.h"
#include "BufferViewer.h"
#include "ConstantBufferPreviewer.h"
@@ -1121,6 +1122,12 @@ void MainWindow::on_action_Resolve_Symbols_triggered()
thread->start();
}
void MainWindow::on_action_Settings_triggered()
{
SettingsDialog about(m_Ctx, this);
RDDialog::show(&about);
}
void MainWindow::saveLayout_triggered()
{
LoadSaveLayout(qobject_cast<QAction *>(QObject::sender()), true);
+1
View File
@@ -97,6 +97,7 @@ private slots:
void on_action_Statistics_Viewer_triggered();
void on_action_Inject_into_Process_triggered();
void on_action_Resolve_Symbols_triggered();
void on_action_Settings_triggered();
// manual slots
void saveLayout_triggered();
+13 -7
View File
@@ -50,10 +50,11 @@
<string>&amp;Tools</string>
</property>
<addaction name="action_Resolve_Symbols"/>
<addaction name="action_Log_Statistics"/>
<addaction name="separator"/>
<addaction name="action_Options"/>
<addaction name="action_Manage_Replay_Devices"/>
<addaction name="action_Settings"/>
<addaction name="action_Manage_Remote_Servers"/>
<addaction name="separator"/>
<addaction name="action_Start_Android_Remote_Server"/>
</widget>
<widget class="QMenu" name="menu_File">
<property name="title">
@@ -329,14 +330,14 @@
<string>&amp;Log Statistics</string>
</property>
</action>
<action name="action_Options">
<action name="action_Settings">
<property name="text">
<string>&amp;Options</string>
<string>&amp;Settings</string>
</property>
</action>
<action name="action_Manage_Replay_Devices">
<action name="action_Manage_Remote_Servers">
<property name="text">
<string>&amp;Manage Replay Devices</string>
<string>&amp;Manage Remote Servers</string>
</property>
</action>
<action name="actionView_Documentation">
@@ -389,6 +390,11 @@
<string>Statisti&amp;cs Viewer</string>
</property>
</action>
<action name="action_Start_Android_Remote_Server">
<property name="text">
<string>Start &amp;Android Remote Server</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
+6 -3
View File
@@ -133,7 +133,8 @@ SOURCES += Code/qrenderdoc.cpp \
Windows/BufferViewer.cpp \
Widgets/Extended/RDTableView.cpp \
Windows/DebugMessageView.cpp \
Windows/StatisticsViewer.cpp
Windows/StatisticsViewer.cpp \
Windows/Dialogs/SettingsDialog.cpp
HEADERS += Code/CaptureContext.h \
Code/qprocessinfo.h \
@@ -171,7 +172,8 @@ HEADERS += Code/CaptureContext.h \
Windows/BufferViewer.h \
Widgets/Extended/RDTableView.h \
Windows/DebugMessageView.h \
Windows/StatisticsViewer.h
Windows/StatisticsViewer.h \
Windows/Dialogs/SettingsDialog.h
FORMS += Windows/Dialogs/AboutDialog.ui \
Windows/MainWindow.ui \
@@ -193,7 +195,8 @@ FORMS += Windows/Dialogs/AboutDialog.ui \
Windows/BufferViewer.ui \
Windows/ShaderViewer.ui \
Windows/DebugMessageView.ui \
Windows/StatisticsViewer.ui
Windows/StatisticsViewer.ui \
Windows/Dialogs/SettingsDialog.ui
RESOURCES += resources.qrc
+5
View File
@@ -519,6 +519,7 @@
<ClCompile Include="generated\moc_ScintillaEdit.cpp" />
<ClCompile Include="generated\moc_ScintillaEditBase.cpp" />
<ClCompile Include="generated\moc_ScintillaQt.cpp" />
<ClCompile Include="generated\moc_SettingsDialog.cpp" />
<ClCompile Include="generated\moc_ShaderViewer.cpp" />
<ClCompile Include="generated\moc_StatisticsViewer.cpp" />
<ClCompile Include="generated\moc_TextureGoto.cpp" />
@@ -550,6 +551,7 @@
<ClCompile Include="Windows\Dialogs\AboutDialog.cpp" />
<ClCompile Include="Windows\Dialogs\CaptureDialog.cpp" />
<ClCompile Include="Windows\Dialogs\LiveCapture.cpp" />
<ClCompile Include="Windows\Dialogs\SettingsDialog.cpp" />
<ClCompile Include="Windows\Dialogs\TextureSaveDialog.cpp" />
<ClCompile Include="Windows\EventBrowser.cpp" />
<ClCompile Include="3rdparty\flowlayout\FlowLayout.cpp">
@@ -661,6 +663,7 @@
<ClInclude Include="generated\ui_MainWindow.h" />
<ClInclude Include="generated\ui_PipelineStateViewer.h" />
<ClInclude Include="generated\ui_ResourcePreview.h" />
<ClInclude Include="generated\ui_SettingsDialog.h" />
<ClInclude Include="generated\ui_ShaderViewer.h" />
<ClInclude Include="generated\ui_StatisticsViewer.h" />
<ClInclude Include="generated\ui_TextureSaveDialog.h" />
@@ -688,6 +691,7 @@
<ClInclude Include="Windows\Dialogs\AboutDialog.h" />
<ClInclude Include="Windows\Dialogs\CaptureDialog.h" />
<ClInclude Include="Windows\Dialogs\LiveCapture.h" />
<ClInclude Include="Windows\Dialogs\SettingsDialog.h" />
<ClInclude Include="Windows\Dialogs\TextureSaveDialog.h" />
<ClInclude Include="Windows\EventBrowser.h" />
<ClInclude Include="3rdparty\flowlayout\FlowLayout.h" />
@@ -717,6 +721,7 @@
<None Include="Windows\Dialogs\AboutDialog.ui" />
<None Include="Windows\Dialogs\CaptureDialog.ui" />
<None Include="Windows\Dialogs\LiveCapture.ui" />
<None Include="Windows\Dialogs\SettingsDialog.ui" />
<None Include="Windows\Dialogs\TextureSaveDialog.ui" />
<None Include="Windows\EventBrowser.ui" />
<None Include="Windows\MainWindow.ui" />
@@ -478,6 +478,12 @@
<ClCompile Include="Windows\StatisticsViewer.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="Windows\Dialogs\SettingsDialog.cpp">
<Filter>Windows\Dialogs</Filter>
</ClCompile>
<ClCompile Include="generated\moc_SettingsDialog.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="3rdparty\flowlayout\FlowLayout.h">
@@ -849,6 +855,12 @@
<ClInclude Include="Windows\StatisticsViewer.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="Windows\Dialogs\SettingsDialog.h">
<Filter>Windows\Dialogs</Filter>
</ClInclude>
<ClInclude Include="generated\ui_SettingsDialog.h">
<Filter>Generated Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="resources.qrc">
@@ -1087,6 +1099,9 @@
</None>
<None Include="Windows\DebugMessageView.ui" />
<None Include="Windows\StatisticsViewer.ui" />
<None Include="Windows\Dialogs\SettingsDialog.ui">
<Filter>Windows\Dialogs</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="generated\ui_AboutDialog.h">