---------------------- 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 */