0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Wails+Webix を使ってみた

Last updated at Posted at 2025-01-04

はじめに

デスクトップアプリを作るための開発環境 Wails と、ウェブアプリを作るためのライブラリ Webix を使ってみました。

Wails を始めてみた #JavaScript - Qiita

Webix を使ってみた #JavaScript - Qiita

この二つを一緒に使ってみたいと思います。

Wails+Webix を使ってみた

Wails のプロジェクトを新規作成する

まず、Wails のプロジェクトを新規作成します。

プロジェクトを作成したいフォルダに移動してコマンドを実行します。

wails init -n HelloWebix -t vanilla

使用するフレームワークは Vanilla JS を指定しました。↑

Webix のライブラリを組込する

作成したプロジェクトに Webix のライブラリを組込します。

以下のページからダウンロードします。
Download a JavaScript UI Widgets Library Webix Based on HTML5 and CSS3 Standards

以下のファイルをワークスペースにコピーします。

codebase
    webix.min.css
    webix.min.js

配置するのはプロジェクトの以下のフォルダにしました。

frontend
    lib
        webix
            webix.min.css
            webix.min.js

index.html に以下のコードを追記します。

index.html
    <link rel="stylesheet" href="./src/lib/webix/webix.css" type="text/css"> 
    <script src="./src/lib/webix/webix.js" type="text/javascript"></script>  

main.js で import したかったのですが、上手くいきませんでした。

style.cssapp.css の参照も、main.js から index.html に移動しておきます。(しなくて構いません)

index.html
    <link rel="stylesheet" href="./src/style.css" type="text/css">
    <link rel="stylesheet" href="./src/app.css" type="text/css">

app.css の既存の設定は不要になるので削除しておきます。↓

app.css
()

style.css の設定も整理しておきます。(しなくて構いません)

style.css
html {
    background-color: white;
}

body {
    margin: 0; padding: 0;
}

#app {
    height: 100vh; width: 100%;
}

main.js の既存のコードは削除しておきます。

アプリの画面を記述する

Webix ライブラリを使ってアプリの画面を記述します。

Getting Started - Webix Docs

Webix の UI コンポーネントは JavaScript コードで生成します。main.js に記述します。

main.js
    var app = webix.ui({
        container:'app',
        rows:[
            {
                type:'header', view:'template', template:"Try Webix",
            },
            {
                view:'form',
                elements:[
                    {
                        view:'text', id:"name", label:"Name", name:"name"
                    },
                    {
                        view:'button', id:"clickme", value:"Click me.",
                    },
                    {
                        view:'text', id:"message", label:"Message", name:"message"
                    }
                ],
            },
        ],
    });

Webix のコンポーネントは基本的に、親要素の領域一杯に表示されます。container プロパティに HTML タグを指定して、その領域一杯に表示させることもできます。
プロジェクトを新規作成したときに生成された index.html に、<div id="app"></div> があって画面一杯に表示されるようになっていたので、これを親要素にすることにします。

あるいは、<div id="app"></div> を削除してしまって、上記のコードで container の指定をなくしても構いません。コンポーネントはブラウザのウィンドウ一杯に表示されます。

上記のコードは、通常は以下の初期化ブロックに記述します。

main.js
webix.ready(function(){
    var app = webix.ui({
    (以下略)

イベントハンドラを記述する

ボタンをクリックすると実行するイベントハンドラを記述します。↓

main.js
    $$('clickme').attachEvent('onItemClick', function(){
        var name = $$('name').getValue();
        if (name == "") {
            webix.message("Please enter your name.");
            return;
        }
        $$('message').setValue("Hello, " + name);
    });

Event Handling of Guides, Interacting with Users Webix Docs

Webix コンポーネントのオブジェクト appcontainer: 'app' を指定したとき、アプリを起動すると <div id="app"></div> に合わせて、コンポーネント app はブラウザのウィンドウ一杯に表示されます。
ブラウザのウィンドウのサイズを変更すると、<div id="app"></div> はサイズが変わるのですが、Webix コンポーネント app はサイズが変わりません。
これでは困るので、以下のコードを追記します。

main.js
    webix.event(window, 'resize', function(){
        app.adjust(); 
    }); 

<div id="app"></div> を削除してコンポーネント appcontainer の指定をしないときは、この処置は必要ありません。

バックエンドの Go プログラムを呼出する

app.go に以下の関数が書かれています。

app.go
// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
	return fmt.Sprintf("Hello %s, It's show time!", name)
}

以下の設定が作成されていることを確認します。作成されていなかったら wails generate module を実行します。

frontend/wailsjs/go/main/App.js
export function Greet(arg1) {
  return window['go']['main']['App']['Greet'](arg1);
}

この関数をフロントエンドのコードで呼出します。

main.js
import {Greet} from '../wailsjs/go/main/App';

(中略)

    $$('clickme').attachEvent('onItemClick', function(){
        (中略)
     /* $$('message').setValue("Hello, " + name);
        ↓ */
        Greet(name)
        .then(function(result){
            $$('message').setValue(result);
        });
    });

Go の関数は返値でエラーを返せます。上記の関数を変えてみます。↓

app.go
// Greet returns a greeting for the given name
func (a *App) Greet(name string) (string, error) {
	if name == "" {
		return "", errors.New("argument 'name' is empty")
	}
	return fmt.Sprintf("Hello %s, It's show time!", name), nil
}

呼出する側も変えてみます。↓

main.js
    $$('clickme').attachEvent('onItemClick', function(){
        var name = $$('name').getValue();
        Greet(name)
        .then(function(result){
            $$('message').setValue(result);
        })
        .catch(function(reason){
            webix.message("Function failed: " + reason);
        });
    });
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?