Cocoa: align font dialog helper with the color one

The reference color dialog helper change is
eeffcfbd89.

Change-Id: I35b505cce133adeed91df7c95b21f7c74c55cb53
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
bb10
Liang Qi 2013-07-23 09:42:29 +02:00 committed by The Qt Project
parent 3745b0ca12
commit 1613ec336d
2 changed files with 145 additions and 124 deletions

View File

@ -47,9 +47,6 @@
QT_BEGIN_NAMESPACE
class QFontDialog;
class QFontDialogPrivate;
class QCocoaFontDialogHelper : public QPlatformFontDialogHelper
{
public:
@ -63,14 +60,6 @@ public:
void setCurrentFont(const QFont &);
QFont currentFont() const;
protected:
void createNSFontPanelDelegate();
bool showCocoaFontPanel(Qt::WindowModality windowModality, QWindow *parent);
bool hideCocoaFontPanel();
private:
void *mDelegate;
};
QT_END_NAMESPACE

View File

@ -132,12 +132,14 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
@implementation QNSFontPanelDelegate
- (id)initWithDialogHelper:
(QCocoaFontDialogHelper *)helper
- (id)init
{
self = [super init];
mFontPanel = [NSFontPanel sharedFontPanel];
mHelper = helper;
mHelper = 0;
mStolenContentView = 0;
mOkButton = 0;
mCancelButton = 0;
mResultCode = NSCancelButton;
mDialogIsExecuting = false;
mResultSet = false;
@ -147,13 +149,28 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
[mFontPanel setRestorable:NO];
#endif
[mFontPanel retain];
return self;
}
- (void)dealloc
{
[self restoreOriginalContentView];
[mFontPanel setDelegate:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)setDialogHelper:(QCocoaFontDialogHelper *)helper
{
mHelper = helper;
[mFontPanel setTitle:QCFString::toNSString(helper->options()->windowTitle())];
if (mHelper->options()->testOption(QFontDialogOptions::NoButtons)) {
mStolenContentView = 0;
mOkButton = 0;
mCancelButton = 0;
} else {
[self restoreOriginalContentView];
} else if (!mStolenContentView) {
// steal the font panel's contents view
mStolenContentView = [mFontPanel contentView];
[mStolenContentView retain];
@ -178,28 +195,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
[mCancelButton setAction:@selector(onCancelClicked)];
[mCancelButton setTarget:self];
}
[mFontPanel retain];
return self;
}
- (void)dealloc
{
if (mOkButton) {
NSView *ourContentView = [mFontPanel contentView];
// return stolen stuff to its rightful owner
[mStolenContentView removeFromSuperview];
[mFontPanel setContentView:mStolenContentView];
[mOkButton release];
[mCancelButton release];
[ourContentView release];
}
[mFontPanel setDelegate:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)closePanel
@ -210,12 +205,31 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
- (void)windowDidResize:(NSNotification *)notification
{
Q_UNUSED(notification);
if (mOkButton)
[self relayout];
[self relayout];
}
- (void)restoreOriginalContentView
{
if (mStolenContentView) {
NSView *ourContentView = [mFontPanel contentView];
// return stolen stuff to its rightful owner
[mStolenContentView removeFromSuperview];
[mFontPanel setContentView:mStolenContentView];
[mOkButton release];
[mCancelButton release];
[ourContentView release];
mOkButton = 0;
mCancelButton = 0;
mStolenContentView = 0;
}
}
- (void)relayout
{
if (!mOkButton)
return;
[self relayoutToContentSize:[[mStolenContentView superview] frame].size];
}
@ -291,12 +305,14 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
NSFont *panelFont = [fontManager convertFont:selectedFont];
mQtFont = qfontForCocoaFont(panelFont, mQtFont);
emit mHelper->currentFontChanged(mQtFont);
if (mHelper)
emit mHelper->currentFontChanged(mQtFont);
}
- (void)showModelessPanel
{
mDialogIsExecuting = false;
mResultSet = false;
[mFontPanel makeKeyAndOrderFront:mFontPanel];
}
@ -309,6 +325,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
// close down during the cleanup.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
[NSApp runModalForWindow:mFontPanel];
mDialogIsExecuting = false;
return (mResultCode == NSOKButton);
}
@ -326,7 +343,8 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
[self finishOffWithCode:NSCancelButton];
} else {
mResultSet = true;
emit mHelper->reject();
if (mHelper)
emit mHelper->reject();
}
return true;
}
@ -361,27 +379,101 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
QT_BEGIN_NAMESPACE
QCocoaFontDialogHelper::QCocoaFontDialogHelper() :
mDelegate(0)
class QCocoaFontPanel
{
public:
QCocoaFontPanel()
{
mDelegate = [[QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) alloc] init];
}
~QCocoaFontPanel()
{
[mDelegate release];
}
void init(QCocoaFontDialogHelper *helper)
{
[mDelegate setDialogHelper:helper];
}
void cleanup(QCocoaFontDialogHelper *helper)
{
if (mDelegate->mHelper == helper)
mDelegate->mHelper = 0;
}
bool exec()
{
// Note: If NSApp is not 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.
return [mDelegate runApplicationModalPanel];
}
bool show(Qt::WindowModality windowModality, QWindow *parent)
{
Q_UNUSED(parent);
if (windowModality != Qt::WindowModal)
[mDelegate showModelessPanel];
// no need to show a Qt::WindowModal dialog here, because it's necessary to call exec() in that case
return true;
}
void hide()
{
[mDelegate closePanel];
}
QFont currentFont() const
{
return mDelegate->mQtFont;
}
void setCurrentFont(const QFont &font)
{
NSFontManager *mgr = [NSFontManager sharedFontManager];
const NSFont *nsFont = 0;
int weight = 5;
NSFontTraitMask mask = 0;
if (font.style() == QFont::StyleItalic) {
mask |= NSItalicFontMask;
}
if (font.weight() == QFont::Bold) {
weight = 9;
mask |= NSBoldFontMask;
}
QFontInfo fontInfo(font);
nsFont = [mgr fontWithFamily:QCFString::toNSString(fontInfo.family())
traits:mask
weight:weight
size:fontInfo.pointSize()];
[mgr setSelectedFont:const_cast<NSFont *>(nsFont) isMultiple:NO];
mDelegate->mQtFont = font;
}
private:
QT_MANGLE_NAMESPACE(QNSFontPanelDelegate) *mDelegate;
};
Q_GLOBAL_STATIC(QCocoaFontPanel, sharedFontPanel)
QCocoaFontDialogHelper::QCocoaFontDialogHelper()
{
}
QCocoaFontDialogHelper::~QCocoaFontDialogHelper()
{
if (!mDelegate)
return;
[reinterpret_cast<QNSFontPanelDelegate *>(mDelegate) release];
mDelegate = 0;
sharedFontPanel()->cleanup(this);
}
void QCocoaFontDialogHelper::exec()
{
// Note: If NSApp is not 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.
QNSFontPanelDelegate *delegate = static_cast<QNSFontPanelDelegate *>(mDelegate);
if ([delegate runApplicationModalPanel])
if (sharedFontPanel()->exec())
emit accept();
else
emit reject();
@ -389,86 +481,26 @@ void QCocoaFontDialogHelper::exec()
bool QCocoaFontDialogHelper::show(Qt::WindowFlags, Qt::WindowModality windowModality, QWindow *parent)
{
if (windowModality == Qt::WindowModal) {
// Cocoa's shared font panel cannot be shown as a sheet
return false;
}
return showCocoaFontPanel(windowModality, parent);
if (windowModality == Qt::WindowModal)
windowModality = Qt::ApplicationModal;
sharedFontPanel()->init(this);
return sharedFontPanel()->show(windowModality, parent);
}
void QCocoaFontDialogHelper::hide()
{
if (!mDelegate)
return;
[reinterpret_cast<QNSFontPanelDelegate *>(mDelegate)->mFontPanel close];
sharedFontPanel()->hide();
}
void QCocoaFontDialogHelper::setCurrentFont(const QFont &font)
{
NSFontManager *mgr = [NSFontManager sharedFontManager];
const NSFont *nsFont = 0;
int weight = 5;
NSFontTraitMask mask = 0;
if (font.style() == QFont::StyleItalic) {
mask |= NSItalicFontMask;
}
if (font.weight() == QFont::Bold) {
weight = 9;
mask |= NSBoldFontMask;
}
QFontInfo fontInfo(font);
nsFont = [mgr fontWithFamily:QCFString::toNSString(fontInfo.family())
traits:mask
weight:weight
size:fontInfo.pointSize()];
if (!mDelegate)
createNSFontPanelDelegate();
[mgr setSelectedFont:const_cast<NSFont *>(nsFont) isMultiple:NO];
static_cast<QNSFontPanelDelegate *>(mDelegate)->mQtFont = font;
sharedFontPanel()->init(this);
sharedFontPanel()->setCurrentFont(font);
}
QFont QCocoaFontDialogHelper::currentFont() const
{
if (!mDelegate)
return QFont();
return reinterpret_cast<QNSFontPanelDelegate *>(mDelegate)->mQtFont;
}
void QCocoaFontDialogHelper::createNSFontPanelDelegate()
{
if (mDelegate)
return;
QNSFontPanelDelegate *delegate = [[QNSFontPanelDelegate alloc]
initWithDialogHelper:this];
mDelegate = delegate;
}
bool QCocoaFontDialogHelper::showCocoaFontPanel(Qt::WindowModality windowModality, QWindow *parent)
{
Q_UNUSED(parent);
createNSFontPanelDelegate();
QNSFontPanelDelegate *delegate = static_cast<QNSFontPanelDelegate *>(mDelegate);
if (windowModality == Qt::NonModal)
[delegate showModelessPanel];
// no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
return true;
}
bool QCocoaFontDialogHelper::hideCocoaFontPanel()
{
if (!mDelegate){
return false;
} else {
QNSFontPanelDelegate *delegate = static_cast<QNSFontPanelDelegate *>(mDelegate);
[delegate closePanel];
return true;
}
return sharedFontPanel()->currentFont();
}
QT_END_NAMESPACE