void ViewerNodePrivate::refreshInputChoices(bool resetChoiceIfNotFound) { // Refresh the A and B input choices KnobChoicePtr aInputKnob = aInputNodeChoiceKnob.lock(); KnobChoicePtr bInputKnob = bInputNodeChoiceKnob.lock(); ViewerCompositingOperatorEnum operation = (ViewerCompositingOperatorEnum)blendingModeChoiceKnob.lock()->getValue(); bInputKnob->setEnabled(operation != eViewerCompositingOperatorNone); std::vector<ChoiceOption> entries; entries.push_back(ChoiceOption("-", "", "")); int nInputs = _publicInterface->getMaxInputCount(); for (int i = 0; i < nInputs; ++i) { NodePtr inputNode = _publicInterface->getNode()->getRealInput(i); if (!inputNode) { continue; } std::string optionID; { std::stringstream ss; ss << i; optionID = ss.str(); } entries.push_back(ChoiceOption(optionID, inputNode->getLabel(), "")); } ChoiceOption currentAChoice = aInputKnob->getActiveEntry(); ChoiceOption currentBChoice = bInputKnob->getActiveEntry(); aInputKnob->populateChoices(entries); bInputKnob->populateChoices(entries); if (resetChoiceIfNotFound) { if (currentAChoice.id == "-" || !aInputKnob->isActiveEntryPresentInEntries(ViewIdx(0))) { aInputKnob->setValue(entries.size() > 1 ? 1 : 0); } if (currentBChoice.id == "-" || !bInputKnob->isActiveEntryPresentInEntries(ViewIdx(0))) { bInputKnob->setValue(entries.size() > 1 ? 1 : 0); } } if (uiContext) { if ( (operation == eViewerCompositingOperatorNone) || !bInputKnob->isEnabled() || bInputKnob->getActiveEntry().id.empty() ) { uiContext->setInfoBarVisible(1, false); } else if (operation != eViewerCompositingOperatorNone) { uiContext->setInfoBarVisible(1, true); } } } // refreshInputChoices
void KnobGuiChoice::updateGUI(int /*dimension*/) { ///we don't use setCurrentIndex because the signal emitted by combobox will call onCurrentIndexChanged and ///change the internal value of the knob again... ///The slot connected to onCurrentIndexChanged is reserved to catch user interaction with the combobox. ///This function is called in response to an internal change. KnobChoicePtr knob = _knob.lock(); std::string activeEntry = knob->getActiveEntryText_mt_safe(); if ( !activeEntry.empty() ) { bool activeIndexPresent = knob->isActiveEntryPresentInEntries(); if (!activeIndexPresent) { QString error = tr("The value set to this parameter no longer exist in the menu. Right click and press Refresh Menu to update the menu and then pick a new value."); setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, GuiUtils::convertFromPlainText(error, Qt::WhiteSpaceNormal) ); } else { setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, QString() ); } } if ( _comboBox->isCascading() || activeEntry.empty() ) { _comboBox->setCurrentIndex_no_emit( knob->getValue() ); } else { _comboBox->setCurrentText( QString::fromUtf8( activeEntry.c_str() ) ); } }
void KnobGuiChoice::onEntriesPopulated() { KnobChoicePtr knob = _knob.lock(); _comboBox->clear(); std::vector<std::string> entries = knob->getEntries_mt_safe(); const std::vector<std::string> help = knob->getEntriesHelp_mt_safe(); std::string activeEntry = knob->getActiveEntryText_mt_safe(); for (U32 i = 0; i < entries.size(); ++i) { std::string helpStr; if ( !help.empty() && !help[i].empty() ) { helpStr = help[i]; } _comboBox->addItem( QString::fromUtf8( entries[i].c_str() ), QIcon(), QKeySequence(), QString::fromUtf8( helpStr.c_str() ) ); } // the "New" menu is only added to known parameters (e.g. the choice of output channels) if ( knob->getHostCanAddOptions() && ( ( knob->getName() == kNatronOfxParamOutputChannels) || ( knob->getName() == kOutputChannelsKnobName) ) ) { _comboBox->addItemNew(); } ///we don't use setCurrentIndex because the signal emitted by combobox will call onCurrentIndexChanged and ///we don't want that to happen because the index actually didn't change. if ( _comboBox->isCascading() || activeEntry.empty() ) { _comboBox->setCurrentIndex_no_emit( knob->getValue() ); } else { _comboBox->setCurrentText_no_emit( QString::fromUtf8( activeEntry.c_str() ) ); } if ( !activeEntry.empty() ) { bool activeIndexPresent = knob->isActiveEntryPresentInEntries(); if (!activeIndexPresent) { QString error = tr("The value set to this parameter no longer exist in the menu. Right click and press Refresh Menu to update the menu and then pick a new value."); setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, GuiUtils::convertFromPlainText(error, Qt::WhiteSpaceNormal) ); } else { setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, QString() ); } } }
void KnobGuiChoice::updateGUI() { ///we don't use setCurrentIndex because the signal emitted by combobox will call onCurrentIndexChanged and ///change the internal value of the knob again... ///The slot connected to onCurrentIndexChanged is reserved to catch user interaction with the combobox. ///This function is called in response to an internal change. KnobChoicePtr knob = _knob.lock(); if (!knob) { return; } ChoiceOption activeEntry = knob->getCurrentEntry(); QString activeEntryLabel; if (!activeEntry.label.empty()) { activeEntryLabel = QString::fromUtf8(activeEntry.label.c_str()); } else { activeEntryLabel = QString::fromUtf8(activeEntry.id.c_str()); } if ( !activeEntry.id.empty() ) { bool activeIndexPresent = knob->isActiveEntryPresentInEntries(getView()); if (!activeIndexPresent) { QString error = tr("The value %1 no longer exists in the menu").arg(activeEntryLabel); getKnobGui()->setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, NATRON_NAMESPACE::convertFromPlainText(error, NATRON_NAMESPACE::WhiteSpaceNormal) ); } else { getKnobGui()->setWarningValue( KnobGui::eKnobWarningChoiceMenuOutOfDate, QString() ); } } if ( _comboBox->isCascading() || activeEntry.id.empty() ) { _comboBox->setCurrentIndex( knob->getValue(), false ); } else { ensureUnknownChocieIsNotInternalPlaneID(activeEntryLabel); _comboBox->setCurrentIndexFromLabel( activeEntryLabel, false /*emitSignal*/ ); } }