| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- // Copyright 2018 visualfc. All rights reserved.
- package tk
- import (
- "fmt"
- "log"
- "runtime"
- "github.com/visualfc/atk/tk/interp"
- )
- var (
- tkHasInit bool
- tkWindowInitAutoHide bool
- mainInterp *interp.Interp
- rootWindow *Window
- fnErrorHandle func(error) = func(err error) {
- log.Println(err)
- }
- )
- func Init() error {
- return InitEx(true, "", "")
- }
- func InitEx(tk_window_init_hide bool, tcl_library string, tk_library string) (err error) {
- mainInterp, err = interp.NewInterp()
- if err != nil {
- dumpError(err)
- return err
- }
- err = mainInterp.InitTcl(tcl_library)
- if err != nil {
- dumpError(err)
- return err
- }
- err = mainInterp.InitTk(tk_library)
- if err != nil {
- dumpError(err)
- return err
- }
- tkWindowInitAutoHide = tk_window_init_hide
- //hide console for macOS bundle
- mainInterp.Eval("if {[info commands console] == \"console\"} {console hide}")
- for _, fn := range init_func_list {
- fn()
- }
- rootWindow = &Window{}
- rootWindow.Attach(".")
- if tkWindowInitAutoHide {
- rootWindow.Hide()
- }
- //hide wish menu on macos
- rootWindow.SetMenu(NewMenu(nil))
- tkHasInit = true
- return nil
- }
- var (
- init_func_list []func()
- )
- func registerInit(fn func()) {
- init_func_list = append(init_func_list, fn)
- }
- func SetErrorHandle(fn func(error)) {
- fnErrorHandle = fn
- }
- func MainInterp() *interp.Interp {
- return mainInterp
- }
- func TclVersion() (ver string) {
- return mainInterp.TclVersion()
- }
- func TkVersion() (ver string) {
- return mainInterp.TkVersion()
- }
- func TclLibary() (path string) {
- path, _ = evalAsString("set tcl_library")
- return
- }
- func TkLibrary() (path string) {
- path, _ = evalAsString("set tk_library")
- return
- }
- func init() {
- runtime.LockOSThread()
- }
- func MainLoop(fn func()) error {
- if !tkHasInit {
- err := Init()
- if err != nil {
- dumpError(err)
- return err
- }
- }
- interp.MainLoop(fn)
- return nil
- }
- func Async(fn func()) {
- interp.Async(fn)
- }
- func Update() {
- eval("update")
- }
- func Quit() {
- Async(func() {
- DestroyWidget(rootWindow)
- })
- }
- func eval(script string) error {
- err := mainInterp.Eval(script)
- if err != nil {
- dumpError(fmt.Errorf("script: %q, error: %q", script, err))
- }
- return err
- }
- func evalEx(script string, dump bool) error {
- err := mainInterp.Eval(script)
- if dump && err != nil {
- dumpError(err)
- }
- return err
- }
- func evalAsString(script string) (string, error) {
- r, err := mainInterp.EvalAsString(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsStringEx(script string, dump bool) (string, error) {
- r, err := mainInterp.EvalAsString(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsInt(script string) (int, error) {
- r, err := mainInterp.EvalAsInt(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsIntEx(script string, dump bool) (int, error) {
- r, err := mainInterp.EvalAsInt(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsUint(script string) (uint, error) {
- r, err := mainInterp.EvalAsUint(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsUintEx(script string, dump bool) (uint, error) {
- r, err := mainInterp.EvalAsUint(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsFloat64(script string) (float64, error) {
- r, err := mainInterp.EvalAsFloat64(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsFloat64Ex(script string, dump bool) (float64, error) {
- r, err := mainInterp.EvalAsFloat64(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsBool(script string) (bool, error) {
- r, err := mainInterp.EvalAsBool(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsBoolEx(script string, dump bool) (bool, error) {
- r, err := mainInterp.EvalAsBool(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsStringList(script string) ([]string, error) {
- r, err := mainInterp.EvalAsStringList(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsStringListEx(script string, dump bool) ([]string, error) {
- r, err := mainInterp.EvalAsStringList(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsIntList(script string) ([]int, error) {
- r, err := mainInterp.EvalAsIntList(script)
- if err != nil {
- dumpError(err)
- }
- return r, err
- }
- func evalAsIntListEx(script string, dump bool) ([]int, error) {
- r, err := mainInterp.EvalAsIntList(script)
- if dump && err != nil {
- dumpError(err)
- }
- return r, err
- }
- func dumpError(err error) {
- if fnErrorHandle != nil {
- fnErrorHandle(fmt.Errorf("%v", err))
- }
- }
- func setObjText(obj string, text string) {
- mainInterp.SetStringVar(obj, text, false)
- }
- func setObjTextList(obj string, list []string) {
- mainInterp.SetStringList(obj, list, false)
- }
|