BathyScaphe ネタ(その22)

さて、いつもいつも「どうでもいい」所にばかり時間をかける tsawada2 の今日のターゲットはこれ:


何が気になるかって、メニューの横幅が長過ぎるということだ。スレッドタイトルをそのままメニュー項目に流し込んでいることが原因である。横幅が長いと圧迫感がある上に、意外と操作もしづらい。じゃあ、スレッドタイトルを短く切り詰めてから使えよ!ということになるのだが、しばらく他の機能のことを考えてばかりいたので、今まで手付かずなままだったのだ。
そして今日、どういう訳か…唐突にこの問題を解決しなければ!と思い立った。以前に調べものをしていて偶然出会った発言(http://www.tech-arts.co.jp/macosx/macosx-dev-jp/htdocs/2500/2553.html)を手がかりに、以下のようなメソッドを NSString のカテゴリに追加してみた*1

- (NSString *) stringWithTruncatingForMenuItemOfWidth: (float) width indent: (BOOL) shouldIndent activeItem: (BOOL) isActiveItem
{
	NSMutableString *tmp;
	OSStatus err;

	if (shouldIndent) {
		tmp = [[NSMutableString alloc] initWithFormat: @"  %@", self];
	} else {
		tmp= [self mutableCopy];
	}

	err = TruncateThemeText((CFMutableStringRef)tmp, kThemeMenuItemFont,
							(isActiveItem ? kThemeStateActive : kThemeStateInactive), width, truncMiddle, NULL);
	if (err != noErr) {
		NSLog(@"TruncateThemeText failed with error %d", err);
	}
	return [tmp autorelease];
}

そして、上記メソッドを利用して文字列を短縮してからメニューを作るようにした。ついでに、短縮した場合は元のタイトルをツールチップで表示するようにフォローしたよ:

上図は文字列の幅が 350px 以内に収まるように短縮した状態のメニューだが、もうちょっと短くしてもいいかもしれないな。


もちろん、他の部分も色々手直ししている所です…バグ潰しもがんばらナイト!

*1:スーパーpre記法のテストも兼ねる