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

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

Issue 23944003: Implement Desktop Media Picker (Mac version) for Desktop Capture API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed comments. Created 7 years, 3 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
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

Powered by Google App Engine
This is Rietveld 408576698