ページ

2009年11月4日水曜日

Safari用独自プラグインを作る(15) - ツールバーを追加する #4

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: Safari用独自プラグインを作る(14) - ツールバーを追加する #3

前回追加したボタンがしょぼいので改良する(そもそも押せない)。


ツールバー用のボタン画像

Safari のリソースを開いてボタンがどうなっているのか見てみた。


見る限りでは始めから背景のボタンと一緒に描かれた状態となっている。また状態によっていろいろな画像が用意されている。例えば十時マークのボタン(ブックマーク追加)の場合、6つの画像(うち一つはPDF)があった。
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 側で自動的にディゼーブル画像〜ハイライト減〜に変換していた)。イネーブルにするにはどうしたものか。

(続く)