aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp')
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp111
1 files changed, 99 insertions, 12 deletions
diff --git a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp
index 72f2ea25cf..687e899d18 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp
+++ b/src/quickdialogs/quickdialogsquickimpl/qquickfiledialogimpl.cpp
@@ -137,12 +137,24 @@ void QQuickFileDialogImplPrivate::updateSelectedFile(const QString &oldFolderPat
qCDebug(lcUpdateSelectedFile).nospace() << "updateSelectedFile is setting selectedFile to " << newSelectedFileUrl
<< ", newSelectedFileIndex is " << newSelectedFileIndex;
q->setSelectedFile(newSelectedFileUrl);
+ updateFileNameTextEdit();
// If the index is -1, there are no files in the directory, and so fileDialogListView's
// currentIndex will already be -1.
if (newSelectedFileIndex != -1)
tryUpdateFileDialogListViewCurrentIndex(newSelectedFileIndex);
}
+void QQuickFileDialogImplPrivate::updateFileNameTextEdit()
+{
+ QQuickFileDialogImplAttached *attached = attachedOrWarn();
+ if (Q_UNLIKELY(!attached))
+ return;
+
+ const QFileInfo fileInfo(selectedFile.toLocalFile());
+ if (fileInfo.isFile())
+ attached->fileNameTextField()->setText(fileInfo.fileName());
+}
+
QDir::SortFlags QQuickFileDialogImplPrivate::fileListSortFlags()
{
QDir::SortFlags sortFlags = QDir::IgnoreCase;
@@ -238,14 +250,35 @@ void QQuickFileDialogImplPrivate::handleClick(QQuickAbstractButton *button)
// Don't call accept(), because selecting a folder != accepting the dialog.
} else {
// Otherwise it's a file, so select it and close the dialog.
- q->setSelectedFile(selectedFile);
- q->accept();
- QQuickDialogPrivate::handleClick(button);
- emit q->fileSelected(selectedFile);
+
+ lastButtonClicked = button;
+
+ // Unless it already exists...
+ const bool dontConfirmOverride = q->options()->testOption(QFileDialogOptions::DontConfirmOverwrite);
+ const bool isSaveMode = q->options()->fileMode() == QFileDialogOptions::AnyFile;
+ if (QQuickFileDialogImplAttached *attached = attachedOrWarn();
+ attached && fileInfo.exists() && isSaveMode && !dontConfirmOverride) {
+ QQuickDialog *confirmationDialog = attached->overwriteConfirmationDialog();
+ confirmationDialog->open();
+ static_cast<QQuickDialogButtonBox *>(confirmationDialog->footer())->standardButton(QPlatformDialogHelper::Yes)
+ ->forceActiveFocus(Qt::PopupFocusReason);
+ } else {
+ selectFile();
+ }
}
}
}
+void QQuickFileDialogImplPrivate::selectFile()
+{
+ Q_Q(QQuickFileDialogImpl);
+ Q_ASSERT(lastButtonClicked);
+ q->setSelectedFile(selectedFile);
+ q->accept();
+ QQuickDialogPrivate::handleClick(lastButtonClicked);
+ emit q->fileSelected(selectedFile);
+}
+
QQuickFileDialogImpl::QQuickFileDialogImpl(QObject *parent)
: QQuickDialog(*(new QQuickFileDialogImplPrivate), parent)
{
@@ -332,6 +365,7 @@ void QQuickFileDialogImpl::setInitialCurrentFolderAndSelectedFile(const QUrl &fi
qCDebug(lcSelectedFile) << "setting initial currentFolder to" << fileDirUrl << "and selectedFile to" << file;
setCurrentFolder(fileDirUrl, QQuickFileDialogImpl::SetReason::Internal);
setSelectedFile(file);
+ d->updateFileNameTextEdit();
d->setCurrentIndexToInitiallySelectedFile = true;
// If the currentFolder didn't change, the FolderListModel won't change and
@@ -426,8 +460,11 @@ void QQuickFileDialogImpl::setAcceptLabel(const QString &label)
return;
}
+ auto buttonType = (d->options && d->options->acceptMode() == QFileDialogOptions::AcceptSave)
+ ? QPlatformDialogHelper::Save
+ : QPlatformDialogHelper::Open;
acceptButton->setText(!label.isEmpty()
- ? label : QQuickDialogButtonBoxPrivate::buttonText(QPlatformDialogHelper::Open));
+ ? label : QQuickDialogButtonBoxPrivate::buttonText(buttonType));
}
void QQuickFileDialogImpl::setRejectLabel(const QString &label)
@@ -467,7 +504,15 @@ void QQuickFileDialogImpl::setFileName(const QString &fileName)
if (previous == fileName)
return;
- setSelectedFile(QUrl(currentFolder().path() + u'/' + fileName));
+ QUrl newSelectedFile;
+ newSelectedFile.setScheme(currentFolder().scheme());
+ newSelectedFile.setPath(currentFolder().path() + u'/' + fileName);
+ setSelectedFile(newSelectedFile);
+}
+
+QString QQuickFileDialogImpl::currentFolderName() const
+{
+ return QDir(currentFolder().toLocalFile()).dirName();
}
void QQuickFileDialogImpl::componentComplete()
@@ -561,6 +606,7 @@ void QQuickFileDialogImplAttachedPrivate::fileDialogListViewCurrentIndexChanged(
auto fileDialogImplPrivate = QQuickFileDialogImplPrivate::get(fileDialogImpl);
if (moveReason != QQuickItemViewPrivate::Other) {
fileDialogImpl->setSelectedFile(fileDialogDelegate->file());
+ fileDialogImplPrivate->updateFileNameTextEdit();
} else if (fileDialogImplPrivate->setCurrentIndexToInitiallySelectedFile) {
// When setting selectedFile before opening the FileDialog,
// we need to ensure that the currentIndex is correct, because the initial change
@@ -573,7 +619,17 @@ void QQuickFileDialogImplAttachedPrivate::fileDialogListViewCurrentIndexChanged(
}
}
-void QQuickFileDialogImplAttachedPrivate::fileNameChangedByUser()
+void QQuickFileDialogImplAttachedPrivate::fileNameEditedByUser()
+{
+ if (!buttonBox)
+ return;
+ auto openButton = buttonBox->standardButton(QPlatformDialogHelper::Open);
+ if (!openButton || !fileNameTextField)
+ return;
+ openButton->setEnabled(!fileNameTextField->text().isEmpty());
+}
+
+void QQuickFileDialogImplAttachedPrivate::fileNameEditingByUserFinished()
{
auto fileDialogImpl = qobject_cast<QQuickFileDialogImpl *>(parent);
if (!fileDialogImpl)
@@ -740,19 +796,50 @@ void QQuickFileDialogImplAttached::setFileNameTextField(QQuickTextField *fileNam
if (fileNameTextField == d->fileNameTextField)
return;
- if (d->fileNameTextField)
+ if (d->fileNameTextField) {
QObjectPrivate::disconnect(d->fileNameTextField, &QQuickTextField::editingFinished,
- d, &QQuickFileDialogImplAttachedPrivate::fileNameChangedByUser);
+ d, &QQuickFileDialogImplAttachedPrivate::fileNameEditingByUserFinished);
+ QObjectPrivate::disconnect(d->fileNameTextField, &QQuickTextField::textEdited,
+ d, &QQuickFileDialogImplAttachedPrivate::fileNameEditedByUser);
+ }
d->fileNameTextField = fileNameTextField;
- if (d->fileNameTextField)
+ if (d->fileNameTextField) {
QObjectPrivate::connect(d->fileNameTextField, &QQuickTextField::editingFinished,
- d, &QQuickFileDialogImplAttachedPrivate::fileNameChangedByUser);
-
+ d, &QQuickFileDialogImplAttachedPrivate::fileNameEditingByUserFinished);
+ QObjectPrivate::connect(d->fileNameTextField, &QQuickTextField::textEdited,
+ d, &QQuickFileDialogImplAttachedPrivate::fileNameEditedByUser);
+ }
emit fileNameTextFieldChanged();
}
+QQuickDialog *QQuickFileDialogImplAttached::overwriteConfirmationDialog() const
+{
+ Q_D(const QQuickFileDialogImplAttached);
+ return d->overwriteConfirmationDialog;
+}
+
+void QQuickFileDialogImplAttached::setOverwriteConfirmationDialog(QQuickDialog *dialog)
+{
+ Q_D(QQuickFileDialogImplAttached);
+ if (dialog == d->overwriteConfirmationDialog)
+ return;
+
+ QQuickFileDialogImpl *fileDialogImpl = qobject_cast<QQuickFileDialogImpl*>(parent());
+ if (d->overwriteConfirmationDialog && fileDialogImpl)
+ QObjectPrivate::disconnect(d->overwriteConfirmationDialog, &QQuickDialog::accepted,
+ QQuickFileDialogImplPrivate::get(fileDialogImpl), &QQuickFileDialogImplPrivate::selectFile);
+
+ d->overwriteConfirmationDialog = dialog;
+
+ if (d->overwriteConfirmationDialog && fileDialogImpl)
+ QObjectPrivate::connect(d->overwriteConfirmationDialog, &QQuickDialog::accepted,
+ QQuickFileDialogImplPrivate::get(fileDialogImpl), &QQuickFileDialogImplPrivate::selectFile, Qt::QueuedConnection);
+
+ emit overwriteConfirmationDialogChanged();
+}
+
QT_END_NAMESPACE
#include "moc_qquickfiledialogimpl_p.cpp"