(in-package :cl-smoke.qt.gui) (defmacro qt:with-painter ((painter &optional paint-device) &body body) "Binds a PAINTER instance for PAINT-DEVICE to PAINTER during the evaluation of BODY. Or when PAINT-DEVICE is not specified, saves and restored the state of PAINTER around BODY. Makes sure the painter ends after BODY; thus preventing problems with still active and not yet garbage collected painters in CXX:PAINT-EVENT." (if paint-device `(let ((,painter (make-instance 'qt:painter :arg0 ,paint-device))) (assert (cxx:is-active ,painter) (,painter) "Painter ~A for ~A is not active" ,painter ,paint-device) (unwind-protect (progn ,@body) (cxx:end ,painter))) `(progn (cxx:save ,painter) (unwind-protect (progn ,@body) (cxx:restore ,painter)))))