func (b *SplitterBar) Init(outer SplitterBarOuter, theme gxui.Theme) { b.Control.Init(outer, theme) b.outer = outer b.theme = theme b.onDragStart = gxui.CreateEvent(func(gxui.MouseEvent) {}) b.onDragEnd = gxui.CreateEvent(func(gxui.MouseEvent) {}) b.backgroundColor = gxui.Red b.foregroundColor = gxui.Green }
func (t *TextBox) Init(outer TextBoxOuter, driver gxui.Driver, theme gxui.Theme, font gxui.Font) { t.List.Init(outer, theme) t.Focusable.Init(outer) t.outer = outer t.driver = driver t.font = font t.onRedrawLines = gxui.CreateEvent(func() {}) t.controller = gxui.CreateTextBoxController() t.adapter = &TextBoxAdapter{TextBox: t} t.desiredWidth = 100 t.SetScrollBarEnabled(false) // Defaults to single line t.OnGainedFocus(func() { t.onRedrawLines.Fire() }) t.OnLostFocus(func() { t.onRedrawLines.Fire() }) t.controller.OnTextChanged(func([]gxui.TextBoxEdit) { t.onRedrawLines.Fire() t.List.DataChanged(false) }) t.controller.OnSelectionChanged(func() { t.onRedrawLines.Fire() }) t.List.SetAdapter(t.adapter) // Interface compliance test _ = gxui.TextBox(t) }
func (s *ScrollBar) Init(outer ScrollBarOuter, theme gxui.Theme) { s.Control.Init(outer, theme) s.outer = outer s.thickness = 10 s.minBarLength = 10 s.scrollPositionFrom = 0 s.scrollPositionTo = 100 s.scrollLimit = 100 s.onScroll = gxui.CreateEvent(s.SetScrollPosition) // Interface compliance test _ = gxui.ScrollBar(s) }
func (m *InputEventHandler) getOnMouseScroll() gxui.Event { if m.onMouseScroll == nil { m.onMouseScroll = gxui.CreateEvent(m.MouseScroll) } return m.onMouseScroll }
func (m *InputEventHandler) getOnMouseUp() gxui.Event { if m.onMouseUp == nil { m.onMouseUp = gxui.CreateEvent(m.MouseUp) } return m.onMouseUp }
func (f *Focusable) OnLostFocus(l func()) gxui.EventSubscription { if f.onLostFocus == nil { f.onLostFocus = gxui.CreateEvent(f.LostFocus) } return f.onLostFocus.Listen(l) }
func newViewport(driver *driver, width, height int, title string, fullscreen bool) *viewport { v := &viewport{ fullscreen: fullscreen, scaling: 1, title: title, } glfw.DefaultWindowHints() glfw.WindowHint(glfw.Samples, 4) var monitor *glfw.Monitor if fullscreen { monitor = glfw.GetPrimaryMonitor() if width == 0 || height == 0 { vm := monitor.GetVideoMode() width, height = vm.Width, vm.Height } } wnd, err := glfw.CreateWindow(width, height, v.title, monitor, nil) if err != nil { panic(err) } width, height = wnd.GetSize() // At this time, width and height serve as a "hint" for glfw.CreateWindow, so get actual values from window. wnd.MakeContextCurrent() v.context = newContext() cursorPoint := func(x, y float64) math.Point { // HACK: xpos is off by 1 and ypos is off by 3 on OSX. // Compensate until real fix is found. x -= 1.0 y -= 3.0 return math.Point{X: int(x), Y: int(y)}.ScaleS(1 / v.scaling) } wnd.SetCloseCallback(func(*glfw.Window) { v.Close() }) wnd.SetPosCallback(func(w *glfw.Window, x, y int) { v.Lock() v.position = math.NewPoint(x, y) v.Unlock() }) wnd.SetSizeCallback(func(_ *glfw.Window, w, h int) { v.Lock() v.sizeDipsUnscaled = math.Size{W: w, H: h} v.sizeDips = v.sizeDipsUnscaled.ScaleS(1 / v.scaling) v.Unlock() v.onResize.Fire() }) wnd.SetFramebufferSizeCallback(func(_ *glfw.Window, w, h int) { v.Lock() v.sizePixels = math.Size{W: w, H: h} v.Unlock() gl.Viewport(0, 0, w, h) gl.ClearColor(kClearColorR, kClearColorG, kClearColorB, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) }) wnd.SetCursorPosCallback(func(w *glfw.Window, x, y float64) { p := cursorPoint(w.GetCursorPos()) v.Lock() if v.pendingMouseMoveEvent == nil { v.pendingMouseMoveEvent = &gxui.MouseEvent{} driver.Call(func() { v.Lock() ev := *v.pendingMouseMoveEvent v.pendingMouseMoveEvent = nil v.Unlock() v.onMouseMove.Fire(ev) }) } v.pendingMouseMoveEvent.Point = p v.pendingMouseMoveEvent.State = getMouseState(w) v.Unlock() }) wnd.SetCursorEnterCallback(func(w *glfw.Window, entered bool) { p := cursorPoint(w.GetCursorPos()) ev := gxui.MouseEvent{ Point: p, } ev.State = getMouseState(w) if entered { v.onMouseEnter.Fire(ev) } else { v.onMouseExit.Fire(ev) } }) wnd.SetScrollCallback(func(w *glfw.Window, xoff, yoff float64) { p := cursorPoint(w.GetCursorPos()) v.Lock() if v.pendingMouseScrollEvent == nil { v.pendingMouseScrollEvent = &gxui.MouseEvent{} driver.Call(func() { v.Lock() ev := *v.pendingMouseScrollEvent v.pendingMouseScrollEvent = nil ev.ScrollX, ev.ScrollY = int(v.scrollAccumX), int(v.scrollAccumY) if ev.ScrollX != 0 || ev.ScrollY != 0 { v.scrollAccumX -= float64(ev.ScrollX) v.scrollAccumY -= float64(ev.ScrollY) v.Unlock() v.onMouseScroll.Fire(ev) } else { v.Unlock() } }) } v.pendingMouseScrollEvent.Point = p v.scrollAccumX += xoff * platform.ScrollSpeed v.scrollAccumY += yoff * platform.ScrollSpeed v.pendingMouseScrollEvent.State = getMouseState(w) v.Unlock() }) wnd.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) { p := cursorPoint(w.GetCursorPos()) ev := gxui.MouseEvent{ Point: p, Modifier: translateKeyboardModifier(mod), } ev.Button = translateMouseButton(button) ev.State = getMouseState(w) if action == glfw.Press { v.onMouseDown.Fire(ev) } else { v.onMouseUp.Fire(ev) } }) wnd.SetKeyCallback(func(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { ev := gxui.KeyboardEvent{ Key: translateKeyboardKey(key), Modifier: translateKeyboardModifier(mods), } switch action { case glfw.Press: v.onKeyDown.Fire(ev) case glfw.Release: v.onKeyUp.Fire(ev) case glfw.Repeat: v.onKeyRepeat.Fire(ev) } }) wnd.SetCharModsCallback(func(w *glfw.Window, char rune, mods glfw.ModifierKey) { if !unicode.IsControl(char) && !unicode.IsGraphic(char) && !unicode.IsLetter(char) && !unicode.IsMark(char) && !unicode.IsNumber(char) && !unicode.IsPunct(char) && !unicode.IsSpace(char) && !unicode.IsSymbol(char) { return // Weird unicode character. Ignore } ev := gxui.KeyStrokeEvent{ Character: char, Modifier: translateKeyboardModifier(mods), } v.onKeyStroke.Fire(ev) }) wnd.SetRefreshCallback(func(w *glfw.Window) { if v.canvas != nil { v.render() } }) fw, fh := wnd.GetFramebufferSize() posX, posY := wnd.GetPos() // Pre-multiplied alpha blending gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA) gl.Enable(gl.BLEND) gl.Enable(gl.SCISSOR_TEST) gl.Viewport(0, 0, fw, fh) gl.Scissor(0, 0, int32(fw), int32(fh)) gl.ClearColor(kClearColorR, kClearColorG, kClearColorB, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) wnd.SwapBuffers() v.window = wnd v.driver = driver v.onClose = driver.createAppEvent(func() {}) v.onResize = driver.createAppEvent(func() {}) v.onMouseMove = gxui.CreateEvent(func(gxui.MouseEvent) {}) v.onMouseEnter = driver.createAppEvent(func(gxui.MouseEvent) {}) v.onMouseExit = driver.createAppEvent(func(gxui.MouseEvent) {}) v.onMouseDown = driver.createAppEvent(func(gxui.MouseEvent) {}) v.onMouseUp = driver.createAppEvent(func(gxui.MouseEvent) {}) v.onMouseScroll = gxui.CreateEvent(func(gxui.MouseEvent) {}) v.onKeyDown = driver.createAppEvent(func(gxui.KeyboardEvent) {}) v.onKeyUp = driver.createAppEvent(func(gxui.KeyboardEvent) {}) v.onKeyRepeat = driver.createAppEvent(func(gxui.KeyboardEvent) {}) v.onKeyStroke = driver.createAppEvent(func(gxui.KeyStrokeEvent) {}) v.onDestroy = driver.createDriverEvent(func() {}) v.sizeDipsUnscaled = math.Size{W: width, H: height} v.sizeDips = v.sizeDipsUnscaled.ScaleS(1 / v.scaling) v.sizePixels = math.Size{W: fw, H: fh} v.position = math.Point{X: posX, Y: posY} return v }
func (a *Attachable) OnDetach(f func()) gxui.EventSubscription { if a.onDetach == nil { a.onDetach = gxui.CreateEvent(func() {}) } return a.onDetach.Listen(f) }
func (m *InputEventHandler) getOnMouseMove() gxui.Event { if m.onMouseMove == nil { m.onMouseMove = gxui.CreateEvent(m.MouseMove) } return m.onMouseMove }
func (m *InputEventHandler) getOnKeyStroke() gxui.Event { if m.onKeyStroke == nil { m.onKeyStroke = gxui.CreateEvent(m.KeyStroke) } return m.onKeyStroke }
func (m *InputEventHandler) getOnKeyPress() gxui.Event { if m.onKeyPress == nil { m.onKeyPress = gxui.CreateEvent(m.KeyPress) } return m.onKeyPress }
func (m *InputEventHandler) getOnDoubleClick() gxui.Event { if m.onDoubleClick == nil { m.onDoubleClick = gxui.CreateEvent(m.DoubleClick) } return m.onDoubleClick }
func (m *InputEventHandler) getOnKeyRepeat() gxui.Event { if m.onKeyRepeat == nil { m.onKeyRepeat = gxui.CreateEvent(m.KeyRepeat) } return m.onKeyRepeat }
func (w *Window) Init(outer WindowOuter, driver gxui.Driver, width, height int, title string) { w.Attachable.Init(outer) w.BackgroundBorderPainter.Init(outer) w.Container.Init(outer) w.Paddable.Init(outer) w.PaintChildren.Init(outer) w.outer = outer w.driver = driver w.onClose = gxui.CreateEvent(func() {}) w.onResize = gxui.CreateEvent(func() {}) w.onMouseMove = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onMouseEnter = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onMouseExit = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onMouseDown = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onMouseUp = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onMouseScroll = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onKeyDown = gxui.CreateEvent(func(gxui.KeyboardEvent) {}) w.onKeyUp = gxui.CreateEvent(func(gxui.KeyboardEvent) {}) w.onKeyRepeat = gxui.CreateEvent(func(gxui.KeyboardEvent) {}) w.onKeyStroke = gxui.CreateEvent(func(gxui.KeyStrokeEvent) {}) w.onClick = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.onDoubleClick = gxui.CreateEvent(func(gxui.MouseEvent) {}) w.focusController = gxui.CreateFocusController(outer) w.mouseController = gxui.CreateMouseController(outer, w.focusController) w.keyboardController = gxui.CreateKeyboardController(outer) w.onResize.Listen(func() { w.outer.LayoutChildren() w.Draw() }) w.SetBorderPen(gxui.TransparentPen) w.setViewport(driver.CreateWindowedViewport(width, height, title)) // Window starts shown w.Attach() // Interface compliance test _ = gxui.Window(w) }
func (l *DropDownList) OnHideList(f func()) gxui.EventSubscription { if l.onHideList == nil { l.onHideList = gxui.CreateEvent(f) } return l.onHideList.Listen(f) }
func (m *InputEventHandler) getOnMouseEnter() gxui.Event { if m.onMouseEnter == nil { m.onMouseEnter = gxui.CreateEvent(m.MouseEnter) } return m.onMouseEnter }
func (m *InputEventHandler) getOnMouseExit() gxui.Event { if m.onMouseExit == nil { m.onMouseExit = gxui.CreateEvent(m.MouseExit) } return m.onMouseExit }
func (l *List) OnSelectionChanged(f func(gxui.AdapterItem)) gxui.EventSubscription { if l.onItemClicked == nil { l.onSelectionChanged = gxui.CreateEvent(f) } return l.onSelectionChanged.Listen(f) }
func (m *InputEventHandler) getOnMouseDown() gxui.Event { if m.onMouseDown == nil { m.onMouseDown = gxui.CreateEvent(m.MouseDown) } return m.onMouseDown }
// OnChange registers f to be called when the node is expanded, collapsed or has // a change in the number of children. func (n *TreeToListNode) OnChange(f func()) gxui.EventSubscription { if n.onChange == nil { n.onChange = gxui.CreateEvent(f) } return n.onChange.Listen(f) }
func (n *TreeInternalNode) OnExpandedChanged(f func(bool)) gxui.EventSubscription { if n.onExpandChanged == nil { n.onExpandChanged = gxui.CreateEvent(func(bool) {}) } return n.onExpandChanged.Listen(f) }