新しいクラスプラットフォームデスクトップアプリケーションライブラリ yue

NW.jsやElectronの作者である、zcbenz氏が新しいクロスプラットフォームライブラリyueをつくりはじめました。
え、Electronを使ってるんだけどと思った人は落ち着いて大丈夫、フルタイムでElectronの開発を続けているとのこと。

では、今度のyueは何を目指しているのか。

> Uses native widgets;
Works on all major desktop platforms;
 Has a modern and clean C++ interface;
 Has good support for High DPI;
 Uses windowless controls on Windows;
 Generates small executable size;
 Friendly license for closed source apps.

ネイティブウィジェットを扱えてアプリケーションのサイズがコンパクトになるですか、よさそうですね。

使用できる言語は、C++,Lua,JavaScript。

## ドキュメント
C++
http://libyue.com/docs/v0.2.0/cpp/

Lua
http://libyue.com/docs/v0.2.0/lua/

JavaScript
http://libyue.com/docs/v0.2.0/js/

## JS版インストール
`yue`ではなく、`gui`というパッケージ名でインストール。
よくこんなnpmパッケージが空いてたなという気持ちですね。
調べてないけど、譲ってもらったかもしれないです。

```
$ npm install --save gui
```

## Getting start
ある程度書いてから気づきました。
この記事を読むより、以下を読んだ方がよさそうです。

[Getting started - Yue](http://libyue.com/docs/v0.2.0/js/guides/getting_started.html)

GUIのイベントループ問題のためにNodeをフォークしたYode使ってやみたいなことが書いてあります。

## サンプル
以下にサンプルアプリがいくつかまとまってます。

https://github.com/yue/yue-sample-apps

### editor

|  macOS            |    Linux          |  Windows          |
| ----------------- | ----------------- | ----------------- |
| ![][mac-editor]   | ![][linux-editor] | ![][win-editor]   |

[mac-editor]: https://cdn.rawgit.com/yue/yue-app-samples/10cc39d9/editor/screenshots/mac_editor.png
[linux-editor]: https://cdn.rawgit.com/yue/yue-app-samples/10cc39d9/editor/screenshots/linux_editor.png
[win-editor]: https://cdn.rawgit.com/yue/yue-app-samples/10cc39d9/editor/screenshots/win_editor.png

### electron_webcontents
https://github.com/yue/yue-sample-apps/tree/master/electron_webcontents
![](https://camo.githubusercontent.com/212c0924e974c00581df287a790db9786e6291ed/68747470733a2f2f63646e2e7261776769742e636f6d2f7975652f7975652d73616d706c652d617070732f36616463373762392f656c656374726f6e5f776562636f6e74656e74732f73637265656e73686f74732f6d61635f656c656374726f6e2e706e67)

## Electronとの違い
electronは実質クロームなので、BrowserWindowのインスタンスにloadURLを呼び出してローカルもしくは外部のwebページを表示しますが、yueは一つのWindowに対して、一つのcontent viewを持ちます。
このcontentViewに対してaddChildViewを使いネイティブのウィジェットを追加していきます。

```js
const win = gui.Window.create({})
win.setContentSize({width: 400, height: 400})
win.onClose = () => gui.lifetime.quit()

const contentView = gui.Container.create()
contentView.setStyle({flexDirection: 'row'})
win.setContentView(contentView)
```

レイアウトに関しては、Container viewを使うことで複数のviewを持つことができ、この子要素はflexbox styleで自動的にレイアウトされるようです。

その他、macOS向けの半透明設定やHiDPI image、ダイアログ、フレームレスウィンドウ、ペインタークラスなどの説明があるので詳しくはgetting_startedを読んでください。

http://libyue.com/docs/v0.2.0/js/guides/getting_started.html

## 最小構成
エディタ画面だけの本当に小さいサンプルを書くとするれば以下のようになるでしょう。

```js:main.js
const gui = require('gui')

const win = gui.Window.create({})
win.setContentSize({ width: 400, height: 400 })
win.onClose = () => gui.lifetime.quit()

const edit = gui.TextEdit.create()
win.setContentView(edit)

win.center()
win.activate()

if (!process.versions.yode) {
  gui.lifetime.run()
  process.exit(0)
}
```

```
$ node main.js
```

[![https://gyazo.com/5bb4307c8960610f534a31b3f2113d0e](https://i.gyazo.com/5bb4307c8960610f534a31b3f2113d0e.png)](https://gyazo.com/5bb4307c8960610f534a31b3f2113d0e)

もし、webviewがほしい場合は、yueにはないので、electronと組み合わせます。
そのサンプルは、https://github.com/yue/yue-sample-apps/tree/master/electron_webcontents を見るといいでしょう。

## 気持ち
これ、あれかな。
yue単体じゃなくて、electronと組み合わせることでelectronアプリにネイティブのUIを付加する使われ方をするんじゃ...