Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkPythonTextEditor.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "QmitkPythonTextEditor.h"
14 
15 #include <QList>
16 #include <QFileInfo>
17 #include <QUrl>
18 #include <QToolBar>
19 #include <QGridLayout>
20 #include <QAction>
21 #include <QIcon>
22 #include <QMimeData>
23 #include <QFileDialog>
24 
25 #include <usModuleContext.h>
26 #include <usServiceReference.h>
27 #include <mitkDataNode.h>
28 #include <usGetModuleContext.h>
29 #include <mitkIPythonService.h>
31 
32 struct QmitkPythonTextEditorData
33 {
34  QString m_FilePath;
35 
36  QAction* m_LoadScript;
37  QAction* m_SaveScript;
38  QAction* m_RunScript;
39  QToolBar* m_Toolbar;
40 
41  QTextEdit* m_Content;
42 
43  QGridLayout* m_Layout;
44  mitk::IPythonService* m_PythonService;
46 
47  QString m_FileName;
48 };
49 
51  :QWidget(parent), d(new QmitkPythonTextEditorData)
52 {
53  us::ModuleContext* context = us::GetModuleContext();
54  d->m_PythonServiceRef = context->GetServiceReference<mitk::IPythonService>();
55  d->m_PythonService = context->GetService<mitk::IPythonService>( d->m_PythonServiceRef );
56 
57  d->m_LoadScript = new QAction(this);
58  d->m_LoadScript->setToolTip("Load script from disk.");
59  d->m_LoadScript->setObjectName(QString::fromUtf8("LoadScript"));
60  QIcon icon2;
61  icon2.addFile(QString::fromUtf8(":/mitkPython/document-open.png"), QSize(), QIcon::Normal, QIcon::Off);
62  d->m_LoadScript->setIcon(icon2);
63 
64  d->m_SaveScript = new QAction(this);
65  d->m_SaveScript->setToolTip("Save script to disk.");
66  d->m_SaveScript->setObjectName(QString::fromUtf8("SaveScript"));
67  QIcon icon3;
68  icon3.addFile(QString::fromUtf8(":/mitkPython/document-save.png"), QSize(), QIcon::Normal, QIcon::Off);
69  d->m_SaveScript->setIcon(icon3);
70 
71  d->m_RunScript = new QAction(this);
72  d->m_RunScript->setToolTip("Run the current script.");
73  d->m_RunScript->setObjectName(QString::fromUtf8("RunScript"));
74  QIcon icon4;
75  icon4.addFile(QString::fromUtf8(":/mitkPython/media-playback-start.png"), QSize(), QIcon::Normal, QIcon::Off);
76  d->m_RunScript->setIcon(icon4);
77 
78  d->m_Toolbar = new QToolBar;
79  d->m_Toolbar->addAction( d->m_LoadScript );
80  d->m_Toolbar->addAction( d->m_SaveScript );
81  d->m_Toolbar->addAction( d->m_RunScript );
82 
83  d->m_Content = new QTextEdit(this);
84  d->m_Content->setObjectName(QString::fromUtf8("Content"));
85 
86  new QmitkPythonScriptEditorHighlighter(d->m_Content->document());
87 
88  d->m_Layout = new QGridLayout;
89  d->m_Layout->addWidget( d->m_Toolbar, 0, 0, 1, 1 );
90  d->m_Layout->addWidget( d->m_Content, 1, 0, 1, 1 );
91  d->m_Layout->setContentsMargins(2,2,2,2);
92 
93  this->setLayout(d->m_Layout);
94  QMetaObject::connectSlotsByName(this);
95 }
96 
98 {
99  us::ModuleContext* context = us::GetModuleContext();
100  context->UngetService( d->m_PythonServiceRef );
101 
102  delete d;
103 }
104 
105 void QmitkPythonTextEditor::dragEnterEvent(QDragEnterEvent *event)
106 {
107  event->accept();
108 }
109 
110 void QmitkPythonTextEditor::dropEvent(QDropEvent *event)
111 {
112  QList<QUrl> urls = event->mimeData()->urls();
113  for(int i = 0; i < urls.size(); i++)
114  {
115  this->Paste( urls[i].toString() );
116  }
117 }
118 /*
119 bool QmitkPythonTextEditor::canInsertFromMimeData( const QMimeData * ) const
120 {
121  return true;
122 }
123 */
124 
125 void QmitkPythonTextEditor::Paste(const QString &command)
126 {
127  if( this->isVisible() )
128  {
129  d->m_Content->insertPlainText(command + "\n");
130  }
131 }
132 
133 
134 QString QmitkPythonTextEditor::ReadFile(const QString& filename)
135 {
136  QFile file(filename);
137  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
138  {
139  MITK_ERROR << "Could not open file " << filename.toStdString();
140  return nullptr;
141  }
142 
143  QByteArray total;
144  QByteArray line;
145  while (!file.atEnd())
146  {
147  line = file.read(1024);
148  total.append(line);
149  }
150 
151  return QString(total);
152 }
153 
155 {
156  d->m_FileName = QFileDialog::getSaveFileName(this,tr("Save File"), d->m_FileName,tr("*.py"));
157  if( d->m_FileName.compare("") != 0)
158  {
159  std::ofstream myfile;
160  myfile.open(d->m_FileName.toLocal8Bit().data());
161  myfile << d->m_Content->toPlainText().toLocal8Bit().data();
162  myfile.close();
163  }
164 }
165 
167 {
168  d->m_FileName = QFileDialog::getOpenFileName( this, "Load Script", d->m_FileName, tr("*.py"));
169  if( !d->m_FileName.isEmpty() )
170  {
171  QString contents = this->ReadFile( d->m_FileName );
172  d->m_Content->setText(contents);
173  }
174 }
175 
177 {
178  if( !d->m_PythonService )
179  {
180  MITK_ERROR << "Python service not available.";
181  return;
182  }
183 
184  d->m_PythonService->Execute( d->m_Content->toPlainText().toStdString(), mitk::IPythonService::MULTI_LINE_COMMAND );
185 }
void Paste(const QString &command)
static char * line
Definition: svm.cpp:2870
void on_LoadScript_triggered(bool checked=false)
#define MITK_ERROR
Definition: mitkLogMacros.h:20
void dragEnterEvent(QDragEnterEvent *event) override
static const int MULTI_LINE_COMMAND
void dropEvent(QDropEvent *event) override
void on_SaveScript_triggered(bool checked=false)
QmitkPythonTextEditor(QWidget *parent=nullptr)
QString ReadFile(const QString &filename)
A script highlighter for Python Scripts.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
void on_RunScript_triggered(bool checked=false)