Что я пытаюсь сделать
Я пытаюсь добавить функциональность редактирования на месте в NSBrowser комплекта подключения.Мне бы хотелось, чтобы это поведение было функционально и визуально похоже на реализацию Finder.
Визуальный эффект, к которому я стремлюсь
![Finder's implementation](https://i.stack.imgur.com/ZfF22.png)
То, что у меня есть до сих пор
![NSBrowserCell subclass](https://i.stack.imgur.com/YnCYQ.png)
Стрелки показывают фокусировочное кольцо и подсветку ячеек в реализации 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];
}