2011年4月21日木曜日

Cocoa なんちゃってtabbed interface(5)NSTrackingArea

たくさんタブが表示された時の処理、の前に懸案だったNSTrackingAreaで「タブを閉じるボタン」を表示する処理を実装してみる。

タブを管理しているView全体をTrakingAreaにして、mouseMovedでカーソルのあるタブを検出、「タブを閉じるボタン」を表示していなければ表示する、という流れになる。

CellにshowedCloseButtonというBOOL値を持たせて、YESなら描画処理の中で「閉じるボタン」を描画する。
    if (showedCloseButton) {
        [[self image] drawAtPoint:NSMakePoint(cellFrame.origin.x+CELL_LEFT_SPACING, (cellFrame.size.height-stringSize.height) /2) fromRect:NSZeroRect
                    operation:NSCompositeSourceOver fraction:0.8];
    }
管理View側のmouseMoved、mouseExitedはこんな感じ。(汚いソースで恥ずかしいなあ、自分用備忘録なので勘弁して下さい)
-(void)mouseMoved:(NSEvent *)theEvent{
    
    NSPoint point = [self convertPointFromBase:[theEvent locationInWindow]];
    NSInteger index = [self cellAtPoint:point];
   
    if (index>-1) {
        if (index==showedCloseButtonCellIndex) return;
        else{
            MyCell *cell;
            if(showedCloseButtonCellIndex!=NO_SHOWED){
                cell=[tabs objectAtIndex:showedCloseButtonCellIndex];
                cell.showedCloseButton=NO;
            }
            cell=[tabs objectAtIndex:index];
            if (!cell.showedCloseButton) {
                cell.showedCloseButton=YES;
                showedCloseButtonCellIndex=index;
                [self setNeedsDisplay:YES];
            }
        }
    }else{
        if (showedCloseButtonCellIndex!=NO_SHOWED) {
            MyCell* cell=[tabs objectAtIndex:showedCloseButtonCellIndex];
            cell.showedCloseButton=NO;
            [self setNeedsDisplay:YES];
            showedCloseButtonCellIndex=NO_SHOWED;
        }
    }
    
}
-(void)mouseExited:(NSEvent *)theEvent{
    if(showedCloseButtonCellIndex!=NO_SHOWED){
        MyCell* cell=[tabs objectAtIndex:showedCloseButtonCellIndex];
        cell.showedCloseButton=NO;
        [self setNeedsDisplay:YES];
        showedCloseButtonCellIndex=NO_SHOWED;
    }
}

これで無事「閉じるボタン」が描画されるようになる。

マウスがViewを抜けるとボタンも消える。

うーん、この後は「閉じるボタン」の上にカーソルが来た時の処理、マウスクリックされた時、mouseUpが来た時、と続くわけだが・・・。

0 件のコメント:

コメントを投稿