further progress

This commit is contained in:
Roland Singer 2019-01-11 04:01:14 +01:00
parent 1c37689ff2
commit ad872bfa70
9 changed files with 78 additions and 14 deletions

9
app.go
View File

@ -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
}

View File

@ -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

View File

@ -10,5 +10,6 @@
#include <stdlib.h>
#include "app.h"
#include "object.h"
#endif

View File

@ -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 ###//
//#################//

View File

@ -10,9 +10,11 @@
#include "../headers/app.h"
#include <QUrl>
#include <QObject>
#include <QString>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
class GmlApp {
private:

View File

@ -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")
}
}

View File

@ -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())
}

View File

@ -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)

View File

@ -9,8 +9,16 @@ ApplicationWindow {
visible: true
Rectangle {
id: rect
anchors.fill: parent
color: "red"
}
Connections {
target: bridge
onConnected: function() {
rect.color = "blue"
}
}
}