吉里吉里2/吉里吉里Z用UIウィジェット実装kwidgets

吉里吉里2/吉里吉里ZでTJSによるGUIアプリを構築するためのUIウィジェット実装kwidgetsの解説ツイートです。マニュアルが整備できてないので、twitterで少しずつつぶやいて、こちらのまとめにまとめて行く予定です。 (2017/6/5) 以前は吉里吉里2のSVNレポジトリで管理していたkwidgetsですが、この度GitHubのkrkrzプロジェクトの下にワーキングレポジトリを移動させました。以後、メンテナンスはそちらで行います。 https://github.com/krkrz/kwidgets
27
前へ 1 2 ・・ 5 次へ
ゆんゆん探偵 @yunyundetective

kwidgets講座その3。永続化辞書。永続化辞書とは、アプリを終了しても、ウィンドウの位置やサイズなどアプリにまつわるパラメーターを記憶させておくための外部辞書。

2012-04-19 14:27:16
ゆんゆん探偵 @yunyundetective

KPersistentDictionaryクラスに保存するファイルのパスを与えて作成。セーブデータのパスに保存するのが適当なので、 var dict = new KPersistentDictionary(System.dataPath + "app.ini") みたいに。

2012-04-19 14:29:20
ゆんゆん探偵 @yunyundetective

辞書の項目はキー(文字列)で識別する。var value = KPersistentDictionary.init(key, initialValue); で値の初期化。すでに辞書内にその値が設定してあれば、指定したinitialValueは無視して保存した値が返ってくる。

2012-04-19 14:30:41
ゆんゆん探偵 @yunyundetective

KPersistentDictionary.get(), set() 関数で値の取得、保存が任意のタイミングで出来る。

2012-04-19 14:31:08
ゆんゆん探偵 @yunyundetective

KPersistentDictionary.clear() で、保存している全てのキーの値をinit()時に指定した初期値にクリアする。

2012-04-19 14:31:38
ゆんゆん探偵 @yunyundetective

KPersistentDictioanary がデストラクトされると、ファイナライザの中で、辞書の値を設定ファイルに自動的に書き戻す。

2012-04-19 14:32:25
ゆんゆん探偵 @yunyundetective

一連のウィジェットは、KPersistentDictionaryにバインドする関数を最初から持っている。KWindonw.bindPersistentDictionary()関数でを呼ぶと、ウィジェットツリーの全ウィジェットが再帰的に辞書にバインドされる。

2012-04-19 14:33:40
ゆんゆん探偵 @yunyundetective

これにより、ウィンドウの位置、サイズ、ウィジェットの値が辞書に保存され、次回起動時に自動的に復帰する。ウィジェットのisAvoidDictionaryRegistrationプロパティをtrueに設定すると、そのウィジェットの子孫ウィジェットについては辞書バインドを回避できる。

2012-04-19 14:35:27
ゆんゆん探偵 @yunyundetective

こんな感じで「アプリのパラメーター」を外部ファイルに保存出来るのありました。本日ここまで。

2012-04-19 14:36:02
ゆんゆん探偵 @yunyundetective

kwidgets講座その4。サイズ可変なウィジェット。KWidgetが素のLayerと一番様式が違うのは、「サイズの設定の仕方」だ。Layerは単純にsetSize()で設定したサイズに決まるが、KWidgetは周囲のウィジェットとの関係で相対的にサイズが決まる。(続く)

2012-04-20 12:54:32
ゆんゆん探偵 @yunyundetective

KWidget継承クラスでは、setSize()で直接自分のサイズを設定する代わりに、setMinMaxSize(minWidth, minHeight, maxWidth, maxHeight) で、「自分の取り得る最小サイズと最大サイズ」を設定する。(続く)

2012-04-20 12:56:18
ゆんゆん探偵 @yunyundetective

ウィジェットをレイアウトにアタッチしたタイミング、もしくはアプリのユーザーがウィンドウハンドルをドラッグしてウィンドウのサイズが変わったタイミングなどで、レイアウトレイヤがウィジェットの配置を自動調整し、必要があればそのサイズを自動的に変更してくれる。(続く)

2012-04-20 12:57:22
ゆんゆん探偵 @yunyundetective

そのタイミングで、フック関数 KWidget.onSizeModified(newWidth, newHeight, oldWidth, oldHeight) が呼ばれる。この関数でレイヤとしての描画内容を更新すると良い。(続く)

2012-04-20 12:58:13
ゆんゆん探偵 @yunyundetective

固定サイズのウィジェットの場合は、 KWidget.setFixedSize(width, height) 関数でまとめてmin/maxサイズを設定しても良い。また、画像サイズに合わせるための KWidge.setFixedSizeToImageSize() 関数もある。(続く)

2012-04-20 12:59:38
ゆんゆん探偵 @yunyundetective

まとめ。自作ウィジェットの基本様式は (1) setMinMaxSize() で取り得るサイズを設定する。 (2) onSizeModified() をフックして描画処理を実行する。 となります。本日ここまで。

2012-04-20 13:00:26
ゆんゆん探偵 @yunyundetective

kwidgets講座その5。マウスオペレーション。KWidgetは、ウィジェット間でのドラッグ&ドロップサポートを始め、マウスオペレーションを大幅に拡張している。(続く)

2012-04-21 14:46:12
ゆんゆん探偵 @yunyundetective

ウィジェット上でマウスを右クリックするとKWidget.onRightClick() が呼ばれる。この関数をフックしておけば右クリックはすぐに拾える。コンテキストメニューを表示する時などに使う。(続く)。

2012-04-21 14:47:11
ゆんゆん探偵 @yunyundetective

マウスを左クリックしてドラッグすると KWidget.onDragEnter(x, y, shift) が呼ばれる。ウィジェットにドラッグ開始を通知する関数。ドラッグ中は onDrageMove() が呼ばれ続け、マウスを放すと onDragLeave() が呼ばれる。(続く)。

2012-04-21 14:48:41
ゆんゆん探偵 @yunyundetective

ウィジェット間のドラッグ&ドロップのやり取りは、KPacketクラスを仲介して行う。KPacketはnameとargの2つのプロパティを持っている。nameはドラッグしているデータの内容を識別するためのキーで、argに実際のデータを格納する。(続く)

2012-04-21 14:50:37
ゆんゆん探偵 @yunyundetective

KWidget.onDragEnter() の中で KWidget.beginDragPacket(packet) 関数を呼び出すことで、ウィジェットをまたいだドラッグ&ドロップオペレーションが開始される。(続く)

2012-04-21 14:51:29
ゆんゆん探偵 @yunyundetective

パケットをドラッグしたまま別のウィジェット領域内にマウスカーソルが侵入すると、そのウィジェットの KWidget.isPacketAcceptable(packet) 関数が呼び出される。受け手側のウィジェットでは、パケットの内容を識別して受け入れ可能ならtrueを返す。(続く)

2012-04-21 14:53:17
ゆんゆん探偵 @yunyundetective

受け手がパケットを受け入れ可能な場合、その侵入と同時に KWidget.onPacketEnter(x, y, packet, shift) 関数が呼ばれる。同様に onPacketMove(), onPacketLeave() が適宜呼ばれる。(続く)

2012-04-21 14:55:53
ゆんゆん探偵 @yunyundetective

この部分をフックすることで、受け手側でパケットがドラッグされいてる際に、その内容と座標に合わせてレイヤのグラフィックを更新して、ライブでパケットの受け入れ状況を表現出来る。(続く)

2012-04-21 14:57:58
ゆんゆん探偵 @yunyundetective

受け入れ可能なウィジェットでマウスボタンを離してドラッグを終了すると、 KWidget.onPacketDrop(x, y, packet, shift) が呼ばれる。ここでドラッグ&ドロップの受け入れ確定。(続く)

2012-04-21 14:58:50
ゆんゆん探偵 @yunyundetective

受け入れ可能なウィジェット上ではない地点でマウスを離した場合、最初に beginDragPacket() でドラッグ開始を指示したウィジェットの KWidget.onPacketCancel(packet) 関数が呼ばれ、D&Dのキャンセルが通知される。(続く)

2012-04-21 14:59:51
前へ 1 2 ・・ 5 次へ