summaryrefslogtreecommitdiffstats
path: root/src/gui/dialogs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/dialogs')
-rw-r--r--src/gui/dialogs/qabstractprintdialog.cpp2
-rw-r--r--src/gui/dialogs/qfiledialog.cpp280
-rw-r--r--src/gui/dialogs/qfiledialog_p.h2
-rw-r--r--src/gui/dialogs/qfilesystemmodel.h2
-rw-r--r--src/gui/dialogs/qfilesystemmodel_p.h12
-rw-r--r--src/gui/dialogs/qfontdialog_mac.mm73
-rw-r--r--src/gui/dialogs/qmessagebox.cpp57
-rw-r--r--src/gui/dialogs/qprintdialog_unix.cpp4
-rw-r--r--src/gui/dialogs/qsidebar.cpp25
-rw-r--r--src/gui/dialogs/qsidebar_p.h13
10 files changed, 254 insertions, 216 deletions
diff --git a/src/gui/dialogs/qabstractprintdialog.cpp b/src/gui/dialogs/qabstractprintdialog.cpp
index 0dc16c9..5ed8852 100644
--- a/src/gui/dialogs/qabstractprintdialog.cpp
+++ b/src/gui/dialogs/qabstractprintdialog.cpp
@@ -400,7 +400,7 @@ void QAbstractPrintDialogPrivate::setPrinter(QPrinter *newPrinter)
QAbstractPrintDialog::setEnabledOptions() and
QAbstractPrintDialog::addEnabledOption() have no effect.
- In Qt 4.4, it was possible to use the satic functions to show a sheet on
+ In Qt 4.4, it was possible to use the static functions to show a sheet on
Mac OS X. This is no longer supported in Qt 4.5. If you want this
functionality, use QPrintDialog::open().
diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index f70669c..eeb2743 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -96,9 +96,8 @@ Q_GUI_EXPORT _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook
order to select one or many files or a directory.
The easiest way to create a QFileDialog is to use the static
- functions. On Windows, these static functions will call the native
- Windows file dialog, and on Mac OS X these static function will call
- the native Mac OS X file dialog.
+ functions. On Windows, Mac OS X, KDE and GNOME, these static functions will
+ call the native file dialog when possible.
\snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 0
@@ -216,7 +215,7 @@ Q_GUI_EXPORT _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook
are resolved.
\value DontConfirmOverwrite Don't ask for confirmation if an existing file is selected.
By default confirmation is requested.
- \value DontUseNativeDialog Don't use the native file dialog. By default on Mac OS X and Windows,
+ \value DontUseNativeDialog Don't use the native file dialog. By default on Mac OS X,
the native file dialog is used unless you use a subclass of QFileDialog that contains the
Q_OBJECT macro.
\value ReadOnly Indicates that the model is readonly.
@@ -693,7 +692,10 @@ void QFileDialog::setVisible(bool visible)
*/
void QFileDialogPrivate::_q_goToUrl(const QUrl &url)
{
- QModelIndex idx = model->index(url.toLocalFile());
+ //The shortcut in the side bar may have a parent that is not fetched yet (e.g. an hidden file)
+ //so we force the fetching
+ QFileSystemModelPrivate::QFileSystemNode *node = model->d_func()->node(url.toLocalFile(), true);
+ QModelIndex idx = model->d_func()->index(node);
_q_enterDirectory(idx);
}
@@ -1437,6 +1439,8 @@ void QFileDialog::setIconProvider(QFileIconProvider *provider)
{
Q_D(QFileDialog);
d->model->setIconProvider(provider);
+ //It forces the refresh of all entries in the side bar, then we can get new icons
+ d->qFileDialogUi->sidebar->setUrls(d->qFileDialogUi->sidebar->urls());
}
/*!
@@ -1533,52 +1537,51 @@ 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.
+ 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.
- \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 8
+ \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 8
- The function creates a modal file dialog with the given \a parent widget.
- If the parent is not 0, the dialog will be shown centered over the
- parent widget.
+ The function creates a modal file dialog with the given \a parent widget.
+ If \a parent is not 0, the dialog will be shown centered over the parent
+ widget.
- The file dialog's working directory will be set to \a dir. If \a
- dir includes a file name, the file will be selected. Only files
- that match the given \a filter are shown. The filter selected is
- set to \a selectedFilter. The parameters \a dir, \a
- selectedFilter, and \a filter may be empty strings. If you want
- multiple filters, separate them with ';;', for example:
+ The file dialog's working directory will be set to \a dir. If \a dir
+ includes a file name, the file will be selected. Only files that match the
+ given \a filter are shown. The filter selected is set to \a selectedFilter.
+ The parameters \a dir, \a selectedFilter, and \a filter may be empty
+ strings. If you want multiple filters, separate them with ';;', for
+ example:
- \code
+ \code
"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
- \endcode
+ \endcode
- The \a options argument holds various
- options about how to run the dialog, see the QFileDialog::Option enum for
- more information on the flags you can pass.
+ The \a options argument holds various options about how to run the dialog,
+ see the QFileDialog::Option enum for more information on the flags you can
+ pass.
- The dialog's caption is set to \a caption. If \a caption is not
- specified then a default caption will be used.
+ The dialog's caption is set to \a caption. If \a caption is not specified
+ then a default caption will be used.
- Under Windows and Mac OS X, this static function will use the native
- file dialog and not a QFileDialog.
+ On Windows and Mac OS X, this static function will use the native file
+ dialog and not a QFileDialog.
- Note that on Windows the dialog will spin a blocking modal event loop
- that will not dispatch any QTimers, and if parent is not 0 then it will
- position the dialog just under the parent's title bar.
+ On Windows the dialog will spin a blocking modal event loop that will not
+ dispatch any QTimers, and if \a parent is not 0 then it will position the
+ dialog just below the parent's title bar.
- Under Unix/X11, the normal behavior of the file dialog is to resolve
- and follow symlinks. For example, if \c{/usr/tmp} is a symlink to
- \c{/var/tmp}, the file dialog will change to \c{/var/tmp} after
- entering \c{/usr/tmp}. If \a options includes DontResolveSymlinks,
- the file dialog will treat symlinks as regular directories.
+ On Unix/X11, the normal behavior of the file dialog is to resolve and
+ follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
+ the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
+ \a options includes DontResolveSymlinks, the file dialog will treat
+ symlinks as regular directories.
- \warning Do not delete \a parent during the execution of the dialog.
- If you want to do this, you should create the dialog
- yourself using one of the QFileDialog constructors.
+ \warning Do not delete \a parent during the execution of the dialog. If you
+ want to do this, you should create the dialog yourself using one of the
+ QFileDialog constructors.
- \sa getOpenFileNames(), getSaveFileName(), getExistingDirectory()
+ \sa getOpenFileNames(), getSaveFileName(), getExistingDirectory()
*/
QString QFileDialog::getOpenFileName(QWidget *parent,
const QString &caption,
@@ -1621,54 +1624,53 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
}
/*!
- This is a convenience static function that will return one or more
- existing files selected by the user.
+ This is a convenience static function that will return one or more existing
+ files selected by the user.
- \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 9
+ \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 9
- This function creates a modal file dialog with the given \a parent
- widget. If the parent is not 0, the dialog will be shown centered
- over the parent widget.
+ This function creates a modal file dialog with the given \a parent widget.
+ If \a parent is not 0, the dialog will be shown centered over the parent
+ widget.
- The file dialog's working directory will be set to \a dir. If \a
- dir includes a file name, the file will be selected. The filter
- is set to \a filter so that only those files which match the filter
- are shown. The filter selected is set to \a selectedFilter. The parameters
- \a dir, \a selectedFilter and \a filter may be empty strings. If you
- need multiple filters, separate them with ';;', for instance:
+ The file dialog's working directory will be set to \a dir. If \a dir
+ includes a file name, the file will be selected. The filter is set to
+ \a filter so that only those files which match the filter are shown. The
+ filter selected is set to \a selectedFilter. The parameters \a dir,
+ \a selectedFilter and \a filter may be empty strings. If you need multiple
+ filters, separate them with ';;', for instance:
- \code
+ \code
"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
- \endcode
+ \endcode
- The dialog's caption is set to \a caption. If \a caption is not
- specified then a default caption will be used.
+ The dialog's caption is set to \a caption. If \a caption is not specified
+ then a default caption will be used.
- Under Windows and Mac OS X, this static function will use the native
- file dialog and not a QFileDialog. On Mac OS X, the \a dir argument
- is ignored, the native dialog always displays the last visited directory.
+ On Windows and Mac OS X, this static function will use the native file
+ dialog and not a QFileDialog.
- Note that on Windows the dialog will spin a blocking modal event loop
- that will not dispatch any QTimers, and if parent is not 0 then it will
- position the dialog just under the parent's title bar.
+ On Windows the dialog will spin a blocking modal event loop that will not
+ dispatch any QTimers, and if \a parent is not 0 then it will position the
+ dialog just below the parent's title bar.
- Under Unix/X11, the normal behavior of the file dialog is to resolve
- and follow symlinks. For example, if \c{/usr/tmp} is a symlink to
- \c{/var/tmp}, the file dialog will change to \c{/var/tmp} after
- entering \c{/usr/tmp}. The \a options argument holds various
- options about how to run the dialog, see the QFileDialog::Option enum for
- more information on the flags you can pass.
+ On Unix/X11, the normal behavior of the file dialog is to resolve and
+ follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
+ the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}.
+ The \a options argument holds various options about how to run the dialog,
+ see the QFileDialog::Option enum for more information on the flags you can
+ pass.
- Note that if you want to iterate over the list of files, you should
- iterate over a copy. For example:
+ \note If you want to iterate over the list of files, you should iterate
+ over a copy. For example:
\snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 10
- \warning Do not delete \a parent during the execution of the dialog.
- If you want to do this, you should create the dialog
- yourself using one of the QFileDialog constructors.
+ \warning Do not delete \a parent during the execution of the dialog. If you
+ want to do this, you should create the dialog yourself using one of the
+ QFileDialog constructors.
- \sa getOpenFileName(), getSaveFileName(), getExistingDirectory()
+ \sa getOpenFileName(), getSaveFileName(), getExistingDirectory()
*/
QStringList QFileDialog::getOpenFileNames(QWidget *parent,
const QString &caption,
@@ -1712,54 +1714,54 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
}
/*!
- This is a convenience static function that will return a file name
- selected by the user. The file does not have to exist.
+ This is a convenience static function that will return a file name selected
+ by the user. The file does not have to exist.
- It creates a modal file dialog with the given \a parent widget. If the
- parent is not 0, the dialog will be shown centered over the parent
- widget.
+ It creates a modal file dialog with the given \a parent widget. If
+ \a parent is not 0, the dialog will be shown centered over the parent
+ widget.
- \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 11
+ \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 11
- The file dialog's working directory will be set to \a dir. If \a
- dir includes a file name, the file will be selected. Only files that
- match the \a filter are shown. The filter selected is set to
- \a selectedFilter. The parameters \a dir, \a selectedFilter, and
- \a filter may be empty strings. Multiple filters are separated with ';;'.
- For instance:
+ The file dialog's working directory will be set to \a dir. If \a dir
+ includes a file name, the file will be selected. Only files that match the
+ \a filter are shown. The filter selected is set to \a selectedFilter. The
+ parameters \a dir, \a selectedFilter, and \a filter may be empty strings.
+ Multiple filters are separated with ';;'. For instance:
- \code
+ \code
"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"
- \endcode
+ \endcode
- The \a options argument holds various
- options about how to run the dialog, see the QFileDialog::Option enum for
- more information on the flags you can pass.
+ The \a options argument holds various options about how to run the dialog,
+ see the QFileDialog::Option enum for more information on the flags you can
+ pass.
- The default filter can be chosen by setting \a selectedFilter to the desired value.
+ The default filter can be chosen by setting \a selectedFilter to the
+ desired value.
- The dialog's caption is set to \a caption. If \a caption is not
- specified then a default caption will be used.
+ The dialog's caption is set to \a caption. If \a caption is not specified,
+ a default caption will be used.
- Under Windows and Mac OS X, this static function will use the native
- file dialog and not a QFileDialog.
+ On Windows and Mac OS X, this static function will use the native file
+ dialog and not a QFileDialog.
- Note that on Windows the dialog will spin a blocking modal event loop
- that will not dispatch any QTimers, and if parent is not 0 then it will
- position the dialog just under the parent's title bar.
- On Mac OS X, the filter argument is ignored.
+ On Windows the dialog will spin a blocking modal event loop that will not
+ dispatch any QTimers, and if \a parent is not 0 then it will position the
+ dialog just below the parent's title bar. On Mac OS X, with its native file
+ dialog, the filter argument is ignored.
- Under Unix/X11, the normal behavior of the file dialog is to resolve
- and follow symlinks. For example, if \c{/usr/tmp} is a symlink to
- \c{/var/tmp}, the file dialog will change to \c{/var/tmp} after
- entering \c{/usr/tmp}. If \a options includes DontResolveSymlinks,
- the file dialog will treat symlinks as regular directories.
+ On Unix/X11, the normal behavior of the file dialog is to resolve and
+ follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
+ the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
+ \a options includes DontResolveSymlinks the file dialog will treat symlinks
+ as regular directories.
- \warning Do not delete \a parent during the execution of the dialog.
- If you want to do this, you should create the dialog
- yourself using one of the QFileDialog constructors.
+ \warning Do not delete \a parent during the execution of the dialog. If you
+ want to do this, you should create the dialog yourself using one of the
+ QFileDialog constructors.
- \sa getOpenFileName(), getOpenFileNames(), getExistingDirectory()
+ \sa getOpenFileName(), getOpenFileNames(), getExistingDirectory()
*/
QString QFileDialog::getSaveFileName(QWidget *parent,
const QString &caption,
@@ -1805,46 +1807,43 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
}
/*!
- This is a convenience static function that will return an existing
- directory selected by the user.
+ This is a convenience static function that will return an existing
+ directory selected by the user.
- \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 12
+ \snippet doc/src/snippets/code/src_gui_dialogs_qfiledialog.cpp 12
- This function creates a modal file dialog with the given \a parent
- widget. If the parent is not 0, the dialog will be shown centered over
- the parent widget.
+ This function creates a modal file dialog with the given \a parent widget.
+ If \a parent is not 0, the dialog will be shown centered over the parent
+ widget.
- The dialog's working directory is set to \a dir, and the caption is
- set to \a caption. Either of these may be an empty string in which case
- the current directory and a default caption will be used
- respectively.
+ The dialog's working directory is set to \a dir, and the caption is set to
+ \a caption. Either of these may be an empty string in which case the
+ current directory and a default caption will be used respectively.
- The \a options argument holds various
- options about how to run the dialog, see the QFileDialog::Option enum for
- more information on the flags you can pass. Note that \l{QFileDialog::}{ShowDirsOnly}
- must be set to ensure a native file dialog.
+ The \a options argument holds various options about how to run the dialog,
+ see the QFileDialog::Option enum for more information on the flags you can
+ pass. To ensure a native file dialog, \l{QFileDialog::}{ShowDirsOnly} must
+ be set.
- Under Windows and Mac OS X, this static function will use the native
- file dialog and not a QFileDialog. On Mac OS X, the \a dir argument
- is ignored, the native dialog always displays the last visited directory.
- On Windows CE, if the device has no native file dialog, a QFileDialog
- will be used.
+ On Windows and Mac OS X, this static function will use the native file
+ dialog and not a QFileDialog. On Windows CE, if the device has no native
+ file dialog, a QFileDialog will be used.
- Under Unix/X11, the normal behavior of the file dialog is to resolve
- and follow symlinks. For example, if \c{/usr/tmp} is a symlink to
- \c{/var/tmp}, the file dialog will change to \c{/var/tmp} after
- entering \c{/usr/tmp}. If \a options includes DontResolveSymlinks,
- the file dialog will treat symlinks as regular directories.
+ On Unix/X11, the normal behavior of the file dialog is to resolve and
+ follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
+ the file dialog will change to \c{/var/tmp} after entering \c{/usr/tmp}. If
+ \a options includes DontResolveSymlinks, the file dialog will treat
+ symlinks as regular directories.
- Note that on Windows the dialog will spin a blocking modal event loop
- that will not dispatch any QTimers, and if parent is not 0 then it will
- position the dialog just under the parent's title bar.
+ On Windows the dialog will spin a blocking modal event loop that will not
+ dispatch any QTimers, and if \a parent is not 0 then it will position the
+ dialog just below the parent's title bar.
- \warning Do not delete \a parent during the execution of the dialog.
- If you want to do this, you should create the dialog
- yourself using one of the QFileDialog constructors.
+ \warning Do not delete \a parent during the execution of the dialog. If you
+ want to do this, you should create the dialog yourself using one of the
+ QFileDialog constructors.
- \sa getOpenFileName(), getOpenFileNames(), getSaveFileName()
+ \sa getOpenFileName(), getOpenFileNames(), getSaveFileName()
*/
QString QFileDialog::getExistingDirectory(QWidget *parent,
const QString &caption,
@@ -2143,7 +2142,6 @@ void QFileDialogPrivate::createWidgets()
#ifndef QT_NO_COMPLETER
completer = new QFSCompletor(model, q);
qFileDialogUi->fileNameEdit->setCompleter(completer);
- completer->sourceModel = model;
QObject::connect(qFileDialogUi->fileNameEdit, SIGNAL(textChanged(QString)),
q, SLOT(_q_autoCompleteFileName(QString)));
#endif // QT_NO_COMPLETER
@@ -2793,7 +2791,7 @@ void QFileDialogPrivate::_q_enterDirectory(const QModelIndex &index)
{
Q_Q(QFileDialog);
// My Computer or a directory
- QModelIndex sourceIndex = mapToSource(index);
+ QModelIndex sourceIndex = index.model() == proxyModel ? mapToSource(index) : index;
QString path = sourceIndex.data(QFileSystemModel::FilePathRole).toString();
if (path.isEmpty() || model->isDir(sourceIndex)) {
q->setDirectory(path);
diff --git a/src/gui/dialogs/qfiledialog_p.h b/src/gui/dialogs/qfiledialog_p.h
index dc24390..ab4199e 100644
--- a/src/gui/dialogs/qfiledialog_p.h
+++ b/src/gui/dialogs/qfiledialog_p.h
@@ -97,7 +97,7 @@ class Ui_QFileDialog;
*/
class QFSCompletor : public QCompleter {
public:
- QFSCompletor(QAbstractItemModel *model, QObject *parent = 0) : QCompleter(model, parent), proxyModel(0), sourceModel(0)
+ QFSCompletor(QFileSystemModel *model, QObject *parent = 0) : QCompleter(model, parent), proxyModel(0), sourceModel(model)
{
#ifdef Q_OS_WIN
setCaseSensitivity(Qt::CaseInsensitive);
diff --git a/src/gui/dialogs/qfilesystemmodel.h b/src/gui/dialogs/qfilesystemmodel.h
index 52ecaf9..995268b 100644
--- a/src/gui/dialogs/qfilesystemmodel.h
+++ b/src/gui/dialogs/qfilesystemmodel.h
@@ -158,6 +158,8 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_performDelayedSort())
Q_PRIVATE_SLOT(d_func(), void _q_fileSystemChanged(const QString &path, const QList<QPair<QString, QFileInfo> > &))
Q_PRIVATE_SLOT(d_func(), void _q_resolvedName(const QString &fileName, const QString &resolvedName))
+
+ friend class QFileDialogPrivate;
};
inline bool QFileSystemModel::rmdir(const QModelIndex &aindex) const
diff --git a/src/gui/dialogs/qfilesystemmodel_p.h b/src/gui/dialogs/qfilesystemmodel_p.h
index 77c35a2..0a1265a 100644
--- a/src/gui/dialogs/qfilesystemmodel_p.h
+++ b/src/gui/dialogs/qfilesystemmodel_p.h
@@ -163,7 +163,11 @@ public:
info->icon = iconProvider->icon(QFileInfo(path));
QHash<QString, QFileSystemNode *>::const_iterator iterator;
for(iterator = children.constBegin() ; iterator != children.constEnd() ; ++iterator) {
- iterator.value()->updateIcon(iconProvider, path + QLatin1Char('/') + iterator.value()->fileName);
+ //On windows the root (My computer) has no path so we don't want to add a / for nothing (e.g. /C:/)
+ if (!path.isEmpty())
+ iterator.value()->updateIcon(iconProvider, path + QLatin1Char('/') + iterator.value()->fileName);
+ else
+ iterator.value()->updateIcon(iconProvider, iterator.value()->fileName);
}
}
@@ -172,7 +176,11 @@ public:
info->displayType = iconProvider->type(QFileInfo(path));
QHash<QString, QFileSystemNode *>::const_iterator iterator;
for(iterator = children.constBegin() ; iterator != children.constEnd() ; ++iterator) {
- iterator.value()->retranslateStrings(iconProvider, path + QLatin1Char('/') + iterator.value()->fileName);
+ //On windows the root (My computer) has no path so we don't want to add a / for nothing (e.g. /C:/)
+ if (!path.isEmpty())
+ iterator.value()->retranslateStrings(iconProvider, path + QLatin1Char('/') + iterator.value()->fileName);
+ else
+ iterator.value()->retranslateStrings(iconProvider, iterator.value()->fileName);
}
}
diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm
index d6ddfa3..50917a1 100644
--- a/src/gui/dialogs/qfontdialog_mac.mm
+++ b/src/gui/dialogs/qfontdialog_mac.mm
@@ -87,7 +87,6 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
NSButton *mOkButton;
NSButton *mCancelButton;
QFontDialogPrivate *mPriv;
- NSFont *mCocoaFont;
QFont *mQtFont;
BOOL mPanelHackedWithButtons;
CGFloat mDialogExtraWidth;
@@ -119,6 +118,29 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
- (void)cleanUpAfterMyself;
@end
+static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont)
+{
+ QFont newFont;
+ if (cocoaFont) {
+ int pSize = qRound([cocoaFont pointSize]);
+ QString family(QCFString::toQString(reinterpret_cast<CFStringRef>([cocoaFont familyName])));
+ QString typeface(QCFString::toQString(reinterpret_cast<CFStringRef>([cocoaFont fontName])));
+// qDebug() << "original family" << family << "typeface" << typeface << "psize" << pSize;
+ int hyphenPos = typeface.indexOf(QLatin1Char('-'));
+ if (hyphenPos != -1) {
+ typeface.remove(0, hyphenPos + 1);
+ } else {
+ typeface = QLatin1String("Normal");
+ }
+// qDebug() << " massaged family" << family << "typeface" << typeface << "psize" << pSize;
+ newFont = QFontDatabase().font(family, typeface, pSize);
+ newFont.setUnderline(resolveFont.underline());
+ newFont.setStrikeOut(resolveFont.strikeOut());
+
+ }
+ return newFont;
+}
+
@implementation QCocoaFontPanelDelegate
- (id)initWithFontPanel:(NSFontPanel *)panel
stolenContentView:(NSView *)stolenContentView
@@ -134,7 +156,6 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
mOkButton = okButton;
mCancelButton = cancelButton;
mPriv = priv;
- mCocoaFont = 0;
mPanelHackedWithButtons = (okButton != 0);
mDialogExtraWidth = extraWidth;
mDialogExtraHeight = extraHeight;
@@ -155,42 +176,14 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
- (void)dealloc
{
- if (mCocoaFont)
- [mCocoaFont release];
delete mQtFont;
[super dealloc];
}
- (void)changeFont:(id)sender
{
- Q_UNUSED(sender);
-
- QFont newFont;
-
- if (mCocoaFont)
- [mCocoaFont autorelease];
NSFont *dummyFont = [NSFont userFontOfSize:12.0];
- mCocoaFont = [sender convertFont:dummyFont];
- if (mCocoaFont) {
- [mCocoaFont retain];
-
- int pSize = qRound([mCocoaFont pointSize]);
- QString family(QCFString::toQString(reinterpret_cast<CFStringRef>([mCocoaFont familyName])));
- QString typeface(QCFString::toQString(reinterpret_cast<CFStringRef>([mCocoaFont fontName])));
-// qDebug() << "original family" << family << "typeface" << typeface << "psize" << pSize;
- int hyphenPos = typeface.indexOf(QLatin1Char('-'));
- if (hyphenPos != -1) {
- typeface.remove(0, hyphenPos + 1);
- } else {
- typeface = QLatin1String("Normal");
- }
-// qDebug() << " massaged family" << family << "typeface" << typeface << "psize" << pSize;
- newFont = QFontDatabase().font(family, typeface, pSize);
- newFont.setUnderline(mQtFont->underline());
- newFont.setStrikeOut(mQtFont->strikeOut());
- }
-
- [self setQtFont:newFont];
+ [self setQtFont:qfontForCocoaFont([sender convertFont:dummyFont], *mQtFont)];
if (mPriv)
mPriv->updateSampleFont(*mQtFont);
}
@@ -317,6 +310,9 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
- (void)onOkClicked
{
Q_ASSERT(mPanelHackedWithButtons);
+ NSFontManager *fontManager = [NSFontManager sharedFontManager];
+ [self setQtFont:qfontForCocoaFont([fontManager convertFont:[fontManager selectedFont]],
+ *mQtFont)];
[[mStolenContentView window] close];
[self finishOffWithCode:NSOKButton];
}
@@ -357,8 +353,8 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
- (void)setQtFont:(const QFont &)newFont
{
- delete mQtFont;
- mQtFont = new QFont(newFont);
+ delete mQtFont;
+ mQtFont = new QFont(newFont);
}
- (QFont)qtFont
@@ -374,16 +370,7 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
mModalSession = 0;
}
- // temporary hack to work around bug in deleteLater() in Qt/Mac Cocoa
-#if 1
- bool deleteDialog = mPriv->fontDialog()->testAttribute(Qt::WA_DeleteOnClose);
- mPriv->fontDialog()->setAttribute(Qt::WA_DeleteOnClose, false);
-#endif
mPriv->done((code == NSOKButton) ? QDialog::Accepted : QDialog::Rejected);
-#if 1
- if (deleteDialog)
- delete mPriv->fontDialog();
-#endif
} else {
[NSApp stopModalWithCode:code];
}
@@ -404,6 +391,7 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin
}
[mFontPanel setDelegate:nil];
[[NSFontManager sharedFontManager] setDelegate:nil];
+ [[NSFontManager sharedFontManager] setTarget:nil];
}
@end
@@ -527,6 +515,7 @@ void *QFontDialogPrivate::openCocoaFontPanel(const QFont &initial,
extraHeight:dialogExtraHeight];
[ourPanel setDelegate:delegate];
[[NSFontManager sharedFontManager] setDelegate:delegate];
+ [[NSFontManager sharedFontManager] setTarget:delegate];
setFont(delegate, initial);
// hack to get correct initial layout
diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index 1967837..5e59501 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -280,6 +280,9 @@ void QMessageBoxPrivate::updateSize()
int hardLimit = screenSize.width() - (q->frameGeometry().width() - q->geometry().width());
#else
int hardLimit = qMin(screenSize.width() - 480, 1000); // can never get bigger than this
+ // on small screens allows the messagebox be the same size as the screen
+ if (screenSize.width() <= 1024)
+ hardLimit = screenSize.width();
#endif
#ifdef Q_WS_MAC
int softLimit = qMin(screenSize.width()/2, 420);
@@ -1680,7 +1683,7 @@ void QMessageBox::aboutQt(QWidget *parent, const QString &title)
{
#ifdef Q_WS_MAC
static QPointer<QMessageBox> oldMsgBox;
-
+
if (oldMsgBox) {
oldMsgBox->show();
oldMsgBox->raise();
@@ -1692,29 +1695,35 @@ void QMessageBox::aboutQt(QWidget *parent, const QString &title)
QString translatedTextAboutQt;
translatedTextAboutQt = QMessageBox::tr(
"<h3>About Qt</h3>"
- "%1<p>Qt is a C++ toolkit for cross-platform "
- "application development.</p>"
- "<p>Qt provides single-source "
- "portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, "
- "Linux, and all major commercial Unix variants. Qt is also"
- " available for embedded devices as Qt for Embedded Linux"
- " and Qt for Windows CE.</p>"
- "<p>Qt is a Nokia product. See "
- "<a href=\"http://qtsoftware.com/qt/\">qtsoftware.com/qt/</a> for more information.</p>"
- )
-#if QT_EDITION != QT_EDITION_OPENSOURCE
- .arg(QMessageBox::tr("<p>This program uses Qt version %1.</p>"))
-#else
- .arg(QMessageBox::tr("<p>This program uses Qt Open Source Edition version %1.</p>"
- "<p>Qt Open Source Edition is intended for the development "
- "of Open Source applications. You need a commercial Qt "
- "license for development of proprietary (closed source) "
- "applications.</p>"
- "<p>Please see <a href=\"http://qtsoftware.com/company/model/\">qtsoftware.com/company/model/</a> "
- "for an overview of Qt licensing.</p>"))
-#endif
-
- .arg(QLatin1String(QT_VERSION_STR));
+ "<p>This program uses Qt version %1.</p>"
+ "<p>Qt is a C++ toolkit for cross-platform application "
+ "development.</p>"
+ "<p>Qt provides single-source portability across MS&nbsp;Windows, "
+ "Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. "
+ "Qt is also available for embedded devices as Qt for Embedded Linux "
+ "and Qt for Windows CE.</p>"
+ "<p>Qt is available under three different licensing options designed "
+ "to accommodate the needs of our various users.</p>"
+ "Qt licensed under our commercial license agreement is appropriate "
+ "for development of proprietary/commercial software where you do not "
+ "want to share any source code with third parties or otherwise cannot "
+ "comply with the terms of the GNU LGPL version 2.1 or GNU GPL version "
+ "3.0.</p>"
+ "<p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the "
+ "development of Qt applications (proprietary or open source) provided "
+ "you can comply with the terms and conditions of the GNU LGPL version "
+ "2.1.</p>"
+ "<p>Qt licensed under the GNU General Public License version 3.0 is "
+ "appropriate for the development of Qt applications where you wish to "
+ "use such applications in combination with software subject to the "
+ "terms of the GNU GPL version 3.0 or where you are otherwise willing "
+ "to comply with the terms of the GNU GPL version 3.0.</p>"
+ "<p>Please see <a href=\"http://www.qtsoftware.com/products/licensing\">www.qtsoftware.com/products/licensing</a> "
+ "for an overview of Qt licensing.</p>"
+ "<p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p>"
+ "<p>Qt is a Nokia product. See <a href=\"http://www.qtsoftware.com/qt/\">www.qtsoftware.com/qt</a> "
+ "for more information.</p>"
+ ).arg(QLatin1String(QT_VERSION_STR));
QMessageBox *msgBox = new QMessageBox(parent);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
diff --git a/src/gui/dialogs/qprintdialog_unix.cpp b/src/gui/dialogs/qprintdialog_unix.cpp
index 76c22d0..87a4e65 100644
--- a/src/gui/dialogs/qprintdialog_unix.cpp
+++ b/src/gui/dialogs/qprintdialog_unix.cpp
@@ -727,7 +727,9 @@ void QUnixPrintWidgetPrivate::updateWidget()
widget.printers->removeItem(widget.printers->count()-1); // remove separator
filePrintersAdded = false;
}
- if (printer && filePrintersAdded && printer->printerName().isEmpty()) {
+ if (printer && filePrintersAdded && (printer->outputFormat() != QPrinter::NativeFormat
+ || printer->printerName().isEmpty()))
+ {
if (printer->outputFormat() == QPrinter::PdfFormat)
widget.printers->setCurrentIndex(widget.printers->count() - 2);
else if (printer->outputFormat() == QPrinter::PostScriptFormat)
diff --git a/src/gui/dialogs/qsidebar.cpp b/src/gui/dialogs/qsidebar.cpp
index 1bd2b7d..26108d7 100644
--- a/src/gui/dialogs/qsidebar.cpp
+++ b/src/gui/dialogs/qsidebar.cpp
@@ -55,6 +55,18 @@
QT_BEGIN_NAMESPACE
+void QSideBarDelegate::initStyleOption(QStyleOptionViewItem *option,
+ const QModelIndex &index) const
+{
+ QStyledItemDelegate::initStyleOption(option,index);
+ QVariant value = index.data(QUrlModel::EnabledRole);
+ if (value.isValid()) {
+ //If the bookmark/entry is not enabled then we paint it in gray
+ if (!qvariant_cast<bool>(value))
+ option->state &= ~QStyle::State_Enabled;
+ }
+}
+
/*!
QUrlModel lets you have indexes from a QFileSystemModel to a list. When QFileSystemModel
changes them QUrlModel will automatically update.
@@ -88,9 +100,6 @@ Qt::ItemFlags QUrlModel::flags(const QModelIndex &index) const
if (index.data(Qt::DecorationRole).isNull())
flags &= ~Qt::ItemIsEnabled;
- if (invalidUrls.contains(index.data(UrlRole).toUrl()))
- flags &= ~Qt::ItemIsEnabled;
-
return flags;
}
@@ -193,6 +202,11 @@ void QUrlModel::setUrl(const QModelIndex &index, const QUrl &url, const QModelIn
newName = QFileInfo(url.toLocalFile()).fileName();
if (!invalidUrls.contains(url))
invalidUrls.append(url);
+ //The bookmark is invalid then we set to false the EnabledRole
+ setData(index, false, EnabledRole);
+ } else {
+ //The bookmark is valid then we set to true the EnabledRole
+ setData(index, true, EnabledRole);
}
// Make sure that we have at least 32x32 images
@@ -234,7 +248,11 @@ void QUrlModel::addUrls(const QList<QUrl> &list, int row, bool move)
if (!url.isValid() || url.scheme() != QLatin1String("file"))
continue;
for (int j = 0; move && j < rowCount(); ++j) {
+#if defined(Q_OS_WIN)
+ if (index(j, 0).data(UrlRole).toUrl().toLocalFile().toLower() == url.toLocalFile().toLower()) {
+#else
if (index(j, 0).data(UrlRole) == url) {
+#endif
removeRow(j);
if (j <= row)
row--;
@@ -356,6 +374,7 @@ void QSidebar::init(QFileSystemModel *model, const QList<QUrl> &newUrls)
urlModel = new QUrlModel(this);
urlModel->setFileSystemModel(model);
setModel(urlModel);
+ setItemDelegate(new QSideBarDelegate(this));
connect(selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
this, SLOT(clicked(const QModelIndex &)));
diff --git a/src/gui/dialogs/qsidebar_p.h b/src/gui/dialogs/qsidebar_p.h
index ecbbb37..56fd6d4 100644
--- a/src/gui/dialogs/qsidebar_p.h
+++ b/src/gui/dialogs/qsidebar_p.h
@@ -55,6 +55,7 @@
#include <qlistwidget.h>
#include <qstandarditemmodel.h>
+#include <qstyleditemdelegate.h>
#include <qurl.h>
#ifndef QT_NO_FILEDIALOG
@@ -62,13 +63,23 @@
QT_BEGIN_NAMESPACE
class QFileSystemModel;
+
+class QSideBarDelegate : public QStyledItemDelegate
+{
+ public:
+ QSideBarDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {}
+ void initStyleOption(QStyleOptionViewItem *option,
+ const QModelIndex &index) const;
+};
+
class Q_AUTOTEST_EXPORT QUrlModel : public QStandardItemModel
{
Q_OBJECT
public:
enum Roles {
- UrlRole = Qt::UserRole + 1
+ UrlRole = Qt::UserRole + 1,
+ EnabledRole = Qt::UserRole + 2
};
QUrlModel(QObject *parent = 0);