ShaderDialog::ShaderDialog(QWidget* parent) : QDialog(parent) { m_dialog.setupUi(this); m_labels[0] = m_dialog.label0; m_labels[1] = m_dialog.label1; m_labels[2] = m_dialog.label2; m_labels[3] = m_dialog.label3; m_sliders[0] = m_dialog.slider0; m_sliders[1] = m_dialog.slider1; m_sliders[2] = m_dialog.slider2; m_sliders[3] = m_dialog.slider3; m_checkBoxes[0] = m_dialog.checkBox0; m_checkBoxes[1] = m_dialog.checkBox1; for (int i = 0; i < s_maxSliders; ++i) { connect(m_sliders[i], SIGNAL(valueChanged(int)), this, SLOT(installShaderParameters(int))); } for (int i = 0; i < s_maxCheckBoxes; ++i) { connect(m_checkBoxes[i], SIGNAL(stateChanged(int)), this, SLOT(installShaderParameters(int))); } ShaderLibrary& library(ShaderLibrary::instance()); QStringList shaderNames(library.availableShaders()); m_dialog.shaderCombo->addItems(shaderNames); hideOptionControls(); int index(m_dialog.shaderCombo->findText(Preferences::DefaultShader())); if (index >= 0) { m_dialog.shaderCombo->setCurrentIndex(index); on_shaderCombo_currentIndexChanged(index); } }
void ShaderDialog::copyParametersToDialog(QVariantMap const& map) { QString name; double val; bool ok; hideOptionControls(); int sliderCount(0); int checkBoxCount(0); int lightBoxCount(0); for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) { name = iter.key(); if (name.startsWith("user_light_")) { // lights are either on or off, no dimmers here name.replace("user_light_",""); name.replace("_"," "); m_dialog.lightBox->show(); if (lightBoxCount < s_maxLightBoxes) { m_lightBoxes[lightBoxCount]->show(); m_lightBoxes[lightBoxCount]->setText(name); m_lightBoxes[lightBoxCount]->setChecked(iter.value().toBool()); ++lightBoxCount; } } else if (name.startsWith("user_")) { name.replace("user_",""); name.replace("_"," "); switch (iter.value().type()) { case QVariant::Bool: if (checkBoxCount < s_maxCheckBoxes) { m_dialog.optionBox->show(); m_checkBoxes[checkBoxCount]->show(); m_checkBoxes[checkBoxCount]->setText(name); m_checkBoxes[checkBoxCount]->setChecked(iter.value().toBool()); ++checkBoxCount; } break; case QVariant::Double: case QMetaType::Float: val = iter.value().toDouble(&ok); if (ok && val <= 1.0 && sliderCount < s_maxSliders) { m_labels[sliderCount]->show(); m_labels[sliderCount]->setText(name); m_sliders[sliderCount]->show(); m_sliders[sliderCount]->setValue(100*val); ++sliderCount; } break; default: qDebug() << "Unsupported QVariant type in ShaderDialog" << iter.value().type(); break; } } } }
void ShaderDialog::on_shaderCombo_currentIndexChanged(int) { QString name(m_dialog.shaderCombo->currentText()); if (!m_shaderLibrary.bindShader(name)) { QString msg("Shader not found: "); msg += name; QMsgBox::warning(this, "IQmol", msg); return; } hideOptionControls(); copyParametersToDialog(m_shaderLibrary.uniformUserVariableList(name)); updated(); }
void ShaderDialog::setParameters(QVariantMap const& map) { QString name; double val; bool ok; hideOptionControls(); int sliderCount(0); int checkBoxCount(0); for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) { name = iter.key(); name.replace("_"," "); switch (iter.value().type()) { case QVariant::Bool: if (checkBoxCount < s_maxCheckBoxes) { m_checkBoxes[checkBoxCount]->show(); m_checkBoxes[checkBoxCount]->setText(name); m_checkBoxes[checkBoxCount]->setChecked(iter.value().toBool()); ++checkBoxCount; } break; case QVariant::Double: val = iter.value().toDouble(&ok); if (ok && val <= 1.0 && sliderCount < s_maxSliders) { m_labels[sliderCount]->show(); m_labels[sliderCount]->setText(name); m_sliders[sliderCount]->show(); m_sliders[sliderCount]->setValue(100*val); ++sliderCount; } break; default: qDebug() << "Unsupported QVariant type in ShaderDialog" << iter.value().type(); break; } } }