Graphviz 16.1.1~dev.20261101.1716
Loading...
Searching...
No Matches
mdichild.cpp
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v2.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include "config.h"
12
13#include "mainwindow.h"
14#include "mdichild.h"
15#include <QtGlobal>
16#include <QtWidgets>
17#include <memory>
18
19#include "moc_mdichild.cpp"
20
22 setAttribute(Qt::WA_DeleteOnClose);
23 isUntitled = true;
24 layoutIdx = 0;
25 renderIdx = 0;
26}
27
29 static int sequenceNumber = 1;
30
31 isUntitled = true;
32 curFile = tr("graph%1.gv").arg(sequenceNumber++);
33 setWindowTitle(curFile + QLatin1String("[*]"));
34
35 connect(document(), &QTextDocument::contentsChange, this,
36 &MdiChild::documentWasModified);
37}
38
39bool MdiChild::loadFile(const QString &fileName) {
40 QFile file(fileName);
41 if (!file.open(QFile::ReadOnly | QFile::Text)) {
42 QMessageBox::warning(
43 this, tr("MDI"),
44 tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
45 return false;
46 }
47
48 QTextStream in(&file);
49 QApplication::setOverrideCursor(Qt::WaitCursor);
50 setPlainText(in.readAll());
51 QApplication::restoreOverrideCursor();
52
53 setCurrentFile(fileName);
54
55 connect(document(), &QTextDocument::contentsChange, this,
56 &MdiChild::documentWasModified);
57
58 return true;
59}
60
62 if (isUntitled) {
63 return saveAs();
64 }
65 return saveFile(curFile);
66}
67
69 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), curFile);
70 if (fileName.isEmpty())
71 return false;
72
73 return saveFile(fileName);
74}
75
76bool MdiChild::saveFile(const QString &fileName) {
77 QFile file(fileName);
78 if (!file.open(QFile::WriteOnly | QFile::Text)) {
79 QMessageBox::warning(
80 this, tr("MDI"),
81 tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString()));
82 return false;
83 }
84
85 QTextStream out(&file);
86 QApplication::setOverrideCursor(Qt::WaitCursor);
87#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
88 out.setCodec("UTF-8");
89#endif
90 out << toPlainText();
91 out.flush();
92 QApplication::restoreOverrideCursor();
93
94 setCurrentFile(fileName);
95 return true;
96}
97
98QString MdiChild::userFriendlyCurrentFile() { return strippedName(curFile); }
99
100void MdiChild::closeEvent(QCloseEvent *event) {
101 if (maybeSave()) {
102 event->accept();
103 } else {
104 event->ignore();
105 }
106}
107
108void MdiChild::documentWasModified() {
109 setWindowModified(document()->isModified());
110}
111
112bool MdiChild::maybeSave() {
113 if (document()->isModified()) {
114 QMessageBox::StandardButton ret;
115 ret = QMessageBox::warning(this, tr("MDI"),
116 tr("'%1' has been modified.\n"
117 "Do you want to save your changes?")
119 QMessageBox::Save | QMessageBox::Discard |
120 QMessageBox::Cancel);
121 if (ret == QMessageBox::Save)
122 return save();
123 if (ret == QMessageBox::Cancel)
124 return false;
125 }
126 return true;
127}
128
129void MdiChild::setCurrentFile(const QString &fileName) {
130 curFile = QFileInfo(fileName).canonicalFilePath();
131 isUntitled = false;
132 document()->setModified(false);
133 setWindowModified(false);
134 setWindowTitle(userFriendlyCurrentFile() + QLatin1String("[*]"));
135}
136
137QString MdiChild::strippedName(const QString &fullFileName) {
138 return QFileInfo(fullFileName).fileName();
139}
140
141bool MdiChild::loadPreview(const QString &fileName) {
142 if (previewFrm == nullptr) {
143 previewFrm = std::make_unique<ImageViewer>();
144 previewFrm->graphWindow = this;
145 QMdiSubWindow *s = parentFrm->mdiArea->addSubWindow(previewFrm.get());
146
147 s->resize(600, 400);
148 s->move(parentFrm->mdiArea->subWindowList().count() * 5,
149 parentFrm->mdiArea->subWindowList().count() * 5);
150 previewFrm->subWindowRef = s;
151 }
152 bool rv = previewFrm->open(fileName);
153 if (rv)
154 previewFrm->show();
155 return rv;
156}
static void out(agerrlevel_t level, const char *fmt, va_list args)
Report messages using a user-supplied or default write function.
Definition agerror.c:86
QMdiArea * mdiArea
Definition mainwindow.h:40
QString userFriendlyCurrentFile()
Definition mdichild.cpp:98
std::unique_ptr< ImageViewer > previewFrm
Definition mdichild.h:35
bool saveFile(const QString &fileName)
Definition mdichild.cpp:76
bool saveAs()
Definition mdichild.cpp:68
bool save()
Definition mdichild.cpp:61
bool loadPreview(const QString &fileName)
Definition mdichild.cpp:141
bool loadFile(const QString &fileName)
Definition mdichild.cpp:39
int layoutIdx
Definition mdichild.h:31
void newFile()
Definition mdichild.cpp:28
void closeEvent(QCloseEvent *event)
Definition mdichild.cpp:100
int renderIdx
Definition mdichild.h:32
CMainWindow * parentFrm
Definition mdichild.h:36
static int in(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
Definition compile.c:1645
char * fileName(ingraph_state *sp)
Return name of current file being processed.
Definition ingraphs.c:156
Definition grammar.c:90