diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-11-10 13:07:01 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-11 10:58:10 +0100 |
commit | af914694d81317b4a7bf0804d9d34a1f3bf2cf48 (patch) | |
tree | 039dc97541bc51cdeddf21b5f8949d5e998b18de /src/plugins/platforms/cocoa | |
parent | 9a8a70d8e42f7e8fee8398affa5680adb2ba24d6 (diff) |
QPlatformDialogHelper: Split class hierarchy, decouple from Dialog
- Introduce hierarchy of QPlatformDialogHelper-derived classes
for font, color and file dialogs.
- Start reducing dependencies on QDialog:
* Remove QDialog-specifics from interface, introduce enumeration
for DialogCode
* Make the helpers Q_OBJECTS to be able to add the signals
passed on to the QDialogs
* Remove QDialogPrivate pointer
- Split setVisible_sys() in show_sys() (factory method for native
dialogs) and hide_sys(). Pass parent window to show_sys(),
removing the necessity to query the QDialog for it
- Introduce a styleHint() similar to QGuiApplication's for
platform-specific
- Fix compile in cocoa/windows, reduce depency on QDialog
(-private) classes.
Change-Id: Ic1cb715e1edf767f2cb18b9780341d189339ef1d
Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoafiledialoghelper.h | 8 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm | 94 |
2 files changed, 48 insertions, 54 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h index 06309ab62b..c38ea90f19 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h @@ -44,10 +44,11 @@ #include <QObject> #include <qplatformdialoghelper_qpa.h> + class QFileDialog; class QFileDialogPrivate; -class QCocoaFileDialogHelper : public QPlatformDialogHelper +class QCocoaFileDialogHelper : public QPlatformFileDialogHelper { public: QCocoaFileDialogHelper(QFileDialog *dialog); @@ -59,8 +60,9 @@ public: bool defaultNameFilterDisables() const; void deleteNativeDialog_sys(); - bool setVisible_sys(bool visible); - QDialog::DialogCode dialogResultCode_sys(); + bool show_sys(QWindow *parent); + void hide_sys(); + QPlatformFileDialogHelper::DialogCode dialogResultCode_sys(); void setDirectory_sys(const QString &directory); QString directory_sys() const; void selectFile_sys(const QString &filename); diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index bdccf5dfa5..820a5dcbd0 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -89,7 +89,7 @@ QT_USE_NAMESPACE NSView *mAccessoryView; NSPopUpButton *mPopUpButton; NSTextField *mTextField; - QFileDialogPrivate *mPriv; + QFileDialog *mFileDialog; QCocoaFileDialogHelper *mHelper; NSString *mCurrentDir; bool mConfirmOverwrite; @@ -133,11 +133,11 @@ QT_USE_NAMESPACE fileMode:(QT_PREPEND_NAMESPACE(QFileDialog::FileMode))fileMode selectFile:(const QString &)selectFile confirmOverwrite:(bool)confirm - priv:(QFileDialogPrivate *)priv + fileDialog:(QFileDialog *)fileDialog helper:(QCocoaFileDialogHelper *)helper { self = [super init]; - + mFileDialog = fileDialog; mAcceptMode = acceptMode; if (mAcceptMode == QT_PREPEND_NAMESPACE(QFileDialog::AcceptOpen)){ mOpenPanel = [NSOpenPanel openPanel]; @@ -154,12 +154,11 @@ QT_USE_NAMESPACE mFileMode = fileMode; mConfirmOverwrite = confirm; mReturnCode = -1; - mPriv = priv; mHelper = helper; mLastFilterCheckPath = new QString; mQDirFilterEntryList = new QStringList; - mNameFilterDropDownList = new QStringList(priv->nameFilters); - QString selectedVisualNameFilter = priv->qFileDialogUi->fileTypeCombo->currentText(); + mNameFilterDropDownList = new QStringList(mFileDialog->nameFilters()); + QString selectedVisualNameFilter = mFileDialog->selectedNameFilter(); mSelectedNameFilter = new QStringList([self findStrippedFilterWithVisualFilterName:selectedVisualNameFilter]); QFileInfo sel(selectFile); @@ -177,11 +176,10 @@ QT_USE_NAMESPACE [self createAccessory]; [mSavePanel setAccessoryView:mNameFilterDropDownList->size() > 1 ? mAccessoryView : nil]; - if (mPriv){ - [mSavePanel setPrompt:[self strip:mPriv->acceptLabel]]; - if (mPriv->fileNameLabelExplicitlySat) - [mSavePanel setNameFieldLabel:[self strip:mPriv->qFileDialogUi->fileNameLabel->text()]]; - } + + [mSavePanel setPrompt:[self strip:mFileDialog->labelText(QFileDialog::Accept)]]; + if (false) // ### fixme mPriv->fileNameLabelExplicitlySat) + [mSavePanel setNameFieldLabel:[self strip:mFileDialog->labelText(QFileDialog::FileName)]]; [self updateProperties]; [mSavePanel retain]; @@ -254,9 +252,9 @@ QT_USE_NAMESPACE return (mReturnCode == NSOKButton); } -- (QT_PREPEND_NAMESPACE(QDialog::DialogCode))dialogResultCode +- (QT_PREPEND_NAMESPACE(QPlatformDialogHelper::DialogCode))dialogResultCode { - return (mReturnCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QDialog::Accepted) : QT_PREPEND_NAMESPACE(QDialog::Rejected); + return (mReturnCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Accepted) : QT_PREPEND_NAMESPACE(QPlatformDialogHelper::Rejected); } - (void)showWindowModalSheet:(QWidget *)docWidget @@ -391,8 +389,9 @@ QT_USE_NAMESPACE [mOpenPanel setResolvesAliases:!(*mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::DontResolveSymlinks))]; QStringList ext = [self acceptableExtensionsForSave]; - if (mPriv && !ext.isEmpty() && !mPriv->defaultSuffix.isEmpty()) - ext.prepend(mPriv->defaultSuffix); + const QString defaultSuffix = mFileDialog->defaultSuffix(); + if (!ext.isEmpty() && !defaultSuffix.isEmpty()) + ext.prepend(defaultSuffix); [mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : QT_PREPEND_NAMESPACE(qt_mac_QStringListToNSMutableArray(ext))]; if ([mSavePanel isVisible]) @@ -474,10 +473,7 @@ QT_USE_NAMESPACE [mTextField setSelectable:false]; [mTextField setBordered:false]; [mTextField setDrawsBackground:false]; - if (mPriv){ - [mTextField setStringValue:[self strip:mPriv->qFileDialogUi->fileTypeLabel->text()]]; - } else - [mTextField setStringValue:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(QT_PREPEND_NAMESPACE(QFileDialog::tr)("Files of type:"))]; + [mTextField setStringValue:[self strip:mFileDialog->labelText(QFileDialog::FileType)]]; } - (void)createPopUpButton:(const QString &)selectedFilter hideDetails:(BOOL)hideDetails @@ -555,15 +551,14 @@ void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_panelClosed(bool accepted) void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_directoryEntered(const QString &newDir) { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); - priv->setLastVisitedDirectory(newDir); - qtFileDialog->metaObject()->invokeMethod(qtFileDialog, "directoryEntered", Q_ARG(QString, newDir)); + // ### fixme: priv->setLastVisitedDirectory(newDir); + emit directoryEntered(newDir); } void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_filterSelected(int menuIndex) { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); - qtFileDialog->metaObject()->invokeMethod(qtFileDialog, "filterSelected", Q_ARG(QString, priv->nameFilters.at(menuIndex))); + const QStringList filters = qtFileDialog->nameFilters(); + emit filterSelected(menuIndex >= 0 && menuIndex < filters.size() ? filters.at(menuIndex) : QString()); } extern OSErr qt_mac_create_fsref(const QString &, FSRef *); // qglobal.cpp @@ -607,22 +602,20 @@ void QCocoaFileDialogHelper::setNameFilters_sys(const QStringList &filters) void QCocoaFileDialogHelper::setFilter_sys() { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate); - *(delegate->mQDirFilter) = priv->model->filter(); - delegate->mFileMode = priv->fileMode; + *(delegate->mQDirFilter) = qtFileDialog->filter(); + delegate->mFileMode = qtFileDialog->fileMode(); [delegate->mSavePanel setTitle:qt_mac_QStringToNSString(qtFileDialog->windowTitle())]; - [delegate->mSavePanel setPrompt:[delegate strip:priv->acceptLabel]]; - if (priv->fileNameLabelExplicitlySat) - [delegate->mSavePanel setNameFieldLabel:[delegate strip:priv->qFileDialogUi->fileNameLabel->text()]]; + [delegate->mSavePanel setPrompt:[delegate strip:qtFileDialog->labelText(QFileDialog::Accept)]]; + if (false) // ### fixme priv->fileNameLabelExplicitlySat) + [delegate->mSavePanel setNameFieldLabel:[delegate strip:qtFileDialog->labelText(QFileDialog::FileName)]]; [delegate updateProperties]; } void QCocoaFileDialogHelper::selectNameFilter_sys(const QString &filter) { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); - int index = priv->nameFilters.indexOf(filter); + const int index = qtFileDialog->nameFilters().indexOf(filter); if (index != -1) { QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate); [delegate->mPopUpButton selectItemAtIndex:index]; @@ -632,24 +625,27 @@ void QCocoaFileDialogHelper::selectNameFilter_sys(const QString &filter) QString QCocoaFileDialogHelper::selectedNameFilter_sys() const { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate); int index = [delegate->mPopUpButton indexOfSelectedItem]; - return index != -1 ? priv->nameFilters.at(index) : QString(); + return index != -1 ? qtFileDialog->nameFilters().at(index) : QString(); } void QCocoaFileDialogHelper::deleteNativeDialog_sys() { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate) release]; mDelegate = 0; - priv->nativeDialogInUse = false; } -bool QCocoaFileDialogHelper::setVisible_sys(bool visible) +void QCocoaFileDialogHelper::hide_sys() +{ + if (!qtFileDialog->isHidden()) + hideCocoaFilePanel(); +} + +bool QCocoaFileDialogHelper::show_sys(QWindow * /* parent */) { // Q_Q(QFileDialog); - if (!visible == qtFileDialog->isHidden()) + if (!qtFileDialog->isHidden()) return false; if (qtFileDialog->windowFlags() & Qt::WindowStaysOnTopHint) { @@ -660,27 +656,26 @@ bool QCocoaFileDialogHelper::setVisible_sys(bool visible) return false; } - return visible ? showCocoaFilePanel() : hideCocoaFilePanel(); + return showCocoaFilePanel(); } void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate() { - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); if (mDelegate) return; bool selectDir = qtFileDialog->selectedFiles().isEmpty(); QString selection(selectDir ? qtFileDialog->directory().absolutePath() : qtFileDialog->selectedFiles().value(0)); QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) alloc] - initWithAcceptMode:priv->acceptMode + initWithAcceptMode:qtFileDialog->acceptMode() title:qtFileDialog->windowTitle() hideNameFilterDetails:qtFileDialog->testOption(QFileDialog::HideNameFilterDetails) - qDirFilter:priv->model->filter() - fileOptions:priv->opts - fileMode:priv->fileMode + qDirFilter:qtFileDialog->filter() + fileOptions:qtFileDialog->options() + fileMode:qtFileDialog->fileMode() selectFile:selection confirmOverwrite:!qtFileDialog->testOption(QFileDialog::DontConfirmOverwrite) - priv:priv + fileDialog:qtFileDialog helper:this]; mDelegate = delegate; @@ -722,10 +717,7 @@ void QCocoaFileDialogHelper::platformNativeDialogModalHelp() // running (which is the case if e.g a top-most QEventLoop has been // interrupted, and the second-most event loop has not yet been reactivated (regardless // if [NSApp run] is still on the stack)), showing a native modal dialog will fail. - QFileDialogPrivate *priv = static_cast<QFileDialogPrivate*>(d_ptr); - if (priv->nativeDialogInUse){ - QTimer::singleShot(1, qtFileDialog, SLOT(_q_platformRunNativeAppModalPanel())); - } + QTimer::singleShot(1, qtFileDialog, SLOT(_q_platformRunNativeAppModalPanel())); } void QCocoaFileDialogHelper::_q_platformRunNativeAppModalPanel() @@ -736,13 +728,13 @@ void QCocoaFileDialogHelper::_q_platformRunNativeAppModalPanel() #endif QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate); [delegate runApplicationModalPanel]; - if (dialogResultCode_sys() == QDialog::Accepted) + if (dialogResultCode_sys() == QPlatformDialogHelper::Accepted) qtFileDialog->metaObject()->invokeMethod(qtFileDialog, "accept"); else qtFileDialog->metaObject()->invokeMethod(qtFileDialog, "reject"); } -QDialog::DialogCode QCocoaFileDialogHelper::dialogResultCode_sys() +QPlatformDialogHelper::DialogCode QCocoaFileDialogHelper::dialogResultCode_sys() { QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate); return [delegate dialogResultCode]; |