diff --git a/examples/app-template/make.lisp b/examples/app-template/make.lisp index 7e29c98..10852f6 100644 --- a/examples/app-template/make.lisp +++ b/examples/app-template/make.lisp @@ -17,7 +17,7 @@ (let ((name (namestring *load-truename*))) (subseq name (length (namestring *default-pathname-defaults*)) - (position #\/ name :from-end t)))) + (1+ (position #\/ name :from-end t))))) ;; load all LQML symbols (dolist (file (list "package" "x" "ecl-ext" "ini" "qml")) @@ -31,11 +31,11 @@ (asdf:make-build "app" :monolithic t :type :static-library - :move-here (cc *current* "/build/tmp/") + :move-here (cc *current* "build/tmp/") :init-name "ini_app") - (let* ((from (cc *current* "/build/tmp/app--all-systems.a")) + (let* ((from (cc *current* "build/tmp/app--all-systems.a")) (to "libapp.a") - (to* (cc *current* "/build/tmp/" to))) + (to* (cc *current* "build/tmp/" to))) (when (probe-file to*) (delete-file to*)) (rename-file from to))) @@ -43,9 +43,9 @@ #+(or android ios) (progn (defvar *asdf-system* "app") - (defvar *ql-libs* (cc *current* "/ql-libs.lisp")) + (defvar *ql-libs* (cc *current* "ql-libs.lisp")) (defvar *init-name* "ini_app") - (defvar *library-name* (format nil "~A/build-~A/tmp/app" + (defvar *library-name* (format nil "~Abuild-~A/tmp/app" *current* #+android "android" #+ios "ios")) diff --git a/examples/swank-server/lisp/main.lisp b/examples/swank-server/lisp/main.lisp index ec9ecdb..a38aae8 100644 --- a/examples/swank-server/lisp/main.lisp +++ b/examples/swank-server/lisp/main.lisp @@ -1,4 +1,5 @@ (in-package :app) #+(or android ios) -(qsingle-shot 1000 'auto-reload-qml) +(when qml::*remote-ip* + (qsingle-shot 1000 'auto-reload-qml)) diff --git a/examples/swank-server/lisp/qml-reload/auto-reload-mobile.lisp b/examples/swank-server/lisp/qml-reload/auto-reload-mobile.lisp index 0211a71..9b3e3de 100644 --- a/examples/swank-server/lisp/qml-reload/auto-reload-mobile.lisp +++ b/examples/swank-server/lisp/qml-reload/auto-reload-mobile.lisp @@ -3,12 +3,17 @@ (in-package :qml) #+(or android ios) -(defvar *remote-ip* #-interpreter - (format nil "http://~A:8080/" - #.(progn - (terpri *query-io*) - (princ "Please enter WiFi IP of desktop computer: " *query-io*) - (read-line *query-io*)))) +(defun remote-ip () + (terpri *query-io*) + (princ "Please enter WiFi IP of desktop computer (hit RET to skip): " + *query-io*) + (let ((ip (read-line *query-io*))) + (unless (x:empty-string ip) + (format nil "http://~A:8080/" ip)))) + +#+(or android ios) +(defvar *remote-ip* #+interpreter nil + #-interpreter #.(remote-ip)) #+(or android ios) (defun qml:view-status-changed (status) @@ -35,7 +40,9 @@ (if ini (progn (setf ini nil) - (qset *quick-view* |source| (x:cc *remote-ip* "qml/main.qml"))) + (qset *engine* |baseUrl| *remote-ip*) + (let ((src (qget *quick-view* |source|))) + (qset *quick-view* |source| (subseq src #.(length "qrc:///"))))) (qml:reload))) (setf secs curr))) (qsingle-shot 250 'auto-reload-qml))) diff --git a/examples/swank-server/make.lisp b/examples/swank-server/make.lisp index 74aa06f..624a8fc 100644 --- a/examples/swank-server/make.lisp +++ b/examples/swank-server/make.lisp @@ -60,7 +60,7 @@ (let ((name (namestring *load-truename*))) (subseq name (length (namestring *default-pathname-defaults*)) - (position #\/ name :from-end t)))) + (1+ (position #\/ name :from-end t))))) ;; load all LQML symbols (dolist (file (list "package" "x" "ecl-ext" "ini" "qml")) @@ -71,11 +71,11 @@ (asdf:make-build "app" :monolithic t :type :static-library - :move-here (cc *current* "/build/tmp/") + :move-here (cc *current* "build/tmp/") :init-name "ini_app") - (let* ((from (cc *current* "/build/tmp/app--all-systems.a")) + (let* ((from (cc *current* "build/tmp/app--all-systems.a")) (to "libapp.a") - (to* (cc *current* "/build/tmp/" to))) + (to* (cc *current* "build/tmp/" to))) (when (probe-file to*) (delete-file to*)) (rename-file from to))) @@ -84,9 +84,9 @@ (progn (pushnew :interpreter *features*) (defvar *asdf-system* "app") - (defvar *ql-libs* (cc *current* "/ql-libs.lisp")) + (defvar *ql-libs* (cc *current* "ql-libs.lisp")) (defvar *init-name* "ini_app") - (defvar *library-name* (format nil "~A/build-~A/tmp/app" + (defvar *library-name* (format nil "~Abuild-~A/tmp/app" *current* #+android "android" #+ios "ios")) @@ -99,6 +99,6 @@ (progn (require :ecl-curl) (ext:install-bytecodes-compiler) - (compile-file (cc *current* "/lisp/curl.lisp") - :output-file (cc *current* "/lisp/" *assets* "curl.fasc"))) + (compile-file (cc *current* "lisp/curl.lisp") + :output-file (cc *current* "lisp/" *assets* "curl.fasc"))) diff --git a/src/cpp/lqml.cpp b/src/cpp/lqml.cpp index 3e6a7ed..1417bf8 100644 --- a/src/cpp/lqml.cpp +++ b/src/cpp/lqml.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include const char LQML::version[] = "22.3.3"; // Mar 2022 @@ -49,6 +50,8 @@ LQML::LQML(int argc, char* argv[], QQuickView* view) : QObject() { eval("(in-package :qml-user)"); eval(QString("(setf qml:*quick-view* (qml:qt-object %1))") .arg(reinterpret_cast(view))); + eval(QString("(setf qml:*engine* (qml:qt-object %1))") + .arg(reinterpret_cast(view->engine()))); } LQML::~LQML() { diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 997a88f..46b2673 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -79,6 +79,27 @@ int main(int argc, char* argv[]) { lqml.ignoreIOStreams(); #endif + // load .eclrc + if (arguments.contains("-norc")) { + arguments.removeAll("-norc"); + } else { +#if (defined Q_OS_ANDROID) || (defined Q_OS_IOS) + // mobile: don't hang on startup + LQML::eval("(x:when-it (probe-file \"~/.eclrc\")" + " (ignore-errors (load x:it)))"); +#else + LQML::eval("(x:when-it (probe-file \"~/.eclrc\")" + " (load x:it))"); +#endif + } + + // load Lisp file + QStringList files = arguments.filter(".lisp"); + if (!files.isEmpty()) { + QString file = QDir::fromNativeSeparators(files.first()); + LQML::eval(QString("(load \"%1\")").arg(file), true); + } + new QQmlFileSelector(view.engine(), &view); QString qml("qml/main.qml"); QUrl url; @@ -97,20 +118,6 @@ int main(int argc, char* argv[]) { #endif } - // load .eclrc - if (arguments.contains("-norc")) { - arguments.removeAll("-norc"); - } else { -#if (defined Q_OS_ANDROID) || (defined Q_OS_IOS) - // mobile: don't hang on startup - LQML::eval("(x:when-it (probe-file \"~/.eclrc\")" - " (ignore-errors (load x:it)))"); -#else - LQML::eval("(x:when-it (probe-file \"~/.eclrc\")" - " (load x:it))"); -#endif - } - #ifdef INI_ECL_CONTRIB // for iOS; ASDF is loaded on demand (slow) ecl_init_module(NULL, init_lib_DEFLATE); @@ -137,13 +144,6 @@ int main(int argc, char* argv[]) { qtRestart = true; } - // load Lisp file - QStringList files = arguments.filter(".lisp"); - if (!files.isEmpty()) { - QString file = QDir::fromNativeSeparators(files.first()); - LQML::eval(QString("(load \"%1\")").arg(file), true); - } - if (qtRestart) { LQML::eval("(qml::exec-with-qt-restart)", true); return 0; diff --git a/src/cpp/main.h b/src/cpp/main.h index ae6ead6..fa2da63 100644 --- a/src/cpp/main.h +++ b/src/cpp/main.h @@ -7,5 +7,7 @@ class Engine : public QQmlEngine { public: Engine(QObject* parent = nullptr) : QQmlEngine(parent) {} + Q_PROPERTY (QUrl baseUrl READ baseUrl WRITE setBaseUrl) + Q_INVOKABLE void clearCache() { clearComponentCache(); } }; diff --git a/src/lisp/package.lisp b/src/lisp/package.lisp index ef5cb47..9823735 100644 --- a/src/lisp/package.lisp +++ b/src/lisp/package.lisp @@ -3,6 +3,7 @@ (:export #:*break-on-errors* #:*quick-view* + #:*engine* #:*root-item* #:*caller* #:define-qt-wrappers diff --git a/src/lisp/qml.lisp b/src/lisp/qml.lisp index 29ee21c..b344a4d 100644 --- a/src/lisp/qml.lisp +++ b/src/lisp/qml.lisp @@ -1,6 +1,7 @@ (in-package :qml) -(defvar *quick-view* nil) ; is set in 'lqml.cpp' on startup +(defvar *quick-view* nil) ; QQuickView - is set in 'lqml.cpp' on startup +(defvar *engine* nil) ; QQmlEngine - (see above) (defvar *caller* nil) (defvar *root-item* nil) ; see note in 'find-quick-item'