Chromium Code Reviews| 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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..62b0da20dcffa61bc3f710e021444fcb5dcaa64e |
| --- /dev/null |
| +++ b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm |
| @@ -0,0 +1,172 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/mac/bundle_locations.h" |
| +#include "base/mac/scoped_cftyperef.h" |
| +#include "base/strings/sys_string_conversions.h" |
| +#include "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_item.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "grit/generated_resources.h" |
| +#include "skia/ext/skia_utils_mac.h" |
| +#include "ui/base/l10n/l10n_util_mac.h" |
| + |
| +namespace { |
| + |
| +const int kThumbnailWidth = 150; |
| +const int kThumbnailHeight = 150; |
| + |
| +} // namespace |
| + |
| +@implementation DesktopMediaPickerController |
| + |
| +- (id)initWithModel:(scoped_ptr<DesktopMediaPickerModel>)model |
| + callback:(const DesktopMediaPicker::DoneCallback&)callback |
| + appName:(const string16&)appName { |
| + NSString* nibpath = |
| + [base::mac::FrameworkBundle() pathForResource:@"DesktopMediaPicker" |
| + ofType:@"nib"]; |
| + if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |
| + model_ = model.Pass(); |
| + done_callback_ = callback; |
| + appName_ = appName; |
| + items_.reset([[NSMutableArray alloc] init]); |
| + bridge_.reset(new DesktopMediaPickerBridge(self)); |
| + } |
| + return self; |
| +} |
| + |
| +- (void)awakeFromNib { |
| + // Format the dialog's title. |
| + NSString* title = l10n_util::GetNSStringF(IDS_DESKTOP_MEDIA_PICKER_TITLE, |
| + appName_); |
| + [[self window] setTitle:title]; |
| + |
| + // Format the dialog's label. |
| + NSString* label = l10n_util::GetNSStringF(IDS_DESKTOP_MEDIA_PICKER_TEXT, |
| + appName_); |
| + [label_ setStringValue:label]; |
| + |
| + // Configure the image browser. |
| + NSUInteger cellStyle = IKCellsStyleShadowed | IKCellsStyleTitled; |
| + [sourceBrowser_ setCellsStyleMask:cellStyle]; |
| + [sourceBrowser_ setCellSize:NSMakeSize(kThumbnailWidth, kThumbnailHeight)]; |
| +} |
| + |
| +- (IBAction)showWindow:(id)sender { |
| + // Signal the model to start sending thumbnails. |bridge_| is used as the |
| + // observer, and will forward notifications to this object. |
| + model_->SetThumbnailSize(gfx::Size(kThumbnailWidth, kThumbnailHeight)); |
| + model_->StartUpdating(bridge_.get()); |
| + |
| + [self.window center]; |
| + [super showWindow:sender]; |
| +} |
| + |
| +- (void)reportResult:(content::DesktopMediaID)sourceId { |
| + if (!done_callback_.is_null()) { |
|
Robert Sesek
2013/09/04 20:23:19
I'd flip this to an early return.
dcaiafa
2013/09/04 21:39:35
Done.
|
| + // Notify the |callback_| asynchronously because it may release the |
| + // controller. |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::UI, FROM_HERE, |
| + base::Bind(done_callback_, sourceId)); |
| + done_callback_.Reset(); |
| + } |
| +} |
| + |
| +- (IBAction)okPressed:(id)sender { |
| + NSIndexSet* indexes = [sourceBrowser_ selectionIndexes]; |
| + NSUInteger selectedIndex = [indexes firstIndex]; |
| + DesktopMediaPickerItem* item = |
| + [items_ objectAtIndex:selectedIndex]; |
| + [self reportResult:[item sourceId]]; |
| + [self close]; |
| +} |
| + |
| +- (IBAction)cancelPressed:(id)sender { |
| + [self reportResult:content::DesktopMediaID()]; |
| + [self close]; |
| +} |
| + |
| +- (void)windowWillClose:(NSNotification*)notification { |
| + [self reportResult:content::DesktopMediaID()]; |
|
Robert Sesek
2013/09/04 20:23:19
This is being done unconditionally, even after -ok
dcaiafa
2013/09/04 21:39:35
|reportResult:| will only report the result once.
|
| +} |
| + |
| +#pragma mark IKImageBrowserDataSource |
| + |
| +- (NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView*)browser { |
| + return [items_ count]; |
| +} |
| + |
| +- (id)imageBrowser:(IKImageBrowserView *)browser |
| + itemAtIndex:(NSUInteger)index { |
| + return [items_ objectAtIndex:index]; |
| +} |
| + |
| +#pragma mark IKImageBrowserDelegate |
| + |
| +- (void)imageBrowser:(IKImageBrowserView *)browser |
| + cellWasDoubleClickedAtIndex:(NSUInteger)index { |
| + DesktopMediaPickerItem* item = [items_ objectAtIndex:index]; |
| + [self reportResult:[item sourceId]]; |
| + [self close]; |
| +} |
| + |
| +- (void)imageBrowserSelectionDidChange:(IKImageBrowserView*) aBrowser { |
| + // Enable or disable the OK button based on whether we have a selection. |
| + if ([[sourceBrowser_ selectionIndexes] count] > 0) { |
| + [okButton_ setEnabled:YES]; |
|
Robert Sesek
2013/09/04 20:23:19
You can just setEnabled: with the result of the ab
dcaiafa
2013/09/04 21:39:35
Done.
|
| + } else { |
| + [okButton_ setEnabled:NO]; |
| + } |
| +} |
| + |
| +#pragma mark DesktopMediaPickerObserver |
| + |
| +- (void)sourceAddedAtIndex:(int)index { |
| + const DesktopMediaPickerModel::Source& source = model_->source(index); |
| + NSString* imageTitle = base::SysUTF16ToNSString(source.name); |
| + DesktopMediaPickerItem* item = |
|
Robert Sesek
2013/09/04 20:23:19
Put this in a scoped_nsobject<>
dcaiafa
2013/09/04 21:39:35
Done.
|
| + [[DesktopMediaPickerItem alloc] initWithSourceId:source.id |
| + imageUID:++lastImageUID_ |
| + imageTitle:imageTitle]; |
| + [items_ insertObject:item atIndex:index]; |
| + [item release]; |
| + [sourceBrowser_ reloadData]; |
| +} |
| + |
| +- (void)sourceRemovedAtIndex:(int)index { |
| + if ([[sourceBrowser_ selectionIndexes] containsIndex:index]) { |
| + // Selected item was removed. Clear selection. |
| + [sourceBrowser_ setSelectionIndexes:[NSIndexSet indexSet] |
| + byExtendingSelection:FALSE]; |
| + } |
| + [items_ removeObjectAtIndex:index]; |
| + [sourceBrowser_ reloadData]; |
| +} |
| + |
| +- (void)sourceNameChangedAtIndex:(int)index { |
| + DesktopMediaPickerItem* item = [items_ objectAtIndex:index]; |
| + const DesktopMediaPickerModel::Source& source = model_->source(index); |
| + [item setImageTitle:base::SysUTF16ToNSString(source.name)]; |
| + [sourceBrowser_ reloadData]; |
| +} |
| + |
| +- (void)sourceThumbnailChangedAtIndex:(int)index { |
| + const DesktopMediaPickerModel::Source& source = model_->source(index); |
| + base::ScopedCFTypeRef<CGColorSpaceRef> colorSpace( |
| + CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)); |
| + gfx::ImageSkia thumbnail = source.thumbnail; |
| + NSImage* image = gfx::SkBitmapToNSImageWithColorSpace( |
|
Robert Sesek
2013/09/04 20:23:19
Use gfx::NSImageFromImageSkia()
dcaiafa
2013/09/04 21:39:35
Awesome! Done.
On 2013/09/04 20:23:19, rsesek wro
|
| + *source.thumbnail.bitmap(), |
| + colorSpace.get()); |
| + |
| + DesktopMediaPickerItem* item = [items_ objectAtIndex:index]; |
| + [item setImageRepresentation:image]; |
| + [sourceBrowser_ reloadData]; |
| +} |
| + |
| +@end // @interface DesktopMediaPickerController |