Line data Source code
1 : /// Including Schema Editor
2 : #include "dbe/SchemaMainWindow.hpp"
3 : #include "dbe/SchemaKernelWrapper.hpp"
4 : #include "dbe/SchemaGraphicsScene.hpp"
5 : #include "dbe/SchemaTab.hpp"
6 : #include "dbe/SchemaClassEditor.hpp"
7 : #include "dbe/SchemaRelationshipEditor.hpp"
8 : #include "dbe/SchemaMethodImplementationEditor.hpp"
9 : #include "dbe/SchemaFileInfo.hpp"
10 : #include "dbe/SchemaStyle.hpp"
11 :
12 : #include "oks/kernel.hpp" // for CanNotSetActiveFile exception
13 :
14 : /// Including Auto-Generated Files
15 : #include "ui_SchemaMainWindow.h"
16 : /// Including QT Headers
17 : #include <QFileDialog>
18 : #include <QMessageBox>
19 : #include <QHeaderView>
20 : #include <QPushButton>
21 : #include <QGraphicsScene>
22 : #include "QInputDialog"
23 : #include <QCloseEvent>
24 : #include <QPrinter>
25 : #include <QPrintDialog>
26 : #include <QSettings>
27 : #include <QSvgGenerator>
28 :
29 : //#include <format>
30 : #include <sstream>
31 :
32 : using namespace dunedaq;
33 : using namespace dunedaq::oks;
34 :
35 :
36 0 : dbse::SchemaMainWindow::SchemaMainWindow ( QString SchemaFile, QWidget * parent )
37 : : QMainWindow ( parent ),
38 0 : ui ( new Ui::SchemaMainWindow ),
39 0 : FileModel ( nullptr ),
40 0 : TableModel ( nullptr ),
41 0 : m_proxyModel ( new QSortFilterProxyModel() ),
42 0 : ContextMenuFileView ( nullptr ),
43 0 : ContextMenuTableView ( nullptr )
44 : {
45 0 : InitialSettings();
46 0 : m_default_state = saveState();
47 0 : m_default_geometry = saveGeometry();
48 0 : m_default_size = QSize(1400, 880);
49 0 : QCoreApplication::setOrganizationName("dunedaq");
50 0 : QCoreApplication::setApplicationName("dbse");
51 0 : SchemaStyle::load();
52 0 : restore_layout();
53 :
54 0 : InitialTab();
55 0 : InitialTabCorner();
56 0 : SetController();
57 0 : setFocusPolicy( Qt::StrongFocus );
58 :
59 0 : OpenSchemaFile(SchemaFile);
60 0 : }
61 :
62 0 : dbse::SchemaMainWindow::~SchemaMainWindow() = default;
63 :
64 0 : void dbse::SchemaMainWindow::InitialSettings()
65 : {
66 0 : ui->setupUi ( this );
67 0 : setWindowTitle ( m_title );
68 0 : ui->UndoView->setStack ( KernelWrapper::GetInstance().GetUndoStack() );
69 0 : ui->ClassTableView->horizontalHeader()->setSectionResizeMode ( QHeaderView::Stretch );
70 0 : ui->ClassTableView->setDragEnabled ( true );
71 0 : ui->ClassTableView->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
72 0 : ui->FileView->horizontalHeader()->setSectionResizeMode ( QHeaderView::Stretch );
73 0 : ui->FileView->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
74 0 : ui->FileView->setSelectionBehavior ( QAbstractItemView::SelectRows );
75 0 : ui->TabWidget->setTabsClosable ( true );
76 0 : ui->ClassTableSearchLine->setProperty ( "placeholderText",
77 0 : QVariant ( QString ( "Search for classes regex" ) ) );
78 0 : ui->ClassTableSearchLine->setClearButtonEnabled(true);
79 0 : m_proxyModel->setFilterCaseSensitivity (Qt::CaseInsensitive);
80 :
81 0 : QString DUNEDAQ_DB_PATH = getenv ( "DUNEDAQ_DB_PATH" );
82 0 : auto path_list = DUNEDAQ_DB_PATH.split (QLatin1Char(':'), Qt::SkipEmptyParts );
83 0 : for ( QString & path : path_list ) {
84 0 : if ( !path.endsWith ( "/" ) ) {
85 0 : path.append ( "/" );
86 : }
87 0 : m_path_urls.append(QUrl::fromLocalFile(path));
88 : }
89 0 : }
90 :
91 :
92 0 : void dbse::SchemaMainWindow::InitialTab()
93 : {
94 0 : add_tab();
95 0 : ui->TabWidget->removeTab ( 0 );
96 0 : }
97 :
98 0 : void dbse::SchemaMainWindow::InitialTabCorner()
99 : {
100 0 : QPushButton * new_tab_button = new QPushButton ( "+" );
101 0 : new_tab_button->setToolTip("Open new schema view tab");
102 0 : ui->TabWidget->setCornerWidget ( new_tab_button, Qt::TopLeftCorner );
103 0 : connect ( new_tab_button, SIGNAL ( clicked() ), this, SLOT ( add_tab() ) );
104 0 : }
105 :
106 0 : void dbse::SchemaMainWindow::SetController()
107 : {
108 0 : connect ( ui->OpenFileSchema, SIGNAL ( triggered() ), this, SLOT ( OpenSchemaFile() ) );
109 0 : connect ( ui->CreateNewSchema, SIGNAL ( triggered() ), this, SLOT ( CreateNewSchema() ) );
110 0 : connect ( ui->ShowSchema, SIGNAL ( triggered() ), this, SLOT ( show_file_info_active_schema() ) );
111 0 : connect ( ui->SaveSchema, SIGNAL ( triggered() ), this, SLOT ( SaveSchema() ) );
112 0 : connect ( ui->actionSave_layout, SIGNAL ( triggered() ), this, SLOT ( save_layout() ) );
113 0 : connect ( ui->actionRestore_layout, SIGNAL ( triggered() ), this, SLOT ( restore_layout() ) );
114 0 : connect ( ui->actionDefault_layout, SIGNAL ( triggered() ), this, SLOT ( default_layout() ) );
115 0 : connect ( ui->SetRelationship, SIGNAL ( triggered ( bool ) ), this,
116 : SLOT ( ChangeCursorRelationship ( bool ) ) );
117 0 : connect ( ui->SetInheritance, SIGNAL ( triggered ( bool ) ), this,
118 : SLOT ( ChangeCursorInheritance ( bool ) ) );
119 0 : connect ( ui->AddClass, SIGNAL ( triggered() ), this, SLOT ( AddNewClass() ) );
120 0 : connect ( ui->SaveView, SIGNAL ( triggered() ), this, SLOT ( SaveView() ) );
121 0 : connect ( ui->SaveViewAs, SIGNAL ( triggered() ), this, SLOT ( SaveViewAs() ) );
122 0 : connect ( ui->LoadView, SIGNAL ( triggered() ), this, SLOT ( LoadView() ) );
123 0 : connect ( ui->NameView, SIGNAL ( triggered() ), this, SLOT ( NameView() ) );
124 0 : connect ( ui->Exit, SIGNAL ( triggered() ), this, SLOT ( close() ) );
125 :
126 0 : connect ( ui->actionSettings, SIGNAL (triggered() ), this, SLOT ( edit_settings() ));
127 :
128 0 : connect ( ui->displayClasses, SIGNAL ( triggered ( bool ) ), ui->ClassWidget,
129 : SLOT ( setVisible ( bool ) ) );
130 0 : connect ( ui->displayDiagrams, SIGNAL ( triggered ( bool ) ), ui->TabWidget,
131 : SLOT ( setVisible ( bool ) ) );
132 0 : connect ( ui->displayInfo_tabs, SIGNAL ( triggered ( bool ) ), ui->DockWidget,
133 : SLOT ( setVisible ( bool ) ) );
134 0 : connect ( ui->displayToolbar, SIGNAL ( triggered ( bool ) ), ui->MainToolBar,
135 : SLOT ( setVisible ( bool ) ) );
136 0 : connect ( ui->displayStatus_bar, SIGNAL ( triggered ( bool ) ), ui->StatusBar,
137 : SLOT ( setVisible ( bool ) ) );
138 :
139 0 : connect ( ui->ClassWidget, SIGNAL ( visibilityChanged ( bool ) ), ui->displayClasses,
140 : SLOT ( setChecked ( bool ) ) );
141 0 : connect ( ui->DockWidget, SIGNAL ( visibilityChanged ( bool ) ), ui->displayInfo_tabs,
142 : SLOT ( setChecked ( bool ) ) );
143 0 : connect ( ui->MainToolBar, SIGNAL ( visibilityChanged ( bool ) ), ui->displayToolbar,
144 : SLOT ( setChecked ( bool ) ) );
145 :
146 0 : connect ( ui->ClassTableView, SIGNAL ( activated ( QModelIndex ) ), this,
147 : SLOT ( LaunchClassEditor ( QModelIndex ) ) );
148 0 : connect ( ui->close_tab, SIGNAL ( triggered() ), this, SLOT ( close_tab() ) );
149 :
150 0 : connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassCreated( QString ) ), this,
151 : SLOT ( update_models() ) );
152 0 : connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassUpdated ( QString ) ), this,
153 : SLOT ( update_models() ) );
154 0 : connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassRemoved ( QString ) ), this,
155 : SLOT ( update_models() ) );
156 0 : connect ( &KernelWrapper::GetInstance(), SIGNAL ( active_updated ( ) ), this,
157 : SLOT ( update_models() ) );
158 0 : connect ( ui->TabWidget, SIGNAL ( tabCloseRequested ( int ) ), this,
159 : SLOT ( RemoveTab ( int ) ) );
160 :
161 0 : connect ( ui->FileView, SIGNAL ( customContextMenuRequested ( QPoint ) ), this,
162 : SLOT ( CustomContextMenuFileView ( QPoint ) ) );
163 0 : connect ( ui->FileView, SIGNAL ( activated(QModelIndex) ), this, SLOT ( show_file_info(QModelIndex) ) );
164 :
165 :
166 0 : connect ( ui->ClassTableView, SIGNAL ( customContextMenuRequested ( QPoint ) ), this,
167 : SLOT ( CustomContextMenuTableView ( QPoint ) ) );
168 0 : connect ( ui->PrintView, SIGNAL ( triggered() ), this, SLOT ( PrintCurrentView() ) );
169 0 : connect ( ui->exportView, SIGNAL ( triggered() ), this, SLOT ( export_current_view() ) );
170 0 : connect ( ui->ClassTableSearchLine, SIGNAL( textChanged ( QString ) ), m_proxyModel, SLOT( setFilterRegExp( QString ) ) );
171 0 : connect ( ui->case_sensitive, SIGNAL ( stateChanged(int) ), this,
172 : SLOT (toggle_case_sensitive(int)) );
173 0 : }
174 :
175 0 : void dbse::SchemaMainWindow::show_file_info_active_schema()
176 : {
177 0 : show_file_info(QString::fromStdString(
178 0 : KernelWrapper::GetInstance().GetActiveSchema()));
179 0 : }
180 :
181 0 : void dbse::SchemaMainWindow::show_file_info()
182 : {
183 0 : QModelIndex index = ui->FileView->currentIndex();
184 0 : show_file_info(index);
185 0 : }
186 0 : void dbse::SchemaMainWindow::show_file_info(QModelIndex index)
187 : {
188 0 : QStringList row = FileModel->getRowFromIndex ( index );
189 0 : show_file_info(row.at ( 0 ));
190 0 : }
191 0 : void dbse::SchemaMainWindow::show_file_info(QString fn) {
192 0 : bool widget_found = false;
193 0 : for ( QWidget * widget : QApplication::allWidgets() ) {
194 0 : auto sfi = dynamic_cast<SchemaFileInfo *> ( widget );
195 0 : if ( sfi != nullptr ) {
196 0 : if ( (sfi->objectName() ).compare ( fn ) == 0 ) {
197 0 : sfi->raise();
198 0 : sfi->setVisible ( true );
199 0 : sfi->activateWindow();
200 : widget_found = true;
201 : break;
202 : }
203 : }
204 0 : }
205 0 : if ( !widget_found ) {
206 0 : auto info = new SchemaFileInfo(fn.toStdString());
207 0 : connect (info, &SchemaFileInfo::files_updated,
208 : this, &SchemaMainWindow::update_models);
209 0 : connect (info, &SchemaFileInfo::new_window,
210 : this, &SchemaMainWindow::connect_file_info);
211 0 : info->show();
212 : }
213 0 : }
214 0 : void dbse::SchemaMainWindow::connect_file_info(SchemaFileInfo* win){
215 0 : connect (win, &SchemaFileInfo::files_updated,
216 : this, &SchemaMainWindow::update_models);
217 0 : }
218 0 : void dbse::SchemaMainWindow::BuildFileModel()
219 : {
220 0 : QStringList Headers { "File Name", "Access", "Status" };
221 :
222 0 : if ( FileModel != nullptr )
223 : {
224 0 : delete FileModel;
225 : }
226 0 : FileModel = new CustomFileModel ( Headers );
227 :
228 0 : ui->FileView->setModel ( FileModel );
229 0 : ui->FileView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
230 0 : ui->FileView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
231 0 : ui->FileView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
232 0 : }
233 :
234 0 : void dbse::SchemaMainWindow::BuildTableModel()
235 : {
236 0 : QStringList Headers
237 0 : { "Class Name" };
238 :
239 0 : if ( TableModel != nullptr )
240 : {
241 0 : delete TableModel;
242 : }
243 0 : TableModel = new CustomTableModel ( Headers );
244 :
245 0 : m_proxyModel->setSourceModel(TableModel);
246 0 : ui->ClassTableView->setModel ( m_proxyModel );
247 0 : }
248 :
249 0 : int dbse::SchemaMainWindow::ShouldSaveViewChanges() const
250 : {
251 0 : QString modified_views;
252 0 : for (int index=0; index<ui->TabWidget->count(); ++index) {
253 0 : auto tab = dynamic_cast<SchemaTab *> (ui->TabWidget->widget(index));
254 0 : if (tab->GetScene()->IsModified()) {
255 0 : auto label = ui->TabWidget->tabText(index);
256 0 : label = label.remove('*');
257 0 : modified_views.append(" " + label + "\n");
258 0 : }
259 : }
260 0 : if (!modified_views.isEmpty()) {
261 0 : QString message ( "There are unsaved changes in the schema views:\n");
262 0 : message.append (modified_views);
263 0 : message.append ("Do you want to save the changes in the schema views?\n" );
264 0 : return QMessageBox::question (
265 0 : 0, tr ( "SchemaEditor" ),
266 : message,
267 : QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard );
268 0 : }
269 :
270 : return QMessageBox::Discard;
271 0 : }
272 :
273 0 : int dbse::SchemaMainWindow::ShouldSaveChanges() const
274 : {
275 : // if ( KernelWrapper::GetInstance().GetUndoStack()->isClean() )
276 0 : auto modified = KernelWrapper::GetInstance().ModifiedSchemaFiles();
277 0 : if (modified.empty())
278 : {
279 : return QMessageBox::Discard;
280 : }
281 :
282 0 : std::string msg = "There are unsaved changes in the following files:\n\n"
283 0 : + modified + "Do you want to save the changes in the schema?\n";
284 0 : return QMessageBox::question (
285 0 : 0, tr ( "SchemaEditor" ),
286 0 : QString ( msg.c_str() ),
287 0 : QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save );
288 0 : }
289 :
290 0 : void dbse::SchemaMainWindow::AddNewClass()
291 : {
292 0 : SchemaClassEditor::createNewClass();
293 0 : BuildFileModel();
294 0 : }
295 :
296 0 : void dbse::SchemaMainWindow::RemoveClass()
297 : {
298 0 : QModelIndex Index = ui->ClassTableView->currentIndex();
299 0 : QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
300 0 : QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
301 0 : OksClass * SchemaClass = KernelWrapper::GetInstance().FindClass ( Row.at (
302 0 : 0 ).toStdString() );
303 :
304 0 : if ( SchemaClass->all_sub_classes()->size() != 0 )
305 : {
306 0 : QMessageBox::warning ( 0, "Schema editor",
307 0 : QString ( "Cannot delete class because it has sub-classes." ) );
308 0 : return;
309 : }
310 0 : else if ( KernelWrapper::GetInstance().AnyClassReferenceThis ( SchemaClass ) )
311 : {
312 0 : QMessageBox::warning ( 0, "Schema editor",
313 0 : QString ( "Cannot delete class because some classes references it." ) );
314 0 : return;
315 : }
316 : else
317 : {
318 0 : QString Name = QString::fromStdString ( SchemaClass->get_name() );
319 0 : KernelWrapper::GetInstance().PushRemoveClassCommand ( SchemaClass, SchemaClass->get_name(),
320 0 : SchemaClass->get_description(),
321 0 : SchemaClass->get_is_abstract() );
322 0 : BuildFileModel();
323 0 : }
324 0 : }
325 :
326 0 : void dbse::SchemaMainWindow::editClass() {
327 0 : QModelIndex Index = ui->ClassTableView->currentIndex();
328 0 : QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
329 0 : QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
330 :
331 0 : if ( !Row.isEmpty() ) {
332 0 : bool widget_found = false;
333 0 : QString class_name = Row.at ( 0 );
334 0 : OksClass * class_info = KernelWrapper::GetInstance().FindClass (
335 0 : class_name.toStdString() );
336 :
337 0 : for ( QWidget * widget : QApplication::allWidgets() ) {
338 0 : auto editor = dynamic_cast<SchemaClassEditor *> ( widget );
339 0 : if ( editor != nullptr ) {
340 0 : if ( ( editor->objectName() ).compare ( class_name ) == 0 ) {
341 0 : editor->raise();
342 0 : editor->setVisible ( true );
343 0 : editor->activateWindow();
344 : widget_found = true;
345 : }
346 : }
347 0 : }
348 0 : if ( !widget_found ) {
349 0 : SchemaClassEditor * editor = new SchemaClassEditor ( class_info );
350 0 : editor->show();
351 : }
352 0 : }
353 0 : }
354 :
355 0 : void dbse::SchemaMainWindow::SetSchemaFileActive()
356 : {
357 0 : QModelIndex index = ui->FileView->currentIndex();
358 0 : QString file = FileModel->getRowFromIndex ( index ).at(0);
359 0 : try {
360 0 : KernelWrapper::GetInstance().SetActiveSchema ( file.toStdString() );
361 : }
362 0 : catch (oks::CanNotSetActiveFile& exc) {
363 0 : QMessageBox::warning(0,
364 : "Set Active Schema",
365 0 : QString("Could not make schema active!\n\n").append(QString(exc.what())),
366 : QMessageBox::Ok);
367 0 : return;
368 0 : }
369 0 : update_window_title(file);
370 :
371 : // In case we are highlighting classes in the active file, redraw current
372 : // view tab now we've changed active file
373 0 : SchemaTab * current_tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
374 0 : SchemaGraphicsScene * scene = current_tab->GetScene();
375 0 : scene->update();
376 :
377 0 : BuildFileModel();
378 0 : }
379 :
380 0 : bool dbse::SchemaMainWindow::check_schema_file(QString qfilename){
381 0 : std::string filename = qfilename.toStdString();
382 0 : std::set<std::string> includes;
383 0 : KernelWrapper::GetInstance().get_all_includes(filename, includes);
384 :
385 0 : QString advice{"<br><br>Use the File info window to fix the problem."};
386 0 : for (auto cls: KernelWrapper::GetInstance().get_schema_classes(filename)) {
387 0 : auto relationships = cls->direct_relationships();
388 0 : if (relationships != nullptr) {
389 0 : for (auto rel: *relationships) {
390 0 : auto rel_class = rel->get_class_type();
391 0 : if (rel_class == nullptr) {
392 0 : QString warning = "<b>Warning</b> class <i>"
393 0 : + QString::fromStdString(cls->get_name())
394 0 : + "</i> has relationship "
395 0 : + QString::fromStdString(rel->get_name())
396 0 : + " referring to class <i>"
397 0 : + QString::fromStdString(rel->get_type())
398 0 : + "</i> which is not loaded<br>";
399 0 : QMessageBox::warning(0,
400 : "Check Schema",
401 0 : warning+advice,
402 : QMessageBox::Ok);
403 0 : show_file_info(qfilename);
404 0 : return false;
405 0 : }
406 0 : auto file = rel_class->get_file()->get_full_file_name();
407 0 : if (file != filename && !includes.contains(file)) {
408 0 : QString warning = "<b>Warning</b> class <i>"
409 0 : + QString::fromStdString(cls->get_name())
410 0 : + "</i> has relationship "
411 0 : + QString::fromStdString(rel->get_name())
412 0 : + " referring to class <i>"
413 0 : + QString::fromStdString(rel->get_class_type()->get_name())
414 0 : + "</i> from " + QString::fromStdString(file)
415 0 : + " which is not included by " + qfilename;
416 0 : QMessageBox::warning(0,
417 : "Check Schema",
418 0 : warning+advice,
419 : QMessageBox::Ok);
420 0 : show_file_info(qfilename);
421 0 : return false;
422 0 : }
423 0 : }
424 : }
425 :
426 0 : auto super_classes = cls->direct_super_classes();
427 0 : if (super_classes != nullptr) {
428 0 : for (auto sc: *super_classes) {
429 0 : auto sclass = KernelWrapper::GetInstance().FindClass(*sc);
430 0 : if (sclass == nullptr) {
431 0 : QString warning = "<b>Warning</b> class <i>"
432 0 : + QString::fromStdString(cls->get_name())
433 0 : + "</i> refers to super class <i>" + QString::fromStdString(*sc)
434 0 : + "</i> which is not known<br>";
435 0 : QMessageBox::warning(0,
436 : "Check Schema",
437 0 : warning+advice,
438 : QMessageBox::Ok);
439 0 : show_file_info(qfilename);
440 0 : return false;
441 0 : }
442 0 : auto file = sclass->get_file()->get_full_file_name();
443 0 : if (file != filename && !includes.contains(file)) {
444 0 : QString warning = "<b>Warning</b> class <i>"
445 0 : + QString::fromStdString(cls->get_name())
446 0 : + "</i> refers to super class <i>" + QString::fromStdString(*sc)
447 0 : + "</i> from " + QString::fromStdString(file)
448 0 : + " which is not included by" + qfilename;
449 0 : QMessageBox::warning(0,
450 : "Check Schema",
451 0 : warning+advice,
452 : QMessageBox::Ok);
453 0 : show_file_info(qfilename);
454 0 : return false;
455 0 : }
456 0 : }
457 : }
458 0 : }
459 0 : return true;
460 0 : }
461 :
462 0 : bool dbse::SchemaMainWindow::save_schema_file(QString filename){
463 0 : if (!check_schema_file(filename)) {
464 : return false;
465 : }
466 0 : bool status;
467 0 : QString message;
468 0 : try {
469 0 : KernelWrapper::GetInstance().SaveSchema (filename.toStdString());
470 0 : message = QString ( "File %1 saved" ).arg (filename);
471 0 : status = true;
472 : }
473 0 : catch (const oks::exception& exc) {
474 0 : message = QString ( "Failed to save file %1" ).arg (filename);
475 0 : status = false;
476 0 : }
477 0 : ui->StatusBar->showMessage( message );
478 0 : return status;
479 0 : }
480 :
481 0 : void dbse::SchemaMainWindow::SaveSchemaFile()
482 : {
483 0 : QModelIndex index = ui->FileView->currentIndex();
484 0 : const auto file = FileModel->getRowFromIndex (index).at (0);
485 0 : save_schema_file (file);
486 0 : BuildFileModel();
487 0 : }
488 :
489 0 : void dbse::SchemaMainWindow::PrintCurrentView()
490 : {
491 0 : SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
492 :
493 0 : if (m_printer == nullptr) {
494 0 : m_printer = new QPrinter;
495 : }
496 :
497 0 : if ( QPrintDialog ( m_printer ).exec() == QDialog::Accepted )
498 : {
499 0 : QPainter painter ( m_printer );
500 0 : painter.setRenderHint ( QPainter::Antialiasing );
501 :
502 0 : SchemaGraphicsScene * Scene = CurrentTab->GetScene();
503 0 : QGraphicsView * View = CurrentTab->GetView();
504 0 : Scene->render ( &painter, QRectF(), View->viewport()->rect() );
505 0 : }
506 0 : }
507 0 : void dbse::SchemaMainWindow::export_current_view(){
508 0 : auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
509 :
510 0 : auto file = QFileDialog::getSaveFileName(
511 0 : this, tr("Export to SVG"),
512 0 : m_export_path,
513 0 : tr("SVG files (*.svg);;All files (*)"));
514 0 : if (file.isEmpty()) {
515 0 : return;
516 : }
517 :
518 0 : auto spos = file.lastIndexOf('/');
519 0 : if (spos != -1) {
520 0 : m_export_path = file;
521 0 : m_export_path.truncate(spos);
522 : }
523 :
524 0 : if (!file.endsWith(".svg")) {
525 0 : file.append(".svg");
526 : }
527 0 : QSvgGenerator generator;
528 0 : generator.setFileName(file);
529 0 : auto view = tab->GetView();
530 0 : auto vpr=view->viewport()->rect();
531 0 : generator.setSize(QSize(vpr.width(),vpr.height()));
532 0 : generator.setViewBox(vpr);
533 :
534 0 : QPainter painter;
535 0 : painter.begin(&generator);
536 0 : auto scene = tab->GetScene();
537 0 : scene->render ( &painter, QRectF(), view->viewport()->rect() );
538 0 : painter.end();
539 0 : }
540 :
541 0 : void dbse::SchemaMainWindow::closeEvent ( QCloseEvent * event )
542 : {
543 0 : int UserChoice = ShouldSaveChanges();
544 :
545 0 : if ( UserChoice == QMessageBox::Save )
546 : {
547 0 : if (!SaveModifiedSchema()) {
548 0 : event->ignore();
549 0 : return;
550 : }
551 : }
552 0 : else if ( UserChoice == QMessageBox::Cancel )
553 : {
554 0 : event->ignore();
555 0 : return;
556 : }
557 :
558 0 : UserChoice = ShouldSaveViewChanges();
559 0 : if ( UserChoice == QMessageBox::Cancel )
560 : {
561 0 : event->ignore();
562 0 : return;
563 : }
564 :
565 0 : KernelWrapper::GetInstance().CloseAllSchema();
566 :
567 0 : if (m_save_layout_on_exit) {
568 0 : save_layout();
569 : }
570 :
571 0 : for ( QWidget * Widget : QApplication::allWidgets() )
572 : {
573 0 : Widget->close();
574 0 : }
575 :
576 0 : event->accept();
577 : }
578 :
579 0 : void dbse::SchemaMainWindow::update_models() {
580 0 : BuildFileModel();
581 0 : BuildTableModel();
582 0 : }
583 :
584 0 : void dbse::SchemaMainWindow::OpenSchemaFile(QString SchemaFile) {
585 0 : OksFile* file{nullptr};
586 0 : if(!SchemaFile.isEmpty()) {
587 0 : try {
588 0 : file = KernelWrapper::GetInstance().LoadSchema(SchemaFile.toStdString());
589 :
590 0 : if (m_schema_directory == QString(".")) {
591 0 : std::vector<std::string> fnames;
592 0 : KernelWrapper::GetInstance().GetSchemaFiles(fnames);
593 0 : std::string dir = fnames[0].substr(0,fnames[0].find_last_of('/'));
594 0 : m_schema_directory.setPath(QString::fromStdString(dir));
595 0 : }
596 :
597 : #ifdef QT_DEBUG
598 : /// KernelWrapper::GetInstance().ShowSchemaClasses();
599 : #endif
600 : }
601 0 : catch(oks::exception &Ex) {
602 0 : QMessageBox::warning(0,
603 : "Load Schema",
604 0 : QString("Could not load schema!\n\n").append(QString(Ex.what())),
605 : QMessageBox::Ok);
606 0 : }
607 :
608 0 : if (KernelWrapper::GetInstance().GetActiveSchema().empty()) {
609 0 : try {
610 0 : KernelWrapper::GetInstance().SetActiveSchema(SchemaFile.toStdString());
611 : }
612 0 : catch (oks::CanNotSetActiveFile& exc) {
613 0 : QMessageBox::warning(0,
614 : "Load Schema",
615 0 : QString("Could not make schema active!\n\n").append(QString(exc.what())),
616 : QMessageBox::Ok);
617 0 : }
618 : }
619 :
620 0 : BuildTableModel();
621 0 : BuildFileModel();
622 :
623 0 : update_window_title(QFileInfo(SchemaFile).fileName());
624 : //ui->CreateNewSchema->setDisabled (true );
625 : //ui->OpenFileSchema->setDisabled (true );
626 0 : if (file != nullptr) {
627 0 : check_schema_file(QString::fromStdString(file->get_full_file_name()));
628 : }
629 : }
630 0 : }
631 :
632 0 : void dbse:: SchemaMainWindow::update_window_title(QString text) {
633 0 : m_title.remove(QRegularExpression(": --.*"));
634 0 : m_title.append(QString(": -- ") + text);
635 0 : setWindowTitle ( m_title );
636 0 : }
637 :
638 0 : void dbse::SchemaMainWindow::OpenSchemaFile()
639 : {
640 0 : QFileDialog FileDialog ( this, tr ( "Open Schema File" ), ".",
641 0 : tr ( "XML schema files (*.schema.xml);;All files (*)" ) );
642 0 : FileDialog.setAcceptMode ( QFileDialog::AcceptOpen );
643 0 : FileDialog.setFileMode ( QFileDialog::AnyFile );
644 0 : FileDialog.setViewMode ( QFileDialog::Detail );
645 0 : FileDialog.setDirectory ( m_schema_directory );
646 0 : FileDialog.setSidebarUrls(m_path_urls);
647 0 : QStringList FilesSelected;
648 0 : QString SchemaPath;
649 :
650 0 : if ( FileDialog.exec() )
651 : {
652 0 : FilesSelected = FileDialog.selectedFiles();
653 : }
654 :
655 0 : if ( FilesSelected.size() )
656 : {
657 0 : m_schema_directory = FileDialog.directory();
658 0 : SchemaPath = FilesSelected.value ( 0 );
659 : }
660 :
661 0 : OpenSchemaFile(SchemaPath);
662 0 : }
663 :
664 0 : bool dbse::SchemaMainWindow::SaveModifiedSchema()
665 : {
666 0 : bool result = true;
667 0 : for (auto file: KernelWrapper::GetInstance().get_modified_schema_files()) {
668 0 : if (!save_schema_file(QString::fromStdString(file))) {
669 0 : result = false;
670 : }
671 0 : }
672 0 : BuildFileModel();
673 0 : return result;
674 : }
675 :
676 0 : void dbse::SchemaMainWindow::SaveSchema()
677 : {
678 0 : auto modified = KernelWrapper::GetInstance().ModifiedSchemaFiles();
679 0 : if (modified.empty())
680 : {
681 0 : QMessageBox::information ( 0, "Schema editor",
682 0 : QString ( "No modified schema files need saving" ) );
683 :
684 : }
685 : else {
686 0 : SaveModifiedSchema();
687 : }
688 0 : BuildFileModel();
689 0 : }
690 :
691 0 : void dbse::SchemaMainWindow::CreateNewSchema()
692 : {
693 0 : QFileDialog FileDialog (
694 0 : this, tr ( "Create New schema File" ), ".",
695 0 : tr ( "XML schema files (*.schema.xml);;All files (*)" ) );
696 0 : FileDialog.setAcceptMode ( QFileDialog::AcceptSave );
697 0 : FileDialog.setFileMode ( QFileDialog::AnyFile );
698 0 : FileDialog.setViewMode ( QFileDialog::Detail );
699 0 : FileDialog.setDirectory ( m_schema_directory );
700 0 : FileDialog.setSidebarUrls(m_path_urls);
701 0 : FileDialog.setLabelText(QFileDialog::Accept, "Create");
702 0 : if ( !FileDialog.exec() )
703 : {
704 : return;
705 : }
706 :
707 0 : QStringList FilesSelected = FileDialog.selectedFiles();
708 0 : if ( FilesSelected.isEmpty() )
709 : {
710 0 : QMessageBox::warning ( 0, "Schema editor",
711 0 : QString ( "Please provide a name for the schema !" ) );
712 0 : return;
713 : }
714 :
715 0 : QString FileName = FilesSelected.at(0);
716 0 : if ( !FileName.endsWith ( ".schema.xml" ) )
717 : {
718 0 : FileName.append ( ".schema.xml" );
719 : }
720 :
721 0 : QFile FileInfo ( FileName );
722 0 : std::string FileNameStd = FileInfo.fileName().toStdString();
723 :
724 0 : try
725 : {
726 0 : KernelWrapper::GetInstance().CreateNewSchema ( FileNameStd );
727 0 : KernelWrapper::GetInstance().SaveSchema ( FileNameStd );
728 0 : BuildTableModel();
729 0 : BuildFileModel();
730 0 : ui->CreateNewSchema->setDisabled (true );
731 0 : ui->OpenFileSchema->setDisabled (true );
732 : }
733 0 : catch ( oks::exception & Ex )
734 : {
735 0 : QMessageBox::warning (
736 : 0,
737 : "Schema editor",
738 0 : QString ( "Could not create file : %1.\n\n%2" ).arg ( QString::fromStdString (
739 0 : FileNameStd ) ).arg (
740 0 : QString ( Ex.what() ) ) );
741 0 : }
742 0 : }
743 :
744 0 : void dbse::SchemaMainWindow::ChangeCursorRelationship ( bool State )
745 : {
746 0 : if ( ui->SetInheritance->isChecked() )
747 : {
748 0 : ui->SetInheritance->setChecked ( false );
749 : }
750 :
751 0 : if ( State )
752 : {
753 0 : ui->TabWidget->setCursor ( Qt::CrossCursor );
754 : }
755 : else
756 : {
757 0 : ui->TabWidget->setCursor ( Qt::ArrowCursor );
758 : }
759 :
760 0 : KernelWrapper::GetInstance().SetInheritanceMode ( false );
761 0 : }
762 :
763 0 : void dbse::SchemaMainWindow::ChangeCursorInheritance ( bool State )
764 : {
765 0 : if ( ui->SetRelationship->isChecked() )
766 : {
767 0 : ui->SetRelationship->setChecked ( false );
768 : }
769 :
770 0 : if ( State )
771 : {
772 0 : ui->TabWidget->setCursor ( Qt::CrossCursor );
773 : }
774 : else
775 : {
776 0 : ui->TabWidget->setCursor ( Qt::ArrowCursor );
777 : }
778 :
779 0 : KernelWrapper::GetInstance().SetInheritanceMode ( true );
780 0 : }
781 :
782 0 : void dbse::SchemaMainWindow::add_tab()
783 : {
784 0 : auto index = ui->TabWidget->addTab ( new SchemaTab(), "unnamed Schema View" );
785 0 : ui->TabWidget->setCurrentIndex ( index );
786 0 : auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
787 0 : connect (tab->GetScene(), &SchemaGraphicsScene::sceneModified,
788 : this, &dbse::SchemaMainWindow::modifiedView);
789 0 : connect (tab->GetScene(), &SchemaGraphicsScene::saveRequested,
790 : this, &dbse::SchemaMainWindow::SaveView);
791 0 : }
792 :
793 0 : void dbse::SchemaMainWindow::modifiedView(bool modified) {
794 0 : auto index = ui->TabWidget->currentIndex();
795 0 : auto label = ui->TabWidget->tabText(index);
796 0 : if (modified && !label.endsWith("*")) {
797 0 : label += "*";
798 : }
799 0 : if (!modified && label.endsWith("*")) {
800 0 : label = label.remove('*');
801 : }
802 0 : ui->TabWidget->setTabText(index, label);
803 0 : }
804 :
805 0 : void dbse::SchemaMainWindow::NameView() {
806 0 : auto index = ui->TabWidget->currentIndex();
807 0 : bool ok;
808 0 : QString text = QInputDialog::getText(nullptr,
809 : "Schema editor: rename class view",
810 : "New view name:",
811 : QLineEdit::Normal,
812 : "New Class View",
813 0 : &ok);
814 0 : if(ok && !text.isEmpty()) {
815 0 : ui->TabWidget->setTabText(index, text);
816 0 : SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
817 0 : CurrentTab->setName(text);
818 : }
819 :
820 0 : auto newtext = ui->TabWidget->tabText(index);
821 0 : }
822 :
823 0 : void dbse::SchemaMainWindow::SaveView() {
824 0 : SchemaTab * tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
825 0 : if ( tab->GetScene()->items().size() != 0 )
826 : {
827 0 : auto file_name = tab->getFileName();
828 0 : if (file_name == "./") {
829 0 : SaveViewAs();
830 0 : return;
831 : }
832 0 : write_view_file(file_name, tab);
833 0 : }
834 : }
835 0 : void dbse::SchemaMainWindow::SaveViewAs() {
836 0 : SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
837 0 : if ( CurrentTab->GetScene()->items().size() != 0 )
838 : {
839 0 : auto defName = CurrentTab->getFileName();
840 0 : if (defName == "./") {
841 0 : defName = m_view_dir;
842 : }
843 0 : QString FileName = QFileDialog::getSaveFileName (
844 0 : this, tr ( "Save View" ), defName,
845 0 : tr("View files (*.view);;All files (*)") );
846 :
847 0 : if (! FileName.isEmpty()) {
848 0 : auto spos = FileName.lastIndexOf('/');
849 0 : if (spos != -1) {
850 0 : m_view_dir = FileName;
851 0 : m_view_dir.truncate(spos);
852 : }
853 :
854 0 : if ( !FileName.endsWith ( ".view" ) ) {
855 0 : FileName.append ( ".view" );
856 : }
857 :
858 0 : CurrentTab->setFileName ( FileName );
859 0 : auto text = QFileInfo(FileName).baseName();
860 0 : CurrentTab->setName(text);
861 0 : auto index = ui->TabWidget->currentIndex();
862 0 : ui->TabWidget->setTabText(index, text);
863 :
864 0 : write_view_file(FileName, CurrentTab);
865 0 : }
866 0 : }
867 0 : }
868 :
869 0 : void dbse::SchemaMainWindow::write_view_file (const QString& file_name,
870 : SchemaTab* tab) {
871 0 : QFile file ( file_name );
872 0 : file.open ( QIODevice::WriteOnly );
873 :
874 0 : for ( QGraphicsItem * item : tab->GetScene()->items() ) {
875 0 : auto object = dynamic_cast<SchemaGraphicObject *> ( item );
876 0 : if ( object != nullptr ) {
877 0 : QString description = object->GetClassName() + ","
878 0 : + QString::number ( object->scenePos().x() ) + ","
879 0 : + QString::number ( object->scenePos().y() ) + "\n";
880 0 : file.write ( description.toUtf8() );
881 0 : }
882 : else {
883 0 : auto note = dynamic_cast<SchemaGraphicNote*> (item);
884 0 : if ( note != nullptr && !note->text().isEmpty()) {
885 0 : auto text = note->text().replace("\n", "<br>");
886 0 : text = text.replace(",", "<comma>");
887 0 : QString line = "#,"
888 0 : + QString::number ( note->scenePos().x() ) + ","
889 0 : + QString::number ( note->scenePos().y() ) + ","
890 0 : + text + "\n";
891 0 : file.write ( line.toUtf8() );
892 0 : }
893 : }
894 0 : }
895 :
896 0 : file.close();
897 0 : auto message = QString("Saved view to %1").arg(file_name);
898 0 : ui->StatusBar->showMessage( message );
899 0 : tab->GetScene()->ClearModified();
900 0 : }
901 :
902 0 : void dbse::SchemaMainWindow::LoadView() {
903 0 : QString ViewPath = QFileDialog::getOpenFileName (
904 : this,
905 0 : tr ("Open view file"),
906 0 : m_view_dir,
907 0 : tr("View files (*.view);;All files (*)"));
908 :
909 0 : if ( !ViewPath.isEmpty() )
910 : {
911 0 : auto spos = ViewPath.lastIndexOf('/');
912 0 : if (spos != -1) {
913 0 : m_view_dir = ViewPath;
914 0 : m_view_dir.truncate(spos);
915 : }
916 0 : QFile ViewFile ( ViewPath );
917 0 : ViewFile.open ( QIODevice::ReadOnly );
918 :
919 0 : auto text = QFileInfo(ViewPath).baseName();
920 0 : auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
921 0 : if (!tab->getName().isEmpty() || tab->GetScene()->IsModified()) {
922 0 : add_tab();
923 0 : tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
924 : }
925 0 : auto index = ui->TabWidget->currentIndex();
926 0 : ui->TabWidget->setTabText(index, text);
927 0 : tab->setName(text);
928 0 : tab->setFileName(ViewPath);
929 :
930 0 : QStringList ClassesNames;
931 0 : QList<QPointF> Positions;
932 0 : QList<QPointF> note_positions;
933 0 : QStringList notes;
934 0 : while ( !ViewFile.atEnd() )
935 : {
936 0 : QString Line ( ViewFile.readLine() );
937 0 : if (!Line.isEmpty()) {
938 0 : QStringList ObjectDescription = Line.split ( "," );
939 0 : QPointF Position;
940 0 : Position.setX ( ObjectDescription.at ( 1 ).toInt() );
941 0 : Position.setY ( ObjectDescription.at ( 2 ).toInt() );
942 0 : if (ObjectDescription.at ( 0 ) == "#") {
943 0 : note_positions.append (Position);
944 0 : auto note_text = ObjectDescription.at(3);
945 0 : if (note_text.back() == '\n') {
946 0 : note_text.chop(1);
947 : }
948 0 : note_text = note_text.replace("<br>", "\n");
949 0 : note_text = note_text.replace("<comma>", ",");
950 0 : notes.append ( note_text );
951 0 : }
952 : else {
953 0 : ClassesNames.append ( ObjectDescription.at ( 0 ) );
954 0 : Positions.append ( Position );
955 : }
956 0 : }
957 0 : }
958 0 : ViewFile.close();
959 :
960 0 : auto message = QString("Loaded view from %1").arg(ViewPath);
961 0 : ui->StatusBar->showMessage( message );
962 :
963 0 : auto scene = tab->GetScene();
964 0 : scene->CleanItemMap();
965 0 : auto missing = scene->AddItemsToScene ( ClassesNames, Positions );
966 0 : if (!missing.empty()) {
967 0 : QString warning_text{"The following classes in "};
968 0 : warning_text.append(QFileInfo(ViewPath).fileName());
969 0 : warning_text.append(" are not present in the loaded schema:\n ");
970 0 : warning_text.append(missing.join(",\n "));
971 0 : QMessageBox::warning(this, tr("Load View"), warning_text);
972 0 : }
973 0 : scene->ClearModified();
974 :
975 0 : scene->add_notes(notes, note_positions);
976 0 : }
977 0 : }
978 :
979 0 : void dbse::SchemaMainWindow::LaunchClassEditor ( QModelIndex Index )
980 : {
981 0 : QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
982 0 : QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
983 :
984 0 : if ( !Row.isEmpty() ) {
985 0 : SchemaClassEditor::launch(Row.at ( 0 ));
986 : }
987 0 : }
988 :
989 0 : void dbse::SchemaMainWindow::close_tab() {
990 0 : RemoveTab(ui->TabWidget->currentIndex());
991 0 : }
992 :
993 0 : void dbse::SchemaMainWindow::RemoveTab ( int index )
994 : {
995 0 : if ( index == -1 ) {
996 : return;
997 : }
998 :
999 0 : auto tab = dynamic_cast<SchemaTab *> (ui->TabWidget->widget(index));
1000 0 : if (tab->GetScene()->IsModified()) {
1001 0 : auto choice = QMessageBox::question (
1002 0 : 0, tr ( "SchemaEditor" ),
1003 0 : QString ( "There are unsaved changes in the schema view:\n"
1004 0 : "Do you really want to delete this schema view?\n" ),
1005 : QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel );
1006 0 : if (choice == QMessageBox::Cancel) {
1007 : return;
1008 : }
1009 : }
1010 0 : ui->TabWidget->removeTab ( index );
1011 0 : delete tab;
1012 0 : if ( ui->TabWidget->count() == 0 ) {
1013 0 : add_tab();
1014 : }
1015 : }
1016 :
1017 0 : void dbse::SchemaMainWindow::CustomContextMenuFileView ( QPoint Pos )
1018 : {
1019 0 : if ( ContextMenuFileView == nullptr )
1020 : {
1021 0 : ContextMenuFileView = new QMenu ( this );
1022 :
1023 0 : QAction * Act = new QAction ( tr ( "Set as Active Schema" ), this );
1024 0 : connect ( Act, SIGNAL ( triggered() ), this, SLOT ( SetSchemaFileActive() ) );
1025 0 : QAction * Sav = new QAction ( tr ( "Save Schema File" ), this );
1026 0 : connect ( Sav, SIGNAL ( triggered() ), this, SLOT ( SaveSchemaFile() ) );
1027 0 : QAction * info = new QAction ( tr ( "Show file info" ), this );
1028 0 : connect ( info, SIGNAL ( triggered() ), this, SLOT ( show_file_info() ) );
1029 :
1030 0 : ContextMenuFileView->addAction ( info );
1031 0 : ContextMenuFileView->addAction ( Act );
1032 0 : ContextMenuFileView->addAction ( Sav );
1033 : }
1034 :
1035 0 : QModelIndex index = ui->FileView->currentIndex();
1036 :
1037 0 : if ( index.isValid() )
1038 : {
1039 0 : QStringList row = FileModel->getRowFromIndex ( index );
1040 0 : if (row.at(1) == "RW") {
1041 0 : ContextMenuFileView->actions().at(2)->setVisible(true);
1042 0 : if (!row.at(2).contains("Active")) {
1043 0 : ContextMenuFileView->actions().at(1)->setVisible(true);
1044 : }
1045 : else {
1046 0 : ContextMenuFileView->actions().at(1)->setVisible(false);
1047 : }
1048 : }
1049 : else {
1050 0 : ContextMenuFileView->actions().at(2)->setVisible(false);
1051 0 : ContextMenuFileView->actions().at(1)->setVisible(false);
1052 : }
1053 0 : ContextMenuFileView->exec ( ui->FileView->mapToGlobal ( Pos ) );
1054 0 : }
1055 0 : }
1056 :
1057 0 : void dbse::SchemaMainWindow::CustomContextMenuTableView ( QPoint Pos )
1058 : {
1059 0 : if ( ContextMenuTableView == nullptr )
1060 : {
1061 0 : ContextMenuTableView = new QMenu ( this );
1062 :
1063 0 : QAction * add = new QAction ( tr ( "&Add New Class" ), this );
1064 0 : connect ( add, SIGNAL ( triggered() ), this, SLOT ( AddNewClass() ) );
1065 :
1066 0 : QAction * remove = new QAction ( tr ( "&Remove Selected Class" ), this );
1067 0 : connect ( remove, SIGNAL ( triggered() ), this, SLOT ( RemoveClass() ) );
1068 :
1069 0 : QAction * edit = new QAction ( tr ( "&Edit Selected Class" ), this );
1070 0 : connect ( edit, SIGNAL ( triggered() ), this, SLOT ( editClass() ) );
1071 :
1072 0 : ContextMenuTableView->addAction ( add );
1073 0 : ContextMenuTableView->addAction ( edit );
1074 0 : ContextMenuTableView->addAction ( remove );
1075 : }
1076 :
1077 0 : QModelIndex Index = ui->ClassTableView->currentIndex();
1078 :
1079 0 : if ( Index.isValid() )
1080 : {
1081 0 : ContextMenuTableView->exec ( ui->ClassTableView->mapToGlobal ( Pos ) );
1082 : }
1083 0 : }
1084 :
1085 0 : void dbse::SchemaMainWindow::toggle_case_sensitive ( int /*state*/ )
1086 : {
1087 0 : if ( ui->case_sensitive->isChecked() ) {
1088 0 : m_proxyModel->setFilterCaseSensitivity ( Qt::CaseSensitive );
1089 : }
1090 : else {
1091 0 : m_proxyModel->setFilterCaseSensitivity ( Qt::CaseInsensitive );
1092 : }
1093 0 : }
1094 0 : void dbse::SchemaMainWindow::update_view() {
1095 0 : auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
1096 0 : tab->GetScene()->update();
1097 :
1098 0 : BuildTableModel();
1099 0 : BuildFileModel();
1100 0 : }
1101 :
1102 0 : void dbse::SchemaMainWindow::edit_settings() {
1103 0 : if (m_settings == nullptr) {
1104 0 : m_settings = new SchemaSettings(this);
1105 0 : connect(m_settings, SIGNAL(settings_updated()), this, SLOT(update_view()));
1106 : }
1107 0 : m_settings->show();
1108 0 : }
1109 :
1110 0 : void dbse::SchemaMainWindow::save_layout() {
1111 0 : QSettings settings;
1112 0 : settings.beginGroup("MainWindow-layout");
1113 0 : settings.setValue("size", size());
1114 0 : settings.setValue("pos", pos());
1115 0 : settings.setValue("geometry", saveGeometry());
1116 0 : settings.setValue("state", saveState());
1117 0 : settings.setValue("diagrams-visible", ui->TabWidget->isVisible());
1118 0 : settings.setValue("statusbar-visible", ui->StatusBar->isVisible());
1119 0 : settings.endGroup();
1120 0 : }
1121 :
1122 0 : void dbse::SchemaMainWindow::restore_layout() {
1123 0 : QSettings settings;
1124 0 : settings.beginGroup("MainWindow-layout");
1125 0 : if (settings.contains("size")) {
1126 0 : resize(settings.value("size").toSize());
1127 : }
1128 0 : if (settings.contains("pos")) {
1129 0 : move(settings.value("pos").toPoint());
1130 : }
1131 0 : if (settings.contains("geometry")) {
1132 0 : restoreGeometry(settings.value("geometry").toByteArray());
1133 : }
1134 0 : if (settings.contains("state")) {
1135 0 : restoreState(settings.value("state").toByteArray());
1136 : }
1137 :
1138 0 : auto visible = settings.value("diagrams-visible", true).toBool();
1139 0 : ui->displayDiagrams->setChecked(visible);
1140 0 : ui->TabWidget->setVisible(visible);
1141 :
1142 0 : visible = settings.value("statusbar-visible", true).toBool();
1143 0 : ui->StatusBar->setVisible(visible);
1144 0 : ui->displayStatus_bar->setChecked(visible);
1145 :
1146 0 : ui->displayToolbar->setChecked(ui->MainToolBar->isVisible());
1147 0 : settings.endGroup();
1148 :
1149 0 : settings.beginGroup("MainWindow");
1150 0 : m_save_layout_on_exit = settings.value("saveLayout", false).toBool();
1151 0 : settings.endGroup();
1152 0 : }
1153 :
1154 0 : void dbse::SchemaMainWindow::default_layout() {
1155 0 : restoreGeometry(m_default_geometry);
1156 0 : restoreState(m_default_state);
1157 0 : resize(m_default_size);
1158 :
1159 0 : ui->displayDiagrams->setChecked(true);
1160 0 : ui->TabWidget->setVisible(true);
1161 0 : ui->StatusBar->setVisible(true);
1162 0 : ui->displayStatus_bar->setChecked(true);
1163 0 : }
|