24 Q_Q(QQuickFileDialogDelegate);
25 QQuickListViewAttached *attached =
static_cast<QQuickListViewAttached*>(
26 qmlAttachedPropertiesObject<QQuickListView>(q));
30 QQmlContext *delegateContext = qmlContext(q);
34 bool converted =
false;
35 const int index = q->property(
"index").toInt(&converted);
37 attached->view()->setCurrentIndex(index);
39 fileDialog->setSelectedFile(file);
40 else if (folderDialog)
41 folderDialog->setSelectedFolder(file);
47 const QFileInfo fileInfo(QQmlFile::urlToLocalFileOrQrc(file));
48 if (fileInfo.isDir()) {
51 fileDialog->setCurrentFolder(file);
53 folderDialog->setCurrentFolder(file);
57 fileDialog->setSelectedFile(file);
60 const QQuickFileDialogImplAttached *attached = QQuickFileDialogImplPrivate::get(fileDialog)->attachedOrWarn();
61 if (Q_LIKELY(attached)) {
62 auto *openButton = attached->buttonBox()->standardButton(QPlatformDialogHelper::Open);
63 if (Q_LIKELY(openButton)) {
64 emit openButton->clicked();
77QQuickFileDialogDelegate::QQuickFileDialogDelegate(QQuickItem *parent)
78 : QQuickItemDelegate(*(
new QQuickFileDialogDelegatePrivate), parent)
80 Q_D(QQuickFileDialogDelegate);
83 setFocusPolicy(Qt::StrongFocus);
85 QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::clicked,
86 d, &QQuickFileDialogDelegatePrivate::highlightFile);
87 QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::doubleClicked,
88 d, &QQuickFileDialogDelegatePrivate::chooseFile);
97void QQuickFileDialogDelegate::setDialog(QQuickDialog *dialog)
99 Q_D(QQuickFileDialogDelegate);
100 if (dialog == d->dialog)
104 d->fileDialog = qobject_cast<QQuickFileDialogImpl*>(dialog);
105 d->folderDialog = qobject_cast<QQuickFolderDialogImpl*>(dialog);
106 emit dialogChanged();
109 d->destroyTapHandler();
122void QQuickFileDialogDelegate::setFile(
const QUrl &file)
124 Q_D(QQuickFileDialogDelegate);
125 QUrl adjustedFile = file;
128 QString path = adjustedFile.path();
129 const int driveColonIndex = path.indexOf(QLatin1Char(
':'));
130 if (driveColonIndex == 2) {
131 path.replace(1, 1, path.at(1).toUpper());
132 adjustedFile.setPath(path);
135 if (adjustedFile == d->file)
138 d->file = adjustedFile;
142void QQuickFileDialogDelegate::keyReleaseEvent(QKeyEvent *event)
144 Q_D(QQuickFileDialogDelegate);
147 auto connection = QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::clicked,
148 d, &QQuickFileDialogDelegatePrivate::chooseFile);
150 QQuickItemDelegate::keyReleaseEvent(event);
152 disconnect(connection);
208 QQuickPalette *palette = [
this]() -> QQuickPalette* {
209 auto *delegate = qobject_cast<QQuickFileDialogDelegate*>(parent());
211 QQuickDialog *dlg = delegate->dialog();
213 QQuickDialogPrivate *priv = QQuickDialogPrivate::get(dlg);
215 return priv->palette();
222 const auto src =
":/qt-project.org/imports/QtQuick/Dialogs/quickimpl/images/sidebar-folder.png"_L1;
223 QImage img = QImage(src).convertToFormat(QImage::Format_ARGB32);
225 if (!img.isNull() && palette) {
226 const QColor iconColor = palette->buttonText();
227 if (iconColor.alpha() > 0) {
229 QPainter painter(&img);
230 painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
231 painter.fillRect(img.rect(), iconColor);
235 QPixmap pixmap = QPixmap::fromImage(std::move(img));
236 auto *mimeData =
new QMimeData();
237 mimeData->setImageData(pixmap);
238 m_drag->setMimeData(mimeData);
239 m_drag->setPixmap(pixmap);
250 auto *fileDialogImpl = getFileDialogImpl();
251 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
252 if (Q_LIKELY(attached)) {
253 auto *sideBar = attached->sideBar();
254 if (Q_LIKELY(sideBar)) {
255 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
256 const auto pos = QPoint(event->x(), event->y());
257 sideBarPrivate->setShowAddFavoriteDelegate(sideBar->contains(pos));
258 if (sideBarPrivate->showAddFavoriteDelegate()) {
259 const QList<QQuickItem *> items = sideBar->contentChildren().toList<QList<QQuickItem *>>();
262 const int addFavoritePos = sideBar->effectiveFolderPaths().size();
264 for (
int i = 0; i < items.length(); i++) {
265 if (
auto *button = qobject_cast<QQuickAbstractButton *>(items.at(i))) {
266 if (currentPos == addFavoritePos) {
268 const QRectF bBox = button->mapRectToItem(sideBar, button->boundingRect());
269 sideBarPrivate->setAddFavoriteDelegateHovered(bBox.contains(pos));
286 if (!m_sourceUrl.isEmpty()) {
287 auto *fileDialogImpl = getFileDialogImpl();
288 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
289 if (Q_LIKELY(attached)) {
290 auto *sideBar = attached->sideBar();
291 if (Q_LIKELY(sideBar)) {
292 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
295 if (sideBarPrivate->addFavoriteDelegateHovered())
296 sideBarPrivate->addFavorite(m_sourceUrl);
297 sideBarPrivate->setShowAddFavoriteDelegate(
false);
308 auto *fileDialogImpl = getFileDialogImpl();
309 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
310 if (Q_LIKELY(attached)) {
311 auto *sideBar = attached->sideBar();
312 if (Q_LIKELY(sideBar && m_dropArea)) {
313 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
314 if (m_dropArea->containsDrag()) {
315 sideBarPrivate->setShowAddFavoriteDelegate(
true);
317 sideBarPrivate->setShowAddFavoriteDelegate(
false);
318 sideBarPrivate->setAddFavoriteDelegateHovered(
false);
345 QQuickTapHandler::handleEventPoint(event, point);
347 auto *fileDialogDelegate = qobject_cast<QQuickFileDialogDelegate *>(parent());
348 auto *fileDialogImpl = getFileDialogImpl();
349 if (Q_UNLIKELY(!fileDialogImpl))
351 auto *fileDialogImplPrivate = QQuickFileDialogImplPrivate::get(fileDialogImpl);
352 QQuickFileDialogImplAttached *attached = fileDialogImplPrivate->attachedOrWarn();
353 if (Q_UNLIKELY(!attached || !attached->sideBar()))
359 if (point.state() == QEventPoint::Pressed) {
362 setPassiveGrab(event, point,
true);
363 }
else if (point.state() == QEventPoint::Released) {
365 }
else if (point.state() == QEventPoint::Updated && m_longPressed) {
367 const qreal distX = point.position().x() - point.pressPosition().x();
368 const qreal distY = point.position().y() - point.pressPosition().y();
370 const qreal dragDistSq = distX * distX + distY * distY;
371 if (dragDistSq > qPow(qApp->styleHints()->startDragDistance(), 2)) {
376 m_drag =
new QDrag(fileDialogDelegate);
378 if (m_dropArea.isNull()) {
379 auto *sideBar = attached->sideBar();
380 m_dropArea =
new QQuickDropArea(sideBar);
381 m_dropArea->setSize(sideBar->size());
382 connect(m_dropArea, &QQuickDropArea::positionChanged,
this,
383 &QQuickFileDialogTapHandler::handleDrag);
384 connect(m_dropArea, &QQuickDropArea::dropped,
this,
385 &QQuickFileDialogTapHandler::handleDrop);
386 connect(m_dropArea, &QQuickDropArea::containsDragChanged,
this,
387 &QQuickFileDialogTapHandler::handleContainsDragChanged);
390 m_sourceUrl = fileDialogDelegate->file();
397 if (m_drag && m_drag->mimeData()) {
398 if (
auto *item = qobject_cast<QQuickItem *>(m_drag->source())) {