#include #include #include #include #include #include ShaderNode::ShaderNode(ShaderGraph& graph) : m_previewSize(64, 64), m_pixmapLabel(nullptr), m_graph(graph), m_enableCustomVariableName(true), m_isPreviewEnabled(false) { m_pixmapLabel = new QLabel; m_pixmapLabel->setStyleSheet("background-color: rgba(0,0,0,0)"); } void ShaderNode::BuildNodeEdition(QFormLayout* layout) { QCheckBox* checkbox = new QCheckBox; checkbox->setCheckState((m_isPreviewEnabled) ? Qt::Checked : Qt::Unchecked); connect(checkbox, &QCheckBox::stateChanged, [&](int state) { EnablePreview(state == Qt::Checked); }); layout->addRow(tr("Enable preview"), checkbox); QComboBox* previewSize = new QComboBox; int index = 0; for (int size : { 32, 64, 128, 256, 512 }) { QString sizeStr = QString::number(size); previewSize->addItem(sizeStr + "x" + sizeStr, size); if (m_previewSize.x == size) previewSize->setCurrentIndex(index); index++; } connect(previewSize, qOverload(&QComboBox::currentIndexChanged), [=](int index) { if (index < 0) return; int size = previewSize->itemData(index).toInt(); SetPreviewSize({ size, size }); }); layout->addRow(tr("Preview size"), previewSize); if (m_enableCustomVariableName) { QLineEdit* lineEdit = new QLineEdit(QString::fromStdString(m_variableName)); connect(lineEdit, &QLineEdit::textChanged, [&](const QString& text) { SetVariableName(text.toStdString()); }); layout->addRow(tr("Variable name"), lineEdit); } } void ShaderNode::EnablePreview(bool enable) { if (m_isPreviewEnabled != enable) { m_isPreviewEnabled = enable; if (m_isPreviewEnabled) { m_pixmap.emplace(m_previewSize.x, m_previewSize.y); UpdatePreview(); } else { m_pixmapLabel->clear(); m_pixmap.reset(); } } } QWidget* ShaderNode::embeddedWidget() { return m_pixmapLabel; } void ShaderNode::setInData(std::shared_ptr, int) { } void ShaderNode::restore(const QJsonObject& data) { NodeDataModel::restore(data); bool isPreviewEnabled = data["preview_enabled"].toBool(m_isPreviewEnabled); m_previewSize.x = data["preview_width"].toInt(m_previewSize.x); m_previewSize.y = data["preview_height"].toInt(m_previewSize.y); m_variableName = data["variable_name"].toString().toStdString(); EnablePreview(isPreviewEnabled); } QJsonObject ShaderNode::save() const { QJsonObject data = NodeDataModel::save(); data["preview_enabled"] = m_isPreviewEnabled; data["preview_width"] = m_previewSize.x; data["preview_height"] = m_previewSize.y; data["variable_name"] = QString::fromStdString(m_variableName); return data; } bool ShaderNode::ComputePreview(QPixmap& /*pixmap*/) { return false; } void ShaderNode::UpdatePreview() { if (!m_pixmap) { embeddedWidgetSizeUpdated(); return; } QPixmap& pixmap = *m_pixmap; if (!ComputePreview(pixmap)) { pixmap = QPixmap(m_previewSize.x, m_previewSize.y); pixmap.fill(QColor::fromRgb(255, 255, 255, 0)); } else pixmap = pixmap.scaled(m_previewSize.x, m_previewSize.y); m_pixmapLabel->setPixmap(pixmap); embeddedWidgetSizeUpdated(); }