mirror of
https://github.com/gosticks/gml.git
synced 2025-10-16 12:05:33 +00:00
further progress
This commit is contained in:
parent
1c37689ff2
commit
ad872bfa70
9
app.go
9
app.go
@ -65,3 +65,12 @@ func (a *App) LoadData(data string) error {
|
||||
_ = int(C.gml_app_load_data(a.app, dataC))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) SetRootContextProperty(name string, obj *Object) error {
|
||||
nameC := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(nameC))
|
||||
|
||||
// TODO:
|
||||
_ = int(C.gml_app_set_root_context_property(a.app, nameC, obj.cObject()))
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -11,6 +11,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "object.h"
|
||||
|
||||
typedef void* gml_app;
|
||||
|
||||
gml_app gml_app_new (int argv, char** argc);
|
||||
@ -21,6 +23,8 @@ int gml_app_quit(gml_app app);
|
||||
int gml_app_load (gml_app app, const char* url);
|
||||
int gml_app_load_data(gml_app app, const char* data);
|
||||
|
||||
int gml_app_set_root_context_property(gml_app app, const char* name, gml_object obj);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -10,5 +10,6 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "app.h"
|
||||
#include "object.h"
|
||||
|
||||
#endif
|
||||
|
||||
@ -93,6 +93,23 @@ int gml_app_load_data(gml_app app, const char* data) {
|
||||
}
|
||||
}
|
||||
|
||||
int gml_app_set_root_context_property(gml_app app, const char* name, gml_object obj) {
|
||||
try {
|
||||
GmlApp* a = (GmlApp*)app;
|
||||
QObject* o = (QObject*)obj;
|
||||
a->engine.rootContext()->setContextProperty(name, o);
|
||||
return 0; // TODO:
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
//api_error_set_msg(err, e.what()); TODO:
|
||||
return -1; // TODO:
|
||||
}
|
||||
catch (...) {
|
||||
//api_error_set_unknown_msg(err); TODO:
|
||||
return -1; // TODO:
|
||||
}
|
||||
}
|
||||
|
||||
//#################//
|
||||
//### App Class ###//
|
||||
//#################//
|
||||
|
||||
@ -10,9 +10,11 @@
|
||||
#include "../headers/app.h"
|
||||
|
||||
#include <QUrl>
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlContext>
|
||||
|
||||
class GmlApp {
|
||||
private:
|
||||
|
||||
@ -58,6 +58,7 @@ func generate(ctx *Context) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: only create dummies if the direcotories are empty.
|
||||
// Create dummy files, because otherwise make fill fail if there are no sources files present.
|
||||
// QMake is configured with a *.cpp & *.h
|
||||
func generateDummyFiles(ctx *Context) (err error) {
|
||||
@ -155,7 +156,8 @@ func generateGoFile(gp *genPackage) (err error) {
|
||||
}
|
||||
|
||||
f.WriteString(") {\n")
|
||||
f.WriteString(" \n") // TODO:
|
||||
f.WriteString(" _ptr := (C." + base + ")(_v.GMLObject_Pointer())\n")
|
||||
f.WriteString(" C." + base + "_" + s.Name + "(_ptr)\n") // TODO: params + return type + error
|
||||
f.WriteString("}\n\n")
|
||||
}
|
||||
}
|
||||
@ -202,11 +204,8 @@ func generateCHeaderFile(gp *genPackage, genDir string) (err error) {
|
||||
// Add all signals.
|
||||
if len(st.Signals) > 0 {
|
||||
for _, s := range st.Signals {
|
||||
f.WriteString("void " + base + "_" + s.Name + "(") // TODO: return value.
|
||||
for i, p := range s.Params {
|
||||
if i != 0 {
|
||||
f.WriteString(", ")
|
||||
}
|
||||
f.WriteString("void " + base + "_" + s.Name + "(" + base + " _v") // TODO: return value.
|
||||
for _, p := range s.Params {
|
||||
f.WriteString(p.Type + " " + p.Name) // TODO: to C types.
|
||||
}
|
||||
f.WriteString(");\n")
|
||||
@ -268,14 +267,13 @@ func generateCPPSourceFile(gp *genPackage, genDir string) (err error) {
|
||||
// Add all signals.
|
||||
if len(st.Signals) > 0 {
|
||||
for _, s := range st.Signals {
|
||||
f.WriteString("void " + base + "_" + s.Name + "(") // TODO: return value.
|
||||
for i, p := range s.Params {
|
||||
if i != 0 {
|
||||
f.WriteString(", ")
|
||||
}
|
||||
f.WriteString("void " + base + "_" + s.Name + "(" + base + " _v") // TODO: return value.
|
||||
for _, p := range s.Params {
|
||||
f.WriteString(p.Type + " " + p.Name) // TODO: to C types.
|
||||
}
|
||||
f.WriteString(") {\n")
|
||||
f.WriteString(" auto _vv = (" + cppbase + "*)_v;\n")
|
||||
f.WriteString(" emit _vv->" + s.Name + "();\n") // TODO: params
|
||||
f.WriteString("}\n")
|
||||
}
|
||||
}
|
||||
|
||||
15
object.go
15
object.go
@ -6,7 +6,11 @@
|
||||
|
||||
package gml
|
||||
|
||||
// #include <gml.h>
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
@ -15,9 +19,20 @@ type Object struct {
|
||||
}
|
||||
|
||||
func (o *Object) GMLObject_Pointer() unsafe.Pointer {
|
||||
if o.ptr == nil {
|
||||
panic(fmt.Errorf("gml.Object pointer is nil: did you call GMLInit()?"))
|
||||
}
|
||||
return o.ptr
|
||||
}
|
||||
|
||||
func (o *Object) GMLObject_SetPointer(ptr unsafe.Pointer) {
|
||||
o.ptr = ptr
|
||||
}
|
||||
|
||||
func (o *Object) GMLObject() *Object {
|
||||
return o
|
||||
}
|
||||
|
||||
func (o *Object) cObject() C.gml_object {
|
||||
return (C.gml_object)(o.GMLObject_Pointer())
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ package main
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/desertbit/gml"
|
||||
_ "github.com/desertbit/gml/samples/signals_slots/testy"
|
||||
@ -17,9 +18,9 @@ import (
|
||||
type Bridge struct {
|
||||
gml.Object
|
||||
_ struct {
|
||||
State int `gml:"property"`
|
||||
Connect func(addr string) `gml:"slot"`
|
||||
Connected func() `gml:"signal"`
|
||||
state int `gml:"property"`
|
||||
connect func(addr string) `gml:"slot"`
|
||||
connected func() `gml:"signal"`
|
||||
//Sign func(i int, s string, b bool) `gml:"signal"`
|
||||
}
|
||||
}
|
||||
@ -34,6 +35,15 @@ func main() {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
b := &Bridge{}
|
||||
b.GMLInit()
|
||||
app.SetRootContextProperty("bridge", b.GMLObject()) // TODO: use a interface so b.GMLObject can be shortened?
|
||||
|
||||
go func() {
|
||||
time.Sleep(time.Second)
|
||||
b.connected() // TODO:
|
||||
}()
|
||||
|
||||
err = app.Load("qml/main.qml")
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
|
||||
@ -9,8 +9,16 @@ ApplicationWindow {
|
||||
visible: true
|
||||
|
||||
Rectangle {
|
||||
id: rect
|
||||
anchors.fill: parent
|
||||
color: "red"
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: bridge
|
||||
onConnected: function() {
|
||||
rect.color = "blue"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user