コード例 #1
0
ファイル: splitter_bar.go プロジェクト: nelsam/gxui
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
}
コード例 #2
0
ファイル: textbox.go プロジェクト: nelsam/gxui
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.horizScroll = theme.CreateScrollBar()
	t.horizScrollChild = t.AddChild(t.horizScroll)
	t.horizScroll.SetOrientation(gxui.Horizontal)
	t.horizScroll.OnScroll(func(from, to int) {
		t.SetHorizOffset(from)
	})

	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)
}
コード例 #3
0
ファイル: scroll_bar.go プロジェクト: nelsam/gxui
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)
}
コード例 #4
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseDown() gxui.Event {
	if m.onMouseDown == nil {
		m.onMouseDown = gxui.CreateEvent(m.MouseDown)
	}
	return m.onMouseDown
}
コード例 #5
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseExit() gxui.Event {
	if m.onMouseExit == nil {
		m.onMouseExit = gxui.CreateEvent(m.MouseExit)
	}
	return m.onMouseExit
}
コード例 #6
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseEnter() gxui.Event {
	if m.onMouseEnter == nil {
		m.onMouseEnter = gxui.CreateEvent(m.MouseEnter)
	}
	return m.onMouseEnter
}
コード例 #7
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseMove() gxui.Event {
	if m.onMouseMove == nil {
		m.onMouseMove = gxui.CreateEvent(m.MouseMove)
	}
	return m.onMouseMove
}
コード例 #8
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnKeyStroke() gxui.Event {
	if m.onKeyStroke == nil {
		m.onKeyStroke = gxui.CreateEvent(m.KeyStroke)
	}
	return m.onKeyStroke
}
コード例 #9
0
ファイル: window.go プロジェクト: nelsam/gxui
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)
}
コード例 #10
0
ファイル: viewport.go プロジェクト: nelsam/gxui
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(clearColorR, clearColorG, clearColorB, 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(clearColorR, clearColorG, clearColorB, 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
}
コード例 #11
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnKeyRepeat() gxui.Event {
	if m.onKeyRepeat == nil {
		m.onKeyRepeat = gxui.CreateEvent(m.KeyRepeat)
	}
	return m.onKeyRepeat
}
コード例 #12
0
ファイル: list.go プロジェクト: nelsam/gxui
func (l *List) OnSelectionChanged(f func(gxui.AdapterItem)) gxui.EventSubscription {
	if l.onItemClicked == nil {
		l.onSelectionChanged = gxui.CreateEvent(f)
	}
	return l.onSelectionChanged.Listen(f)
}
コード例 #13
0
ファイル: attachable.go プロジェクト: nelsam/gxui
func (a *Attachable) OnDetach(f func()) gxui.EventSubscription {
	if a.onDetach == nil {
		a.onDetach = gxui.CreateEvent(func() {})
	}
	return a.onDetach.Listen(f)
}
コード例 #14
0
ファイル: focusable.go プロジェクト: nelsam/gxui
func (f *Focusable) OnLostFocus(l func()) gxui.EventSubscription {
	if f.onLostFocus == nil {
		f.onLostFocus = gxui.CreateEvent(f.LostFocus)
	}
	return f.onLostFocus.Listen(l)
}
コード例 #15
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseUp() gxui.Event {
	if m.onMouseUp == nil {
		m.onMouseUp = gxui.CreateEvent(m.MouseUp)
	}
	return m.onMouseUp
}
コード例 #16
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnDoubleClick() gxui.Event {
	if m.onDoubleClick == nil {
		m.onDoubleClick = gxui.CreateEvent(m.DoubleClick)
	}
	return m.onDoubleClick
}
コード例 #17
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnMouseScroll() gxui.Event {
	if m.onMouseScroll == nil {
		m.onMouseScroll = gxui.CreateEvent(m.MouseScroll)
	}
	return m.onMouseScroll
}
コード例 #18
0
ファイル: input_event_handler.go プロジェクト: nelsam/gxui
func (m *InputEventHandler) getOnKeyPress() gxui.Event {
	if m.onKeyPress == nil {
		m.onKeyPress = gxui.CreateEvent(m.KeyPress)
	}
	return m.onKeyPress
}
コード例 #19
0
ファイル: drop_down_list.go プロジェクト: nelsam/gxui
func (l *DropDownList) OnHideList(f func()) gxui.EventSubscription {
	if l.onHideList == nil {
		l.onHideList = gxui.CreateEvent(f)
	}
	return l.onHideList.Listen(f)
}
コード例 #20
0
ファイル: tree_to_list_node.go プロジェクト: nelsam/gxui
// 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)
}