From: Stefan Csomor Date: Fri, 3 Jul 2009 07:13:53 +0000 (+0000) Subject: better font round-trip fidelity (native->wx->native), fixing fontdialog for osx_cocoa... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/3bb0d96f10db2c8e6d90ef08a81113e2fb2867eb better font round-trip fidelity (native->wx->native), fixing fontdialog for osx_cocoa, closes #10856 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/osx/carbon/fontdlgosx.mm b/src/osx/carbon/fontdlgosx.mm index 0fa7163333..7890a015d6 100644 --- a/src/osx/carbon/fontdlgosx.mm +++ b/src/osx/carbon/fontdlgosx.mm @@ -137,15 +137,15 @@ extern "C" int RunMixedFontDialog(wxFontDialog* dialog) ; -int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog)) +int RunMixedFontDialog(wxFontDialog* dialog) { +#if wxOSX_USE_COCOA + wxFontData& fontdata= ((wxFontDialog*)dialog)->GetFontData() ; +#else + wxUnusedVar(dialog); +#endif int retval = wxID_CANCEL ; - if ( !NSApplicationLoad() ) - { - wxFAIL_MSG("Couldn't load Cocoa in Carbon Environment"); - } - wxAutoNSAutoreleasePool pool; // setting up the ok/cancel buttons @@ -172,11 +172,34 @@ int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog)) } [accessoryView resetFlags]; +#if wxOSX_USE_COCOA + wxFont font = *wxNORMAL_FONT ; + if ( fontdata.m_initialFont.Ok() ) + { + font = fontdata.m_initialFont ; + } - NSModalSession session = [NSApp beginModalSessionForWindow:fontPanel]; + [[NSFontPanel sharedFontPanel] setPanelFont: font.OSXGetNSFont() isMultiple:NO]; - [NSApp runModalSession:session]; + if(fontdata.m_fontColour.Ok()) + [[NSColorPanel sharedColorPanel] setColor: + [NSColor colorWithCalibratedRed:fontdata.m_fontColour.Red() / 255.0 + green:fontdata.m_fontColour.Green() / 255.0 + blue:fontdata.m_fontColour.Blue() / 255.0 + alpha:1.0] + ]; + else + [[NSColorPanel sharedColorPanel] setColor:[NSColor blackColor]]; +#endif + + NSModalSession session = [NSApp beginModalSessionForWindow:fontPanel]; + for (;;) + { + if ([NSApp runModalSession:session] != NSRunContinuesResponse) + break; + } + [NSApp endModalSession:session]; // if we don't reenable it, FPShowHideFontPanel does not work @@ -184,13 +207,41 @@ int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog)) #if wxOSX_USE_CARBON if( FPIsFontPanelVisible()) FPShowHideFontPanel() ; +#else + [fontPanel close]; #endif if ( [accessoryView closedWithOk]) { +#if wxOSX_USE_COCOA + NSFont* theFont = [fontPanel panelConvertFont:[NSFont userFontOfSize:0]]; + + //Get more information about the user's chosen font + NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont]; + int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont]; + int theFontSize = (int) [theFont pointSize]; + + wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT; + //Set the wx font to the appropriate data + if(theTraits & NSFixedPitchFontMask) + fontFamily = wxFONTFAMILY_TELETYPE; + + fontdata.m_chosenFont = wxFont( theFontSize, fontFamily, + theTraits & NSItalicFontMask ? wxFONTSTYLE_ITALIC : 0, + theFontWeight < 5 ? wxLIGHT : theFontWeight >= 9 ? wxBOLD : wxNORMAL, + false, wxStringWithNSString([theFont familyName]) ); + + //Get the shared color panel along with the chosen color and set the chosen color + NSColor* theColor = [[[NSColorPanel sharedColorPanel] color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + + fontdata.m_fontColour.Set((unsigned char) ([theColor redComponent] * 255.0), + (unsigned char) ([theColor greenComponent] * 255.0), + (unsigned char) ([theColor blueComponent] * 255.0)); +#endif retval = wxID_OK ; } - + [fontPanel setAccessoryView:nil]; + [accessoryView release]; return retval ; } @@ -334,18 +385,6 @@ bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_fontData = data; - // - // This is the key call - this initializes - // events and window stuff for cocoa for carbon - // applications. - // - // This is also the only call here that is - // 10.2+ specific (the rest is OSX only), - // which, ironically, the carbon font - // panel requires. - // - bool bOK = NSApplicationLoad(); - //autorelease pool - req'd for carbon NSAutoreleasePool *thePool; thePool = [[NSAutoreleasePool alloc] init]; @@ -396,7 +435,7 @@ bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) //We're done - free up the pool [thePool release]; - return bOK; + return true; } int wxFontDialog::ShowModal() diff --git a/src/osx/carbon/utilscocoa.mm b/src/osx/carbon/utilscocoa.mm index 4fd68fff45..25ec0b1e7e 100644 --- a/src/osx/carbon/utilscocoa.mm +++ b/src/osx/carbon/utilscocoa.mm @@ -166,18 +166,29 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info) void wxNativeFontInfo::OSXValidateNSFontDescriptor() { - NSFontDescriptor* desc = [NSFontDescriptor fontDescriptorWithName:wxCFStringRef(m_faceName).AsNSString() size:m_pointSize]; + NSFontDescriptor* desc = nil; NSFontSymbolicTraits traits = 0; + float weight = 0; if (m_weight == wxFONTWEIGHT_BOLD) + { traits |= NSFontBoldTrait; + weight = 1.0; + } + else if (m_weight == wxFONTWEIGHT_LIGHT) + weight = -1; + if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT) traits |= NSFontItalicTrait; - if ( traits != 0 ) - { - desc = [desc fontDescriptorWithSymbolicTraits:traits]; - } + desc = [NSFontDescriptor fontDescriptorWithFontAttributes: + [[NSDictionary alloc] initWithObjectsAndKeys: + wxCFStringRef(m_faceName).AsNSString(), NSFontFamilyAttribute, + [NSNumber numberWithFloat:m_pointSize], NSFontSizeAttribute, + [NSNumber numberWithUnsignedInt:traits], NSFontSymbolicTrait, + [NSNumber numberWithFloat:weight],NSFontWeightTrait, + nil]]; + wxMacCocoaRetain(desc); m_nsFontDescriptor = desc; }