diff options
Diffstat (limited to 'src/widgets/dialogs')
-rw-r--r-- | src/widgets/dialogs/qcolordialog.cpp | 77 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 338 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.h | 4 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog_p.h | 16 | ||||
-rw-r--r-- | src/widgets/dialogs/qinputdialog.cpp | 40 | ||||
-rw-r--r-- | src/widgets/dialogs/qprogressdialog.cpp | 105 | ||||
-rw-r--r-- | src/widgets/dialogs/qsidebar.cpp | 3 | ||||
-rw-r--r-- | src/widgets/dialogs/qwizard.cpp | 2 | ||||
-rw-r--r-- | src/widgets/dialogs/qwizard_win.cpp | 71 | ||||
-rw-r--r-- | src/widgets/dialogs/qwizard_win_p.h | 14 |
10 files changed, 355 insertions, 315 deletions
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp index 3889a589c7..14c1ce081f 100644 --- a/src/widgets/dialogs/qcolordialog.cpp +++ b/src/widgets/dialogs/qcolordialog.cpp @@ -1262,9 +1262,17 @@ QColorShower::QColorShower(QColorDialog *parent) lblHtml->setBuddy(htEd); #endif +#if !defined(QT_NO_REGULAREXPRESSION) QRegularExpression regExp(QStringLiteral("#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})")); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); htEd->setValidator(validator); +#elif !defined(QT_NO_REGEXP) + QRegExp regExp(QStringLiteral("#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})")); + QRegExpValidator *validator = new QRegExpValidator(regExp, this); + htEd->setValidator(validator); +#else + htEd->setReadOnly(true); +#endif lblHtml->setAlignment(Qt::AlignRight|Qt::AlignVCenter); gl->addWidget(lblHtml, 5, 1); @@ -1460,38 +1468,46 @@ void QColorDialogPrivate::setCurrentQColor(const QColor &color) } } +// size of standard and custom color selector +enum { + colorColumns = 8, + standardColorRows = 6, + customColorRows = 2 +}; + bool QColorDialogPrivate::selectColor(const QColor &col) { QRgb color = col.rgb(); - int i = 0, j = 0; // Check standard colors if (standard) { const QRgb *standardColors = QColorDialogOptions::standardColors(); - for (i = 0; i < 6; i++) { - for (j = 0; j < 8; j++) { - if (color == standardColors[i + j*6]) { - _q_newStandard(i, j); - standard->setCurrent(i, j); - standard->setSelected(i, j); - standard->setFocus(); - return true; - } - } + const QRgb *standardColorsEnd = standardColors + standardColorRows * colorColumns; + const QRgb *match = std::find(standardColors, standardColorsEnd, color); + if (match != standardColorsEnd) { + const int index = int(match - standardColors); + const int row = index / standardColorRows; + const int column = index % standardColorRows; + _q_newStandard(row, column); + standard->setCurrent(row, column); + standard->setSelected(row, column); + standard->setFocus(); + return true; } } // Check custom colors if (custom) { const QRgb *customColors = QColorDialogOptions::customColors(); - for (i = 0; i < 2; i++) { - for (j = 0; j < 8; j++) { - if (color == customColors[i + j*2]) { - _q_newCustom(i, j); - custom->setCurrent(i, j); - custom->setSelected(i, j); - custom->setFocus(); - return true; - } - } + const QRgb *customColorsEnd = customColors + customColorRows * colorColumns; + const QRgb *match = std::find(customColors, customColorsEnd, color); + if (match != customColorsEnd) { + const int index = int(match - customColors); + const int row = index / customColorRows; + const int column = index % customColorRows; + _q_newCustom(row, column); + custom->setCurrent(row, column); + custom->setSelected(row, column); + custom->setFocus(); + return true; } } return false; @@ -1519,12 +1535,12 @@ void QColorDialogPrivate::_q_newColorTypedIn(QRgb rgb) void QColorDialogPrivate::_q_nextCustom(int r, int c) { - nextCust = r + 2 * c; + nextCust = r + customColorRows * c; } void QColorDialogPrivate::_q_newCustom(int r, int c) { - const int i = r + 2 * c; + const int i = r + customColorRows * c; setCurrentRgbColor(QColorDialogOptions::customColor(i)); if (standard) standard->setSelected(-1,-1); @@ -1545,12 +1561,10 @@ void QColorDialogPrivate::_q_pickScreenColor() q->installEventFilter(colorPickingEventFilter); // If user pushes Escape, the last color before picking will be restored. beforeScreenColorPicking = cs->currentColor(); - /*For some reason, q->grabMouse(Qt::CrossCursor) doesn't change - * the cursor, and therefore I have to change it manually. - */ - q->grabMouse(); #ifndef QT_NO_CURSOR - q->setCursor(Qt::CrossCursor); + q->grabMouse(Qt::CrossCursor); +#else + q->grabMouse(); #endif q->grabKeyboard(); /* With setMouseTracking(true) the desired color can be more precisedly picked up, @@ -1575,9 +1589,6 @@ void QColorDialogPrivate::releaseColorPicking() q->removeEventFilter(colorPickingEventFilter); q->releaseMouse(); q->releaseKeyboard(); -#ifndef QT_NO_CURSOR - q->setCursor(Qt::ArrowCursor); -#endif q->setMouseTracking(false); lblScreenColorInfo->setText(QLatin1String("\n")); addCusBt->setDisabled(false); @@ -1635,7 +1646,7 @@ void QColorDialogPrivate::initWidgets() } if (!smallDisplay) { - standard = new QColorWell(q, 6, 8, QColorDialogOptions::standardColors()); + standard = new QColorWell(q, standardColorRows, colorColumns, QColorDialogOptions::standardColors()); lblBasicColors = new QLabel(q); #ifndef QT_NO_SHORTCUT lblBasicColors->setBuddy(standard); @@ -1657,7 +1668,7 @@ void QColorDialogPrivate::initWidgets() leftLay->addStretch(); #endif - custom = new QColorWell(q, 2, 8, QColorDialogOptions::customColors()); + custom = new QColorWell(q, customColorRows, colorColumns, QColorDialogOptions::customColors()); custom->setAcceptDrops(true); q->connect(custom, SIGNAL(selected(int,int)), SLOT(_q_newCustom(int,int))); diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index e53cdeac29..0ead8a6797 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -39,6 +39,8 @@ ** ****************************************************************************/ +#define QT_NO_URL_CAST_FROM_STRING + #include <qvariant.h> #include <private/qwidgetitemdata_p.h> #include "qfiledialog.h" @@ -78,7 +80,7 @@ extern bool qt_priv_ptr_valid; QT_BEGIN_NAMESPACE -Q_GLOBAL_STATIC(QString, lastVisitedDir) +Q_GLOBAL_STATIC(QUrl, lastVisitedDir) /*! \class QFileDialog @@ -373,7 +375,7 @@ QFileDialog::QFileDialog(QWidget *parent, : QDialog(*new QFileDialogPrivate, parent, 0) { Q_D(QFileDialog); - d->init(directory, filter, caption); + d->init(QUrl::fromLocalFile(directory), filter, caption); } /*! @@ -444,7 +446,7 @@ static const qint32 QFileDialogMagic = 0xbe; QByteArray QFileDialog::saveState() const { Q_D(const QFileDialog); - int version = 3; + int version = 4; QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); @@ -479,29 +481,35 @@ QByteArray QFileDialog::saveState() const bool QFileDialog::restoreState(const QByteArray &state) { Q_D(QFileDialog); - int version = 3; QByteArray sd = state; QDataStream stream(&sd, QIODevice::ReadOnly); if (stream.atEnd()) return false; QStringList history; - QString currentDirectory; + QUrl currentDirectory; qint32 marker; qint32 v; qint32 viewMode; stream >> marker; stream >> v; - if (marker != QFileDialogMagic || v != version) + // the code below only supports versions 3 and 4 + if (marker != QFileDialogMagic || (v != 3 && v != 4)) return false; stream >> d->splitterState >> d->sidebarUrls - >> history - >> currentDirectory - >> d->headerData + >> history; + if (v == 3) { + QString currentDirectoryString; + stream >> currentDirectoryString; + currentDirectory = QUrl::fromLocalFile(currentDirectoryString); + } else { + stream >> currentDirectory; + } + stream >> d->headerData >> viewMode; - setDirectory(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir()); + setDirectoryUrl(lastVisitedDir()->isEmpty() ? currentDirectory : *lastVisitedDir()); setViewMode(static_cast<QFileDialog::ViewMode>(viewMode)); if (!d->usingWidgets()) @@ -574,8 +582,8 @@ QFileDialogPrivate::~QFileDialogPrivate() void QFileDialogPrivate::initHelper(QPlatformDialogHelper *h) { QFileDialog *d = q_func(); - QObject::connect(h, SIGNAL(fileSelected(QUrl)), d, SLOT(_q_nativeFileSelected(QUrl))); - QObject::connect(h, SIGNAL(filesSelected(QList<QUrl>)), d, SLOT(_q_nativeFilesSelected(QList<QUrl>))); + QObject::connect(h, SIGNAL(fileSelected(QUrl)), d, SLOT(_q_emitUrlSelected(QUrl))); + QObject::connect(h, SIGNAL(filesSelected(QList<QUrl>)), d, SLOT(_q_emitUrlsSelected(QList<QUrl>))); QObject::connect(h, SIGNAL(currentChanged(QUrl)), d, SLOT(_q_nativeCurrentChanged(QUrl))); QObject::connect(h, SIGNAL(directoryEntered(QUrl)), d, SLOT(_q_nativeEnterDirectory(QUrl))); QObject::connect(h, SIGNAL(filterSelected(QString)), d, SIGNAL(filterSelected(QString))); @@ -627,7 +635,7 @@ void QFileDialogPrivate::retranslateWindowTitle() setWindowTitle = q->windowTitle(); } -void QFileDialogPrivate::setLastVisitedDirectory(const QString &dir) +void QFileDialogPrivate::setLastVisitedDirectory(const QUrl &dir) { *lastVisitedDir() = dir; } @@ -941,11 +949,12 @@ void QFileDialog::setDirectory(const QString &directory) if (!directory.isEmpty() && newDirectory.isEmpty()) return; - d->setLastVisitedDirectory(newDirectory); + QUrl newDirUrl = QUrl::fromLocalFile(newDirectory); + d->setLastVisitedDirectory(newDirUrl); d->options->setInitialDirectory(QUrl::fromLocalFile(directory)); if (!d->usingWidgets()) { - d->setDirectory_sys(QUrl::fromLocalFile(newDirectory)); + d->setDirectory_sys(newDirUrl); return; } if (d->rootPath() == newDirectory) @@ -992,6 +1001,9 @@ void QFileDialog::setDirectoryUrl(const QUrl &directory) if (!directory.isValid()) return; + d->setLastVisitedDirectory(directory); + d->options->setInitialDirectory(directory); + if (d->nativeDialogInUse) d->setDirectory_sys(directory); else if (directory.isLocalFile()) @@ -2023,26 +2035,6 @@ QString QFileDialog::labelText(DialogLabel label) const return QString(); } -/* - For the native file dialogs -*/ - -#if defined(Q_WS_WIN) -extern QString qt_win_get_open_file_name(const QFileDialogArgs &args, - QString *initialDirectory, - QString *selectedFilter); - -extern QString qt_win_get_save_file_name(const QFileDialogArgs &args, - QString *initialDirectory, - QString *selectedFilter); - -extern QStringList qt_win_get_open_file_names(const QFileDialogArgs &args, - QString *initialDirectory, - QString *selectedFilter); - -extern QString qt_win_get_existing_directory(const QFileDialogArgs &args); -#endif - /*! This is a convenience static function that returns an existing file selected by the user. If the user presses Cancel, it returns a null string. @@ -2097,35 +2089,9 @@ QString QFileDialog::getOpenFileName(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); - args.filter = filter; - args.mode = ExistingFile; - args.options = options; -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_open_file_name(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles().value(0); - } - return QString(); -} - -static inline QUrl dialogResultToUrl(const QString &file) -{ - return file.isEmpty() ? QUrl() : QUrl::fromLocalFile(file); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getOpenFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2163,10 +2129,26 @@ QUrl QFileDialog::getOpenFileUrl(QWidget *parent, Options options, const QStringList &supportedSchemes) { - Q_UNUSED(supportedSchemes); + Q_UNUSED(supportedSchemes); // TODO + + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = ExistingFile; + args.options = options; - // Falls back to local file - return dialogResultToUrl(getOpenFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); + QFileDialog dialog(args); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls().value(0); + } + return QUrl(); } /*! @@ -2225,31 +2207,12 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); - args.filter = filter; - args.mode = ExistingFiles; - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_open_file_names(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles(); - } - return QStringList(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QList<QUrl> selectedUrls = getOpenFileUrls(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + QStringList fileNames; + foreach (const QUrl &url, selectedUrls) + fileNames << url.toLocalFile(); + return fileNames; } /*! @@ -2290,14 +2253,24 @@ QList<QUrl> QFileDialog::getOpenFileUrls(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local files - QList<QUrl> urls; - - const QStringList fileNames = getOpenFileNames(parent, caption, dir.toLocalFile(), filter, selectedFilter, options); - foreach (const QString &fileName, fileNames) - urls << QUrl::fromLocalFile(fileName); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = ExistingFiles; + args.options = options; - return urls; + QFileDialog dialog(args); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls(); + } + return QList<QUrl>(); } /*! @@ -2357,33 +2330,9 @@ QString QFileDialog::getSaveFileName(QWidget *parent, QString *selectedFilter, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.selection = QFileDialogPrivate::initialSelection(dir); - args.filter = filter; - args.mode = AnyFile; - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { - return qt_win_get_save_file_name(args, &(args.directory), selectedFilter); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - dialog.setAcceptMode(AcceptSave); - if (selectedFilter && !selectedFilter->isEmpty()) - dialog.selectNameFilter(*selectedFilter); - if (dialog.exec() == QDialog::Accepted) { - if (selectedFilter) - *selectedFilter = dialog.selectedNameFilter(); - return dialog.selectedFiles().value(0); - } - - return QString(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getSaveFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2423,8 +2372,25 @@ QUrl QFileDialog::getSaveFileUrl(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local file - return dialogResultToUrl(getSaveFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.selection = QFileDialogPrivate::initialSelection(dir); + args.filter = filter; + args.mode = AnyFile; + args.options = options; + + QFileDialog dialog(args); + dialog.setAcceptMode(AcceptSave); + if (selectedFilter && !selectedFilter->isEmpty()) + dialog.selectNameFilter(*selectedFilter); + if (dialog.exec() == QDialog::Accepted) { + if (selectedFilter) + *selectedFilter = dialog.selectedNameFilter(); + return dialog.selectedUrls().value(0); + } + return QUrl(); } /*! @@ -2471,29 +2437,9 @@ QString QFileDialog::getExistingDirectory(QWidget *parent, const QString &dir, Options options) { - QFileDialogArgs args; - args.parent = parent; - args.caption = caption; - args.directory = QFileDialogPrivate::workingDirectory(dir); - args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); - args.options = options; - -#if defined(Q_WS_WIN) - if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly) -#if defined(Q_OS_WINCE) - && qt_priv_ptr_valid -#endif - ) { - return qt_win_get_existing_directory(args); - } -#endif - - // create a qt dialog - QFileDialog dialog(args); - if (dialog.exec() == QDialog::Accepted) { - return dialog.selectedFiles().value(0); - } - return QString(); + const QStringList schemes = QStringList(QStringLiteral("file")); + const QUrl selectedUrl = getExistingDirectoryUrl(parent, caption, QUrl::fromLocalFile(dir), options, schemes); + return selectedUrl.toLocalFile(); } /*! @@ -2531,36 +2477,49 @@ QUrl QFileDialog::getExistingDirectoryUrl(QWidget *parent, { Q_UNUSED(supportedSchemes); - // Falls back to local file - return dialogResultToUrl(getExistingDirectory(parent, caption, dir.toLocalFile(), options)); + QFileDialogArgs args; + args.parent = parent; + args.caption = caption; + args.directory = QFileDialogPrivate::workingDirectory(dir); + args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); + args.options = options; + + QFileDialog dialog(args); + if (dialog.exec() == QDialog::Accepted) + return dialog.selectedUrls().value(0); + return QUrl(); } -inline static QString _qt_get_directory(const QString &path) +inline static QUrl _qt_get_directory(const QUrl &url) { - QFileInfo info = QFileInfo(QDir::current(), path); - if (info.exists() && info.isDir()) - return QDir::cleanPath(info.absoluteFilePath()); - info.setFile(info.absolutePath()); - if (info.exists() && info.isDir()) - return info.absoluteFilePath(); - return QString(); + if (url.isLocalFile()) { + QFileInfo info = QFileInfo(QDir::current(), url.toLocalFile()); + if (info.exists() && info.isDir()) + return QUrl::fromLocalFile(QDir::cleanPath(info.absoluteFilePath())); + info.setFile(info.absolutePath()); + if (info.exists() && info.isDir()) + return QUrl::fromLocalFile(info.absoluteFilePath()); + return QUrl(); + } else { + return url; + } } /* - Get the initial directory path + Get the initial directory URL \sa initialSelection() */ -QString QFileDialogPrivate::workingDirectory(const QString &path) +QUrl QFileDialogPrivate::workingDirectory(const QUrl &url) { - if (!path.isEmpty()) { - QString directory = _qt_get_directory(path); + if (!url.isEmpty()) { + QUrl directory = _qt_get_directory(url); if (!directory.isEmpty()) return directory; } - QString directory = _qt_get_directory(*lastVisitedDir()); + QUrl directory = _qt_get_directory(*lastVisitedDir()); if (!directory.isEmpty()) return directory; - return QDir::currentPath(); + return QUrl::fromLocalFile(QDir::currentPath()); } /* @@ -2570,14 +2529,19 @@ QString QFileDialogPrivate::workingDirectory(const QString &path) \sa workingDirectory() */ -QString QFileDialogPrivate::initialSelection(const QString &path) +QString QFileDialogPrivate::initialSelection(const QUrl &url) { - if (!path.isEmpty()) { - QFileInfo info(path); + if (url.isEmpty()) + return QString(); + if (url.isLocalFile()) { + QFileInfo info(url.toLocalFile()); if (!info.isDir()) return info.fileName(); + else + return QString(); } - return QString(); + // With remote URLs we can only assume. + return url.fileName(); } /*! @@ -2604,15 +2568,20 @@ void QFileDialog::done(int result) void QFileDialog::accept() { Q_D(QFileDialog); - QStringList files = selectedFiles(); - if (files.isEmpty()) - return; if (!d->usingWidgets()) { - d->emitFilesSelected(files); + const QList<QUrl> urls = selectedUrls(); + if (urls.isEmpty()) + return; + d->_q_emitUrlsSelected(urls); + if (urls.count() == 1) + d->_q_emitUrlSelected(urls.first()); QDialog::accept(); return; } + QStringList files = selectedFiles(); + if (files.isEmpty()) + return; QString lineEditText = d->lineEdit()->text(); // "hidden feature" type .. and then enter, and it will move up a dir // special case for ".." @@ -2709,7 +2678,7 @@ void QFileDialog::accept() Create widgets, layout and set default values */ -void QFileDialogPrivate::init(const QString &directory, const QString &nameFilter, +void QFileDialogPrivate::init(const QUrl &directory, const QString &nameFilter, const QString &caption) { Q_Q(QFileDialog); @@ -2726,7 +2695,7 @@ void QFileDialogPrivate::init(const QString &directory, const QString &nameFilte q->setFileMode(QFileDialog::AnyFile); if (!nameFilter.isEmpty()) q->setNameFilter(nameFilter); - q->setDirectory(workingDirectory(directory)); + q->setDirectoryUrl(workingDirectory(directory)); q->selectFile(initialSelection(directory)); #ifndef QT_NO_SETTINGS @@ -2775,7 +2744,7 @@ void QFileDialogPrivate::createWidgets() qFileDialogUi->setupUi(q); QList<QUrl> initialBookmarks; - initialBookmarks << QUrl::fromLocalFile(QLatin1String("")) + initialBookmarks << QUrl(QLatin1String("file:")) << QUrl::fromLocalFile(QDir::homePath()); qFileDialogUi->sidebar->setModelAndUrls(model, initialBookmarks); QFileDialog::connect(qFileDialogUi->sidebar, SIGNAL(goToUrl(QUrl)), @@ -3643,7 +3612,7 @@ void QFileDialogPrivate::_q_fileRenamed(const QString &path, const QString oldNa } } -void QFileDialogPrivate::_q_nativeFileSelected(const QUrl &file) +void QFileDialogPrivate::_q_emitUrlSelected(const QUrl &file) { Q_Q(QFileDialog); emit q->urlSelected(file); @@ -3651,7 +3620,7 @@ void QFileDialogPrivate::_q_nativeFileSelected(const QUrl &file) emit q->fileSelected(file.toLocalFile()); } -void QFileDialogPrivate::_q_nativeFilesSelected(const QList<QUrl> &files) +void QFileDialogPrivate::_q_emitUrlsSelected(const QList<QUrl> &files) { Q_Q(QFileDialog); emit q->urlsSelected(files); @@ -3675,9 +3644,10 @@ void QFileDialogPrivate::_q_nativeEnterDirectory(const QUrl &directory) { Q_Q(QFileDialog); emit q->directoryUrlEntered(directory); - if (!directory.isEmpty() && directory.isLocalFile()) { // Windows native dialogs occasionally emit signals with empty strings. - *lastVisitedDir() = directory.toLocalFile(); - emit q->directoryEntered(directory.toLocalFile()); + if (!directory.isEmpty()) { // Windows native dialogs occasionally emit signals with empty strings. + *lastVisitedDir() = directory; + if (directory.isLocalFile()) + emit q->directoryEntered(directory.toLocalFile()); } } @@ -3752,7 +3722,7 @@ void QFileDialogComboBox::showPopup() idx = idx.parent(); } // add "my computer" - list.append(QUrl::fromLocalFile(QLatin1String(""))); + list.append(QUrl(QLatin1String("file:"))); urlModel->addUrls(list, 0); idx = model()->index(model()->rowCount() - 1, 0); diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h index 404e16cde1..184e07261a 100644 --- a/src/widgets/dialogs/qfiledialog.h +++ b/src/widgets/dialogs/qfiledialog.h @@ -287,8 +287,8 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton()) Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index)) Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index)) - Q_PRIVATE_SLOT(d_func(), void _q_nativeFileSelected(const QUrl &)) - Q_PRIVATE_SLOT(d_func(), void _q_nativeFilesSelected(const QList<QUrl> &)) + Q_PRIVATE_SLOT(d_func(), void _q_emitUrlSelected(const QUrl &)) + Q_PRIVATE_SLOT(d_func(), void _q_emitUrlsSelected(const QList<QUrl> &)) Q_PRIVATE_SLOT(d_func(), void _q_nativeCurrentChanged(const QUrl &)) Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QUrl&)) Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path)) diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 89c6414b71..15bbd43446 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -100,7 +100,7 @@ struct QFileDialogArgs QWidget *parent; QString caption; - QString directory; + QUrl directory; QString selection; QString filter; QFileDialog::FileMode mode; @@ -123,12 +123,12 @@ public: void createMenuActions(); void createWidgets(); - void init(const QString &directory = QString(), const QString &nameFilter = QString(), + void init(const QUrl &directory = QUrl(), const QString &nameFilter = QString(), const QString &caption = QString()); bool itemViewKeyboardEvent(QKeyEvent *event); QString getEnvironmentVariable(const QString &string); - static QString workingDirectory(const QString &path); - static QString initialSelection(const QString &path); + static QUrl workingDirectory(const QUrl &path); + static QString initialSelection(const QUrl &path); QStringList typedFiles() const; QList<QUrl> userSelectedFiles() const; QStringList addDefaultSuffixToFiles(const QStringList filesToFix) const; @@ -189,7 +189,7 @@ public: #endif } - void setLastVisitedDirectory(const QString &dir); + void setLastVisitedDirectory(const QUrl &dir); void retranslateWindowTitle(); void retranslateStrings(); void emitFilesSelected(const QStringList &files); @@ -210,8 +210,8 @@ public: void _q_updateOkButton(); void _q_currentChanged(const QModelIndex &index); void _q_enterDirectory(const QModelIndex &index); - void _q_nativeFileSelected(const QUrl &file); - void _q_nativeFilesSelected(const QList<QUrl> &files); + void _q_emitUrlSelected(const QUrl &file); + void _q_emitUrlsSelected(const QList<QUrl> &files); void _q_nativeCurrentChanged(const QUrl &file); void _q_nativeEnterDirectory(const QUrl &directory); void _q_goToDirectory(const QString &); @@ -374,7 +374,7 @@ inline QUrl QFileDialogPrivate::directory_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->directory(); - return QString(); + return QUrl(); } inline void QFileDialogPrivate::selectFile_sys(const QUrl &filename) diff --git a/src/widgets/dialogs/qinputdialog.cpp b/src/widgets/dialogs/qinputdialog.cpp index 10d693b4a3..99344b3dd8 100644 --- a/src/widgets/dialogs/qinputdialog.cpp +++ b/src/widgets/dialogs/qinputdialog.cpp @@ -60,25 +60,37 @@ QT_USE_NAMESPACE -static const char *signalForMember(const char *member) +enum CandidateSignal { + TextValueSelectedSignal, + IntValueSelectedSignal, + DoubleValueSelectedSignal, + + NumCandidateSignals +}; + +static const char *candidateSignal(int which) { - static const int NumCandidates = 4; - static const char * const candidateSignals[NumCandidates] = { - SIGNAL(textValueSelected(QString)), - SIGNAL(intValueSelected(int)), - SIGNAL(doubleValueSelected(double)), - SIGNAL(accepted()) + switch (CandidateSignal(which)) { + case TextValueSelectedSignal: return SIGNAL(textValueSelected(QString)); + case IntValueSelectedSignal: return SIGNAL(intValueSelected(int)); + case DoubleValueSelectedSignal: return SIGNAL(doubleValueSelected(double)); + + case NumCandidateSignals: ; // fall through }; + Q_UNREACHABLE(); + return Q_NULLPTR; +} +static const char *signalForMember(const char *member) +{ QByteArray normalizedMember(QMetaObject::normalizedSignature(member)); - int i = 0; - while (i < NumCandidates - 1) { // sic - if (QMetaObject::checkConnectArgs(candidateSignals[i], normalizedMember)) - break; - ++i; - } - return candidateSignals[i]; + for (int i = 0; i < NumCandidateSignals; ++i) + if (QMetaObject::checkConnectArgs(candidateSignal(i), normalizedMember)) + return candidateSignal(i); + + // otherwise, use fit-all accepted signal: + return SIGNAL(accepted()); } QT_BEGIN_NAMESPACE diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp index 662504fc25..ed856c266e 100644 --- a/src/widgets/dialogs/qprogressdialog.cpp +++ b/src/widgets/dialogs/qprogressdialog.cpp @@ -84,6 +84,9 @@ public: void init(const QString &labelText, const QString &cancelText, int min, int max); void layout(); void retranslateStrings(); + void setCancelButtonText(const QString &cancelButtonText); + void adoptChildWidget(QWidget *c); + void ensureSizeIsAtLeastSizeHint(); void _q_disconnectOnClose(); QLabel *label; @@ -178,9 +181,8 @@ void QProgressDialogPrivate::layout() void QProgressDialogPrivate::retranslateStrings() { - Q_Q(QProgressDialog); if (useDefaultCancelText) - q->setCancelButtonText(QProgressDialog::tr("Cancel")); + setCancelButtonText(QProgressDialog::tr("Cancel")); } void QProgressDialogPrivate::_q_disconnectOnClose() @@ -354,20 +356,14 @@ QProgressDialog::~QProgressDialog() void QProgressDialog::setLabel(QLabel *label) { Q_D(QProgressDialog); + if (label == d->label) { + if (label) + qWarning("QProgressDialog::setLabel: Attempt to set the same label again"); + return; + } delete d->label; d->label = label; - if (label) { - if (label->parentWidget() == this) { - label->hide(); // until we resize - } else { - label->setParent(this, 0); - } - } - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); - if (label) - label->show(); + d->adoptChildWidget(label); } @@ -391,9 +387,7 @@ void QProgressDialog::setLabelText(const QString &text) Q_D(QProgressDialog); if (d->label) { d->label->setText(text); - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); + d->ensureSizeIsAtLeastSizeHint(); } } @@ -411,14 +405,14 @@ void QProgressDialog::setLabelText(const QString &text) void QProgressDialog::setCancelButton(QPushButton *cancelButton) { Q_D(QProgressDialog); + if (d->cancel == cancelButton) { + if (cancelButton) + qWarning("QProgressDialog::setCancelButton: Attempt to set the same button again"); + return; + } delete d->cancel; d->cancel = cancelButton; if (cancelButton) { - if (cancelButton->parentWidget() == this) { - cancelButton->hide(); // until we resize - } else { - cancelButton->setParent(this, 0); - } connect(d->cancel, SIGNAL(clicked()), this, SIGNAL(canceled())); #ifndef QT_NO_SHORTCUT d->escapeShortcut = new QShortcut(Qt::Key_Escape, this, SIGNAL(canceled())); @@ -429,11 +423,7 @@ void QProgressDialog::setCancelButton(QPushButton *cancelButton) d->escapeShortcut = 0; #endif } - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); - if (cancelButton) - cancelButton->show(); + d->adoptChildWidget(cancelButton); } /*! @@ -448,19 +438,23 @@ void QProgressDialog::setCancelButtonText(const QString &cancelButtonText) { Q_D(QProgressDialog); d->useDefaultCancelText = false; + d->setCancelButtonText(cancelButtonText); +} + +void QProgressDialogPrivate::setCancelButtonText(const QString &cancelButtonText) +{ + Q_Q(QProgressDialog); if (!cancelButtonText.isNull()) { - if (d->cancel) { - d->cancel->setText(cancelButtonText); + if (cancel) { + cancel->setText(cancelButtonText); } else { - setCancelButton(new QPushButton(cancelButtonText, this)); + q->setCancelButton(new QPushButton(cancelButtonText, q)); } } else { - setCancelButton(0); + q->setCancelButton(0); } - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); + ensureSizeIsAtLeastSizeHint(); } @@ -483,11 +477,38 @@ void QProgressDialog::setBar(QProgressBar *bar) qWarning("QProgressDialog::setBar: Cannot set a new progress bar " "while the old one is active"); #endif + if (bar == d->bar) { + qWarning("QProgressDialog::setBar: Attempt to set the same progress bar again"); + return; + } delete d->bar; d->bar = bar; - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); + d->adoptChildWidget(bar); +} + +void QProgressDialogPrivate::adoptChildWidget(QWidget *c) +{ + Q_Q(QProgressDialog); + + if (c) { + if (c->parentWidget() == q) + c->hide(); // until after ensureSizeIsAtLeastSizeHint() + else + c->setParent(q, 0); + } + ensureSizeIsAtLeastSizeHint(); + if (c) + c->show(); +} + +void QProgressDialogPrivate::ensureSizeIsAtLeastSizeHint() +{ + Q_Q(QProgressDialog); + + QSize size = q->sizeHint(); + if (q->isVisible()) + size = size.expandedTo(q->size()); + q->resize(size); } @@ -507,7 +528,7 @@ bool QProgressDialog::wasCanceled() const \property QProgressDialog::maximum \brief the highest value represented by the progress bar - The default is 0. + The default is 100. \sa minimum, setRange() */ @@ -673,9 +694,7 @@ void QProgressDialog::setValue(int progress) } } if (need_show) { - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); + d->ensureSizeIsAtLeastSizeHint(); show(); d->shown_once = true; } @@ -821,9 +840,7 @@ void QProgressDialog::showEvent(QShowEvent *e) { Q_D(QProgressDialog); QDialog::showEvent(e); - int w = qMax(isVisible() ? width() : 0, sizeHint().width()); - int h = qMax(isVisible() ? height() : 0, sizeHint().height()); - resize(w, h); + d->ensureSizeIsAtLeastSizeHint(); d->forceTimer->stop(); } diff --git a/src/widgets/dialogs/qsidebar.cpp b/src/widgets/dialogs/qsidebar.cpp index 3d22992e3a..7b691dc609 100644 --- a/src/widgets/dialogs/qsidebar.cpp +++ b/src/widgets/dialogs/qsidebar.cpp @@ -249,7 +249,8 @@ void QUrlModel::addUrls(const QList<QUrl> &list, int row, bool move) continue; //this makes sure the url is clean const QString cleanUrl = QDir::cleanPath(url.toLocalFile()); - url = QUrl::fromLocalFile(cleanUrl); + if (!cleanUrl.isEmpty()) + url = QUrl::fromLocalFile(cleanUrl); for (int j = 0; move && j < rowCount(); ++j) { QString local = index(j, 0).data(UrlRole).toUrl().toLocalFile(); diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp index b294e98c30..15f922a5b8 100644 --- a/src/widgets/dialogs/qwizard.cpp +++ b/src/widgets/dialogs/qwizard.cpp @@ -1475,7 +1475,7 @@ void QWizardPrivate::updateButtonTexts() void QWizardPrivate::updateButtonLayout() { if (buttonsHaveCustomLayout) { - QVarLengthArray<QWizard::WizardButton> array(buttonsCustomLayout.count()); + QVarLengthArray<QWizard::WizardButton, QWizard::NButtons> array(buttonsCustomLayout.count()); for (int i = 0; i < buttonsCustomLayout.count(); ++i) array[i] = buttonsCustomLayout.at(i); setButtonLayout(array.constData(), array.count()); diff --git a/src/widgets/dialogs/qwizard_win.cpp b/src/widgets/dialogs/qwizard_win.cpp index 747115984d..84781b4099 100644 --- a/src/widgets/dialogs/qwizard_win.cpp +++ b/src/widgets/dialogs/qwizard_win.cpp @@ -172,6 +172,7 @@ static PtrGetThemePartSize pGetThemePartSize = 0; static PtrGetThemeColor pGetThemeColor = 0; int QVistaHelper::instanceCount = 0; +int QVistaHelper::m_devicePixelRatio = 1; bool QVistaHelper::is_vista = false; QVistaHelper::VistaState QVistaHelper::cachedVistaState = QVistaHelper::Dirty; @@ -228,11 +229,15 @@ void QVistaBackButton::paintEvent(QPaintEvent *) RECT clipRect; int xoffset = origin.x() + QWidget::mapToParent(r.topLeft()).x() - 1; int yoffset = origin.y() + QWidget::mapToParent(r.topLeft()).y() - 1; + const int dpr = devicePixelRatio(); + const QRect rDp = QRect(r.topLeft() * dpr, r.size() * dpr); + const int xoffsetDp = xoffset * dpr; + const int yoffsetDp = yoffset * dpr; - clipRect.top = r.top() + yoffset; - clipRect.bottom = r.bottom() + yoffset; - clipRect.left = r.left() + xoffset; - clipRect.right = r.right() + xoffset; + clipRect.top = rDp.top() + yoffsetDp; + clipRect.bottom = rDp.bottom() + yoffsetDp; + clipRect.left = rDp.left() + xoffsetDp; + clipRect.right = rDp.right() + xoffsetDp; int state = WIZ_NAV_BB_NORMAL; if (!isEnabled()) @@ -259,6 +264,7 @@ QVistaHelper::QVistaHelper(QWizard *wizard) , wizard(wizard) , backButton_(0) { + QVistaHelper::m_devicePixelRatio = wizard->devicePixelRatio(); is_vista = resolveSymbols(); if (instanceCount++ == 0) cachedVistaState = Dirty; @@ -281,10 +287,12 @@ QVistaHelper::~QVistaHelper() void QVistaHelper::updateCustomMargins(bool vistaMargins) { if (QWindow *window = wizard->windowHandle()) { - // Reduce top frame to zero since we paint it ourselves. - const QMargins customMargins = vistaMargins ? - QMargins(0, -titleBarSize(), 0, 0) : QMargins(); - const QVariant customMarginsV = qVariantFromValue(customMargins); + // Reduce top frame to zero since we paint it ourselves. Use + // device pixel to avoid rounding errors. + const QMargins customMarginsDp = vistaMargins + ? QMargins(0, -titleBarSizeDp(), 0, 0) + : QMargins(); + const QVariant customMarginsV = qVariantFromValue(customMarginsDp); // The dynamic property takes effect when creating the platform window. window->setProperty("_q_windowsCustomMargins", customMarginsV); // If a platform window exists, change via native interface. @@ -351,7 +359,7 @@ bool QVistaHelper::setDWMTitleBar(TitleBarChangeType type) if (type == NormalTitleBar) mar.cyTopHeight = 0; else - mar.cyTopHeight = titleBarSize() + topOffset(); + mar.cyTopHeight = (titleBarSize() + topOffset()) * QVistaHelper::m_devicePixelRatio; if (const HWND wizardHandle = wizardHWND()) if (SUCCEEDED(pDwmExtendFrameIntoClientArea(wizardHandle, &mar))) value = true; @@ -371,6 +379,8 @@ void QVistaHelper::drawTitleBar(QPainter *painter) if (vistaState() == VistaAero && isWindow) drawBlackRect(QRect(0, 0, wizard->width(), titleBarSize() + topOffset()), hdc); + // The button is positioned in QWizardPrivate::handleAeroStyleChange(), + // all calculation is relative to it. const int btnTop = backButton_->mapToParent(QPoint()).y(); const int btnHeight = backButton_->size().height(); const int verticalCenter = (btnTop + btnHeight / 2) - 1; @@ -405,14 +415,15 @@ void QVistaHelper::drawTitleBar(QPainter *painter) const QIcon windowIcon = wizard->windowIcon(); if (!windowIcon.isNull()) { + const int size = QVistaHelper::iconSize(); const int iconLeft = (wizard->layoutDirection() == Qt::LeftToRight ? leftMargin() - : wizard->width() - leftMargin() - iconSize()); + : wizard->width() - leftMargin() - size); - const QRect rect(origin.x() + iconLeft, - origin.y() + verticalCenter - iconSize() / 2, iconSize(), iconSize()); - const HICON hIcon = qt_pixmapToWinHICON(windowIcon.pixmap(iconSize())); - DrawIconEx(hdc, rect.left(), rect.top(), hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT); + const QPoint pos(origin.x() + iconLeft, origin.y() + verticalCenter - size / 2); + const QPoint posDp = pos * QVistaHelper::m_devicePixelRatio; + const HICON hIcon = qt_pixmapToWinHICON(windowIcon.pixmap(size * QVistaHelper::m_devicePixelRatio)); + DrawIconEx(hdc, posDp.x(), posDp.y(), hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT); DestroyIcon(hIcon); } } @@ -691,6 +702,8 @@ bool QVistaHelper::drawTitleText(QPainter *painter, const QString &text, const Q { bool value = false; if (vistaState() == VistaAero) { + const QRect rectDp = QRect(rect.topLeft() * QVistaHelper::m_devicePixelRatio, + rect.size() * QVistaHelper::m_devicePixelRatio); HWND handle = QApplicationPrivate::getHWNDForWidget(QApplication::desktop()); HANDLE hTheme = pOpenThemeData(handle, L"WINDOW"); if (!hTheme) return false; @@ -702,8 +715,8 @@ bool QVistaHelper::drawTitleText(QPainter *painter, const QString &text, const Q dcMem = CreateCompatibleDC(hdc); dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dib.bmiHeader.biWidth = rect.width(); - dib.bmiHeader.biHeight = -rect.height(); + dib.bmiHeader.biWidth = rectDp.width(); + dib.bmiHeader.biHeight = -rectDp.height(); dib.bmiHeader.biPlanes = 1; dib.bmiHeader.biBitCount = 32; dib.bmiHeader.biCompression = BI_RGB; @@ -719,13 +732,13 @@ bool QVistaHelper::drawTitleText(QPainter *painter, const QString &text, const Q WIZ_DTTOPTS dto; dto.dwSize = sizeof(WIZ_DTTOPTS); const UINT uFormat = WIZ_DT_SINGLELINE|WIZ_DT_CENTER|WIZ_DT_VCENTER|WIZ_DT_NOPREFIX; - RECT rctext ={0,0, rect.width(), rect.height()}; + RECT rctext ={0,0, rectDp.width(), rectDp.height()}; dto.dwFlags = WIZ_DTT_COMPOSITED|WIZ_DTT_GLOWSIZE; dto.iGlowSize = glowSize(); pDrawThemeTextEx(hTheme, dcMem, 0, 0, (LPCWSTR)text.utf16(), -1, uFormat, &rctext, &dto ); - BitBlt(hdc, rect.left(), rect.top(), rect.width(), rect.height(), dcMem, 0, 0, SRCCOPY); + BitBlt(hdc, rectDp.left(), rectDp.top(), rectDp.width(), rectDp.height(), dcMem, 0, 0, SRCCOPY); SelectObject(dcMem, (HGDIOBJ) hOldBmp); SelectObject(dcMem, (HGDIOBJ) hOldFont); DeleteObject(bmp); @@ -743,6 +756,8 @@ bool QVistaHelper::drawBlackRect(const QRect &rect, HDC hdc) bool value = false; if (vistaState() == VistaAero) { // Set up a memory DC and bitmap that we'll draw into + const QRect rectDp = QRect(rect.topLeft() * QVistaHelper::m_devicePixelRatio, + rect.size() * QVistaHelper::m_devicePixelRatio); HDC dcMem; HBITMAP bmp; BITMAPINFO dib; @@ -750,8 +765,8 @@ bool QVistaHelper::drawBlackRect(const QRect &rect, HDC hdc) dcMem = CreateCompatibleDC(hdc); dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dib.bmiHeader.biWidth = rect.width(); - dib.bmiHeader.biHeight = -rect.height(); + dib.bmiHeader.biWidth = rectDp.width(); + dib.bmiHeader.biHeight = -rectDp.height(); dib.bmiHeader.biPlanes = 1; dib.bmiHeader.biBitCount = 32; dib.bmiHeader.biCompression = BI_RGB; @@ -759,7 +774,7 @@ bool QVistaHelper::drawBlackRect(const QRect &rect, HDC hdc) bmp = CreateDIBSection(hdc, &dib, DIB_RGB_COLORS, NULL, NULL, 0); HBITMAP hOldBmp = (HBITMAP)SelectObject(dcMem, (HGDIOBJ) bmp); - BitBlt(hdc, rect.left(), rect.top(), rect.width(), rect.height(), dcMem, 0, 0, SRCCOPY); + BitBlt(hdc, rectDp.left(), rectDp.top(), rectDp.width(), rectDp.height(), dcMem, 0, 0, SRCCOPY); SelectObject(dcMem, (HGDIOBJ) hOldBmp); DeleteObject(bmp); @@ -785,12 +800,12 @@ static inline int getWindowBottomMargin() } #endif // _MSC_VER >= 1700 -int QVistaHelper::frameSize() +int QVistaHelper::frameSizeDp() { return getWindowBottomMargin(); } -int QVistaHelper::captionSize() +int QVistaHelper::captionSizeDp() { return GetSystemMetrics(SM_CYCAPTION); } @@ -846,6 +861,16 @@ int QVistaHelper::titleOffset() return leftMargin() + iconOffset; } +int QVistaHelper::iconSize() +{ + return QStyleHelper::dpiScaled(16); // Standard Aero +} + +int QVistaHelper::glowSize() +{ + return QStyleHelper::dpiScaled(10); +} + int QVistaHelper::topOffset() { if (vistaState() != VistaAero) diff --git a/src/widgets/dialogs/qwizard_win_p.h b/src/widgets/dialogs/qwizard_win_p.h index 81514a8950..ac58e76a45 100644 --- a/src/widgets/dialogs/qwizard_win_p.h +++ b/src/widgets/dialogs/qwizard_win_p.h @@ -102,7 +102,8 @@ public: QColor basicWindowFrameColor(); enum VistaState { VistaAero, VistaBasic, Classic, Dirty }; static VistaState vistaState(); - static int titleBarSize() { return frameSize() + captionSize(); } + static int titleBarSize() { return QVistaHelper::titleBarSizeDp() / QVistaHelper::m_devicePixelRatio; } + static int titleBarSizeDp() { return QVistaHelper::frameSizeDp() + QVistaHelper::captionSizeDp(); } static int topPadding() { // padding under text return int(QStyleHelper::dpiScaled( QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS7 ? 4 : 6)); @@ -117,12 +118,14 @@ private: bool drawTitleText(QPainter *painter, const QString &text, const QRect &rect, HDC hdc); static bool drawBlackRect(const QRect &rect, HDC hdc); - static int frameSize(); - static int captionSize(); + static int frameSize() { return QVistaHelper::frameSizeDp() / QVistaHelper::m_devicePixelRatio; } + static int frameSizeDp(); + static int captionSize() { return QVistaHelper::captionSizeDp() / QVistaHelper::m_devicePixelRatio; } + static int captionSizeDp(); static int backButtonSize() { return int(QStyleHelper::dpiScaled(30)); } - static int iconSize() { return 16; } // Standard Aero - static int glowSize() { return 10; } + static int iconSize(); + static int glowSize(); int leftMargin() { return backButton_->isVisible() ? backButtonSize() + iconSpacing : 0; } int titleOffset(); @@ -152,6 +155,7 @@ private: int titleBarOffset; // Extra spacing above the text int iconSpacing; // Space between button and icon int textSpacing; // Space between icon and text + static int m_devicePixelRatio; }; |