1 /*
2 	Actiona
3 	Copyright (C) 2005 Jonathan Mercier-Ganady
4 
5 	Actiona is free software: you can redistribute it and/or modify
6 	it under the terms of the GNU General Public License as published by
7 	the Free Software Foundation, either version 3 of the License, or
8 	(at your option) any later version.
9 
10 	Actiona is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 	GNU General Public License for more details.
14 
15 	You should have received a copy of the GNU General Public License
16 	along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18 	Contact : jmgr@jmgr.info
19 */
20 
21 #include "filedialog.h"
22 #include "code/codetools.h"
23 
24 #include <QScriptValueIterator>
25 #include <QUrl>
26 
27 namespace Code
28 {
constructor(QScriptContext * context,QScriptEngine * engine)29 	QScriptValue FileDialog::constructor(QScriptContext *context, QScriptEngine *engine)
30 	{
31 		auto fileDialog = new FileDialog;
32 		fileDialog->setupConstructorParameters(context, engine, context->argument(0));
33 
34 		QScriptValueIterator it(context->argument(0));
35 
36 		while(it.hasNext())
37 		{
38 			it.next();
39 
40 			if(it.name() == QLatin1String("acceptMode"))
41 				fileDialog->mFileDialog->setAcceptMode(static_cast<QFileDialog::AcceptMode>(it.value().toInt32()));
42 			else if(it.name() == QLatin1String("fileMode"))
43 				fileDialog->mFileDialog->setFileMode(static_cast<QFileDialog::FileMode>(it.value().toInt32()));
44 			else if(it.name() == QLatin1String("viewMode"))
45 				fileDialog->mFileDialog->setViewMode(static_cast<QFileDialog::ViewMode>(it.value().toInt32()));
46 			else if(it.name() == QLatin1String("selectedFile"))
47 				fileDialog->mFileDialog->selectFile(it.value().toString());
48 			else if(it.name() == QLatin1String("selectedNameFilter"))
49 				fileDialog->mFileDialog->selectNameFilter(it.value().toString());
50 			else if(it.name() == QLatin1String("defaultSuffix"))
51 				fileDialog->mFileDialog->setDefaultSuffix(it.value().toString());
52 			else if(it.name() == QLatin1String("directory"))
53 				fileDialog->mFileDialog->setDirectory(it.value().toString());
54 			else if(it.name() == QLatin1String("filter"))
55 				fileDialog->mFileDialog->setFilter(static_cast<QDir::Filter>(it.value().toInt32()));
56 			else if(it.name() == QLatin1String("nameFilter"))
57 				fileDialog->mFileDialog->setNameFilter(it.value().toString());
58 			else if(it.name() == QLatin1String("nameFilters"))
59 				fileDialog->mFileDialog->setNameFilters(arrayParameterToStringList(it.value()));
60 			else if(it.name() == QLatin1String("showDirectoriesOnly"))
61 				fileDialog->mFileDialog->setOption(QFileDialog::ShowDirsOnly, it.value().toBool());
62 			else if(it.name() == QLatin1String("dontResolveSymlinks"))
63 				fileDialog->mFileDialog->setOption(QFileDialog::DontResolveSymlinks, it.value().toBool());
64 			else if(it.name() == QLatin1String("dontConfirmOverwrite"))
65 				fileDialog->mFileDialog->setOption(QFileDialog::DontConfirmOverwrite, it.value().toBool());
66 			else if(it.name() == QLatin1String("dontUseNativeDialog"))
67 				fileDialog->mFileDialog->setOption(QFileDialog::DontUseNativeDialog, it.value().toBool());
68 			else if(it.name() == QLatin1String("readOnly"))
69 				fileDialog->mFileDialog->setOption(QFileDialog::ReadOnly, it.value().toBool());
70 			else if(it.name() == QLatin1String("hideNameFilterDetails"))
71 				fileDialog->mFileDialog->setOption(QFileDialog::HideNameFilterDetails, it.value().toBool());
72 			else if(it.name() == QLatin1String("sidebarUrls"))
73 			{
74 				QList<QUrl> urls;
75 
76                 for(const QString &url: arrayParameterToStringList(it.value()))
77 					urls.append(QUrl::fromLocalFile(url));
78 
79 				fileDialog->mFileDialog->setSidebarUrls(urls);
80 			}
81 			else if(it.name() == QLatin1String("onClosed"))
82 				fileDialog->mOnClosed = it.value();
83 			else if(it.name() == QLatin1String("onCurrentChanged"))
84 				fileDialog->mOnCurrentChanged = it.value();
85 			else if(it.name() == QLatin1String("onDirectoryEntered"))
86 				fileDialog->mOnDirectoryEntered = it.value();
87 			else if(it.name() == QLatin1String("onFileSelected"))
88 				fileDialog->mOnFileSelected = it.value();
89 			else if(it.name() == QLatin1String("onFilesSelected"))
90 				fileDialog->mOnFilesSelected = it.value();
91 			else if(it.name() == QLatin1String("onFilterSelected"))
92 				fileDialog->mOnFilterSelected = it.value();
93 		}
94 
95 		return CodeClass::constructor(fileDialog, context, engine);
96 	}
97 
FileDialog()98 	FileDialog::FileDialog()
99 		: BaseWindow(),
100 		mFileDialog(new QFileDialog)
101 	{
102         mFileDialog->setWindowFlags(mFileDialog->windowFlags() | Qt::WindowContextHelpButtonHint);
103 
104 		setWidget(mFileDialog);
105 
106         connect(mFileDialog, &QFileDialog::finished, this, &FileDialog::finished);
107         connect(mFileDialog, &QFileDialog::currentChanged, this, &FileDialog::currentChanged);
108         connect(mFileDialog, &QFileDialog::directoryEntered, this, &FileDialog::directoryEntered);
109         connect(mFileDialog, &QFileDialog::fileSelected, this, &FileDialog::fileSelected);
110         connect(mFileDialog, &QFileDialog::filesSelected, this, &FileDialog::filesSelected);
111         connect(mFileDialog, &QFileDialog::filterSelected, this, &FileDialog::filterSelected);
112 	}
113 
~FileDialog()114 	FileDialog::~FileDialog()
115 	{
116 		delete mFileDialog;
117 	}
118 
setAcceptMode(AcceptMode acceptMode)119 	QScriptValue FileDialog::setAcceptMode(AcceptMode acceptMode)
120 	{
121 		mFileDialog->setAcceptMode(static_cast<QFileDialog::AcceptMode>(acceptMode));
122 
123 		return thisObject();
124 	}
125 
setFileMode(FileMode fileMode)126 	QScriptValue FileDialog::setFileMode(FileMode fileMode)
127 	{
128 		mFileDialog->setFileMode(static_cast<QFileDialog::FileMode>(fileMode));
129 
130 		return thisObject();
131 	}
132 
setViewMode(ViewMode viewMode)133 	QScriptValue FileDialog::setViewMode(ViewMode viewMode)
134 	{
135 		mFileDialog->setViewMode(static_cast<QFileDialog::ViewMode>(viewMode));
136 
137 		return thisObject();
138 	}
139 
setLabelText(DialogLabel dialogLabel,const QString & text)140 	QScriptValue FileDialog::setLabelText(DialogLabel dialogLabel, const QString &text)
141 	{
142 		mFileDialog->setLabelText(static_cast<QFileDialog::DialogLabel>(dialogLabel), text);
143 
144 		return thisObject();
145 	}
146 
selectFile(const QString & filename)147 	QScriptValue FileDialog::selectFile(const QString &filename)
148 	{
149 		mFileDialog->selectFile(filename);
150 
151 		return thisObject();
152 	}
153 
selectNameFilter(const QString & filter)154 	QScriptValue FileDialog::selectNameFilter(const QString &filter)
155 	{
156 		mFileDialog->selectNameFilter(filter);
157 
158 		return thisObject();
159 	}
160 
setDefaultSuffix(const QString & defaultSuffix)161 	QScriptValue FileDialog::setDefaultSuffix(const QString &defaultSuffix)
162 	{
163 		mFileDialog->setDefaultSuffix(defaultSuffix);
164 
165 		return thisObject();
166 	}
167 
setDirectory(const QString & directory)168 	QScriptValue FileDialog::setDirectory(const QString &directory)
169 	{
170 		mFileDialog->setDirectory(directory);
171 
172 		return thisObject();
173 	}
174 
setFilter(Filters filters)175 	QScriptValue FileDialog::setFilter(Filters filters)
176 	{
177 		mFileDialog->setFilter(static_cast<QDir::Filters>(filters));
178 
179 		return thisObject();
180 	}
181 
setNameFilter(const QString & nameFilter)182 	QScriptValue FileDialog::setNameFilter(const QString &nameFilter)
183 	{
184 		mFileDialog->setNameFilter(nameFilter);
185 
186 		return thisObject();
187 	}
188 
setNameFilters(const QScriptValue & nameFilters)189 	QScriptValue FileDialog::setNameFilters(const QScriptValue &nameFilters)
190 	{
191 		mFileDialog->setNameFilters(arrayParameterToStringList(nameFilters));
192 
193 		return thisObject();
194 	}
195 
setShowDirectoriesOnly(bool showDirectoriesOnly)196 	QScriptValue FileDialog::setShowDirectoriesOnly(bool showDirectoriesOnly)
197 	{
198 		mFileDialog->setOption(QFileDialog::ShowDirsOnly, showDirectoriesOnly);
199 
200 		return thisObject();
201 	}
202 
setDontResolveSymlinks(bool dontResolveSymlinks)203 	QScriptValue FileDialog::setDontResolveSymlinks(bool dontResolveSymlinks)
204 	{
205 		mFileDialog->setOption(QFileDialog::DontResolveSymlinks, dontResolveSymlinks);
206 
207 		return thisObject();
208 	}
209 
setDontConfirmOverwrite(bool dontConfirmOverwrite)210 	QScriptValue FileDialog::setDontConfirmOverwrite(bool dontConfirmOverwrite)
211 	{
212 		mFileDialog->setOption(QFileDialog::DontConfirmOverwrite, dontConfirmOverwrite);
213 
214 		return thisObject();
215 	}
216 
setDontUseNativeDialog(bool dontUseNativeDialog)217 	QScriptValue FileDialog::setDontUseNativeDialog(bool dontUseNativeDialog)
218 	{
219 		mFileDialog->setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
220 
221 		return thisObject();
222 	}
223 
setReadOnly(bool readOnly)224 	QScriptValue FileDialog::setReadOnly(bool readOnly)
225 	{
226 		mFileDialog->setOption(QFileDialog::ReadOnly, readOnly);
227 
228 		return thisObject();
229 	}
230 
setHideNameFilterDetails(bool hideNameFilterDetails)231 	QScriptValue FileDialog::setHideNameFilterDetails(bool hideNameFilterDetails)
232 	{
233 		mFileDialog->setOption(QFileDialog::HideNameFilterDetails, hideNameFilterDetails);
234 
235 		return thisObject();
236 	}
237 
setSidebarUrls(const QScriptValue & sidebarUrls)238 	QScriptValue FileDialog::setSidebarUrls(const QScriptValue &sidebarUrls)
239 	{
240 		QList<QUrl> urls;
241 
242         for(const QString &url: arrayParameterToStringList(sidebarUrls))
243 			urls.append(QUrl::fromLocalFile(url));
244 
245 		mFileDialog->setSidebarUrls(urls);
246 
247 		return thisObject();
248 	}
249 
selectedFile() const250 	QString FileDialog::selectedFile() const
251 	{
252 		const QStringList &selectedFiles = mFileDialog->selectedFiles();
253 
254 		if(selectedFiles.count() > 0)
255 			return selectedFiles.at(0);
256 
257 		return QString();
258 	}
259 
selectedFiles() const260 	QScriptValue FileDialog::selectedFiles() const
261 	{
262         return qScriptValueFromSequence(engine(), mFileDialog->selectedFiles());
263 	}
264 
selectedNameFilter() const265 	QString FileDialog::selectedNameFilter() const
266 	{
267 		return mFileDialog->selectedNameFilter();
268 	}
269 
show()270 	QScriptValue FileDialog::show()
271 	{
272 		mFileDialog->open();
273 
274 		return thisObject();
275 	}
276 
showModal()277 	int FileDialog::showModal()
278 	{
279 		return mFileDialog->exec();
280 	}
281 
finished(int result)282 	void FileDialog::finished(int result)
283 	{
284 		if(mOnClosed.isValid())
285 			mOnClosed.call(thisObject(), QScriptValueList() << result);
286 	}
287 
currentChanged(const QString & path)288 	void FileDialog::currentChanged(const QString &path)
289 	{
290 		if(mOnCurrentChanged.isValid())
291 			mOnCurrentChanged.call(thisObject(), QScriptValueList() << path);
292 	}
293 
directoryEntered(const QString & directory)294 	void FileDialog::directoryEntered(const QString &directory)
295 	{
296 		if(mOnDirectoryEntered.isValid())
297 			mOnDirectoryEntered.call(thisObject(), QScriptValueList() << directory);
298 	}
299 
fileSelected(const QString & file)300 	void FileDialog::fileSelected(const QString &file)
301 	{
302 		if(mOnFileSelected.isValid())
303 			mOnFileSelected.call(thisObject(), QScriptValueList() << file);
304 	}
305 
filesSelected(const QStringList & files)306 	void FileDialog::filesSelected(const QStringList &files)
307 	{
308 		if(mOnFilesSelected.isValid())
309             mOnFilesSelected.call(thisObject(), QScriptValueList() << qScriptValueFromSequence(engine(), files));
310 	}
311 
filterSelected(const QString & filter)312 	void FileDialog::filterSelected(const QString &filter)
313 	{
314 		if(mOnFilterSelected.isValid())
315 			mOnFilterSelected.call(thisObject(), QScriptValueList() << filter);
316 	}
317 }
318