static KnobGuiPtr getKnobGuiForKnob(const NodePtr& selectedNode, const KnobIPtr& knob) { NodeGuiIPtr selectedNodeGuiI = selectedNode->getNodeGui(); assert(selectedNodeGuiI); if (!selectedNodeGuiI) { return KnobGuiPtr(); } NodeGui* selectedNodeGui = dynamic_cast<NodeGui*>( selectedNodeGuiI.get() ); assert(selectedNodeGui); if (!selectedNodeGui) { return KnobGuiPtr(); } NodeSettingsPanel* selectedPanel = selectedNodeGui->getSettingPanel(); bool hadPanelVisible = selectedPanel && !selectedPanel->isClosed(); if (!selectedPanel) { selectedNodeGui->ensurePanelCreated(); selectedPanel = selectedNodeGui->getSettingPanel(); selectedNodeGui->setVisibleSettingsPanel(false); } if (!selectedPanel) { return KnobGuiPtr(); } if (!hadPanelVisible && selectedPanel) { selectedPanel->setClosed(true); } const std::list<std::pair<KnobIWPtr, KnobGuiPtr> >& knobsMap = selectedPanel->getKnobsMapping(); for (std::list<std::pair<KnobIWPtr, KnobGuiPtr> >::const_iterator it = knobsMap.begin(); it != knobsMap.end(); ++it) { if (it->first.lock() == knob) { return it->second; } } return KnobGuiPtr(); }
ScriptEditor::ScriptEditor(const std::string& scriptName, Gui* gui) : QWidget(gui) , PanelWidget(scriptName, this, gui) , _imp( new ScriptEditorPrivate() ) { _imp->mainLayout = new QVBoxLayout(this); _imp->buttonsContainer = new QWidget(this); _imp->buttonsContainerLayout = new QHBoxLayout(_imp->buttonsContainer); _imp->buttonsContainerLayout->setContentsMargins(0, 0, 0, 0); _imp->buttonsContainerLayout->setSpacing(2); QPixmap undoPix, redoPix, clearHistoPix, sourceScriptPix, loadScriptPix, saveScriptPix, execScriptPix, outputVisiblePix, outputHiddenPix, clearOutpoutPix; appPTR->getIcon(NATRON_PIXMAP_SCRIPT_PREVIOUS_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &undoPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_NEXT_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &redoPix); appPTR->getIcon(NATRON_PIXMAP_CLOSE_PANEL, NATRON_MEDIUM_BUTTON_ICON_SIZE, &clearHistoPix); appPTR->getIcon(NATRON_PIXMAP_CLEAR_ALL_ANIMATION, NATRON_MEDIUM_BUTTON_ICON_SIZE, &clearHistoPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_CLEAR_OUTPUT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &clearOutpoutPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_EXEC_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &execScriptPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_OUTPUT_PANE_ACTIVATED, NATRON_MEDIUM_BUTTON_ICON_SIZE, &outputVisiblePix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_OUTPUT_PANE_DEACTIVATED, NATRON_MEDIUM_BUTTON_ICON_SIZE, &outputHiddenPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_LOAD_EXEC_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &sourceScriptPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_LOAD_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &loadScriptPix); appPTR->getIcon(NATRON_PIXMAP_SCRIPT_SAVE_SCRIPT, NATRON_MEDIUM_BUTTON_ICON_SIZE, &saveScriptPix); _imp->undoB = new Button(QIcon(undoPix), QString(), _imp->buttonsContainer); QKeySequence undoSeq(Qt::CTRL + Qt::Key_BracketLeft); _imp->undoB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->undoB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); _imp->undoB->setFocusPolicy(Qt::NoFocus); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptEditorPrevScript, "<p>" + tr("Previous Script").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->undoB); _imp->undoB->setEnabled(false); QObject::connect( _imp->undoB, SIGNAL(clicked(bool)), this, SLOT(onUndoClicked()) ); _imp->redoB = new Button(QIcon(redoPix), QString(), _imp->buttonsContainer); QKeySequence redoSeq(Qt::CTRL + Qt::Key_BracketRight); _imp->redoB->setFocusPolicy(Qt::NoFocus); _imp->redoB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->redoB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptEditorNextScript, "<p>" + tr("Next Script").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->redoB); _imp->redoB->setEnabled(false); QObject::connect( _imp->redoB, SIGNAL(clicked(bool)), this, SLOT(onRedoClicked()) ); _imp->clearHistoB = new Button(QIcon(clearHistoPix), QString(), _imp->buttonsContainer); _imp->clearHistoB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->clearHistoB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); _imp->clearHistoB->setFocusPolicy(Qt::NoFocus); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptEditorClearHistory, "<p>" + tr("Clear History").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->clearHistoB); QObject::connect( _imp->clearHistoB, SIGNAL(clicked(bool)), this, SLOT(onClearHistoryClicked()) ); _imp->sourceScriptB = new Button(QIcon(sourceScriptPix), QString(), _imp->buttonsContainer); _imp->sourceScriptB->setToolTip( NATRON_NAMESPACE::convertFromPlainText(tr("Open and execute a script."), NATRON_NAMESPACE::WhiteSpaceNormal) ); _imp->sourceScriptB->setFocusPolicy(Qt::NoFocus); _imp->sourceScriptB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->sourceScriptB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); QObject::connect( _imp->sourceScriptB, SIGNAL(clicked(bool)), this, SLOT(onSourceScriptClicked()) ); _imp->loadScriptB = new Button(QIcon(loadScriptPix), QString(), _imp->buttonsContainer); _imp->loadScriptB->setToolTip( NATRON_NAMESPACE::convertFromPlainText(tr("Open a script without executing it."), NATRON_NAMESPACE::WhiteSpaceNormal) ); _imp->loadScriptB->setFocusPolicy(Qt::NoFocus); _imp->loadScriptB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->loadScriptB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); QObject::connect( _imp->loadScriptB, SIGNAL(clicked(bool)), this, SLOT(onLoadScriptClicked()) ); _imp->saveScriptB = new Button(QIcon(saveScriptPix), QString(), _imp->buttonsContainer); _imp->saveScriptB->setToolTip( NATRON_NAMESPACE::convertFromPlainText(tr("Save the current script."), NATRON_NAMESPACE::WhiteSpaceNormal) ); _imp->saveScriptB->setFocusPolicy(Qt::NoFocus); _imp->saveScriptB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->saveScriptB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); QObject::connect( _imp->saveScriptB, SIGNAL(clicked(bool)), this, SLOT(onSaveScriptClicked()) ); _imp->execScriptB = new Button(QIcon(execScriptPix), QString(), _imp->buttonsContainer); QKeySequence execSeq(Qt::CTRL + Qt::Key_Return); _imp->execScriptB->setFocusPolicy(Qt::NoFocus); _imp->execScriptB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->execScriptB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptExecScript, "<p>" + tr("Execute the current script").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->execScriptB); QObject::connect( _imp->execScriptB, SIGNAL(clicked(bool)), this, SLOT(onExecScriptClicked()) ); QIcon icShowHide; icShowHide.addPixmap(outputVisiblePix, QIcon::Normal, QIcon::On); icShowHide.addPixmap(outputHiddenPix, QIcon::Normal, QIcon::Off); _imp->showHideOutputB = new Button(icShowHide, QString(), _imp->buttonsContainer); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptShowOutput, "<p>" + tr("Show/Hide the output area").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->showHideOutputB); _imp->showHideOutputB->setFocusPolicy(Qt::NoFocus); _imp->showHideOutputB->setCheckable(true); _imp->showHideOutputB->setChecked(true); _imp->showHideOutputB->setDown(true); _imp->showHideOutputB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->showHideOutputB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); QObject::connect( _imp->showHideOutputB, SIGNAL(clicked(bool)), this, SLOT(onShowHideOutputClicked(bool)) ); _imp->clearOutputB = new Button(QIcon(clearOutpoutPix), QString(), _imp->buttonsContainer); QKeySequence clearSeq(Qt::CTRL + Qt::Key_Backspace); _imp->clearOutputB->setFocusPolicy(Qt::NoFocus); _imp->clearOutputB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->clearOutputB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); setToolTipWithShortcut(kShortcutGroupScriptEditor, kShortcutActionScriptClearOutput, "<p>" + tr("Clear the output area").toStdString() + "</p>" + "<p><b>" + tr("Keyboard shortcut: %1").toStdString() + "</b></p>", _imp->clearOutputB); QObject::connect( _imp->clearOutputB, SIGNAL(clicked(bool)), this, SLOT(onClearOutputClicked()) ); _imp->showAutoDeclVarsB = new Button(QIcon(), QString::fromUtf8("..."), _imp->buttonsContainer); _imp->showAutoDeclVarsB->setFocusPolicy(Qt::NoFocus); _imp->showAutoDeclVarsB->setFixedSize(NATRON_MEDIUM_BUTTON_SIZE, NATRON_MEDIUM_BUTTON_SIZE); _imp->showAutoDeclVarsB->setIconSize( QSize(NATRON_MEDIUM_BUTTON_ICON_SIZE, NATRON_MEDIUM_BUTTON_ICON_SIZE) ); _imp->showAutoDeclVarsB->setCheckable(true); bool isAutoDeclEnabled = appPTR->getCurrentSettings()->isAutoDeclaredVariablePrintActivated(); _imp->showAutoDeclVarsB->setChecked(isAutoDeclEnabled); _imp->showAutoDeclVarsB->setDown(isAutoDeclEnabled); _imp->showAutoDeclVarsB->setToolTip( NATRON_NAMESPACE::convertFromPlainText(tr("When checked, auto-declared Python variable will be printed " "in gray in the output window."), NATRON_NAMESPACE::WhiteSpaceNormal) ); QObject::connect( _imp->showAutoDeclVarsB, SIGNAL(clicked(bool)), this, SLOT(onShowAutoDeclVarsClicked(bool)) ); _imp->buttonsContainerLayout->addWidget(_imp->undoB); _imp->buttonsContainerLayout->addWidget(_imp->redoB); _imp->buttonsContainerLayout->addWidget(_imp->clearHistoB); _imp->buttonsContainerLayout->addSpacing(10); _imp->buttonsContainerLayout->addWidget(_imp->sourceScriptB); _imp->buttonsContainerLayout->addWidget(_imp->loadScriptB); _imp->buttonsContainerLayout->addWidget(_imp->saveScriptB); _imp->buttonsContainerLayout->addWidget(_imp->execScriptB); _imp->buttonsContainerLayout->addSpacing(10); _imp->buttonsContainerLayout->addWidget(_imp->showHideOutputB); _imp->buttonsContainerLayout->addWidget(_imp->clearOutputB); _imp->buttonsContainerLayout->addSpacing(10); _imp->buttonsContainerLayout->addWidget(_imp->showAutoDeclVarsB); _imp->buttonsContainerLayout->addStretch(); QSplitter* splitter = new QSplitter(Qt::Vertical, this); _imp->outputEdit = new OutputScriptTextEdit(this); QObject::connect( _imp->outputEdit, SIGNAL(userScrollChanged(bool)), this, SLOT(onUserScrollChanged(bool)) ); _imp->outputEdit->setFocusPolicy(Qt::NoFocus); _imp->outputEdit->setReadOnly(true); _imp->inputEdit = new InputScriptTextEdit(gui, KnobGuiPtr(), DimSpec::all(), ViewSetSpec::all(), this); QObject::connect( _imp->inputEdit, SIGNAL(textChanged()), this, SLOT(onInputScriptTextChanged()) ); QFontMetrics fm = _imp->inputEdit->fontMetrics(); _imp->inputEdit->setTabStopWidth(fm.width( QLatin1Char(' ') ) * 4); _imp->outputEdit->setTabStopWidth(fm.width( QLatin1Char(' ') ) * 4); _imp->mainLayout->addWidget(_imp->buttonsContainer); splitter->addWidget(_imp->outputEdit); splitter->addWidget(_imp->inputEdit); _imp->mainLayout->addWidget(splitter); QObject::connect( &_imp->history, SIGNAL(canUndoChanged(bool)), this, SLOT(onHistoryCanUndoChanged(bool)) ); QObject::connect( &_imp->history, SIGNAL(canRedoChanged(bool)), this, SLOT(onHistoryCanRedoChanged(bool)) ); _imp->autoSaveTimer.setSingleShot(true); reloadFont(); // Restore input script input from settings { QSettings settings( QString::fromUtf8(NATRON_ORGANIZATION_NAME), QString::fromUtf8(NATRON_APPLICATION_NAME) ); QString key = QString::fromUtf8(kScriptEditorInputSerializationKey); if (settings.contains(key)) { QString script = settings.value(key).toString(); setInputScript(script); } } }