Accessory View を追加する

ここには、Open/Save パネルなんかで Accessory View を追加する場合のパーツの配置などに付いてメモする。

実は、これは Interface Builder で簡単にできることを発見した。だけど、せっかくなのでこの記述は残したまま、新たにページを作ることにした。その簡単な方法はAccessory View を Interface Builder で作るを参照。

Open/Save パネルには setAccessoryView(view) というメソッドがあって、NSView オブジェクトを追加できる。この NSView オブジェクトにパーツをのせる方法について、パーツごとに書いていく。

パーツを配置する NSView を用意する

まず、NSView オブジェクトを initWithFram(NSRect) で作る。NSRect は、NSPoint で起点を、NSSize で範囲を指定する。NSRect.new(NSPoint,NSSize)

view = NSView.alloc.initWithFrame(NSRect.new(NSPoint.new(0,0), NSSize.new(350,50)))

実は、NSRect でわざわざ指定しなくても、Ruby の Array オブジェクトでも大丈夫だということがわかった。なので次のように書けばいい。

view = NSView.alloc.initWithFrame([0,0,350,50])

ポップアップボタンを追加する

次に、NSPopUpButton オブジェクトを initWithFrame_pullsDown(NSRect,true/false) でポップアップボタンを作る。true でプルダウンメニューになり、

false でポップアップメニューになる。

popup = NSPopUpButton.alloc.initWithFrame_pullsDown(NSRect.new(NSPoint.new(100,10), NSSize.new(150,25)),false)

( popup = NSPopUpButton.alloc.initWithFrame_pullsDown([100,10,150,25],false) )

次に、ポップアップメニューに加える項目を配列で準備する。Ruby の Array オブジェクトでいい。

items = ["item 1","item 2","item 3"]

この項目を addItemsWithTitles でポップアップメニューに追加する。

popup.addItemsWithTitles(items)

あと、ポップアップメニューを変更したときのアクションも setAction(action) で設定できる。action のところに実行したい ib_action を文字列として入れる。ただ、その前に、setTarget(target) でメッセージを送る target object を設定しないといけない。target は AppController というか、アプリケーションをコントロールしてる(action が記述してある?)NSObject なので self と入れておく。

popup.setTarget(self)

popup.setAction("runThisAction")

最後に popup オブジェクトを addSubview で NSView のサブビューとして追加する。

view.addSubview(popup)

まとめるとこんな感じ。

view = NSView.alloc.initWithFrame(NSRect.new(NSPoint.new(0,0), NSSize.new(350,50)))

popup = NSPopUpButton.alloc.initWithFrame_pullsDown(NSRect.new(NSPoint.new(100,10), NSSize.new(150,25)),false)

( view = NSView.alloc.initWithFrame([0,0,350,50]) )

( popup = NSPopUpButton.alloc.initWithFrame_pullsDown([100,10,150,25],false) )

items = ["item 1","item 2","item 3"]

popup.addItemsWithTitles(items)

view.addSubview(popup)

テキストを追加する

テキストを追加するには、NSText を使えばできる(もっといい方法があるかもしれないけど)。

まず NSVText オブジェクトを initWithFrame(NSRect) で作る。

text = NSText.alloc.initWithFrame(NSRect.new(NSPoint.new(0,12), NSSize.new(150,20)))

( text = NSText.alloc.initWithFrame([0,12,150,20]) )

次に、setDrawsBackground(true/false) で背景を書かない設定にする。書くと、四角を書いてその中に文字を書くので、浮いてしまう。背景を書かないことで、パネルの背景色で表示される。

text.setDrawsBackground(false)

あとは、NSTextView オブジェクトに属性を付けていく。setString で文字列を、setFont でフォントを setFontColor で文字の色を、というように、NSTextView と同じように設定できる。まあ、NSTextView が NSText のサブクラスだからだけど。

最後に addSubview でポップアップメニューのときに作った NSView にサブビューとして追加する。

view.addSubview(text)

まとめるとこんな感じ。

text = NSText.alloc.initWithFrame(NSRect.new(NSPoint.new(0,12), NSSize.new(150,20)))

( text = NSText.alloc.initWithFrame([0,12,150,20]) )

text.setDrawsBackground(false)

text.setString("Select an item:")

text.setFont(NSFont.fontWithName_size("Lucida Grande",13.0))

view.addSubview(text)

スライダーを追加する

プレビューなんかで jpeg で保存する場合にでてくるスライダーを追加してみる。作るのはこんな感じのもの。

まず、NSSlider オブジェクトを initWithFrame(frame) で作る。

slider = NSSlider.alloc.initWithFrame(NSRect.new(NSPoint.new(140,10), NSSize.new(200,50)))

( slider = NSSlider.alloc.initWithFrame(NSRect.new([140,10,200,50]) )

これに、NSSlider の設定を加えていく。まずは最小値と最大値を setMinValue(double)setMaxValue(double) で設定する。double は double 型の小数。まあ、普通に小数で大丈夫(整数でも受け付けると思うけど)。ここでは、0 から 1.0 までにする。

slider.setMinValue(0.0)

slider.setMaxValue(1.0)

デフォルトのマーカーの位置は setDoubleValue(double) で設定する。まあ、現在の値を設定するとそこにマーカーが現れるから。

slider.setDoubleValue(0.8)

目盛の数は、setNumberOfTickMarks(int) で設定する。int は整数。ここでは、0.1 刻みにしたいので 11 にする。

slider.setNumberOfTickMarks(11)

setAllowsTickMarkValuesOnly(true/false) を使うと、目盛の所だけで止まるかどうか設定できる。

slider.setAllowsTickMarkValuesOnly(true)

あと、ここでは、目盛でしか止まらないので必要ないけど、setAltIncrementValue(double) を使うと、Option キーを押してマーカーを動かしたときに、どれだけずつ動くか設定ができる。

slider.setAltIncrementValue(0.1)

これを、addSubview(object) で部品を乗っける NSView のオブジェクトに追加する。

view.addSubview(slider)

この Slider に付随するテキストをあわせたものが次のスクリプト。

view = NSView.alloc.initWithFrame(NSRect.new(NSPoint.new(0,0), NSSize.new(355,70)))

slider = NSSlider.alloc.initWithFrame(NSRect.new(NSPoint.new(140,10), NSSize.new(200,50)))

slider.setMaxValue(1.0)

slider.setMinValue(0.0)

slider.setDoubleValue(0.8)

slider.setAltIncrementValue(0.1)

slider.setNumberOfTickMarks(11)

slider.setAllowsTickMarkValuesOnly(true)

view.addSubview(slider)

labelLow = NSText.alloc.initWithFrame(NSRect.new(NSPoint.new(127,2), NSSize.new(50,18)))

labelLow.setDrawsBackground(false)

labelLow.setString("Lowest")

labelLow.setFont(NSFont.fontWithName_size("Lucida Grande",10.0))

view.addSubview(labelLow)

labelHigh = NSText.alloc.initWithFrame(NSRect.new(NSPoint.new(307,2), NSSize.new(50,18)))

labelHigh.setDrawsBackground(false)

labelHigh.setString("Highest")

labelHigh.setFont(NSFont.fontWithName_size("Lucida Grande",10.0))

view.addSubview(labelHigh)

text = NSText.alloc.initWithFrame(NSRect.new(NSPoint.new(0,30), NSSize.new(150,20)))

text.setDrawsBackground(false)

text.setString("JPEG Image Quality:")

text.setFont(NSFont.fontWithName_size("Lucida Grande",13.0))

view.addSubview(text)

NSView オブジェクトをパネルに加える

最後にこの NSView オブジェクトをパネルに設定する。

panel.setAccessoryView(view)

いくつかのパーツをまとめて表示したい場合は、パーツごとに subview として view に addSubview(view) で追加してから、setAccessoryView(view) を使う。ポップアップボタンとテキストを一緒に表示すると、次のような表示になる。

ここにあるサンプルは、ポップアップボタンとテキストの説明のところのサンプルは一緒に使う前提で座標があわせてある。スライダーは、テキストも一緒にしてあるので、それだけで使うようになってる。全部あわせる場合は、座標を調節してください。