home link download back number special issue

HMDT - Special Issue / Sketch BP / ドローオブジェクトに編集モードを追加


- Modification -

ドローオブジェクトに編集モードを追加

ドローオブジェクトの編集モード

ドローオブジェクトのルートクラスである SKTGraphic に編集モードを追加しよう。とはいっても、実はすでに編集モードは組み込まれている。それを強化するいくつかのメソッドを追加してみよう。

基本的に、ドローオブジェクトをダブルクリックすると、編集モードに突入するんだ。そのためのメソッドが、現時点では以下のようなものがある。

  • isEditable
  • startEditingWithEvent:inView:
  • endEditingInView:

isEditable はそのドローオブジェクトが編集可能かどうか示すもの。startEditingWithEvent:inView:endEditingInView: は、それぞれ編集モードの始めと終わりに呼ばれるんだ。

で、ここに以下のようなインスタンス変数と、メソッドを追加する。

Sketch/DocumentModel.subproj/SKTGraphic.h
@interface SKTGraphic : NSObject <NSCopying> {
    @private
    ...
    struct __gFlags {
        unsigned int drawsFill:1;
        unsigned int drawsStroke:1;
        unsigned int manipulatingBounds:1;
//  By mkino [start]
        unsigned int editing:1;
//  By mkino [end]
        unsigned int _pad:28;
    } _gFlags;
    ...
}

- (BOOL)isEditable;
- (void)startEditingWithEvent:(NSEvent *)event inView:(SKTGraphicView *)view;
- (void)endEditingInView:(SKTGraphicView *)view;
// By mkino [start]
- (BOOL)editWithEvent:(NSEvent*)event inView:(SKTGraphicView*)view;
- (BOOL)isEditing;

- (void)deleteForEditingInView:(SKTGraphicView*)view;
// By mkino [end]

インスタンス変数 editing は、いま編集モードにいるかどうかを示すフラグ。startEditingWithEvent:inView:endEditingInView: で更新される。

editingWithEvent:inView: は、編集モード中のイベントを受け取るもの。isEditing は、いま編集モードかどうか調べるもの。最後の deleteForEditingInView: は、編集モード中に delete キーが押されたときに、delete 要求を送るものだ。

これらのメソッドは、ポリゴンツールとか、ベジエ曲線ツールとかで使われるよ。


メソッドの追加

上で追加しようとしているメソッドのうち、editWithEvent:inView:deleteForEditingInVew: は、サブクラスでオーバーライドされて使われるものなんだ。だから、SKTGraphic では、メソッドそのものの実装はほとんどない。実装する必要があるのは、それを呼び出すところだ。

isEditing は、追加されたインスタンス変数 editing を返すだけだ。


editWithEvent:inView: のための実装

editWithEvent:inView: のための実装を見てみよう。SKTGraphicView の mouseDown: を使う。

Sketch/SKTGraphicView.m
- (void)mouseDown:(NSEvent *)theEvent {
    Class theClass = [[SKTToolPaletteController sharedToolPaletteController] currentGraphicClass];
    if ([self editingGraphic]) {
// By mkino [start]
        if ([[self editingGraphic] editWithEvent:theEvent inView:self]) {
            return;
        }
// By mkino [end]
        [self endEditing];
    }
    ...

}

moouseDown: で、編集中のドローオブジェクトがあるなら、そいつにマウスイベントを投げてやる。YES が返ってきたら、そのまま return。編集モード続行。NO だったら、編集モード終了。


deleteForEditingInVew: のための実装

deleteForEditingInVew: は、delete キーが押されたことを、編集中のドローオブジェクトに送るもの。これも SKTGraphicView を使う。delete: の中だ。

Sketch/SKTGraphicView.m
- (IBAction)delete:(id)sender {
    NSArray *selCopy = [[NSArray allocWithZone:[self zone]] initWithArray:[self selectedGraphics]];
// By mkino [start]
    if (_editingGraphic) {
        [_editingGraphic deleteForEditingInView:self];
    }
// By mkino [end]
    ...

}

delete の処理で、選択中のドローオブジェクトがあったら、そっちに送ってやる。このメソッドは、ポリゴンオブジェクトとかで、編集中のアンカーポイントを消したりするのに使われるよ。


- ソースコードのダウンロード -

HMDT - Download / Sketch BP


Home | Link | Download | Back Number | Speciall Issue

Sketch BP

mailto: mkino@xd5.so-net.ne.jp

HMDT