January 30, 2008
Automatic table layout
GTK+ has a table layout container that lets you render widgets in a grid. The widgets get assigned to the table cells automatically. I haven’t looked at their rendering algorithm, but this does something similar in a Weblocks widget:
(in-package :weblocks) (export '(table-composite render-widget-body)) (defwidget table-composite (composite) ((cols :type integer :accessor cols :initarg :cols :initform 0)) (:documentation "Renders a set of widgets in table layout.")) (defmethod render-widget-body ((widget table-composite) &rest args) (let* ((widgets (composite-widgets widget)) (num-widgets (list-length widgets)) (cols (cols widget)) (rows (ceiling (/ num-widgets cols)))) (with-html (:table :rows rows :cols cols (loop for r from 0 below rows do (htm (:tr (loop for c from 0 below cols do (let ((child (nth (+ c (* r cols)) widgets))) (htm (:td (when child (render-widget child))))))))))))) ;;; EXAMPLE CODE: (make-instance 'table-composite :cols 3 :widgets (loop for i from 1 to 10 collect (write-to-string i)))
Yeah, I know a DOLIST would do the same as the LOOP here, but I really like LOOP.
This should be easily adaptable for generic HTML rendering.