27 Q_Q(QQuickFileDialogDelegate);
28 QQuickListViewAttached *attached =
static_cast<QQuickListViewAttached*>(
29 qmlAttachedPropertiesObject<QQuickListView>(q));
33 QQmlContext *delegateContext = qmlContext(q);
37 bool converted =
false;
38 const int index = q->property(
"index").toInt(&converted);
40 attached->view()->setCurrentIndex(index);
42 fileDialog->setSelectedFile(file);
43 else if (folderDialog)
44 folderDialog->setSelectedFolder(file);
50 const QFileInfo fileInfo(QQmlFile::urlToLocalFileOrQrc(file));
51 if (fileInfo.isDir()) {
54 fileDialog->setCurrentFolder(file);
56 folderDialog->setCurrentFolder(file);
60 fileDialog->setSelectedFile(file);
63 const QQuickFileDialogImplAttached *attached = QQuickFileDialogImplPrivate::get(fileDialog)->attachedOrWarn();
64 if (Q_LIKELY(attached)) {
65 auto *openButton = attached->buttonBox()->standardButton(QPlatformDialogHelper::Open);
66 if (Q_LIKELY(openButton)) {
67 emit openButton->clicked();
80QQuickFileDialogDelegate::QQuickFileDialogDelegate(QQuickItem *parent)
81 : QQuickItemDelegate(*(
new QQuickFileDialogDelegatePrivate), parent)
83 Q_D(QQuickFileDialogDelegate);
86 setFocusPolicy(Qt::StrongFocus);
88 QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::clicked,
89 d, &QQuickFileDialogDelegatePrivate::highlightFile);
90 QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::doubleClicked,
91 d, &QQuickFileDialogDelegatePrivate::chooseFile);
125void QQuickFileDialogDelegate::setFile(
const QUrl &file)
127 Q_D(QQuickFileDialogDelegate);
128 QUrl adjustedFile = file;
131 QString path = adjustedFile.path();
132 const int driveColonIndex = path.indexOf(QLatin1Char(
':'));
133 if (driveColonIndex == 2) {
134 path.replace(1, 1, path.at(1).toUpper());
135 adjustedFile.setPath(path);
138 if (adjustedFile == d->file)
141 d->file = adjustedFile;
143#if QT_CONFIG(accessibility)
144 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this))
145 accessibleAttached->setName(file.fileName());
149void QQuickFileDialogDelegate::keyReleaseEvent(QKeyEvent *event)
151 Q_D(QQuickFileDialogDelegate);
154 auto connection = QObjectPrivate::connect(
this, &QQuickFileDialogDelegate::clicked,
155 d, &QQuickFileDialogDelegatePrivate::chooseFile);
157 QQuickItemDelegate::keyReleaseEvent(event);
159 disconnect(connection);
215 QQuickPalette *palette = [
this]() -> QQuickPalette* {
216 auto *delegate = qobject_cast<QQuickFileDialogDelegate*>(parent());
218 QQuickDialog *dlg = delegate->dialog();
220 QQuickDialogPrivate *priv = QQuickDialogPrivate::get(dlg);
222 return priv->palette();
229 const auto src =
":/qt-project.org/imports/QtQuick/Dialogs/quickimpl/images/sidebar-folder.png"_L1;
230 QImage img = QImage(src).convertToFormat(QImage::Format_ARGB32);
232 if (!img.isNull() && palette) {
233 const QColor iconColor = palette->buttonText();
234 if (iconColor.alpha() > 0) {
236 QPainter painter(&img);
237 painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
238 painter.fillRect(img.rect(), iconColor);
242 QPixmap pixmap = QPixmap::fromImage(std::move(img));
243 auto *mimeData =
new QMimeData();
244 mimeData->setImageData(pixmap);
245 m_drag->setMimeData(mimeData);
246 m_drag->setPixmap(pixmap);
258 auto *fileDialogImpl = getFileDialogImpl();
259 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
260 if (Q_LIKELY(attached)) {
261 auto *sideBar = attached->sideBar();
262 if (Q_LIKELY(sideBar)) {
263 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
264 const auto pos = QPoint(event->x(), event->y());
265 sideBarPrivate->setShowAddFavoriteDelegate(sideBar->contains(pos));
266 if (sideBarPrivate->showAddFavoriteDelegate()) {
267 const QList<QQuickItem *> items = sideBar->contentChildren().toList<QList<QQuickItem *>>();
270 const int addFavoritePos = sideBar->effectiveFolderPaths().size();
272 for (
int i = 0; i < items.length(); i++) {
273 if (
auto *button = qobject_cast<QQuickAbstractButton *>(items.at(i))) {
274 if (currentPos == addFavoritePos) {
276 const QRectF bBox = button->mapRectToItem(sideBar, button->boundingRect());
277 sideBarPrivate->setAddFavoriteDelegateHovered(bBox.contains(pos));
294 if (!m_sourceUrl.isEmpty()) {
295 auto *fileDialogImpl = getFileDialogImpl();
296 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
297 if (Q_LIKELY(attached)) {
298 auto *sideBar = attached->sideBar();
299 if (Q_LIKELY(sideBar)) {
300 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
303 if (sideBarPrivate->addFavoriteDelegateHovered())
304 sideBarPrivate->addFavorite(m_sourceUrl);
305 sideBarPrivate->setShowAddFavoriteDelegate(
false);
316 auto *fileDialogImpl = getFileDialogImpl();
317 auto *attached = QQuickFileDialogImplPrivate::get(fileDialogImpl)->attachedOrWarn();
318 if (Q_LIKELY(attached)) {
319 auto *sideBar = attached->sideBar();
320 if (Q_LIKELY(sideBar && m_dropArea)) {
321 auto *sideBarPrivate = QQuickSideBarPrivate::get(sideBar);
322 if (m_dropArea->containsDrag()) {
323 sideBarPrivate->setShowAddFavoriteDelegate(
true);
325 sideBarPrivate->setShowAddFavoriteDelegate(
false);
326 sideBarPrivate->setAddFavoriteDelegateHovered(
false);
353 QQuickTapHandler::handleEventPoint(event, point);
355 auto *fileDialogDelegate = qobject_cast<QQuickFileDialogDelegate *>(parent());
356 auto *fileDialogImpl = getFileDialogImpl();
357 if (Q_UNLIKELY(!fileDialogImpl))
359 auto *fileDialogImplPrivate = QQuickFileDialogImplPrivate::get(fileDialogImpl);
360 QQuickFileDialogImplAttached *attached = fileDialogImplPrivate->attachedOrWarn();
361 if (Q_UNLIKELY(!attached || !attached->sideBar()))
367 if (point.state() == QEventPoint::Pressed) {
370 setPassiveGrab(event, point,
true);
371 }
else if (point.state() == QEventPoint::Released) {
373 }
else if (point.state() == QEventPoint::Updated && m_longPressed) {
375 const qreal distX = point.position().x() - point.pressPosition().x();
376 const qreal distY = point.position().y() - point.pressPosition().y();
378 const qreal dragDistSq = distX * distX + distY * distY;
379 if (dragDistSq > qPow(qApp->styleHints()->startDragDistance(), 2)) {
384 m_drag =
new QDrag(fileDialogDelegate);
386 if (m_dropArea.isNull()) {
387 auto *sideBar = attached->sideBar();
388 m_dropArea =
new QQuickDropArea(sideBar);
389 m_dropArea->setSize(sideBar->size());
390 connect(m_dropArea, &QQuickDropArea::positionChanged,
this,
391 &QQuickFileDialogTapHandler::handleDrag);
392 connect(m_dropArea, &QQuickDropArea::dropped,
this,
393 &QQuickFileDialogTapHandler::handleDrop);
394 connect(m_dropArea, &QQuickDropArea::containsDragChanged,
this,
398 m_sourceUrl = fileDialogDelegate->file();
405 if (m_drag && m_drag->mimeData()) {
406 if (
auto *item = qobject_cast<QQuickItem *>(m_drag->source())) {