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

Unified Diff: chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm

Issue 2072003002: Desktop Capture Picker Window New UI For Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comment Fix Created 4 years, 6 months 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/media_picker/desktop_media_picker_controller.mm
diff --git a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
index 4e8d5c8446a07d4d17c8a1843e8ef204033f5135..e4cb6199fdf58125fc128ad67163c31bffe2c412 100644
--- a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
+++ b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
@@ -14,7 +14,9 @@
#import "chrome/browser/ui/cocoa/key_equivalent_constants.h"
#import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_item.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/google_chrome_strings.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
@@ -28,14 +30,23 @@
namespace {
tapted 2016/06/22 07:08:42 consider a using content::DesktopMediaID; before
qiangchen 2016/06/22 23:54:24 Done.
-const int kInitialContentWidth = 620;
-const int kMinimumContentWidth = 500;
-const int kMinimumContentHeight = 390;
-const int kThumbnailWidth = 150;
-const int kThumbnailHeight = 150;
-const int kFramePadding = 20;
-const int kControlSpacing = 10;
-const int kExcessButtonPadding = 6;
+const CGFloat kInitialContentWidth = 620;
+const CGFloat kMinimumContentWidth = 500;
+const CGFloat kMinimumContentHeight = 390;
+const CGFloat kThumbnailWidth = 150;
+const CGFloat kThumbnailHeight = 150;
+const CGFloat kSingleScreenWidth = 300;
+const CGFloat kSingleScreenHeight = 300;
+const CGFloat kFramePadding = 20;
+const CGFloat kControlSpacing = 10;
+const CGFloat kExcessButtonPadding = 6;
+const CGFloat kRowHeight = 20;
+const CGFloat kRowWidth = 500;
+const CGFloat kIconWidth = 20;
+const CGFloat kPaddedWidth = kInitialContentWidth - (kFramePadding * 2);
+
+NSString* const kIConColumnIdentifier = @"icon";
tapted 2016/06/22 07:08:42 kICon -> kIcon If you want something shorter, kIc
qiangchen 2016/06/22 23:54:25 Done.
+NSString* const kTitleColumnIdentifier = @"title";
} // namespace
@@ -59,14 +70,15 @@ const int kExcessButtonPadding = 6;
// Action handlers.
- (void)sharePressed:(id)sender;
- (void)cancelPressed:(id)sender;
+- (void)tableDoubleClick:(id)sender;
@end
@implementation DesktopMediaPickerController
-- (id)initWithScreenList:(std::unique_ptr<DesktopMediaList>)screen_list
- windowList:(std::unique_ptr<DesktopMediaList>)window_list
- tabList:(std::unique_ptr<DesktopMediaList>)tab_list
+- (id)initWithScreenList:(std::unique_ptr<DesktopMediaList>)screenList
+ windowList:(std::unique_ptr<DesktopMediaList>)windowList
+ tabList:(std::unique_ptr<DesktopMediaList>)tabList
parent:(NSWindow*)parent
callback:(const DesktopMediaPicker::DoneCallback&)callback
appName:(const base::string16&)appName
@@ -83,27 +95,28 @@ const int kExcessButtonPadding = 6;
if ((self = [super initWithWindow:window])) {
[parent addChildWindow:window ordered:NSWindowAbove];
[window setDelegate:self];
+ if (screenList) {
+ screenList_ = std::move(screenList);
+ screenItems_.reset([[NSMutableArray alloc] init]);
+ }
+
+ if (windowList) {
+ windowList_ = std::move(windowList);
+ windowList_->SetViewDialogWindowId(content::DesktopMediaID(
+ content::DesktopMediaID::TYPE_WINDOW, [window windowNumber]));
+ windowItems_.reset([[NSMutableArray alloc] init]);
+ }
+
+ if (tabList) {
+ tabList_ = std::move(tabList);
+ tabItems_.reset([[NSMutableArray alloc] init]);
+ }
+
[self initializeContentsWithAppName:appName
targetName:targetName
requestAudio:requestAudio];
- std::vector<std::unique_ptr<DesktopMediaList>> media_lists;
- if (screen_list)
- media_lists.push_back(std::move(screen_list));
-
- if (window_list)
- media_lists.push_back(std::move(window_list));
-
- if (tab_list)
- media_lists.push_back(std::move(tab_list));
-
- if (media_lists.size() > 1)
- media_list_.reset(new CombinedDesktopMediaList(media_lists));
- else
- media_list_ = std::move(media_lists[0]);
- media_list_->SetViewDialogWindowId(content::DesktopMediaID(
- content::DesktopMediaID::TYPE_WINDOW, [window windowNumber]));
doneCallback_ = callback;
- items_.reset([[NSMutableArray alloc] init]);
+
bridge_.reset(new DesktopMediaPickerBridge(self));
}
return self;
@@ -112,8 +125,12 @@ const int kExcessButtonPadding = 6;
- (void)dealloc {
[shareButton_ setTarget:nil];
[cancelButton_ setTarget:nil];
- [sourceBrowser_ setDelegate:nil];
- [sourceBrowser_ setDataSource:nil];
+ [screenBrowser_ setDelegate:nil];
+ [screenBrowser_ setDataSource:nil];
+ [windowBrowser_ setDelegate:nil];
+ [windowBrowser_ setDataSource:nil];
+ [tabBrowser_ setDataSource:nil];
+ [tabBrowser_ setDelegate:nil];
[[self window] close];
[super dealloc];
}
@@ -122,15 +139,13 @@ const int kExcessButtonPadding = 6;
targetName:(const base::string16&)targetName
requestAudio:(bool)requestAudio {
// Use flipped coordinates to facilitate manual layout.
- const CGFloat kPaddedWidth = kInitialContentWidth - (kFramePadding * 2);
base::scoped_nsobject<FlippedView> content(
[[FlippedView alloc] initWithFrame:NSZeroRect]);
[[self window] setContentView:content];
NSPoint origin = NSMakePoint(kFramePadding, kFramePadding);
// Set the dialog's title.
- NSString* titleText = l10n_util::GetNSStringF(
- IDS_DESKTOP_MEDIA_PICKER_TITLE_DEPRECATED, appName);
+ NSString* titleText = l10n_util::GetNSString(IDS_DESKTOP_MEDIA_PICKER_TITLE);
[[self window] setTitle:titleText];
// Set the dialog's description.
@@ -148,52 +163,178 @@ const int kExcessButtonPadding = 6;
[content addSubview:description];
origin.y += NSHeight([description frame]) + kControlSpacing;
- // Create the image browser.
- sourceBrowser_.reset([[IKImageBrowserView alloc] initWithFrame:NSZeroRect]);
- NSUInteger cellStyle = IKCellsStyleShadowed | IKCellsStyleTitled;
- [sourceBrowser_ setDelegate:self];
- [sourceBrowser_ setDataSource:self];
- [sourceBrowser_ setCellsStyleMask:cellStyle];
- [sourceBrowser_ setCellSize:NSMakeSize(kThumbnailWidth, kThumbnailHeight)];
- [sourceBrowser_ setAllowsMultipleSelection:NO];
+ [self createTypeButtonAtOrigin:origin];
+ origin.y += NSHeight([sourceTypeControl_ frame]) + kControlSpacing;
+
+ [self createSourceViewsAtOrigin:origin];
+ origin.y += NSHeight([imageBrowserScroll_ frame]) + kControlSpacing;
- // Create a scroll view to host the image browser.
- NSRect imageBrowserScrollFrame = NSMakeRect(
- origin.x, origin.y, kPaddedWidth, 350);
- base::scoped_nsobject<NSScrollView> imageBrowserScroll(
- [[NSScrollView alloc] initWithFrame:imageBrowserScrollFrame]);
- [imageBrowserScroll setHasVerticalScroller:YES];
- [imageBrowserScroll setDocumentView:sourceBrowser_];
- [imageBrowserScroll setBorderType:NSBezelBorder];
- [imageBrowserScroll setAutoresizingMask:
- NSViewWidthSizable | NSViewHeightSizable];
- [content addSubview:imageBrowserScroll];
- origin.y += NSHeight(imageBrowserScrollFrame) + kControlSpacing;
-
- // Create a checkbox for audio sharing.
if (requestAudio) {
- audioShareCheckbox_.reset([[NSButton alloc] initWithFrame:NSZeroRect]);
- [audioShareCheckbox_ setFrameOrigin:origin];
- [audioShareCheckbox_
- setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
- [audioShareCheckbox_ setButtonType:NSSwitchButton];
- audioShareState_ = NSOnState;
- [audioShareCheckbox_
- setTitle:l10n_util::GetNSString(IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE)];
- [audioShareCheckbox_ sizeToFit];
- [audioShareCheckbox_ setEnabled:NO];
- [audioShareCheckbox_
- setToolTip:l10n_util::GetNSString(
- IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_TOOLTIP_MAC)];
- [content addSubview:audioShareCheckbox_];
+ [self createAudioCheckboxAtOrigin:origin];
origin.y += NSHeight([audioShareCheckbox_ frame]) + kControlSpacing;
}
+ [self createActionButtonsAtOrigin:origin];
+ origin.y +=
+ kFramePadding + (NSHeight([cancelButton_ frame]) - kExcessButtonPadding);
+
+ // Resize window to fit.
+ [content setAutoresizesSubviews:NO];
+ [[self window] setContentSize:NSMakeSize(kInitialContentWidth, origin.y)];
+ [[self window] setContentMinSize:NSMakeSize(kMinimumContentWidth,
+ kMinimumContentHeight)];
+ [[[self window] contentView] setAutoresizesSubviews:YES];
tapted 2016/06/22 07:08:42 [[self window] contentView] -> content?
qiangchen 2016/06/22 23:54:24 Done.
+
+ // Initialize the type selection at the first segment.
+ [sourceTypeControl_ setSelected:YES forSegment:0];
+ [self typeButtonPressed:sourceTypeControl_];
+}
+
+- (void)createTypeButtonAtOrigin:(NSPoint)origin {
tapted 2016/06/22 07:08:42 declare in @interface Foo () And ensure the defin
qiangchen 2016/06/22 23:54:24 Done.
+ FlippedView* content = [[self window] contentView];
+ // Create segmented button.
+ sourceTypeControl_.reset([[NSSegmentedControl alloc] init]);
+
+ NSInteger segmentCount =
+ (screenList_ ? 1 : 0) + (windowList_ ? 1 : 0) + (tabList_ ? 1 : 0);
+ [sourceTypeControl_ setSegmentCount:segmentCount];
+ NSInteger segmentIndex = 0;
+
+ if (screenList_) {
+ [sourceTypeControl_
+ setLabel:l10n_util::GetNSString(
+ IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_SCREEN)
+ forSegment:segmentIndex];
+
+ [[sourceTypeControl_ cell] setTag:content::DesktopMediaID::TYPE_SCREEN
+ forSegment:segmentIndex];
+ ++segmentIndex;
+ }
+
+ if (windowList_) {
+ [sourceTypeControl_
+ setLabel:l10n_util::GetNSString(
+ IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_WINDOW)
+ forSegment:segmentIndex];
+ [[sourceTypeControl_ cell] setTag:content::DesktopMediaID::TYPE_WINDOW
+ forSegment:segmentIndex];
+ ++segmentIndex;
+ }
+
+ if (tabList_) {
+ [sourceTypeControl_ setLabel:l10n_util::GetNSString(
+ IDS_DESKTOP_MEDIA_PICKER_SOURCE_TYPE_TAB)
+ forSegment:segmentIndex];
+ [[sourceTypeControl_ cell] setTag:content::DesktopMediaID::TYPE_WEB_CONTENTS
+ forSegment:segmentIndex];
+ }
+ [sourceTypeControl_ setAction:@selector(typeButtonPressed:)];
+
+ [[sourceTypeControl_ cell] setTrackingMode:NSSegmentSwitchTrackingSelectOne];
+
+ [content addSubview:sourceTypeControl_];
+
+ [sourceTypeControl_ sizeToFit];
+ [sourceTypeControl_ setAutoresizingMask:NSViewMaxXMargin | NSViewMinXMargin];
+ CGFloat controlWidth = NSWidth([sourceTypeControl_ frame]);
+ CGFloat controlHeight = NSHeight([sourceTypeControl_ frame]);
+ NSRect centerFrame = NSMakeRect((kInitialContentWidth - controlWidth) / 2,
+ origin.y, controlWidth, controlHeight);
+
+ [sourceTypeControl_ setFrame:NSIntegralRect(centerFrame)];
+}
+
+- (void)createSourceViewsAtOrigin:(NSPoint)origin {
+ NSUInteger cellStyle = IKCellsStyleShadowed | IKCellsStyleTitled;
+ bool focusSet = false;
+
+ if (screenList_) {
+ screenBrowser_.reset([[IKImageBrowserView alloc] initWithFrame:NSZeroRect]);
tapted 2016/06/22 07:08:42 by `this is too much boilerplate` I meant you shou
qiangchen 2016/06/22 23:54:24 Done. But as screenBrowser_ and windowBrowser_ ar
+ [screenBrowser_ setDelegate:self];
+ [screenBrowser_ setDataSource:self];
+ [screenBrowser_ setCellsStyleMask:cellStyle];
+ [screenBrowser_
+ setCellSize:NSMakeSize(kSingleScreenWidth, kSingleScreenHeight)];
+ [screenBrowser_ setAllowsMultipleSelection:NO];
+
+ if (!focusSet) {
+ [[self window] makeFirstResponder:screenBrowser_];
tapted 2016/06/22 07:08:42 How about once, at the end of initializeContentsWi
qiangchen 2016/06/22 23:54:25 Done.
+ focusSet = true;
+ }
+ }
+
+ if (windowList_) {
+ windowBrowser_.reset([[IKImageBrowserView alloc] initWithFrame:NSZeroRect]);
+ [windowBrowser_ setDelegate:self];
+ [windowBrowser_ setDataSource:self];
+ [windowBrowser_ setCellsStyleMask:cellStyle];
+ [windowBrowser_ setCellSize:NSMakeSize(kThumbnailWidth, kThumbnailHeight)];
+ [windowBrowser_ setAllowsMultipleSelection:NO];
+
+ if (!focusSet) {
+ [[self window] makeFirstResponder:windowBrowser_];
+ focusSet = true;
+ }
+ }
+
+ if (tabList_) {
+ tabBrowser_.reset([[NSTableView alloc] initWithFrame:NSZeroRect]);
+ [tabBrowser_ setDelegate:self];
+ [tabBrowser_ setDataSource:self];
+ [tabBrowser_ setAllowsMultipleSelection:NO];
+ [tabBrowser_ setRowHeight:kRowHeight];
+ [tabBrowser_ setDoubleAction:@selector(tableDoubleClick:)];
+ base::scoped_nsobject<NSTableColumn> icon_column(
tapted 2016/06/22 07:08:42 icon_column -> iconColumn more below. Please do a
qiangchen 2016/06/22 23:54:24 Done.
+ [[NSTableColumn alloc] initWithIdentifier:kIConColumnIdentifier]);
+ [icon_column setEditable:NO];
+ [icon_column setWidth:kIconWidth];
+ [tabBrowser_ addTableColumn:icon_column];
+ base::scoped_nsobject<NSTableColumn> title_column(
+ [[NSTableColumn alloc] initWithIdentifier:kTitleColumnIdentifier]);
+ [title_column setEditable:NO];
+ [title_column setWidth:kRowWidth];
+ [tabBrowser_ addTableColumn:title_column];
+ [tabBrowser_ setHeaderView:nil];
+
+ if (!focusSet) {
+ [[self window] makeFirstResponder:tabBrowser_];
+ focusSet = true;
+ }
+ }
+
+ // Create a scroll view to host the image browser.
tapted 2016/06/22 07:08:42 image browser -> browsers
qiangchen 2016/06/22 23:54:24 Done.
+ NSRect imageBrowserScrollFrame =
+ NSMakeRect(origin.x, origin.y, kPaddedWidth, 350);
+ imageBrowserScroll_.reset(
+ [[NSScrollView alloc] initWithFrame:imageBrowserScrollFrame]);
+ [imageBrowserScroll_ setHasVerticalScroller:YES];
+ [imageBrowserScroll_ setBorderType:NSBezelBorder];
+ [imageBrowserScroll_
+ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+ [[[self window] contentView] addSubview:imageBrowserScroll_];
+}
+
+- (void)createAudioCheckboxAtOrigin:(NSPoint)origin {
+ audioShareCheckbox_.reset([[NSButton alloc] initWithFrame:NSZeroRect]);
+ [audioShareCheckbox_ setFrameOrigin:origin];
+ [audioShareCheckbox_ setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
+ [audioShareCheckbox_ setButtonType:NSSwitchButton];
+ [audioShareCheckbox_ setState:NSOnState];
+ [audioShareCheckbox_
+ setTitle:l10n_util::GetNSString(IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE)];
+ [audioShareCheckbox_ sizeToFit];
+ [[[self window] contentView] addSubview:audioShareCheckbox_];
+}
+
+- (void)createActionButtonsAtOrigin:(NSPoint)origin {
+ FlippedView* content = [[self window] contentView];
+
// Create the share button.
- shareButton_ = [self createButtonWithTitle:l10n_util::GetNSString(
- IDS_DESKTOP_MEDIA_PICKER_SHARE)];
+ shareButton_ =
+ [self createButtonWithTitle:l10n_util::GetNSString(
+ IDS_DESKTOP_MEDIA_PICKER_SHARE)];
origin.x = kInitialContentWidth - kFramePadding -
- (NSWidth([shareButton_ frame]) - kExcessButtonPadding);
+ (NSWidth([shareButton_ frame]) - kExcessButtonPadding);
[shareButton_ setEnabled:NO];
[shareButton_ setFrameOrigin:origin];
[shareButton_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
@@ -206,32 +347,35 @@ const int kExcessButtonPadding = 6;
cancelButton_ =
[self createButtonWithTitle:l10n_util::GetNSString(IDS_CANCEL)];
origin.x -= kControlSpacing +
- (NSWidth([cancelButton_ frame]) - (kExcessButtonPadding * 2));
+ (NSWidth([cancelButton_ frame]) - (kExcessButtonPadding * 2));
[cancelButton_ setFrameOrigin:origin];
[cancelButton_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
[cancelButton_ setTarget:self];
[cancelButton_ setKeyEquivalent:kKeyEquivalentEscape];
[cancelButton_ setAction:@selector(cancelPressed:)];
[content addSubview:cancelButton_];
- origin.y += kFramePadding +
- (NSHeight([cancelButton_ frame]) - kExcessButtonPadding);
-
- // Resize window to fit.
- [[[self window] contentView] setAutoresizesSubviews:NO];
- [[self window] setContentSize:NSMakeSize(kInitialContentWidth, origin.y)];
- [[self window] setContentMinSize:
- NSMakeSize(kMinimumContentWidth, kMinimumContentHeight)];
- [[[self window] contentView] setAutoresizesSubviews:YES];
-
- // Make sourceBrowser_ get keyboard focus.
- [[self window] makeFirstResponder:sourceBrowser_];
}
+#pragma mark Event Actions
+
- (void)showWindow:(id)sender {
- // Signal the media_list to start sending thumbnails. |bridge_| is used as the
- // observer, and will forward notifications to this object.
- media_list_->SetThumbnailSize(gfx::Size(kThumbnailWidth, kThumbnailHeight));
- media_list_->StartUpdating(bridge_.get());
+ // Signal the source lists to start sending thumbnails. |bridge_| is used as
+ // the observer, and will forward notifications to this object.
+ if (screenList_) {
+ screenList_->SetThumbnailSize(
+ gfx::Size(kSingleScreenWidth, kSingleScreenHeight));
+ screenList_->StartUpdating(bridge_.get());
+ }
+
+ if (windowList_) {
+ windowList_->SetThumbnailSize(gfx::Size(kThumbnailWidth, kThumbnailHeight));
+ windowList_->StartUpdating(bridge_.get());
+ }
+
+ if (tabList_) {
+ tabList_->SetThumbnailSize(gfx::Size(kIconWidth, kRowHeight));
+ tabList_->StartUpdating(bridge_.get());
+ }
[self.window center];
[super showWindow:sender];
@@ -242,7 +386,7 @@ const int kExcessButtonPadding = 6;
return;
}
- sourceID.audio_share = [audioShareCheckbox_ isEnabled] &&
+ sourceID.audio_share = ![audioShareCheckbox_ isHidden] &&
[audioShareCheckbox_ state] == NSOnState;
// If the media source is an tab, activate it.
@@ -264,10 +408,10 @@ const int kExcessButtonPadding = 6;
}
- (void)sharePressed:(id)sender {
- NSIndexSet* indexes = [sourceBrowser_ selectionIndexes];
- NSUInteger selectedIndex = [indexes firstIndex];
- DesktopMediaPickerItem* item =
- [items_ objectAtIndex:selectedIndex];
+ content::DesktopMediaID::Type selectedType = [self selectedSourceType];
+ NSMutableArray* items = [self itemSetForType:selectedType];
+ NSInteger selectedIndex = [self selectedIndexForType:selectedType];
+ DesktopMediaPickerItem* item = [items objectAtIndex:selectedIndex];
[self reportResult:[item sourceID]];
[self close];
}
@@ -277,6 +421,33 @@ const int kExcessButtonPadding = 6;
[self close];
}
+- (void)typeButtonPressed:(id)sender {
+ content::DesktopMediaID::Type selectedType = [self selectedSourceType];
+ id browser = [self browserViewForType:selectedType];
+
+ [audioShareCheckbox_
+ setHidden:selectedType != content::DesktopMediaID::TYPE_WEB_CONTENTS];
+ [imageBrowserScroll_ setDocumentView:browser];
+
+ if (selectedType == content::DesktopMediaID::TYPE_WEB_CONTENTS) {
+ NSInteger selectedIndex = [self selectedIndexForType:selectedType];
+ [tabBrowser_ reloadData];
+ [self setTabBrowserIndex:selectedIndex];
+ [self tableViewSelectionDidChange:nil];
tapted 2016/06/22 07:08:41 is this invoked automatically? (comment?)
qiangchen 2016/06/22 23:54:24 Done.
+ } else {
+ [browser reloadData];
+ [self imageBrowserSelectionDidChange:browser];
+ }
+}
+
+- (void)tableDoubleClick:(id)sender {
+ NSIndexSet* indexes = [tabBrowser_ selectedRowIndexes];
tapted 2016/06/22 07:08:42 Can this just call [self sharePressed:sender]
qiangchen 2016/06/22 23:54:25 Actually we can do simpler: just bind sharePressed
+ NSUInteger selectedIndex = [indexes firstIndex];
+ DesktopMediaPickerItem* item = [tabItems_ objectAtIndex:selectedIndex];
+ [self reportResult:[item sourceID]];
+ [self close];
+}
+
- (NSTextField*)createTextFieldWithText:(NSString*)text
frameWidth:(CGFloat)width {
NSRect frame = NSMakeRect(0, 0, width, 1);
@@ -303,6 +474,90 @@ const int kExcessButtonPadding = 6;
return button.autorelease();
}
+#pragma mark Data Retrieve Helper
+
+- (content::DesktopMediaID::Type)selectedSourceType {
tapted 2016/06/22 07:08:42 These should all be declared in `@interface Deskto
qiangchen 2016/06/22 23:54:25 Done.
+ NSInteger segment = [sourceTypeControl_ selectedSegment];
+ return static_cast<content::DesktopMediaID::Type>(
+ [[sourceTypeControl_ cell] tagForSegment:segment]);
+}
+
+- (content::DesktopMediaID::Type)sourceTypeForList:(DesktopMediaList*)list {
+ if (list == screenList_.get())
+ return content::DesktopMediaID::TYPE_SCREEN;
+ else if (list == windowList_.get())
tapted 2016/06/22 07:08:42 no `else`. just `if`
qiangchen 2016/06/22 23:54:24 Done.
+ return content::DesktopMediaID::TYPE_WINDOW;
+ return content::DesktopMediaID::TYPE_WEB_CONTENTS;
+}
+
+- (content::DesktopMediaID::Type)sourceTypeForBrowser:(id)browser {
+ if (browser == screenBrowser_.get())
+ return content::DesktopMediaID::TYPE_SCREEN;
+ else if (browser == windowBrowser_.get())
tapted 2016/06/22 07:08:42 no `else`
qiangchen 2016/06/22 23:54:25 Done.
+ return content::DesktopMediaID::TYPE_WINDOW;
+ return content::DesktopMediaID::TYPE_WEB_CONTENTS;
+}
+
+- (id)browserViewForType:(content::DesktopMediaID::Type)sourceType {
+ switch (sourceType) {
+ case content::DesktopMediaID::TYPE_SCREEN:
+ return screenBrowser_;
+ case content::DesktopMediaID::TYPE_WINDOW:
+ return windowBrowser_;
+ case content::DesktopMediaID::TYPE_WEB_CONTENTS:
+ return tabBrowser_;
+ case content::DesktopMediaID::TYPE_NONE:
+ NOTREACHED();
+ return nil;
+ }
+}
+
+- (NSMutableArray*)itemSetForType:(content::DesktopMediaID::Type)sourceType {
+ switch (sourceType) {
+ case content::DesktopMediaID::TYPE_SCREEN:
+ return screenItems_;
+ case content::DesktopMediaID::TYPE_WINDOW:
+ return windowItems_;
+ case content::DesktopMediaID::TYPE_WEB_CONTENTS:
+ return tabItems_;
+ case content::DesktopMediaID::TYPE_NONE:
+ NOTREACHED();
+ return nil;
+ }
+}
+
+- (NSInteger)selectedIndexForType:(content::DesktopMediaID::Type)sourceType {
+ NSIndexSet* indexes = nil;
+ switch (sourceType) {
+ case content::DesktopMediaID::TYPE_SCREEN:
+ indexes = [screenBrowser_ selectionIndexes];
+ break;
+ case content::DesktopMediaID::TYPE_WINDOW:
+ indexes = [windowBrowser_ selectionIndexes];
+ break;
+ case content::DesktopMediaID::TYPE_WEB_CONTENTS:
+ indexes = [tabBrowser_ selectedRowIndexes];
+ break;
+ case content::DesktopMediaID::TYPE_NONE:
+ NOTREACHED();
+ }
+
+ if ([indexes count] == 0)
+ return -1;
+ return [indexes firstIndex];
+}
+
+- (void)setTabBrowserIndex:(NSInteger)index {
+ NSIndexSet* indexes;
+
+ if (index < 0)
+ indexes = [NSIndexSet indexSet];
+ else
+ indexes = [NSIndexSet indexSetWithIndex:index];
+
+ [tabBrowser_ selectRowIndexes:indexes byExtendingSelection:NO];
+}
+
#pragma mark NSWindowDelegate
- (void)windowWillClose:(NSNotification*)notification {
@@ -318,82 +573,102 @@ const int kExcessButtonPadding = 6;
#pragma mark IKImageBrowserDataSource
- (NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView*)browser {
- return [items_ count];
+ content::DesktopMediaID::Type sourceType =
+ [self sourceTypeForBrowser:browser];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ return [items count];
}
-- (id)imageBrowser:(IKImageBrowserView *)browser
- itemAtIndex:(NSUInteger)index {
- return [items_ objectAtIndex:index];
+- (id)imageBrowser:(IKImageBrowserView*)browser itemAtIndex:(NSUInteger)index {
+ content::DesktopMediaID::Type sourceType =
+ [self sourceTypeForBrowser:browser];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ return [items objectAtIndex:index];
}
#pragma mark IKImageBrowserDelegate
-- (void)imageBrowser:(IKImageBrowserView *)browser
- cellWasDoubleClickedAtIndex:(NSUInteger)index {
- DesktopMediaPickerItem* item = [items_ objectAtIndex:index];
+- (void)imageBrowser:(IKImageBrowserView*)browser
+ cellWasDoubleClickedAtIndex:(NSUInteger)index {
+ DesktopMediaPickerItem* item;
+ if (browser == screenBrowser_)
+ item = [screenItems_ objectAtIndex:index];
+ else
+ item = [windowItems_ objectAtIndex:index];
[self reportResult:[item sourceID]];
[self close];
}
- (void)imageBrowserSelectionDidChange:(IKImageBrowserView*)browser {
- NSIndexSet* indexes = [sourceBrowser_ selectionIndexes];
-
+ content::DesktopMediaID::Type selectedType = [self selectedSourceType];
+ NSInteger selectedIndex = [self selectedIndexForType:selectedType];
// Enable or disable the OK button based on whether we have a selection.
- [shareButton_ setEnabled:([indexes count] > 0)];
+ [shareButton_ setEnabled:(selectedIndex >= 0)];
+}
- // Enable or disable the checkbox based on whether we can support audio for
- // the selected source.
- // On Mac, the checkbox will enabled for tab sharing, namely
- // TYPE_WEB_CONTENTS.
- if ([indexes count] == 0) {
- if ([audioShareCheckbox_ isEnabled]) {
- [audioShareCheckbox_ setEnabled:NO];
- audioShareState_ = [audioShareCheckbox_ state];
- [audioShareCheckbox_ setState:NSOffState];
+#pragma mark NSTableViewDataSource
+
+- (NSInteger)numberOfRowsInTableView:(NSTableView*)table {
+ return [tabItems_ count];
+}
+
+#pragma mark NSTableViewDelegate
+- (NSView*)tableView:(NSTableView*)table
tapted 2016/06/22 07:08:42 nit: blank line before
qiangchen 2016/06/22 23:54:24 Done.
+ viewForTableColumn:(NSTableColumn*)column
+ row:(NSInteger)rowIndex {
+ if ([[column identifier] isEqualToString:kIConColumnIdentifier]) {
+ NSImage* image = [[tabItems_ objectAtIndex:rowIndex] imageRepresentation];
+ base::scoped_nsobject<NSImageView> cell(
tapted 2016/06/22 07:08:42 nit: cell -> view. (cell is confusing because NSTa
qiangchen 2016/06/22 23:54:25 Done.
+ [table makeViewWithIdentifier:kIConColumnIdentifier owner:self]);
tapted 2016/06/22 07:08:42 [table makeViewWithIdentifier .. returns an item w
qiangchen 2016/06/22 23:54:24 Done.
+ if (!cell) {
+ cell.reset([[NSImageView alloc]
+ initWithFrame:NSMakeRect(0, 0, kIconWidth, kRowWidth)]);
+ [cell setIdentifier:kIConColumnIdentifier];
}
- [audioShareCheckbox_
- setToolTip:l10n_util::GetNSString(
- IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_TOOLTIP_MAC)];
- return;
+ [cell setImage:image];
+ return cell.release();
tapted 2016/06/22 07:08:42 release -> autorelease (otherwise it's a leak)
qiangchen 2016/06/22 23:54:24 Done.
}
- NSUInteger selectedIndex = [indexes firstIndex];
- DesktopMediaPickerItem* item = [items_ objectAtIndex:selectedIndex];
- switch ([item sourceID].type) {
- case content::DesktopMediaID::TYPE_SCREEN:
- case content::DesktopMediaID::TYPE_WINDOW:
- if ([audioShareCheckbox_ isEnabled]) {
- [audioShareCheckbox_ setEnabled:NO];
- audioShareState_ = [audioShareCheckbox_ state];
- [audioShareCheckbox_ setState:NSOffState];
- }
- [audioShareCheckbox_
- setToolTip:l10n_util::GetNSString(
- IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_TOOLTIP_MAC)];
- break;
- case content::DesktopMediaID::TYPE_WEB_CONTENTS:
- if (![audioShareCheckbox_ isEnabled]) {
- [audioShareCheckbox_ setEnabled:YES];
- [audioShareCheckbox_ setState:audioShareState_];
- }
- [audioShareCheckbox_ setToolTip:@""];
- break;
- case content::DesktopMediaID::TYPE_NONE:
- NOTREACHED();
+ NSString* string = [[tabItems_ objectAtIndex:rowIndex] imageTitle];
+ base::scoped_nsobject<NSTextField> cell(
tapted 2016/06/22 07:08:42 cell -> view
qiangchen 2016/06/22 23:54:24 Done.
+ [table makeViewWithIdentifier:kTitleColumnIdentifier owner:self]);
+ if (!cell) {
+ cell.reset(
+ [self createTextFieldWithText:string frameWidth:kMinimumContentWidth]);
+ [cell setIdentifier:kTitleColumnIdentifier];
+ } else {
+ [cell setStringValue:string];
}
+ return cell.release();
tapted 2016/06/22 07:08:42 autorelease, and retain above.
qiangchen 2016/06/22 23:54:24 Change back to not use scoped_nsobject. Move autor
tapted 2016/06/23 02:49:48 autoreleasing twice is fine, you just need to reta
qiangchen 2016/06/23 17:49:37 Acknowledged.
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification*)notification {
+ NSIndexSet* indexes = [tabBrowser_ selectedRowIndexes];
+
+ // Enable or disable the OK button based on whether we have a selection.
+ [shareButton_ setEnabled:([indexes count] > 0)];
}
#pragma mark DesktopMediaPickerObserver
-- (void)sourceAddedAtIndex:(int)index {
- const DesktopMediaList::Source& source = media_list_->GetSource(index);
+- (void)sourceAddedForList:(DesktopMediaList*)list atIndex:(int)index {
+ content::DesktopMediaID::Type sourceType = [self sourceTypeForList:list];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ id browser = [self browserViewForType:sourceType];
+ NSInteger selectedIndex = [self selectedIndexForType:sourceType];
+ if (selectedIndex >= index)
+ ++selectedIndex;
+
+ const DesktopMediaList::Source& source = list->GetSource(index);
NSString* imageTitle = base::SysUTF16ToNSString(source.name);
base::scoped_nsobject<DesktopMediaPickerItem> item(
[[DesktopMediaPickerItem alloc] initWithSourceId:source.id
imageUID:++lastImageUID_
imageTitle:imageTitle]);
- [items_ insertObject:item atIndex:index];
- [sourceBrowser_ reloadData];
+ [items insertObject:item atIndex:index];
+ [browser reloadData];
+ if (sourceType == content::DesktopMediaID::TYPE_WEB_CONTENTS)
+ [self setTabBrowserIndex:selectedIndex];
NSString* autoselectSource = base::SysUTF8ToNSString(
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
@@ -405,38 +680,86 @@ const int kExcessButtonPadding = 6;
}
}
-- (void)sourceRemovedAtIndex:(int)index {
- if ([[sourceBrowser_ selectionIndexes] containsIndex:index]) {
+- (void)sourceRemovedForList:(DesktopMediaList*)list atIndex:(int)index {
+ content::DesktopMediaID::Type sourceType = [self sourceTypeForList:list];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ id browser = [self browserViewForType:sourceType];
+
+ if (sourceType == content::DesktopMediaID::TYPE_WEB_CONTENTS) {
+ NSInteger selectedIndex =
+ [self selectedIndexForType:content::DesktopMediaID::TYPE_WEB_CONTENTS];
tapted 2016/06/22 07:08:42 basee sourceType - it's shorter
qiangchen 2016/06/22 23:54:24 Done.
+ if (selectedIndex > index)
+ --selectedIndex;
+ else if (selectedIndex == index)
+ selectedIndex = -1;
+ [tabItems_ removeObjectAtIndex:index];
+ [tabBrowser_ reloadData];
+ [self setTabBrowserIndex:selectedIndex];
+ return;
+ }
+
+ if ([[browser selectionIndexes] containsIndex:index]) {
// Selected item was removed. Clear selection.
- [sourceBrowser_ setSelectionIndexes:[NSIndexSet indexSet]
- byExtendingSelection:FALSE];
+ [browser setSelectionIndexes:[NSIndexSet indexSet] byExtendingSelection:NO];
}
- [items_ removeObjectAtIndex:index];
- [sourceBrowser_ reloadData];
+ [items removeObjectAtIndex:index];
+ [browser reloadData];
}
-- (void)sourceMovedFrom:(int)oldIndex to:(int)newIndex {
+- (void)sourceMovedForList:(DesktopMediaList*)list
+ from:(int)oldIndex
+ to:(int)newIndex {
+ content::DesktopMediaID::Type sourceType = [self sourceTypeForList:list];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ id browser = [self browserViewForType:sourceType];
+ NSInteger selectedIndex = [self selectedIndexForType:sourceType];
+ if (selectedIndex > oldIndex && selectedIndex <= newIndex)
+ --selectedIndex;
+ else if (selectedIndex < oldIndex && selectedIndex >= newIndex)
+ ++selectedIndex;
+ else if (selectedIndex == oldIndex)
+ selectedIndex = newIndex;
+
base::scoped_nsobject<DesktopMediaPickerItem> item(
- [[items_ objectAtIndex:oldIndex] retain]);
- [items_ removeObjectAtIndex:oldIndex];
- [items_ insertObject:item atIndex:newIndex];
- [sourceBrowser_ reloadData];
+ [[items objectAtIndex:oldIndex] retain]);
+ [items removeObjectAtIndex:oldIndex];
+ [items insertObject:item atIndex:newIndex];
+ [browser reloadData];
+
+ if (sourceType == content::DesktopMediaID::TYPE_WEB_CONTENTS)
+ [self setTabBrowserIndex:selectedIndex];
}
-- (void)sourceNameChangedAtIndex:(int)index {
- DesktopMediaPickerItem* item = [items_ objectAtIndex:index];
- const DesktopMediaList::Source& source = media_list_->GetSource(index);
+- (void)sourceNameChangedForList:(DesktopMediaList*)list atIndex:(int)index {
+ content::DesktopMediaID::Type sourceType = [self sourceTypeForList:list];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ id browser = [self browserViewForType:sourceType];
+ NSInteger selectedIndex = [self selectedIndexForType:sourceType];
+
+ DesktopMediaPickerItem* item = [items objectAtIndex:index];
+ const DesktopMediaList::Source& source = list->GetSource(index);
[item setImageTitle:base::SysUTF16ToNSString(source.name)];
- [sourceBrowser_ reloadData];
+ [browser reloadData];
+ if (sourceType == content::DesktopMediaID::TYPE_WEB_CONTENTS)
+ [self setTabBrowserIndex:selectedIndex];
}
-- (void)sourceThumbnailChangedAtIndex:(int)index {
- const DesktopMediaList::Source& source = media_list_->GetSource(index);
+- (void)sourceThumbnailChangedForList:(DesktopMediaList*)list
+ atIndex:(int)index {
+ content::DesktopMediaID::Type sourceType = [self sourceTypeForList:list];
+ NSMutableArray* items = [self itemSetForType:sourceType];
+ id browser = [self browserViewForType:sourceType];
+ NSInteger selectedIndex = [self selectedIndexForType:sourceType];
+
+ const DesktopMediaList::Source& source = list->GetSource(index);
NSImage* image = gfx::NSImageFromImageSkia(source.thumbnail);
- DesktopMediaPickerItem* item = [items_ objectAtIndex:index];
+ DesktopMediaPickerItem* item = [items objectAtIndex:index];
[item setImageRepresentation:image];
- [sourceBrowser_ reloadData];
+ [browser reloadData];
+
+ if (sourceType == content::DesktopMediaID::TYPE_WEB_CONTENTS)
+ [self setTabBrowserIndex:selectedIndex];
}
@end // @interface DesktopMediaPickerController

Powered by Google App Engine
This is Rietveld 408576698