add third argument to 'EQL::addObject' to call 'define-qt-wrappers'

This commit is contained in:
polos 2021-05-11 09:48:00 +02:00
parent 73844d81ab
commit 4f75551971
4 changed files with 35 additions and 22 deletions

View file

@ -12,13 +12,17 @@ int main(int argc, char* argv[]) {
main->show(); main->show();
EQL eql; 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)"); 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 EQL::eval("(load \"test.lisp\")"); // will start a REPL
app.processEvents(); // needed for 'qlater' in 'test.lisp' app.processEvents(); // needed for 'qlater' in 'test.lisp'

View file

@ -1,11 +1,6 @@
(in-package :eql-user) ;;; below function calls only work because 'define-qt-wrappers' has already
;;; been called implicitely on '*test*', see 'EQL::addObject()' in 'main.cpp'
;; the following defines generic functions for all Qt signals, ;;; (note third argument 'true')
;; Qt slots and functions declared Q_INVOKABLE
(define-qt-wrappers *test*)
;; now we can call those functions
(defun test () (defun test ()
;; make new instance ;; make new instance

View file

@ -215,15 +215,29 @@ void EQL::exec(QWidget* widget, const QString& lispFile, const QString& slimeHoo
if(exec_with_simple_restart) { if(exec_with_simple_restart) {
eval("(eql::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(':'); int p = varName.indexOf(':');
QByteArray pkg = (p == -1) ? "eql-user" : varName.left(p); if(p == -1) {
QByteArray var = varName.mid(varName.lastIndexOf(':') + 1); // use current package
cl_object l_symbol = cl_intern(2, l_symbol = cl_intern(1,
STRING_COPY(var.toUpper().constData()), STRING_COPY(varName.toUpper().constData())); }
cl_find_package(STRING_COPY(pkg.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); 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) { void EQL::runOnUiThread(void* function_or_closure) {
const cl_env_ptr l_env = ecl_process_env(); const cl_env_ptr l_env = ecl_process_env();

View file

@ -42,7 +42,7 @@ public:
static void ini(int, char**); static void ini(int, char**);
static void ini(char**); static void ini(char**);
static void eval(const char*, const EvalMode = evalMode); 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; static EvalMode evalMode;
void exec(const QStringList&); void exec(const QStringList&);