Выделение отредактированного NSBrowserCell и рисование кольца фокусировки на его NSText?

Что я пытаюсь сделать

Я пытаюсь добавить функцию редактирования на месте в NSBrowser из Connection Kit. Я бы хотел, чтобы это поведение было функционально и визуально похоже на реализацию Finder.

Визуальный эффект, к которому я стремлюсь

Реализация Finder

Что у меня есть

Подкласс NSBrowserCell

Стрелки указывают на кольцо фокусировки и подсветку ячеек в реализации Finder и на отсутствие этого в моей.

Я пытался

  • Установка цвета фона ячейки в контроллере, в его методе drawInteriorWithFrame
  • То же самое для редактора полей
  • setFocusRingType:NSFocusRingTypeDefault для редактора полей и ячеек как в контроллере, так и в методе рисования
  • Ручное рисование цвета выделения в методе рисования
  • Различные комбинации вышеперечисленного, и, несомненно, некоторые из них я забыл.

Лучшее, что мне удалось, это получить область, окружающую изображение ячейки, окрашенную в цвет выделения.

Есть ли что-то фундаментальное, что мне здесь не хватает? Может ли кто-нибудь предложить отправную точку для подхода к этому? drawInteriorWithFrame место для этого?

У меня редактирование работает нормально - у меня просто проблемы с визуальными аспектами.

Код для разрешения редактирования:

// In the main controller
int selectedColumn = [browser selectedColumn];
int selectedRow = [browser selectedRowInColumn:selectedColumn];
NSMatrix *theMatrix = [browser matrixInColumn:selectedColumn];
NSRect cellFrame = [theMatrix cellFrameAtRow:selectedRow column:0];

NSText *fieldEditor = [[browser window] fieldEditor:YES 
                                          forObject:editingCell];

[cell editWithFrame:cellFrame 
             inView:theMatrix
             editor:fieldEditor 
           delegate:self
              event:nil];

И в моем подклассе NSBrowserCell:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {  

    image = [[self representedObject] iconWithSize:[self imageSize]];

    [self setImage:image];

    NSRect imageFrame, highlightRect, textFrame;

    // Divide the cell into 2 parts, the image part (on the left) and the text part.
    NSDivideRect(cellFrame, &imageFrame, &textFrame, ICON_INSET_HORIZ + ICON_TEXT_SPACING + [self imageSize].width, NSMinXEdge);
    imageFrame.origin.x += ICON_INSET_HORIZ;
    imageFrame.size = [self imageSize];

    [super drawInteriorWithFrame:cellFrame inView:controlView];
}

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent {
    NSRect imageRect, textRect;
    NSDivideRect(aRect , &imageRect, &textRect, 20, NSMinXEdge);
    self.editing = YES;
    [super editWithFrame: textRect inView: controlView editor:textObj delegate:anObject event:theEvent];
}

person Michael Robinson    schedule 11.03.2012    source источник


Ответы (2)


Кольцо фокусировки придется рисовать самому. Добавьте следующее в drawWithFrame в свой подкласс NSBrowserCell.

[NSGraphicsContext saveGraphicsState];
[[controlView superview] lockFocus];

NSSetFocusRingStyle(NSFocusRingAbove);
[[NSBezierPath bezierPathWithRect:NSInsetRect(frame,-1,-1)] fill];

[[controlView superview] unlockFocus];
[NSGraphicsContext restoreGraphicsState];
person mpergand    schedule 15.03.2012
comment
Спасибо @mpergand с вашим кодом, я думаю, что смогу достичь своей цели. - person Michael Robinson; 21.03.2012

Попробуйте создать подкласс объекта редактора полей и переопределить функцию drawRect следующим образом:

- (void)drawRect:(NSRect)rect {

    [super drawRect:rect];

    NSSetFocusRingStyle(NSFocusRingOnly);

    NSRectFill([self bounds]);

}

Надеюсь это поможет.

person arun.s    schedule 16.03.2012