]> Shamusworld >> Repos - architektonas/blob - src/widgets/qg_filedialog.cpp
dabf93ffbe4af72a98ed6ef89561808bb41cdc93
[architektonas] / src / widgets / qg_filedialog.cpp
1 // qg_filedialog.cpp
2 //
3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
7 //
8 // JLH = James L. Hammons <jlhamm@acm.org>
9 //
10 // Who  When        What
11 // ---  ----------  -----------------------------------------------------------
12 // JLH  05/10/2010  Added this text. :-)
13 //
14
15 #include "qg_filedialog.h"
16
17 #include "qg_graphicview.h"
18 #include "settings.h"
19 #include "rs_system.h"
20 #include "rs_graphic.h"
21
22 /**
23  * Shows a dialog for choosing a file name. Saving the file is up to
24  * the caller.
25  *
26  * @param type Will contain the file type that was chosen by the user.
27  *             Can be NULL to be ignored.
28  *
29  * @return File name with path and extension to determine the file type
30  *         or an empty string if the dialog was cancelled.
31  */
32 QString QG_FileDialog::getSaveFileName(QWidget * parent, RS2::FormatType * type)
33 {
34         // read default settings:
35         settings.beginGroup("Paths");
36         QString defDir = settings.value("/Save", RS_SYSTEM->getHomeDir()).toString();
37         QString defFilter = settings.value("/SaveFilter", "Drawing Exchange DXF 2000 (*.dxf)").toString();
38         //QString defFilter = "Drawing Exchange (*.dxf)";
39         settings.endGroup();
40
41         // prepare file save as dialog:
42 //      Q3FileDialog * fileDlg = new Q3FileDialog(parent, "Save as", true);
43         QFileDialog * fileDlg = new QFileDialog(parent, "Save as");
44         QStringList filters;
45         bool done = false;
46         bool cancel = false;
47         QString fn = "";
48
49         filters.append("Drawing Exchange DXF 2000 (*.dxf)");
50         filters.append("Drawing Exchange DXF R12 (*.dxf)");
51         filters.append("Font (*.cxf)");
52         fileDlg->setFilters(filters);
53 //      fileDlg->setMode(Q3FileDialog::AnyFile);
54         fileDlg->setFileMode(QFileDialog::AnyFile);
55 //      fileDlg->setCaption(QObject::tr("Save Drawing As"));
56         fileDlg->setWindowTitle(QObject::tr("Save Drawing As"));
57 //      fileDlg->setDir(defDir);
58         fileDlg->setDirectory(defDir);
59 //      fileDlg->setSelectedFilter(defFilter);
60         fileDlg->selectFilter(defFilter);
61
62         // run dialog:
63         do
64         {
65                 // accepted:
66                 if (fileDlg->exec() == QDialog::Accepted)
67                 {
68 //                      fn = fileDlg->selectedFile();
69                         QStringList files = fileDlg->selectedFiles();
70
71                         if (!files.isEmpty())
72                                 fn = files[0];
73
74 //                      fn = QDir::convertSeparators(QFileInfo(fn).absFilePath());
75                         fn = QDir::convertSeparators(QFileInfo(fn).absoluteFilePath());
76                         cancel = false;
77
78                         // append default extension:
79 //                      if (QFileInfo(fn).fileName().find('.') == -1)
80                         if (QFileInfo(fn).fileName().indexOf('.') == -1)
81                         {
82                                 if (fileDlg->selectedFilter() == "Font (*.cxf)")
83                                         fn += ".cxf";
84                                 else
85                                         fn += ".dxf";
86                         }
87
88                         // set format:
89                         if (type != NULL)
90                         {
91                                 if (fileDlg->selectedFilter() == "Font (*.cxf)")
92                                         *type = RS2::FormatCXF;
93                                 else if (fileDlg->selectedFilter() == "Drawing Exchange DXF R12 (*.dxf)")
94                                         *type = RS2::FormatDXF12;
95                                 else
96                                         *type = RS2::FormatDXF;
97                         }
98
99                         // overwrite warning:
100                         if (QFileInfo(fn).exists())
101                         {
102                                 int choice = QMessageBox::warning(parent, QObject::tr("Save Drawing As"),
103                                         QObject::tr("%1 already exists.\nWould you like to replace it?").arg(fn),
104                                         QObject::tr("Yes"), QObject::tr("No"), QObject::tr("Cancel"), 0, 1);
105
106                                 switch (choice)
107                                 {
108                                 case 0:
109                                         done = true;
110                                         break;
111                                 case 1:
112                                 case 2:
113                                 default:
114                                         done = false;
115                                         break;
116                                 }
117                         }
118                         else
119                         {
120                                 done = true;
121                         }
122                 }
123                 else
124                 {
125                         done = true;
126                         cancel = true;
127                         fn = "";
128                 }
129         }
130         while (!done);
131
132         // store new default settings:
133         if (!cancel)
134         {
135                 settings.beginGroup("Paths");
136 //              RS_SETTINGS->writeEntry("/Save", QFileInfo(fn).dirPath(true));
137                 settings.setValue("Save", QFileInfo(fn).absolutePath());
138                 //RS_SETTINGS->writeEntry("/SaveFilter", fileDlg->selectedFilter());
139                 settings.endGroup();
140         }
141
142         delete fileDlg;
143
144         return fn;
145 }
146
147 /**
148  * Shows a dialog for choosing a file name. Opening the file is up to
149  * the caller.
150  *
151  * @return File name with path and extension to determine the file type
152  *         or an empty string if the dialog was cancelled.
153  */
154 QString QG_FileDialog::getOpenFileName(QWidget * parent, RS2::FormatType * type)
155 {
156         RS_DEBUG->print("QG_FileDialog::getOpenFileName");
157
158         // read default settings:
159         settings.beginGroup("/Paths");
160         QString defDir = settings.value("/Open", RS_SYSTEM->getHomeDir()).toString();
161         //QString defFilter = RS_SETTINGS->readEntry("/OpenFilter",
162         //                      "Drawing Exchange (*.dxf *.DXF)");
163         QString defFilter = "Drawing Exchange (*.dxf *.DXF)";
164         settings.endGroup();
165
166         RS_DEBUG->print("defDir: %s", defDir.toLatin1().data());
167         RS_DEBUG->print("defFilter: %s", defFilter.toLatin1().data());
168
169         QString fDxf(QObject::tr("Drawing Exchange %1").arg("(*.dxf *.DXF)"));
170         QString fDxf1(QObject::tr("QCad 1.x file %1").arg("(*.dxf *.DXF)"));
171         QString fCxf(QObject::tr("Font %1").arg("(*.cxf)"));
172
173         RS_DEBUG->print("fDxf: %s", fDxf.toLatin1().data());
174         RS_DEBUG->print("fDxf1: %s", fDxf1.toLatin1().data());
175         RS_DEBUG->print("fCxf: %s", fCxf.toLatin1().data());
176
177         QString fn = "";
178         bool cancel = false;
179
180 //      Q3FileDialog* fileDlg = new Q3FileDialog(parent, "File Dialog", true);
181         QFileDialog * fileDlg = new QFileDialog(parent);
182
183         QStringList filters;
184 //      filters.append(fDxf);
185 //      filters.append(fDxf1);
186 //      filters.append(fCxf);
187         filters << fDxf << fDxf1 << fCxf;
188
189 //      fileDlg->setFilters(filters);
190         fileDlg->setNameFilters(filters);
191 //      fileDlg->setMode(Q3FileDialog::ExistingFile);
192 //      fileDlg->setMode(QFileDialog::ExistingFile);
193         fileDlg->setFileMode(QFileDialog::ExistingFile);
194 //      fileDlg->setCaption(QObject::tr("Open Drawing"));
195         fileDlg->setWindowTitle(QObject::tr("Open Drawing"));
196 //      fileDlg->setDir(defDir);
197         fileDlg->setDirectory(defDir);
198 //      fileDlg->setSelectedFilter(defFilter);
199 //      fileDlg->selectFilter(defFilter);
200         fileDlg->selectNameFilter(defFilter);
201
202         // preview:
203         RS_Graphic * gr = new RS_Graphic;
204         QG_GraphicView * prev = new QG_GraphicView(parent);
205         prev->setContainer(gr);
206         prev->setBorders(1, 1, 1, 1);
207 #warning "!!! QG_FileDialog: Commented out Qt3 previews !!!"
208 //      fileDlg->setContentsPreviewEnabled(true);
209 //      fileDlg->setContentsPreview(prev, prev);
210
211         cancel = true;
212
213         if (fileDlg->exec() == QDialog::Accepted)
214         {
215 //              fn = fileDlg->selectedFile();
216                 QStringList files = fileDlg->selectedFiles();
217
218                 if (!files.isEmpty())
219                         fn = files[0];
220
221 //              fn = QDir::convertSeparators(QFileInfo(fn).absFilePath());
222                 fn = QDir::convertSeparators(QFileInfo(fn).absoluteFilePath());
223
224 //printf("FileDialog: selectedNameFilter = %s\n", fileDlg->selectedNameFilter().toAscii().data());
225                 if (type != NULL)
226                 {
227 //                      if (fileDlg->selectedFilter() == fDxf1)
228                         if (fileDlg->selectedNameFilter() == fDxf1)
229                                 *type = RS2::FormatDXF1;
230 //                      else if (fileDlg->selectedFilter() == fDxf)
231                         else if (fileDlg->selectedNameFilter() == fDxf)
232                                 *type = RS2::FormatDXF;
233 //                      else if (fileDlg->selectedFilter() == fCxf)
234                         else if (fileDlg->selectedNameFilter() == fCxf)
235                                 *type = RS2::FormatCXF;
236                 }
237
238                 cancel = false;
239         }
240
241         // store new default settings:
242         if (!cancel)
243         {
244                 settings.beginGroup("Paths");
245 //              RS_SETTINGS->writeEntry("/Open", QFileInfo(fn).dirPath(true));
246                 settings.setValue("Open", QFileInfo(fn).absolutePath());
247 //              RS_SETTINGS->writeEntry("/OpenFilter", fileDlg->selectedFilter());
248                 settings.setValue("OpenFilter", fileDlg->selectedNameFilter());
249                 settings.endGroup();
250         }
251
252         RS_DEBUG->print("QG_FileDialog::getOpenFileName: fileName: %s", fn.toLatin1().data());
253         RS_DEBUG->print("QG_FileDialog::getOpenFileName: OK");
254
255         delete prev;
256         delete gr;
257         delete fileDlg;
258
259         return fn;
260 }