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",
77 QVariant ( QString (
"Search for classes regex" ) ) );
78 ui->ClassTableSearchLine->setClearButtonEnabled(
true);
79 m_proxyModel->setFilterCaseSensitivity (Qt::CaseInsensitive);
81 QString DUNEDAQ_DB_PATH = getenv (
"DUNEDAQ_DB_PATH" );
82 auto path_list = DUNEDAQ_DB_PATH.split (QLatin1Char(
':'), Qt::SkipEmptyParts );
83 for ( QString & path : path_list ) {
84 if ( !path.endsWith (
"/" ) ) {
108 connect (
ui->OpenFileSchema, SIGNAL ( triggered() ),
this, SLOT (
OpenSchemaFile() ) );
109 connect (
ui->CreateNewSchema, SIGNAL ( triggered() ),
this, SLOT (
CreateNewSchema() ) );
111 connect (
ui->SaveSchema, SIGNAL ( triggered() ),
this, SLOT (
SaveSchema() ) );
112 connect (
ui->actionSave_layout, SIGNAL ( triggered() ),
this, SLOT (
save_layout() ) );
113 connect (
ui->actionRestore_layout, SIGNAL ( triggered() ),
this, SLOT (
restore_layout() ) );
114 connect (
ui->actionDefault_layout, SIGNAL ( triggered() ),
this, SLOT (
default_layout() ) );
115 connect (
ui->SetRelationship, SIGNAL ( triggered (
bool ) ),
this,
117 connect (
ui->SetInheritance, SIGNAL ( triggered (
bool ) ),
this,
119 connect (
ui->AddClass, SIGNAL ( triggered() ),
this, SLOT (
AddNewClass() ) );
120 connect (
ui->SaveView, SIGNAL ( triggered() ),
this, SLOT (
SaveView() ) );
121 connect (
ui->SaveViewAs, SIGNAL ( triggered() ),
this, SLOT (
SaveViewAs() ) );
122 connect (
ui->LoadView, SIGNAL ( triggered() ),
this, SLOT (
LoadView() ) );
123 connect (
ui->NameView, SIGNAL ( triggered() ),
this, SLOT (
NameView() ) );
124 connect (
ui->Exit, SIGNAL ( triggered() ),
this, SLOT ( close() ) );
126 connect (
ui->actionSettings, SIGNAL (triggered() ),
this, SLOT (
edit_settings() ));
128 connect (
ui->displayClasses, SIGNAL ( triggered (
bool ) ),
ui->ClassWidget,
129 SLOT ( setVisible (
bool ) ) );
130 connect (
ui->displayDiagrams, SIGNAL ( triggered (
bool ) ),
ui->TabWidget,
131 SLOT ( setVisible (
bool ) ) );
132 connect (
ui->displayInfo_tabs, SIGNAL ( triggered (
bool ) ),
ui->DockWidget,
133 SLOT ( setVisible (
bool ) ) );
134 connect (
ui->displayToolbar, SIGNAL ( triggered (
bool ) ),
ui->MainToolBar,
135 SLOT ( setVisible (
bool ) ) );
136 connect (
ui->displayStatus_bar, SIGNAL ( triggered (
bool ) ),
ui->StatusBar,
137 SLOT ( setVisible (
bool ) ) );
139 connect (
ui->ClassWidget, SIGNAL ( visibilityChanged (
bool ) ),
ui->displayClasses,
140 SLOT ( setChecked (
bool ) ) );
141 connect (
ui->DockWidget, SIGNAL ( visibilityChanged (
bool ) ),
ui->displayInfo_tabs,
142 SLOT ( setChecked (
bool ) ) );
143 connect (
ui->MainToolBar, SIGNAL ( visibilityChanged (
bool ) ),
ui->displayToolbar,
144 SLOT ( setChecked (
bool ) ) );
146 connect (
ui->ClassTableView, SIGNAL ( activated ( QModelIndex ) ),
this,
148 connect (
ui->close_tab, SIGNAL ( triggered() ),
this, SLOT (
close_tab() ) );
158 connect (
ui->TabWidget, SIGNAL ( tabCloseRequested (
int ) ),
this,
161 connect (
ui->FileView, SIGNAL ( customContextMenuRequested ( QPoint ) ),
this,
163 connect (
ui->FileView, SIGNAL ( activated(QModelIndex) ),
this, SLOT (
show_file_info(QModelIndex) ) );
166 connect (
ui->ClassTableView, SIGNAL ( customContextMenuRequested ( QPoint ) ),
this,
170 connect (
ui->ClassTableSearchLine, SIGNAL( textChanged ( QString ) ),
m_proxyModel, SLOT( setFilterRegExp( QString ) ) );
171 connect (
ui->case_sensitive, SIGNAL ( stateChanged(
int) ),
this,
381 std::string
filename = qfilename.toStdString();
382 std::set<std::string> includes;
385 QString advice{
"<br><br>Use the File info window to fix the problem."};
387 auto relationships = cls->direct_relationships();
388 if (relationships !=
nullptr) {
389 for (
auto rel: *relationships) {
390 auto rel_class = rel->get_class_type();
391 if (rel_class ==
nullptr) {
392 QString warning =
"<b>Warning</b> class <i>"
393 + QString::fromStdString(cls->get_name())
394 +
"</i> has relationship "
395 + QString::fromStdString(rel->get_name())
396 +
" referring to class <i>"
397 + QString::fromStdString(rel->get_type())
398 +
"</i> which is not loaded<br>";
399 QMessageBox::warning(0,
406 auto file = rel_class->get_file()->get_full_file_name();
407 if (file !=
filename && !includes.contains(file)) {
408 QString warning =
"<b>Warning</b> class <i>"
409 + QString::fromStdString(cls->get_name())
410 +
"</i> has relationship "
411 + QString::fromStdString(rel->get_name())
412 +
" referring to class <i>"
413 + QString::fromStdString(rel->get_class_type()->get_name())
414 +
"</i> from " + QString::fromStdString(file)
415 +
" which is not included by " + qfilename;
416 QMessageBox::warning(0,
426 auto super_classes = cls->direct_super_classes();
427 if (super_classes !=
nullptr) {
428 for (
auto sc: *super_classes) {
430 if (sclass ==
nullptr) {
431 QString warning =
"<b>Warning</b> class <i>"
432 + QString::fromStdString(cls->get_name())
433 +
"</i> refers to super class <i>" + QString::fromStdString(*sc)
434 +
"</i> which is not known<br>";
435 QMessageBox::warning(0,
442 auto file = sclass->get_file()->get_full_file_name();
443 if (file !=
filename && !includes.contains(file)) {
444 QString warning =
"<b>Warning</b> class <i>"
445 + QString::fromStdString(cls->get_name())
446 +
"</i> refers to super class <i>" + QString::fromStdString(*sc)
447 +
"</i> from " + QString::fromStdString(file)
448 +
" which is not included by" + qfilename;
449 QMessageBox::warning(0,
508 auto tab =
dynamic_cast<SchemaTab *
> (
ui->TabWidget->currentWidget() );
510 auto file = QFileDialog::getSaveFileName(
511 this, tr(
"Export to SVG"),
513 tr(
"SVG files (*.svg);;All files (*)"));
514 if (file.isEmpty()) {
518 auto spos = file.lastIndexOf(
'/');
524 if (!file.endsWith(
".svg")) {
527 QSvgGenerator generator;
528 generator.setFileName(file);
529 auto view = tab->GetView();
530 auto vpr=view->viewport()->rect();
531 generator.setSize(QSize(vpr.width(),vpr.height()));
532 generator.setViewBox(vpr);
535 painter.begin(&generator);
536 auto scene = tab->GetScene();
537 scene->render ( &painter, QRectF(), view->viewport()->rect() );
693 QFileDialog FileDialog (
694 this, tr (
"Create New schema File" ),
".",
695 tr (
"XML schema files (*.schema.xml);;All files (*)" ) );
696 FileDialog.setAcceptMode ( QFileDialog::AcceptSave );
697 FileDialog.setFileMode ( QFileDialog::AnyFile );
698 FileDialog.setViewMode ( QFileDialog::Detail );
701 FileDialog.setLabelText(QFileDialog::Accept,
"Create");
702 if ( !FileDialog.exec() )
707 QStringList FilesSelected = FileDialog.selectedFiles();
708 if ( FilesSelected.isEmpty() )
710 QMessageBox::warning ( 0,
"Schema editor",
711 QString (
"Please provide a name for the schema !" ) );
715 QString FileName = FilesSelected.at(0);
716 if ( !FileName.endsWith (
".schema.xml" ) )
718 FileName.append (
".schema.xml" );
721 QFile FileInfo ( FileName );
722 std::string FileNameStd = FileInfo.fileName().toStdString();
730 ui->CreateNewSchema->setDisabled (
true );
731 ui->OpenFileSchema->setDisabled (
true );
735 QMessageBox::warning (
738 QString (
"Could not create file : %1.\n\n%2" ).arg ( QString::fromStdString (
739 FileNameStd ) ).arg (
740 QString ( Ex.
what() ) ) );
871 QFile file ( file_name );
872 file.open ( QIODevice::WriteOnly );
874 for ( QGraphicsItem * item : tab->
GetScene()->items() ) {
876 if (
object !=
nullptr ) {
877 QString description =
object->GetClassName() +
","
878 + QString::number ( object->scenePos().x() ) +
","
879 + QString::number ( object->scenePos().y() ) +
"\n";
880 file.write ( description.toUtf8() );
884 if ( note !=
nullptr && !note->text().isEmpty()) {
885 auto text = note->text().replace(
"\n",
"<br>");
886 text = text.replace(
",",
"<comma>");
888 + QString::number ( note->scenePos().x() ) +
","
889 + QString::number ( note->scenePos().y() ) +
","
891 file.write ( line.toUtf8() );
897 auto message = QString(
"Saved view to %1").arg(file_name);
898 ui->StatusBar->showMessage( message );
903 QString ViewPath = QFileDialog::getOpenFileName (
905 tr (
"Open view file"),
907 tr(
"View files (*.view);;All files (*)"));
909 if ( !ViewPath.isEmpty() )
911 auto spos = ViewPath.lastIndexOf(
'/');
916 QFile ViewFile ( ViewPath );
917 ViewFile.open ( QIODevice::ReadOnly );
919 auto text = QFileInfo(ViewPath).baseName();
920 auto tab =
dynamic_cast<SchemaTab *
> (
ui->TabWidget->currentWidget() );
921 if (!tab->getName().isEmpty() || tab->GetScene()->IsModified()) {
923 tab =
dynamic_cast<SchemaTab *
> (
ui->TabWidget->currentWidget() );
925 auto index =
ui->TabWidget->currentIndex();
926 ui->TabWidget->setTabText(index, text);
928 tab->setFileName(ViewPath);
930 QStringList ClassesNames;
931 QList<QPointF> Positions;
932 QList<QPointF> note_positions;
934 while ( !ViewFile.atEnd() )
936 QString Line ( ViewFile.readLine() );
937 if (!Line.isEmpty()) {
938 QStringList ObjectDescription = Line.split (
"," );
940 Position.setX ( ObjectDescription.at ( 1 ).toInt() );
941 Position.setY ( ObjectDescription.at ( 2 ).toInt() );
942 if (ObjectDescription.at ( 0 ) ==
"#") {
943 note_positions.append (Position);
944 auto note_text = ObjectDescription.at(3);
945 if (note_text.back() ==
'\n') {
948 note_text = note_text.replace(
"<br>",
"\n");
949 note_text = note_text.replace(
"<comma>",
",");
950 notes.append ( note_text );
953 ClassesNames.append ( ObjectDescription.at ( 0 ) );
954 Positions.append ( Position );
960 auto message = QString(
"Loaded view from %1").arg(ViewPath);
961 ui->StatusBar->showMessage( message );
963 auto scene = tab->GetScene();
964 scene->CleanItemMap();
965 auto missing = scene->AddItemsToScene ( ClassesNames, Positions );
966 if (!missing.empty()) {
967 QString warning_text{
"The following classes in "};
968 warning_text.append(QFileInfo(ViewPath).fileName());
969 warning_text.append(
" are not present in the loaded schema:\n ");
970 warning_text.append(missing.join(
",\n "));
971 QMessageBox::warning(
this, tr(
"Load View"), warning_text);
973 scene->ClearModified();
975 scene->add_notes(notes, note_positions);
1023 QAction * Act =
new QAction ( tr (
"Set as Active Schema" ),
this );
1025 QAction * Sav =
new QAction ( tr (
"Save Schema File" ),
this );
1026 connect ( Sav, SIGNAL ( triggered() ),
this, SLOT (
SaveSchemaFile() ) );
1027 QAction * info =
new QAction ( tr (
"Show file info" ),
this );
1028 connect ( info, SIGNAL ( triggered() ),
this, SLOT (
show_file_info() ) );
1035 QModelIndex index =
ui->FileView->currentIndex();
1037 if ( index.isValid() )
1039 QStringList row =
FileModel->getRowFromIndex ( index );
1040 if (row.at(1) ==
"RW") {
1042 if (!row.at(2).contains(
"Active")) {
1124 settings.beginGroup(
"MainWindow-layout");
1125 if (settings.contains(
"size")) {
1126 resize(settings.value(
"size").toSize());
1128 if (settings.contains(
"pos")) {
1129 move(settings.value(
"pos").toPoint());
1131 if (settings.contains(
"geometry")) {
1132 restoreGeometry(settings.value(
"geometry").toByteArray());
1134 if (settings.contains(
"state")) {
1135 restoreState(settings.value(
"state").toByteArray());
1138 auto visible = settings.value(
"diagrams-visible",
true).toBool();
1139 ui->displayDiagrams->setChecked(visible);
1140 ui->TabWidget->setVisible(visible);
1142 visible = settings.value(
"statusbar-visible",
true).toBool();
1143 ui->StatusBar->setVisible(visible);
1144 ui->displayStatus_bar->setChecked(visible);
1146 ui->displayToolbar->setChecked(
ui->MainToolBar->isVisible());
1147 settings.endGroup();
1149 settings.beginGroup(
"MainWindow");
1151 settings.endGroup();
SchemaMainWindow(QString SchemaFile, QWidget *parent=nullptr)
void connect_file_info(SchemaFileInfo *win)
void LaunchClassEditor(QModelIndex Index)
void OpenSchemaFile(QString SchemaFile)
void write_view_file(const QString &fn, SchemaTab *tab)
QSortFilterProxyModel * m_proxyModel
std::unique_ptr< dbse::Ui::SchemaMainWindow > ui
void closeEvent(QCloseEvent *event)