From 3387f23ff69a52c02e256317138859f436e6d033 Mon Sep 17 00:00:00 2001 From: "pls.153" Date: Sat, 23 Sep 2023 17:44:26 +0200 Subject: [PATCH] revisions --- doc/.make-doc.lisp | 96 +++++++++++++++++++++++ doc/help.htm | 2 +- examples/meshtastic/hacks/readme.md | 10 ++- examples/meshtastic/qml/img/logo-128.png | Bin 6257 -> 0 bytes examples/meshtastic/qml/main.qml | 2 +- examples/meshtastic/readme.md | 3 + src/cpp/ecl_ext.cpp | 14 ++-- src/cpp/ecl_fun_plugin.h | 4 +- src/cpp/main.h | 2 +- src/cpp/marshal.cpp | 4 +- 10 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 doc/.make-doc.lisp delete mode 100644 examples/meshtastic/qml/img/logo-128.png diff --git a/doc/.make-doc.lisp b/doc/.make-doc.lisp new file mode 100644 index 0000000..0e6bdde --- /dev/null +++ b/doc/.make-doc.lisp @@ -0,0 +1,96 @@ +;;; hack to generate 'help.htm' from both Lisp and Qt/C++ doc strings. +;;; usage: 'lqml .make-doc.lisp' + +(in-package :qml-user) + +(defparameter *help* nil) + +(defun add-cpp-docu () + (with-open-file (s "../src/cpp/ecl_ext.cpp") + (let (curr ex) + (flet ((add-curr () + (when curr + (push (reverse curr) *help*) + (setf curr nil))) + (trim (str) + (string-trim '(#\/) str))) + (x:while-it (read-line s nil nil) + (let ((line (string-trim " " x:it))) + (when (x:starts-with "///" line) + (when (x:starts-with "cl_object " ex) + (add-curr) + (let* ((pos (search "///" ex :start2 3)) ; exception: Lisp name at end of line + (fun (if pos + (trim (subseq ex (+ 3 pos))) + (trim (subseq ex 10))))) + (push (if pos + fun + (substitute #\- #\_ (string-trim "2" (subseq fun 0 (position #\( fun))))) + curr))) + (push (x:cc " " (trim line)) curr)) + (setf ex line))) + (add-curr))))) + +(defun add-lisp-docu () + (do-external-symbols (sym (find-package :qml)) + (let ((name (symbol-name sym))) + (when (and (or (char= #\Q (char name 0)) + (find name '("DEFINE-QT-WRAPPERS" "TR" "FIND-QUICK-ITEM" "RELOAD" "ROOT-ITEM" + "ENSURE-PERMISSION" "VIEW-STATUS-CHANGED" "COPY-ALL-ASSET-FILES" + "WITH-ROOT-ITEM" "HEX") + :test 'string=)) + (not (find name '("QQ") :test 'string=))) + (print name) + (x:when-it (documentation sym 'function) + (print :doc) + (let ((fun (string-downcase (symbol-name sym))) + (docu (x:split x:it #\Newline))) + (unless (string= fun (subseq (second docu) 7)) + (push (cons fun docu) *help*)))))))) + +(defun help () + (setf *help* nil) + (add-cpp-docu) + (add-lisp-docu) + (with-open-file (s "help.htm" :direction :output :if-exists :supersede) + (format s "~%~ + ~%~ + ~%~ + Function List~%~ + ~%~ + ~%~ + ~%~ +

LQML

~%~ +
~%~%")
+    (flet ((el (tag x)
+             (format nil "<~A>~A" tag x tag))
+           (! (x)
+             (format s "~A~%" x))
+           (tab ()
+             (write-string "  " s)))
+      (setf *help* (sort *help* #'string< :key (lambda (x) (string-trim " " (first x)))))
+      (dolist (curr *help*)
+        (! (el "b" (format nil "~A ~A" (string-trim " " (first curr)) (subseq (string-trim " " (second curr)) 6))))
+        (let ((n 2))
+          (when (x:starts-with "alias:" (string-trim " " (third curr)))
+            (incf n)
+            (! (el "b" (subseq (string-trim " " (third curr)) 7))))
+          (! "")
+          (let ((examples (nthcdr n curr))
+                nl)
+            (when examples
+              (dolist (example examples)
+                (if (x:starts-with "   " example)
+                    (progn
+                      (unless nl
+                        (setf nl t)
+                        (! ""))
+                      (! example))
+                    (! example))))))
+        (! "")
+        (! ""))
+      (format s "
~%~%~%")))) + +(progn + (help) + (qq)) diff --git a/doc/help.htm b/doc/help.htm index d6c0e79..eb3be59 100644 --- a/doc/help.htm +++ b/doc/help.htm @@ -146,7 +146,7 @@ qexit () Calls QEventLoop::exit(), in order to exit event processing after a call - QEXEC with a timeout. Returns T if the event loop has effectively been + to QEXEC with a timeout. Returns T if the event loop has effectively been exited. diff --git a/examples/meshtastic/hacks/readme.md b/examples/meshtastic/hacks/readme.md index f4230e1..66ec62c 100644 --- a/examples/meshtastic/hacks/readme.md +++ b/examples/meshtastic/hacks/readme.md @@ -1,5 +1,9 @@ -Before applying this patch, please install latest ECL from development branch -(as of May 2023). +Before applying this patch, ensure you have ECL >= 23.9.9 installed. + +(Assuming you already copied :float-features from Quicklisp under +`~/quicklisp/local-projects/`.) Just copy **float-features** from Quicklisp under -`~/quicklisp/local-projects/` and apply patch (or copy `float-features.lisp`). +`~/quicklisp/local-projects/` and apply patch (or just copy +`float-features.lisp`). + diff --git a/examples/meshtastic/qml/img/logo-128.png b/examples/meshtastic/qml/img/logo-128.png deleted file mode 100644 index 8cd1f56eecbfbd9815ab5bb77e7b265a257e1d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6257 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 zKd0XH^uOfindChildren(objectName); + const QObjectList children = qobject->findChildren(objectName); cl_object l_children = ECL_NIL; - for (QObject* child : qAsConst(children)) { + for (QObject* child : children) { QByteArray className2(child->metaObject()->className()); if (className.isEmpty() || (className == className2)) { l_children = CONS(from_qobject_pointer(child), @@ -240,9 +240,9 @@ cl_object qchildren(cl_object l_item) { QObject* qobject = toQObjectPointer(l_item); QQuickItem* item = qobject_cast(qobject); // type check if (item != nullptr) { - QList children = item->childItems(); + const QList children = item->childItems(); cl_object l_children = ECL_NIL; - for (QQuickItem* child : qAsConst(children)) { + for (QQuickItem* child : children) { l_children = CONS(from_qobject_pointer(child), l_children); } @@ -410,7 +410,7 @@ cl_object qexec2(cl_object l_milliseconds) { cl_object qexit() { /// args: () /// Calls QEventLoop::exit(), in order to exit event processing after a call - /// QEXEC with a timeout. Returns T if the event loop has effectively been + /// to QEXEC with a timeout. Returns T if the event loop has effectively been /// exited. ecl_process_env()->nvalues = 1; if (LQML::eventLoop) { @@ -670,9 +670,9 @@ cl_object qdirectory(cl_object l_dir) { /// paths. /// (qdirectory "assets:/lib") QDir dir(toQString(l_dir)); - QFileInfoList infos(dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)); + const QFileInfoList infos(dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)); cl_object l_files = ECL_NIL; - for (QFileInfo info : qAsConst(infos)) { + for (QFileInfo info : infos) { QString path(info.absoluteFilePath()); if (info.isDir()) { path.append("/"); diff --git a/src/cpp/ecl_fun_plugin.h b/src/cpp/ecl_fun_plugin.h index c51f958..cef4606 100644 --- a/src/cpp/ecl_fun_plugin.h +++ b/src/cpp/ecl_fun_plugin.h @@ -392,8 +392,8 @@ cl_object from_qvariant(const QVariant& var) { case QMetaType::QUrl: l_obj = from_qstring(var.toString()); break; // special case (can be nested) case QMetaType::QVariantList: { - QVariantList list(var.value()); - for (QVariant v : qAsConst(list)) { + const QVariantList list(var.value()); + for (QVariant v : list) { l_obj = CONS(from_qvariant(v), l_obj); } l_obj = cl_nreverse(l_obj); diff --git a/src/cpp/main.h b/src/cpp/main.h index 371c1a8..ceec05e 100644 --- a/src/cpp/main.h +++ b/src/cpp/main.h @@ -103,7 +103,7 @@ public: const int code = s.at(0).unicode(); switch (code) { // replace iOS smart quotation marks with standard ones - // (Frensh, ...) + // (French, ...) case 171: case 187: s[0] = QChar('"'); diff --git a/src/cpp/marshal.cpp b/src/cpp/marshal.cpp index f8b1d6d..6ed22bc 100644 --- a/src/cpp/marshal.cpp +++ b/src/cpp/marshal.cpp @@ -318,8 +318,8 @@ cl_object from_qvariant(const QVariant& var) { case QMetaType::QUrl: l_obj = from_qstring(var.toString()); break; // special case (can be nested) case QMetaType::QVariantList: { - QVariantList list(var.value()); - for (QVariant v : qAsConst(list)) { + const QVariantList list(var.value()); + for (QVariant v : list) { l_obj = CONS(from_qvariant(v), l_obj); } l_obj = cl_nreverse(l_obj);