eumandy/eugtk/GtkFontSelector.e
2016-11-25 00:27:22 -07:00

155 lines
4.6 KiB
Plaintext

----------------------
namespace fontselector -- Generic font selector dialog
----------------------
--# EXPORTS
/*
-- functions -- callbacks
fontselector:Select() fontselector:select
fontselector:FilterFonts() fontselector:filter
-- fontlist
*/
include GtkEngine.e
include GtkCairo.e
include std/wildcard.e
include std/hash.e
export constant version = "4.12.0"
if not equal(version,gtk:version) then
Error(,,"GtkFontSelector version mismatch","should be version " & gtk:version)
end if
-- Optional parameter is preferred (default) font, the one to be
-- returned if the font dialog ok button is clicked without choosing
-- a different font. You can just specify a size here: "8" and that
-- will set only the dialog's size selector.
--
-- You can specify a full font name and size: e.g. Purisa bold 16,
-- and that font will be the one highlighted for selection.
-- If you specify a font that doesn't exist: e.g. Bogus italic 18,
-- and then use the returned font, GTK will do the best it can,
-- which will be to set the existing font to italic in 18pt.
-- Fairly fail-safe, in other words.
--
-- Setting this does not filter the list of fonts shown by the dialog.
-- to do this, you need to set the pattern. See below.
--
-- To exclude unwanted (and unreadable) fonts, such as symbols and
-- dingbats, add them to the exclude sequence. See below.
--
-- pattern can be set prior to the select() call
-- pattern can be an array of font names, wildcards are ok
-- e.g. {"Courier*","purisa"}
-- if you use, for example, just {"Courier"}, without the wildcard,
-- no fonts will be found.
--
-- {"sans"}, {"*sans"}, or {"*sans*"} will each return a different
-- set of matching font names! trial and error may be required.
--
-- if pattern is left unset, ALL fonts will be shown!
export atom dlg = create(GtkFontChooserDialog,"name=FontSelector")
export object
name = 0, -- font name
title = "Choose a font", -- dialog title
preview_text = "This is an EuGTK font selector",
description = 0, -- a PangoFontDescription
family = 0, -- font family
style = 0, -- normal, oblique, italic
variant = 0,
weight = PANGO_WEIGHT_NORMAL,
mono_filter = 0,
font_list = {}
export atom size = 12*1024
export integer points = 12
export sequence pattern = {"*"}
export sequence exclude = {"*symbol*","*dingbat*","*webdings","*wingdings*"}
-- above list filters out unusable fonts;
------------------------------------------------------------------------
export function Select(object curr_fnt=0)
------------------------------------------------------------------------
set(dlg,"title","Select a font")
set(dlg,"preview text",preview_text)
if string(curr_fnt) then
set(dlg,"font",curr_fnt)
end if
pattern = lower(pattern)
exclude = lower(exclude)
set(dlg,"filter func",filter)
if get(dlg,"run") then
name = get(dlg,"font")
description = create(PangoFontDescription,name)
family = get(description,"family")
size = get(description,"size")
points = math:round(size/PANGO_UNIT)
variant = get(description,"variant")
style = get(description,"style")
weight = get(description,"weight")
end if
hide(dlg) -- we keep it around, since it's likely to be used again :p
return name
end function
export constant select = call_back(routine_id("Select"))
------------------------------------------------------------------------
export function FilterFonts(object family, object face, object data)
------------------------------------------------------------------------
integer result = 0
if mono_filter then
if gtk_func("pango_font_family_is_monospace",{P},{family}) = FALSE then
return 0
end if
end if
object name = lower(gtk_str_func("pango_font_family_get_name",{P},{family}))
for i = 1 to length(pattern) do
result = is_match(pattern[i],name) > 0
if result = 1 then
for x = 1 to length(exclude) do
if is_match(exclude[x],name) then
return 0
end if
end for
end if
return result
end for
return result
end function
export constant filter = call_back(routine_id("FilterFonts"))
sequence weight_names =
{"thin","ultralight","light","book","normal","medium",
"semibold","bold","ultrabold","heavy","ultraheavy"}
/* -- reference;
PANGO_WEIGHT_THIN = 100,
PANGO_WEIGHT_ULTRALIGHT = 200,
PANGO_WEIGHT_LIGHT = 300,
PANGO_WEIGHT_BOOK = 380,
PANGO_WEIGHT_NORMAL = 400,
PANGO_WEIGHT_MEDIUM = 500,
PANGO_WEIGHT_SEMIBOLD = 600,
PANGO_WEIGHT_BOLD = 700,
PANGO_WEIGHT_ULTRABOLD = 800,
PANGO_WEIGHT_HEAVY = 900,
PANGO_WEIGHT_ULTRAHEAVY = 1000,
PANGO_UNIT = 1024
PANGO_STYLE_NORMAL = 0,
PANGO_STYLE_OBLIQUE = 1,
PANGO_STYLE_ITALIC = 2
*/