21 #include <QtCore/QTimer> 22 #include <QtCore/QTextStream> 23 #include <QtCore/QProcess> 25 #include <QHBoxLayout> 26 #include <QGridLayout> 28 #include <QFileDialog> 29 #include <QToolButton> 32 #include <QCloseEvent> 44 setAcceptDrops(
false);
57 setWindowTitle(
"Analysis Terminal");
64 setWindowIcon(QIcon(
":/icons/analysiswin.png"));
65 QGridLayout* layout =
new QGridLayout(
this );
66 layout->setContentsMargins(11,11,11,11);
67 layout->setSpacing(6);
71 fxOutput->setAutoFormatting(QTextEdit::AutoNone);
72 fxOutput->setWordWrapMode(QTextOption::NoWrap);
79 QHBoxLayout *box1 =
new QHBoxLayout();
80 box1->addWidget(
new QLabel(
"Press enter to execute.",
this), 1);
82 layout->addLayout(box1, 1, 0);
84 QHBoxLayout *box2 =
new QHBoxLayout();
86 layout->addLayout(box2, 2, 0);
91 QHBoxLayout *box =
new QHBoxLayout(
this);
112 fxCmdHist->setToolTip(
"CINT command for analysis process. Note: '@' means 'TGo4Analysis::Instance()->' . A leading '$' will invoke Python script.");
114 fxCmdHist->setMinimumSize( QSize( 220, 25 ) );
122 QToolButton* MacroSearch =
new QToolButton(
this );
123 MacroSearch->setMinimumSize( QSize( 30, 25 ) );
124 MacroSearch->setMaximumSize( QSize( 30, 25 ) );
125 MacroSearch->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
126 MacroSearch->setIcon( QIcon(
":/icons/findfile.png" ) );
127 MacroSearch->setToolTip(
"Search root or python macro on disk.");
129 box->addWidget(MacroSearch,1);
135 QToolButton* KillProcess =
new QToolButton(
this );
136 KillProcess->setMinimumSize( QSize( 30, 25 ) );
137 KillProcess->setMaximumSize( QSize( 30, 25 ) );
138 KillProcess->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
139 KillProcess->setIcon( QIcon(
":/icons/killanal.png" ) );
140 KillProcess->setToolTip(
"Apply Ctrl+C in the analysis terminal.");
142 box->addWidget(KillProcess);
146 QToolButton* ClearButton =
new QToolButton(
this );
147 ClearButton->setMinimumSize( QSize( 30, 25 ) );
148 ClearButton->setMaximumSize( QSize( 30, 25 ) );
149 ClearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
150 ClearButton->setIcon( QIcon(
":/icons/clear.png" ) );
151 ClearButton->setToolTip(
"Clear Terminal Window.");
153 box->addItem(
new QSpacerItem(1,1));
154 box->addWidget(ClearButton,1);
156 QToolButton* ScrollEndButton =
new QToolButton(
this );
157 ScrollEndButton->setMinimumSize( QSize( 30, 25 ) );
158 ScrollEndButton->setMaximumSize( QSize( 30, 25 ) );
159 ScrollEndButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
160 ScrollEndButton->setIcon( QIcon(
":/icons/shiftdown.png" ) );
161 ScrollEndButton->setToolTip(
"Scroll to end of Terminal Window. (keyboard: end)");
163 box->addWidget(ScrollEndButton,1);
166 QToolButton* PrintHistoButton =
new QToolButton(
this );
167 PrintHistoButton->setMinimumSize( QSize( 30, 25 ) );
168 PrintHistoButton->setMaximumSize( QSize( 30, 25 ) );
169 PrintHistoButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
170 PrintHistoButton->setIcon( QIcon(
":/icons/hislist.png" ) );
171 PrintHistoButton->setToolTip(
"Print list of all histograms.");
173 box->addWidget(PrintHistoButton,1);
175 QToolButton* PrintConnyButton =
new QToolButton(
this );
176 PrintConnyButton->setMinimumSize( QSize( 30, 25 ) );
177 PrintConnyButton->setMaximumSize( QSize( 30, 25 ) );
178 PrintConnyButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
179 PrintConnyButton->setIcon( QIcon(
":/icons/condlist.png" ) );
180 PrintConnyButton->setToolTip(
"Print list of all conditions.");
182 box->addWidget(PrintConnyButton,1);
184 QToolButton* PrintEventButton =
new QToolButton(
this );
185 PrintEventButton->setMinimumSize( QSize( 30, 25 ) );
186 PrintEventButton->setMaximumSize( QSize( 30, 25 ) );
187 PrintEventButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
188 PrintEventButton->setIcon( QIcon(
":/icons/zoom.png" ) );
189 PrintEventButton->setToolTip(
"Start Event Inspection panel");
191 box->addWidget(PrintEventButton,1);
225 unsigned int outlen =
fxOutput->toPlainText().length();
230 }
else if (buflen >= cutlength) {
233 fxOutput->moveCursor(QTextCursor::End);
235 QString curr =
fxOutput->toPlainText();
236 curr.remove(0, cutlength - buflen);
239 fxOutput->moveCursor(QTextCursor::End);
275 QString pre = prio>0 ?
"!":
"*";
276 QString format= QString(
"GO4-%1> [%2]\n").arg(pre).arg(
fxTimeFormat);
277 buf = QDateTime::currentDateTime().toString(format)+ buf;
299 int first = progname.indexOf(
"\"");
300 int last = progname.lastIndexOf(
"\"");
301 if ((first > 0) && (last > first)) {
302 quoted = progname.mid(first+1, last-first-1);
303 progname.resize(first);
306 #if QT_VERSION < QT_VERSION_CHECK(5,14,0) 307 args = progname.split(
" ",QString::SkipEmptyParts);
309 args = progname.split(
" ",Qt::SkipEmptyParts);
311 if (args.size() > 0) {
312 progname = args.front();
315 if (quoted.length() > 0)
316 args.push_back(quoted);
324 setWindowTitle(
"Analysis Terminal");
330 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
337 QString progname = text;
345 std::cerr <<
"Fatal error. Could not start the Analysis" << std::endl;
350 setWindowTitle(
"Analysis Terminal [with QProcess]");
352 setWindowTitle(QString(
"Analysis Terminal [pid:%1]").arg(
fAnalysisProcess->processId()));
382 fxOutput->moveCursor(QTextCursor::End);
389 "Save analysis terminal output",
390 "",
"Plain text (*.txt)");
391 fd.setFileMode( QFileDialog::AnyFile );
392 fd.setAcceptMode(QFileDialog::AcceptSave);
394 if (fd.exec() != QDialog::Accepted)
return;
396 QStringList flst = fd.selectedFiles();
397 if (flst.isEmpty())
return;
398 QString fileName = flst[0];
400 if(!fileName.endsWith(
".txt")) fileName.append(
".txt");
401 QFile NewFile(fileName);
402 NewFile.open( QIODevice::ReadWrite | QIODevice::Append );
403 QTextStream t( &NewFile );
404 t <<
fxOutput->toPlainText() <<
"\n";
411 if (cmd.isEmpty())
return;
423 QFileDialog fd(
this,
424 "Select ROOT macro for analysis task",
425 "",
"CINT Macro(*.C);;Python script(*.py)");
426 fd.setFileMode( QFileDialog::ExistingFile);
428 if (fd.exec() != QDialog::Accepted)
return;
429 QStringList flst = fd.selectedFiles();
430 if (flst.isEmpty())
return;
431 bool iscint = fd.selectedNameFilter().contains(
".C");
432 bool ispyth = fd.selectedNameFilter().contains(
".py");
436 cmd = QString(
".x ") + flst[0];
440 cmd = QString(
"$") + flst[0];
445 cmd = QString(
".x ") + flst[0];
446 if(!cmd.endsWith(
".C")) cmd.append(
".C");
458 const QString cmd =
"@PrintHistograms()";
470 const QString cmd =
"@PrintConditions()";
495 AddLink(slot,
"ObjectUpdateCmd");
506 if (strcmp(linkname,
"ObjectUpdateCmd") == 0) {
517 if (strcmp(linkname,
"DebugOutput") == 0) {
519 TList *lst =
dynamic_cast<TList *
> (obj);
521 TListIter iter(lst, kFALSE);
523 while (
auto obj = iter()) {
524 if (obj == lst->First())
continue;
535 if (!
HasOutput() || (strcmp(linkname,
"DebugOutput") == 0))
550 QWidget *mdi = parentWidget();
void StartAnalysisShell(const char *cmd, const char *workdir=nullptr, bool aschildprocess=false)
QStringList getCommandsHistoryAnalysis()
void setCommandsHistoryAnalysis(const QStringList &commands)
void CreateCmdLine(QHBoxLayout *)
QStringList getHistory(int max=50)
void AddTimeStamp(QString &buf, int prio=0)
QGo4CommandsHistory * fxCmdHist
static void ExtractProgArgs(QString &prog, QStringList &args)
QString getTermTimeFormat()
void storePanelSize(QWidget *w, const QString &kind="ViewPanel")
const char * GetObjectFullName() const
void linkedObjectRemoved(const char *linkname) override
void closeEvent(QCloseEvent *e) override
void resizeEvent(QResizeEvent *) override
TClass * ItemClass(const char *name)
void linkedObjectUpdated(const char *linkname, TObject *obj) override
void enterPressedSingal()
void SetHistorySize(int sz)
virtual ~TGo4AnalysisWindow()
void WorkWithDebugOutput(TGo4Slot *slot)
virtual void ExecuteLine(const char *line)
bool getTermShowTimestamp()
void WorkWithUpdateObjectCmd(TGo4Slot *slot)
void ClearAnalysisOutput()
TGo4AnalysisWindow(QWidget *parent=nullptr, const char *name=nullptr, bool needoutput=false, bool needkillbtn=true)
void ScrollEndAnalysisOutput()
unsigned int fiMaxOuputSize
void UpdateTimeStampFormat()
void AppendOutputBuffer(const QString &value, int prio=0)
void updateTerminalOutput()
void CreateButtons(QHBoxLayout *, bool)
QProcess * fAnalysisProcess
void TerminateAnalysisProcess()
void SaveAnalysisOutput()
void WaitForNewObject(bool isobjectforeditor)