Page 1 of 1
reading available fonts on system
Posted: Sat Sep 08, 2018 7:49 am
by plantenkennis
Hello,
Is it possible to check what fonts are available on a system. I want to put all fonts in an array, so the user can choose which font to use for printing some data.
I am looking for some function like "aFonts := ReadFonts()"
Re: reading available fonts on system
Posted: Sat Sep 08, 2018 8:19 am
by Enrico Maria Giordano
Re: reading available fonts on system
Posted: Sat Sep 08, 2018 10:04 am
by Antonio Linares
René,
I am implementing ChooseFont() using Cocoa's NSFontPanel:
https://stackoverflow.com/questions/141 ... l-in-cocoa
Re: reading available fonts on system
Posted: Sat Sep 08, 2018 10:08 am
by Enrico Maria Giordano
Ops, sorry. Wrong forum.
EMG
Re: reading available fonts on system
Posted: Sat Sep 08, 2018 12:15 pm
by Antonio Linares
First try:
Code: Select all
#include "FiveMac.ch"
function Main()
MsgInfo( ChooseFont() )
return nil
#pragma BEGINDUMP
#include <fivemac.h>
HB_FUNC( CHOOSEFONT )
{
NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];
[ fontPanel makeKeyAndOrderFront: fontPanel ];
// [ NSApp runModalForWindow: fontPanel ];
}
#pragma ENDDUMP
Re: reading available fonts on system
Posted: Sat Sep 08, 2018 12:55 pm
by Antonio Linares
More...
Code: Select all
#include "FiveMac.ch"
function Main()
MsgInfo( ChooseFont() )
return nil
#pragma BEGINDUMP
#include <fivemac.h>
@interface FontPanelController : NSWindowController <NSWindowDelegate>
{
}
-( void ) changeFont: ( id ) sender;
-( void ) windowWillClose: ( id ) sender;
@end
@implementation FontPanelController
-( void ) changeFont: ( id ) sender
{
NSBeep();
}
- ( void ) windowWillClose: ( id ) sender
{
NSBeep();
[ NSApp abortModal ];
// hb_retc( [ [ sender font ].fontName cStringUsingEncoding : NSWindowsCP125$sCP1252StringEncoding ] );
hb_retc( "font name" );
}
@end
HB_FUNC( CHOOSEFONT )
{
NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];
[ fontPanel setDelegate: [ [ FontPanelController alloc ] init ] ];
[ fontPanel makeKeyAndOrderFront: fontPanel ];
[ NSApp runModalForWindow: fontPanel ];
}
#pragma ENDDUMP
https://stackoverflow.com/questions/923 ... rom-nsfont
Re: reading available fonts on system
Posted: Sun Sep 09, 2018 8:07 am
by Antonio Linares
This function ChooseFont() is working fine
I have implemented it as modal. Its easy to implement it as non modal too.
Code: Select all
#include "FiveMac.ch"
function Main()
MsgInfo( ChooseFont() )
return nil
#pragma BEGINDUMP
#include <fivemac.h>
@interface FontPanelController : NSWindowController <NSWindowDelegate>
{
@public NSFont * font;
@public NSFont * newFont;
}
-( void ) changeFont: ( id ) sender;
-( void ) windowWillClose: ( id ) sender;
@end
@implementation FontPanelController
-( void ) changeFont: ( id ) sender
{
newFont = [ sender convertFont: font ];
}
- ( void ) windowWillClose: ( id ) sender
{
[ NSApp abortModal ];
hb_retc( [ [ ( newFont ? newFont: font ) displayName ] cStringUsingEncoding : NSWindowsCP1252StringEncoding ] );
}
@end
HB_FUNC( CHOOSEFONT )
{
NSFontManager * fontManager = [ NSFontManager sharedFontManager ];
NSFontPanel * fontPanel = [ fontManager fontPanel:YES ];
FontPanelController * fontPanelController = [ [ FontPanelController alloc ] init ];
[ fontPanel setDelegate: fontPanelController ];
fontPanelController->font = [ NSFont systemFontOfSize : 10 ];
[ fontPanel makeKeyAndOrderFront: fontPanel ];
[ NSApp runModalForWindow: fontPanel ];
}
#pragma ENDDUMP
Re: reading available fonts on system
Posted: Sun Sep 09, 2018 8:16 am
by Antonio Linares
René,
I have added this new function ChooseFont() to FiveMac:
https://bitbucket.org/fivetech/fivemac/ ... d9d06858f3
So simply download the new FiveMac libs and try this example:
https://bitbucket.org/fivetech/fivemac/ ... /libfive.a
https://bitbucket.org/fivetech/fivemac/ ... libfivec.a
Code: Select all
#include "FiveMac.ch"
function Main()
MsgInfo( ChooseFont() )
return nil
Will users ever notice that we are giving FiveMac for free... ?
Re: reading available fonts on system
Posted: Sun Sep 09, 2018 8:27 am
by Enrico Maria Giordano
So my suggestion was right, after all.
EMG
Re: reading available fonts on system
Posted: Sun Sep 09, 2018 8:33 am
by Antonio Linares
Dear Enrico,
Always
Re: reading available fonts on system
Posted: Tue Sep 11, 2018 7:56 pm
by plantenkennis
Hello Antonio,
Thank you very much for this implementation, it looks very nice and easy to use.
But what I mean is a function that only puts the names of the fonts in an array. Than I can use that array in a COMBOBOX and use the name of the font in a print routine. Simular as in Word where the user can choose the font from a combobox and than the fontsize from another combobox.
Always thankful for all the help you give. If you need some financial support, please let me know.
Re: reading available fonts on system
Posted: Wed Sep 12, 2018 6:55 am
by Antonio Linares
René,
This is function FM_AvailableFonts() that returns an array with all available fonts names:
Code: Select all
HB_FUNC( FM_AVAILABLEFONTS )
{
NSArray * aFonts = [ [ NSFontManager sharedFontManager ] availableFonts ];
int i;
hb_reta( [ aFonts count ] );
for( i = 0; i < [ aFonts count ]; i++ )
hb_storvc( [ ( NSString * ) [ aFonts objectAtIndex: i ] cStringUsingEncoding : NSWindowsCP1252StringEncoding ], -1, i + 1 );
}
This is an example of use:
Code: Select all
#include "FiveMac.ch"
function Main()
local oDlg, cVar
local aFonts := FM_availableFonts()
DEFINE DIALOG oDlg TITLE "Available fonts" SIZE 300, 300
@ 200, 50 COMBOBOX cVar ITEMS aFonts SIZE 200, 20 OF oDlg
ACTIVATE DIALOG oDlg CENTERED
return nil
Changes already commited to the FiveMac repository:
https://bitbucket.org/fivetech/fivemac/ ... 9b0c0b51d1
FiveMac modified C library already available from here:
https://bitbucket.org/fivetech/fivemac/ ... libfivec.a
Re: reading available fonts on system
Posted: Wed Sep 12, 2018 7:04 am
by Antonio Linares
Re: reading available fonts on system
Posted: Fri Sep 21, 2018 6:02 am
by plantenkennis
Hello Antonio,
Sorry for the late response, I had a small vacation (needed it)
Thank you very much, this is just what I was looking for.