diff --git a/layout.lisp b/layout.lisp index 305ef94..73ac2bc 100644 --- a/layout.lisp +++ b/layout.lisp @@ -23,13 +23,17 @@ (let ((layout-tree (parent element))) (setf (slot-value element 'layout-tree) layout-tree) (setf (slot-value element 'parent) NIL) - (setf (root (parent element)) element))) + (setf (root layout-tree) element))) (T (setf (slot-value element 'layout-tree) (layout-tree (parent element))) (enter element (parent element))))) +(defmethod print-object ((element layout-element) stream) + (print-unreadable-object (element stream :type T :identity T) + (format stream "~a" (bounds element)))) + (defmethod (setf bounds) ((extent extent) (element layout-element)) - (let ((current (extent element))) + (let ((current (bounds element))) (setf (extent-x current) (extent-x extent)) (setf (extent-y current) (extent-y extent)) (setf (extent-w current) (extent-w extent)) @@ -37,7 +41,8 @@ extent)) (defmethod (setf bounds) :after (extent (element layout-element)) - (notice-bounds element (parent element))) + (when (parent element) + (notice-bounds element (parent element)))) (defmethod x ((element layout-element)) (extent-x (bounds element))) (defmethod y ((element layout-element)) (extent-y (bounds element))) diff --git a/layouts/linear.lisp b/layouts/linear.lisp index 86f8d32..0daa14a 100644 --- a/layouts/linear.lisp +++ b/layouts/linear.lisp @@ -6,7 +6,7 @@ (in-package #:org.shirakumo.alloy) -(defclass linear-layout (layout) +(defclass linear-layout (layout vector-container) ((min-size :initarg :min-size :initform (size) :accessor min-size) (stretch :initarg :stretch :initform T :accessor stretch) (align :initarg :align :initform :start :accessor align))) @@ -22,8 +22,9 @@ (defmethod (setf min-size) :after (value (layout linear-layout)) (update-linear-layout layout 0 (bounds layout))) -(defmethod notice-bounds :after ((element layout-element) (layout linear-layout)) - (let ((updated (update-linear-layout layout (element-index element layout) (bounds layout)))) +(defmethod notice-bounds ((element layout-element) (layout linear-layout)) + ;; FIXME: optimise bounds update. + (let ((updated (update-linear-layout layout 0 (bounds layout)))) (unless (extent= (bounds layout) updated) (setf (bounds layout) updated)))) diff --git a/package.lisp b/package.lisp index f2b0ca2..f6325c3 100644 --- a/package.lisp +++ b/package.lisp @@ -142,6 +142,14 @@ #:component #:layout #:layout-tree) + ;; layouts/fixed.lisp + (:export + #:fixed-layout) + ;; layouts/linear.lisp + (:export + #:linear-layout + #:vertical-linear-layout + #:horizontal-linear-layout) ;; renderer (:export #:allocate