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