OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ui/app_list/cocoa/apps_grid_view_item.h" | 5 #import "ui/app_list/cocoa/apps_grid_view_item.h" |
6 | 6 |
7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
8 #include "base/memory/scoped_nsobject.h" | 8 #include "base/memory/scoped_nsobject.h" |
9 #include "base/strings/sys_string_conversions.h" | 9 #include "base/strings/sys_string_conversions.h" |
10 #include "skia/ext/skia_utils_mac.h" | 10 #include "skia/ext/skia_utils_mac.h" |
11 #include "ui/app_list/app_list_constants.h" | 11 #include "ui/app_list/app_list_constants.h" |
12 #include "ui/app_list/app_list_item_model.h" | 12 #include "ui/app_list/app_list_item_model.h" |
13 #include "ui/app_list/app_list_item_model_observer.h" | 13 #include "ui/app_list/app_list_item_model_observer.h" |
14 #include "ui/base/resource/resource_bundle.h" | 14 #include "ui/base/resource/resource_bundle.h" |
15 #include "ui/gfx/image/image_skia_util_mac.h" | 15 #include "ui/gfx/image/image_skia_util_mac.h" |
16 #include "ui/gfx/font.h" | 16 #include "ui/gfx/font.h" |
| 17 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
17 | 18 |
18 namespace { | 19 namespace { |
19 | 20 |
20 // Padding from the top of the tile to the top of the app icon. | 21 // Padding from the top of the tile to the top of the app icon. |
21 const CGFloat kTileTopPadding = 10; | 22 const CGFloat kTileTopPadding = 10; |
22 | 23 |
23 } // namespace | 24 } // namespace |
24 | 25 |
25 namespace app_list { | 26 namespace app_list { |
26 | 27 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 @private | 84 @private |
84 BOOL selected_; | 85 BOOL selected_; |
85 } | 86 } |
86 | 87 |
87 - (NSButton*)button; | 88 - (NSButton*)button; |
88 | 89 |
89 - (void)setSelected:(BOOL)flag; | 90 - (void)setSelected:(BOOL)flag; |
90 | 91 |
91 @end | 92 @end |
92 | 93 |
| 94 @interface AppsGridItemButtonCell : NSButtonCell { |
| 95 @private |
| 96 BOOL hasShadow_; |
| 97 } |
| 98 |
| 99 @property(assign, nonatomic) BOOL hasShadow; |
| 100 |
| 101 @end |
| 102 |
| 103 @interface AppsGridItemButton : NSButton; |
| 104 @end |
| 105 |
93 @implementation AppsGridItemBackgroundView | 106 @implementation AppsGridItemBackgroundView |
94 | 107 |
95 - (NSButton*)button { | 108 - (NSButton*)button { |
96 return base::mac::ObjCCastStrict<NSButton>([[self subviews] objectAtIndex:0]); | 109 return base::mac::ObjCCastStrict<NSButton>([[self subviews] objectAtIndex:0]); |
97 } | 110 } |
98 | 111 |
99 - (void)setSelected:(BOOL)flag { | 112 - (void)setSelected:(BOOL)flag { |
100 if (selected_ == flag) | 113 if (selected_ == flag) |
101 return; | 114 return; |
102 | 115 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 @interface AppsGridViewItem () | 155 @interface AppsGridViewItem () |
143 | 156 |
144 - (AppsGridItemBackgroundView*)itemBackgroundView; | 157 - (AppsGridItemBackgroundView*)itemBackgroundView; |
145 | 158 |
146 @end | 159 @end |
147 | 160 |
148 @implementation AppsGridViewItem | 161 @implementation AppsGridViewItem |
149 | 162 |
150 - (id)initWithSize:(NSSize)tileSize { | 163 - (id)initWithSize:(NSSize)tileSize { |
151 if ((self = [super init])) { | 164 if ((self = [super init])) { |
152 scoped_nsobject<NSButton> prototypeButton( | 165 scoped_nsobject<AppsGridItemButton> prototypeButton( |
153 [[NSButton alloc] initWithFrame:NSMakeRect( | 166 [[AppsGridItemButton alloc] initWithFrame:NSMakeRect( |
154 0, 0, tileSize.width, tileSize.height - kTileTopPadding)]); | 167 0, 0, tileSize.width, tileSize.height - kTileTopPadding)]); |
155 | 168 |
156 // This NSButton style always positions the icon at the very top of the | 169 // This NSButton style always positions the icon at the very top of the |
157 // button frame. AppsGridViewItem uses an enclosing view so that it is | 170 // button frame. AppsGridViewItem uses an enclosing view so that it is |
158 // visually correct. | 171 // visually correct. |
159 [prototypeButton setImagePosition:NSImageAbove]; | 172 [prototypeButton setImagePosition:NSImageAbove]; |
160 [prototypeButton setButtonType:NSMomentaryChangeButton]; | 173 [prototypeButton setButtonType:NSMomentaryChangeButton]; |
161 [prototypeButton setBordered:NO]; | 174 [prototypeButton setBordered:NO]; |
162 | 175 |
163 [[prototypeButton cell] | 176 [[prototypeButton cell] |
(...skipping 11 matching lines...) Expand all Loading... |
175 | 188 |
176 - (void)setModel:(app_list::AppListItemModel*)itemModel { | 189 - (void)setModel:(app_list::AppListItemModel*)itemModel { |
177 if (!itemModel) { | 190 if (!itemModel) { |
178 observerBridge_.reset(); | 191 observerBridge_.reset(); |
179 return; | 192 return; |
180 } | 193 } |
181 | 194 |
182 NSButton* button = [self button]; | 195 NSButton* button = [self button]; |
183 [button setTitle:base::SysUTF8ToNSString(itemModel->title())]; | 196 [button setTitle:base::SysUTF8ToNSString(itemModel->title())]; |
184 [button setImage:gfx::NSImageFromImageSkia(itemModel->icon())]; | 197 [button setImage:gfx::NSImageFromImageSkia(itemModel->icon())]; |
| 198 [[button cell] setHasShadow:itemModel->has_shadow()]; |
185 observerBridge_.reset(new app_list::ItemModelObserverBridge(self, itemModel)); | 199 observerBridge_.reset(new app_list::ItemModelObserverBridge(self, itemModel)); |
186 | 200 |
187 if (trackingArea_.get()) | 201 if (trackingArea_.get()) |
188 [[self view] removeTrackingArea:trackingArea_.get()]; | 202 [[self view] removeTrackingArea:trackingArea_.get()]; |
189 | 203 |
190 trackingArea_.reset( | 204 trackingArea_.reset( |
191 [[CrTrackingArea alloc] initWithRect:NSZeroRect | 205 [[CrTrackingArea alloc] initWithRect:NSZeroRect |
192 options:NSTrackingInVisibleRect | | 206 options:NSTrackingInVisibleRect | |
193 NSTrackingMouseEnteredAndExited | | 207 NSTrackingMouseEnteredAndExited | |
194 NSTrackingActiveInKeyWindow | 208 NSTrackingActiveInKeyWindow |
(...skipping 23 matching lines...) Expand all Loading... |
218 - (void)mouseExited:(NSEvent*)theEvent { | 232 - (void)mouseExited:(NSEvent*)theEvent { |
219 [self setSelected:NO]; | 233 [self setSelected:NO]; |
220 } | 234 } |
221 | 235 |
222 - (void)setSelected:(BOOL)flag { | 236 - (void)setSelected:(BOOL)flag { |
223 [[self itemBackgroundView] setSelected:flag]; | 237 [[self itemBackgroundView] setSelected:flag]; |
224 [super setSelected:flag]; | 238 [super setSelected:flag]; |
225 } | 239 } |
226 | 240 |
227 @end | 241 @end |
| 242 |
| 243 @implementation AppsGridItemButton |
| 244 |
| 245 + (Class)cellClass { |
| 246 return [AppsGridItemButtonCell class]; |
| 247 } |
| 248 |
| 249 @end |
| 250 |
| 251 @implementation AppsGridItemButtonCell |
| 252 |
| 253 @synthesize hasShadow = hasShadow_; |
| 254 |
| 255 - (void)drawImage:(NSImage*)image |
| 256 withFrame:(NSRect)frame |
| 257 inView:(NSView*)controlView { |
| 258 if (!hasShadow_) { |
| 259 [super drawImage:image |
| 260 withFrame:frame |
| 261 inView:controlView]; |
| 262 return; |
| 263 } |
| 264 |
| 265 scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]); |
| 266 gfx::ScopedNSGraphicsContextSaveGState context; |
| 267 [shadow setShadowOffset:NSMakeSize(0, -2)]; |
| 268 [shadow setShadowBlurRadius:2.0]; |
| 269 [shadow setShadowColor:[NSColor colorWithCalibratedWhite:0 |
| 270 alpha:0.14]]; |
| 271 [shadow set]; |
| 272 |
| 273 [super drawImage:image |
| 274 withFrame:frame |
| 275 inView:controlView]; |
| 276 } |
| 277 |
| 278 @end |
OLD | NEW |