ページ

2008年6月7日土曜日

SimpleCap (5) 選択範囲の見た目を変更

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

選択範囲の表示がどうも野暮ったい感じがしたので色々と変えてみた。


その結果がこれ。ちょっと HUD(Head Up Display)表示っぽくなった。意図した訳ではないのだが。


- - - -
ボタンの位置は右下だったものを右上に変えた。その他中心に置いてみたりと色々と試行錯誤中。

2008年6月6日金曜日

SimpleCap (4) 選択範囲でタイマー

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

次は選択範囲のタイマー。これは SimpeCapで一番実装したかった機能の一つ。範囲を選択してタイマーボタンを押すと数秒後(現在5秒固定)に選択範囲のキャプチャ画像を作成するというもの。

例えばこんな範囲を選択しておいてタイマーをスタートする。


タイマー起動中にメニューを出すとこんな感じでキャプチャできる。


Dockまわりも同様に選択しておくと。


こうなる。



実装そのものは以前の検証結果を組み入れるだけなので難しくない。面倒だったのはアプリケーションとして動作させる場合、各モード(Window / Selection / Screen Timer)間の調整。現状はまだ怪しい部分が残っているが問題は随時つぶしていくことにしよう。

- - - - -
念願?の選択範囲タイマーが実装できた。これはちょっとうれしい。
なおメニューのキャプチャについては別の方法を考えていて、特別なモードを設けるつもり。

2008年6月5日木曜日

SimpleCap (3) 選択範囲機能

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

RubberBandの組み込みが終わったのでキャプチャ機能を追加する。

ボタンを押した時のハンドラに以前のキャプチャコードを貼付けるだけ。
SelectionHandler.m

-(void)clickedAtTag:(NSNumber*)tag
{
CGImageRef cgimage;

switch ([tag intValue]) {
case TAG_CANCEL:
break;

case TAG_TIMER:
break;

case TAG_COPY:
cgimage = CGWindowListCreateImage([self CGRectFromNSRect:_rect],
kCGWindowListOptionOnScreenBelowWindow,
[_capture_controller windowID],
kCGWindowImageDefault);
[_capture_controller copyImage:cgimage];
break;

case TAG_RECORD:
cgimage = CGWindowListCreateImage([self CGRectFromNSRect:_rect],
kCGWindowListOptionOnScreenBelowWindow,
[_capture_controller windowID],
kCGWindowImageDefault);
[_capture_controller saveImage:cgimage];
break;

default:
break;
}
[_capture_controller exit];
}


CANCEL と COPY(クリップボード)、RECORD(キャプチャ)を実装した。TIMER(タイマー)は今後実装する。


ちなみにボタンや数字を少し大きくした。実際に画面全体で使ってみると小さくて見づらかったため。

ソース:SimpleCap-3.zip

2008年6月4日水曜日

RubberBand(その38)SimpleCapへ組み込み

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

さていよいよ RubberBandを SimpleCap へ組み込む。まずは SimpleCap のアーキテクチャのおさらいから。


SimpleCap は単一の NSWindowとNSViewから構成されていて、キャプチャ毎に処理クラス(ハンドラ)を用意している。NSViewへの表示やイベントハンドリングは主要メッセージをこれらのハンドラへ転送している。転送対象のメソッドは Handlerプロトコルで定義されている。

Handler.h

@protocol Handler

- (void)reset;
- (void)start;
- (void)tearDown;
- (void)drawRect:(NSRect)rect;
- (void)mouseMoved:(NSEvent *)theEvent;
- (void)mouseDown:(NSEvent *)theEvent;
- (void)keyDown:(NSEvent *)theEvent;

@end


今まで作ってきた RubberBandは NSViewのサブクラスだが使っているメソッドは上記に含まれるのでハンドラで十分実装できる。そこで SelectionHandler へ RubberBand のソースコードを移植する。これは若干の手直しでできた。とりあえず組み立て完了。




- - - -
RubberBandを開始してからようやくここまで来られた。時間がかかっただけに今回はちょっとうれしい。趣味でやっていると遅々として進まない部分もあるが、こうして形が見えてくるとやっぱり楽しい。

次回以降、いよいよ SimpleCapの選択範囲キャプチャの実装に入っていく。

2008年6月3日火曜日

RubberBand(その37)コピー&ペースト(2)

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

RubberBandへコピー機能を組み込んでみる。ボタンを押したときの RubberBandの内容をペーストボードへコピーする。

ボタンを押したときのイベントハンドラにコードを実装する。今回は背景画像を表示している ImageView.m の中に記述することにした。

ImageView.m

-(void)clickedAtTag:(NSNumber*)tag
{
[self lockFocus];
NSBitmapImageRep *bitmap_rep =[[NSBitmapImageRep alloc] initWithFocusedViewRect:_rect];
[self unlockFocus];
NSData* data = [bitmap_rep representationUsingType:NSTIFFFileType
properties:[NSDictionary dictionary]];
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self];
[pb setData:data forType:NSTIFFPboardType];
}


RubberBandの選択範囲に表示されている内容を NSBitmapImageRep へ落とし、これを TIFFデータに変換してペーストボードへ書き込む。ペーストボードタイプには NSTIFFPboardType を使ってみた。

実行して任意の範囲をコピーし、プレビューに貼付けてみる。

できた。RubberBandやボタンが含まれているのは手抜き。。

前回のソフトを使ってペーストボードの内容を見てみる。
(
"public.tiff",
"NeXT TIFF v4.0 pasteboard type",
"com.apple.pict",
"Apple PICT pasteboard type"
)

TIFFだけでなく PICTも自動的に用意してくれるようだ。

2008年6月2日月曜日

RubberBand(その37)コピー&ペースト(1)

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

次は選択範囲をコピー&ペーストできるようにする。どんなデータ型をペーストボードへ入れるべきか?他のアプリを調べてみよう。他のアプリでコピーした内容を表示する簡単なアプリを作ってみた。



ソース:PasteType.zip

コードはこれだけ。ペーストボード内のデータ型一覧をテキストビューへ表示する。
AppController.m

-(IBAction)paste:(id)sender
{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[_text insertText:[[pb types] description]];
[_text insertText:@"\n"];
}



まずはプレビューから。
プレビュー
(
"public.tiff",
"NeXT TIFF v4.0 pasteboard type",
"dyn.agu8yww4xqz0gn25yrf106wpsq31u",
IKSelectionInfo,
"com.apple.pict",
"Apple PICT pasteboard type"
)

TIFF と PICT、それに珍しいものとして IKSelectionInfo というのがある。ImageKit に関係するものだろうか。

次にエクセル。PICTを除きオリジナルのものが多いようだ。
Excel
(
"dyn.agk8yky4mk6",a
"CorePasteboardFlavorType 0x44534947",
"dyn.agk8y4znwk2",
"CorePasteboardFlavorType 0x4D555246",
"dyn.agk8yny4unq",
"CorePasteboardFlavorType 0x45535053",
"com.apple.pict",
"Apple PICT pasteboard type",
"dyn.agk8y8vwxkq",
"CorePasteboardFlavorType 0x4F465343"
)


サファリは画像だけでなく URLや文字列もペーストボードに入れている。画像だけ見るとやはり TIFFとPICT。
Safari
(
"public.tiff",
"NeXT TIFF v4.0 pasteboard type",
"dyn.agu8zs3pcnzme2641rf4guzdmsv0gn64uqm10c6xenv61a3k",
WebURLsWithTitlesPboardType,
"dyn.agu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu",
"Apple URL pasteboard type",
"public.url",
"CorePasteboardFlavorType 0x75726C20",
"public.url-name",
"CorePasteboardFlavorType 0x75726C6E",
"public.utf8-plain-text",
NSStringPboardType,
"com.apple.flat-rtfd",
"NeXT RTFD pasteboard type",
"dyn.agu8y63n2nuuha5dbrf1ca2pxqry0wkduqf31k3pcr7u1e3basv61a3k",
"NeXT plain ascii pasteboard type",
"com.apple.pict",
"Apple PICT pasteboard type"
)


FireFoxは PICTだけ。
Firefox
(
"com.apple.pict",
"Apple PICT pasteboard type",
"dyn.agk8y4x44ry",
"CorePasteboardFlavorType 0x4D4F5A6D"
)


グラブも TIFFとPICT。
グラブ
(
"public.tiff",
"NeXT TIFF v4.0 pasteboard type",
"com.apple.pict",
"Apple PICT pasteboard type"
)



- - - - -
概ね TIFFとPICTを用意すればよさそうだ。次回以降、選択範囲のコピーを実装していく。

2008年6月1日日曜日

RubberBand(その36)拡大縮小時にボタンを隠す

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

RubberBandを拡大縮小しているとケースによってはボタンの位置があちこち動いてみづらい。移動中はボタンを隠すようにしよう。

これは簡単でドラッグ開始時に ThinButtonBar (NSView)を非表示すれば良い。

[_button_bar setHidden:YES];




ドラッグが終わったら再び表示すれば良い。