NSOutlineView Изменение цвета строки группы - PullRequest
2 голосов
/ 18 февраля 2011

В моем NSOutlineview я использую пользовательскую ячейку, которая является подклассом из NSTextFieldCell, Мне нужно нарисовать другой цвет для групповой строки и для обычной строки, когда его выделено,

Для этого я сделал следующее,

-(id)_highlightColorForCell:(NSCell *)cell
{
    return [NSColor colorWithCalibratedWhite:0.5f alpha:0.7f];
}

Да, я знаю его частный API, но я не мог найти другого способа, это работает очень хорошо для Normal Row, но не влияет на Group Row, есть ли способ изменить цвет группы,

С уважением Rohan

1 Ответ

3 голосов
/ 19 февраля 2011

На самом деле вы можете сделать это, не полагаясь на частные API, по крайней мере, если вы хотите использовать Mac OS X 10.4 или выше.

Добавьте в подкласс ячейки следующее:

- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
  // Returning nil circumvents the standard row highlighting.
  return nil;
}

И затем создать подкласс NSOutlineView и повторно реализовать метод, - (void) highlightSelectionInClipRect: (NSRect) clipRect;

Вот пример, который рисует один цвет для строк, не входящих в группу, и другой для строк группы

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

  NSUInteger selectedRow = [selectedRowIndexes firstIndex];
  while (selectedRow != NSNotFound)
  {
    if (selectedRow == -1 || !NSLocationInRange(selectedRow, visibleRows)) 
    {
      selectedRow = [selectedRowIndexes indexGreaterThanIndex:selectedRow];
      continue;
    }   

    // determine if this is a group row or not
    id delegate = [self delegate];
    BOOL isGroupRow = NO;
    if ([delegate respondsToSelector:@selector(outlineView:isGroupItem:)])
    {
      id item = [self itemAtRow:selectedRow];
      isGroupRow = [delegate outlineView:self isGroupItem:item];
    }

    if (isGroupRow)
    { 
      [[NSColor alternateSelectedControlColor] set];
    } else {
      [[NSColor secondarySelectedControlColor] set];
    }

    NSRectFill([self rectOfRow:selectedRow]);
    selectedRow = [selectedRowIndexes indexGreaterThanIndex:selectedRow];
  }
}
...