Wed Mar 10 18:13:52 CET 2010 Tobias Rautenkranz * Delete QPainDevices before the QApplication is destroyed. Mon Jan 25 20:09:40 CET 2010 Tobias Rautenkranz * Fix with-app cleanup Mon Jan 25 19:50:16 CET 2010 Tobias Rautenkranz * Fix with-painter Mon Jan 25 19:49:07 CET 2010 Tobias Rautenkranz * QList translations Mon Jan 25 19:48:42 CET 2010 Tobias Rautenkranz * QVector translation Mon Jan 25 19:48:17 CET 2010 Tobias Rautenkranz * ownership transfer QGraphicsScene::addItem Sat Jan 23 20:48:00 CET 2010 Tobias Rautenkranz * QVector translations diff -rN -u old-qt.gui/cl-smoke.qt.gui.asd new-qt.gui/cl-smoke.qt.gui.asd --- old-qt.gui/cl-smoke.qt.gui.asd 2014-11-24 13:47:05.000000000 +0100 +++ new-qt.gui/cl-smoke.qt.gui.asd 2014-11-24 13:47:05.000000000 +0100 @@ -13,6 +13,7 @@ (:file "qt.gui" :depends-on ("package")) (:file "ownership" :depends-on ("qt.gui")) (:file "application" :depends-on ("qt.gui")) + (:file "translations" :depends-on ("qt.gui")) (:file "painter" :depends-on ("qt.gui")))))) (defmethod perform ((operation test-op) (c (eql (find-system :cl-smoke.qt.gui)))) diff -rN -u old-qt.gui/src/application.lisp new-qt.gui/src/application.lisp --- old-qt.gui/src/application.lisp 2014-11-24 13:47:05.000000000 +0100 +++ new-qt.gui/src/application.lisp 2014-11-24 13:47:05.000000000 +0100 @@ -2,7 +2,7 @@ (defvar *widgets* nil) -(defmethod delete-app :around ((application qt:application)) +(defmethod cl-smoke.qt.core:delete-app :around ((application qt:application)) (qt:application.close-all-windows) ;; widgets are only valid as long, as an application object ;; exists. QApplication::~QApplication() deletes all widgets in @@ -11,6 +11,13 @@ ;; see: qt4/src/gui/kernel/qapplication.cpp (loop for widget across (qt:application.all-widgets) do (tg:cancel-finalization widget)) + ;; QPaintDevices are only valid when a application object exists. + (loop for object being the hash-values of smoke::*object-map* do + (when (typep object 'qt:paint-device) + (delete-object object))) + ;; Finalize other stuff before deleting the QApplication, + ;; e.g. QGraphicsScene + (tg:gc :full t) (call-next-method) (setf *widgets* nil)) @@ -27,8 +34,8 @@ (assert (null options) (options) "Currently no options can be passed to QT:WITH-APP.") - `(cl-smoke.qt.core::with-application ((cl-smoke.qt.core::ensure-app 'qt:application) - (cl-smoke.qt.core::kill-app)) + `(cl-smoke.qt.core:with-application ((cl-smoke.qt.core:ensure-app 'qt:application) + (cl-smoke.qt.core:kill-app)) ,@body)) (defun qt:exec () diff -rN -u old-qt.gui/src/ownership.lisp new-qt.gui/src/ownership.lisp --- old-qt.gui/src/ownership.lisp 2014-11-24 13:47:05.000000000 +0100 +++ new-qt.gui/src/ownership.lisp 2014-11-24 13:47:05.000000000 +0100 @@ -66,6 +66,9 @@ item) item) +;; FIXME graphic-item has a lot more. +(define-takes-ownership cxx:add-item ((this qt:graphics-scene) item) + item) ;; Allocates return value ;; QLineEdit::createStandardContextMenu() diff -rN -u old-qt.gui/src/painter.lisp new-qt.gui/src/painter.lisp --- old-qt.gui/src/painter.lisp 2014-11-24 13:47:05.000000000 +0100 +++ new-qt.gui/src/painter.lisp 2014-11-24 13:47:05.000000000 +0100 @@ -1,16 +1,22 @@ (in-package :cl-smoke.qt.gui) -(defmacro qt:with-painter ((painter paint-device) &body body) +(defmacro qt:with-painter ((painter &optional paint-device) &body body) "Binds a PAINTER instance for PAINT-DEVICE to PAINTER - during the evaluation of BODY. + 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." - `(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)))) + (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))))) diff -rN -u old-qt.gui/src/translations.lisp new-qt.gui/src/translations.lisp --- old-qt.gui/src/translations.lisp 1970-01-01 01:00:00.000000000 +0100 +++ new-qt.gui/src/translations.lisp 2014-11-24 13:47:05.000000000 +0100 @@ -0,0 +1,14 @@ +(in-package :cl-smoke.qt.gui) + +;; QPoint has a trivial copy ctor and destructor, thus memcpying it +;; should be fine. +(cl-smoke.qt.core:define-qvector-translations "QPoint" qt:point) +(cl-smoke.qt.core:define-qvector-translations "QPointF" qt:point-f) + +(cl-smoke.qt.core:define-qvector-translations "unsigned int" + (smoke:c-integer :unsigned-int)) + +(cl-smoke.qt.core::define-qlist-wrapper "QAction*" qt:action "void") +(cl-smoke.qt.core::define-qlist-wrapper "QGraphicsItem*" qt:graphics-item "void") +(cl-smoke.qt.core::define-qlist-wrapper "QStandardItem*" qt:standard-item "void") +(cl-smoke.qt.core::define-qlist-wrapper "QWidget*" qt:widget "void")