OpenGL Shader configuration UI
This commit is contained in:
@@ -197,6 +197,7 @@ add_library(ui STATIC
|
||||
qt_openglshadermanagerdialog.hpp
|
||||
qt_openglshadermanagerdialog.cpp
|
||||
qt_openglshadermanagerdialog.ui
|
||||
qt_openglshaderconfig.hpp qt_openglshaderconfig.cpp qt_openglshaderconfig.ui
|
||||
)
|
||||
|
||||
if(RTMIDI)
|
||||
|
||||
@@ -255,6 +255,8 @@ glslp_t *glslp_parse(const char *f) {
|
||||
safe_strncpy(s, t + j, sublen);
|
||||
s[511 < sublen ? 511 : sublen] = 0;
|
||||
|
||||
if (s[strlen(s) - 1] == ';') s[strlen(s) - 1] = 0;
|
||||
|
||||
struct texture *tex = &glslp->textures[glslp->num_textures++];
|
||||
|
||||
strcpy(tex->name, s);
|
||||
|
||||
@@ -1982,6 +1982,12 @@ MainWindow::changeEvent(QEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::reloadAllRenderers()
|
||||
{
|
||||
reload_renderers = true;
|
||||
}
|
||||
|
||||
void
|
||||
MainWindow::on_actionRenderer_options_triggered()
|
||||
{
|
||||
@@ -2000,6 +2006,16 @@ MainWindow::on_actionRenderer_options_triggered()
|
||||
if (renderers[i] && renderers[i]->hasOptions())
|
||||
renderers[i]->reloadOptions();
|
||||
}
|
||||
} else if (reload_renderers && ui->stackedWidget->reloadRendererOption()) {
|
||||
reload_renderers = false;
|
||||
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
|
||||
if (show_second_monitors) {
|
||||
for (int i = 1; i < MONITORS_NUM; i++) {
|
||||
if (renderers[i] && renderers[i]->reloadRendererOption() && renderers[i]->hasOptions()) {
|
||||
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
QSize getRenderWidgetSize();
|
||||
void setSendKeyboardInput(bool enabled);
|
||||
void checkFullscreenHotkey();
|
||||
void reloadAllRenderers();
|
||||
|
||||
std::array<std::unique_ptr<RendererStack>, 8> renderers;
|
||||
signals:
|
||||
@@ -173,6 +174,9 @@ private:
|
||||
bool fs_on_signal = false;
|
||||
bool fs_off_signal = false;
|
||||
|
||||
/* Reload the renderers after closing renderer options dialog. */
|
||||
bool reload_renderers = false;
|
||||
|
||||
friend class SpecifyDimensions;
|
||||
friend class ProgSettings;
|
||||
friend class RendererCommon;
|
||||
|
||||
85
src/qt/qt_openglshaderconfig.cpp
Normal file
85
src/qt/qt_openglshaderconfig.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#include "qt_openglshaderconfig.hpp"
|
||||
#include "ui_qt_openglshaderconfig.h"
|
||||
|
||||
#include "qt_mainwindow.hpp"
|
||||
|
||||
extern MainWindow* main_window;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <86box/86box.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/config.h>
|
||||
}
|
||||
|
||||
OpenGLShaderConfig::OpenGLShaderConfig(QWidget *parent, glslp_t* shader)
|
||||
: QDialog(parent)
|
||||
, ui(new Ui::OpenGLShaderConfig)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
currentShader = shader;
|
||||
|
||||
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
|
||||
glslp_read_shader_config(currentShader);
|
||||
|
||||
for (int i = 0; i < currentShader->num_parameters; i++) {
|
||||
auto spinBox = new QDoubleSpinBox;
|
||||
spinBox->setObjectName(currentShader->parameters[i].id);
|
||||
spinBox->setRange(currentShader->parameters[i].min, currentShader->parameters[i].max);
|
||||
spinBox->setValue(currentShader->parameters[i].value);
|
||||
spinBox->setSingleStep(currentShader->parameters[i].step);
|
||||
QFormLayout* layout = (QFormLayout*)ui->scrollAreaWidgetContents->layout();
|
||||
layout->addRow(currentShader->parameters[i].description, spinBox);
|
||||
}
|
||||
}
|
||||
|
||||
OpenGLShaderConfig::~OpenGLShaderConfig()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void OpenGLShaderConfig::on_buttonBox_clicked(QAbstractButton *button)
|
||||
{
|
||||
if (ui->buttonBox->buttonRole(button) == QDialogButtonBox::ResetRole) {
|
||||
for (int i = 0; i < currentShader->num_parameters; i++) {
|
||||
QDoubleSpinBox* box = this->findChild<QDoubleSpinBox*>(QString(currentShader->parameters[i].id));
|
||||
if (box) {
|
||||
box->setValue(currentShader->parameters[i].default_value);
|
||||
}
|
||||
}
|
||||
} else if (ui->buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole) {
|
||||
startblit();
|
||||
for (int i = 0; i < currentShader->num_parameters; i++) {
|
||||
QDoubleSpinBox* box = this->findChild<QDoubleSpinBox*>(QString(currentShader->parameters[i].id));
|
||||
if (box) {
|
||||
float val = (float)box->value();
|
||||
currentShader->parameters[i].value = val;
|
||||
}
|
||||
}
|
||||
glslp_write_shader_config(currentShader);
|
||||
config_save();
|
||||
endblit();
|
||||
main_window->reloadAllRenderers();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OpenGLShaderConfig::on_OpenGLShaderConfig_accepted()
|
||||
{
|
||||
startblit();
|
||||
for (int i = 0; i < currentShader->num_parameters; i++) {
|
||||
QDoubleSpinBox* box = (QDoubleSpinBox*)this->findChild<QDoubleSpinBox*>(QString(currentShader->parameters[i].id));
|
||||
if (box) {
|
||||
float val = (float)box->value();
|
||||
currentShader->parameters[i].value = val;
|
||||
}
|
||||
}
|
||||
glslp_write_shader_config(currentShader);
|
||||
config_save();
|
||||
endblit();
|
||||
main_window->reloadAllRenderers();
|
||||
}
|
||||
|
||||
40
src/qt/qt_openglshaderconfig.hpp
Normal file
40
src/qt/qt_openglshaderconfig.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#ifndef QT_OPENGLSHADERCONFIG_HPP
|
||||
#define QT_OPENGLSHADERCONFIG_HPP
|
||||
|
||||
#include <QDialog>
|
||||
#include <QLabel>
|
||||
#include <QDoubleSpinBox>
|
||||
#include <QAbstractButton>
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <86box/qt-glslp-parser.h>
|
||||
}
|
||||
|
||||
namespace Ui {
|
||||
class OpenGLShaderConfig;
|
||||
}
|
||||
|
||||
class OpenGLShaderConfig : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit OpenGLShaderConfig(QWidget *parent = nullptr, glslp_t* shader = nullptr);
|
||||
~OpenGLShaderConfig();
|
||||
|
||||
private slots:
|
||||
void on_buttonBox_clicked(QAbstractButton *button);
|
||||
|
||||
void on_OpenGLShaderConfig_accepted();
|
||||
|
||||
private:
|
||||
Ui::OpenGLShaderConfig *ui;
|
||||
glslp_t* currentShader;
|
||||
|
||||
std::map<std::string, double> defaultValues;
|
||||
};
|
||||
|
||||
#endif // QT_OPENGLSHADERCONFIG_HPP
|
||||
92
src/qt/qt_openglshaderconfig.ui
Normal file
92
src/qt/qt_openglshaderconfig.ui
Normal file
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>OpenGLShaderConfig</class>
|
||||
<widget class="QDialog" name="OpenGLShaderConfig">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Shader Configuration</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetMinAndMaxSize</enum>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>380</width>
|
||||
<height>250</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetMaximumSize</enum>
|
||||
</property>
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::Reset</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>OpenGLShaderConfig</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>OpenGLShaderConfig</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
@@ -1,6 +1,8 @@
|
||||
#include "qt_openglshadermanagerdialog.hpp"
|
||||
#include "ui_qt_openglshadermanagerdialog.h"
|
||||
|
||||
#include "qt_openglshaderconfig.hpp"
|
||||
|
||||
#include <QListWidgetItem>
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
@@ -39,10 +41,21 @@ OpenGLShaderManagerDialog::OpenGLShaderManagerDialog(QWidget *parent)
|
||||
}
|
||||
if (ui->shaderListWidget->count()) {
|
||||
ui->shaderListWidget->setCurrentRow(ui->shaderListWidget->count() - 1);
|
||||
auto current = ui->shaderListWidget->currentItem();
|
||||
if (current) {
|
||||
glslp_t* shader = (glslp_t*)current->data(Qt::UserRole + 2).toULongLong();
|
||||
if (shader->num_parameters > 0)
|
||||
ui->buttonConfigure->setEnabled(true);
|
||||
else
|
||||
ui->buttonConfigure->setEnabled(false);
|
||||
} else {
|
||||
ui->buttonConfigure->setEnabled(false);
|
||||
}
|
||||
} else {
|
||||
ui->buttonRemove->setDisabled(true);
|
||||
ui->buttonMoveUp->setDisabled(true);
|
||||
ui->buttonMoveDown->setDisabled(true);
|
||||
ui->buttonConfigure->setDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,9 +97,16 @@ void OpenGLShaderManagerDialog::on_shaderListWidget_currentItemChanged(QListWidg
|
||||
ui->buttonRemove->setDisabled(true);
|
||||
ui->buttonMoveUp->setDisabled(true);
|
||||
ui->buttonMoveDown->setDisabled(true);
|
||||
ui->buttonConfigure->setDisabled(true);
|
||||
return;
|
||||
} else {
|
||||
ui->buttonRemove->setDisabled(false);
|
||||
ui->buttonConfigure->setDisabled(true);
|
||||
if (current) {
|
||||
glslp_t* shader = (glslp_t*)current->data(Qt::UserRole + 2).toULongLong();
|
||||
if (shader->num_parameters > 0)
|
||||
ui->buttonConfigure->setEnabled(true);
|
||||
}
|
||||
}
|
||||
ui->buttonMoveUp->setDisabled(ui->shaderListWidget->currentRow() == 0);
|
||||
ui->buttonMoveDown->setDisabled(ui->shaderListWidget->currentRow() == (ui->shaderListWidget->count() - 1));
|
||||
@@ -95,6 +115,22 @@ void OpenGLShaderManagerDialog::on_shaderListWidget_currentItemChanged(QListWidg
|
||||
|
||||
void OpenGLShaderManagerDialog::on_shaderListWidget_currentRowChanged(int currentRow)
|
||||
{
|
||||
auto current = ui->shaderListWidget->currentItem();
|
||||
if (current == nullptr) {
|
||||
ui->buttonRemove->setDisabled(true);
|
||||
ui->buttonMoveUp->setDisabled(true);
|
||||
ui->buttonMoveDown->setDisabled(true);
|
||||
ui->buttonConfigure->setDisabled(true);
|
||||
return;
|
||||
} else {
|
||||
ui->buttonRemove->setDisabled(false);
|
||||
ui->buttonConfigure->setDisabled(true);
|
||||
if (current) {
|
||||
glslp_t* shader = (glslp_t*)current->data(Qt::UserRole + 2).toULongLong();
|
||||
if (shader->num_parameters > 0)
|
||||
ui->buttonConfigure->setEnabled(true);
|
||||
}
|
||||
}
|
||||
ui->buttonMoveUp->setDisabled(ui->shaderListWidget->currentRow() == 0);
|
||||
ui->buttonMoveDown->setDisabled(ui->shaderListWidget->currentRow() == (ui->shaderListWidget->count() - 1));
|
||||
}
|
||||
@@ -143,6 +179,8 @@ void OpenGLShaderManagerDialog::on_buttonRemove_clicked()
|
||||
glslp_free((glslp_t*)item->data(Qt::UserRole + 2).toULongLong());
|
||||
}
|
||||
delete item;
|
||||
|
||||
on_shaderListWidget_currentRowChanged(ui->shaderListWidget->currentRow());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,3 +195,15 @@ void OpenGLShaderManagerDialog::on_OpenGLShaderManagerDialog_accepted()
|
||||
endblit();
|
||||
}
|
||||
|
||||
|
||||
void OpenGLShaderManagerDialog::on_buttonConfigure_clicked()
|
||||
{
|
||||
auto item = ui->shaderListWidget->currentItem();
|
||||
if (item) {
|
||||
glslp_t* shader = (glslp_t*)item->data(Qt::UserRole + 2).toULongLong();
|
||||
|
||||
auto configDialog = new OpenGLShaderConfig(this, shader);
|
||||
configDialog->exec();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ private slots:
|
||||
|
||||
void on_OpenGLShaderManagerDialog_accepted();
|
||||
|
||||
void on_buttonConfigure_clicked();
|
||||
|
||||
private:
|
||||
Ui::OpenGLShaderManagerDialog *ui;
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
<string>Shader Manager</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="sizeConstraint">
|
||||
@@ -59,7 +59,7 @@
|
||||
<item>
|
||||
<widget class="QPushButton" name="buttonConfigure">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Configure</string>
|
||||
|
||||
Reference in New Issue
Block a user