dtjzpg5313 2018-07-11 15:54
浏览 265

使用nuklear包创建带有按钮的GUI的最小代码

I am trying to trim demo file from nuklear package to get minimum code for just creating a GUI window with one button. Following is my attempt:

package main

import (
    "log"
    "runtime"
    "time"

    "github.com/go-gl/gl/v3.2-core/gl"
    "github.com/go-gl/glfw/v3.2/glfw"
    "github.com/golang-ui/nuklear/nk"
    "github.com/xlab/closer"
)

const (
    winWidth         = 400
    winHeight        = 500
    maxVertexBuffer  = 512 * 1024
    maxElementBuffer = 128 * 1024
)

func init() {
    runtime.LockOSThread()
}
func main() {
    if err := glfw.Init(); err != nil {
        closer.Fatalln(err)
    }
    glfw.WindowHint(glfw.ContextVersionMajor, 3)
    glfw.WindowHint(glfw.ContextVersionMinor, 2)
    glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
    glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)
    win, err := glfw.CreateWindow(winWidth, winHeight, "Nuklear Demo", nil, nil)
    if err != nil {
        closer.Fatalln(err)
    }
    win.MakeContextCurrent()

    width, height := win.GetSize()
    log.Printf("glfw: created window %dx%d", width, height)

    if err := gl.Init(); err != nil {
        closer.Fatalln("opengl: init failed:", err)
    }
    gl.Viewport(0, 0, int32(width), int32(height))

    ctx := nk.NkPlatformInit(win, nk.PlatformInstallCallbacks)

    atlas := nk.NewFontAtlas()
    nk.NkFontStashBegin(&atlas)
    //sansFont := nk.NkFontAtlasAddFromBytes(atlas, MustAsset("assets/FreeSans.ttf"), 16, nil)
    sansFont := nk.NkFontAtlasAddDefault(atlas, 16, nil)
    nk.NkFontStashEnd()
    if sansFont != nil {
        nk.NkStyleSetFont(ctx, sansFont.Handle())
    }

    exitC := make(chan struct{}, 1)
    doneC := make(chan struct{}, 1)
    closer.Bind(func() {
        close(exitC)
        <-doneC
    })

    state := &State{
        bgColor: nk.NkRgba(28, 48, 62, 255),
    }
    fpsTicker := time.NewTicker(time.Second / 30)
    for {
        select {
        case <-exitC:
            nk.NkPlatformShutdown()
            glfw.Terminate()
            fpsTicker.Stop()
            close(doneC)
            return
        case <-fpsTicker.C:
            if win.ShouldClose() {
                close(exitC)
                continue
            }
            glfw.PollEvents()
            gfxMain(win, ctx, state)
        }
    }
}

func gfxMain(win *glfw.Window, ctx *nk.Context, state *State) {
    nk.NkPlatformNewFrame()
    // Layout
    bounds := nk.NkRect(50, 50, 230, 250)
    update := nk.NkBegin(ctx, "Demo", bounds,
        nk.WindowBorder|nk.WindowMovable|nk.WindowScalable|nk.WindowMinimizable|nk.WindowTitle)
    if update > 0 {
        nk.NkLayoutRowStatic(ctx, 30, 80, 1)
        {
            if nk.NkButtonLabel(ctx, "A_Button") > 0 {
                log.Println("[INFO] button pressed!")
            }
        }
    }
    nk.NkEnd(ctx)
    // Render
    bg := make([]float32, 4)
    nk.NkColorFv(bg, state.bgColor)
    width, height := win.GetSize()
    gl.Viewport(0, 0, int32(width), int32(height))
    gl.Clear(gl.COLOR_BUFFER_BIT)
    gl.ClearColor(bg[0], bg[1], bg[2], bg[3])
    nk.NkPlatformRender(nk.AntiAliasingOn, maxVertexBuffer, maxElementBuffer)
    win.SwapBuffers()
}

type Option uint8
type State struct {
    bgColor nk.Color
    prop    int32
    opt     Option
}

It seems a lot of code to just create a window with a button. I am sure more code can be removed but I can't seem to find it. What further unneeded code can I remove from above to trim it further?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 虚幻5 UE美术毛发渲染
    • ¥15 CVRP 图论 物流运输优化
    • ¥15 Tableau online 嵌入ppt失败
    • ¥100 支付宝网页转账系统不识别账号
    • ¥15 基于单片机的靶位控制系统
    • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
    • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
    • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
    • ¥15 手机接入宽带网线,如何释放宽带全部速度
    • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测