2009-05-24ビューを原図とミキサーに対応させるマーカ表示機能を追加する原図は発振器出力を組み合わせて作られているわけですが、これを視覚的に理解する助けとしてマーカを表示する機能を追加する事にしました。各ビューの対応する点に赤い丸印が表示され、スライダーと同期してこの丸印を動かす事ができます。縦横のミキサーで表示されるマーカと原図のマーカが同期して動くので、その対応関係が目で見てわかるのではないかと思います。BezierPathViewにマーカ表示機能を追加する発振器、ミキサー、原図の全てにマーカを表示するので、マーカ表示機能を追加するのはBezierPathViewです。やる事をリストアップしてみましょう。マーカを表示するかどうか設定できる様にするマーカの位置を設定できる様にするマーカを表示する1と2を実現するためにインスタンス変数を追加します。isXView:(BOOL)isX;@end初期化メソッド初期化メソッドでは追加したインスタンス変数の初期値を設定します。awakeFromNibではshowMarkerのバインディングを設定します。ドキュメントごとに設定する必要はなく、アプリケーションで共通の設定として充分でしょう。そこでユーザデフォルトとバインディングする事にしました。ユーザデフォルトについては後で詳しく説明します。bind:@"selectionIndexes"toObject:controllerwithKeyPath:@"selectionIndexes"options:nil];}マーカを表示するdrawRect:メソッドにshowMarkerフラグに応じてマーカを表示するコードを追加します。メソッド名はdisplayMarkerとしました。displayMarkerメソッドでは、まずdisplayPathから現在のマーカ位置に対応する座標を読み出します。その座標を中心として円のパスを作り、それを半透明の赤で塗りつぶしてマーカとします。displayMarker];}}アクセサメソッドを追加する最後に1と2を実現できる様に、アクセサメソッドを追加してBezierPathViewとしては完了です。値をセットした後に再描画しているだけで、特に変わった事をしているわけではありません。setNeedsDisplay:YES];}RMGDocumentをコントローラとするマーカ表示機能を実現するビューができたので、あとはモデルとコントローラを作ってバインディングを設定すればOKです。showMarkerはアプリケーション全体で共通の設定としたので、デフォルトデータベースをモデル、ユーザデフォルトコントローラをコントローラとする事ができます。markerPositionをアプリケーション全体で共通とするのは少し違和感があります。こちらはドキュメント固有の値としたいところです。markerPositionをファイルに保存したいのならCoreDataを使うべきですが、保存する必要は特にありません。そこでRMGDocumentをコントローラとして使う事にします。Ownerとしてバインディングを設定できます。マーカの最大値は原図のresolutionに依存しますので、スライダーの最大値をresolutionが変わった時に適切に設定する必要があります。RMGDocumentがpositionMaxという値を提供する事で、これを実現します。インスタンス変数とアウトレットを追加する前述した機能を実現するために、markerPositionとpositionMaxというインスタンス変数を追加します。原図のresolutionを監視するためにバインディングを設定するので、配列コントローラのアウトレットを追加します。positionMax;}@endバインディングを設定し、アクセサメソッドを追加する原図のresolutionを監視するために、windowControllerDidLoadNibメソッドでバインディングを設定します。resolutionのSetterではpositionMaxをresolution-1に設定します。resolutionが200の場合はmarkerを0から199に設定できる様にするわけです。resolutionを下げた場合、markerPositionがpositionMaxを超える場合があり得ます。その場合はmarkerPositionをpositionMaxに設定します。setMarkerPosition:positionMax];}@endBezierPathViewをRMGDocumentにバインディングするBezierPathViewのバインディングを設定します。設定するのは各BezierPathViewのアウトレットを持つEnclosureViewが適任です。RMGDocumentのアウトレットを追加します。*)sender;@endawakeFromNibでバインディングを設定します。Builderで設定ができる様になります。markerチェックボックスのバインディング設定ですが、これはユーザデフォルトコントローラとバインディングする様に設定します。次はマーカ位置を設定するスライダーの設定です。(=RMGDocument)のpositionMaxとバインディングします。markerPositionとバインディングします。スライダーのEnabledをshowMarkerとバインディングして、showMarkerがチェックされていない時はスライダーを無効にしておいた方が親切でしょう。