first
This commit is contained in:
commit
1fd13fa66f
10
go.mod
Normal file
10
go.mod
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
module git.dummkopf.live/InventorX/pinwindows
|
||||||
|
|
||||||
|
go 1.22.2
|
||||||
|
|
||||||
|
require github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa // indirect
|
||||||
|
golang.org/x/sys v0.14.0 // indirect
|
||||||
|
)
|
6
go.sum
Normal file
6
go.sum
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa h1:Ik7QikRgeH+bFOfAcMpttCbs6XxWXxCLXMm4awxtOXk=
|
||||||
|
github.com/ebitengine/purego v0.6.0-alpha.1.0.20231122024802-192c5e846faa/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
||||||
|
github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6 h1:mNKFgLZIU0eEHKHjb7Uk9ZuSy65DdgmEf2xxum0Tof4=
|
||||||
|
github.com/gen2brain/raylib-go/raylib v0.0.0-20240418150228-9548fadb54e6/go.mod h1:P/hDjVwz/9fhR0ww3+umzDpDA7Bf7Tce4xNChHIEFqE=
|
||||||
|
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||||
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
7
other.go
Normal file
7
other.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package pinwindows
|
||||||
|
|
||||||
|
import rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
|
|
||||||
|
func DrawTextureFlipped(rentex *rl.Texture2D, posx, posy int32) {
|
||||||
|
rl.DrawTexturePro(*rentex, rl.NewRectangle(0, 0, float32(rentex.Width), -float32(rentex.Height)), rl.NewRectangle(float32(posx), float32(posy), float32(rentex.Width), float32(rentex.Height)), rl.NewVector2(0, 0), 0, rl.White)
|
||||||
|
}
|
101
window.go
Normal file
101
window.go
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
package pinwindows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RayGuiWindow struct {
|
||||||
|
Texture *rl.RenderTexture2D
|
||||||
|
X int32
|
||||||
|
Y int32
|
||||||
|
W int32
|
||||||
|
H int32
|
||||||
|
DrawBorder bool
|
||||||
|
DrawFunc windowdrawfunc
|
||||||
|
ManageFunc managewindowfunc
|
||||||
|
AcceptingInput bool
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
WINDOW_MODE_DRAG = iota
|
||||||
|
WINDOW_MODE_RESZIE = iota
|
||||||
|
WINDOW_MODE_NORMAL = iota
|
||||||
|
|
||||||
|
WINDOW_NO_EVENT = -1
|
||||||
|
)
|
||||||
|
|
||||||
|
type windowdrawfunc func(*RayGuiWindow)
|
||||||
|
|
||||||
|
func NewRayGuiWindow(x, y, w, h int) RayGuiWindow {
|
||||||
|
texture := rl.LoadRenderTexture(int32(w), int32(h))
|
||||||
|
|
||||||
|
return RayGuiWindow{Texture: &texture, X: int32(x), Y: int32(y), W: int32(w), H: int32(h), DrawBorder: true, AcceptingInput: false}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (win *RayGuiWindow) Resize(x, y int) {
|
||||||
|
rl.UnloadRenderTexture(*win.Texture)
|
||||||
|
win.W += int32(x)
|
||||||
|
win.H += int32(y)
|
||||||
|
*win.Texture = rl.LoadRenderTexture(int32(win.W), int32(win.H))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (win *RayGuiWindow) DidStartMoveDrag() bool {
|
||||||
|
if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, -20, float32(win.W), 20)) {
|
||||||
|
if rl.IsMouseButtonPressed(rl.MouseButtonLeft) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (win *RayGuiWindow) DidStartResizeDrag() bool {
|
||||||
|
if win.IsTouchingRegion(rl.GetMousePosition(), rl.NewRectangle(0, 0, float32(win.W), float32(win.H))) {
|
||||||
|
if rl.IsMouseButtonPressed(rl.MouseButtonRight) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window *RayGuiWindow) isLeftClicked() bool {
|
||||||
|
return rl.IsMouseButtonPressed(rl.MouseButtonLeft) && rl.CheckCollisionPointRec(rl.GetMousePosition(), rl.NewRectangle(float32(window.X), float32(window.Y-20), float32(window.W), float32(window.H+20)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window *RayGuiWindow) BeginDrawMode() {
|
||||||
|
rl.BeginTextureMode(*window.Texture)
|
||||||
|
if window.AcceptingInput {
|
||||||
|
rl.SetMouseOffset(int(-window.X), int(-window.Y))
|
||||||
|
} else {
|
||||||
|
rl.SetMouseOffset(-1000000, -1000000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window *RayGuiWindow) EndDrawMode() {
|
||||||
|
rl.SetMouseOffset(0, 0)
|
||||||
|
rl.EndTextureMode()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window RayGuiWindow) IsTouchingRegion(posvec rl.Vector2, rect rl.Rectangle) bool {
|
||||||
|
|
||||||
|
if rl.CheckCollisionPointRec(posvec, rl.Rectangle{X: rect.X + float32(window.X), Y: rect.Y + float32(window.Y), Width: rect.Width, Height: rect.Height}) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window *RayGuiWindow) Draw() {
|
||||||
|
rl.DrawRectangle(window.X, window.Y-20, window.W, 20, rl.Gray)
|
||||||
|
rl.DrawText(fmt.Sprint(window.AcceptingInput), window.X-20, window.Y-20, 12, rl.Blue)
|
||||||
|
//fmt.Printf("WindowDraw at %i, %i\n", window.X, window.Y)
|
||||||
|
|
||||||
|
DrawTextureFlipped(&window.Texture.Texture, window.X, window.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (window *RayGuiWindow) DrawInternals() {
|
||||||
|
if window.DrawFunc != nil {
|
||||||
|
window.DrawFunc(window)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
115
windowmanager.go
Normal file
115
windowmanager.go
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package pinwindows
|
||||||
|
|
||||||
|
import rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
|
|
||||||
|
type managewindowfunc func(*RayGuiWindowManager, *RayGuiWindow)
|
||||||
|
|
||||||
|
type RayGuiWindowManager struct {
|
||||||
|
winlist []*RayGuiWindow
|
||||||
|
movingwindow *RayGuiWindow // the currently moving (resize, drag, etc...)
|
||||||
|
movingwindowmode int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRayGuiWindowManager() RayGuiWindowManager {
|
||||||
|
var windowlist []*RayGuiWindow
|
||||||
|
return RayGuiWindowManager{winlist: windowlist, movingwindow: nil}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman *RayGuiWindowManager) ManageWindowlist() {
|
||||||
|
var windowtomovetofront *RayGuiWindow = nil
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
if winman.winlist[i].isLeftClicked() {
|
||||||
|
windowtomovetofront = winman.winlist[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if windowtomovetofront != nil {
|
||||||
|
windowtomovetofront.ManageFunc = MoveToTopOfWindowlist
|
||||||
|
}
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
if winman.winlist[i].ManageFunc != nil {
|
||||||
|
winman.winlist[i].ManageFunc(winman, winman.winlist[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman *RayGuiWindowManager) ProcessUserWindowMovement() {
|
||||||
|
currentmovingwindow := winman.movingwindow
|
||||||
|
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
if winman.winlist[i].DidStartMoveDrag() && currentmovingwindow == nil {
|
||||||
|
winman.movingwindow = winman.winlist[i]
|
||||||
|
winman.movingwindowmode = WINDOW_MODE_DRAG
|
||||||
|
}
|
||||||
|
if winman.winlist[i].DidStartResizeDrag() && currentmovingwindow == nil {
|
||||||
|
winman.movingwindow = winman.winlist[i]
|
||||||
|
winman.movingwindowmode = WINDOW_MODE_RESZIE
|
||||||
|
}
|
||||||
|
if rl.IsMouseButtonReleased(rl.MouseButtonLeft) || rl.IsMouseButtonReleased(rl.MouseButtonRight) {
|
||||||
|
winman.movingwindow = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if winman.movingwindow != nil {
|
||||||
|
if winman.movingwindowmode == WINDOW_MODE_DRAG {
|
||||||
|
winman.movingwindow.X += int32(rl.GetMouseDelta().X)
|
||||||
|
winman.movingwindow.Y += int32(rl.GetMouseDelta().Y)
|
||||||
|
}
|
||||||
|
if winman.movingwindowmode == WINDOW_MODE_RESZIE {
|
||||||
|
winman.movingwindow.Resize(int(rl.GetMouseDelta().X), int(rl.GetMouseDelta().Y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman RayGuiWindowManager) DrawInternalWindowList() {
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
winman.winlist[i].DrawInternals()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman RayGuiWindowManager) DrawWindowlist() {
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
winman.winlist[i].Draw()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman *RayGuiWindowManager) WinlistUnlistWindow(windowtoremove *RayGuiWindow) {
|
||||||
|
indextoremove := -1
|
||||||
|
for i := 0; i < len(winman.winlist); i++ {
|
||||||
|
if winman.winlist[i] == windowtoremove {
|
||||||
|
indextoremove = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if indextoremove == -1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(winman.winlist[indextoremove:], winman.winlist[indextoremove+1:])
|
||||||
|
winman.winlist[len(winman.winlist)-1] = nil
|
||||||
|
winman.winlist = winman.winlist[:len(winman.winlist)-1]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseWindow(winman *RayGuiWindowManager, windowtoremove *RayGuiWindow) {
|
||||||
|
winman.WinlistUnlistWindow(windowtoremove)
|
||||||
|
rl.UnloadRenderTexture(*windowtoremove.Texture)
|
||||||
|
if winman.movingwindow == windowtoremove {
|
||||||
|
winman.movingwindow = nil
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (winman *RayGuiWindowManager) AddWindow(windowtoadd *RayGuiWindow) {
|
||||||
|
if len(winman.winlist) > 0 {
|
||||||
|
winman.winlist[len(winman.winlist)-1].AcceptingInput = false
|
||||||
|
}
|
||||||
|
winman.winlist = append(winman.winlist, windowtoadd)
|
||||||
|
winman.winlist[len(winman.winlist)-1].AcceptingInput = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func MoveToTopOfWindowlist(winman *RayGuiWindowManager, windowtomove *RayGuiWindow) {
|
||||||
|
winman.winlist[len(winman.winlist)-1].AcceptingInput = false
|
||||||
|
winman.WinlistUnlistWindow(windowtomove)
|
||||||
|
winman.AddWindow(windowtomove)
|
||||||
|
windowtomove.ManageFunc = nil
|
||||||
|
}
|
Loading…
Reference in a new issue