(前回)Cocoaの日々: Safari用独自プラグインを作る(14) - ツールバーを追加する #3
前回追加したボタンがしょぼいので改良する(そもそも押せない)。
ツールバー用のボタン画像
Safari のリソースを開いてボタンがどうなっているのか見てみた。
ToolbarAddBookmarkButton.png ToolbarAddBookmarkButtonDisabled.png ToolbarAddBookmarkButtonDisabledInactive.png ToolbarAddBookmarkButtonInactive.png ToolbarAddBookmarkButtonPushed.png ToolbarAddBookmarkTemplate.pdf
- Enable/Disable 2パターン × Active/InActive2パターン + 押下1パターン + 1
- 28 x 23 ピクセル
Evernote プラグインのアイコンが背景無しの画像だったので、Safariもそうかと思いきや違かった。Evernote プラグインの場合は、Safari内のボタン画像もしくは標準などの何かのボタンコントロールを流用して合成していると思われる。
今回は始めから背景ボタンがあるものを用意した。ボタン画像は Safari のそれを流用させてもらった。
こんな感じ。
なお画像の作成には Pixelmator を使った(試用版)。
ちょっと試したところでは PowerBook G4 でも軽く十分使えそう。GUIもあか抜けていてこれはいい。欲しいな(もう少し安ければ..)。
ボタンを適正なサイズで表示する
さて前回の追加では下図のようなとほほな表示になっていた。これを(他のボタンのように)拡大しない等倍のサイズで表示しよう。
前回のコードでは用意した画像から NSImage を作り、それを NSToolbarItem へ追加していた。
item = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];
[item setImage:image];
この方法だと NSToolbar 側の高さに合わせて自動的に拡大されてしまうようだ。-[NSToolbarItem setMinSize:] などのメソッドも用意されているが、これは NSImage ではなく NSView を使う場合のみ適用される。
(参考)Mac Dev Center: Toolbar Programming Topics for Cocoa: Setting a Toolbar Item’s Size
そこで NSImageView へ画像を表示させ、それを NSToolbarItem へ貼付けることにしてみた。こんな感じ。
NSBundle* bundle = [NSBundle bundleForClass:[SXSafariToolbarSwizzler class]];
NSString* path = [bundle pathForResource:@"ToolbarSimpleCapButton" ofType:@"png"];
NSImage* image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease];
NSSize size = [image size];
NSImageView* view = [[[NSImageView alloc] initWithFrame:NSMakeRect(0, 0, size.width, size.height)] autorelease];
[view setImage:image];
item = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];
[item setLabel:@"Take a screenshot"];
[item setTarget:self];
[item setAction:@selector(takeScreenshot:)];
// [item setMinSize:size];
// [item setMaxSize:size];
実行してみよう。
ちゃんと出た。いい感じだ。
なお上記ソース最後の setMinSize;, setMaxSize: は無くても大丈夫だったのでコメントアウトしてある。Safari の場合、ツールバーの大きさは1種類なのでこのあたりは気にしなくても良いのかもしれない。実際デバッグ出力すると minSize, maxSize 共にビューのサイズに設定されていた。
- - - - -
適正なサイズでボタンが表示ができたもののディゼーブル状態で押す事ができない。見た目、イネーブルなのはイネーブルの画像を貼付けてある為(そういう意味では setImage: の場合は NSToolbarItem 側で自動的にディゼーブル画像〜ハイライト減〜に変換していた)。イネーブルにするにはどうしたものか。
(続く)