From 4f755519717d11166d66a76dfe189f3d12ff4e45 Mon Sep 17 00:00:00 2001 From: polos Date: Tue, 11 May 2021 09:48:00 +0200 Subject: [PATCH] add third argument to 'EQL::addObject' to call 'define-qt-wrappers' --- Qt_EQL/tutorial/main.cpp | 16 ++++++++++------ Qt_EQL/tutorial/test.lisp | 11 +++-------- src/eql.cpp | 28 +++++++++++++++++++++------- src/eql5/eql.h | 2 +- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/Qt_EQL/tutorial/main.cpp b/Qt_EQL/tutorial/main.cpp index 957ef07..4e80177 100644 --- a/Qt_EQL/tutorial/main.cpp +++ b/Qt_EQL/tutorial/main.cpp @@ -12,13 +12,17 @@ int main(int argc, char* argv[]) { main->show(); EQL eql; - - // add desired Qt class instances as Lisp variables (uses 'defvar'): - - EQL::addObject(main, "eql-user:*main-widget*"); - EQL::addObject(new Test(main), "eql-user:*test*"); - EQL::eval("(in-package :eql-user)"); + + // add desired Qt class instances as Lisp variables (uses 'defvar'); + // you may provide a package name (which needs to exists), otherwise + // the current package will be used (see above 'in-package'); + // pass 'true' as last argument to also call 'define-qt-wrappers' + + EQL::addObject(main, "eql-user:*main-widget*"); + + EQL::addObject(new Test(main), "*test*", true); // 'define-qt-wrappers' + EQL::eval("(load \"test.lisp\")"); // will start a REPL app.processEvents(); // needed for 'qlater' in 'test.lisp' diff --git a/Qt_EQL/tutorial/test.lisp b/Qt_EQL/tutorial/test.lisp index ac53ec5..8ea6ac4 100644 --- a/Qt_EQL/tutorial/test.lisp +++ b/Qt_EQL/tutorial/test.lisp @@ -1,11 +1,6 @@ -(in-package :eql-user) - -;; the following defines generic functions for all Qt signals, -;; Qt slots and functions declared Q_INVOKABLE - -(define-qt-wrappers *test*) - -;; now we can call those functions +;;; below function calls only work because 'define-qt-wrappers' has already +;;; been called implicitely on '*test*', see 'EQL::addObject()' in 'main.cpp' +;;; (note third argument 'true') (defun test () ;; make new instance diff --git a/src/eql.cpp b/src/eql.cpp index d4fc5cf..2a42a76 100644 --- a/src/eql.cpp +++ b/src/eql.cpp @@ -215,15 +215,29 @@ void EQL::exec(QWidget* widget, const QString& lispFile, const QString& slimeHoo if(exec_with_simple_restart) { eval("(eql::exec-with-simple-restart)"); }} -void EQL::addObject(QObject* object, const QByteArray& varName) { +void EQL::addObject(QObject* object, const QByteArray& varName, bool defineWrappers) { + cl_object l_symbol = ECL_NIL; int p = varName.indexOf(':'); - QByteArray pkg = (p == -1) ? "eql-user" : varName.left(p); - QByteArray var = varName.mid(varName.lastIndexOf(':') + 1); - cl_object l_symbol = cl_intern(2, - STRING_COPY(var.toUpper().constData()), - cl_find_package(STRING_COPY(pkg.toUpper().constData()))); + if(p == -1) { + // use current package + l_symbol = cl_intern(1, + STRING_COPY(varName.toUpper().constData())); } + else { + // use provided package + QByteArray pkg = varName.left(p); + QByteArray var = varName.mid(varName.lastIndexOf(':') + 1); + l_symbol = cl_intern(2, + STRING_COPY(var.toUpper().constData()), + cl_find_package(STRING_COPY(pkg.toUpper().constData()))); } cl_object l_object = qt_object_from_name(LObjects::vanillaQtSuperClassName(object->metaObject()), object); - ecl_defvar(l_symbol, l_object); } + // 'defvar' + ecl_defvar(l_symbol, l_object); + if(defineWrappers) { + // 'define-qt-wrappers' + STATIC_SYMBOL_PKG (s_define_qt_wrappers, "DEFINE-QT-WRAPPERS", "EQL") + cl_funcall(2, + s_define_qt_wrappers, + l_object); }} void EQL::runOnUiThread(void* function_or_closure) { const cl_env_ptr l_env = ecl_process_env(); diff --git a/src/eql5/eql.h b/src/eql5/eql.h index 8b2ca57..3fabf04 100644 --- a/src/eql5/eql.h +++ b/src/eql5/eql.h @@ -42,7 +42,7 @@ public: static void ini(int, char**); static void ini(char**); static void eval(const char*, const EvalMode = evalMode); - static void addObject(QObject*, const QByteArray&); + static void addObject(QObject*, const QByteArray&, bool = false); static EvalMode evalMode; void exec(const QStringList&);