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