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>
45 setAcceptDrops(
false);
58 setWindowTitle(
"Analysis Terminal");
65 setWindowIcon(QIcon(
":/icons/analysiswin.png"));
66 QGridLayout* layout =
new QGridLayout(
this );
67 layout->setContentsMargins(11,11,11,11);
68 layout->setSpacing(6);
72 fxOutput->setAutoFormatting(QTextEdit::AutoNone);
73 fxOutput->setWordWrapMode(QTextOption::NoWrap);
82 QHBoxLayout *box1 =
new QHBoxLayout();
83 box1->addWidget(
new QLabel(
"Press enter to execute.",
this), 1);
85 layout->addLayout(box1, 1, 0);
87 QHBoxLayout *box2 =
new QHBoxLayout();
89 layout->addLayout(box2, 2, 0);
94 QHBoxLayout *box =
new QHBoxLayout(
this);
115 fxCmdHist->setToolTip(
"CINT command for analysis process. Note: '@' means 'TGo4Analysis::Instance()->' . A leading '$' will invoke Python script.");
117 fxCmdHist->setMinimumSize( QSize( 220, 25 ) );
125 QToolButton* MacroSearch =
new QToolButton(
this );
126 MacroSearch->setMinimumSize( QSize( 30, 25 ) );
127 MacroSearch->setMaximumSize( QSize( 30, 25 ) );
128 MacroSearch->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
129 MacroSearch->setIcon( QIcon(
":/icons/findfile.png" ) );
130 MacroSearch->setToolTip(
"Search root or python macro on disk.");
132 box->addWidget(MacroSearch,1);
138 QToolButton* KillProcess =
new QToolButton(
this );
139 KillProcess->setMinimumSize( QSize( 30, 25 ) );
140 KillProcess->setMaximumSize( QSize( 30, 25 ) );
141 KillProcess->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
142 KillProcess->setIcon( QIcon(
":/icons/killanal.png" ) );
143 KillProcess->setToolTip(
"Apply Ctrl+C in the analysis terminal.");
145 box->addWidget(KillProcess);
149 QToolButton* ClearButton =
new QToolButton(
this );
150 ClearButton->setMinimumSize( QSize( 30, 25 ) );
151 ClearButton->setMaximumSize( QSize( 30, 25 ) );
152 ClearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
153 ClearButton->setIcon( QIcon(
":/icons/clear.png" ) );
154 ClearButton->setToolTip(
"Clear Terminal Window.");
156 box->addItem(
new QSpacerItem(1,1));
157 box->addWidget(ClearButton,1);
159 QToolButton* ScrollEndButton =
new QToolButton(
this );
160 ScrollEndButton->setMinimumSize( QSize( 30, 25 ) );
161 ScrollEndButton->setMaximumSize( QSize( 30, 25 ) );
162 ScrollEndButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
163 ScrollEndButton->setIcon( QIcon(
":/icons/shiftdown.png" ) );
164 ScrollEndButton->setToolTip(
"Scroll to end of Terminal Window. (keyboard: end)");
166 box->addWidget(ScrollEndButton,1);
172 QToolButton* PrintHistoButton =
new QToolButton(
this );
173 PrintHistoButton->setMinimumSize( QSize( 30, 25 ) );
174 PrintHistoButton->setMaximumSize( QSize( 30, 25 ) );
175 PrintHistoButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
176 PrintHistoButton->setIcon( QIcon(
":/icons/hislist.png" ) );
177 PrintHistoButton->setToolTip(
"Print list of all histograms.");
178 connect(PrintHistoButton, SIGNAL(clicked()),
this, SLOT(
PrintHistograms()));
179 box->addWidget(PrintHistoButton,1);
181 QToolButton* PrintConnyButton =
new QToolButton(
this );
182 PrintConnyButton->setMinimumSize( QSize( 30, 25 ) );
183 PrintConnyButton->setMaximumSize( QSize( 30, 25 ) );
184 PrintConnyButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
185 PrintConnyButton->setIcon( QIcon(
":/icons/condlist.png" ) );
186 PrintConnyButton->setToolTip(
"Print list of all conditions.");
187 connect(PrintConnyButton, SIGNAL(clicked()),
this, SLOT(
PrintConditions()));
188 box->addWidget(PrintConnyButton,1);
190 QToolButton* PrintEventButton =
new QToolButton(
this );
191 PrintEventButton->setMinimumSize( QSize( 30, 25 ) );
192 PrintEventButton->setMaximumSize( QSize( 30, 25 ) );
193 PrintEventButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
194 PrintEventButton->setIcon( QIcon(
":/icons/zoom.png" ) );
195 PrintEventButton->setToolTip(
"Start Event Inspection panel");
196 connect(PrintEventButton, SIGNAL(clicked()),
this, SLOT(
PrintEvent()));
197 box->addWidget(PrintEventButton,1);
233 unsigned int outlen =
fxOutput->toPlainText().length();
240 else if (buflen >= cutlength)
244 fxOutput->moveCursor(QTextCursor::End);
248 QString curr =
fxOutput->toPlainText();
249 curr.remove(0, cutlength - buflen);
252 fxOutput->moveCursor(QTextCursor::End);
291 QString pre = prio>0 ?
"!":
"*";
292 QString format= QString(
"GO4-%1> [%2]\n").arg(pre).arg(
fxTimeFormat);
293 buf = QDateTime::currentDateTime().toString(format)+ buf;
315 int first = progname.indexOf(
"\"");
316 int last = progname.lastIndexOf(
"\"");
317 if ((first > 0) && (last > first)) {
318 quoted = progname.mid(first+1, last-first-1);
319 progname.resize(first);
322 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
323 args = progname.split(
" ",QString::SkipEmptyParts);
325 args = progname.split(
" ",Qt::SkipEmptyParts);
327 if (args.size() > 0) {
328 progname = args.front();
331 if (quoted.length() > 0)
332 args.push_back(quoted);
340 setWindowTitle(
"Analysis Terminal");
346 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
353 QString progname = text;
365 std::cerr <<
"Fatal error. Could not start the Analysis" << std::endl;
370 setWindowTitle(
"Analysis Terminal [with QProcess]");
372 #if QT_VERSION < QT_VERSION_CHECK(5,3,0)
373 setWindowTitle(QString(
"Analysis Terminal [pid:%1]").arg((qint64)
fAnalysisProcess->pid()));
375 setWindowTitle(QString(
"Analysis Terminal [pid:%1]").arg(
fAnalysisProcess->processId()));
405 fxOutput->moveCursor(QTextCursor::End);
414 "Save analysis terminal output",
415 "",
"Plain text (*.txt)");
416 fd.setFileMode( QFileDialog::AnyFile );
417 fd.setAcceptMode(QFileDialog::AcceptSave);
419 if (fd.exec() != QDialog::Accepted)
return;
421 QStringList flst = fd.selectedFiles();
422 if (flst.isEmpty())
return;
423 QString fileName = flst[0];
425 if(!fileName.endsWith(
".txt")) fileName.append(
".txt");
426 QFile NewFile(fileName);
427 NewFile.open( QIODevice::ReadWrite | QIODevice::Append );
428 QTextStream t( &NewFile );
429 t <<
fxOutput->toPlainText() <<
"\n";
436 if (cmd.length()==0)
return;
448 QFileDialog fd(
this,
449 "Select ROOT macro for analysis task",
450 "",
"CINT Macro(*.C);;Python script(*.py)");
451 fd.setFileMode( QFileDialog::ExistingFile);
453 if (fd.exec() != QDialog::Accepted)
return;
455 QStringList flst = fd.selectedFiles();
456 if (flst.isEmpty())
return;
458 bool iscint = fd.selectedNameFilter().contains(
".C");
459 bool ispyth = fd.selectedNameFilter().contains(
".py");
463 cmd = QString(
".x ") + flst[0];
467 cmd = QString(
"$") + flst[0];
472 cmd = QString(
".x ") + flst[0];
473 if(!cmd.endsWith(
".C")) cmd.append(
".C");
488 const QString cmd =
"@PrintHistograms()";
501 const QString cmd =
"@PrintConditions()";
527 AddLink(slot,
"ObjectUpdateCmd");
538 if (strcmp(linkname,
"ObjectUpdateCmd")==0) {
549 if (strcmp(linkname,
"DebugOutput")==0) {
551 TList* lst =
dynamic_cast<TList*
> (obj);
553 TListIter iter(lst, kFALSE);
556 while ((obj = iter()) != 0) {
557 if (obj == lst->First())
continue;
568 if (!
HasOutput() || (strcmp(linkname,
"DebugOutput")==0))
583 QWidget* mdi = parentWidget();
QStringList getCommandsHistoryAnalysis()
void setCommandsHistoryAnalysis(const QStringList &commands)
void CreateCmdLine(QHBoxLayout *)
QStringList getHistory(int max=50)
const char * GetObjectFullName() const
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")
virtual void resizeEvent(QResizeEvent *)
TClass * ItemClass(const char *name)
void StartAnalysisShell(const char *cmd, const char *workdir=0, bool aschildprocess=false)
virtual void closeEvent(QCloseEvent *e)
void SetHistorySize(int sz)
TGo4AnalysisWindow(QWidget *parent=0, const char *name=0, bool needoutput=false, bool needkillbtn=true)
virtual ~TGo4AnalysisWindow()
void WorkWithDebugOutput(TGo4Slot *slot)
virtual void ExecuteLine(const char *line)
bool getTermShowTimestamp()
void WorkWithUpdateObjectCmd(TGo4Slot *slot)
void ClearAnalysisOutput()
virtual void linkedObjectUpdated(const char *linkname, TObject *obj)
void ScrollEndAnalysisOutput()
virtual void linkedObjectRemoved(const char *linkname)
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)