summaryrefslogtreecommitdiff
path: root/common/plugin.go
diff options
context:
space:
mode:
Diffstat (limited to 'common/plugin.go')
-rw-r--r--common/plugin.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/common/plugin.go b/common/plugin.go
new file mode 100644
index 0000000..bfc9a68
--- /dev/null
+++ b/common/plugin.go
@@ -0,0 +1,69 @@
+package main
+
+/*
+ These code should be common to all gui plugins
+
+ There are some helper functions that are probably going to be
+ the same everywhere. Mostly due to handling the binary tree structure
+ and the channel communication
+
+ For now, it's just a symlink to the 'master' version in
+ ./toolkit/nocui/common.go
+*/
+
+import (
+ "reflect"
+ "strconv"
+
+ "go.wit.com/log"
+ "go.wit.com/gui/widget"
+)
+
+// searches the binary tree for a WidgetId
+func (n *node) findWidgetId(id int) *node {
+ if (n == nil) {
+ return nil
+ }
+
+ if n.WidgetId == id {
+ return n
+ }
+
+ for _, child := range n.children {
+ newN := child.findWidgetId(id)
+ if (newN != nil) {
+ return newN
+ }
+ }
+ return nil
+}
+
+func (n *node) doUserEvent() {
+ if (callback == nil) {
+ log.Log(ERROR, "doUserEvent() callback == nil", n.WidgetId)
+ return
+ }
+ var a widget.Action
+ a.WidgetId = n.WidgetId
+ a.Value = n.value
+ a.ActionType = widget.User
+ log.Log(INFO, "doUserEvent() START: send a user event to the callback channel")
+ callback <- a
+ log.Log(INFO, "doUserEvent() END: sent a user event to the callback channel")
+ return
+}
+
+// Other goroutines must use this to access the GUI
+//
+// You can not acess / process the GUI thread directly from
+// other goroutines. This is due to the nature of how
+// Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
+//
+// this sets the channel to send user events back from the plugin
+func Callback(guiCallback chan widget.Action) {
+ callback = guiCallback
+}
+
+func PluginChannel() chan widget.Action {
+ return pluginChan
+}