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

Side by Side Diff: chrome/browser/views/browser_actions_container.cc

Issue 291003: Implement badges for page actions. Also add badge text color API. (Closed)
Patch Set: argb Created 11 years, 2 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/gtk/location_bar_view_gtk.cc ('k') | chrome/browser/views/location_bar_view.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #include "chrome/browser/views/browser_actions_container.h" 5 #include "chrome/browser/views/browser_actions_container.h"
6 6
7 #include "app/gfx/canvas.h" 7 #include "app/gfx/canvas.h"
8 #include "app/resource_bundle.h" 8 #include "app/resource_bundle.h"
9 #include "base/stl_util-inl.h" 9 #include "base/stl_util-inl.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 button_ = new BrowserActionButton(browser_action, extension, panel); 292 button_ = new BrowserActionButton(browser_action, extension, panel);
293 AddChildView(button_); 293 AddChildView(button_);
294 } 294 }
295 295
296 void BrowserActionView::Layout() { 296 void BrowserActionView::Layout() {
297 button_->SetBounds(0, kControlVertOffset, width(), kButtonSize); 297 button_->SetBounds(0, kControlVertOffset, width(), kButtonSize);
298 } 298 }
299 299
300 void BrowserActionView::PaintChildren(gfx::Canvas* canvas) { 300 void BrowserActionView::PaintChildren(gfx::Canvas* canvas) {
301 View::PaintChildren(canvas); 301 View::PaintChildren(canvas);
302 302 button_->browser_action_state()->PaintBadge(canvas,
303 const std::string& text = button_->browser_action_state()->badge_text(); 303 gfx::Rect(width(), height()));
304 if (text.empty())
305 return;
306
307 const int kTextSize = 8;
308 const int kBottomMargin = 5;
309 const int kPadding = 2;
310 const int kBadgeHeight = 11;
311 const int kMaxTextWidth = 23;
312 const int kCenterAlignThreshold = 20; // at than width, we center align
313
314 canvas->save();
315
316 SkTypeface* typeface = SkTypeface::CreateFromName("Arial", SkTypeface::kBold);
317 SkPaint text_paint;
318 text_paint.setAntiAlias(true);
319 text_paint.setColor(SK_ColorWHITE);
320 text_paint.setFakeBoldText(true);
321 text_paint.setTextAlign(SkPaint::kLeft_Align);
322 text_paint.setTextSize(SkIntToScalar(kTextSize));
323 text_paint.setTypeface(typeface);
324
325 // Calculate text width. We clamp it to a max size.
326 SkScalar text_width = text_paint.measureText(text.c_str(), text.size());
327 text_width = SkIntToScalar(
328 std::min(kMaxTextWidth, SkScalarFloor(text_width)));
329
330 // Cacluate badge size. It is clamped to a min width just because it looks
331 // silly if it is too skinny.
332 int badge_width = SkScalarFloor(text_width) + kPadding * 2;
333 badge_width = std::max(kBadgeHeight, badge_width);
334
335 // Paint the badge background color in the right location. It is usually
336 // right-aligned, but it can also be center-aligned if it is large.
337 SkRect rect;
338 rect.fBottom = SkIntToScalar(height() - kBottomMargin);
339 rect.fTop = rect.fBottom - SkIntToScalar(kBadgeHeight);
340 if (badge_width >= kCenterAlignThreshold) {
341 rect.fLeft = SkIntToScalar((width() - badge_width) / 2);
342 rect.fRight = rect.fLeft + SkIntToScalar(badge_width);
343 } else {
344 rect.fRight = SkIntToScalar(width());
345 rect.fLeft = rect.fRight - badge_width;
346 }
347
348 SkPaint rect_paint;
349 rect_paint.setStyle(SkPaint::kFill_Style);
350 rect_paint.setAntiAlias(true);
351 rect_paint.setColor(
352 button_->browser_action_state()->badge_background_color());
353 canvas->drawRoundRect(rect, SkIntToScalar(2), SkIntToScalar(2), rect_paint);
354
355 // Overlay the gradient. It is stretchy, so we do this in three parts.
356 ResourceBundle& resource_bundle = ResourceBundle::GetSharedInstance();
357 SkBitmap* gradient_left = resource_bundle.GetBitmapNamed(
358 IDR_BROWSER_ACTION_BADGE_LEFT);
359 SkBitmap* gradient_right = resource_bundle.GetBitmapNamed(
360 IDR_BROWSER_ACTION_BADGE_RIGHT);
361 SkBitmap* gradient_center = resource_bundle.GetBitmapNamed(
362 IDR_BROWSER_ACTION_BADGE_CENTER);
363
364 canvas->drawBitmap(*gradient_left, rect.fLeft, rect.fTop);
365 canvas->TileImageInt(*gradient_center,
366 SkScalarFloor(rect.fLeft) + gradient_left->width(),
367 SkScalarFloor(rect.fTop),
368 SkScalarFloor(rect.width()) - gradient_left->width() -
369 gradient_right->width(),
370 SkScalarFloor(rect.height()));
371 canvas->drawBitmap(*gradient_right,
372 rect.fRight - SkIntToScalar(gradient_right->width()), rect.fTop);
373
374 // Finally, draw the text centered within the badge. We set a clip in case the
375 // text was too large.
376 rect.fLeft += kPadding;
377 rect.fRight -= kPadding;
378 canvas->clipRect(rect);
379 canvas->drawText(text.c_str(), text.size(),
380 rect.fLeft + (rect.width() - text_width) / 2,
381 rect.fTop + kTextSize + 1,
382 text_paint);
383 canvas->restore();
384 } 304 }
385 305
386 306
387 //////////////////////////////////////////////////////////////////////////////// 307 ////////////////////////////////////////////////////////////////////////////////
388 // BrowserActionsContainer 308 // BrowserActionsContainer
389 309
390 BrowserActionsContainer::BrowserActionsContainer( 310 BrowserActionsContainer::BrowserActionsContainer(
391 Profile* profile, ToolbarView* toolbar) 311 Profile* profile, ToolbarView* toolbar)
392 : profile_(profile), 312 : profile_(profile),
393 toolbar_(toolbar), 313 toolbar_(toolbar),
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 std::min(static_cast<int>(browser_action_views_.size()), 497 std::min(static_cast<int>(browser_action_views_.size()),
578 kMinimumNumberOfVisibleBrowserActions) * kButtonSize; 498 kMinimumNumberOfVisibleBrowserActions) * kButtonSize;
579 499
580 // Even if available_width is <= 0, we still return at least the |min_width|. 500 // Even if available_width is <= 0, we still return at least the |min_width|.
581 if (available_width <= 0) 501 if (available_width <= 0)
582 return min_width; 502 return min_width;
583 503
584 return std::max(min_width, available_width - available_width % kButtonSize + 504 return std::max(min_width, available_width - available_width % kButtonSize +
585 kHorizontalPadding * 2); 505 kHorizontalPadding * 2);
586 } 506 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/location_bar_view_gtk.cc ('k') | chrome/browser/views/location_bar_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698