155 lines
4.6 KiB
Plaintext
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
|
|
*/
|