From e28e2a4af3ffb2d4dbc88e7b537fd7bcdf1a62fd Mon Sep 17 00:00:00 2001 From: polos Date: Sun, 19 Mar 2017 20:36:14 +0100 Subject: [PATCH] fix QSELECT/QSEL to work with QQmlApplicationEngine created windows --- .../quick/table-view/properties.lisp | 14 +++++++ .../quick/table-view/table-view.lisp | 5 ++- src/lisp/qselect.lisp | 39 +++++++++++-------- 3 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 examples/M-modules/quick/table-view/properties.lisp diff --git a/examples/M-modules/quick/table-view/properties.lisp b/examples/M-modules/quick/table-view/properties.lisp new file mode 100644 index 0000000..5816280 --- /dev/null +++ b/examples/M-modules/quick/table-view/properties.lisp @@ -0,0 +1,14 @@ +;;; properties dialog + +(defun %sym (name package) + (find-symbol (symbol-name name) package)) + +(defun show-properties-dialog (&optional item) + "Lists all instance properties of a QML item (either a QQuickItem or an 'objectName'). If no item is passed, QML:*CALLER* will be used." + (unless (find-package :properties) + (load (in-home "gui/properties"))) + (funcall (%sym :show :properties) + (or (if (stringp item) + (qml:find-quick-item item) + item) + qml:*caller*))) diff --git a/examples/M-modules/quick/table-view/table-view.lisp b/examples/M-modules/quick/table-view/table-view.lisp index 226a177..0c075de 100644 --- a/examples/M-modules/quick/table-view/table-view.lisp +++ b/examples/M-modules/quick/table-view/table-view.lisp @@ -6,7 +6,8 @@ (qrequire :quick) -(require :qml-lisp "qml-lisp") +(require :qml-lisp "qml-lisp") +(require :properties "properties") (defpackage :table-view (:nicknames :table) @@ -56,7 +57,7 @@ (|setFilterCaseSensitivity| *sort-filter-model* |Qt.CaseInsensitive|) (|setSourceModel| *sort-filter-model* *book-model*) ;; view - (setf qml:*quick-view* (qnew "QQmlApplicationEngine")) + (setf qml:*quick-view* (qnew "QQmlApplicationEngine")) ; because of QML ApplicationWindow (|setContextProperty| (|rootContext| qml:*quick-view*) "sortFilterModel" *sort-filter-model*) (|load| qml:*quick-view* "qml/table-view.qml")) diff --git a/src/lisp/qselect.lisp b/src/lisp/qselect.lisp index a2e36c2..7c4296e 100644 --- a/src/lisp/qselect.lisp +++ b/src/lisp/qselect.lisp @@ -31,22 +31,25 @@ (let ((cross-cursor (qnew "QCursor(Qt::CursorShape)" |Qt.CrossCursor|))) (defun object-selected (object event) - (unless (zerop (qt-object-id object)) ; exclude unknown to EQL - (when *listen* - (setf *listen* nil - *q* object - *qml-stack* nil - *pos* (! "pos" event)) - (setf (qt-object-unique object) - (! ("toUInt" ("property" "EQL.unique") *q*))) - (if (find (! "className" (! "metaObject" *q*)) - '("LQuickView" "LQuickWidget") :test 'string=) - (indicate*) ; QML items - (indicate)) ; QWidgets - (! "restoreOverrideCursor" "QGuiApplication") - (when *on-selected* - (funcall *on-selected* object)) - t))) ; event filter + (when (zerop (qt-object-id object)) ; unknown to EQL, so resort to QObject + (setf (qt-object-id object) #.(qid "QObject"))) + (let ((qml (or (! "inherits" object "QQuickWidget") + (! "inherits" object "QQuickWindow")))) + (when (or qml (! "isWidgetType" object)) + (when *listen* + (setf *listen* nil + *q* (qt-object-? object) + *qml-stack* nil + *pos* (! "pos" event)) + (setf (qt-object-unique object) + (! ("toUInt" ("property" "EQL.unique") *q*))) + (if qml + (indicate*) + (indicate)) + (! "restoreOverrideCursor" "QGuiApplication") + (when *on-selected* + (funcall *on-selected* object)) + t)))) ; event filter (defun select-mode () (setf *listen* t) (! "setOverrideCursor" "QGuiApplication" cross-cursor))) @@ -129,7 +132,9 @@ (child child*))))) (defun indicate* () - (let ((root (! "rootObject" *q*))) + (let ((root (if (= (qt-object-id *q*) #.(qid "QQuickWindow")) + (! "contentItem"*q*) + (! "rootObject" *q*)))) (indicate-start* *q* (child root)))) (defun indicate-start* (parent child)