/*############################################################################## ## Author: Shaun Reed ## ## Legal: All Content (c) 2023 Shaun Reed, all rights reserved ## ## About: Toolbox plugin for object details and options ## ## ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ################################################################################ */ #include "toolbox.h" #include "qtkwidget.h" #include "ui_toolbox.h" #include #include using namespace Qtk; ToolBox::ToolBox(QWidget * parent) : QDockWidget(parent), objectDetails_(this), ui(new Ui::ToolBox) { ui->setupUi(this); setMinimumWidth(350); } void ToolBox::updateFocus(const QString & name) { auto object = Qtk::QtkWidget::mWidgetManager.get_widget()->getScene()->getObject(name); if (object != Q_NULLPTR) { removePages(); createPageProperties(object); createPageShader(object); } } ToolBox::~ToolBox() { delete ui; } void ToolBox::removePages() { // Remove all existing pages. for (size_t i = 0; i < ui->toolBox->count(); i++) { delete ui->toolBox->widget(i); ui->toolBox->removeItem(i); } } void ToolBox::createTransformPanel(const Object * object) { auto rowLayout = transformPanel_.layout = new QHBoxLayout; transformPanel_.spinBox.label = new QLabel(tr("Translation:")); rowLayout->addWidget(transformPanel_.spinBox.label); int minWidth = 75; for (size_t i = 0; i < 3; i++) { QDoubleSpinBox * spinBox; if (i == 0) { spinBox = transformPanel_.spinBox.x = new QDoubleSpinBox; connect(spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setTranslationX); } else if (i == 1) { spinBox = transformPanel_.spinBox.y = new QDoubleSpinBox; connect(spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setTranslationY); } else if (i == 2) { spinBox = transformPanel_.spinBox.z = new QDoubleSpinBox; connect(spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setTranslationZ); } spinBox->setMinimum(std::numeric_limits::lowest()); spinBox->setSingleStep(0.1); spinBox->setValue(object->getTransform().getTranslation()[i]); spinBox->setFixedWidth(minWidth); rowLayout->addWidget(spinBox); } // Add the layout for this panel to the layout for the primary widget. formLayout_->addRow(transformPanel_.layout); } void ToolBox::createPageProperties(const Object * object) { auto transform = object->getTransform(); auto * widget = new QWidget; formLayout_ = new QFormLayout; widget->setLayout(formLayout_); ui->toolBox->addItem(widget, "Properties"); ui->toolBox->setCurrentWidget(widget); objectDetails_.setDetails(object); // TODO: Do this in ToolBox ctor after initializing the form. formLayout_->addRow(objectDetails_.name.label, objectDetails_.name.value); formLayout_->addRow(objectDetails_.objectType.label, objectDetails_.objectType.value); createTransformPanel(object); int minWidth = 75; auto rowLayout = new QHBoxLayout; rowLayout->addWidget(new QLabel(tr("Scale:"))); for (size_t i = 0; i < 3; i++) { auto spinBox = new QDoubleSpinBox; spinBox->setMinimum(std::numeric_limits::lowest()); spinBox->setSingleStep(0.1); spinBox->setValue(transform.getScale()[i]); spinBox->setFixedWidth(minWidth); rowLayout->addWidget(spinBox); if (i == 0) { connect( spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setScaleX); } else if (i == 1) { connect( spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setScaleY); } else if (i == 2) { connect( spinBox, &QDoubleSpinBox::valueChanged, object, &Object::setScaleZ); } } formLayout_->addRow(rowLayout); } void ToolBox::createPageShader(const Object * object) { // Shaders page. auto widget = new QWidget; ui->toolBox->addItem(widget, "Shaders"); auto mainLayout = new QFormLayout; auto rowLayout = new QHBoxLayout; rowLayout->addWidget(new QLabel("Vertex Shader:")); rowLayout->addWidget(new QLabel(object->getVertexShader().c_str())); mainLayout->addRow(rowLayout); auto shaderView = new QTextEdit; shaderView->setReadOnly(true); shaderView->setText(object->getVertexShaderSourceCode().c_str()); mainLayout->addRow(shaderView); rowLayout = new QHBoxLayout; rowLayout->addWidget(new QLabel("Fragment Shader:")); rowLayout->addWidget(new QLabel(object->getFragmentShader().c_str())); mainLayout->addRow(rowLayout); shaderView = new QTextEdit; shaderView->setReadOnly(true); shaderView->setText(object->getFragmentShaderSourceCode().c_str()); mainLayout->addRow(shaderView); widget->setLayout(mainLayout); }