Lisp HUG Maillist Archive

Re: Multi-line text in graphs (or other pinboard layouts).

this is not as pretty as I'd like, but it works for
capi:item-pinboard-object:

(defun draw-text (pane string center_x start_y)
  (let* ((strg-length (length string))  ; The length of the given string.
      (strg-list
       (if (or (equalp 0 strg-length) (not (find #\newline string)))
           (list string)   ;If string is empty or contains no newlines,
                         ;return a list containing that string.
           (loop for begin-point = 0 then end-point
              while (< begin-point strg-length)
              for cut-point = (position #\newline string
                               :start begin-point
                               :end strg-length) ;Cut just in front of the
#\newline.
              for end-point = (if cut-point
                         cut-point
                         strg-length)
              collect (subseq string begin-point end-point)
              if cut-point do (setf end-point (1+ end-point))))
                         ;Don't include the #\newline itself in the next
string.
        ))
    (draw-string-list pane strg-list center_x start_y)))

(defun draw-string-list (pane strg-list center_x start_y)
  (let ((font (capi:simple-pane-font pane)))
    (loop for strg in strg-list
                         ; (left top right bottom):
       for strgsize = (multiple-value-list (gp::get-string-extent pane strg
font))
       for xpos = (- center_x (* .5 (- (third strgsize) (first strgsize))))
       for ypos = (- start_y (* .5 (- (fourth strgsize) (second
strgsize))))
       then (+ ypos -3 (- (fourth strgsize) (second strgsize)))
       ;The -3 above squishes the lines of text closer together.
       do (gp::draw-string pane strg xpos ypos
                     :foreground (capi:simple-pane-foreground pane)
                     :font font))))

A typical call would be

(defmethod capi::draw-pinboard-object (pane (nod nodetype)
                                            &key &allow-other-keys)
  (capi:with-geometry nod
       (draw-text pane
           text
           (+ capi:%x% (floor capi:%width% 2))
           (+ capi:%y% (floor (1- capi:%height%) 2) (gp:get-font-ascent
pane (capi:simple-pane-font pane))))

you also need methods for capi::draw-pinboard-object-highlighted and
capi::draw-pinboard-object-unhighlighted

HTH,

Ray Laning



                                                                                                         
                    Tim Bradshaw                                                                         
                    <tfb@cley.com>          To:     lisp-hug@xanalys.com                                 
                    Sent by:                cc:                                                          
                    owner-lisp-hug@x        Subject:     Multi-line text in graphs (or other pinboard    
                    analys.com              layouts).                                                    
                                                                                                         
                                                                                                         
                    05/14/02 05:53                                                                       
                    AM                                                                                   
                    Please respond                                                                       
                    to Tim Bradshaw                                                                      
                                                                                                         
                                                                                                         




I'd like to be able to produce trees/graphs where items have more than
one line of text in them.  If I try the obvious
print-function-which-produces-newlines thing, this doesn't work - I
just get black blobs where the newlines should be.  I guess I need to
use some item class which can hack newlines, or otherwise supports
multi-line text.  Does anyone know how to do this?

Thanks

--tim





Updated at: 2020-12-10 09:02 UTC