15 #include <QContextMenuEvent> 17 #include <ui_QmitkGnuplotWidget.h> 22 m_ContextMenu(nullptr),
23 m_CopyPlotAction(nullptr),
24 m_CopyScriptAction(nullptr),
25 m_Process(new QProcess(this))
30 m_Process, SIGNAL(stateChanged(QProcess::ProcessState)),
this, SLOT(OnProcessStateChanged(QProcess::ProcessState)));
31 connect(m_Process, SIGNAL(error(QProcess::ProcessError)),
this, SLOT(OnProcessError(QProcess::ProcessError)));
33 m_Process, SIGNAL(finished(
int, QProcess::ExitStatus)),
this, SLOT(OnProcessFinished(
int, QProcess::ExitStatus)));
35 this->CreateContextMenu();
42 void QmitkGnuplotWidget::CreateContextMenu()
44 m_CopyPlotAction =
new QAction(
"Copy &Plot",
this);
45 connect(m_CopyPlotAction, SIGNAL(triggered()),
this, SLOT(OnCopyPlot()));
47 m_CopyScriptAction =
new QAction(
"Copy &Script",
this);
48 connect(m_CopyScriptAction, SIGNAL(triggered()),
this, SLOT(OnCopyScript()));
50 m_ContextMenu =
new QMenu(
this);
52 m_ContextMenu->addActions(QList<QAction *>() << m_CopyPlotAction << m_CopyScriptAction);
57 const QPixmap *plot = m_Ui->label->pixmap();
59 m_CopyPlotAction->setEnabled(plot !=
nullptr && !plot->isNull());
60 m_CopyScriptAction->setEnabled(!m_Commands.empty());
62 m_ContextMenu->popup(event->globalPos());
67 void QmitkGnuplotWidget::OnCopyPlot()
69 const QPixmap *plot = m_Ui->label->pixmap();
71 if (plot !=
nullptr && !plot->isNull())
72 QApplication::clipboard()->setPixmap(*plot);
75 void QmitkGnuplotWidget::OnCopyScript()
77 if (m_Commands.empty())
80 QString script = this->CreateSetTermCommand();
82 Q_FOREACH (
const QString &command, m_Commands)
84 script += command +
"\n";
87 QApplication::clipboard()->setText(script);
92 m_ModifiedTime.Modified();
94 if (m_Process->isOpen() || m_Commands.isEmpty() || m_GnuplotPath.isEmpty())
102 return m_GnuplotPath;
107 m_GnuplotPath = path;
108 m_ModifiedTime.Modified();
118 m_Commands = commands;
119 m_ModifiedTime.Modified();
124 if (m_UpdateTime < m_ModifiedTime)
125 m_Process->start(m_GnuplotPath, QStringList() <<
"-");
130 return QSize(400, 300);
133 QString QmitkGnuplotWidget::CreateSetTermCommand()
const 135 return QString(
"set term pngcairo size %1,%2 enhanced font '%3,%4'\n")
138 .arg(this->font().family())
139 .arg(this->font().pointSize());
142 void QmitkGnuplotWidget::OnProcessStateChanged(QProcess::ProcessState state)
144 if (state == QProcess::Running)
146 m_UpdateTime = m_ModifiedTime;
148 m_Process->write(this->CreateSetTermCommand().toLatin1());
150 Q_FOREACH (
const QString &command, m_Commands)
152 m_Process->write(QString(
"%1\n").arg(command).toLatin1());
155 m_Process->write(
"exit\n");
156 m_Process->closeWriteChannel();
160 void QmitkGnuplotWidget::OnProcessError(QProcess::ProcessError error)
164 case QProcess::FailedToStart:
165 m_Ui->label->setText(
"Gnuplot failed to start!");
168 case QProcess::Crashed:
169 m_Ui->label->setText(
"Gnuplot crashed!");
172 case QProcess::Timedout:
173 m_Ui->label->setText(
"Gnuplot timed out!");
176 case QProcess::WriteError:
177 m_Ui->label->setText(
"Could not write to gnuplot!");
180 case QProcess::ReadError:
181 m_Ui->label->setText(
"Could not read from gnuplot!");
185 m_Ui->label->setText(
"An unknown error occurred!");
190 void QmitkGnuplotWidget::OnProcessFinished(
int exitCode, QProcess::ExitStatus exitStatus)
192 bool needUpdate =
false;
194 if (exitStatus != QProcess::CrashExit)
198 if (m_UpdateTime < m_ModifiedTime)
204 m_Ui->label->setPixmap(QPixmap::fromImage(QImage::fromData(m_Process->readAllStandardOutput(),
"PNG")));
209 m_Ui->label->setText(QString(
"Gnuplot exit code: %1!").arg(exitCode));