Working signals/slots and working example

This commit is contained in:
Daniel Ziltener 2022-02-04 11:37:49 +01:00
parent f6566b8e38
commit ba83e7880a
4 changed files with 79 additions and 76 deletions

View File

@ -1,26 +1,24 @@
(import (import
(chicken foreign)
(qml core) (qml core)
coops) coops)
(gui-application-create) (gui-application-create)
(define engine (make <QQmlApplicationEngine>)) (define engine (make <QQmlApplicationEngine>))
(define loc (new-QUrl "examples/helloworld.qml"))
(load-url engine loc)
(define-external (windowCloseCallback (c-pointer cbdata) (int argc) ((c-pointer c-pointer) argv)) void (define (windowLoadCallback cbdata argv) void
(print (string-append "Got back " argc " arguments."))) (print cbdata)
(print "Loaded QML file: " (to (cadr argv) string:)))
(define callback-data (new-CallbackData "Test")) (define callback-data "Test")
(define conn (connect-lambda-static engine "quit" (define conn (connect-lambda-static engine "objectCreated(QObject*,QUrl)"
windowCloseCallback windowLoadCallback
callback-data callback-data
(qt-connection-type auto:))) (qt-connection-type auto:)))
(define loc (new-QUrl "examples/helloworld.qml"))
(load-url engine loc)
(do ((loop #t)) (do ((loop #t))
((not loop) #t) ((not loop) #t)
(process-events-timed (qevent-loop-process-event-flag process-all-events:) 50)) (process-events-timed (qevent-loop-process-event-flag process-all-events:) 50))
(type windowCloseCallback)
(type callback-data)

View File

@ -80,10 +80,6 @@
<QMetaObjectConnection> <QMetaObjectConnection>
delete-pointer delete-pointer
<CallbackData>
new-CallbackData
pointer
<QObject> <QObject>
signal-emit signal-emit
object-name object-name
@ -301,9 +297,8 @@
(define-class <QVariant> (<QMLBase>) (define-class <QVariant> (<QMLBase>)
((ptr accessor: ptr))) ((ptr accessor: ptr)))
(define-method (initialize-instance (qv <QVariant>)) (define (new-QVariant)
(set! (ptr qv) (dos_qvariant_create)) (make <QVariant> 'ptr (dos_qvariant_create)))
(call-next-method))
(define-method (qvariant (val <integer>)) (define-method (qvariant (val <integer>))
(make <QVariant> 'ptr (dos_qvariant_create_int val))) (make <QVariant> 'ptr (dos_qvariant_create_int val)))
(define-method (qvariant (val <boolean>)) (define-method (qvariant (val <boolean>))
@ -345,18 +340,6 @@
(define-method (delete-pointer (qmoc <QMetaObjectConnection>)) (define-method (delete-pointer (qmoc <QMetaObjectConnection>))
(dos_qmetaobject_connection_delete (slot-value qmoc 'ptr))) (dos_qmetaobject_connection_delete (slot-value qmoc 'ptr)))
(define-class <CallbackData> ()
((obj accessor: obj)))
(define (new-CallbackData data)
(let ((object (object-evict data)))
(make <CallbackData> 'obj object)))
(define-method (pointer (cbdata <CallbackData>))
(object->pointer (obj cbdata)))
(define-method (initialize-instance (cbdata <CallbackData>))
(call-next-method)
(set-finalizer! cbdata (lambda (x)
(object-release (slot-value cbdata 'obj)))))
(define-method (signal-emit (qo <QObject>) (name <string>) (paramcount <integer>) (parameters <sequence>)) (define-method (signal-emit (qo <QObject>) (name <string>) (paramcount <integer>) (parameters <sequence>))
(dos_qobject_signal_emit (ptr qo) name paramcount parameters)) (dos_qobject_signal_emit (ptr qo) name paramcount parameters))
(define-method (object-name (qo <QObject>)) (define-method (object-name (qo <QObject>))
@ -368,18 +351,31 @@
(define-method (set-property (qo <QObject>) (propertyName <string>) (value <QVariant>)) (define-method (set-property (qo <QObject>) (propertyName <string>) (value <QVariant>))
(dos_qobject_setProperty (slot-value qo 'ptr) propertyName (slot-value value 'ptr))) (dos_qobject_setProperty (slot-value qo 'ptr) propertyName (slot-value value 'ptr)))
;; Signal connectors and helpers
(define lambda-static-callbacks (make-hash-table))
(define-external (connectLambdaStaticCallbackHelper (c-pointer cbdata) (int argc) ((c-pointer c-pointer) argv)) void
(let* ((callback-key (object-unevict (pointer->object cbdata)))
(callback-info (hash-table-ref lambda-static-callbacks callback-key))
(callback-proc (alist-ref proc: callback-info))
(callback-data (alist-ref data: callback-info))
(signal-data (map (lambda (item)
(make <QVariant> 'ptr item))
(c_array_convert argv argc))))
(hash-table-delete! lambda-static-callbacks callback-key)
(object-release (pointer->object cbdata))
(callback-proc callback-data signal-data)))
(define-method (connect-lambda-static (sender <QObject>) (signal <string>) (define-method (connect-lambda-static (sender <QObject>) (signal <string>)
(callback <procedure>) (callback-data <CallbackData>) (callback <procedure>) (callback-data <primitive-object>)
(connection-type <QtConnectionType>)) (connection-type <QtConnectionType>))
(print "Debug: Parameters passed to dos_qobject_connect_lambda_static(DosQObject *sender, const char *signal, DosQObjectConnectLambdaCallback callback, void* callbackData, DosQtConnectionType connectionType):") (let* ((callback-key (string-append (->string sender) "->" signal "->" (->string callback))))
(print "DosQObject Pointer: " (ptr sender)) (hash-table-set! lambda-static-callbacks callback-key `((proc: . ,callback)
(print "Signal: " signal) (data: . callback-data)))
(print "Callback procedure: " callback) (dos_qobject_connect_lambda_static (ptr sender) signal
(print "Callback data: " (pointer callback-data)) (location connectLambdaStaticCallbackHelper)
(print "Connection type integer: " (val connection-type)) (object->pointer (object-evict callback-key))
(dos_qobject_connect_lambda_static (ptr sender) signal (val connection-type))))
callback (pointer callback-data)
(val connection-type)))
(define-method (connect-static (sender <QObject>) (signal <string>) (define-method (connect-static (sender <QObject>) (signal <string>)
(receiver <QObject>) (slot <string>) (connection-type <QtConnectionType>)) (receiver <QObject>) (slot <string>) (connection-type <QtConnectionType>))

View File

@ -8,7 +8,8 @@
coops-utils coops-utils
foreigners foreigners
utf8 utf8
srfi-69) srfi-69
list-comprehensions)
(foreign-dependencies Qt5Core (foreign-dependencies Qt5Core
Qt5Widgets Qt5Widgets
Qt5Gui Qt5Gui

View File

@ -3,8 +3,10 @@
(define-library (qml lowlevel) (define-library (qml lowlevel)
(import (scheme base)) (import (scheme base))
(import srfi-1)
(import (chicken foreign)) (import (chicken foreign))
(import foreigners) (import foreigners)
(import list-comprehensions)
(export DosQEventLoopProcessEventFlagProcessAllEvents (export DosQEventLoopProcessEventFlagProcessAllEvents
DosQEventLoopProcessEventFlagExcludeUserInputEvents DosQEventLoopProcessEventFlagExcludeUserInputEvents
DosQEventLoopProcessEventFlagProcessExcludeSocketNotifiers DosQEventLoopProcessEventFlagProcessExcludeSocketNotifiers
@ -18,6 +20,8 @@
dos_slot_macro dos_slot_macro
dos_signal_macro dos_signal_macro
c_array_convert
dos_parameterdefinition_create dos_parameterdefinition_create
dos_parameterdefinition_name dos_parameterdefinition_name
dos_signaldefinition_create dos_signaldefinition_create
@ -269,6 +273,19 @@
(foreign-lambda c-string "dos_signal_macro" (foreign-lambda c-string "dos_signal_macro"
c-string)) c-string))
;; Helpers
(define c_array_get
(foreign-lambda* (c-pointer DosQVariant) (((c-pointer (c-pointer DosQVariant)) array)
(int index))
"C_return(array[index]);"))
(define (c_array_convert c-array num-items)
(reverse
(fold
(lambda (index array)
(cons (c_array_get c-array index) array))
'() (range 0 num-items))))
;; Functions ;; Functions
;; ParameterDefinition ;; ParameterDefinition
(define dos_parameterdefinition_create (define dos_parameterdefinition_create
@ -398,7 +415,7 @@
(c-pointer DosQQmlApplicationEngine) (c-pointer DosQQmlApplicationEngine)
c-string)) c-string))
(define dos_qqmlapplicationengine_load_url (define dos_qqmlapplicationengine_load_url
(foreign-lambda void "dos_qqmlapplicationengine_load_url" (foreign-safe-lambda void "dos_qqmlapplicationengine_load_url"
(c-pointer DosQQmlApplicationEngine) (c-pointer DosQQmlApplicationEngine)
(c-pointer DosQUrl))) (c-pointer DosQUrl)))
(define dos_qqmlapplicationengine_load_data (define dos_qqmlapplicationengine_load_data
@ -864,43 +881,34 @@
(foreign-lambda bool "dos_qobject_setProperty" (foreign-lambda bool "dos_qobject_setProperty"
(c-pointer DosQObject) c-string (c-pointer DosQVariant))) (c-pointer DosQObject) c-string (c-pointer DosQVariant)))
;; (define dos_qobject_connect_lambda_static
;; (foreign-lambda* (c-pointer DosQMetaObjectConnection) (((c-pointer DosQObject) sender)
;; (c-string signal)
;; ((function void (c-pointer int (c-pointer c-pointer))) callback)
;; (c-pointer callbackData)
;; (DosQtConnectionType connection_type))
;; "C_return(dos_qobject_connect_lambda_static(sender, signal, callback, callbackData, connection_type));"))
(define dos_qobject_connect_lambda_static (define dos_qobject_connect_lambda_static
(foreign-lambda (c-pointer DosQMetaObjectConnection) "dos_qobject_connect_lambda_static" (foreign-lambda* (c-pointer DosQMetaObjectConnection) (((c-pointer DosQObject) sender)
(c-pointer DosQObject) ;; sender (c-string signal)
c-string ;; signal ((function void (c-pointer int (c-pointer (c-pointer DosQVariant)))) callback)
(function void (c-pointer int pointer-vector)) ;; callback (c-pointer callbackData)
c-pointer ;; callbackData (DosQtConnectionType connection_type))
DosQtConnectionType)) ;; connection_type "C_return(dos_qobject_connect_lambda_static(sender, dos_signal_macro(signal), callback, callbackData, connection_type));"))
(define dos_qobject_connect_lambda_with_context_static (define dos_qobject_connect_lambda_with_context_static
(foreign-lambda (c-pointer DosQMetaObjectConnection) "dos_qobject_connect_lambda_with_context_static" (foreign-lambda* (c-pointer DosQMetaObjectConnection) (((c-pointer DosQObject) sender)
(c-pointer DosQObject) ;; sender (c-string signal)
c-string ;; signal ((c-pointer DosQObject) context)
(c-pointer DosQObject) ;; context ((function void (c-pointer int (c-pointer (c-pointer DosQVariant)))) callback)
DosQObjectConnectLambdaCallback ;; callback (c-pointer callbackData)
c-pointer ;; callbackData (DosQtConnectionType connection_type))
DosQtConnectionType ;; connection_type "C_return(dos_qobject_connect_lambda_with_context_static(sender, dos_signal_macro(signal), context, callback, callbackData, connection_type));"))
))
(define dos_qobject_connect_static (define dos_qobject_connect_static
(foreign-lambda (c-pointer DosQMetaObjectConnection) "dos_qobject_connect_static" (foreign-lambda* (c-pointer DosQMetaObjectConnection) (((c-pointer DosQObject) sender)
(c-pointer DosQObject) ;; sender (c-string signal)
c-string ;; signal ((c-pointer DosQObject) receiver)
(c-pointer DosQObject) ;; receiver (c-string slot)
c-string ;; slot (DosQtConnectionType connection_type))
DosQtConnectionType ;; connection_type "C_return(dos_qobject_connect_static(sender, dos_signal_macro(signal), receiver, dos_slot_macro(slot), connection_type));"))
))
(define dos_qobject_disconnect_static (define dos_qobject_disconnect_static
(foreign-lambda void "dos_qobject_disconnect_static" (foreign-lambda* void (((c-pointer DosQObject) sender)
(c-pointer DosQObject) ;; sender (c-string signal)
c-string ;; signal ((c-pointer DosQObject) receiver)
(c-pointer DosQObject) ;; receiver (c-string slot))
c-string)) ;; slot "dos_qobject_disconnect_static(sender, dos_signal_macro(signal), receiver, dos_slot_macro(slot));"))
(define dos_qobject_disconnect_with_connection_static (define dos_qobject_disconnect_with_connection_static
(foreign-lambda void "dos_qobject_disconnect_with_connection_static" (foreign-lambda void "dos_qobject_disconnect_with_connection_static"
(c-pointer DosQMetaObjectConnection))) (c-pointer DosQMetaObjectConnection)))