NSTableView: Как вы можете выделить элемент правой кнопкой мыши?
У меня есть NSTableView
, к которому элементы добавляются без вмешательства пользователя. Когда пользователь возвращается в диалоговое окно, содержащее NSTableView
и щелкает элемент, этот элемент выделяется. Однако этот элемент не выделяется, если щелкнуть правой кнопкой мыши. Есть ли способ выделить элемент, который щелкают правой кнопкой мыши?
У меня есть следующее в настоящее время:
void Dialog::menuAction(ui::Menu::Item* item)
{
// Highlight the item clicked
[tableView row:item select:YES]
...
}
Но это не похоже на работу.
4 ответа
Это может быть не совсем то, что вы хотите, но это может помочь. У меня была проблема с получением строки, которая была нажата правой кнопкой мыши, чтобы получить контекстное меню. Я использую контурное представление, а не табличное представление, и оно находится в главном окне, а не в диалоге.
У меня есть выход к моему внешнему виду. В объекте, который обрабатывает меню, у меня есть следующий метод:
-(void)setSelectionFromClick{
NSInteger theClickedRow = [myOutlineView clickedRow];
NSIndexSet *thisIndexSet = [NSIndexSet indexSetWithIndex:theClickedRow];
[myOutlineView selectRowIndexes:thisIndexSet byExtendingSelection:NO];
}
Я вызываю этот метод в начале каждого действия меню.
Выбранный ряд устанавливается, какая бы кнопка не нажата. Но выбор изменяется только автоматически при нажатии левой кнопки. Кстати, это также работает с нажатой клавишей управления.
Мое решение, которое до сих пор кажется самым чистым, состоит в том, чтобы создать подкласс NSTableView и реализовать его menuForEvent
сообщение. Просто сделайте свою таблицу подклассом этого, и вы автоматически получите правильное поведение:
@interface CustomTableView : NSTableView
@end
@implementation CustomTableView
- (NSMenu*) menuForEvent:(NSEvent*)event // override
{
// Get to row at point
NSInteger row = [self rowAtPoint:[self convertPoint:event.locationInWindow fromView:nil]];
if (row >= 0) {
// and check whether it is selected
if (NOT [self isRowSelected:row]) {
// No -> select that row
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
}
}
return [super menuForEvent:event];
}
@end
Аналогично должно работать с NSOutlineView
.
Обратите внимание, как код решает, когда выделить строку. Это точно имитирует поведение, которое вы можете наблюдать в Finder, например:
- Если вы щелкните правой кнопкой мыши существующий выбор, особенно если это несколько элементов, они останутся выделенными.
- Если щелкнуть правой кнопкой мыши за пределами текущего выделения, новая выбранная строка станет новым выделением.
Однако это не идеально: Finder изменяет выбор только после того, как пользователь фактически использует один из элементов контекстного меню. Если пользователь закрывает всплывающее меню, выбор не изменится. Мой код, однако, изменяет выбор до того, как пользователь сможет выбрать из всплывающего меню. Не стесняйтесь улучшать это и делитесь здесь.
просто быстрая версия решения @Thomas Tempelmann.
public class TableViewWithRightClickSelect: NSTableView
{
override open func menu(for event: NSEvent) -> NSMenu?
{
let row = self.row(at: self.convert(event.locationInWindow, from: nil))
if row >= 0
{
self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false)
}
return super.menu(for: event)
}
}
Я думаю, что вы должны создать подкласс NSTableView и переопределить OnMouseUp и OnMouseDown, чтобы возвращать события левого клика, когда вы получаете события правого клика.