QWidget* TableItemEditorFactory::createEditor(QVariant::Type type, QWidget *parent) const { switch (type) { case QVariant::UInt: { SpinBox *sb = new SpinBox(parent, SpinBox::eSpinBoxTypeInt); sb->setFrame(false); sb->setMaximum(INT_MAX); return sb; } case QVariant::Int: { SpinBox *sb = new SpinBox(parent, SpinBox::eSpinBoxTypeInt); sb->setFrame(false); sb->setMinimum(INT_MIN); sb->setMaximum(INT_MAX); return sb; } case QVariant::Pixmap: return new Label(parent); case QVariant::Double: { SpinBox *sb = new SpinBox(parent, SpinBox::eSpinBoxTypeDouble); sb->setFrame(false); sb->setMinimum(-DBL_MAX); sb->setMaximum(DBL_MAX); return sb; } case QVariant::String: default: { // the default editor is a lineedit ExpandingLineEdit *le = new ExpandingLineEdit(parent); le->setFrame( le->style()->styleHint(QStyle::SH_ItemView_DrawDelegateFrame, 0, le) ); if ( !le->style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, 0, le) ) { le->setWidgetOwnsGeometry(true); } return le; } } return 0; }
void KnobGuiValue::createWidget(QHBoxLayout* layout) { connectKnobSignalSlots(); _imp->container = new QWidget(layout->parentWidget()); QHBoxLayout *containerLayout = new QHBoxLayout(_imp->container); layout->addWidget(_imp->container); containerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->setSpacing(3); if (getKnobsCountOnSameLine() > 1) { disableSlider(); } if (!isSliderDisabled()) { layout->parentWidget()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); } KnobPtr knob = _imp->getKnob(); const int nDims = knob->getDimension(); std::vector<double> increments, displayMins, displayMaxs, mins, maxs; std::vector<int> decimals; boost::shared_ptr<Knob<double> > doubleKnob = _imp->getKnobAsDouble(); boost::shared_ptr<Knob<int> > intKnob = _imp->getKnobAsInt(); if (doubleKnob) { displayMins = doubleKnob->getDisplayMinimums(); displayMaxs = doubleKnob->getDisplayMaximums(); mins = doubleKnob->getMinimums(); maxs = doubleKnob->getMaximums(); } else { const std::vector<int>& intDmins = intKnob->getDisplayMinimums(); const std::vector<int>& intDMaxs = intKnob->getDisplayMaximums(); const std::vector<int>& intMins = intKnob->getMinimums(); const std::vector<int>& intMaxs = intKnob->getMaximums(); assert(intDMaxs.size() == intDmins.size() && intDmins.size() == intMins.size() && intMins.size() == intMaxs.size()); displayMins.resize(intDmins.size()); displayMaxs.resize(intDmins.size()); mins.resize(intDmins.size()); maxs.resize(intDmins.size()); for (std::size_t i = 0; i < intMins.size(); ++i) { displayMins[i] = intDmins[i]; displayMaxs[i] = intDMaxs[i]; mins[i] = intMins[i]; maxs[i] = intMaxs[i]; } } getIncrements(&increments); getDecimals(&decimals); std::vector<std::string> dimensionLabels(nDims); bool isRectangleParam = isRectangleType(); // This is a rectangle parameter if (isRectangleParam) { dimensionLabels[0] = "x"; dimensionLabels[1] = "y"; dimensionLabels[2] = "w"; dimensionLabels[3] = "h"; } else { for (int i = 0; i < nDims; ++i) { dimensionLabels[i] = knob->getDimensionName(i); } } KnobGuiPtr thisShared = shared_from_this(); SpinBox::SpinBoxTypeEnum type; if (doubleKnob) { type = SpinBox::eSpinBoxTypeDouble; } else { type = SpinBox::eSpinBoxTypeInt; } int nItemsPerRow = nDims; if (std::floor(nDims / 3. + 0.5) == nDims / 3.) { nItemsPerRow = 3; } if (std::floor(nDims / 4. + 0.5) == nDims / 4.) { nItemsPerRow = 4; } int nbRows = nDims / nItemsPerRow; assert(nbRows >= 1); QWidget* allSpinBoxesContainer = 0; QGridLayout* spinBoxesGrid = 0; if (nbRows == 1) { allSpinBoxesContainer = _imp->container; } else { allSpinBoxesContainer = new QWidget(_imp->container); spinBoxesGrid = new QGridLayout(allSpinBoxesContainer); spinBoxesGrid->setContentsMargins(0, 0, 0, 0); spinBoxesGrid->setVerticalSpacing(TO_DPIY(1)); spinBoxesGrid->setHorizontalSpacing(TO_DPIX(1)); } _imp->spinBoxes.resize(nDims); int rowIndex = 0; int columnIndex = 0; for (std::size_t i = 0; i < _imp->spinBoxes.size(); ++i) { QWidget *boxContainer = new QWidget(allSpinBoxesContainer); boxContainer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QHBoxLayout *boxContainerLayout = 0; boxContainerLayout = new QHBoxLayout(boxContainer); boxContainerLayout->setContentsMargins(0, 0, 0, 0); boxContainerLayout->setSpacing(3); Label *subDesc = 0; if (nDims != 1 && nbRows == 1) { subDesc = new Label(QString::fromUtf8(dimensionLabels[i].c_str()), boxContainer); boxContainerLayout->addWidget(subDesc); } SpinBox *box = new KnobSpinBox(layout->parentWidget(), type, thisShared , i); NumericKnobValidator* validator = new NumericKnobValidator(box,thisShared); box->setValidator(validator); QObject::connect( box, SIGNAL(valueChanged(double)), this, SLOT(onSpinBoxValueChanged()) ); // Set the copy/link actions in the right click menu of the SpinBox enableRightClickMenu(box,i); #ifdef SPINBOX_TAKE_PLUGIN_RANGE_INTO_ACCOUNT double min = mins[i]; double max = maxs[i]; valueAccordingToType(false, i, &min); valueAccordingToType(false, i, &max); box->setMaximum(max); box->setMinimum(min); #endif if (type == SpinBox::eSpinBoxTypeDouble) { // Set the number of digits after the decimal point if (i < decimals.size()) { box->decimals(decimals[i]); } } if (i < increments.size()) { double incr = 1; incr = increments[i]; valueAccordingToType(false, i, &incr); box->setIncrement(incr); } boxContainerLayout->addWidget(box); if (!spinBoxesGrid) { containerLayout->addWidget(boxContainer); } else { spinBoxesGrid->addWidget(boxContainer, rowIndex, columnIndex); } _imp->spinBoxes[i] = std::make_pair(box, subDesc); ++columnIndex; if (columnIndex >= nItemsPerRow) { columnIndex = 0; ++rowIndex; } } if (spinBoxesGrid) { containerLayout->addWidget(allSpinBoxesContainer); } bool sliderVisible = false; if (!isSliderDisabled() && !isRectangleParam) { double dispmin = displayMins[0]; double dispmax = displayMaxs[0]; if (dispmin == -DBL_MAX) { dispmin = mins[0]; } if (dispmax == DBL_MAX) { dispmax = maxs[0]; } // denormalize if necessary double dispminGui = dispmin; double dispmaxGui = dispmax; valueAccordingToType(false, 0, &dispminGui); valueAccordingToType(false, 0, &dispmaxGui); bool spatial = isSpatialType(); Format f; if (spatial) { getKnob()->getHolder()->getApp()->getProject()->getProjectDefaultFormat(&f); } if (dispminGui < -SLIDER_MAX_RANGE) { if (spatial) { dispminGui = -f.width(); } else { dispminGui = -SLIDER_MAX_RANGE; } } if (dispmaxGui > SLIDER_MAX_RANGE) { if (spatial) { dispmaxGui = f.width(); } else { dispmaxGui = SLIDER_MAX_RANGE; } } double value0 = _imp->getKnobValue(0); ScaleSliderQWidget::DataTypeEnum sliderType; if (doubleKnob) { sliderType = ScaleSliderQWidget::eDataTypeDouble; } else { sliderType = ScaleSliderQWidget::eDataTypeInt; } _imp->slider = new ScaleSliderQWidget(dispminGui, dispmaxGui, value0,knob->getEvaluateOnChange(), sliderType,getGui(), eScaleTypeLinear, layout->parentWidget()); _imp->slider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); if (hasToolTip()) { _imp->slider->setToolTip( toolTip() ); } QObject::connect(_imp->slider, SIGNAL(positionChanged(double)), this, SLOT(onSliderValueChanged(double))); QObject::connect(_imp->slider, SIGNAL(editingFinished(bool)), this, SLOT(onSliderEditingFinished(bool))); containerLayout->addWidget(_imp->slider); sliderVisible = shouldSliderBeVisible(dispminGui, dispmaxGui); // onDisplayMinMaxChanged takes original (maybe normalized) values onDisplayMinMaxChanged(dispmin, dispmax); }
void MultiInstancePanelPrivate::addTableRow(Node* node) { int newRowIndex = table->rowCount(); table->insertRow(newRowIndex); std::list<boost::shared_ptr<KnobI> > instanceSpecificKnobs; getInstanceSpecificKnobs(node, &instanceSpecificKnobs); ///first add the enabled column { QWidget* enabledContainer = createCheckBoxForTable(true); table->setCellWidget(newRowIndex, 0, enabledContainer); } int columnIndex = 1; for (std::list<boost::shared_ptr<KnobI> >::iterator it = instanceSpecificKnobs.begin();it!=instanceSpecificKnobs.end();++it) { Int_Knob* isInt = dynamic_cast<Int_Knob*>(it->get()); Bool_Knob* isBool = dynamic_cast<Bool_Knob*>(it->get()); Double_Knob* isDouble = dynamic_cast<Double_Knob*>(it->get()); Color_Knob* isColor = dynamic_cast<Color_Knob*>(it->get()); String_Knob* isString = dynamic_cast<String_Knob*>(it->get()); if (!isInt || !isBool || !isDouble || !isColor || !isString) { continue; } bool createCheckBox = false; bool createSpinBox = false; if (isBool) { createCheckBox = true; } else if (isInt || isDouble || isColor) { createSpinBox = true; } for (int i = 0; i < (*it)->getDimension(); ++it) { if (createCheckBox) { assert(isBool); bool checked = isBool->getValue(); QWidget* enabledContainer = createCheckBoxForTable(checked); table->setCellWidget(newRowIndex, columnIndex, enabledContainer); } else if (createSpinBox) { double mini = INT_MIN,maxi = INT_MAX; SpinBox::SPINBOX_TYPE type = SpinBox::DOUBLE_SPINBOX; if (isInt) { mini = isInt->getMinimums()[i]; maxi = isInt->getMaximums()[i]; type = SpinBox::INT_SPINBOX; } else if (isDouble) { mini = isDouble->getMinimums()[i]; maxi = isDouble->getMaximums()[i]; } SpinBox* sb = new SpinBox(NULL,type); sb->setMinimum(mini); sb->setMaximum(maxi); table->setCellWidget(newRowIndex, columnIndex, sb); } else { assert(isString); std::string value = isString->getValue(); LineEdit* le = new LineEdit(NULL); le->setText(value.c_str()); table->setCellWidget(newRowIndex, columnIndex, le); } ++columnIndex; } } }