Giter Club home page Giter Club logo

nwui's Introduction

nwui

Gitter Go Walker GoDoc

node-webkit UI for Go

Screenshot

screenshot

Example

创建一个包含按钮的窗口:

&Window{
	Title:  "window",
	Width:  800,
	Height: 600,
	OnExit: func() {
		fmt.Println("exit")
	},
	Controls: []interface{}{
		&Button{
			ID:   "btn0",
			Text: "button",
			OnClick: func() {
				text := GetConByID("btn0").(*Button).Text
				fmt.Println(text, "clicked!")
			},
		},
	},
}

使用可以参见test文件

自带控件列表

  • 普通的窗口控件
  • 普通的按钮控件
  • 还没移植完成的自定义窗口控件

TODO

  • 基础框架
  • 自动调用nw.js
  • 更多控件
    • 按钮
    • 单选框
    • 多选框
    • 单行输入框
    • 多行输入框
    • 表格
    • 横向框架
    • 纵向框架
    • more
  • 默认控件和框架分离
  • 更多主题

控件编写指南

本段是为想自己写nwui控件者编写的,如果只是普通的使用可以直接无视

首先你要会一点js+css+html,以及强大的理解能力(没办法,作者写的太乱)

先上Button控件的例子:

type Button struct {
	ID      string
	Text    string
	OnClick func()
	sender  chan EventMsg
}

func (b *Button) Init(sender chan EventMsg) Controls {
	static := ConStatic{
		Name: "Button",
		CSS: `
.button {
    border: 4px solid #304ffe;
    color: white;
    background: #304ffe;
    padding: 6px 12px;
}
.button:hover {
    background: white;
    color: #304ffe;
}
.button:active {
    color: #fff;
    background: #304ffe;
    box-shadow: 1px 2px 7px rgba(0, 0, 0, 0.3) inset;
}`,
		JavaScript: `
function ButtonSetText(id,text) {
	var button = document.getElementById(id);
	button.textContent = text;
}
(function() {
	var buttons = document.getElementsByClassName('button');
	for (var i = 0; i < buttons.length; i++) {
		var button = buttons[i]
		button.onclick = function(){
			send(button.id, "ButtonOnClick", "");
		};
	}
})();`,
	}

	if b.ID == "" {
		b.ID = NewControlID()
	}
	events := make(map[string]func(v string))
	b.sender = sender

	html := "<button id=\"" + b.ID + "\"class=\"button\">" + b.Text + "</button>"
	if b.OnClick != nil {
		// 如果用户使用了OnClick事件
		// 那么添加事件
		events["ButtonOnClick"] = func(v string) {
			b.OnClick()
		}
	}
	return Controls{
		b.ID: Control{
			V:      b,
			HTML:   html,
			Static: static,
			Events: events,
		},
	}
}

// 设置按钮文字
func (b *Button) SetText(text string) {
	// 这里的判断是防止控件还没有初始化
	// sender还未赋值用户就调用
	if b.sender != nil {
		// ButtonSetText 为需要调用的js函数
		b.sender <- EventMsg{b.ID, "ButtonSetText", text}
	}
	b.Text = text
}

以下为nwui中的结构体定义

type Controls map[string]Control

type Control struct {
	V      interface{}               // 控件的结构体指针,用于初始化时的处理
	HTML   string                    // 控件的HTML代码
	Events map[string]func(v string) // 控件事件列表,key为事件名称
	Static ConStatic                 // 控件的静态数据,css和js等
}

type ConStatic struct {
	Name       string // 控件名称,不能和其他控件重复
	CSS        string // 控件的css
	JavaScript string // 控件的js
}

type EventMsg struct {
	ID    string `json:"id"`    // 控件的ID
	Event string `json:"event"` // 事件名称
	Value string `json:"value"` // 想发送信息的内容,复杂内容推荐用json编码
}

控件必须实现一个Init(sender chan EventMsg) Controls方法,nwui会用反射来调用并传入sender

sender是给前端发送消息的一个chan,具体使用可以参加上面源码

因为一个控件内可能会包含其他的控件,所以返回一个Controls而不是Control

当你编写的控件要包含其他控件时,比如写一个Group控件

可以获取子控件的HTML字段,然后按照需求添加到自己的HTML字段中(比如需要特殊排列啦什么的)。然后要记得清空子控件的HTML字段以防止重复添加(css和javascript之所以单独放在ConStatic是因为它们都是可重复使用的。ConStaticName字段也是用于区分控件类型的,所以Name不要随便填写)。return时记得在Controls里加上子控件(key为控件ID)

在写控件的js和css时要注意,必须写成对所有这种控件都可用的(增加代码复用率)。具体可以看上面Button控件的实现(根据class来选择控件啦什么的)

窗口级别的控件编写

窗口级别的控件Init方法比较特殊,比普通控件多两个返回值

Init(sender chan EventMsg) (Controls, NWUI, chan bool)

NWUI是nwui窗口的配置,各个字段的意义可以直接看nw.jspackage.json

chan bool接收到消息时,会关闭窗口

看不懂?

作者的表达能力有限(或者说超烂),直接看源码吧……

参与开发

跪求帮忙开发,哪怕只增加注释或者增加TODO都可以

因为需要完成的控件太多所以作者一个人实在忙不过来

nwui's People

Contributors

gitter-badger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nwui's Issues

有没有qq群啊?

其实我觉得吧 用http协议 实在是太慢了亲 如果能直接调用webkit是最好的

参与开发问题

你好,
可以留个邮箱或者其他联系方式么?用来沟通日常项目问题。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.