Graphviz 16.1.0~dev.20260902.0144
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 preview = true;
27 applyCairo = false;
28 settingsSet = false;
29}
30
32 static int sequenceNumber = 1;
33
34 isUntitled = true;
35 curFile = tr("graph%1.gv").arg(sequenceNumber++);
36 setWindowTitle(curFile + QLatin1String("[*]"));
37
38 connect(document(), &QTextDocument::contentsChange, this,
39 &MdiChild::documentWasModified);
40}
41
42bool MdiChild::loadFile(const QString &fileName) {
43 QFile file(fileName);
44 if (!file.open(QFile::ReadOnly | QFile::Text)) {
45 QMessageBox::warning(
46 this, tr("MDI"),
47 tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
48 return false;
49 }
50
51 QTextStream in(&file);
52 QApplication::setOverrideCursor(Qt::WaitCursor);
53 setPlainText(in.readAll());
54 QApplication::restoreOverrideCursor();
55
56 setCurrentFile(fileName);
57
58 connect(document(), &QTextDocument::contentsChange, this,
59 &MdiChild::documentWasModified);
60
61 return true;
62}
63
65 if (isUntitled) {
66 return saveAs();
67 }
68 return saveFile(curFile);
69}
70
72 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), curFile);
73 if (fileName.isEmpty())
74 return false;
75
76 return saveFile(fileName);
77}
78
79bool MdiChild::saveFile(const QString &fileName) {
80 QFile file(fileName);
81 if (!file.open(QFile::WriteOnly | QFile::Text)) {
82 QMessageBox::warning(
83 this, tr("MDI"),
84 tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString()));
85 return false;
86 }
87
88 QTextStream out(&file);
89 QApplication::setOverrideCursor(Qt::WaitCursor);
90#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
91 out.setCodec("UTF-8");
92#endif
93 out << toPlainText();
94 out.flush();
95 QApplication::restoreOverrideCursor();
96
97 setCurrentFile(fileName);
98 return true;
99}
100
101QString MdiChild::userFriendlyCurrentFile() { return strippedName(curFile); }
102
103void MdiChild::closeEvent(QCloseEvent *event) {
104 if (maybeSave()) {
105 event->accept();
106 } else {
107 event->ignore();
108 }
109}
110
111void MdiChild::documentWasModified() {
112 setWindowModified(document()->isModified());
113}
114
115bool MdiChild::maybeSave() {
116 if (document()->isModified()) {
117 QMessageBox::StandardButton ret;
118 ret = QMessageBox::warning(this, tr("MDI"),
119 tr("'%1' has been modified.\n"
120 "Do you want to save your changes?")
122 QMessageBox::Save | QMessageBox::Discard |
123 QMessageBox::Cancel);
124 if (ret == QMessageBox::Save)
125 return save();
126 if (ret == QMessageBox::Cancel)
127 return false;
128 }
129 return true;
130}
131
132void MdiChild::setCurrentFile(const QString &fileName) {
133 curFile = QFileInfo(fileName).canonicalFilePath();
134 isUntitled = false;
135 document()->setModified(false);
136 setWindowModified(false);
137 setWindowTitle(userFriendlyCurrentFile() + QLatin1String("[*]"));
138}
139
140QString MdiChild::strippedName(const QString &fullFileName) {
141 return QFileInfo(fullFileName).fileName();
142}
143
144bool MdiChild::loadPreview(const QString &fileName) {
145 if (previewFrm == nullptr) {
146 previewFrm = std::make_unique<ImageViewer>();
147 previewFrm->graphWindow = this;
148 QMdiSubWindow *s = parentFrm->mdiArea->addSubWindow(previewFrm.get());
149
150 s->resize(600, 400);
151 s->move(parentFrm->mdiArea->subWindowList().count() * 5,
152 parentFrm->mdiArea->subWindowList().count() * 5);
153 previewFrm->subWindowRef = s;
154 }
155 bool rv = previewFrm->open(fileName);
156 if (rv)
157 previewFrm->show();
158 return rv;
159}
160
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:101
std::unique_ptr< ImageViewer > previewFrm
Definition mdichild.h:38
bool saveFile(const QString &fileName)
Definition mdichild.cpp:79
bool saveAs()
Definition mdichild.cpp:71
bool save()
Definition mdichild.cpp:64
bool preview
Definition mdichild.h:35
bool loadPreview(const QString &fileName)
Definition mdichild.cpp:144
bool applyCairo
Definition mdichild.h:36
bool firstTime()
Definition mdichild.cpp:161
bool loadFile(const QString &fileName)
Definition mdichild.cpp:42
int layoutIdx
Definition mdichild.h:32
void newFile()
Definition mdichild.cpp:31
bool settingsSet
Definition mdichild.h:42
void closeEvent(QCloseEvent *event)
Definition mdichild.cpp:103
int renderIdx
Definition mdichild.h:33
CMainWindow * parentFrm
Definition mdichild.h:39
static int in(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
Definition compile.c:1641
char * fileName(ingraph_state *sp)
Return name of current file being processed.
Definition ingraphs.c:156
Definition grammar.c:90