Chromium Code Reviews| Index: ash/launcher/overflow_button.cc |
| diff --git a/ash/launcher/overflow_button.cc b/ash/launcher/overflow_button.cc |
| index 884746892f982c4b96b8c71ae32cdf87c40a68a4..d357839fb541c6a84e3f9dd84fbbb39b14ab05fc 100644 |
| --- a/ash/launcher/overflow_button.cc |
| +++ b/ash/launcher/overflow_button.cc |
| @@ -4,7 +4,9 @@ |
| #include "ash/launcher/overflow_button.h" |
| +#include "ash/ash_switches.h" |
| #include "ash/shelf/shelf_layout_manager.h" |
| +#include "ash/shelf/shelf_widget.h" |
| #include "grit/ash_resources.h" |
| #include "grit/ash_strings.h" |
| #include "third_party/skia/include/core/SkPaint.h" |
| @@ -13,6 +15,8 @@ |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/canvas.h" |
| +#include "ui/gfx/image/image_skia_operations.h" |
| +#include "ui/gfx/skbitmap_operations.h" |
| #include "ui/gfx/skia_util.h" |
| #include "ui/gfx/transform.h" |
| #include "ui/views/widget/widget.h" |
| @@ -30,29 +34,20 @@ const int kButtonHoverSize = 28; |
| const int kBackgroundOffset = (48 - kButtonHoverSize) / 2; |
| -void RotateCounterclockwise(gfx::Transform* transform) { |
| - SkMatrix44 rotation; |
| - rotation.set3x3(0, -1, 0, |
| - 1, 0, 0, |
| - 0, 0, 1); |
| - transform->matrix().preConcat(rotation); |
| -} |
| - |
| -void RotateClockwise(gfx::Transform* transform) { |
| - SkMatrix44 rotation; |
| - rotation.set3x3( 0, 1, 0, |
| - -1, 0, 0, |
| - 0, 0, 1); |
| - transform->matrix().preConcat(rotation); |
| -} |
| +const int kImagePaddingFromShelf = 5; |
|
James Cook
2013/08/07 18:23:13
Comment padding from what to what.
Harry McCleave
2013/08/07 22:50:59
Done.
|
| } // namesapce |
| OverflowButton::OverflowButton(views::ButtonListener* listener) |
| : CustomButton(listener), |
| - image_(NULL) { |
| + bottom_image_(NULL) { |
| ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| - image_ = rb.GetImageNamed(IDR_AURA_LAUNCHER_OVERFLOW).ToImageSkia(); |
| + bottom_image_ = rb.GetImageNamed(IDR_AURA_LAUNCHER_OVERFLOW).ToImageSkia(); |
| + |
| + left_image_ = gfx::ImageSkiaOperations::CreateRotatedImage(*bottom_image_, |
|
James Cook
2013/08/07 18:23:13
Could these be lazy-initialized, like the first ti
Harry McCleave
2013/08/07 22:50:59
Done.
|
| + SkBitmapOperations::ROTATION_90_CW); |
| + right_image_ = gfx::ImageSkiaOperations::CreateRotatedImage(*bottom_image_, |
| + SkBitmapOperations::ROTATION_270_CW); |
| set_accessibility_focusable(true); |
| SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_OVERFLOW_NAME)); |
| @@ -96,55 +91,81 @@ void OverflowButton::PaintBackground(gfx::Canvas* canvas, int alpha) { |
| } |
| void OverflowButton::OnPaint(gfx::Canvas* canvas) { |
| - ShelfAlignment alignment = ShelfLayoutManager::ForLauncher( |
| - GetWidget()->GetNativeView())->GetAlignment(); |
| - |
| - if (hover_animation_->is_animating()) { |
| - PaintBackground( |
| - canvas, |
| - kButtonHoverAlpha * hover_animation_->GetCurrentValue()); |
| - } else if (state() == STATE_HOVERED || state() == STATE_PRESSED) { |
| - PaintBackground(canvas, kButtonHoverAlpha); |
| + ShelfLayoutManager* layout_manager = ShelfLayoutManager::ForLauncher( |
| + GetWidget()->GetNativeView()); |
| + ShelfAlignment alignment = layout_manager->GetAlignment(); |
| + |
| + gfx::Rect bounds(GetContentsBounds()); |
| + if (ash::switches::UseAlternateShelfLayout()) { |
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| + int background_image_id = 0; |
| + if (layout_manager->shelf_widget()->launcher()->IsShowingOverflowBubble()) |
| + background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_PRESSED; |
| + else if(layout_manager->shelf_widget()->GetDimsShelf()) |
| + background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_ON_BLACK; |
| + else |
| + background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_NORMAL; |
| + |
| + const gfx::ImageSkia* background = |
| + rb.GetImageNamed(background_image_id).ToImageSkia(); |
| + if (alignment == SHELF_ALIGNMENT_LEFT) { |
| + bounds = gfx::Rect( |
| + bounds.right() - background->width() - kImagePaddingFromShelf, |
| + bounds.y() + (bounds.height() - background->height()) / 2, |
| + background->width(), background->height()); |
| + } else if (alignment == SHELF_ALIGNMENT_RIGHT) { |
| + bounds = gfx::Rect( |
| + bounds.x() + kImagePaddingFromShelf, |
| + bounds.y() + (bounds.height() - background->height()) / 2, |
| + background->width(), background->height()); |
| + } else { |
| + bounds = gfx::Rect( |
| + bounds.x() + (bounds.width() - background->width()) / 2, |
| + bounds.y() + kImagePaddingFromShelf, |
| + background->width(), background->height()); |
| + } |
| + canvas->DrawImageInt(*background, bounds.x(), bounds.y()); |
| + } else { |
| + if (alignment == SHELF_ALIGNMENT_BOTTOM) { |
| + bounds = gfx::Rect( |
| + bounds.x() + ((bounds.width() - kButtonHoverSize) / 2) - 1, |
| + bounds.y() + kBackgroundOffset - 1, |
| + kButtonHoverSize, kButtonHoverSize); |
| + } else { |
| + bounds = gfx::Rect( |
| + bounds.x() + kBackgroundOffset -1, |
| + bounds.y() + ((bounds.height() - kButtonHoverSize) / 2) -1, |
| + kButtonHoverSize, kButtonHoverSize); |
| + } |
| + if (hover_animation_->is_animating()) { |
| + PaintBackground( |
| + canvas, |
| + kButtonHoverAlpha * hover_animation_->GetCurrentValue()); |
| + } else if (state() == STATE_HOVERED || state() == STATE_PRESSED) { |
| + PaintBackground(canvas, kButtonHoverAlpha); |
| + } |
| } |
| if (height() < kButtonHoverSize) |
| return; |
| - gfx::Transform transform; |
| + const gfx::ImageSkia* image = NULL; |
| - switch (alignment) { |
| - case SHELF_ALIGNMENT_BOTTOM: |
| - // Shift 1 pixel left to align with overflow bubble tip. |
| - transform.Translate(-1, kBackgroundOffset); |
| - break; |
| + switch(alignment) { |
| case SHELF_ALIGNMENT_LEFT: |
| - transform.Translate(kBackgroundOffset, -1); |
| - RotateClockwise(&transform); |
| + image = &left_image_; |
| break; |
| case SHELF_ALIGNMENT_RIGHT: |
| - transform.Translate(kBackgroundOffset, height()); |
| - RotateCounterclockwise(&transform); |
| + image = &right_image_; |
| break; |
| - case SHELF_ALIGNMENT_TOP: |
| - transform.Translate(1, kBackgroundOffset); |
| + default: |
| + image = bottom_image_; |
| break; |
| } |
| - canvas->Save(); |
| - canvas->Transform(transform); |
| - |
| - gfx::Rect rect(GetContentsBounds()); |
| - if (alignment == SHELF_ALIGNMENT_BOTTOM || |
| - alignment == SHELF_ALIGNMENT_TOP) { |
| - canvas->DrawImageInt(*image_, |
| - rect.x() + (rect.width() - image_->width()) / 2, |
| - kButtonHoverSize - image_->height()); |
| - } else { |
| - canvas->DrawImageInt(*image_, |
| - kButtonHoverSize - image_->width(), |
| - rect.y() + (rect.height() - image_->height()) / 2); |
| - } |
| - canvas->Restore(); |
| + canvas->DrawImageInt(*image, |
| + bounds.x() + ((bounds.width() - image->width()) / 2), |
| + bounds.y() + ((bounds.height() - image->height()) / 2)); |
| } |
| } // namespace internal |