add comply and dynamic flags + syntactic sugar for moc structs

This commit is contained in:
therecipe 2018-04-07 21:05:41 +02:00
parent c38504e5a8
commit b95c8155e7
62 changed files with 875 additions and 486 deletions

3
.gitignore vendored
View file

@ -13,4 +13,5 @@
/internal/examples/**/rcc*
/internal/examples/**/moc*
/internal/binding/dump/*
/internal/cmd/moc/test/**/moc*
/internal/cmd/moc/test/**/moc*
*.so

View file

@ -59,6 +59,9 @@ func main() {
var device string
flag.StringVar(&device, "device", "", "a device UUID to be used by the iOS simulator")
var comply bool
flag.BoolVar(&comply, "comply", false, "dump object code to make it easier to comply with LGPL obligations for proprietary developments")
if cmd.ParseFlags() {
flag.Usage()
}
@ -114,5 +117,5 @@ func main() {
case "android", "android-emulator", "ios", "ios-simulator", "sailfish", "sailfish-emulator":
fast = false
}
deploy.Deploy(mode, target, path, docker, ldFlags, tags, fast && !docker, device, vagrant, vagrantsystem)
deploy.Deploy(mode, target, path, docker, ldFlags, tags, fast && !docker, device, vagrant, vagrantsystem, comply)
}

View file

@ -51,6 +51,11 @@ func main() {
var vagrant bool
flag.BoolVar(&vagrant, "vagrant", false, "run command inside vagrant vm")
var dynamic bool
if runtime.GOOS == "darwin" {
flag.BoolVar(&dynamic, "dynamic", false, "create and use semi-dynamic libraries during the generation and installation process (experimental; no real replacement for dynamic linking)")
}
if cmd.ParseFlags() {
flag.Usage()
}
@ -79,6 +84,10 @@ func main() {
target = runtime.GOOS
}
if dynamic && target == runtime.GOOS {
os.Setenv("QT_DYNAMIC_SETUP", "true")
}
utils.CheckBuildTarget(target)
switch mode {

View file

@ -44,6 +44,9 @@ type Function struct {
IsMocFunction bool
IsMocProperty bool
PureGoOutput string
Connect int
Target string
Inbound bool
}
type Parameter struct {

View file

@ -20,6 +20,12 @@ type Variable struct {
IsMocSynthetic bool
PureGoType string
Connect int
ConnectGet bool
ConnectSet bool
ConnectChanged bool
Target string
Inbound bool
}
func (v *Variable) Class() (*Class, bool) {

View file

@ -527,3 +527,37 @@ func cgoFileNames(module, path, target string, mode int) []string {
}
return o
}
func ParseCgo(module, target string) (string, string) {
utils.Log.WithField("module", module).WithField("target", target).Debug("parse cgo for shared lib")
tmp := utils.LoadOptional(utils.GoQtPkgPath(module, cgoFileNames(module, "", target, NONE)[0]))
if tmp != "" {
tmp = strings.Split(tmp, "/*")[1]
tmp = strings.Split(tmp, "*/")[0]
tmp = strings.Replace(tmp, "#cgo CFLAGS: ", "", -1)
tmp = strings.Replace(tmp, "#cgo CXXFLAGS: ", "", -1)
tmp = strings.Replace(tmp, "#cgo LDFLAGS: ", "", -1)
tmp = strings.Replace(tmp, "\n", " ", -1)
switch target {
case "darwin":
return "clang++", fmt.Sprintf("%v -Wl,-S -Wl,-x -install_name @rpath/%[2]v/lib%[2]v.so -undefined dynamic_lookup -shared -o lib%[2]v.so %[2]v.cpp", tmp, module)
}
}
return "", tmp
}
func ReplaceCgo(module, target string) {
utils.Log.WithField("module", module).WithField("target", target).Debug("replace cgo for shared lib")
tmp := utils.LoadOptional(utils.GoQtPkgPath(module, cgoFileNames(module, "", target, NONE)[0]))
if tmp != "" {
pre := strings.Split(tmp, "/*")[0]
past := strings.Split(tmp, "*/")[1]
utils.Save(utils.GoQtPkgPath(module, cgoFileNames(module, "", target, NONE)[0]), fmt.Sprintf("%v/*\n#cgo CFLAGS: -I.\n#cgo LDFLAGS: -L. -l%v -Wl,-rpath,%v\n*/%v", pre, module, utils.GoQtPkgPath(), past))
}
}

View file

@ -457,7 +457,7 @@ func preambleCpp(module string, input []byte, mode int, tags string) []byte {
#define private public
#include "%v.h"
#include "_cgo_export.h"
%v
`,
buildTags(module, false, mode, tags),
@ -488,6 +488,18 @@ func preambleCpp(module string, input []byte, mode int, tags string) []byte {
}
}
}(),
func() string {
switch module {
case "QtAndroidExtras", "QtSailfish":
return "#include \"_cgo_export.h\""
default:
if utils.QT_DYNAMIC_SETUP() {
return "#include \"_obj/_cgo_export.h\""
}
return "#include \"_cgo_export.h\""
}
}(),
)
var classes = make([]string, 0)

View file

@ -209,23 +209,225 @@ func (ptr *%[1]v) Destroy%[1]v() {
func callback%[1]v_Constructor(ptr unsafe.Pointer) {
`, class.Name)
fmt.Fprintf(bb, "gPtr := New%vFromPointer(ptr)\nqt.Register(ptr, gPtr)\n", strings.Title(class.Name))
fmt.Fprintf(bb, "this := New%vFromPointer(ptr)\nqt.Register(ptr, this)\n", strings.Title(class.Name))
var lastModule string
for _, bcn := range class.GetAllBases() {
if bc := parser.State.ClassMap[bcn]; bc.Module != class.Module {
if len(bc.Constructors) > 0 && lastModule != bc.Module {
if strings.ToLower(bc.Constructors[0])[0] != bc.Constructors[0][0] {
fmt.Fprintf(bb, "gPtr.%v.%v()\n", strings.Title(bc.Name), bc.Constructors[0])
fmt.Fprintf(bb, "this.%v.%v()\n", strings.Title(bc.Name), bc.Constructors[0])
}
}
lastModule = bc.Module
}
}
if len(class.Constructors) > 0 {
fmt.Fprintf(bb, "gPtr.%v()\n", class.Constructors[0])
for _, bcn := range append(class.GetAllBases(), class.Name) {
if bc, ok := parser.State.ClassMap[bcn]; ok {
for _, f := range bc.Functions {
if f.Connect == 0 || !f.IsMocFunction {
continue
}
if class.Name != bcn {
fmt.Fprintf(bb, "qt.DisconnectSignal(ptr, \"%v\")\n", f.Name)
}
}
}
}
connect := func(class *parser.Class, local bool) {
for _, bcn := range append(class.GetAllBases(), class.Name) {
if bc, ok := parser.State.ClassMap[bcn]; ok {
for _, f := range bc.Functions {
if f.Connect == 0 || !f.IsMocFunction {
continue
}
if (local && f.Target != "") || (!local && f.Target == "") {
continue
}
name := f.Name
if f.Inbound {
name = strings.Title(name)
}
if f.Connect == 1 {
if f.Target == "" {
fmt.Fprintf(bb, "this.Connect%v(this.%v)\n", strings.Title(name), name)
} else {
t := f.Target
if strings.Count(t, ".") != 2 {
if !(len(strings.Split(f.Target, ".")) == 2 && strings.Split(f.Target, ".")[0] != "this" && strings.Split(f.Target, ".")[1][:1] == strings.ToLower(strings.Split(f.Target, ".")[1][:1])) {
t = f.Target + "." + name
}
}
tUpper := strings.Split(f.Target, ".")
tUpper[len(tUpper)-1] = strings.Title(tUpper[len(tUpper)-1])
if strings.Count(f.Target, ".") >= 2 || (len(strings.Split(f.Target, ".")) == 2 && strings.Split(f.Target, ".")[0] != "this" && strings.Split(f.Target, ".")[1][:1] == strings.ToLower(strings.Split(f.Target, ".")[1][:1])) {
fmt.Fprintf(bb, "this.Connect%v(%v)\n", strings.Title(name), strings.Join(tUpper, "."))
} else {
fmt.Fprintf(bb, "this.Connect%v(%v.%v)\n", strings.Title(name), f.Target, strings.Title(name))
}
}
} else {
if f.Target != "" {
t := f.Target
if strings.Count(t, ".") != 2 {
if !(len(strings.Split(f.Target, ".")) == 2 && strings.Split(f.Target, ".")[0] != "this" && strings.Split(f.Target, ".")[1][:1] == strings.ToLower(strings.Split(f.Target, ".")[1][:1])) {
t = f.Target + "." + name
}
}
tCon := strings.Split(f.Target, ".")
tCon[len(tCon)-1] = "Connect" + strings.Title(tCon[len(tCon)-1])
if strings.Count(f.Target, ".") >= 2 || (len(strings.Split(f.Target, ".")) == 2 && strings.Split(f.Target, ".")[0] != "this" && strings.Split(f.Target, ".")[1][:1] == strings.ToLower(strings.Split(f.Target, ".")[1][:1])) {
fmt.Fprintf(bb, "%v(this.%v)\n", strings.Join(tCon, "."), name)
} else {
fmt.Fprintf(bb, "%v.Connect%v(this.%v)\n", f.Target, strings.Title(name), name)
}
}
}
}
}
}
for _, bcn := range append(class.GetAllBases(), class.Name) {
if bc, ok := parser.State.ClassMap[bcn]; ok {
for _, p := range bc.Properties {
if p.Connect == 0 {
continue
}
if (local && p.Target != "") || (!local && p.Target == "") {
continue
}
name := p.Name
if p.Inbound {
name = strings.Title(name)
}
if p.Connect == 1 {
if p.Target == "" {
if p.ConnectGet || !(p.ConnectSet || p.ConnectChanged) {
fmt.Fprintf(bb, "this.Connect%v(this.%v)\n",
func() string {
if p.Output == "bool" && !strings.HasPrefix(name, "is") {
return "Is" + strings.Title(name)
}
return strings.Title(name)
}(),
func() string {
if p.Output == "bool" && !strings.HasPrefix(name, "is") {
return "is" + strings.Title(name)
}
return name
}())
}
if p.ConnectSet || !(p.ConnectGet || p.ConnectChanged) {
fmt.Fprintf(bb, "this.ConnectSet%v(this.set%v)\n", strings.Title(name), strings.Title(name))
}
if p.ConnectChanged || !(p.ConnectGet || p.ConnectSet) {
fmt.Fprintf(bb, "this.Connect%vChanged(this.%vChanged)\n", strings.Title(name), name)
}
} else {
t := p.Target
if strings.Count(t, ".") < 2 {
if !(len(strings.Split(p.Target, ".")) == 2 && strings.Split(p.Target, ".")[0] != "this" && strings.Split(p.Target, ".")[1][:1] == strings.ToLower(strings.Split(p.Target, ".")[1][:1])) {
t = p.Target + "." + name
}
}
tSet := strings.Split(t, ".")
tSet[len(tSet)-1] = "ConnectSet" + strings.Title(tSet[len(tSet)-1])
tChanged := strings.Split(t, ".")
tChanged[len(tChanged)-1] = strings.Title(tChanged[len(tChanged)-1]) + "Changed"
tUpper := strings.Split(t, ".")
tUpper[len(tUpper)-1] = strings.Title(tUpper[len(tUpper)-1])
tIs := strings.Split(t, ".")
if p.Output == "bool" && !strings.HasPrefix(tIs[len(tIs)-1], "is") {
tIs[len(tIs)-1] = "ConnectIs" + strings.Title(tIs[len(tIs)-1])
} else {
tIs[len(tIs)-1] = "Connect" + strings.Title(tIs[len(tIs)-1])
}
if p.ConnectGet || !(p.ConnectSet || p.ConnectChanged) {
fmt.Fprintf(bb, "%v(this.%v)\n",
strings.Join(tIs, "."),
func() string {
if p.Output == "bool" && !strings.HasPrefix(name, "is") {
return "Is" + strings.Title(name)
}
return strings.Title(name)
}())
}
if p.ConnectSet || !(p.ConnectGet || p.ConnectChanged) {
fmt.Fprintf(bb, "%v(this.Set%v)\n", strings.Join(tSet, "."), strings.Title(name))
}
if p.ConnectChanged || !(p.ConnectGet || p.ConnectSet) {
fmt.Fprintf(bb, "this.Connect%vChanged(%v)\n", strings.Title(name), strings.Join(tChanged, "."))
}
}
} else {
if p.Target != "" {
t := p.Target
if strings.Count(t, ".") < 2 {
if !(len(strings.Split(p.Target, ".")) == 2 && strings.Split(p.Target, ".")[0] != "this" && strings.Split(p.Target, ".")[1][:1] == strings.ToLower(strings.Split(p.Target, ".")[1][:1])) {
t = p.Target + "." + name
}
}
tSet := strings.Split(t, ".")
tSet[len(tSet)-1] = "Set" + strings.Title(tSet[len(tSet)-1])
tChanged := strings.Split(t, ".")
tChanged[len(tChanged)-1] = "Connect" + strings.Title(tChanged[len(tChanged)-1]) + "Changed"
tUpper := strings.Split(t, ".")
tUpper[len(tUpper)-1] = strings.Title(tUpper[len(tUpper)-1])
tIs := strings.Split(t, ".")
if p.Output == "bool" && !strings.HasPrefix(tIs[len(tIs)-1], "is") {
tIs[len(tIs)-1] = "Is" + strings.Title(tIs[len(tIs)-1])
} else {
tIs[len(tIs)-1] = strings.Title(tIs[len(tIs)-1])
}
if p.ConnectGet || !(p.ConnectSet || p.ConnectChanged) {
fmt.Fprintf(bb, "this.Connect%v(%v)\n",
func() string {
if p.Output == "bool" && !strings.HasPrefix(name, "is") {
return "Is" + strings.Title(name)
}
return strings.Title(name)
}(), strings.Join(tIs, "."))
}
if p.ConnectSet || !(p.ConnectGet || p.ConnectChanged) {
fmt.Fprintf(bb, "this.ConnectSet%v(%v)\n", strings.Title(name), strings.Join(tSet, "."))
}
if p.ConnectChanged || !(p.ConnectGet || p.ConnectSet) {
fmt.Fprintf(bb, "%v(this.%vChanged)\n", strings.Join(tChanged, "."), strings.Title(name))
}
}
}
}
}
}
}
connect(class, true)
if len(class.Constructors) > 0 {
fmt.Fprintf(bb, "this.%v()\n", class.Constructors[0])
}
connect(class, false)
fmt.Fprint(bb, "}\n\n")
}
}

View file

@ -739,3 +739,58 @@ func ubports_manifest(name string) string {
return "amd64"
}())
}
func relink(env map[string]string, target string) string {
return fmt.Sprintf(`#!/bin/bash
set -ev
#GO_VERSION: %v
#GO_HOST_OS: %v
#GO_HOST_ARCH: %v
#QT_VERSION: %v
export GOOS=%v
export GOARCH=%v
export GOARM=%v
export CC=%v
export CXX=%v
go tool link -f -o $PWD/relinked -importcfg $PWD/b001/importcfg.link -buildmode=%v -w -extld=%v $PWD/b001/_pkg_.a`,
runtime.Version(),
runtime.GOOS,
runtime.GOARCH,
utils.QT_VERSION(),
env["GOOS"],
env["GOARCH"],
func() string {
if env["GOARCH"] == "arm" {
return env["GOARM"]
}
return ""
}(),
env["CC"],
env["CXX"],
func() string {
switch target {
case "ios", "ios-simulator":
return "c-archive"
case "android", "android-emulator":
return "c-shared"
default:
return "exe"
}
}(),
func() string {
switch target {
case "ios", "ios-simulator", "darwin":
return "clang++"
default:
return "g++"
}
}())
}

View file

@ -2,6 +2,7 @@ package deploy
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
@ -15,7 +16,7 @@ import (
"github.com/therecipe/qt/internal/utils"
)
func build(mode, target, path, ldFlagsCustom, tagsCustom, name, depPath string, fast bool) {
func build(mode, target, path, ldFlagsCustom, tagsCustom, name, depPath string, fast, comply bool) {
env, tags, ldFlags, out := cmd.BuildEnv(target, name, depPath)
if (!fast || utils.QT_STUB()) && !utils.QT_FAT() {
tags = append(tags, "minimal")
@ -40,21 +41,26 @@ func build(mode, target, path, ldFlagsCustom, tagsCustom, name, depPath string,
if !utils.QT_SAILFISH() {
build_sailfish(mode, target, path, ldFlagsCustom, name, depPath)
walkFn := func(path string, info os.FileInfo, err error) error {
switch info.Name() {
case "rcc.qrc", "rcc.cpp",
"moc.h", "moc.cpp", "moc_moc.h",
"cgo_main_wrapper.go":
utils.RemoveAll(path)
default:
if strings.HasPrefix(info.Name(), "moc_cgo_") ||
strings.HasPrefix(info.Name(), "rcc_cgo_") {
utils.RemoveAll(path)
if !fast {
walkFn := func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
switch info.Name() {
case "rcc.qrc", "rcc.cpp",
"moc.h", "moc.cpp", "moc_moc.h",
"cgo_main_wrapper.go":
utils.RemoveAll(path)
default:
if strings.HasPrefix(info.Name(), "moc_cgo_") ||
strings.HasPrefix(info.Name(), "rcc_cgo_") {
utils.RemoveAll(path)
}
}
return nil
}
return nil
filepath.Walk(path, walkFn)
}
filepath.Walk(path, walkFn)
return
}
}
@ -71,6 +77,12 @@ func build(mode, target, path, ldFlagsCustom, tagsCustom, name, depPath string,
cmd.Args = append(cmd.Args, "-i")
}
if comply {
utils.MkdirAll(depPath + "_obj")
cmd.Env = append(cmd.Env, fmt.Sprintf("GOTMPDIR=%v", depPath+"_obj"))
cmd.Args = append(cmd.Args, "-a", "-x", "-work")
}
cmd.Args = append(cmd.Args, fmt.Sprintf("-tags=\"%v\"", strings.Join(tags, "\" \"")))
if target != runtime.GOOS {
@ -96,21 +108,65 @@ func build(mode, target, path, ldFlagsCustom, tagsCustom, name, depPath string,
utils.RunCmd(strip, fmt.Sprintf("strip binary for %v on %v", target, runtime.GOOS))
}
walkFn := func(path string, info os.FileInfo, err error) error {
switch info.Name() {
case "rcc.qrc", "rcc.cpp",
"moc.h", "moc.cpp", "moc_moc.h",
"cgo_main_wrapper.go":
utils.RemoveAll(path)
default:
if strings.HasPrefix(info.Name(), "moc_cgo_") ||
strings.HasPrefix(info.Name(), "rcc_cgo_") {
if !fast {
walkFn := func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
switch info.Name() {
case "rcc.qrc", "rcc.cpp",
"moc.h", "moc.cpp", "moc_moc.h",
"cgo_main_wrapper.go":
utils.RemoveAll(path)
default:
if strings.HasPrefix(info.Name(), "moc_cgo_") ||
strings.HasPrefix(info.Name(), "rcc_cgo_") {
utils.RemoveAll(path)
}
}
return nil
}
filepath.Walk(path, walkFn)
}
if comply {
dirs, err := ioutil.ReadDir(depPath + "_obj")
if err != nil {
utils.Log.WithError(err).Error("failed to read object dir")
}
var randname string
for _, dir := range dirs {
if strings.HasPrefix(dir.Name(), "go-build") {
randname = dir.Name()
os.Rename(filepath.Join(depPath+"_obj", dir.Name()), depPath+"_objreal")
utils.RemoveAll(depPath + "_obj")
os.Rename(depPath+"_objreal", depPath+"_obj")
break
}
}
return nil
walkFn := func(fpath string, info os.FileInfo, err error) error {
if err != nil {
return err
}
switch info.Name() {
case "_pkg_.a":
case "importcfg.link":
pre := utils.Load(fpath)
pre = strings.Replace(pre, filepath.Join(depPath+"_obj", randname), ".", -1)
utils.Save(fpath, pre)
default:
if !info.IsDir() || info.Name() == "exe" {
utils.RemoveAll(fpath)
}
}
return nil
}
filepath.Walk(depPath+"_obj", walkFn)
utils.SaveExec(filepath.Join(depPath+"_obj", "relink.sh"), relink(env, target))
}
filepath.Walk(path, walkFn)
}
func build_sailfish(mode, target, path, ldFlagsCustom, name, depPath string) {

View file

@ -12,8 +12,8 @@ import (
"github.com/therecipe/qt/internal/utils"
)
func Deploy(mode, target, path string, docker bool, ldFlags, tags string, fast bool, device string, vagrant bool, vagrantsystem string) {
utils.Log.WithField("mode", mode).WithField("target", target).WithField("path", path).WithField("docker", docker).WithField("ldFlags", ldFlags).WithField("fast", fast).Debug("running Deploy")
func Deploy(mode, target, path string, docker bool, ldFlags, tags string, fast bool, device string, vagrant bool, vagrantsystem string, comply bool) {
utils.Log.WithField("mode", mode).WithField("target", target).WithField("path", path).WithField("docker", docker).WithField("ldFlags", ldFlags).WithField("fast", fast).WithField("comply", comply).Debug("running Deploy")
name := filepath.Base(path)
depPath := filepath.Join(path, "deploy", target)
@ -25,6 +25,9 @@ func Deploy(mode, target, path string, docker bool, ldFlags, tags string, fast b
if fast {
args = append(args, "-fast")
}
if comply {
args = append(args, "-comply")
}
if vagrantsystem == "docker" {
args = append(args, "-docker")
}
@ -45,6 +48,10 @@ func Deploy(mode, target, path string, docker bool, ldFlags, tags string, fast b
}
}
if utils.ExistsDir(depPath + "_obj") {
utils.RemoveAll(depPath + "_obj")
}
rcc.Rcc(path, target, tags, os.Getenv("QTRCC_OUTPUT_DIR"))
if !fast {
moc.Moc(path, target, tags, false, false)
@ -54,7 +61,7 @@ func Deploy(mode, target, path string, docker bool, ldFlags, tags string, fast b
minimal.Minimal(path, target, tags)
}
build(mode, target, path, ldFlags, tags, name, depPath, fast)
build(mode, target, path, ldFlags, tags, name, depPath, fast, comply)
if !(fast || utils.QT_DEBUG_QML()) {
bundle(mode, target, path, name, depPath)

View file

@ -1,6 +1,8 @@
package moc
import (
"crypto/sha1"
"encoding/hex"
"errors"
"fmt"
"go/ast"
@ -412,19 +414,105 @@ func parse(path string) ([]*parser.Class, string, error) {
continue
}
switch typ := string(src[field.Type.Pos()-1 : field.Type.End()-1]); meta {
//TODO: sync, async, lazy, ...
//TODO: whole class shims
//TODO: multi targets
//TODO: private
//TODO: qml register tag
var (
auto int
target string
inbound bool
)
if (meta == parser.SIGNAL || meta == parser.SLOT || meta == parser.PROP) && (strings.Contains(tag, ",->") || strings.Contains(tag, ",auto") || strings.Contains(tag, ",<-")) {
autoTag := strings.Split(tag, ",")[1]
if strings.Contains(tag, ",->") || strings.Contains(tag, ",auto") {
auto = 1
autoTag = strings.TrimPrefix(autoTag, "->")
autoTag = strings.TrimPrefix(autoTag, "auto")
} else {
auto = 2
autoTag = strings.TrimPrefix(autoTag, "<-")
}
if strings.Contains(autoTag, "(") {
if !strings.HasPrefix(autoTag, "(this.") {
//TODO: concurrent + cache lookups
var found bool
for _, imp := range file.Imports {
if strings.Contains(autoTag, "("+imp.Name.String()+".") {
name := strings.TrimSpace(utils.RunCmd(exec.Command("go", "list", "-f", "{{.Name}}", strings.Replace(imp.Path.Value, "\"", "", -1)), "get import name"))
dir := strings.TrimSpace(utils.RunCmd(exec.Command("go", "list", "-f", "{{.Dir}}", strings.Replace(imp.Path.Value, "\"", "", -1)), "get import dir"))
h := sha1.New()
h.Write([]byte(dir))
mname := "custom_" + name + "_" + hex.EncodeToString(h.Sum(nil)[:3]) + "m"
goMocImportsCacheMutex.Lock()
goMocImportsCache[path] = append(goMocImportsCache[path], fmt.Sprintf("%v %v", mname, imp.Path.Value))
goMocImportsCacheMutex.Unlock()
autoTag = strings.Replace(autoTag, "("+imp.Name.String()+".", "("+mname+".", -1)
found = true
break
}
}
if !found {
for _, imp := range file.Imports {
if imp.Name.String() != "<nil>" && imp.Name.String() != "_" {
continue
}
name := strings.TrimSpace(utils.RunCmd(exec.Command("go", "list", "-f", "{{.Name}}", strings.Replace(imp.Path.Value, "\"", "", -1)), "get import name"))
if !strings.Contains(autoTag, "("+name+".") {
continue
}
dir := strings.TrimSpace(utils.RunCmd(exec.Command("go", "list", "-f", "{{.Dir}}", strings.Replace(imp.Path.Value, "\"", "", -1)), "get import dir"))
h := sha1.New()
h.Write([]byte(dir))
mname := "custom_" + name + "_" + hex.EncodeToString(h.Sum(nil)[:3]) + "m"
goMocImportsCacheMutex.Lock()
goMocImportsCache[path] = append(goMocImportsCache[path], fmt.Sprintf("%v %v", mname, imp.Path.Value))
goMocImportsCacheMutex.Unlock()
autoTag = strings.Replace(autoTag, "("+name+".", "("+mname+".", -1)
break
}
}
}
target = strings.TrimSuffix(strings.TrimPrefix(autoTag, "("), ")")
}
tag = strings.Split(tag, ",")[0]
}
name := strings.Split(tag, ":")[1]
if name[:1] != strings.ToLower(name[:1]) {
inbound = true
name = strings.ToLower(name[:1]) + strings.TrimPrefix(name[1:], name[:1])
}
typ := string(src[field.Type.Pos()-1 : field.Type.End()-1])
switch meta {
case parser.SIGNAL, parser.SLOT:
f := &parser.Function{
Access: "public",
Fullname: fmt.Sprintf("%v::%v", class.Name, strings.Split(tag, ":")[1]),
Fullname: fmt.Sprintf("%v::%v", class.Name, name),
Meta: meta,
Name: strings.Split(tag, ":")[1],
Name: name,
Status: "public",
Virtual: parser.PURE,
Signature: "()",
Output: "void",
Parameters: parameters(typ),
IsMocFunction: true,
Connect: auto,
Target: target,
Inbound: inbound,
}
if meta == parser.SLOT {
if strings.Contains(typ, ") ") {
@ -446,11 +534,17 @@ func parse(path string) ([]*parser.Class, string, error) {
case parser.PROP:
class.Properties = append(class.Properties,
&parser.Variable{
Access: "public",
Fullname: fmt.Sprintf("%v::%v", class.Name, strings.Split(tag, ":")[1]),
Name: strings.Split(tag, ":")[1],
Status: "public",
Output: typ,
Access: "public",
Fullname: fmt.Sprintf("%v::%v", class.Name, strings.Split(tag, ":")[1]),
Name: strings.Split(tag, ":")[1],
Status: "public",
Output: typ,
Connect: auto,
ConnectGet: strings.Contains(field.Tag.Value, ",get"),
ConnectSet: strings.Contains(field.Tag.Value, ",set"),
ConnectChanged: strings.Contains(field.Tag.Value, ",changed"),
Target: target,
Inbound: inbound,
})
case parser.CONSTRUCTOR:
@ -623,11 +717,11 @@ func cppTypeFromGoType(f *parser.Function, t string, class *parser.Class) (strin
tOld = strings.Replace(tOld, "$WC_", "chan<- ", -1)
tOld = strings.Replace(tOld, "$C_", "chan ", -1)
//TODO: directly resolve moc pkgs imports in parse ?
ttOld := strings.TrimPrefix(tOld, "*")
if strings.Contains(tOld, ".") {
ttOld = strings.Split(ttOld, ".")[1]
}
if c, ok := parser.State.GoClassMap[ttOld]; ok {
if c.Path != class.Path {
pos := c.Module + "." + ttOld

View file

@ -0,0 +1,136 @@
package sub
import (
"github.com/therecipe/qt/core"
_ "github.com/therecipe/qt/internal/cmd/moc/test/sub/subsub"
)
var SomeType *someType
type someType struct {
core.QObject
_ bool `property:"someBool,auto"`
_ string `property:"someString,auto"`
_ func(string) `signal:"someSignal,auto"`
_ func(string) `slot:"someSlot,auto"`
_ bool `property:"someBoolB"`
_ string `property:"someStringB"`
_ func(string) `signal:"someSignalB"`
_ func(string) `slot:"someSlotB"`
_ string `property:"someSubProp,->(subsubcustom.SubSubTestStructInstance.subsubProperty)"`
_ string `property:"someSubPropA,<-(subsubcustom.SubSubTestStructInstance.subsubProperty)"`
_ func(string) `signal:"someSignalC,->(subsubcustom.SubSubTestStructInstance.subPropertySignal)"`
_ func(string) `slot:"someSlotC,->(subsubcustom.SubSubTestStructInstance.subPropertySlot)"`
_ func(string) `signal:"SomeSignalD,<-(subsubcustom.SubSubTestStructInstance.subPropertySignal)"`
_ func(string) `slot:"SomeSlotD,<-(subsubcustom.SubSubTestStructInstance.subPropertySlot)"`
}
func (t *someType) isSomeBool() bool { return true }
func (t *someType) setSomeBool(bool) {}
func (t *someType) someBoolChanged(bool) {}
func (t *someType) someString() string { return "test" }
func (t *someType) setSomeString(string) {}
func (t *someType) someStringChanged(string) {}
func (t *someType) someSignal(string) {}
func (t *someType) someSlot(string) {}
type someOtherType struct {
core.QObject
_ func() `constructor:"init"`
_ bool `property:"someBool,->(SomeType)"`
_ string `property:"someString,->(SomeType)"`
_ bool `property:"someBoolA,->(SomeType.someBool)"`
_ string `property:"someStringA,->(SomeType.someString)"`
_ bool `property:"someBoolB,<-(SomeType)"`
_ string `property:"someStringB,<-(SomeType)"`
_ bool `property:"someBoolC,<-(SomeType.someBool)"`
_ string `property:"someStringC,<-(SomeType.someString)"`
_ func(string) `signal:"someSignal,->(SomeType)"`
_ func(string) `signal:"someSlot,->(SomeType)"`
_ func(string) `signal:"someSignalA,->(SomeType.someSignal)"`
_ func(string) `signal:"someSlotA,->(SomeType.someSlot)"`
_ func(string) `signal:"someSignalB,<-(SomeType)"`
_ func(string) `signal:"someSlotB,<-(SomeType)"`
_ func(string) `signal:"someSignalC,<-(SomeType.someSignal)"`
_ func(string) `signal:"someSlotC,<-(SomeType.someSlot)"`
}
func (t *someOtherType) init() { SomeType = NewSomeType(nil) }
func (t *someOtherType) someSignalB(string) {}
func (t *someOtherType) someSlotB(string) {}
func (t *someOtherType) someSignalC(string) {}
func (t *someOtherType) someSlotC(string) {}
type someOtherTypeOut struct {
core.QObject
_ func() `constructor:"init"`
_ bool `property:"someBool,->(this.c)"`
_ string `property:"someString,->(this.c)"`
_ bool `property:"someBoolA,->(this.c.someBool)"`
_ string `property:"someStringA,->(this.c.someString)"`
_ func(string) `signal:"someSignal,->(this.c)"`
_ func(string) `signal:"someSlot,->(this.c)"`
_ func(string) `signal:"someSignalA,->(this.c.someSignal)"`
_ func(string) `signal:"someSlotA,->(this.c.someSlot)"`
c *someType
}
func (t *someOtherTypeOut) init() { t.c = NewSomeType(nil) }
type someOtherTypeIn struct {
core.QObject
_ func() `constructor:"init"`
_ bool `property:"someBool,<-(this.c)"`
_ string `property:"someString,<-(this.c)"`
_ bool `property:"someBoolA,<-(this.c.someBool)"`
_ string `property:"someStringA,<-(this.c.someString)"`
_ func(string) `signal:"someSignal,<-(this.c)"`
_ func(string) `slot:"someSlot,<-(this.c)"`
_ func(string) `signal:"someSignalA,<-(this.c.someSignal)"`
_ func(string) `slot:"someSlotA,<-(this.c.someSlot)"`
_ func(string) `signal:"SomeSignalB,<-(this.c.someSignal)"`
_ func(string) `slot:"SomeSlotB,<-(this.c.someSlot)"`
c *someType
}
func (t *someOtherTypeIn) init() { t.c = NewSomeType(nil) }
func (t *someOtherTypeIn) someSignal(string) {}
func (t *someOtherTypeIn) someSlot(string) {}
func (t *someOtherTypeIn) someSignalA(string) {}
func (t *someOtherTypeIn) someSlotA(string) {}

View file

@ -2,16 +2,22 @@ package subsubcustom
import "github.com/therecipe/qt/gui"
var SubSubTestStructInstance *SubSubTestStruct
type SubSubTestStruct struct {
gui.QWindow
_ func() `constructor:"Init"`
_ func(string) `signal:"subPropertySignal"`
_ func(string) `slot:"subPropertySlot"`
_ string `property:"subsubProperty"`
SubSubConstructorProperty int
}
func (s *SubSubTestStruct) Init() {
SubSubTestStructInstance = s
s.SubSubConstructorProperty++
}

View file

@ -1,15 +1,16 @@
package setup
import (
"fmt"
"os/exec"
"runtime"
"strings"
"github.com/therecipe/qt/internal/binding/parser"
"github.com/therecipe/qt/internal/binding/templater"
"github.com/therecipe/qt/internal/utils"
"github.com/therecipe/qt/internal/cmd"
"github.com/therecipe/qt/internal/utils"
)
func Generate(target string, docker, vagrant bool) {
@ -42,5 +43,14 @@ func Generate(target string, docker, vagrant bool) {
} else {
templater.CgoTemplate(module, "", target, templater.MINIMAL, "", "") //TODO: collect errors
}
if utils.QT_DYNAMIC_SETUP() && mode == "full" {
cc, _ := templater.ParseCgo(strings.ToLower(module), target)
if cc != "" {
cmd := exec.Command("go", "tool", "cgo", utils.GoQtPkgPath(strings.ToLower(module), strings.ToLower(module)+".go"))
cmd.Dir = utils.GoQtPkgPath(strings.ToLower(module))
utils.RunCmdOptional(cmd, fmt.Sprintf("failed to run cgo for %v (%v) on %v", target, strings.ToLower(module), runtime.GOOS))
}
}
}
}

View file

@ -11,6 +11,8 @@ import (
"strings"
"github.com/therecipe/qt/internal/binding/parser"
"github.com/therecipe/qt/internal/binding/templater"
"github.com/therecipe/qt/internal/cmd"
"github.com/therecipe/qt/internal/utils"
)
@ -63,6 +65,20 @@ func Install(target string, docker, vagrant bool) {
}
utils.Log.Infof("installing %v qt/%v", mode, strings.ToLower(module))
if utils.QT_DYNAMIC_SETUP() && mode == "full" {
cc, com := templater.ParseCgo(strings.ToLower(module), target)
if cc != "" {
cmd := exec.Command(cc, strings.Split(com, " ")...)
cmd.Dir = utils.GoQtPkgPath(strings.ToLower(module))
utils.RunCmdOptional(cmd, fmt.Sprintf("failed to create dynamic lib for %v (%v) on %v", target, strings.ToLower(module), runtime.GOOS))
utils.RemoveAll(utils.GoQtPkgPath(strings.ToLower(module), strings.ToLower(module)+".cpp"))
utils.RemoveAll(utils.GoQtPkgPath(strings.ToLower(module), "_obj"))
templater.ReplaceCgo(strings.ToLower(module), target)
}
}
cmd := exec.Command("go", "install", "-p", strconv.Itoa(runtime.GOMAXPROCS(0)), "-v")
if len(tags) > 0 {
cmd.Args = append(cmd.Args, fmt.Sprintf("-tags=\"%v\"", strings.Join(tags, "\" \"")))

View file

@ -156,6 +156,7 @@ func Test(target string, docker, vagrant bool, vagrantsystem string) {
"",
vagrant,
vagrantsystem,
false,
)
}
}

View file

@ -29,7 +29,7 @@ type controller struct {
func (c *controller) init() {
Controller = c
c.SetLocked(true)
c.SetLocked(false) //TODO:
go c.loop()
}

View file

@ -13,16 +13,12 @@ type actionButtonTemplate struct {
_ func() `constructor:"init"`
_ func(string) `signal:"showDownload"`
_ func(string) `signal:"deleteRequest"`
_ func(string) `signal:"showDownload,->(controller.ActionButtonController)"`
_ func(string) `signal:"deleteRequest,->(controller.ActionButtonController)"`
}
func (t *actionButtonTemplate) init() {
c := controller.ActionButtonController
if c == nil {
c = controller.NewActionButtonController(nil)
if controller.ActionButtonController == nil {
controller.NewActionButtonController(nil)
}
t.ConnectShowDownload(c.ShowDownload)
t.ConnectDeleteRequest(c.DeleteRequest)
}

View file

@ -13,14 +13,11 @@ type buttonTemplate struct {
_ func() `constructor:"init"`
_ func(string) `signal:"clicked"`
_ func(string) `signal:"clicked,->(controller.ButtonController)"`
}
func (t *buttonTemplate) init() {
c := controller.ButtonController
if c == nil {
c = controller.NewButtonController(nil)
if controller.ButtonController == nil {
controller.NewButtonController(nil)
}
t.ConnectClicked(c.Clicked)
}

View file

@ -3,8 +3,8 @@ package controller
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/controller"
dcontroller "github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
maincontroller "github.com/therecipe/qt/internal/examples/showcases/sia/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
)
var ActionButtonController *actionButtonController
@ -14,19 +14,16 @@ type actionButtonController struct {
_ func() `constructor:"init"`
_ func(string) `signal:"showDownload"`
_ func(string) `signal:"deleteRequest"`
_ func(string) `signal:"showDownload,->(controller.Controller)"`
_ func(string) `signal:"deleteRequest,auto"`
}
func (c *actionButtonController) init() {
ActionButtonController = c
c.ConnectShowDownload(dcontroller.Controller.ShowDownload)
c.ConnectDeleteRequest(c.deleteRequest)
}
func (c *actionButtonController) deleteRequest(name string) {
err := controller.Client.RenterDeletePost(name)
err := maincontroller.Client.RenterDeletePost(name)
if err != nil {
println("Couldn't delete file:", err.Error())
}

View file

@ -3,7 +3,7 @@ package controller
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
)
var ButtonController *buttonController
@ -13,11 +13,9 @@ type buttonController struct {
_ func() `constructor:"init"`
_ func(string) `signal:"clicked"`
_ func(string) `signal:"clicked,->(controller.Controller.Show)"`
}
func (c *buttonController) init() {
ButtonController = c
c.ConnectClicked(controller.Controller.Show)
}

View file

@ -7,8 +7,8 @@ import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/controller"
vcontroller "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
maincontroller "github.com/therecipe/qt/internal/examples/showcases/sia/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
)
var Controller *dialogController
@ -20,30 +20,22 @@ type dialogController struct {
_ func(cident string) `signal:"show"`
_ func(string) `signal:"showDownload"`
_ func(bool) `signal:"blur"`
_ func(bool) `signal:"blur,->(controller.Controller)"`
_ func([]string) `signal:"uploadFiles"`
_ func(string) `signal:"uploadFolder"`
_ func(string, string) `signal:"download"`
_ func([]string) `signal:"uploadFiles,auto"`
_ func(string) `signal:"uploadFolder,auto"`
_ func(string, string) `signal:"download,auto"`
_ func() bool `slot:"isLocked"`
_ func() bool `slot:"isLocked,->(maincontroller.Controller)"`
}
func (c *dialogController) init() {
Controller = c
c.ConnectBlur(vcontroller.Controller.Blur)
c.ConnectUploadFiles(c.uploadFiles)
c.ConnectUploadFolder(c.uploadFolder)
c.ConnectDownload(c.download)
c.ConnectIsLocked(controller.Controller.IsLocked)
}
func (c *dialogController) uploadFiles(files []string) {
for _, f := range files {
go controller.Client.RenterUploadPost("/renter/upload/"+filepath.Base(f), "source="+f, 1, 1) //TODO: dataPieces, parityPieces ?
go maincontroller.Client.RenterUploadPost("/renter/upload/"+filepath.Base(f), "source="+f, 1, 1) //TODO: dataPieces, parityPieces ?
}
}
@ -68,7 +60,7 @@ func (c *dialogController) uploadFolder(source string) {
func (c *dialogController) download(name, path string) {
go func() {
err := controller.Client.RenterDownloadGet(name, path, 0, 1, true) //TODO: offset, lenght, async ?
err := maincontroller.Client.RenterDownloadGet(name, path, 0, 1, true) //TODO: offset, lenght, async ?
if err != nil {
println("Could not download file:", err.Error())
}

View file

@ -12,18 +12,14 @@ type filesDialogTemplate struct {
_ func() `constructor:"init"`
_ func(cident string) `signal:"show"`
_ func(bool) `signal:"blur"`
_ func(cident string) `signal:"show,<-(fcontroller.Controller)"`
_ func(bool) `signal:"blur,->(fcontroller.Controller)"`
}
func (t *filesDialogTemplate) init() {
c := fcontroller.Controller
if c == nil {
c = fcontroller.NewDialogController(nil)
if fcontroller.Controller == nil {
fcontroller.NewDialogController(nil)
}
c.ConnectShow(t.show)
t.ConnectBlur(c.Blur)
}
func (t *filesDialogTemplate) show(cident string) {

View file

@ -3,20 +3,13 @@ package dialog
import (
"github.com/therecipe/qt/widgets"
"github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
)
type filesUploadTemplate struct {
filesDialogTemplate
_ func() `constructor:"init"`
_ func([]string) `slot:"uploadFiles"`
}
func (t *filesUploadTemplate) init() {
t.ConnectUploadFiles(controller.Controller.UploadFiles)
t.ConnectShow(t.show)
_ func([]string) `slot:"uploadFiles,->(controller.Controller)"`
}
func (t *filesUploadTemplate) show(cident string) {

View file

@ -3,24 +3,16 @@ package dialog
import (
"github.com/therecipe/qt/widgets"
"github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/files/dialog/controller"
)
type folderUploadTemplate struct {
filesDialogTemplate
_ func() `constructor:"init"`
_ func(string) `signal:"uploadFolder,->(controller.Controller)"`
_ func(string) `signal:"uploadFolder"`
_ func(string, string) `signal:"download"`
}
func (t *folderUploadTemplate) init() {
t.ConnectUploadFolder(controller.Controller.UploadFolder)
t.ConnectShow(t.show)
t.ConnectDownload(controller.Controller.Download)
controller.Controller.ConnectShowDownload(t.showDownload)
_ func(string, string) `signal:"download,->(controller.Controller)"`
_ func(string) `signal:"showDownload,<-(controller.Controller)"`
}
func (t *folderUploadTemplate) show(cident string) {

View file

@ -21,7 +21,7 @@ type FilesModel struct {
_ func() `constructor:"init"`
_ func([]File) `signal:"updateWith"`
_ func([]File) `signal:"updateWith,auto"`
}
func (m *FilesModel) init() {
@ -34,7 +34,6 @@ func (m *FilesModel) init() {
m.ConnectColumnCount(func(*core.QModelIndex) int { return 4 }) //needed for sort filter model
m.ConnectData(m.data)
m.ConnectRoleNames(m.roleNames)
m.ConnectUpdateWith(m.updateWith)
}
func (m *FilesModel) rowCount(parent *core.QModelIndex) int {

View file

@ -15,13 +15,7 @@ var PathToSiac string
type terminalController struct {
core.QObject
_ func() `constructor:"init"`
_ func(cmd string) string `slot:"command"`
}
func (c *terminalController) init() {
c.ConnectCommand(c.command)
_ func(cmd string) string `slot:"command,auto"`
}
func (c *terminalController) command(cmd string) string {

View file

@ -3,7 +3,7 @@ package terminal
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/terminal/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/terminal/controller"
)
func init() { terminalTemplate_QmlRegisterType2("TerminalTemplate", 1, 0, "TerminalTemplate") }
@ -11,13 +11,5 @@ func init() { terminalTemplate_QmlRegisterType2("TerminalTemplate", 1, 0, "Termi
type terminalTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(cmd string) string `slot:"command"`
}
func (t *terminalTemplate) init() {
c := controller.NewTerminalController(nil)
t.ConnectCommand(c.Command)
_ func(cmd string) string `slot:"command,->(controller.NewTerminalController(nil))"`
}

View file

@ -2,63 +2,44 @@ package controller
import "github.com/therecipe/qt/core"
var Controller *themeController
var Controller *ThemeController
type themeController struct {
type ThemeController struct {
core.QObject
_ func() `constructor:"init"`
_ string `property:"name"`
_ string `property:"name,auto,changed"`
_ string `property:"accent"`
_ string `property:"nextAccent"`
_ string `property:"accent,auto,get"`
_ string `property:"nextAccent,auto,get"`
_ string `property:"background"`
_ string `property:"darkBackground"`
_ string `property:"background,auto,get"`
_ string `property:"darkBackground,auto,get"`
_ string `property:"walletTableHeader"`
_ string `property:"walletTableAlternate"`
_ string `property:"walletTableHighlight"`
_ string `property:"walletTableHeader,auto,get"`
_ string `property:"walletTableAlternate,auto,get"`
_ string `property:"walletTableHighlight,auto,get"`
_ string `property:"inputFieldBackground"`
_ string `property:"inputFieldBackground,auto,get"`
_ string `property:"font"`
_ string `property:"fontHighlight"`
_ string `property:"font,auto,get"`
_ string `property:"fontHighlight,auto,get"`
_ func() `signal:"change"`
_ func() `signal:"change,auto"`
_ func() `signal:"hide"`
}
func (c *themeController) init() {
func (c *ThemeController) init() {
Controller = c
c.ConnectNameChanged(c.nameChanged)
c.ConnectAccent(c.accent)
c.ConnectNextAccent(c.nextAccent)
c.ConnectBackground(c.background)
c.ConnectDarkBackground(c.darkBackground)
c.ConnectWalletTableHeader(c.walletTableHeader)
c.ConnectWalletTableAlternate(c.walletTableAlternate)
c.ConnectWalletTableHighlight(c.walletTableHighlight)
c.ConnectInputFieldBackground(c.inputFieldBackground)
c.ConnectFont(c.font)
c.ConnectFontHighlight(c.fontHighlight)
c.SetName("dark")
c.ConnectChange(c.change)
initColorDialog()
}
func (c *themeController) nameChanged(string) {
func (c *ThemeController) nameChanged(string) {
c.AccentChanged(c.Accent())
c.NextAccentChanged(c.NextAccent())
@ -75,7 +56,7 @@ func (c *themeController) nameChanged(string) {
c.FontHighlightChanged(c.FontHighlight())
}
func (c *themeController) accent() string {
func (c *ThemeController) accent() string {
if color := c.AccentDefault(); color != "" {
return color
}
@ -89,7 +70,7 @@ func (c *themeController) accent() string {
}
}
func (c *themeController) nextAccent() string {
func (c *ThemeController) nextAccent() string {
if color := c.NextAccentDefault(); color != "" {
return color
}
@ -103,7 +84,7 @@ func (c *themeController) nextAccent() string {
}
}
func (c *themeController) background() string {
func (c *ThemeController) background() string {
if color := c.BackgroundDefault(); color != "" {
return color
}
@ -117,7 +98,7 @@ func (c *themeController) background() string {
}
}
func (c *themeController) darkBackground() string {
func (c *ThemeController) darkBackground() string {
if color := c.DarkBackgroundDefault(); color != "" {
return color
}
@ -131,7 +112,7 @@ func (c *themeController) darkBackground() string {
}
}
func (c *themeController) walletTableHeader() string {
func (c *ThemeController) walletTableHeader() string {
if color := c.WalletTableHeaderDefault(); color != "" {
return color
}
@ -145,7 +126,7 @@ func (c *themeController) walletTableHeader() string {
}
}
func (c *themeController) walletTableAlternate() string {
func (c *ThemeController) walletTableAlternate() string {
if color := c.WalletTableAlternateDefault(); color != "" {
return color
}
@ -159,7 +140,7 @@ func (c *themeController) walletTableAlternate() string {
}
}
func (c *themeController) walletTableHighlight() string {
func (c *ThemeController) walletTableHighlight() string {
if color := c.WalletTableHighlightDefault(); color != "" {
return color
}
@ -173,7 +154,7 @@ func (c *themeController) walletTableHighlight() string {
}
}
func (c *themeController) inputFieldBackground() string {
func (c *ThemeController) inputFieldBackground() string {
if color := c.InputFieldBackgroundDefault(); color != "" {
return color
}
@ -187,7 +168,7 @@ func (c *themeController) inputFieldBackground() string {
}
}
func (c *themeController) font() string {
func (c *ThemeController) font() string {
if color := c.FontDefault(); color != "" {
return color
}
@ -201,7 +182,7 @@ func (c *themeController) font() string {
}
}
func (c *themeController) fontHighlight() string {
func (c *ThemeController) fontHighlight() string {
if color := c.FontHighlightDefault(); color != "" {
return color
}
@ -215,7 +196,7 @@ func (c *themeController) fontHighlight() string {
}
}
func (c *themeController) change() {
func (c *ThemeController) change() {
colorDialog.Show()
//TODO: there is no light theme yet
/*

View file

@ -13,52 +13,24 @@ type themeTemplate struct {
_ func() `constructor:"init"`
_ string `property:"accent"`
_ string `property:"nextAccent"`
_ string `property:"accent,<-(this.c)"`
_ string `property:"nextAccent,<-(this.c)"`
_ string `property:"background"`
_ string `property:"darkBackground"`
_ string `property:"background,<-(this.c)"`
_ string `property:"darkBackground,<-(this.c)"`
_ string `property:"walletTableHeader"`
_ string `property:"walletTableAlternate"`
_ string `property:"walletTableHighlight"`
_ string `property:"walletTableHeader,<-(this.c)"`
_ string `property:"walletTableAlternate,<-(this.c)"`
_ string `property:"walletTableHighlight,<-(this.c)"`
_ string `property:"inputFieldBackground"`
_ string `property:"inputFieldBackground,<-(this.c)"`
_ string `property:"font"`
_ string `property:"fontHighlight"`
_ string `property:"font,<-(this.c)"`
_ string `property:"fontHighlight,<-(this.c)"`
c *controller.ThemeController
}
func (t *themeTemplate) init() {
c := controller.NewThemeController(nil)
t.ConnectAccent(c.Accent)
c.ConnectAccentChanged(t.AccentChanged)
t.ConnectNextAccent(c.NextAccent)
c.ConnectNextAccentChanged(t.NextAccentChanged)
t.ConnectBackground(c.Background)
c.ConnectBackgroundChanged(t.BackgroundChanged)
t.ConnectDarkBackground(c.DarkBackground)
c.ConnectDarkBackgroundChanged(t.DarkBackgroundChanged)
t.ConnectWalletTableHeader(c.WalletTableHeader)
c.ConnectWalletTableHeaderChanged(t.WalletTableHeaderChanged)
t.ConnectWalletTableAlternate(c.WalletTableAlternate)
c.ConnectWalletTableAlternateChanged(t.WalletTableAlternateChanged)
t.ConnectWalletTableHighlight(c.WalletTableHighlight)
c.ConnectWalletTableHighlightChanged(t.WalletTableHighlightChanged)
t.ConnectInputFieldBackground(c.InputFieldBackground)
c.ConnectInputFieldBackgroundChanged(t.InputFieldBackgroundChanged)
t.ConnectFont(c.Font)
c.ConnectFontChanged(t.FontChanged)
t.ConnectFontHighlight(c.FontHighlight)
c.ConnectFontHighlightChanged(t.FontHighlightChanged)
t.c = controller.NewThemeController(nil)
}

View file

@ -3,7 +3,7 @@ package left
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
)
func init() { buttonTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "ButtonTemplate") }
@ -11,13 +11,5 @@ func init() { buttonTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "ButtonTempl
type buttonTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(string) `signal:"clicked"`
}
func (t *buttonTemplate) init() {
c := controller.NewButtonController(nil)
t.ConnectClicked(c.Clicked)
_ func(string) `signal:"clicked,->(controller.NewButtonController(nil))"`
}

View file

@ -9,12 +9,8 @@ import (
type buttonController struct {
core.QObject
_ func() `constructor:"init"`
_ func(code string) `signal:"clicked"`
_ func(code string) `signal:"clicked,auto"`
}
func (c *buttonController) init() {
//lazy binding to the view/stack controller
c.ConnectClicked(func(code string) { controller.StackController.Clicked(code) })
}
//lazy binding to the view/stack controller
func (c *buttonController) clicked(code string) { controller.StackController.Clicked(code) }

View file

@ -8,13 +8,7 @@ import (
type logoController struct {
core.QObject
_ func() `constructor:"init"`
_ func() `signal:"clicked"`
}
func (c *logoController) init() {
c.ConnectClicked(c.clicked)
_ func() `signal:"clicked,auto"`
}
func (c *logoController) clicked() {

View file

@ -12,29 +12,22 @@ import (
"github.com/therecipe/qt/internal/examples/showcases/sia/controller"
)
type progressBarController struct {
type ProgressBarController struct {
core.QObject
_ func() `constructor:"init"`
_ string `property:"text"`
_ float64 `property:"value"`
_ func() `signal:"clicked"`
_ func() `signal:"clicked,auto"`
_ func(types.BlockHeight) `signal:"heightChanged,<-(controller.Controller)"`
}
func (c *progressBarController) init() {
controller.Controller.ConnectHeightChanged(c.heightChanged)
c.ConnectClicked(c.clicked)
}
func (c *progressBarController) clicked() {
func (c *ProgressBarController) clicked() {
gui.QDesktopServices_OpenUrl(core.NewQUrl3("https://explore.sia.tech", 0))
}
func (c *progressBarController) heightChanged(height types.BlockHeight) {
func (c *ProgressBarController) heightChanged(height types.BlockHeight) {
if controller.Controller.IsSynced() {
c.SetText(fmt.Sprintf("BH: %v", controller.Controller.Height()))
c.SetValue(100)

View file

@ -3,7 +3,7 @@ package left
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
)
func init() { leftTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "LeftTemplate") }
@ -11,12 +11,5 @@ func init() { leftTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "LeftTemplate"
type leftTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(cident string) `signal:"clicked"`
}
func (t *leftTemplate) init() {
c := controller.NewLeftController(nil)
c.ConnectClicked(t.Clicked)
_ func(cident string) `signal:"Clicked,<-(controller.NewLeftController(nil))"`
}

View file

@ -3,7 +3,7 @@ package left
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/left/controller"
)
func init() { logoTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "LogoTemplate") }
@ -11,13 +11,5 @@ func init() { logoTemplate_QmlRegisterType2("LeftTemplate", 1, 0, "LogoTemplate"
type logoTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func() `signal:"clicked"`
}
func (t *logoTemplate) init() {
c := controller.NewLogoController(nil)
t.ConnectClicked(c.Clicked)
_ func() `signal:"clicked,->(controller.NewLogoController(nil))"`
}

View file

@ -13,20 +13,14 @@ type progressBarTemplate struct {
_ func() `constructor:"init"`
_ string `property:"text"`
_ float64 `property:"value"`
_ string `property:"text,<-(this.c)"`
_ float64 `property:"value,<-(this.c)"`
_ func() `signal:"clicked"`
_ func() `signal:"clicked,->(this.c)"`
c *controller.ProgressBarController
}
func (t *progressBarTemplate) init() {
c := controller.NewProgressBarController(nil)
t.ConnectText(c.Text)
c.ConnectTextChanged(t.TextChanged)
t.ConnectValue(c.Value)
c.ConnectValueChanged(t.ValueChanged)
t.ConnectClicked(c.Clicked)
t.c = controller.NewProgressBarController(nil)
}

View file

@ -3,7 +3,7 @@ package view
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
)
func init() { stackTemplate_QmlRegisterType2("ViewTemplate", 1, 0, "StackTemplate") }
@ -11,13 +11,5 @@ func init() { stackTemplate_QmlRegisterType2("ViewTemplate", 1, 0, "StackTemplat
type stackTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(code string) `signal:"clicked"`
}
func (t *stackTemplate) init() {
c := controller.NewStackController(nil)
c.ConnectClicked(t.Clicked)
_ func(code string) `signal:"Clicked,<-(controller.NewStackController(nil))"`
}

View file

@ -3,7 +3,7 @@ package top
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/top/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/top/controller"
)
func init() { colorTemplate_QmlRegisterType2("TopTemplate", 1, 0, "ColorTemplate") }
@ -11,13 +11,5 @@ func init() { colorTemplate_QmlRegisterType2("TopTemplate", 1, 0, "ColorTemplate
type colorTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func() `signal:"change"`
}
func (t *colorTemplate) init() {
c := controller.NewColorController(nil)
t.ConnectChange(c.Change)
_ func() `signal:"change,->(controller.NewColorController(nil))"`
}

View file

@ -9,12 +9,8 @@ import (
type colorController struct {
core.QObject
_ func() `constructor:"init"`
_ func() `signal:"change"`
_ func() `signal:"change,auto"`
}
func (c *colorController) init() {
//lazy binding to the (qml singleton) theme controller
c.ConnectChange(func() { controller.Controller.Change() })
}
//lazy binding to the (qml singleton) theme controller
func (c *colorController) change() { controller.Controller.Change() }

View file

@ -9,26 +9,15 @@ import (
dcontroller "github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
)
type lockController struct {
type LockController struct {
core.QObject
_ func() `constructor:"init"`
_ bool `property:"locked,<-(controller.Controller)"`
_ bool `property:"locked"`
_ func() `signal:"change"`
_ func() `signal:"change,auto"`
}
func (c *lockController) init() {
c.ConnectIsLocked(controller.Controller.IsLocked)
c.ConnectSetLocked(controller.Controller.SetLocked)
controller.Controller.ConnectLockedChanged(c.LockedChanged)
c.ConnectChange(c.change)
}
func (c *lockController) change() {
func (c *LockController) change() {
if c.IsLocked() {
dcontroller.Controller.Show("unlock")
} else {

View file

@ -10,13 +10,7 @@ import (
type searchController struct {
core.QObject
_ func() `constructor:"init"`
_ func(string) `signal:"search"`
}
func (c *searchController) init() {
c.ConnectSearch(c.search)
_ func(string) `signal:"search,auto"`
}
func (c *searchController) search(name string) {

View file

@ -9,23 +9,19 @@ import (
"github.com/NebulousLabs/Sia/node/api"
"github.com/NebulousLabs/Sia/types"
"github.com/therecipe/qt/internal/examples/showcases/sia/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/controller"
)
type statusController struct {
type StatusController struct {
core.QObject
_ func() `constructor:"init"`
_ string `property:"balance"`
_ string `property:"delta"`
_ func(interface{}) `signal:"wallet,<-(controller.Controller.WalletChanged)"`
}
func (c *statusController) init() {
controller.Controller.ConnectWalletChanged(c.wallet)
}
func (c *statusController) wallet(wgI interface{}) {
func (c *StatusController) wallet(wgI interface{}) {
wg := wgI.(api.WalletGET)
if wg.Unlocked {
confirmedFloat, _ := new(big.Rat).SetFrac(wg.ConfirmedSiacoinBalance.Big(), types.SiacoinPrecision.Big()).Float64()

View file

@ -4,10 +4,4 @@ import "github.com/therecipe/qt/core"
type topController struct {
core.QObject
_ func() `constructor:"init"`
}
func (c *topController) init() {
}

View file

@ -13,16 +13,13 @@ type lockTemplate struct {
_ func() `constructor:"init"`
_ bool `property:"locked"`
_ bool `property:"locked,<-(this.c)"`
_ func() `signal:"change"`
_ func() `signal:"change,->(this.c)"`
c *controller.LockController
}
func (t *lockTemplate) init() {
c := controller.NewLockController(nil)
t.ConnectIsLocked(c.IsLocked)
c.ConnectLockedChanged(t.LockedChanged)
t.ConnectChange(c.Change)
t.c = controller.NewLockController(nil)
}

View file

@ -3,7 +3,7 @@ package top
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/top/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/top/controller"
)
func init() { searchTemplate_QmlRegisterType2("TopTemplate", 1, 0, "SearchTemplate") }
@ -11,13 +11,5 @@ func init() { searchTemplate_QmlRegisterType2("TopTemplate", 1, 0, "SearchTempla
type searchTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(string) `signal:"search"`
}
func (t *searchTemplate) init() {
c := controller.NewSearchController(nil)
t.ConnectSearch(c.Search)
_ func(string) `signal:"search,->(controller.NewSearchController(nil))"`
}

View file

@ -13,16 +13,12 @@ type statusTemplate struct {
_ func() `constructor:"init"`
_ string `property:"balance"`
_ string `property:"delta"`
_ string `property:"balance,<-(this.c)"`
_ string `property:"delta,<-(this.c)"`
c *controller.StatusController
}
func (t *statusTemplate) init() {
c := controller.NewStatusController(nil)
t.ConnectBalance(c.Balance)
c.ConnectBalanceChanged(t.BalanceChanged)
t.ConnectDelta(c.Delta)
c.ConnectDeltaChanged(t.DeltaChanged)
t.c = controller.NewStatusController(nil)
}

View file

@ -6,10 +6,4 @@ func init() { topTemplate_QmlRegisterType2("TopTemplate", 1, 0, "TopTemplate") }
type topTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
}
func (t *topTemplate) init() {
}

View file

@ -3,7 +3,7 @@ package view
import (
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
)
func init() { viewTemplate_QmlRegisterType2("ViewTemplate", 1, 0, "ViewTemplate") }
@ -11,13 +11,5 @@ func init() { viewTemplate_QmlRegisterType2("ViewTemplate", 1, 0, "ViewTemplate"
type viewTemplate struct {
quick.QQuickItem
_ func() `constructor:"init"`
_ func(b bool) `signal:"blur"`
}
func (t *viewTemplate) init() {
c := controller.NewViewController(nil)
c.ConnectBlur(t.Blur)
_ func(b bool) `signal:"Blur,<-(controller.NewViewController(nil))"`
}

View file

@ -13,14 +13,11 @@ type buttonTemplate struct {
_ func() `constructor:"init"`
_ func(string) `signal:"clicked"`
_ func(string) `signal:"clicked,->(controller.ButtonController)"`
}
func (t *buttonTemplate) init() {
c := controller.ButtonController
if c == nil {
c = controller.NewButtonController(nil)
if controller.ButtonController == nil {
controller.NewButtonController(nil)
}
t.ConnectClicked(c.Clicked)
}

View file

@ -3,7 +3,7 @@ package controller
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
)
var ButtonController *buttonController
@ -13,11 +13,9 @@ type buttonController struct {
_ func() `constructor:"init"`
_ func(string) `signal:"clicked"`
_ func(string) `signal:"clicked,->(controller.Controller.Show)"`
}
func (c *buttonController) init() {
ButtonController = c
c.ConnectClicked(controller.Controller.Show)
}

View file

@ -15,33 +15,31 @@ import (
"github.com/therecipe/qt/internal/examples/showcases/sia/wallet/model"
)
var Controller *walletController
var Controller *WalletController
type walletController struct {
type WalletController struct {
core.QObject
_ func() `constructor:"init"`
_ *model.WalletModel `property:"model"`
_ func(ID string) `signal:"doubleClicked"`
_ func(ID string) `signal:"doubleClicked,auto"`
}
func (c *walletController) init() {
func (c *WalletController) init() {
Controller = c
c.SetModel(model.NewWalletModel(nil))
c.ConnectDoubleClicked(c.doubleClicked)
go c.loop()
}
func (c *walletController) doubleClicked(ID string) {
func (c *WalletController) doubleClicked(ID string) {
gui.QDesktopServices_OpenUrl(core.NewQUrl3(fmt.Sprintf("https://explore.sia.tech/hash.html?hash=%v", ID), 0))
}
func (c *walletController) loop() {
func (c *WalletController) loop() {
for range time.NewTicker(1 * time.Second).C {
wtg, err := controller.Client.WalletTransactionsGet(0, 10000000)

View file

@ -12,8 +12,8 @@ import (
"github.com/NebulousLabs/Sia/node/api"
"github.com/NebulousLabs/Sia/types"
"github.com/therecipe/qt/internal/examples/showcases/sia/controller"
vcontroller "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
maincontroller "github.com/therecipe/qt/internal/examples/showcases/sia/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/view/controller"
)
var Controller *dialogController
@ -24,31 +24,22 @@ type dialogController struct {
_ func() `constructor:"init"`
_ func(cident string) `signal:"show"`
_ func(bool) `signal:"blur"`
_ func(bool) `signal:"blur,->(controller.Controller)"`
_ func(password string) *core.QVariant `slot:"unlock"`
_ func() string `slot:"receive"`
_ func(amount, dest string) *core.QVariant `slot:"send"`
_ func(seed string) *core.QVariant `slot:"recover"`
_ func(password string) *core.QVariant `slot:"unlock,auto"`
_ func() string `slot:"receive,auto"`
_ func(amount, dest string) *core.QVariant `slot:"send,auto"`
_ func(seed string) *core.QVariant `slot:"recover,auto"`
_ func() bool `slot:"isLocked"`
_ func() bool `slot:"isLocked,->(maincontroller.Controller)"`
}
func (c *dialogController) init() {
Controller = c
c.ConnectBlur(vcontroller.Controller.Blur)
c.ConnectReceive(c.receive)
c.ConnectSend(c.send)
c.ConnectUnlock(c.unlock)
c.ConnectRecover(c.recover)
c.ConnectIsLocked(controller.Controller.IsLocked)
}
func (c *dialogController) receive() string {
wag, err := controller.Client.WalletAddressGet()
wag, err := maincontroller.Client.WalletAddressGet()
if err != nil {
println(err.Error())
return fmt.Sprintf("Could not get address: %v", err.Error())
@ -70,7 +61,7 @@ func (c *dialogController) send(amount, dest string) *core.QVariant {
b, _ := new(big.Int).SetString(hastings, 10)
var destH types.UnlockHash
destH.LoadString(dest)
_, errW := controller.Client.WalletSiacoinsPost(types.NewCurrency(b), destH)
_, errW := maincontroller.Client.WalletSiacoinsPost(types.NewCurrency(b), destH)
if errW != nil {
println(errW.Error())
return core.NewQVariant24([]*core.QVariant{core.NewQVariant11(false), core.NewQVariant14(fmt.Sprintf("Could not send siacoins: %v", errW.Error()))})
@ -80,19 +71,19 @@ func (c *dialogController) send(amount, dest string) *core.QVariant {
}
func (c *dialogController) unlock(password string) *core.QVariant {
err := controller.Client.WalletUnlockPost(password)
err := maincontroller.Client.WalletUnlockPost(password)
if err != nil {
println(err.Error())
return core.NewQVariant24([]*core.QVariant{core.NewQVariant11(false), core.NewQVariant14(fmt.Sprintf("Could not unlock your wallet: %v", err.Error()))})
}
controller.Controller.SetLocked(false)
maincontroller.Controller.SetLocked(false)
return core.NewQVariant24([]*core.QVariant{core.NewQVariant11(true)})
}
func (c *dialogController) recover(seed string) *core.QVariant {
var swp api.WalletSweepPOST
req, _ := controller.Client.NewRequest("POST", "/wallet/sweep/seed", strings.NewReader(fmt.Sprintf("seed=%s&dictionary=%s", seed, "english"))) //TODO:
req, _ := maincontroller.Client.NewRequest("POST", "/wallet/sweep/seed", strings.NewReader(fmt.Sprintf("seed=%s&dictionary=%s", seed, "english"))) //TODO:
res, err := http.DefaultClient.Do(req)
if err != nil {
println(err.Error())

View file

@ -11,18 +11,14 @@ type dialogTemplate struct {
_ func() `constructor:"init"`
_ func(cident string) `signal:"show"`
_ func(bool) `signal:"blur"`
_ func(cident string) `signal:"show,<-(controller.Controller)"`
_ func(bool) `signal:"blur,->(controller.Controller)"`
}
func (t *dialogTemplate) init() {
c := controller.Controller
if c == nil {
c = controller.NewDialogController(nil)
if controller.Controller == nil {
controller.NewDialogController(nil)
}
c.ConnectShow(t.show)
t.ConnectBlur(c.Blur)
}
func (t *dialogTemplate) show(cident string) {

View file

@ -9,15 +9,11 @@ func init() { receiveTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "ReceiveT
type receiveTemplate struct {
dialogTemplate
_ func() `constructor:"init"`
_ string `property:"address"`
}
func (t *receiveTemplate) init() {
t.ConnectShow(func(cident string) {
if cident == "receive" {
t.SetAddress(controller.Controller.Receive())
}
})
func (t *receiveTemplate) show(cident string) {
if cident == "receive" {
t.SetAddress(controller.Controller.Receive())
}
}

View file

@ -3,7 +3,7 @@ package dialog
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
)
func init() { recoverTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "RecoverTemplate") }
@ -11,11 +11,5 @@ func init() { recoverTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "RecoverT
type recoverTemplate struct {
dialogTemplate
_ func() `constructor:"init"`
_ func(string) *core.QVariant `slot:"recover"`
}
func (t *recoverTemplate) init() {
t.ConnectRecover(controller.Controller.Recover)
_ func(string) *core.QVariant `slot:"recover,->(controller.Controller)"`
}

View file

@ -3,7 +3,7 @@ package dialog
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
)
func init() { sendTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "SendTemplate") }
@ -11,11 +11,5 @@ func init() { sendTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "SendTemplat
type sendTemplate struct {
dialogTemplate
_ func() `constructor:"init"`
_ func(string, string) *core.QVariant `slot:"send"`
}
func (t *sendTemplate) init() {
t.ConnectSend(controller.Controller.Send)
_ func(string, string) *core.QVariant `slot:"send,->(controller.Controller)"`
}

View file

@ -3,7 +3,7 @@ package dialog
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
_ "github.com/therecipe/qt/internal/examples/showcases/sia/wallet/dialog/controller"
)
func init() { unlockTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "UnlockTemplate") }
@ -11,11 +11,5 @@ func init() { unlockTemplate_QmlRegisterType2("DialogTemplate", 1, 0, "UnlockTem
type unlockTemplate struct {
dialogTemplate
_ func() `constructor:"init"`
_ func(string) *core.QVariant `slot:"unlock"`
}
func (t *unlockTemplate) init() {
t.ConnectUnlock(controller.Controller.Unlock)
_ func(string) *core.QVariant `slot:"unlock,->(controller.Controller)"`
}

View file

@ -18,14 +18,13 @@ type WalletModel struct {
_ func() `constructor:"init"`
_ func([]Transaction) `signal:"updateWith"`
_ func([]Transaction) `signal:"updateWith,auto"`
}
func (m *WalletModel) init() {
m.ConnectRowCount(m.rowCount)
m.ConnectData(m.data)
m.ConnectRoleNames(m.roleNames)
m.ConnectUpdateWith(m.updateWith)
}
func (m *WalletModel) rowCount(parent *core.QModelIndex) int {

View file

@ -16,13 +16,13 @@ type walletTemplate struct {
_ *core.QAbstractTableModel `property:"WalletModel"`
_ func(string) `signal:"doubleClicked"`
_ func(string) `signal:"doubleClicked,->(this.c)"`
c *controller.WalletController
}
func (t *walletTemplate) init() {
c := controller.NewWalletController(nil)
t.c = controller.NewWalletController(nil)
t.SetWalletModel(c.Model())
t.ConnectDoubleClicked(c.DoubleClicked)
t.SetWalletModel(t.c.Model())
}

View file

@ -204,3 +204,7 @@ func GOARCH() string {
}
return runtime.GOARCH
}
func QT_DYNAMIC_SETUP() bool {
return os.Getenv("QT_DYNAMIC_SETUP") == "true"
}