Graphviz 12.0.1~dev.20240716.0800
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 <memory>
12#include <QtWidgets>
13#include <QtGlobal>
14#include "mdichild.h"
15#include "mainwindow.h"
16
18{
19 setAttribute(Qt::WA_DeleteOnClose);
20 isUntitled = true;
21 layoutIdx = 0;
22 renderIdx = 0;
23 preview = true;
24 applyCairo = false;
25 settingsSet = false;
26}
27
29{
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,
37 this, &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,
57 this, &MdiChild::documentWasModified);
58
59 return true;
60}
61
63{
64 if (isUntitled) {
65 return saveAs();
66 } else {
67 return saveFile(curFile);
68 }
69}
70
72{
73 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
74 curFile);
75 if (fileName.isEmpty())
76 return false;
77
78 return saveFile(fileName);
79}
80
81bool MdiChild::saveFile(const QString & fileName)
82{
83 QFile file(fileName);
84 if (!file.open(QFile::WriteOnly | QFile::Text)) {
85 QMessageBox::warning(this, tr("MDI"),
86 tr("Cannot write file %1:\n%2.")
87 .arg(fileName)
88 .arg(file.errorString()));
89 return false;
90 }
91
92 QTextStream out(&file);
93 QApplication::setOverrideCursor(Qt::WaitCursor);
94#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
95 out.setCodec("UTF-8");
96#endif
97 out << toPlainText();
98 out.flush();
99 QApplication::restoreOverrideCursor();
100
101 setCurrentFile(fileName);
102 return true;
103}
104
106{
107 return strippedName(curFile);
108}
109
110void MdiChild::closeEvent(QCloseEvent * event)
111{
112 if (maybeSave()) {
113 event->accept();
114 } else {
115 event->ignore();
116 }
117}
118
119void MdiChild::documentWasModified()
120{
121 setWindowModified(document()->isModified());
122}
123
124bool MdiChild::maybeSave()
125{
126 if (document()->isModified()) {
127 QMessageBox::StandardButton ret;
128 ret = QMessageBox::warning(this, tr("MDI"),
129 tr("'%1' has been modified.\n"
130 "Do you want to save your changes?")
132 QMessageBox::Save | QMessageBox::Discard
133 | QMessageBox::Cancel);
134 if (ret == QMessageBox::Save)
135 return save();
136 else if (ret == QMessageBox::Cancel)
137 return false;
138 }
139 return true;
140}
141
142void MdiChild::setCurrentFile(const QString & fileName)
143{
144 curFile = QFileInfo(fileName).canonicalFilePath();
145 isUntitled = false;
146 document()->setModified(false);
147 setWindowModified(false);
148 setWindowTitle(userFriendlyCurrentFile() + QLatin1String("[*]"));
149}
150
151QString MdiChild::strippedName(const QString & fullFileName)
152{
153 return QFileInfo(fullFileName).fileName();
154}
155
156bool MdiChild::loadPreview(const QString &fileName)
157{
158 if (previewFrm == nullptr) {
159 previewFrm = std::make_unique<ImageViewer>();
160 previewFrm->graphWindow = this;
161 QMdiSubWindow *s = parentFrm->mdiArea->addSubWindow(previewFrm.get());
162
163 s->resize(600, 400);
164 s->move(parentFrm->mdiArea->subWindowList().count() * 5,
165 parentFrm->mdiArea->subWindowList().count() * 5);
166 previewFrm->subWindowRef = s;
167
168 }
169 bool rv = previewFrm->open(fileName);
170 if (rv)
171 previewFrm->show();
172 return rv;
173}
174
176{
177 return settingsSet;
178}
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:84
QMdiArea * mdiArea
Definition mainwindow.h:40
QString userFriendlyCurrentFile()
Definition mdichild.cpp:105
std::unique_ptr< ImageViewer > previewFrm
Definition mdichild.h:38
bool saveFile(const QString &fileName)
Definition mdichild.cpp:81
bool saveAs()
Definition mdichild.cpp:71
bool save()
Definition mdichild.cpp:62
bool preview
Definition mdichild.h:35
bool loadPreview(const QString &fileName)
Definition mdichild.cpp:156
bool applyCairo
Definition mdichild.h:36
bool firstTime()
Definition mdichild.cpp:175
bool loadFile(const QString &fileName)
Definition mdichild.cpp:40
int layoutIdx
Definition mdichild.h:32
void newFile()
Definition mdichild.cpp:28
bool settingsSet
Definition mdichild.h:42
void closeEvent(QCloseEvent *event)
Definition mdichild.cpp:110
int renderIdx
Definition mdichild.h:33
CMainWindow * parentFrm
Definition mdichild.h:39
char * fileName(ingraph_state *sp)
Return name of current file being processed.
Definition ingraphs.c:156
Definition grammar.c:93