summaryrefslogtreecommitdiffstats
path: root/src/widgets/dialogs
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/dialogs')
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp77
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp338
-rw-r--r--src/widgets/dialogs/qfiledialog.h4
-rw-r--r--src/widgets/dialogs/qfiledialog_p.h16
-rw-r--r--src/widgets/dialogs/qinputdialog.cpp40
-rw-r--r--src/widgets/dialogs/qprogressdialog.cpp105
-rw-r--r--src/widgets/dialogs/qsidebar.cpp3
-rw-r--r--src/widgets/dialogs/qwizard.cpp2
-rw-r--r--src/widgets/dialogs/qwizard_win.cpp71
-rw-r--r--src/widgets/dialogs/qwizard_win_p.h14
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;
};