Changing text style for DandeGUI window output
Printing rich text to windows is one of the planned features of DandeGUI, the GUI library for Medley Interlisp I'm developing in Common Lisp. I finally got around to this and implemented the GUI:WITH-TEXT-STYLE
macro which controls the attributes of text printed to a window, such as the font family and face.
GUI:WITH-TEXT-STYLE
establishes a context in which text printed to the stream associated with a TEdit window is rendered in the style specified by the arguments. The call to GUI:WITH-TEXT-STYLE
here extends the square root table example by printing the heading in a 12-point bold sans serif font:
(gui:with-output-to-window (stream :title "Table of square roots")
(gui:with-text-style (stream :family :sans :size 12 :face :bold)
(format stream "~&Number~40TSquare Root~2%"))
(loop
for n from 1 to 30
do (format stream "~&~4D~40T~8,4F~%" n (sqrt n))))
The code produces this window in which the styled column headings stand out:
The :FAMILY
, :SIZE
, and :FACE
arguments determine the corresponding text attributes. :FAMILY
may be a generic family such as :SERIF
for an unspecified serif font; :SANS
for a sans serif font; :FIX
for a fixed width font; or a keyword denoting a specific family like :TIMESROMAN
.
At the heart of GUI:WITH-TEXT-STYLE
is a pair of calls to the Interlisp function PRINTOUT
that wrap the macro body, the first for setting the font of the stream to the specified style and the other for restoring the default:
(DEFMACRO WITH-TEXT-STYLE ((STREAM &KEY FAMILY SIZE FACE)
&BODY BODY)
(ONCE-ONLY (STREAM)
`(UNWIND-PROTECT
(PROGN (IL:PRINTOUT ,STREAM IL:.FONT (TEXT-STYLE-TO-FD ,FAMILY ,SIZE ,FACE))
,@BODY)
(IL:PRINTOUT ,STREAM IL:.FONT *DEFAULT-FONT*))))
PRINTOUT
is an Interlisp function for formatted output similar to Common Lisp's FORMAT
but with additional font control via the .FONT
directive. The symbols of PRINTOUT
, i.e. its directives and arguments, are in the Interlisp package.
In turn GUI:WITH-TEXT-STYLE
calls GUI::TEXT-STYLE-TO-FD
, an internal DandeGUI function which passes to .FONT
a font descriptor matching the required text attributes. GUI::TEXT-STYLE-TO-FD
calls IL:FONTCOPY
to build a descriptor that merges the specified attributes with any unspecified ones copied from the default font.
The font descriptor is an Interlisp data structure that represents a font on the Medley environment.
#DandeGUI #CommonLisp #Interlisp #Lisp
Discuss... Email | Reply @amoroso@oldbytes.space