16#include <QtCore/QString>
17#include <QtCore/QDateTime>
18#include <QtCore/QTimer>
19#include <QtCore/QProcess>
20#include <QtCore/QHash>
23#include <QApplication>
28#include <QActionGroup>
30#include <QStyleFactory>
33#include <QColorDialog>
36#include <QInputDialog>
37#include <QMdiSubWindow>
39#include <QDesktopServices>
54#include "TGo4LockGuard.h"
122 setWindowIcon(QIcon(
":/icons/go4logo2_big.png"));
158 auto h1 =
new TH1I(
"histo1",
"histo title", 100, -10., 10.);
159 h1->FillRandom(
"gaus",10000);
160 h1->SetDirectory(
nullptr);
165 gStyle->SetPalette(1);
166 gStyle->SetCanvasColor(10);
167 gStyle->SetPadColor(10);
168 gStyle->SetFrameFillColor(10);
169 gStyle->SetStatColor(0);
172 gStyle->SetOptStat(
go4sett->getOptStat());
175 fxMdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
176 fxMdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
180 menuBar()->setNativeMenuBar(
go4sett->getNativeMenuBar());
193 QDockWidget* BrowserDockWin =
new QDockWidget(
"Browser",
this);
194 BrowserDockWin->setObjectName(
"BrowserDock");
196 browser->setWindowFlags(Qt::Widget);
199 BrowserDockWin->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable);
200 BrowserDockWin->setWidget(browser);
201 BrowserDockWin->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
202 addDockWidget(Qt::LeftDockWidgetArea, BrowserDockWin);
204 QAction* BrowserDockAction = BrowserDockWin->toggleViewAction();
205 BrowserDockAction->setShortcut(QKeySequence(
"F6"));
207 QDockWidget* LogDockWin =
new QDockWidget(
"Log window",
this);
208 LogDockWin->setObjectName(
"LogInfoDock");
211 LogDockWin->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable);
212 LogDockWin->setWidget(loginfo);
213 LogDockWin->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
214 addDockWidget(Qt::BottomDockWidgetArea, LogDockWin);
216 QAction* LogDockWinAction=LogDockWin->toggleViewAction();
217 LogDockWinAction->setShortcut(QKeySequence(
"F7"));
219 QDockWidget* MBSDockWin =
new QDockWidget(
"MBS monitor",
this);
220 MBSDockWin->setObjectName(
"MbsViewerDock");
222 mbs->setWindowFlags(Qt::Widget);
224 MBSDockWin->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable);
225 MBSDockWin->setWidget(mbs);
226 MBSDockWin->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
227 addDockWidget(Qt::BottomDockWidgetArea, MBSDockWin);
229 QAction* MBSDockAction=MBSDockWin->toggleViewAction();
230 MBSDockAction->setShortcut(QKeySequence(
"F8"));
232 QToolBar* DividePanelBar = addToolBar(
"Canvas Tools");
233 DividePanelBar->setObjectName(
"DividePadDock");
235 DividePanelBar->addWidget(dividepanel);
237 QToolBar* stylebar = addToolBar(
"Color Tools");
238 stylebar->setObjectName(
"Go4StyleDock");
242 QToolBar* BrowserOptionsPanel = addToolBar(
"Browser Options");
243 BrowserOptionsPanel->setObjectName(
"BrowserOptionsDock");
246 BrowserOptionsPanel->addWidget(bropt);
249 QToolBar* DrawOptionPanel = addToolBar(
"Draw Options");
250 DrawOptionPanel->setObjectName(
"DrawOptionsDock");
252 DrawOptionPanel->addWidget(drawopt);
253 DrawOptionPanel->adjustSize();
255 QToolBar* DrawOptionShortPanel = addToolBar(
"Hist Draw Options");
256 DrawOptionShortPanel->setObjectName(
"HisDrawOptionsDock");
258 DrawOptionShortPanel->addWidget(drawopts);
259 DrawOptionShortPanel->adjustSize();
261 QToolBar* ScaleOptionBar = addToolBar(
"Zoom Tools");
262 ScaleOptionBar->setObjectName(
"ScaleOptionsDock");
265 ScaleOptionBar->addWidget(scopt);
266 ScaleOptionBar->adjustSize();
268 QToolBar* commandlinebar = addToolBar(
"Go4 Command Line");
269 commandlinebar->setObjectName(
"CommandLineDock");
272 commandlinebar->addWidget(cli);
274 QToolBar* tviewerdock = addToolBar(
"Tree viewer");
275 tviewerdock->setObjectName(
"TreeViewerDock");
278 tviewerdock->addWidget(tviewer);
298 menuBar()->addSeparator();
300 QMenu* helpMenu = menuBar()->addMenu(
"&Help");
304 helpMenu->addSeparator();
311 const char *libs = gSystem->Getenv(
"GO4USERLIBRARY");
314#if QT_VERSION < QT_VERSION_CHECK(5,14,0)
315 QStringList LibList = QString(libs).split(
":", QString::SkipEmptyParts);
317 QStringList LibList = QString(libs).split(
":", Qt::SkipEmptyParts);
320 for (
auto &lib : LibList)
321 gSystem->Load(lib.toLatin1().constData());
324 go4sett->restoreMainWindowState(
this);
326 QApplication::setStyle(
go4sett->getAppStyle());
338 std::cout <<
"Using Qt settings at "<<
go4sett->GetSettLoaction().toLatin1().constData() << std::endl;
340 statusBar()->showMessage(
"Ready");
341 statusBar()->setSizeGripEnabled(
true);
343 QString sfmt =
go4sett->getGStyleStatFormat();
344 if (!sfmt.isEmpty()) gStyle->SetStatFormat(sfmt.toLatin1().constData());
361 QMessageBox AboutDialog(QMessageBox::NoIcon, title, text, QMessageBox::Ok,
this);
362 AboutDialog.setIconPixmap(QPixmap(icon));
363 AboutDialog.setTextFormat(Qt::RichText);
369 QString GO4STR(
"Go4 ");
371 QString GO4STR1 = GO4STR;
372 GO4STR1.append(
"<br>");
373 GO4STR1.append(
"The Go4 (GSI Object Oriented On-line Off-line system) is based on ROOT<br> with the specific requirements of the low and medium energy nuclear and atomic<br> physics experiments implemented as extensions.<br> See <a href='http://go4.gsi.de'>http://go4.gsi.de</a> for more information");
380 QMessageBox::aboutQt(
this,
"Qt");
385 QString mestring(
"This Go4 uses ROOT ");
386 mestring.append(gROOT->GetVersion());
387 mestring.append(
"<br> ROOT is an object-oriented framework <br>for large scale scientific <br>data analysis and data mining.<br> It has been developed at CERN<br> See <a href='http://root.cern.ch'>http://root.cern.ch</a> for more information");
393 QString mestring(
"This Go4 uses DABC ");
397 mestring.append(
"<undef>");
398 mestring.append(
"<br>DABC (Data Acquisition Backbone Core) is <br> framework to build multi-threaded multi-node DAQ applications.<br> It is developed in GSI.<br> See <a href='http://dabc.gsi.de'>http://dabc.gsi.de</a> for more information");
404 QMenu* settMenu = menuBar()->addMenu(
"&Settings");
406 QMenu* sub = createPopupMenu();
407 sub->setTitle(
"Sh&ow/hide");
408 settMenu->addMenu(sub);
412 QMenu *styleMenu = settMenu->addMenu(
"St&yle");
414 QMenu* prefMenu = settMenu->addMenu(
"&Gui preferences");
439 QMenu* panelMenu = settMenu->addMenu(
"&Panel defaults");
482 QMenu* termMenu = settMenu->addMenu(
"&Terminal");
495 QActionGroup *ag =
new QActionGroup(
this);
496 ag->setExclusive(
true);
498 QStringList list = QStyleFactory::keys();
500 QHash<QString, int> stylesDict;
501 for (
auto styleStr : list) {
502 QString styleAccel = styleStr;
503 if ( stylesDict[styleAccel.left(1)] ) {
504 for (
int i = 0; i < styleAccel.length(); i++ ) {
505 if ( !stylesDict[styleAccel.mid( i, 1 )] ) {
506 stylesDict.insert(styleAccel.mid( i, 1 ), 1);
507 styleAccel = styleAccel.insert( i,
'&' );
512 stylesDict.insert(styleAccel.left(1), 1);
513 styleAccel =
"&"+styleAccel;
515 QAction *act =
new QAction(styleAccel,
this);
516 act->setCheckable(
true);
517 act->setChecked(
go4sett->getAppStyle() == styleStr);
519 QObject::connect(act, &QAction::triggered, [&, styleStr]() {
SetStyleSlot(styleStr); });
522 styleMenu->addAction(act);
526#define CtrlKey(key) ((int)Qt::CTRL | key)
531 QMenu* fileMenu = menuBar()->addMenu(
"&File");
533 fileMenu->addAction(QIcon(
":/icons/open.png" ),
"&Open...",
535 fileMenu->addAction(QIcon(
":/icons/network.png" ),
"Open &Remote...",
538 fileMenu->addAction(QIcon(
":/icons/dabc.png" ),
"Connect &DABC...",
540 fileMenu->addAction(QIcon(
":/icons/http.png" ),
"Connect &HTTP...",
542 fileMenu->addAction(QIcon(
":/icons/histserv.png" ),
"Open HIST &Server...",
544 fileMenu->addAction(QIcon(
":/icons/hiscre.png" ),
"&Import histograms...",
547 fileMenu->addAction(QIcon(
":/icons/filesave.png" ),
"Save memor&y...",
549 fileMenu->addAction(QIcon(
":/icons/close.png" ),
"Close all files",
551 fileMenu->addAction(QIcon(
":/icons/exit.png" ),
"E&xit",
552 this, &TGo4MainWindow::close)->setShortcut(
CtrlKey(Qt::Key_X));
557 QToolBar *FileBar = addToolBar(
"File Toolbar" );
558 FileBar->setObjectName(
"FileToolBar");
560 FileBar->addAction( QIcon(
":/icons/open.png" ),
"Open a local file from disk",
563 FileBar->addAction( QIcon(
":/icons/network.png" ),
"Open a remote file from server",
567 FileBar->addAction( QIcon(
":/icons/dabc.png" ),
"Connect to DABC server",
570 FileBar->addAction( QIcon(
":/icons/http.png" ),
"Connect to HTTP server",
573 FileBar->addAction( QIcon(
":/icons/histserv.png" ),
"Connect to running histogram server",
576 FileBar->addAction( QIcon(
":/icons/filesave.png" ),
"Save the content of the browser to a root file",
579 FileBar->addAction( QIcon(
":/icons/close.png" ),
"Close all root files in file browser",
582 FileBar->addAction( QIcon(
":/icons/exit.png" ),
"Exit the Go4",
583 this, &TGo4MainWindow::close);
588 QMenu* toolMenu = menuBar()->addMenu(
"&Tools");
590 toolMenu->addAction(QIcon(
":/icons/chart.png" ),
"&View panel",
592 toolMenu->addAction(QIcon(
":/icons/fitpanel.png" ),
"&Fit panel...",
594 toolMenu->addAction(QIcon(
":/icons/hislist.png" ),
"&Histogram properties...",
596 toolMenu->addAction(QIcon(
":/icons/hiscre.png" ),
"Create New H&istogram...",
598 toolMenu->addAction(QIcon(
":/icons/condlist.png" ),
"C&ondition properties...",
600 toolMenu->addAction(QIcon(
":/icons/condcre.png" ),
"Create new &condition...",
602 toolMenu->addAction(QIcon(
":/icons/zoom.png" ),
"&Event printout...",
604 toolMenu->addAction(QIcon(
":/icons/dynlist.png" ),
"Create &dyn. list entry ...",
606 toolMenu->addAction(QIcon(
":/icons/dllicon.png" ),
"Load li&braries ...",
608 toolMenu->addAction(QIcon(
":/icons/user.png" ),
"&User GUI ...",
614 QToolBar *ToolBar = addToolBar(
"Go4 tools");
615 ToolBar->setObjectName(
"Go4ToolsBar");
617 ToolBar->addAction( QIcon(
":/icons/chart.png" ),
"Create a new view panel",
620 ToolBar->addAction( QIcon(
":/icons/fitpanel.png" ),
"Show/hide the Go4 Fit Panel",
623 ToolBar->addAction( QIcon(
":/icons/hislist.png" ),
"Show histogram properties window",
626 ToolBar->addAction( QIcon(
":/icons/hiscre.png" ),
"Create new ROOT Histogram",
629 ToolBar->addAction( QIcon(
":/icons/condlist.png" ),
"Show condition properties window",
632 ToolBar->addAction( QIcon(
":/icons/condcre.png" ),
"Create new condition in analysis",
635 ToolBar->addAction( QIcon(
":/icons/zoom.png" ),
"Event printout and examination window",
638 ToolBar->addAction( QIcon(
":/icons/dynlist.png" ),
"Create new Dynamic list entry",
641 ToolBar->addAction( QIcon(
":/icons/dllicon.png" ),
"Load Libraries",
644 ToolBar->addAction( QIcon(
":/icons/user.png" ),
"Start user panel",
650 QMenu* anMenu = menuBar()->addMenu(
"&Analysis");
653 anMenu->addAction(QIcon(
":/icons/launchanal.png"),
"Lau&nch analysis...", [
this]() {
LaunchClient(); });
656 anMenu->addAction(QIcon(
":/icons/connect.png"),
"&Connect to running server...", [
this]() {
ConnectServer(); });
659 faPrepareAnal = anMenu->addAction(QIcon(
":/icons/connect.png"),
"&Prepare for client connection...",
662 faDisconnectAnal = anMenu->addAction(QIcon(
":/icons/disconnect.png"),
"Disconnect from analysis",
666 faShutdownAnal = anMenu->addAction(QIcon(
":/icons/shutanal.png"),
"Shutdown analysis",
680 faAnalConfig = anMenu->addAction(QIcon(
":/icons/control.png"),
"Confi&guration...",
this,
684 faAnalTermin = anMenu->addAction(QIcon(
":/icons/analysiswin.png"),
"Analysis &Window",
this,
691 QToolBar *AnalBar = addToolBar(
"Analysis Toolbar");
692 AnalBar->setObjectName(
"AnalysisToolBar");
693 AnalBar->setToolTip(
"Analysis related tool buttons");
713 bool on = !
fxMdiArea->subWindowList().isEmpty();
717 windowsMenu->addAction(
"&Close all",
fxMdiArea, &TGo4MdiArea::closeAllSubWindows)->setEnabled(on);
729 windowsMenu->addAction(
"Save L&ogwindow")->setEnabled(
false);
730 windowsMenu->addAction(
"Clear &Logwindow")->setEnabled(
false);
738 windowsMenu->addAction(
"Save &Analysis window")->setEnabled(
false);
739 windowsMenu->addAction(
"Clear Analysis &window")->setEnabled(
false);
744 QList<QMdiSubWindow *> windows =
fxMdiArea->subWindowList();
745 for (
int i = 0; i < windows.count(); i++) {
746 QAction *act =
new QAction(windows.at(i)->widget()->windowTitle(),
this);
747 act->setCheckable(
true);
748 act->setChecked(
fxMdiArea->activeSubWindow() == windows.at(i));
752 QObject::connect(act, &QAction::triggered, [
this, i]() {
WindowActivated(i); });
758 QList<QMdiSubWindow *> windows =
fxMdiArea->subWindowList();
759 for (
int i = 0; i < windows.count(); i++ )
760 windows.at(i)->widget()->showMinimized();
765 QList<QMdiSubWindow *> windows =
fxMdiArea->subWindowList();
769 for (
int i = 0; i < windows.count(); i++ ) {
770 windows.at(i)->move(x, y);
778 else showFullScreen();
784 QList<QMdiSubWindow *> windows =
fxMdiArea->subWindowList();
785 if ((
id >= 0) && (
id < windows.count())) {
786 windows.at(
id)->widget()->showNormal();
787 windows.at(
id)->widget()->setFocus();
791typedef void *(*TStartUserGuiFunc)(QWidget *parent);
795 QString dirname, libname;
799 if (usergui && (strlen(usergui) > 0)) {
800 QFileInfo info(usergui);
803 dirname = info.path();
804 libname = info.fileName();
805 }
else if (info.isDir()) {
809 if ((dirname.length()>0) && (dirname[dirname.length()-1]!=
'/')) dirname+=
"/";
812 bool defaultnames = libname.isEmpty();
814 libname =
"libGo4UserGui";
818 libname = dirname + libname;
820 std::cout <<
"Try usergui: " << libname.toLatin1().constData() << std::endl;
824 if (gSystem->Load(libname.toLatin1().constData()) >= 0) {
826 startfunc = (
TStartUserGuiFunc) gSystem->DynFindSymbol(libname.toLatin1().constData(),
"StartUserPanel");
832 userpanel->setObjectName(
"UserPanel");
834 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(userpanel);
837 userpanel->ensurePolished();
841 StatusMessage(
"StartUserPanel() function did not create user widget");
845 std::cout <<
"Start user GUI from ";
846 if (dirname.length()>0)
847 std::cout << dirname.toLatin1().constData() << std::endl;
849 std::cout <<
"$LD_LIBRARY_PATH=" << gSystem->Getenv(
"LD_LIBRARY_PATH") << std::endl;
851 if (loaded) gSystem->Unload(libname.toLatin1().constData());
860 if (userpanel)
return;
863 if (gSystem->Getenv(
"GO4USERGUI"))
864 if (
startUserGUI(gSystem->Getenv(
"GO4USERGUI")))
return;
871 if (
go4sett->getWebBasedCanvas())
878 QMessageBox::critical(
this,
"Starting user GUI",
"No suitable libraries found");
890 name = QString(
"Panel") + QString::number(n);
891 }
while (edslot && edslot->
FindChild(name.toLatin1().constData()));
894 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(panel);
898 sub->resize(
go4sett->lastPanelSize(
"ViewPanel"));
905 panel->ensurePolished();
910 int DivX = 1, DivY = 1;
912 TGo4DividePad* divpad = findChild<TGo4DividePad*>(
"DividePad");
915 DivX = divpad->SpinBoxX->value();
916 DivY = divpad->SpinBoxY->value();
918 if (DivX * DivY < ndiv) {
919 DivX = (int) TMath::Sqrt(ndiv*1.);
921 while (DivX*DivY<ndiv) DivY++;
923 panel->
Divide(DivX, DivY);
936 if (newx + sub->width() >
fxMdiArea->width()) newx = 0;
937 if (newy + sub->height() >
fxMdiArea->height()) newy = 0;
938 sub->move(newx, newy);
948 if(QMessageBox::question(
this,
"Go4 GUI",
"Really Exit Go4?",
949 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) != QMessageBox::Yes) {
955 if (panel) panel->close();
963 bool realshutdown =
false;
973 statusBar()->showMessage(
"Exit.... please wait");
974 QApplication::setOverrideCursor(Qt::WaitCursor);
978 statusBar()->showMessage(
"Closing GUI...");
999 QMessageBox box(QMessageBox::Critical,
"Exit GUI",
"Analysis is not (yet) shutdown correctly");
1000 auto wait_btn = box.addButton(
"Wait 10 s more", QMessageBox::AcceptRole);
1001 auto kill_btn = box.addButton(
"Kill analysis", QMessageBox::DestructiveRole);
1002 auto exit_btn = box.addButton(
"Exit immediately", QMessageBox::DestructiveRole);
1003 auto cancel_btn = box.addButton(
"Cancel quit", QMessageBox::RejectRole);
1004 box.setDefaultButton(wait_btn);
1008 if (box.clickedButton() == wait_btn) {
1014 if ((box.clickedButton() == cancel_btn) || !box.clickedButton()) {
1015 std::cout <<
"Keep GUI running, press exit once again" << std::endl;
1019 if (box.clickedButton() == kill_btn) {
1020 std::cout <<
"Killing analysis" << std::endl;
1024 if (box.clickedButton() == exit_btn) {
1025 std::cout <<
"GUI closed with analysis still running - may lead to analysis task running forever" << std::endl;
1026 std::cout <<
"Please check running processes with \"ps\" and probably, kill analysis with \"killall go4analysis\" command" << std::endl;
1029 std::cout <<
"----- Exiting Go4 GUI now -----" << std::endl;
1035 QFileDialog fd(
this,
1036 "Select a ROOT file to open it in the Go4 Disk Browser",
1038 QString(
"Root files (*.root);;Root xml files (*.xml);;All files (*.*)"));
1040 fd.setFileMode( QFileDialog::ExistingFiles);
1042 if (fd.exec() != QDialog::Accepted)
return;
1044 QStringList list = fd.selectedFiles();
1045 for (
auto &fileName : list) {
1054 QFileDialog fd(
this,
1055 "Select a file for importing histogram objects",
1057 QString(
"ASCII/Go4 (*.hdat);;Ortec MCA (*.Spe);;All files (*.*)"));
1059 fd.setFileMode(QFileDialog::ExistingFiles);
1060 if (fd.exec() != QDialog::Accepted)
1063 QStringList list = fd.selectedFiles();
1064 for(
auto &fileName : list) {
1067 QFileInfo(fileName).absolutePath().toLatin1().constData(),
1068 fd.selectedNameFilter().toLatin1().constData());
1076 if (fd.exec() != QDialog::Accepted)
1083 if(ftype.contains(
"root:"))
1084 urlpath =
"root://" + host +
"/";
1086 if (ftype.contains(
"rfio:")) {
1088 urlpath=
"rfio:" + host +
":/";
1092 if (ftype.contains(
"http:")) {
1094 urlpath=
"http://" + host +
"/";
1101 if(!fileName.isEmpty() && !fileName.contains(
".root"))
1102 fileName.append(
".root");
1104 fileName = urlpath + fileName;
1106 fxOM->AddFile(
fOMDataPath.toLatin1().constData(), fileName.toLatin1().constData());
1112 QString dabcnode = QInputDialog::getText(
1113 this,
"Establish connection with DABC",
"Provide dabc server name",
1114 QLineEdit::Normal, QString(), &ok);
1117 if (!
Browser()->ConnectDabc(dabcnode.toLatin1().constData()))
1118 QMessageBox::warning(
this,
"DABC server",
"Cannot connect to DABC server");
1133 QString fulladdress =
go4sett->getClientNode().append(QString(
":")).append(portstring.setNum(
go4sett->getClientPort()));
1134 httpaddr = QInputDialog::getText(
1135 this,
"Establish connection with HTTP",
"Provide http server name",
1136 QLineEdit::Normal, fulladdress, &ok);
1137 if (!ok)
return nullptr;
1138 QStringList nameportlist = httpaddr.split(
":");
1141 if(nameportlist.at(0).contains(
"http")) {
1146 if(nameportlist.size()<portindex+1 || nameportlist.at(portindex).isEmpty()){
1147 QMessageBox::warning(
this,
"HTTP server connection",
"Could not connect. Please specify port number!");
1150 QString host = nameportlist.at(nameindex);
1151 QStringList hostnamelist = nameportlist.at(nameindex).split(
"//");
1152 if(hostnamelist.size()>1) host = hostnamelist.at(1);
1154 go4sett->setClientPort(nameportlist.at(portindex).toInt());
1155 go4sett->setClientConnectMode(1);
1163 if (!exec)
return nullptr;
1167 if (serv)
StatusMessage(QString(
"Connect with http server %1 %2").arg(httpaddr).arg(serv->
IsGo4Analysis() ?
" as GO4 analysis" :
""));
1187 dlg.ServerName->setText(
go4sett->getHServName());
1188 dlg.BaseName->setText(
go4sett->getHServBase());
1189 dlg.FilterList->setText(
go4sett->getHServFilter());
1190 dlg.PortNumberSpin->setValue(
go4sett->getHServPort());
1192 if (dlg.exec() != QDialog::Accepted)
return;
1194 go4sett->setHServName(dlg.ServerName->text());
1195 go4sett->setHServBase(dlg.BaseName->text());
1196 go4sett->setHServFilter(dlg.FilterList->text());
1197 go4sett->setHServPort(dlg.PortNumberSpin->value());
1199 if (!
Browser()->ConnectHServer(dlg.ServerName->text().toLatin1().constData(),
1200 dlg.PortNumberSpin->value(),
1201 dlg.BaseName->text().toLatin1().constData(),
1202 dlg.UserPassEdt->text().toLatin1().constData(),
1203 dlg.FilterList->text().toLatin1().constData()))
1204 QMessageBox::warning(
this,
"HServer",
"Cannot connect to histogram server");
1209 QFileDialog fd(
this,
1210 go4sett->getFetchDataWhenSave() ?
1211 "Select root file to fetch and export all browser objects" :
1212 "Select root file to export all local browser objects",
1215 fd.setFileMode( QFileDialog::AnyFile);
1216 fd.setAcceptMode(QFileDialog::AcceptSave);
1217 fd.selectFile(
"export.root");
1219 if (fd.exec() != QDialog::Accepted)
return;
1221 QStringList flst = fd.selectedFiles();
1222 if (flst.isEmpty())
return;
1224 QString fname = flst[0];
1226 if (fname.indexOf(
".root", 0, Qt::CaseInsensitive)<0) fname +=
".root";
1228 if (!
Browser()->SaveBrowserToFile(fname.toLatin1().constData(),
go4sett->getFetchDataWhenSave()))
1229 QMessageBox::warning(
this,
"Save data to file",
"Specified file can not be created");
1239 int size =
go4sett->getTermHistorySize();
1243 size = QInputDialog::getInt(
this,
1244 "Analysis terminal history size in bytes (minimum 10000 bytes)",
1245 "Input 0 if full analysis history should be preserved",
1246 size, 0, 100000000, 10000, &ok);
1248 if ((size > 0) && (size < 10000)) size = 10000;
1251 go4sett->setTermHistorySize(size);
1261 if (dlg.exec() != QDialog::Accepted)
return;
1263 if(dlg.LogfileWrite->isChecked())
1264 TGo4Log::OpenLogfile(dlg.LogfileName->text().toLatin1().constData(),
"Logfile for Go4 GUI",
true);
1274 QApplication::setOverrideCursor( Qt::WaitCursor );
1278 bool result = QDesktopServices::openUrl(QUrl::fromLocalFile(surl));
1281 StatusMessage(msg ? QString(msg) : QString(
"Show ") + filename);
1285 QApplication::restoreOverrideCursor();
1290 HelpWindow(
"docs/Go4Introduction.pdf",
"Show Go4 Introduction manual...");
1295 HelpWindow(
"docs/Go4Reference.pdf",
"Show Go4 Reference manual...");
1300 HelpWindow(
"docs/Go4FitTutorial.pdf",
"Show Go4 Fit tutorial...");
1306 go4sett->setAppFont(QApplication::font());
1308 go4sett->setAppStyle(QApplication::style()->objectName());
1310 go4sett->storeMainWindowState(
this);
1314 std::cout <<
"Save Qt settings to " <<
go4sett->GetSettLoaction().toLatin1().constData() << std::endl;
1320 QFont font= QFontDialog::getFont(&ok, QApplication::font(),
this);
1325 QApplication::setFont(font);
1331 QFont font= QFontDialog::getFont(&ok,
go4sett->getTermFont(),
this);
1337 if (anw) anw->setFont(font);
1343 go4sett->setTermShowTimestamp(flag);
1352 QString str = QInputDialog::getText(
this,
"Analysis terminal timestamp format",
1353 "Time format (empty resets to yyyy-MM-dd hh:mm:ss.zzz)",
1354 QLineEdit::Normal,
go4sett->getTermTimeFormat(), &ok);
1357 str =
"yyyy-MM-dd hh:mm:ss.zzz";
1358 go4sett->setTermTimeFormat(str);
1371 QApplication::setStyle(style);
1376 QString output = QDateTime::currentDateTime().toString(Qt::ISODate);
1377 output.append(
": ");
1378 output.append(mess);
1379 statusBar()->showMessage(output, 0);
1392 QString capt =
"Go4 ";
1395 capt += gSystem->HostName();
1401 setWindowTitle(capt);
1404 if (!pr) flag = !ht ?
true:
false;
1420 flag = !ht ? true :
false;
1428 flag = !ht ? false :
true;
1438 bool iscontrolling =
false, issubmit =
false;
1455 if (!go4_serv && root_serv) {
1463 go4sett->setFetchDataWhenDraw(flag);
1468 go4sett->setFetchDataWhenCopy(flag);
1473 go4sett->setFetchDataWhenSave(flag);
1478 go4sett->setHideTGo4EventElement(flag);
1484 go4sett->setDrawOnceFlag(flag);
1489 go4sett->setMoveSubwindowRubberBand(flag);
1494 go4sett->setNativeMenuBar(flag);
1495 menuBar()->setNativeMenuBar(flag);
1498 QMessageBox::information(
this,
"Change menu type",
1499 "On platforms like MacOS changing of menu type may require restart of application");
1505 QColor c = QColorDialog::getColor();
1507 go4sett->setCanvasColor(c.red(), c.green(), c.blue());
1513 if (mset.exec() != QDialog::Accepted)
return;
1526 go4sett->setPadSuperimpose(flag);
1531 go4sett->setPadCrosshair(flag);
1536 go4sett->setPadEventStatus(flag);
1549 go4sett->setDrawTimeFlag(flag);
1554 go4sett->setDrawItemFlag(flag);
1559 go4sett->setDrawDateFlag(flag);
1564 go4sett->setSavePadWhiteBackground(flag);
1569 int w =
go4sett->getDrawLineWidth();
1573 w = QInputDialog::getInt(
this,
1574 "Default line width for object drawing",
1575 "Input 1 to preserve default value",
1578 if (ok)
go4sett->setDrawLineWidth(w);
1584 int w =
go4sett->getDrawFillColor();
1588 w = QInputDialog::getInt(
this,
1589 "Default fill color for 1D objects (histogram and graph) drawing",
1590 "Input 0 for no fill",
1593 if (ok)
go4sett->setDrawFillColor(w);
1598 int w =
go4sett->getDrawFillStyle();
1602 w = QInputDialog::getInt(
this,
1603 "Default fill style for 1D objects (histogram and graph) drawing",
1604 "Input 1001 for solid fill",
1605 w, 0, 4000, 1, &ok);
1607 if (ok)
go4sett->setDrawFillStyle(w);
1614 QString str = QInputDialog::getText(
this,
1615 "Default draw options for TH1 class",
1616 "Input draw options",
1617 QLineEdit::Normal,
go4sett->getTH1DrawOpt(), &ok);
1618 if (ok)
go4sett->setTH1DrawOpt(str);
1624 QString str = QInputDialog::getText(
this,
1625 "Default draw options for TH2 class",
1626 "Input draw options",
1627 QLineEdit::Normal,
go4sett->getTH2DrawOpt(), &ok);
1628 if (ok)
go4sett->setTH2DrawOpt(str);
1634 QString str = QInputDialog::getText(
this,
1635 "Default draw options for TH3 class",
1636 "Input draw options",
1637 QLineEdit::Normal,
go4sett->getTH3DrawOpt(), &ok);
1638 if (ok)
go4sett->setTH3DrawOpt(str);
1644 QString str = QInputDialog::getText(
this,
1645 "Default draw options for TGraph class",
1646 "Input draw options",
1647 QLineEdit::Normal,
go4sett->getTGraphDrawOpt(), &ok);
1649 go4sett->setTGraphDrawOpt(str);
1656 QString s0 =
go4sett->getGStyleStatFormat();
1657 if (s0.isEmpty()) s0 = gStyle->GetStatFormat();
1659 QString str = QInputDialog::getText(
this,
1660 "Printf argument for float values - gStyle->GetStatFormat()",
1661 "Input format string like 6.4g (empty - ROOT default)",
1662 QLineEdit::Normal, s0, &ok);
1664 go4sett->setGStyleStatFormat(str);
1666 gStyle->SetStatFormat();
1668 gStyle->SetStatFormat(str.toLatin1().constData());
1677 int min = 0, def = 0, max = 0;
1678 go4sett->getPaletteOpt(min, def, max);
1679 QString palvals = QString(
"%1:%2:%3").arg(min).arg(def).arg(max);
1680 QString str = QInputDialog::getText(
this,
1681 "Default Palette options",
1682 "Input - MinIndex:DefaultIndex:MaxIndex",
1683 QLineEdit::Normal, palvals, &ok);
1685 QStringList parts=str.split(
":");
1686 min=parts[0].toInt();
1687 def=parts[1].toInt();
1688 max=parts[2].toInt();
1690 go4sett->setPaletteOpt(min,def,max);
1692 fxStyle->SetPaletteRange(min,def,max);
1699 double w =
go4sett->getScreenScaleFactor();
1703 w = QInputDialog::getDouble(
this,
"HighDPI scaling",
"Please set scale factor. Restart GUI to apply!", w, 0, 50, 1,
1706 go4sett->setScreenScaleFactor(w);
1713 QMessageBox::warning(
this,
"Launch analysis",
"Please disconnect analysis first");
1719 if (dlg.exec()!=QDialog::Accepted)
return;
1723 int shellmode =
go4sett->getClientShellMode();
1724 int termmode =
go4sett->getClientTermMode();
1725 int isserver =
go4sett->getClientIsServer();
1727 TString launchcmd, killcmd;
1728 Bool_t res = kFALSE;
1730 QString workdir =
go4sett->getClientDir();
1735 QString addr = QString(
"%1:%2").arg(
go4sett->getClientNode()).arg(
go4sett->getClientPort());
1739 if (
ConnectHttpServer(addr.toLatin1().constData(),
nullptr,
nullptr,
false,
true)) {
1741 std::cout<<
"!!! Connected to existing analysis webserver "<<addr.toLatin1().constData()<<
"!!! "<<std::endl;
1746 2, shellmode, termmode,
1747 go4sett->getClientName().toLatin1().constData(),
1748 go4sett->getClientNode().toLatin1().constData(),
1749 workdir.toLatin1().constData(),
1750 go4sett->getClientExec().toLatin1().constData(),
1753 go4sett->getClientArgs().toLatin1().constData());
1759 if ((termmode==2) || (termmode==3)) {
1760 gSystem->Exec(launchcmd.Data());
1763 anw->
StartAnalysisShell(launchcmd.Data(), (shellmode == 0) ? workdir.toLatin1().constData() :
nullptr,
true);
1774 if (isserver == 0) {
1780 go4sett->getClientName().toLatin1().constData(),
1781 go4sett->getClientNode().toLatin1().constData(),
1782 workdir.toLatin1().constData(),
1783 go4sett->getClientExec().toLatin1().constData(),
1785 go4sett->getClientArgs().toLatin1().constData());
1787 if (res && anw && (termmode==1)) {
1788 anw->
StartAnalysisShell(launchcmd.Data(), (shellmode == 0) ? workdir.toLatin1().constData() :
nullptr,
false);
1795 go4sett->getClientName().toLatin1().constData(),
1796 go4sett->getClientNode().toLatin1().constData(),
1798 workdir.toLatin1().constData(),
1799 go4sett->getClientExec().toLatin1().constData(),
1801 go4sett->getClientArgs().toLatin1().constData());
1811 if ((isserver == 1) && interactive) {
1820 if (ana && interactive)
1821 QMessageBox::information(
this,
"Prepare for client connection",
1822 QString(
"Now you can start client from other shell (node) and connect to port ") + QString::number(ana->
ConnectorPort()));
1829 if (force_recreate || (anw->
HasOutput() && !needoutput)) {
1837 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(anw);
1838 sub->resize(
go4sett->lastPanelSize(
"AnalysisWindow", 700, 500));
1841 anw->ensurePolished();
1844 QToolBar* dock = addToolBar(
"Analysis control");
1845 dock->setObjectName(
"AnalysisControlBar");
1848 dock->addWidget(anw);
1861 if (!serv || (
dynamic_cast<TGo4AnalysisProxy *
>(serv) !=
nullptr) || (serv->DebugOutputSlot() ==
nullptr))
return;
1866 if (anw->HasLink())
return;
1872 if (anw) anw->WorkWithDebugOutput(serv->DebugOutputSlot());
1873 serv->ResetDebugOutputRequests();
1879 const char *analisysitem =
"Analysis";
1885 fxOM->AddProxy(
fOMDataPath.toLatin1().constData(), anal, analisysitem,
"Analysis proxy");
1893 if (!anal)
return nullptr;
1912 if (anw->HasOutput() && !needoutput) {
1954 bool shouldexists =
false;
1958 shouldexists =
true;
1960 shouldexists =
true;
1964 if (shouldexists && !anw) {
1983 statusBar()->addWidget(status);
1988 }
else if (level == 0) {
1991 statusBar()->removeWidget(status);
2011 delete conf->parentWidget();
2014 }
else if (level >= 2) {
2017 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(conf);
2042 QMessageBox::warning(
this,
"Connect client",
"Analysis task is already connected");
2047 QString pass = password;
2052 if (dlg.exec()!=QDialog::Accepted)
return;
2057 if(
go4sett->getClientConnectMode() == 0) {
2059 bool def =
go4sett->getClientDefaultPass();
2065 go4sett->getClientControllerMode(),
2066 def ?
nullptr : pass.toLatin1().constData());
2067 StatusMessage(
"Connecting running analysis.... Please wait");
2074 QString fulladdress =
go4sett->getClientNode();
2075 if ((
go4sett->getClientPort() > 0) && (
go4sett->getClientPort() != 80)) {
2077 portstring.setNum(
go4sett->getClientPort());
2078 fulladdress.append(
":");
2079 fulladdress.append(portstring);
2081 QString msg(
"Connecting analysis http server at ");
2082 msg.append(fulladdress).append(QString(
", Please wait"));
2085 go4sett->getClientAccountName().toLatin1().constData(),
2086 pass.toLatin1().constData(),
false,
false);
2147 QMessageBox msgBox(QMessageBox::Warning,
2148 "Disconnect from analysis",
2149 "Analysis runs inside go4 widget.\n"
2150 "If one only disconnects from the analysis,\n"
2151 "it remains invisible and difficult to stop.\n"
2152 "To shutdown it later, one need to reconnect with go4 gui again.\n"
2153 "It is recommended to shutdown analysis now");
2155 auto btnShutdown = msgBox.addButton(
"Shutdown", QMessageBox::DestructiveRole);
2156 auto btnDisconnect = msgBox.addButton(
"Disconnect", QMessageBox::ActionRole);
2157 auto btnCancel = msgBox.addButton(
"Cancel", QMessageBox::RejectRole);
2158 msgBox.setDefaultButton(btnShutdown);
2161 if (msgBox.clickedButton() == btnCancel)
2163 else if (msgBox.clickedButton() == btnShutdown)
2165 else if (msgBox.clickedButton() == btnDisconnect)
2168 QMessageBox msgBox(QMessageBox::Question,
"Disconnect analysis",
"Really disconnect from analysis task?");
2170 auto btnDisconnect = msgBox.addButton(
"Disconnect", QMessageBox::DestructiveRole);
2171 auto btnCancel = msgBox.addButton(
"Cancel", QMessageBox::RejectRole);
2172 msgBox.setDefaultButton(btnDisconnect);
2175 if (msgBox.clickedButton() == btnCancel)
2186 QMessageBox msgBox(QMessageBox::Question,
"Shutdown analysis",
"Really shutdown analysis task?");
2188 auto btnShutdown = msgBox.addButton(
"Shutdown", QMessageBox::DestructiveRole);
2189 auto btnCancel = msgBox.addButton(
"Cancel", QMessageBox::RejectRole);
2190 msgBox.setDefaultButton(btnShutdown);
2193 if (msgBox.clickedButton() == btnCancel)
2198 bool realshutdown =
false;
2215 if (!serv)
return false;
2221 StatusMessage(
"Press Ctrl+S or choose Analysis->Start from the Menu to start the analysis");
2246 if (cmd.Length() > 0) {
2248 StatusMessage(TString::Format(
"Submit %s command to the server", cmd.Data()).Data());
2263 if (cmd.Length()>0) {
2265 StatusMessage(TString::Format(
"Submit %s command to the server", cmd.Data()).Data());
2274 QMessageBox msgBox(QMessageBox::Question,
"Kill analysis process",
2275 QString(
"Kill analysis by shell command: ") +
fKillCommand +
" ?");
2277 auto btnKill = msgBox.addButton(
"Kill", QMessageBox::DestructiveRole);
2278 auto btnCancel = msgBox.addButton(
"Cancel", QMessageBox::RejectRole);
2279 msgBox.setDefaultButton(btnKill);
2282 if (msgBox.clickedButton() == btnCancel)
2299 QProcess* killprocess =
new QProcess;
2303 killprocess->start(progname, args);
2304 QTimer::singleShot(10000, killprocess, &QProcess::deleteLater);
2306 StatusMessage(
"Can not kill analysis. Do it by OS commands");
2315 if (!
fxOM)
return nullptr;
2320 if (!widgslot)
return nullptr;
2325 if (widg && activate) {
2326 if(!widg->isVisible()){
2342 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(fitpanel);
2345 fitpanel->ensurePolished();
2348 fitpanel->parentWidget()->showNormal();
2349 fitpanel->setFocus();
2359 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(hinfo);
2362 hinfo->ensurePolished();
2363 hinfo->adjustSize();
2374 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(cinfo);
2377 cinfo->ensurePolished();
2378 cinfo->adjustSize();
2405 if (!cl->IsLoaded()) {
2406 QMessageBox::warning(
nullptr,
"Parameter editor", QString(
"Cannot start parameter editor for incomplete class ") + cl->GetName());
2413 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(pedit);
2415 pedit->ensurePolished();
2432 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(dedit);
2435 dedit->ensurePolished();
2447 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(wedit);
2450 wedit->ensurePolished();
2462 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(einfo);
2465 einfo->ensurePolished();
2480 QWidget *mdi = conf ? conf->parentWidget() :
nullptr;
2485 if (mdi->isVisible()) {
2497 if (mdi->isMinimized())
2513 QWidget *mdi = anw->parentWidget();
2515 if (mdi->isVisible()) {
2520 if (mdi->isMinimized()) mdi->showNormal();
2523 QToolBar* dock =
dynamic_cast<QToolBar*
> (anw->parentWidget());
2524 if (dock->isVisible())
2537 anw->parentWidget()->close();
2539 QToolBar* bar =
dynamic_cast<QToolBar*
> (anw->parentWidget());
2555 if (mbs->parentWidget()->isVisible()) {
2556 mbs->parentWidget()->hide();
2559 mbs->parentWidget()->show();
2567 QList<QMdiSubWindow *> windows =
fxMdiArea->subWindowList();
2568 for (
int i = 0; i < windows.count(); ++i) {
2575 QMdiSubWindow* sub =
fxMdiArea->AddGo4SubWindow(scl);
2577 scl->ensurePolished();
2580 scl->parentWidget()->close();
2594 if (dlg.exec() != QDialog::Accepted)
return;
2603 if (newitem.Length()>0)
2606 newitem.Data(), h1->IsA());
2622 QMessageBox::information(
this,
"Create new condition",
"Cannot create new condition before analysis setup");
2628 if (dlg.exec() != QDialog::Accepted)
return;
2646 QMessageBox::information(
this,
"Create new dynamic entry",
"Cannot create new entry before analysis setup");
2652 if (dlg.exec() != QDialog::Accepted)
return;
2668 if (!editor)
return;
2676 if (!br || !itemname || strlen(itemname) == 0)
return nullptr;
2680 if (!guislot)
return nullptr;
2682 std::cerr <<
" Problem with gui slots" << std::endl;
2699 if (updatelevel < 0) {
2700 if (
go4sett->getFetchDataWhenDraw())
2714 if (!br || !itemname)
return false;
2716 TString fileslotname;
2717 const char *filepath =
nullptr;
2722 QMessageBox msgBox(QMessageBox::Question,
"Writing object to file",
2723 QString(
"Overwrite ") + filepath +
" in file " + fileslotname.Data());
2724 auto btnOverwrite = msgBox.addButton(
"Overwrite", QMessageBox::ActionRole);
2725 msgBox.addButton(
"Save to other file", QMessageBox::ActionRole);
2726 auto btnCancel = msgBox.addButton(
"Cancel", QMessageBox::RejectRole);
2727 msgBox.setDefaultButton(btnOverwrite);
2729 if (msgBox.clickedButton() == btnCancel)
2731 if (msgBox.clickedButton() == btnOverwrite)
2736 QString root_fmt =
"ROOT (*.root)";
2737 QString xml_fmt =
"ROOT XML (*.xml)";
2739 QFileDialog fd(
this, QString(
"Save ") + itemname +
" in root file",
fLastFileDir);
2740 fd.setFileMode(QFileDialog::AnyFile);
2741 fd.setAcceptMode(QFileDialog::AcceptSave);
2742 fd.setNameFilters(QStringList() << root_fmt << xml_fmt);
2744 if (fd.exec() == QDialog::Accepted) {
2745 QStringList flst = fd.selectedFiles();
2746 if (!flst.isEmpty()) {
2747 QString filename = flst[0];
2748 if (fd.selectedNameFilter()==xml_fmt) {
2749 if (!filename.endsWith(
".xml")) filename.append(
".xml");
2751 if (!filename.endsWith(
".root")) filename.append(
".root");
2753 res = br->
SaveItemToFile(itemname, filename.toLatin1().constData(), subfolder);
2768 QFileDialog fd(
this, QString(
"Save ") + panel->objectName() +
" As",
fLastFileDir);
2769 fd.setFileMode( QFileDialog::AnyFile );
2770 fd.setAcceptMode(QFileDialog::AcceptSave);
2772 QString PS =
"Post Script (*.ps)";
2773 QString PS_Portrait =
"Post Script Portrait (*.ps)";
2774 QString PS_Landscape =
"Post Script Landscape (*.ps)";
2775 QString EPS =
"Encapsulated Post Script (*.eps)";
2776 QString EPS_Preview =
"Encapsulated Post Script preview (*.eps)";
2777 QString GIF =
"GIF format (*.gif)";
2778 QString PDF =
"PDF format (*.pdf)";
2779 QString SVG =
"SVG format (*.svg)";
2780 QString XPM =
"XPM format (*.xpm)";
2781 QString PNG =
"PNG format (*.png)";
2782 QString JPG =
"JPG format (*.jpg)";
2783 QString TIFF =
"TIFF format (*.tiff)";
2785 QString CXXM =
"C++ Macro (*.C)";
2786 QString JSONM =
"json file (*.json)";
2787 QString ROOTM =
"root file (*.root)";
2801 flt << PS_Landscape;
2810 fd.setNameFilters(flt);
2812 QString filename0 = panel->objectName();
2814 fd.selectFile(filename0 +
".png");
2816 QObject::connect(&fd, &QFileDialog::filterSelected, [filename0, &fd](
const QString &fltr) {
2817 QStringList flst = fd.selectedFiles();
2818 if (flst.size() > 1)
2820 if ((flst.size() == 1) && (flst[0].indexOf(filename0 +
".") != 0))
2823 auto p = fltr.indexOf(
"(*."), p2 = fltr.lastIndexOf(
")");
2824 fd.selectFile(filename0 + fltr.mid(p + 2, p2 - p - 2));
2828 if (fd.exec() != QDialog::Accepted)
return;
2830 bool blankbg =
go4sett->getSavePadWhiteBackground();
2832 can = (TCanvas *) panel->
GetCanvas()->Clone();
2833 can->SetName(
"PrintoutPad");
2835 QStringList flst = fd.selectedFiles();
2836 if (flst.isEmpty())
return;
2838 QString filename = flst[0];
2839 QString filter = fd.selectedNameFilter();
2843 const char *opt =
"ps";
2845 if (filter == EPS) {
2847 if (!filename.endsWith(
".eps"))
2848 filename.append(
".eps");
2849 }
else if (filter == EPS_Preview) {
2851 if (!filename.endsWith(
".eps"))
2852 filename.append(
".eps");
2853 }
else if (filter == PS) {
2855 if (!filename.endsWith(
".ps"))
2856 filename.append(
".ps");
2857 }
else if (filter == PS_Portrait) {
2859 if (!filename.endsWith(
".ps"))
2860 filename.append(
".ps");
2861 }
else if (filter == PS_Landscape) {
2863 if (!filename.endsWith(
".ps"))
2864 filename.append(
".ps");
2865 }
else if (filter == GIF) {
2867 if (!filename.endsWith(
".gif"))
2868 filename.append(
".gif");
2869 }
else if (filter == PDF) {
2871 if (!filename.endsWith(
".pdf"))
2872 filename.append(
".pdf");
2873 }
else if (filter == SVG) {
2875 if (!filename.endsWith(
".svg"))
2876 filename.append(
".svg");
2877 }
else if (filter == XPM) {
2879 if (!filename.endsWith(
".xpm"))
2880 filename.append(
".xpm");
2881 }
else if (filter == PNG) {
2883 if (!filename.endsWith(
".png"))
2884 filename.append(
".png");
2885 }
else if (filter == JPG) {
2887 if (!filename.endsWith(
".jpg"))
2888 filename.append(
".jpg");
2889 }
else if (filter == TIFF) {
2891 if (!filename.endsWith(
".tiff"))
2892 filename.append(
".tiff");
2893 }
else if (filter == CXXM) {
2895 if (!filename.endsWith(
".C"))
2896 filename.append(
".C");
2897 }
else if (filter == JSONM) {
2899 if (!filename.endsWith(
".json"))
2900 filename.append(
".json");
2901 }
else if (filter == ROOTM) {
2903 if (!filename.endsWith(
".root"))
2904 filename.append(
".root");
2909 gROOT->SetBatch(kTRUE);
2912 can->Print(filename.toLatin1().constData(), opt);
2915 gROOT->SetBatch(kFALSE);
2932 if (!widget)
return nullptr;
2934 QString EditorName = widget->objectName();
2937 editorslotname +=
"/";
2938 editorslotname += EditorName;
2939 TGo4Slot *edslot =
fxOM->GetSlot(editorslotname.toLatin1().constData());
2940 if (!edslot && force) {
2942 edslot =
fxOM->GetSlot(editorslotname.toLatin1().constData());
2963 for (
int n = 0; n < topslot->
NumChilds(); n++) {
2968 if (!wproxy)
continue;
2973 if (panel && (panel != actpanel))
2986 if (!editor)
return;
2991 if (!edslot)
return;
2993 switch (serviceid) {
2995 QDragMoveEvent *
event = (QDragMoveEvent *) par;
2996 if (!event || !event->mimeData()->hasText())
return;
2998 QString eventstr =
event->mimeData()->text();
3000 bool accept =
false;
3004 accept = editor->
IsAcceptDrag(eventstr.toLatin1().constData(), cl, kind);
3007 if (accept)
event->acceptProposedAction();
3012 QDropEvent *
event = (QDropEvent *) par;
3014 if (!event || !event->mimeData()->hasText())
return;
3016 QString eventstr =
event->mimeData()->text();
3017 event->acceptProposedAction();
3026 panel->DropOnPad((TPad *)str, eventstr.toLatin1().constData(), cl, kind);
3028 fitpanel->
DropOnPanel(event, eventstr.toLatin1().constData(), cl, kind);
3030 editor->
DropItem(eventstr.toLatin1().constData(), cl, kind);
3036 TClass *cl = (TClass *) par;
3037 int id = str ? QString(str).toInt() : 0;
3039 if (cl->InheritsFrom(TH1::Class()))
3041 else if (cl->InheritsFrom(TGo4Condition::Class()) && (
id != 0))
3043 else if (cl->InheritsFrom(TGo4DynamicEntry::Class()) && (
id != 0))
3049 void ** res = (
void **) par;
3058 for (
int n = 0; n < topslot->
NumChilds(); n++) {
3063 if (!wproxy)
continue;
3080 for (
int n = 0; n < topslot->
NumChilds(); n++) {
3084 if (!wproxy)
continue;
3086 auto panel =
dynamic_cast<TGo4ViewPanel *
> (wproxy->GetWidget());
3106 tviewer->parentWidget()->show();
3113 if (cl->InheritsFrom(TGo4Fitter::Class())) {
3117 }
else if (cl->InheritsFrom(TGo4Parameter::Class())) {
3119 }
else if (cl->InheritsFrom(TH1::Class())) {
3121 hinfo->WorkWithHistogram(str);
3122 }
else if (cl->InheritsFrom(TGo4Condition::Class())) {
3124 wedit->WorkWithCondition(str);
3125 }
else if (cl->InheritsFrom(TGo4DynamicEntry::Class())) {
3127 dedit->WorkWithEntry(str);
3128 }
else if (cl->InheritsFrom(TGo4AnalysisStatus::Class())) {
3145 if (cl->InheritsFrom(TH1::Class())) {
3148 }
else if (cl->InheritsFrom(TGo4Condition::Class())) {
3160 if (obj->InheritsFrom(TGo4Fitter::Class())) {
3168 const char *subfolder = (
const char *) par;
3170 *((
char *) par) = res ? 1 : 0;
3175 TObject **obj = (TObject **) par;
3177 *obj = res ? (TObject *) 1 :
nullptr;
3193 bool* res = (
bool*) par;
3205 TObject **obj = (TObject **) par;
3207 QString **res = (QString **) par;
3209 if (itemname.Length() > 0)
3210 *res =
new QString(itemname.Data());
3223 QByteArray ba = editor->objectName().toLatin1();
3225 if (!str) str = ba.constData();
3228 str,
"link to browser item");
3236 QByteArray ba = editor->objectName().toLatin1();
3237 if (!str) str = ba.constData();
3240 fxOM->AddLink(slot, edslot->
GetFullName(), str,
"direct link to OM slot");
3249 if (!parent) parent = edslot;
3254 brslot->GetName(),
"link in specific subfolder");
3271 objslot =
fxOM->MakeObjSlot(edslot->
GetFullName(), str,
"Place for editor object");
3286 if (!edslot)
return;
3287 const char **res = (
const char **) par;
3293 void ** res = (
void **) par;
3302 if (!edslot)
return;
3306 TObject **res = (TObject **) par;
3316 if (!edslot)
return;
3318 if (link) link->
Delete();
3323 if (!str || (strcmp(str,
"complete") != 0))
3332 for (
int n = 0; n < slot->
NumChilds(); n++) {
3334 if (edslot == subslot)
3362 if (strcmp(str,
"CloseAnalysisWindow") == 0) {
3366 }
else if (strcmp(str,
"PrintAnalysisHistograms") == 0) {
3368 if (anw) anw->PrintHistograms();
3369 }
else if (strcmp(str,
"PrintAnalysisConditions") == 0) {
3371 if (anw) anw->PrintConditions();
3372 }
else if (strcmp(str,
"DisplayMbsMonitor") == 0) {
3374 }
else if (strcmp(str,
"SubmitAnalysisSettings") == 0) {
3376 }
else if (strcmp(str,
"CloseAnalysisSettings") == 0) {
3379 anal->CloseAnalysisSettings();
3380 anal->RefreshNamesList();
3382 }
else if (strcmp(str,
"SubmitStartAnalysis") == 0) {
3384 }
else if (strcmp(str,
"StartAnalysis") == 0) {
3386 }
else if (strcmp(str,
"StopAnalysis") == 0) {
3388 }
else if (strcmp(str,
"TerminateAnalysis") == 0) {
3390 }
else if (strcmp(str,
"UpdateGuiLayout") == 0) {
3392 }
else if (strcmp(str,
"StartEventInfo") == 0) {
3394 }
else if(strcmp(str,
"ActivateConditionEditor") == 0) {
3401 }
else if (strcmp(str,
"SavePanelCanvas") == 0) {
3403 }
else if (strcmp(str,
"ToggleScaleValues") == 0) {
3405 }
else if (strcmp(str,
"GetFitterFromFitPanel") == 0) {
3410 }
else if (strcmp(str,
"CloneFitterFromFitPanel") == 0) {
3414 *res = panel->CloneFitter();
3447 TPad *pad = (TPad *) par;
3448 fxMdiArea->ResponseOnPanelEvent(serviceid, panel, pad);
3481 if (!QApplication::overrideCursor())
3482 QApplication::setOverrideCursor(Qt::WaitCursor);
3486 QApplication::restoreOverrideCursor();
3500 QFileDialog::getSaveFileName(
this,
3501 "Create GUI script dialog",
3503 QString(
"GUI hotstart script (*") + ext +
")");
3504 if (fileName.isEmpty())
return;
3506 int pos = fileName.indexOf(ext);
3508 if ((pos<0) || (pos!=fileName.length()-ext.length()))
3518 QToolBar* AnalysisMacroBar = addToolBar(
"Analysis Command Buttons");
3519 AnalysisMacroBar->setObjectName(
"AnalysisCommandToolBar");
3524 AnalysisMacroBar->addWidget(companel);
3525 AnalysisMacroBar->adjustSize();
3535 if (!name || !*name)
return nullptr;
3539 if (panel)
return panel;
3543 for (Int_t n = 0; n < slot->
NumChilds(); n++) {
void *(* TStartUserGuiFunc)(QWidget *parent)
static Int_t DelayMillisec()
Default delay during hotstart file extension.
static const char * FileExtension()
Returns default hotstart file extension.
static void DeleteInstance()
Delete instance of interface class.
virtual void WorkWithAnalysis(TGo4ServerProxy *anal)
Bool_t IsAdministrator() const override
Bool_t IsConnected() const override
Bool_t ConnectToServer(const char *remotehost, Int_t remoteport, Int_t ascontroller, const char *accesspass)
TGo4Slot * UpdateObjectSlot()
Bool_t IsAnalysisServer() const override
Bool_t LaunchAsClient(TString &launchcmd, TString &killcmd, Int_t shellkind, Int_t konsole, const char *name, const char *remotehost, const char *remotedir, const char *remoteexe, Int_t exe_kind=0, const char *exeargs=nullptr)
static Bool_t LaunchAsServer(TString &launchcmd, TString &killcmd, Int_t shellkind, Int_t konsole, const char *name, const char *remotehost, Int_t remoteport, const char *remotedir, const char *remoteexe, Int_t exe_kind=0, const char *exeargs=nullptr)
Bool_t IsController() const override
void SetDefaultReceiver(TGo4ObjectManager *rcv, const char *path)
Set receiver for object envelopes, which coming from analysis without request.
virtual void WorkWithRatemeter(TGo4Slot *slot)
static void ExtractProgArgs(QString &prog, QStringList &args)
void ClearAnalysisOutput()
bool TerminateOnClose() const
void AppendOutputBuffer(const QString &value, int prio=0)
void UpdateTimeStampFormat()
void WorkWithUpdateObjectCmd(TGo4Slot *slot)
void TerminateAnalysisProcess()
void SaveAnalysisOutput()
void SetHistorySize(int sz)
void WaitForNewObject(bool isobjectforeditor)
void StartAnalysisShell(const char *cmd, const char *workdir=nullptr, bool aschildprocess=false)
virtual void StartWorking()
void ImportObjectFromFile(const char *filename, const char *filedir, const char *format)
Bool_t SaveItemToFile(const char *itemname, const char *filename, const char *subfolder=nullptr)
TGo4AnalysisProxy * FindAnalysis(const char *itemname=nullptr)
static void SetLinkedName(TGo4Slot *slot, const char *itemname)
TGo4Slot * BrowserSlot(const char *item=nullptr)
TObject * GetBrowserObject(const char *name, Int_t update=0)
void ToggleMonitoring(Int_t period)
void CreateMemoryFolder(const char *foldername=nullptr)
TString SaveToMemory(const char *pathname, TObject *obj, Bool_t ownership, Bool_t overwrite=kFALSE)
Int_t ItemKind(const char *name)
TGo4Slot * DataSlot(const char *item)
Bool_t DefineFileObject(const char *itemname, TString &filedataslot, const char **filepath)
TGo4ServerProxy * FindServer(const char *itemname=nullptr, Bool_t asanalysis=kTRUE)
void SetMonitorBlockingFlag(Bool_t blocked=kFALSE)
Bool_t UpdateAnalysisItem(const char *itemname, TObject *obj=nullptr)
Bool_t IsItemRemote(const char *name)
static const char * GetLinkedName(TGo4Slot *slot)
TClass * ItemClass(const char *name)
void OpenFile(const char *fname)
Bool_t UpdateObjectInFile(const char *itemname, const char *fileslotname, const char *filepath)
virtual void RefreshWidget(bool checkindex)
virtual void WorkWithCondition(const char *itemname)
void setPassword(const char *pass)
TGo4Condition * MakeCondition()
TGo4DynamicEntry * MakeEntry()
void SetAnalysisAvaliable(bool on)
void SetLocalAvaliable(bool on)
static const char * GetDabcVersion()
ABC for all entries that can be kept in a dynamic list.
void WorkWithEvent(const char *itemname)
virtual void WorkWithFitter(const char *itemname, TGo4ViewPanel *panel, TPad *pad)
virtual void DropOnPanel(QDropEvent *event, const char *itemname, TClass *cl, int kind)
virtual TGo4Fitter * GetFitter()
virtual void WorkWithFitterInSlot(TGo4Slot *slot)
Central class of Go4Fit package.
virtual void WorkWithHistogram(const char *itemname)
Here Go4/ROOT-specific functionality of HttpProxy.
Bool_t IsAdministrator() const override
Bool_t IsConnected() const override
virtual void ClearLogInfo()
void WorkWithInfo(TGo4Slot *slot)
virtual void SaveLogInfo()
static TString subGO4SYS(const char *subdir)
Return subdirectory in the GO4SYS.
static Bool_t IsAutoEnabled()
get current user boolean
static const char * Message(Int_t prio, const char *text,...) GO4_PRINTF2_ARGS
Display a message.
static void SetIgnoreLevel(Int_t level)
Define threshold for output.
static void LogfileEnable(Bool_t on=kTRUE)
switch writing to logfile on or off
static void AutoEnable(Bool_t on=kTRUE)
set boolean for user action
static void OutputEnable(Bool_t on=kTRUE)
switch output on or off
static void OpenLogfile(const char *name=nullptr, const char *headercomment=nullptr, Bool_t appendmode=kFALSE)
Open file of name for logmessage output.
virtual void TimerStart()
virtual void SetNode(const QString &txt)
TGo4AnalysisWindow * EstablishAnalysisWindow(bool needoutput, bool withkillbnt=false, bool force_recreate=false)
TGo4BrowserProxy * Browser()
void CheckConnectingCounterSlot()
TGo4AnalysisConfiguration * FindAnalysisConfiguration()
void HotStart(const char *fname)
bool RemoveAnalysisProxy(int waittime=30, bool servershutdown=false)
void SetStyleSlot(const QString &)
void AddAnalysisMacrosBar()
TGo4FitPanel * StartFitPanel()
void ChangeTerminalFontSlot()
void StatusMessage(const QString &mess)
void ShowAboudDialog(const QString &title, const QString &text, const QString &icon)
void ToggleFullScreenSlot()
void PrepareForClientConnection(bool interactive=true)
void ChangeDrawItemFlagSlot(bool)
TGo4EventInfo * StartEventInfo()
void ChangeNativeMenuBarSlot(bool)
void LaunchClient(bool interactive=true)
void TerminateAnalysis(bool interactive=true)
void CreateNewHist(int isremote=-1)
TGo4EditDynEntry * StartEditDynEntry()
void ChangeCloneFlagSlot(bool)
virtual ~TGo4MainWindow()
void CloseAnalysisWindow()
QGo4Widget * FindGo4Widget(const char *name, bool activate)
void SubmitStartAnalysisSlot()
TGo4ViewPanel * FindViewPanel(const char *name)
void GStyleStatFormatSlot()
void MarkerSettingsSlot()
TGo4HistogramInfo * StartHistogramInfo()
void DisconnectAnalysis(bool interactive=true)
TGo4AnalysisConfiguration * EstablishAnalysisConfiguration(int level)
void EstablishAnalysisWindowForHttp()
void ChangeFetchWhenSaveSlot(bool)
TGo4ParaEdit * StartParaEdit(const char *itemname=nullptr)
TGo4AnalysisStatusMonitor * EstablishRatemeter(int level)
void windowsMenuAboutToShow()
void ChangeDrawDateFlagSlot(bool)
void ChangeWindowRubberBandSlot(bool)
void CreateGUIScriptSlot()
void CreateNewDynEntry(bool forothereditor=false)
const char * LastTypedPassword() const
void CascadeMdiPosition(QWidget *sub)
void ChangeSaveWhiteBackgroundSlot(bool)
TGo4ConditionEditor * StartConditionEditor()
void ChangeDrawTimeFlagSlot(bool)
void CreateNewCondition(bool forothereditor=false)
void EventStatusSlot(bool)
void UpdateCaptionButtons()
void ChangeDrawOnceSlot(bool)
QAction * faSumbStartAnal
void ConnectGo4Widget(QGo4Widget *editor)
TGo4ViewPanel * DisplayBrowserItem(const char *itemname, TGo4ViewPanel *panel, TPad *pad, bool activate, int updatelevel, const char *drawopt)
void ChangeFetchWhenCopySlot(bool)
void InputTerminalParametersSlot()
bool startUserGUI(const char *)
void UpdateDockAnalysisWindow()
void HelpWindow(const char *filename, const char *msg=nullptr)
void SavePanelCanvas(TGo4ViewPanel *panel)
void OpenRemoteFileSlot()
TGo4Slot * GetWidgetTopSlot(QGo4Widget *widget, bool force)
TGo4ConditionInfo * StartConditionInfo()
void closeEvent(QCloseEvent *ce) override
void SuperimposeSlot(bool)
void ChangeTerminalTimeStampSlot(bool)
bool SubmitAnalysisSettings()
void checkPanelRepaintSlot()
TGo4ViewPanel * MakeNewPanel(int div=0)
TGo4MainWindow(QApplication *)
void WindowActivated(int id)
void ConnectServer(bool interactive=true, const char *password="")
bool SaveBrowserItemToFile(const char *itemname, const char *subfolder)
TGo4AnalysisProxy * AddAnalysisProxy(bool isserver, bool needoutput)
void ToggleMbsMonitor(const char *nodename)
void ChangeTerminalTimeStampFormatSlot()
void ToggleAnalysisWindow()
TGo4ServerProxy * ConnectHttpServer(const char *addr=nullptr, const char *user=nullptr, const char *pass=nullptr, bool with_qt_process=false, bool get_analysis_config=false)
void ChangeFetchWhenDrawSlot(bool)
TGo4SetScaleValues * ToggleScaleValues()
QAction * faDisconnectAnal
void ShutdownAnalysis(bool interactive=true)
void ConnectHServerSlot()
void PaletteSettingsSlot()
void editorServiceSlot(QGo4Widget *editor, int serviceid, const char *str, void *par)
TGo4AnalysisWindow * FindAnalysisWindow()
void ChangeHideEventElement(bool)
void ToggleAnalysisConfiguration()
const QString & GetServer()
const QString & GetFileName()
const QString & GetFileType()
virtual void WorkWithParameter(const char *itemname, bool isrefresh)
Bool_t ContinueExecution()
static void ProduceScript(const char *filename, TGo4MainWindow *main)
TGo4ServerProxy * ConnectHttp(const char *servername, const char *account=nullptr, const char *pass=nullptr) override
Connect to HTTP server.
Bool_t IsWaitSomething() const
static TGo4Script * ScriptInstance()
Bool_t StartScriptExecution(const char *fname)
special base class for remote data servers like DABC, HTTP, hist server
const char * GetContainedObjectInfo() override
Bool_t IsAnalysisSettingsReady() const
virtual Bool_t CanSubmitObjects() const
virtual Bool_t IsConnected() const
virtual void StartAnalysis()
virtual void StopAnalysis()
virtual Bool_t IsGo4Analysis() const
void SetAnalysisReady(Bool_t on=kTRUE)
virtual void RequestAnalysisSettings()
virtual Bool_t UpdateAnalysisObject(const char *objectname, TObject *obj)
Int_t IsAnalysisLaunched() const
virtual void DisconnectAnalysis(Int_t waittime=30, Bool_t servershutdown=kFALSE)
Close connection to analysis and destroys proxy with correspondent slot.
virtual Bool_t SubmitCommand(const char *name, Int_t waitres=-1, const char *arg1=nullptr, const char *arg2=nullptr, const char *arg3=nullptr)
void SetAnalysisLaunched(Int_t on=1)
virtual Bool_t DelayedRefreshNamesList(Int_t delay_sec)
TGo4Slot * RatemeterSlot()
virtual Bool_t IsAnalysisServer() const
virtual Bool_t IsController() const
virtual void SubmitAnalysisSettings()
virtual Bool_t IsAdministrator() const
virtual TString FindCommand(const char *name)
static Bool_t GetLaunchString(TString &launchcmd, TString &killcmd, Int_t serverkind, Int_t shellkind, Int_t konsole, const char *name, const char *remotehost, const char *remotedir, const char *remoteexe, Int_t guiport, Int_t exe_kind=0, const char *exeargs=nullptr)
virtual Bool_t RefreshNamesList()
virtual Bool_t IsViewer() const
TString GetFullName(TGo4Slot *toparent=nullptr)
TGo4Proxy * GetProxy() const
void SetProxy(TGo4Proxy *cont)
TGo4Slot * FindChild(const char *name) const
void DeleteChilds(const char *startedwith=nullptr)
TObject * GetAssignedObject()
void Delete(Option_t *opt="") override
TGo4Slot * GetChild(Int_t n) const
virtual void WorkWithLeaf(const char *itemname)
virtual void ShootRepaintTimer()
virtual void Divide(int numX, int numY)
virtual bool IsRepaintTimerActive()
virtual void checkRepaintSlot()
virtual TPad * FindPadWithItem(const char *itemname)
virtual TPad * GetActivePad()
virtual void CompleteInitialization()
virtual const char * GetPanelName()
virtual void UndrawItemOnPanel(const char *itemname)
virtual void ResetPadFillColors(TPad *pad, int col, TPad *backup=nullptr)
virtual void SetActivePad(TPad *pad)
virtual TCanvas * GetCanvas()
virtual TGo4Slot * AddDrawObject(TPad *pad, int kind, const char *itemname, TObject *obj, bool owner, const char *drawopt)