21 #include <QGridLayout> 24 #include <QInputDialog> 26 #include <QMessageBox> 27 #include <QXmlStreamWriter> 28 #include <QXmlStreamReader> 30 #include <QFileDialog> 32 struct QmitkPythonSnippetsData
34 QString m_AutoSaveFileName;
35 QString m_SaveFileName;
37 QAction* m_PasteSnippet;
38 QAction* m_RemoveSnippet;
39 QAction* m_RenameSnippet;
40 QAction* m_AddSnippet;
41 QAction* m_RestoreDefaultSnippets;
42 QAction* m_LoadSnippets;
43 QAction* m_SaveSnippets;
51 QGridLayout* m_Layout;
61 : QWidget(parent), d(new QmitkPythonSnippetsData)
63 d->m_SaveFileName = QDir::currentPath();
64 d->m_AutoSaveFileName = _AutoSaveFileName;
71 d->m_PasteSnippet =
new QAction(
this);
72 d->m_PasteSnippet->setObjectName(QString::fromUtf8(
"PasteSnippet"));
74 icon.addFile(QString::fromUtf8(
":/mitkPython/edit-paste.png"), QSize(), QIcon::Normal, QIcon::Off);
75 d->m_PasteSnippet->setIcon(icon);
76 d->m_PasteSnippet->setToolTip(
"Paste snippet!");
77 d->m_PasteSnippet->setEnabled(
false);
79 d->m_RemoveSnippet =
new QAction(
this);
80 d->m_RemoveSnippet->setObjectName(QString::fromUtf8(
"RemoveSnippet"));
82 icon1.addFile(QString::fromUtf8(
":/mitkPython/edit-delete.png"), QSize(), QIcon::Normal, QIcon::Off);
83 d->m_RemoveSnippet->setIcon(icon1);
84 d->m_RemoveSnippet->setToolTip(
"Remove snippet.");
85 d->m_RemoveSnippet->setEnabled(
false);
87 d->m_RenameSnippet =
new QAction(
this);
88 d->m_RenameSnippet->setObjectName(QString::fromUtf8(
"RenameSnippet"));
90 icon2.addFile(QString::fromUtf8(
":/mitkPython/edit-find-replace.png"), QSize(), QIcon::Normal, QIcon::Off);
91 d->m_RenameSnippet->setIcon(icon2);
92 d->m_RenameSnippet->setToolTip(
"Rename snippet.");
93 d->m_RenameSnippet->setEnabled(
false);
95 d->m_AddSnippet =
new QAction(
this);
96 d->m_AddSnippet->setObjectName(QString::fromUtf8(
"AddSnippet"));
98 icon3.addFile(QString::fromUtf8(
":/mitkPython/document-new.png"), QSize(), QIcon::Normal, QIcon::Off);
99 d->m_AddSnippet->setIcon(icon3);
100 d->m_AddSnippet->setToolTip(
"Add snippet.");
102 d->m_RestoreDefaultSnippets =
new QAction(
this);
103 d->m_RestoreDefaultSnippets->setObjectName(QString::fromUtf8(
"RestoreDefaultSnippets"));
105 icon4.addFile(QString::fromUtf8(
":/mitkPython/edit-clear.png"), QSize(), QIcon::Normal, QIcon::Off);
106 d->m_RestoreDefaultSnippets->setIcon(icon4);
107 d->m_RestoreDefaultSnippets->setToolTip(
"Restore default snippets");
109 d->m_LoadSnippets =
new QAction(
this);
110 d->m_LoadSnippets->setToolTip(
"Load Snippets from disk.");
111 d->m_LoadSnippets->setObjectName(QString::fromUtf8(
"LoadSnippets"));
113 icon5.addFile(QString::fromUtf8(
":/mitkPython/document-open.png"), QSize(), QIcon::Normal, QIcon::Off);
114 d->m_LoadSnippets->setIcon(icon5);
116 d->m_SaveSnippets =
new QAction(
this);
117 d->m_SaveSnippets->setToolTip(
"Save Snippets to disk.");
118 d->m_SaveSnippets->setObjectName(QString::fromUtf8(
"SaveSnippets"));
120 icon6.addFile(QString::fromUtf8(
":/mitkPython/document-save.png"), QSize(), QIcon::Normal, QIcon::Off);
121 d->m_SaveSnippets->setIcon(icon6);
122 d->m_SaveSnippets->setEnabled(
false);
124 d->m_Toolbar =
new QToolBar;
125 d->m_Toolbar->addAction( d->m_PasteSnippet );
126 d->m_Toolbar->addAction( d->m_AddSnippet );
127 d->m_Toolbar->addAction( d->m_RemoveSnippet );
128 d->m_Toolbar->addAction( d->m_RenameSnippet );
129 d->m_Toolbar->addAction( d->m_RestoreDefaultSnippets );
130 d->m_Toolbar->addAction( d->m_SaveSnippets );
131 d->m_Toolbar->addAction( d->m_LoadSnippets );
133 d->m_Name =
new QComboBox;
134 d->m_Name->setObjectName(QString::fromUtf8(
"Name"));
136 d->m_Content =
new QTextEdit(
this);
137 d->m_Content->setObjectName(QString::fromUtf8(
"Content"));
138 d->m_Content->setEnabled(
false);
142 d->m_Layout =
new QGridLayout;
143 d->m_Layout->addWidget( d->m_Toolbar, 0, 0, 1, 1 );
144 d->m_Layout->addWidget( d->m_Name, 1, 0, 1, 1 );
145 d->m_Layout->addWidget( d->m_Content, 2, 0, 1, 1 );
146 d->m_Layout->setContentsMargins(2,2,2,2);
148 this->setLayout(d->m_Layout);
149 QMetaObject::connectSlotsByName(
this);
166 QString oldname = d->m_Name->currentText();
167 QString name = oldname;
171 name = QInputDialog::getText(
this,
172 tr(
"Add new snippet"),
173 tr(
"Name of snippet:"),
180 if ( d->m_Snippets.contains(name) )
182 QMessageBox::warning(
this,
183 tr(
"Duplicate name."),
184 tr(
"The entered name already exists. Enter another one or cancel the operation."),
190 QString tmpSnippet = d->m_Snippets[oldname];
191 d->m_Snippets.remove(oldname);
192 d->m_Snippets[name] = tmpSnippet;
208 QString name = QInputDialog::getText(
this,
209 tr(
"Add new snippet"),
210 tr(
"Name of snippet:"),
214 if (ok && !name.isEmpty())
216 MITK_DEBUG(
"QmitkPythonSnippets") <<
"creating unique name for " << name.toStdString();
219 MITK_DEBUG(
"QmitkPythonSnippets") <<
"creating snippet " << name.toStdString();
220 d->m_Snippets[name] =
"";
228 QString newName = name;
230 while( d->m_Snippets.contains(name) )
232 newName = name + QString(
"_%1").arg(i);
241 QString name = d->m_Name->currentText();
242 QString question = QString(
"Really remove Snippet %1?").arg(name);
243 int remove = QMessageBox::question(
this,
244 QString(
"Confirm removal"),
246 QMessageBox::Yes | QMessageBox::No,
249 if(
remove == QMessageBox::Yes ||
remove == QMessageBox::Ok )
251 d->m_Snippets.remove(name);
259 QString question = QString(
"Really restore default Snippets?");
260 int remove = QMessageBox::question(
this,
261 QString(
"Confirm restoring"),
263 QMessageBox::Yes | QMessageBox::No,
265 if(
remove == QMessageBox::Yes ||
remove == QMessageBox::Ok )
275 bool validSelection = i >= 0 ;
277 d->m_PasteSnippet->setEnabled(validSelection);
278 d->m_RemoveSnippet->setEnabled(validSelection);
279 d->m_RenameSnippet->setEnabled(validSelection);
280 d->m_Content->setEnabled(validSelection);
281 d->m_SaveSnippets->setEnabled(validSelection);
285 QString name = d->m_Name->currentText();
286 MITK_DEBUG(
"QmitkPythonSnippets") <<
"selected snippet " << name.toStdString();
287 d->m_Content->setText( d->m_Snippets[name] );
288 MITK_DEBUG(
"QmitkPythonSnippets") <<
"selected snippet content " << d->m_Snippets[name].toStdString();
294 MITK_DEBUG(
"QmitkPythonSnippets") <<
"saving to xml file " << filename.toStdString();
296 if( filename.isEmpty() )
298 MITK_WARN(
"QmitkPythonSnippets") <<
"empty auto save file path given. quit.";
302 QFile file(filename);
303 file.open(QIODevice::WriteOnly);
306 MITK_WARN(
"QmitkPythonSnippets") <<
"could not open file " << filename.toStdString() <<
" for writing";
309 QXmlStreamWriter xmlWriter(&file);
311 xmlWriter.setAutoFormatting(
true);
312 xmlWriter.writeStartDocument();
315 QStringMap::const_iterator it = d->m_Snippets.begin();
316 while( it != d->m_Snippets.end() )
321 MITK_DEBUG(
"QmitkPythonSnippets") <<
"writing item " << it.key().toStdString();
326 xmlWriter.writeAttribute(
"key", it.key() );
327 xmlWriter.writeAttribute(
"value", it.value() );
329 xmlWriter.writeEndElement();
334 xmlWriter.writeEndDocument();
339 MITK_DEBUG(
"QmitkPythonSnippets") <<
"SaveStringMap successful ";
346 MITK_DEBUG(
"QmitkPythonSnippets") <<
"loading from xml file " << filename.toStdString();
349 QXmlStreamReader xmlReader;
353 if( filename.startsWith(
":") )
355 QResource res( filename );
356 data = QByteArray( reinterpret_cast< const char* >( res.data() ), res.size() );
357 xmlReader.addData( data );
361 file.setFileName( filename );
362 if (!file.open(QFile::ReadOnly | QFile::Text))
364 MITK_ERROR <<
"Error: Cannot read file " << qPrintable(filename)
365 <<
": " << qPrintable(file.errorString());
368 xmlReader.setDevice(&file);
371 xmlReader.readNext();
373 while(!xmlReader.atEnd())
375 xmlReader.readNext();
379 QXmlStreamAttributes attributes = xmlReader.attributes();
382 if(attributes.hasAttribute(
"key"))
384 key = attributes.value(
"key").toString();
387 if(attributes.hasAttribute(
"value"))
389 value = attributes.value(
"value").toString();
394 MITK_DEBUG(
"QmitkPythonSnippets") <<
"loaded snippet " << key.toStdString();
395 MITK_DEBUG(
"QmitkPythonSnippets") <<
"value " << value.toStdString();
401 if (xmlReader.hasError())
404 << qPrintable(filename) <<
": " 405 << qPrintable(xmlReader.errorString());
408 else if (file.error() != QFile::NoError)
410 MITK_ERROR <<
"Error: Cannot read file " << qPrintable(filename)
411 <<
": " << qPrintable(file.errorString());
425 d->m_Content->clear();
427 MITK_DEBUG(
"QmitkPythonSnippets") <<
"size of snippets " << d->m_Snippets.size();
428 QStringMap::const_iterator it = d->m_Snippets.begin();
430 while( it != d->m_Snippets.end() )
432 MITK_DEBUG(
"QmitkPythonSnippets") <<
"adding item " << it.key().toStdString();
433 d->m_Name->addItem( it.key() );
437 int index = d->m_Name->findText( name );
440 MITK_DEBUG(
"QmitkPythonSnippets") <<
"selecting index " << index;
441 d->m_Name->setCurrentIndex(index);
448 if( d->m_Content->isEnabled() )
450 QString name = d->m_Name->currentText();
451 QString snippet = d->m_Content->toPlainText();
452 d->m_Snippets[name] = snippet;
455 MITK_DEBUG(
"QmitkPythonSnippets") <<
"SaveStringMap successful";
461 QString fileName = QFileDialog::getSaveFileName(
this,
"Save snippets", d->m_SaveFileName,
"XML files (*.xml)");
462 if( !fileName.isEmpty() )
464 d->m_SaveFileName = fileName;
471 QString fileName = QFileDialog::getOpenFileName(
this,
"Load snippets", d->m_SaveFileName,
"XML files (*.xml)");
473 if( !fileName.isEmpty() )
475 d->m_SaveFileName = fileName;
476 QString question = QString(
"Your current snippets will be overwritten. Proceed?");
477 int overwrite = QMessageBox::warning(
this,
478 QString(
"Confirm overwrite"),
480 QMessageBox::Yes | QMessageBox::No,
483 if( overwrite == QMessageBox::Yes )
486 this->
Update( d->m_Name->currentText() );
static const QString DEFAULT_SNIPPET_FILE
QMap< QString, QString > QStringMap
typedef for string map
void on_LoadSnippets_triggered(bool checked=false)
ask for file, load snippets (do not replace)
void PasteCommandRequested(const QString &command)
this class whishes to paste sth command
void Update(const QString &name="")
void on_AddSnippet_triggered(bool checked=false)
ask for name, create snippet, call update()
static const QString SNIPPETS_ROOT_XML_ELEMENT_NAME
void on_Content_textChanged()
save changed snippet
void on_SaveSnippets_triggered(bool checked=false)
ask for file, save snippets
void on_PasteSnippet_triggered(bool checked=false)
emits PasteCommandRequested signal
void on_RenameSnippet_triggered(bool checked=false)
ask for name as long as it exists, call update()
void on_RestoreDefaultSnippets_triggered(bool checked=false)
call LoadStringMap with d->m_DefaultSnippetsAutoSaveFileName
static bool LoadStringMap(const QString &filename, QStringMap &oldMap)
read string map from xml file
void on_Name_currentIndexChanged(int i)
update action state (enable/disable), update text box
MITKMATCHPOINTREGISTRATION_EXPORT ResultImageType::Pointer map(const InputImageType *input, const RegistrationType *registration, bool throwOnOutOfInputAreaError=false, const double &paddingValue=0, const ResultImageGeometryType *resultGeometry=nullptr, bool throwOnMappingError=true, const double &errorValue=0, mitk::ImageMappingInterpolator::Type interpolatorType=mitk::ImageMappingInterpolator::Linear)
A script highlighter for Python Scripts.
static const QString SNIPPETS_XML_ELEMENT_NAME
~QmitkPythonSnippets() override
delete d pointer
QmitkPythonSnippets(const QString &_AutoSaveFileName="", QWidget *parent=nullptr)
void on_RemoveSnippet_triggered(bool checked=false)
remove the current snippet, call update()
void SaveStringMap(const QString &filename, const QStringMap &map) const
write string map to xml file
QString CreateUniqueName(const QString &name) const
creates a name which does not exist in the list