吉里吉里2/吉里吉里Z用UIウィジェット実装kwidgets
- yunyundetective
- 14661
- 2
- 5
- 0
kwidgets講座その3。永続化辞書。永続化辞書とは、アプリを終了しても、ウィンドウの位置やサイズなどアプリにまつわるパラメーターを記憶させておくための外部辞書。
2012-04-19 14:27:16KPersistentDictionaryクラスに保存するファイルのパスを与えて作成。セーブデータのパスに保存するのが適当なので、 var dict = new KPersistentDictionary(System.dataPath + "app.ini") みたいに。
2012-04-19 14:29:20辞書の項目はキー(文字列)で識別する。var value = KPersistentDictionary.init(key, initialValue); で値の初期化。すでに辞書内にその値が設定してあれば、指定したinitialValueは無視して保存した値が返ってくる。
2012-04-19 14:30:41KPersistentDictionary.get(), set() 関数で値の取得、保存が任意のタイミングで出来る。
2012-04-19 14:31:08KPersistentDictionary.clear() で、保存している全てのキーの値をinit()時に指定した初期値にクリアする。
2012-04-19 14:31:38KPersistentDictioanary がデストラクトされると、ファイナライザの中で、辞書の値を設定ファイルに自動的に書き戻す。
2012-04-19 14:32:25一連のウィジェットは、KPersistentDictionaryにバインドする関数を最初から持っている。KWindonw.bindPersistentDictionary()関数でを呼ぶと、ウィジェットツリーの全ウィジェットが再帰的に辞書にバインドされる。
2012-04-19 14:33:40これにより、ウィンドウの位置、サイズ、ウィジェットの値が辞書に保存され、次回起動時に自動的に復帰する。ウィジェットのisAvoidDictionaryRegistrationプロパティをtrueに設定すると、そのウィジェットの子孫ウィジェットについては辞書バインドを回避できる。
2012-04-19 14:35:27kwidgets講座その4。サイズ可変なウィジェット。KWidgetが素のLayerと一番様式が違うのは、「サイズの設定の仕方」だ。Layerは単純にsetSize()で設定したサイズに決まるが、KWidgetは周囲のウィジェットとの関係で相対的にサイズが決まる。(続く)
2012-04-20 12:54:32KWidget継承クラスでは、setSize()で直接自分のサイズを設定する代わりに、setMinMaxSize(minWidth, minHeight, maxWidth, maxHeight) で、「自分の取り得る最小サイズと最大サイズ」を設定する。(続く)
2012-04-20 12:56:18ウィジェットをレイアウトにアタッチしたタイミング、もしくはアプリのユーザーがウィンドウハンドルをドラッグしてウィンドウのサイズが変わったタイミングなどで、レイアウトレイヤがウィジェットの配置を自動調整し、必要があればそのサイズを自動的に変更してくれる。(続く)
2012-04-20 12:57:22そのタイミングで、フック関数 KWidget.onSizeModified(newWidth, newHeight, oldWidth, oldHeight) が呼ばれる。この関数でレイヤとしての描画内容を更新すると良い。(続く)
2012-04-20 12:58:13固定サイズのウィジェットの場合は、 KWidget.setFixedSize(width, height) 関数でまとめてmin/maxサイズを設定しても良い。また、画像サイズに合わせるための KWidge.setFixedSizeToImageSize() 関数もある。(続く)
2012-04-20 12:59:38まとめ。自作ウィジェットの基本様式は (1) setMinMaxSize() で取り得るサイズを設定する。 (2) onSizeModified() をフックして描画処理を実行する。 となります。本日ここまで。
2012-04-20 13:00:26kwidgets講座その5。マウスオペレーション。KWidgetは、ウィジェット間でのドラッグ&ドロップサポートを始め、マウスオペレーションを大幅に拡張している。(続く)
2012-04-21 14:46:12ウィジェット上でマウスを右クリックするとKWidget.onRightClick() が呼ばれる。この関数をフックしておけば右クリックはすぐに拾える。コンテキストメニューを表示する時などに使う。(続く)。
2012-04-21 14:47:11マウスを左クリックしてドラッグすると KWidget.onDragEnter(x, y, shift) が呼ばれる。ウィジェットにドラッグ開始を通知する関数。ドラッグ中は onDrageMove() が呼ばれ続け、マウスを放すと onDragLeave() が呼ばれる。(続く)。
2012-04-21 14:48:41ウィジェット間のドラッグ&ドロップのやり取りは、KPacketクラスを仲介して行う。KPacketはnameとargの2つのプロパティを持っている。nameはドラッグしているデータの内容を識別するためのキーで、argに実際のデータを格納する。(続く)
2012-04-21 14:50:37KWidget.onDragEnter() の中で KWidget.beginDragPacket(packet) 関数を呼び出すことで、ウィジェットをまたいだドラッグ&ドロップオペレーションが開始される。(続く)
2012-04-21 14:51:29パケットをドラッグしたまま別のウィジェット領域内にマウスカーソルが侵入すると、そのウィジェットの KWidget.isPacketAcceptable(packet) 関数が呼び出される。受け手側のウィジェットでは、パケットの内容を識別して受け入れ可能ならtrueを返す。(続く)
2012-04-21 14:53:17受け手がパケットを受け入れ可能な場合、その侵入と同時に KWidget.onPacketEnter(x, y, packet, shift) 関数が呼ばれる。同様に onPacketMove(), onPacketLeave() が適宜呼ばれる。(続く)
2012-04-21 14:55:53この部分をフックすることで、受け手側でパケットがドラッグされいてる際に、その内容と座標に合わせてレイヤのグラフィックを更新して、ライブでパケットの受け入れ状況を表現出来る。(続く)
2012-04-21 14:57:58受け入れ可能なウィジェットでマウスボタンを離してドラッグを終了すると、 KWidget.onPacketDrop(x, y, packet, shift) が呼ばれる。ここでドラッグ&ドロップの受け入れ確定。(続く)
2012-04-21 14:58:50受け入れ可能なウィジェット上ではない地点でマウスを離した場合、最初に beginDragPacket() でドラッグ開始を指示したウィジェットの KWidget.onPacketCancel(packet) 関数が呼ばれ、D&Dのキャンセルが通知される。(続く)
2012-04-21 14:59:51