69 ui->ClassTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
70 ui->ClassTableView->setDragEnabled(
true);
71 ui->ClassTableView->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
72 ui->FileView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
73 ui->FileView->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
74 ui->FileView->setSelectionBehavior(QAbstractItemView::SelectRows);
75 ui->TabWidget->setTabsClosable(
true);
76 ui->ClassTableSearchLine->setProperty(
"placeholderText", QVariant(QString(
"Search for classes regex")));
77 ui->ClassTableSearchLine->setClearButtonEnabled(
true);
78 m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
80 QString DUNEDAQ_DB_PATH = getenv(
"DUNEDAQ_DB_PATH");
81 auto path_list = DUNEDAQ_DB_PATH.split(QLatin1Char(
':'), Qt::SkipEmptyParts);
82 for (QString& path : path_list) {
83 if (!path.endsWith(
"/")) {
109 connect(
ui->OpenFileSchema, SIGNAL(triggered()),
this, SLOT(
OpenSchemaFile()));
110 connect(
ui->CreateNewSchema, SIGNAL(triggered()),
this, SLOT(
CreateNewSchema()));
112 connect(
ui->SaveSchema, SIGNAL(triggered()),
this, SLOT(
SaveSchema()));
113 connect(
ui->actionSave_layout, SIGNAL(triggered()),
this, SLOT(
save_layout()));
114 connect(
ui->actionRestore_layout, SIGNAL(triggered()),
this, SLOT(
restore_layout()));
115 connect(
ui->actionDefault_layout, SIGNAL(triggered()),
this, SLOT(
default_layout()));
118 connect(
ui->AddClass, SIGNAL(triggered()),
this, SLOT(
AddNewClass()));
119 connect(
ui->SaveView, SIGNAL(triggered()),
this, SLOT(
SaveView()));
120 connect(
ui->SaveViewAs, SIGNAL(triggered()),
this, SLOT(
SaveViewAs()));
121 connect(
ui->LoadView, SIGNAL(triggered()),
this, SLOT(
LoadView()));
122 connect(
ui->NameView, SIGNAL(triggered()),
this, SLOT(
NameView()));
123 connect(
ui->Exit, SIGNAL(triggered()),
this, SLOT(close()));
125 connect(
ui->actionSettings, SIGNAL(triggered()),
this, SLOT(
edit_settings()));
127 connect(
ui->displayClasses, SIGNAL(triggered(
bool)),
ui->ClassWidget, SLOT(setVisible(
bool)));
128 connect(
ui->displayDiagrams, SIGNAL(triggered(
bool)),
ui->TabWidget, SLOT(setVisible(
bool)));
129 connect(
ui->displayInfo_tabs, SIGNAL(triggered(
bool)),
ui->DockWidget, SLOT(setVisible(
bool)));
130 connect(
ui->displayToolbar, SIGNAL(triggered(
bool)),
ui->MainToolBar, SLOT(setVisible(
bool)));
131 connect(
ui->displayStatus_bar, SIGNAL(triggered(
bool)),
ui->StatusBar, SLOT(setVisible(
bool)));
133 connect(
ui->ClassWidget, SIGNAL(visibilityChanged(
bool)),
ui->displayClasses, SLOT(setChecked(
bool)));
134 connect(
ui->DockWidget, SIGNAL(visibilityChanged(
bool)),
ui->displayInfo_tabs, SLOT(setChecked(
bool)));
135 connect(
ui->MainToolBar, SIGNAL(visibilityChanged(
bool)),
ui->displayToolbar, SLOT(setChecked(
bool)));
137 connect(
ui->ClassTableView, SIGNAL(activated(QModelIndex)),
this, SLOT(
LaunchClassEditor(QModelIndex)));
138 connect(
ui->close_tab, SIGNAL(triggered()),
this, SLOT(
close_tab()));
144 connect(
ui->TabWidget, SIGNAL(tabCloseRequested(
int)),
this, SLOT(
RemoveTab(
int)));
147 connect(
ui->FileView, SIGNAL(activated(QModelIndex)),
this, SLOT(
show_file_info(QModelIndex)));
153 connect(
ui->ClassTableSearchLine, SIGNAL(textChanged(QString)),
m_proxyModel, SLOT(setFilterRegExp(QString)));
361 std::string
filename = qfilename.toStdString();
362 std::set<std::string> includes;
365 QString advice{
"<br><br>Use the File info window to fix the problem." };
367 auto relationships = cls->direct_relationships();
368 if (relationships !=
nullptr) {
369 for (
auto rel : *relationships) {
370 auto rel_class = rel->get_class_type();
371 if (rel_class ==
nullptr) {
372 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->get_name()) +
373 "</i> has relationship " + QString::fromStdString(rel->get_name()) +
374 " referring to class <i>" + QString::fromStdString(rel->get_type()) +
375 "</i> which is not loaded<br>";
376 QMessageBox::warning(0,
"Check Schema", warning + advice, QMessageBox::Ok);
380 auto file = rel_class->get_file()->get_full_file_name();
381 if (file !=
filename && !includes.contains(file)) {
382 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->get_name()) +
383 "</i> has relationship " + QString::fromStdString(rel->get_name()) +
384 " referring to class <i>" + QString::fromStdString(rel->get_class_type()->get_name()) +
385 "</i> from " + QString::fromStdString(file) +
" which is not included by " + qfilename;
386 QMessageBox::warning(0,
"Check Schema", warning + advice, QMessageBox::Ok);
393 auto super_classes = cls->direct_super_classes();
394 if (super_classes !=
nullptr) {
395 for (
auto sc : *super_classes) {
397 if (sclass ==
nullptr) {
398 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->get_name()) +
399 "</i> refers to super class <i>" + QString::fromStdString(*sc) +
400 "</i> which is not known<br>";
401 QMessageBox::warning(0,
"Check Schema", warning + advice, QMessageBox::Ok);
405 auto file = sclass->get_file()->get_full_file_name();
406 if (file !=
filename && !includes.contains(file)) {
407 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->get_name()) +
408 "</i> refers to super class <i>" + QString::fromStdString(*sc) +
"</i> from " +
409 QString::fromStdString(file) +
" which is not included by" + qfilename;
410 QMessageBox::warning(0,
"Check Schema", warning + advice, QMessageBox::Ok);
647 QFileDialog FileDialog(
this, tr(
"Create New schema File"),
".", tr(
"XML schema files (*.schema.xml);;All files (*)"));
648 FileDialog.setAcceptMode(QFileDialog::AcceptSave);
649 FileDialog.setFileMode(QFileDialog::AnyFile);
650 FileDialog.setViewMode(QFileDialog::Detail);
653 FileDialog.setLabelText(QFileDialog::Accept,
"Create");
654 if (!FileDialog.exec()) {
658 QStringList FilesSelected = FileDialog.selectedFiles();
659 if (FilesSelected.isEmpty()) {
660 QMessageBox::warning(0,
"Schema editor", QString(
"Please provide a name for the schema !"));
664 QString FileName = FilesSelected.at(0);
665 if (!FileName.endsWith(
".schema.xml")) {
666 FileName.append(
".schema.xml");
669 QFile FileInfo(FileName);
670 std::string FileNameStd = FileInfo.fileName().toStdString();
677 ui->CreateNewSchema->setDisabled(
true);
678 ui->OpenFileSchema->setDisabled(
true);
680 QMessageBox::warning(
683 QString(
"Could not create file : %1.\n\n%2").arg(QString::fromStdString(FileNameStd)).arg(QString(Ex.
what())));
809 QFile file(file_name);
810 file.open(QIODevice::WriteOnly);
812 for (QGraphicsItem* item : tab->
GetScene()->items()) {
814 if (
object !=
nullptr) {
815 QString description =
object->GetClassName() +
"," + QString::number(object->scenePos().x()) +
"," +
816 QString::number(object->scenePos().y()) +
"\n";
817 file.write(description.toUtf8());
820 if (note !=
nullptr && !note->text().isEmpty()) {
821 auto text = note->text().replace(
"\n",
"<br>");
822 text = text.replace(
",",
"<comma>");
823 QString line =
"#," + QString::number(note->scenePos().x()) +
"," + QString::number(note->scenePos().y()) +
825 file.write(line.toUtf8());
831 auto message = QString(
"Saved view to %1").arg(file_name);
832 ui->StatusBar->showMessage(message);
840 QFileDialog::getOpenFileName(
this, tr(
"Open view file"),
m_view_dir, tr(
"View files (*.view);;All files (*)"));
842 if (!ViewPath.isEmpty()) {
843 auto spos = ViewPath.lastIndexOf(
'/');
848 QFile ViewFile(ViewPath);
849 ViewFile.open(QIODevice::ReadOnly);
851 auto text = QFileInfo(ViewPath).baseName();
852 auto tab =
dynamic_cast<SchemaTab*
>(
ui->TabWidget->currentWidget());
853 if (!tab->getName().isEmpty() || tab->GetScene()->IsModified()) {
855 tab =
dynamic_cast<SchemaTab*
>(
ui->TabWidget->currentWidget());
857 auto index =
ui->TabWidget->currentIndex();
858 ui->TabWidget->setTabText(index, text);
860 tab->setFileName(ViewPath);
862 QStringList ClassesNames;
863 QList<QPointF> Positions;
864 QList<QPointF> note_positions;
866 while (!ViewFile.atEnd()) {
867 QString Line(ViewFile.readLine());
868 if (!Line.isEmpty()) {
869 QStringList ObjectDescription = Line.split(
",");
871 Position.setX(ObjectDescription.at(1).toInt());
872 Position.setY(ObjectDescription.at(2).toInt());
873 if (ObjectDescription.at(0) ==
"#") {
874 note_positions.append(Position);
875 auto note_text = ObjectDescription.at(3);
876 if (note_text.back() ==
'\n') {
879 note_text = note_text.replace(
"<br>",
"\n");
880 note_text = note_text.replace(
"<comma>",
",");
881 notes.append(note_text);
883 ClassesNames.append(ObjectDescription.at(0));
884 Positions.append(Position);
890 auto message = QString(
"Loaded view from %1").arg(ViewPath);
891 ui->StatusBar->showMessage(message);
893 auto scene = tab->GetScene();
894 scene->CleanItemMap();
895 auto missing = scene->AddItemsToScene(ClassesNames, Positions);
896 if (!missing.empty()) {
897 QString warning_text{
"The following classes in " };
898 warning_text.append(QFileInfo(ViewPath).fileName());
899 warning_text.append(
" are not present in the loaded schema:\n ");
900 warning_text.append(missing.join(
",\n "));
901 QMessageBox::warning(
this, tr(
"Load View"), warning_text);
903 scene->ClearModified();
905 scene->add_notes(notes, note_positions);
SchemaMainWindow(QString SchemaFile, QWidget *parent=nullptr)
void write_view_file(const QString &fn, SchemaTab *tab)
std::unique_ptr< dbse::Ui::SchemaMainWindow > ui