LinkToKnobDialog::LinkToKnobDialog(const KnobGuiPtr& from, QWidget* parent) : QDialog(parent) , _imp( new LinkToKnobDialogPrivate(from) ) { _imp->mainLayout = new QVBoxLayout(this); _imp->firstLine = new QWidget(this); _imp->firstLineLayout = new QHBoxLayout(_imp->firstLine); _imp->mainLayout->addWidget(_imp->firstLine); _imp->buttons = new QDialogButtonBox(QDialogButtonBox::StandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, this); QObject::connect( _imp->buttons, SIGNAL(accepted()), this, SLOT(accept()) ); QObject::connect( _imp->buttons, SIGNAL(rejected()), this, SLOT(reject()) ); _imp->mainLayout->addWidget(_imp->buttons); _imp->selectNodeLabel = new Label(tr("Parent:"), _imp->firstLine); _imp->firstLineLayout->addWidget(_imp->selectNodeLabel); EffectInstance* isEffect = dynamic_cast<EffectInstance*>( from->getKnob()->getHolder() ); assert(isEffect); if (!isEffect) { throw std::logic_error(""); } boost::shared_ptr<NodeCollection> group = isEffect->getNode()->getGroup(); group->getActiveNodes(&_imp->allNodes); NodeGroup* isGroup = dynamic_cast<NodeGroup*>( group.get() ); if (isGroup) { _imp->allNodes.push_back( isGroup->getNode() ); } QStringList nodeNames; for (NodesList::iterator it = _imp->allNodes.begin(); it != _imp->allNodes.end(); ++it) { QString name = QString::fromUtf8( (*it)->getLabel().c_str() ); nodeNames.push_back(name); //_imp->nodeSelectionCombo->addItem(name); } nodeNames.sort(); _imp->nodeSelectionCombo = new CompleterLineEdit(nodeNames, nodeNames, false, this); _imp->nodeSelectionCombo->setToolTip( GuiUtils::convertFromPlainText(tr("Input the name of a node in the current project."), Qt::WhiteSpaceNormal) ); _imp->firstLineLayout->addWidget(_imp->nodeSelectionCombo); _imp->nodeSelectionCombo->setFocus(Qt::PopupFocusReason); QTimer::singleShot( 25, _imp->nodeSelectionCombo, SLOT(showCompleter()) ); _imp->knobSelectionCombo = new ComboBox(_imp->firstLine); _imp->firstLineLayout->addWidget(_imp->knobSelectionCombo); QObject::connect( _imp->nodeSelectionCombo, SIGNAL(itemCompletionChosen()), this, SLOT(onNodeComboEditingFinished()) ); _imp->firstLineLayout->addStretch(); }
void CompleterLineEdit::setTextFromIndex(const QModelIndex & index) { QString text = index.data().toString(); setText(text); Q_EMIT itemCompletionChosen(); _imp->listView->hide(); if (_imp->quickExitEnabled) { _imp->dialog->accept(); } }
void CompleterLineEdit::setTextFromIndex(const QModelIndex & index) { QString text = index.data().toString(); setText(text); Q_EMIT itemCompletionChosen(); _imp->listView->hide(); if (_imp->quickExitEnabled) { NodeCreationDialog* isNodeDialog = dynamic_cast<NodeCreationDialog*>(_imp->dialog); if (isNodeDialog) { isNodeDialog->finish(true); } else { _imp->dialog->accept(); } } }
void CompleterLineEdit::keyPressEvent(QKeyEvent* e) { int key = e->key(); bool viewVisible = !_imp->listView->isHidden(); assert( _imp->listView->model() ); int count = _imp->listView->model()->rowCount(); QModelIndex currentIndex = _imp->listView->currentIndex(); if (key == Qt::Key_Escape) { if (_imp->quickExitEnabled) { _imp->dialog->reject(); } else { if ( _imp->listView->isVisible() ) { _imp->listView->hide(); } else { _imp->dialog->reject(); } } e->accept(); } else if (key == Qt::Key_Down) { if (viewVisible) { int row = currentIndex.row() + 1; ///Handle circular selection if (row >= count) { row = 0; } QModelIndex index = _imp->listView->model()->index(row, 0); _imp->listView->setCurrentIndex(index); } } else if (key == Qt::Key_Up) { if (viewVisible) { int row = currentIndex.row() - 1; ///Handle circular selection if (row < 0) { row = count - 1; } QModelIndex index = _imp->listView->model()->index(row, 0); _imp->listView->setCurrentIndex(index); } } else if ( (key == Qt::Key_Enter) || (key == Qt::Key_Return) ) { _imp->listView->hide(); if (_imp->model->rowCount() == 1) { setText( _imp->model->index(0).data().toString() ); Q_EMIT itemCompletionChosen(); if (_imp->quickExitEnabled) { _imp->dialog->accept(); } e->accept(); } else { const QItemSelection selection = _imp->listView->selectionModel()->selection(); QModelIndexList indexes = selection.indexes(); bool doDialogEnd = false; if (indexes.size() == 1) { setText( _imp->model->index( indexes[0].row() ).data().toString() ); doDialogEnd = true; } else if ( indexes.isEmpty() ) { if (_imp->model->rowCount() > 1) { doDialogEnd = true; setText( _imp->model->index(0).data().toString() ); } } if (doDialogEnd) { Q_EMIT itemCompletionChosen(); if (_imp->quickExitEnabled) { _imp->dialog->accept(); } e->accept(); } else { QLineEdit::keyPressEvent(e); } } } else { QLineEdit::keyPressEvent(e); } } // keyPressEvent
PickKnobDialog::PickKnobDialog(DockablePanel* panel, QWidget* parent) : QDialog(parent) , _imp( new PickKnobDialogPrivate(panel) ) { NodeSettingsPanel* nodePanel = dynamic_cast<NodeSettingsPanel*>(panel); assert(nodePanel); if (!nodePanel) { throw std::logic_error("PickKnobDialog::PickKnobDialog()"); } NodeGuiPtr nodeGui = nodePanel->getNodeGui(); NodePtr node = nodeGui->getNode(); NodeGroupPtr isGroup = node->isEffectNodeGroup(); NodeCollectionPtr collec = node->getGroup(); NodeGroupPtr isCollecGroup = toNodeGroup(collec); NodesList collectNodes = collec->getNodes(); for (NodesList::iterator it = collectNodes.begin(); it != collectNodes.end(); ++it) { if ((*it)->isActivated() && (*it)->getNodeGui() && ( (*it)->getKnobs().size() > 0 ) ) { _imp->allNodes.push_back(*it); } } if (isCollecGroup) { _imp->allNodes.push_back( isCollecGroup->getNode() ); } if (isGroup) { NodesList groupnodes = isGroup->getNodes(); for (NodesList::iterator it = groupnodes.begin(); it != groupnodes.end(); ++it) { if ( (*it)->getNodeGui() && (*it)->isActivated() && ( (*it)->getKnobs().size() > 0 ) ) { _imp->allNodes.push_back(*it); } } } QStringList nodeNames; for (NodesList::iterator it = _imp->allNodes.begin(); it != _imp->allNodes.end(); ++it) { QString name = QString::fromUtf8( (*it)->getLabel().c_str() ); nodeNames.push_back(name); } nodeNames.sort(); _imp->mainLayout = new QGridLayout(this); _imp->selectNodeLabel = new Label( tr("Node:") ); _imp->nodeSelectionCombo = new CompleterLineEdit(nodeNames, nodeNames, false, this); _imp->nodeSelectionCombo->setToolTip( NATRON_NAMESPACE::convertFromPlainText(tr("Input the name of a node in the current project."), NATRON_NAMESPACE::WhiteSpaceNormal) ); _imp->nodeSelectionCombo->setFocus(Qt::PopupFocusReason); _imp->knobSelectionCombo = new ComboBox(this); QObject::connect( _imp->knobSelectionCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onKnobComboIndexChanged(int)) ); QString useAliasTt = NATRON_NAMESPACE::convertFromPlainText(tr("If checked, an alias of the selected parameter will be created, coyping entirely its state. " "Only the script-name, label and tooltip will be editable.\n" "For choice parameters this will also " "dynamically refresh the menu entries when the original parameter's menu is changed.\n" "When unchecked, a simple expression will be set linking the two parameters, but things such as dynamic menus " "will be disabled."), NATRON_NAMESPACE::WhiteSpaceNormal); _imp->useAliasLabel = new Label(tr("Make Alias:"), this); _imp->useAliasLabel->setToolTip(useAliasTt); _imp->useAliasCheckBox = new QCheckBox(this); _imp->useAliasCheckBox->setToolTip(useAliasTt); _imp->useAliasCheckBox->setChecked(true); QObject::connect( _imp->nodeSelectionCombo, SIGNAL(itemCompletionChosen()), this, SLOT(onNodeComboEditingFinished()) ); _imp->destPageLabel = new Label(tr("Page:"), this); QString pagett = NATRON_NAMESPACE::convertFromPlainText(tr("Select the page into which the parameter will be created."), NATRON_NAMESPACE::WhiteSpaceNormal); _imp->destPageLabel->setToolTip(pagett); _imp->destPageCombo = new ComboBox(this); _imp->destPageCombo->setToolTip(pagett); QObject::connect( _imp->destPageCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onPageComboIndexChanged(int)) ); const KnobsVec& knobs = node->getKnobs(); for (std::size_t i = 0; i < knobs.size(); ++i) { if ( knobs[i]->isUserKnob() ) { KnobPagePtr isPage = toKnobPage(knobs[i]); if (isPage) { _imp->pages.push_back(isPage); _imp->destPageCombo->addItem( QString::fromUtf8( isPage->getName().c_str() ) ); } else { KnobGroupPtr isGrp = toKnobGroup(knobs[i]); if (isGrp) { _imp->groups.push_back(isGrp); } } } } if (_imp->destPageCombo->count() == 0) { _imp->destPageLabel->hide(); _imp->destPageCombo->hide(); } _imp->groupLabel = new Label(tr("Group:"), this); QString grouptt = NATRON_NAMESPACE::convertFromPlainText(tr("Select the group into which the parameter will be created."), NATRON_NAMESPACE::WhiteSpaceNormal); _imp->groupCombo = new ComboBox(this); _imp->groupLabel->setToolTip(grouptt); _imp->groupCombo->setToolTip(grouptt); onPageComboIndexChanged(0); _imp->buttons = new DialogButtonBox(QDialogButtonBox::StandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel), Qt::Horizontal, this); QObject::connect( _imp->buttons, SIGNAL(accepted()), this, SLOT(accept()) ); QObject::connect( _imp->buttons, SIGNAL(rejected()), this, SLOT(reject()) ); _imp->mainLayout->addWidget(_imp->selectNodeLabel, 0, 0, 1, 1); _imp->mainLayout->addWidget(_imp->nodeSelectionCombo, 0, 1, 1, 1); _imp->mainLayout->addWidget(_imp->knobSelectionCombo, 0, 2, 1, 1); _imp->mainLayout->addWidget(_imp->useAliasLabel, 1, 0, 1, 1); _imp->mainLayout->addWidget(_imp->useAliasCheckBox, 1, 1, 1, 1); _imp->mainLayout->addWidget(_imp->destPageLabel, 2, 0, 1, 1); _imp->mainLayout->addWidget(_imp->destPageCombo, 2, 1, 1, 1); _imp->mainLayout->addWidget(_imp->groupLabel, 2, 2, 1, 1); _imp->mainLayout->addWidget(_imp->groupCombo, 2, 3, 1, 1); _imp->mainLayout->addWidget(_imp->buttons, 3, 0, 1, 3); QTimer::singleShot( 25, _imp->nodeSelectionCombo, SLOT(showCompleter()) ); }