Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(393)

Unified Diff: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm

Issue 2518933004: Add multiple selection support to chooser on desktops (Closed)
Patch Set: address comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
diff --git a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
index 409d5e41c537ac700067376fb782e7685e5dbab3..a2ec7c0b18564436be485f8081d02db36dfef2ec 100644
--- a/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
+++ b/chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm
@@ -315,16 +315,19 @@ void ChooserContentViewController::OnOptionRemoved(size_t index) {
// selected, if so, deselect it. Also if the removed item is before the
// currently selected item, the currently selected item's index needs to
// be adjusted by one.
- NSInteger idx = static_cast<NSInteger>(index);
- NSInteger selected_row = [table_view_ selectedRow];
- if (selected_row == idx) {
- [table_view_ deselectRow:idx];
- } else if (selected_row > idx) {
- [table_view_
- selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row - 1]
- byExtendingSelection:NO];
+ NSIndexSet* selected_rows = [table_view_ selectedRowIndexes];
+ NSMutableIndexSet* updated_selected_rows = [NSMutableIndexSet indexSet];
+ NSUInteger row = [selected_rows firstIndex];
+ while (row != NSNotFound) {
+ if (row < index)
+ [updated_selected_rows addIndex:row];
+ else if (row > index)
+ [updated_selected_rows addIndex:row - 1];
+ row = [selected_rows indexGreaterThanIndex:row];
}
+ [table_view_ selectRowIndexes:updated_selected_rows byExtendingSelection:NO];
+
UpdateTableView();
}
@@ -379,14 +382,11 @@ void ChooserContentViewController::OnRefreshStateChanged(bool refreshing) {
void ChooserContentViewController::UpdateTableView() {
[table_view_ setEnabled:chooser_controller_->NumOptions() > 0];
// For NSView-based table views, calling reloadData will deselect the
- // currently selected row, so |selected_row| stores the currently selected
- // row in order to select it again.
- NSInteger selected_row = [table_view_ selectedRow];
+ // currently selected row, so |selected_rows| stores the currently selected
+ // rows in order to select them again.
+ NSIndexSet* selected_rows = [table_view_ selectedRowIndexes];
[table_view_ reloadData];
- if (selected_row != -1) {
- [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row]
- byExtendingSelection:NO];
- }
+ [table_view_ selectRowIndexes:selected_rows byExtendingSelection:NO];
}
@implementation ChooserContentViewCocoa
@@ -500,6 +500,10 @@ void ChooserContentViewController::UpdateTableView() {
// Make the column title invisible.
[tableView_ setHeaderView:nil];
[tableView_ setFocusRingType:NSFocusRingTypeNone];
+ [tableView_
+ setAllowsMultipleSelection:chooserController_->AllowMultipleSelection()
+ ? YES
+ : NO];
// Spinner.
// Set the spinner in the center of the scroll view.
@@ -794,7 +798,14 @@ void ChooserContentViewController::UpdateTableView() {
}
- (void)accept {
- chooserController_->Select([tableView_ selectedRow]);
+ NSIndexSet* selectedRows = [tableView_ selectedRowIndexes];
+ NSUInteger index = [selectedRows firstIndex];
+ std::vector<size_t> indices;
+ while (index != NSNotFound) {
+ indices.push_back(index);
+ index = [selectedRows indexGreaterThanIndex:index];
+ }
+ chooserController_->Select(indices);
}
- (void)cancel {
@@ -818,15 +829,16 @@ void ChooserContentViewController::UpdateTableView() {
}
- (void)updateContentRowColor {
- NSInteger selectedRow = [tableView_ selectedRow];
+ NSIndexSet* selectedRows = [tableView_ selectedRowIndexes];
NSInteger numOptions =
base::checked_cast<NSInteger>(chooserController_->NumOptions());
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
for (NSInteger rowIndex = 0; rowIndex < numOptions; ++rowIndex) {
+ BOOL isSelected = [selectedRows containsIndex:rowIndex];
// Update the color of the text.
[[self tableRowViewText:rowIndex]
- setTextColor:(rowIndex == selectedRow ? [NSColor whiteColor]
- : [NSColor blackColor])];
+ setTextColor:(isSelected ? [NSColor whiteColor]
+ : [NSColor blackColor])];
// Update the color of the image.
if (chooserController_->ShouldShowIconBeforeText()) {
@@ -834,14 +846,13 @@ void ChooserContentViewController::UpdateTableView() {
[[self tableRowViewImage:rowIndex]
setImage:gfx::NSImageFromImageSkia(gfx::CreateVectorIcon(
gfx::VectorIconId::BLUETOOTH_CONNECTED,
- rowIndex == selectedRow ? SK_ColorWHITE
- : gfx::kChromeIconGrey))];
+ isSelected ? SK_ColorWHITE : gfx::kChromeIconGrey))];
} else {
int signalStrengthLevel =
chooserController_->GetSignalStrengthLevel(rowIndex);
if (signalStrengthLevel != -1) {
int imageId =
- rowIndex == selectedRow
+ isSelected
? kSignalStrengthLevelImageSelectedIds[signalStrengthLevel]
: kSignalStrengthLevelImageIds[signalStrengthLevel];
[[self tableRowViewImage:rowIndex]
@@ -853,10 +864,9 @@ void ChooserContentViewController::UpdateTableView() {
// Update the color of paired status.
NSTextField* pairedStatusText = [self tableRowViewPairedStatus:rowIndex];
if (pairedStatusText) {
- [pairedStatusText
- setTextColor:(skia::SkColorToCalibratedNSColor(
- rowIndex == selectedRow ? gfx::kGoogleGreen300
- : gfx::kGoogleGreen700))];
+ [pairedStatusText setTextColor:(skia::SkColorToCalibratedNSColor(
+ isSelected ? gfx::kGoogleGreen300
+ : gfx::kGoogleGreen700))];
}
}
}

Powered by Google App Engine
This is Rietveld 408576698