2012-06-02 3 views
1

NSTableViews/NSOutlineViews에서 몇 가지 특정 동작을 구현하는 방법에 대한 질문이 있습니다. 내가 달성하기 위해 노력하고있어NSOutlineView를 사용하여 Photoshop 레이어 패널을 모방합니다.

:

나는 포토샵의 레이어 패널의 동작을 모방 NSOutlineView을 만들려고 해요 (이하 "레이어"열이 계층 제외). 내 outlineview는 "레이어"열, "가시성"열 및 "잠금"열이있는 3 열 표입니다. "가시성"및 "잠금"열을 NSImageCells로 구현하고 "레이어"열을 사용자 지정 텍스트 및 이미지 셀로 구현했습니다.

  • 그냥 포토샵처럼, 사용자가 가시성 (안구) 아이콘을 클릭 할 수 있어야하고 서로 다른 행 위 또는 아래로 드래그 :

    특히, 여기에 내가 구현하기 위해 사투를 벌인거야 행동이다 클릭 한 첫 번째 행의 가시성에 따라 다른 행 가시성을 "on"또는 "off"로 설정하십시오. Photoshop이 레이어를 숨기고 표시하는 방법을 정확하게 설명하십시오. 테이블에 행 수가 많은 경우 자동 스크롤이 지원되어야합니다.

  • Photoshop처럼 "레이어"열의 하나 이상의 행이 선택되면 가시성/잠금 열에는 강조 표시 줄이 없어야합니다. 즉, 행 강조 표시가 열을 통과해서는 안됩니다. .

  • "가시성"또는 "잠금"열을 클릭하거나 드래그하여 테이블의 선택을 변경해서는 안되며 위에서 설명한대로 상태 만 변경하면됩니다.

나는 이것을 작동 시키려고 일주일 동안 벽에 머리를 두드렸다. 컨트롤 & 셀 프로그래밍 가이드, 테이블 뷰 프로그래밍 가이드, NSCell, NSActionCell, NSTableView, NSControl, NSOutlineView 및 NSOutlineViewDelegate 및 NSOutlineViewDataSource에 대한 프로토콜 참조 ...에 대한 클래스 참조를 읽었으며 일주일 내내 다른 접근 방식을 시도해 왔습니다. 나는 이걸 알아 내지 못하고있어.

누군가 나를 올바른 방향으로 인도 할 수 있습니까? 도움에 미리 감사드립니다!

답변

1

몇 가지 추가 웹 검색 및 실험을 통해, 나는 내 자신의 대부분의 질문에 대답 할 수

NSOUTLINEVIEW의 첫 번째 열을 강조

난 단지에 걸쳐 나타나는 선택 강조 표시를 할 수 있었다 NSOutlineView를 서브 클래 싱하고 그것은 내가 내 사용자 지정 NSCe을 무시했다는 것을주의하는 것이 중요

- (void)highlightSelectionInClipRect:(NSRect)clipRect 
{ 
    NSRange visibleRowIndexes = [self rowsInRect:clipRect]; 
    NSIndexSet *selectedRowIndexes = [self selectedRowIndexes]; 

    NSInteger currentRow = visibleRowIndexes.location; 
    NSInteger lastRow = currentRow + visibleRowIndexes.length; 

    NSColor *highlightColor; 

    //Determine color of selection bar based on key/main/first responder status. 
    if (self == [[self window] firstResponder] && [[self window] isMainWindow] && [[self window] isKeyWindow]) { 
     highlightColor = [NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.3 alpha:1.0]; 
    } else 
     highlightColor = [NSColor lightGrayColor]; 
    } 
    [highlightColor setFill]; 

    //Get the Rect of only the name column. This is the only column that will be highlighted. 
    //We'll intersect this rect with the row rect for the area to fill in. 
    NSInteger nameColumn = [self columnWithIdentifier:@"name"]; 
    NSRect nameColumnRect = [self rectOfColumn:nameColumn]; 

    while (currentRow < lastRow) { 
     if ([selectedRowIndexes containsIndex:currentRow]) { 
      NSRect drawRect = NSIntersectionRect([self rectOfRow:currentRow], nameColumnRect); 
      NSRectFill(drawRect); 
     } 
     currentRow++; 
    } 
} 

을 구현하여 첫 번째 열의 선택한 행 LL 서브 클래스의 drawInteriorWithFrame : 원한다면 InView : 방법은 다음과 같이 표준 하이라이트 그리기에서 그것을 유지 :

-(void) drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    //do drawing here...don't call super. 
} 

그래서 질문의 일부에 대한 해결책이있다. 이것이 "올바른"방법이 아니라면 알려주십시오 :).

클릭하기/IN이 VIS/LOCK 열이 나는 내가

-(NSIndexSet *) outlineView:(NSOutlineView *)outlineView selectionIndexesForProposedSelection:(NSIndexSet *)proposedSelectionIndexes 

방법으로이 일을해야한다고 지금 결정했습니다 선택 을 변경하지 마십시오 마우스로 끄는. 가시성 또는 잠금 열에서 발생한 드래그의 중간에있는 경우 현재 선택 된 행을 반환하여 선택 항목을 동일하게 유지합니다. 아직 구현하지는 못했지만 일단 최종 문제가 해결되면 쉽게 해결해야합니다 (아래 참조). 나는이 일에 정말 가까이 얻고 그들의 주에게

을 변경 위 또는 가시성/잠겨 열에 끌어 내리는

. 내 사용자 지정 NSCell에, 나는 다음과 같은 세 가지 방법을 무시했습니다

-(BOOL) startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView 
-(BOOL) continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inView:(NSView *)controlView 
-(void) stopTracking:(NSPoint) lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag 

내 마지막 문제까지있어, 그리고 여기있다 : 나는 때 드래그 동작을 내부에있어 때 내가 알 필요가 드래그 작업이 완료됩니다. 에서 : 원한다면 InView 내가 (그래서 기본을 어떤 값도 반환하지 않는다), 그 다음 나는 stopTracking를받을 내 NSCell에 서브 클래스에없는 재정을

+(BOOL) prefersTrackingUntilMouseUp 

경우

: 나는이 작업을 수행 할 수있는 두 가지 방법이있다 : mouseIsUp : 드래그 작업 중에 셀을 떠나서 다음 셀로 이동할 때마다 메시지 ...이 방법을 사용하여 드래그 작업이 언제 완료되는지 확인할 수 없습니다. ... 단지 훌륭 마우스 최대에 전화 ...하지만 문제는 테이블 아무튼입니다 : 내가 재정

+(BOOL) prefersTrackingUntilMouseUp 

을하고 YES 돌아 대신하는 경우

, 나는 stopTracking를 얻을 수 mouseDown에있는 셀의 UI를 업데이트하는 것처럼 보이거나 셀 안쪽으로 드래그하는 중입니다. 예를 들어, startTracking : ... 메서드에서 셀의 objectValue를 nil로 설정하면 (이미지가 더 이상 표시되지 않도록) 마우스 버튼이 다시 올라갈 때까지 커서가 업데이트되지 않습니다. 세포. prefersTrackingUntilMouseUp가 NO를 반환하면 즉시 업데이트됩니다.

그래서 둘 다 (mouseDown에서) 즉시 셀 UI를 업데이트 할 수 있어야하며 드래그 작업이 완료되는 시점을 알 수 있어야합니다. 이것은 퍼즐의 마지막 부분입니다. 누구든지 도와 줄 수 있습니까?

+0

무엇이 잘못되었는지 알아 냈습니다. 내 "drawInteriorWithFrame"은 셀의 이미지 속성을 그렸습니다 ... 객체 값이 아닙니다. 마우스가 셀을 떠날 때까지 이미지가 업데이트되지 않았습니다! –

+0

나는 이것이 동일한 질문이있는 경우에 다른 사람이이 답변을 따를 수 있도록 귀하의 질문에 대한 최종 답을 볼 수 있습니다. –

+0

고마워요 ... 여기 새로 왔습니다! –

관련 문제