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

Unified Diff: chrome/browser/chromeos/setting_level_bubble.cc

Issue 8319008: aura: brightness and volume bubble. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: styles Created 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/setting_level_bubble.cc
diff --git a/chrome/browser/chromeos/setting_level_bubble.cc b/chrome/browser/chromeos/setting_level_bubble.cc
index c546f88455987beeed36cab168edef82d1719c95..1908ed1af877c8ed50a4df45b2f31ab8798cc8fd 100644
--- a/chrome/browser/chromeos/setting_level_bubble.cc
+++ b/chrome/browser/chromeos/setting_level_bubble.cc
@@ -14,8 +14,9 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/views/bubble/bubble.h"
#include "ui/gfx/screen.h"
+#include "views/bubble/bubble_delegate.h"
+#include "views/layout/fill_layout.h"
#include "views/widget/root_view.h"
using base::TimeDelta;
@@ -84,91 +85,147 @@ static views::Widget* GetToplevelWidget() {
return WebUILoginDisplay::GetLoginWindow();
}
-SettingLevelBubble::SettingLevelBubble(SkBitmap* increase_icon,
- SkBitmap* decrease_icon,
- SkBitmap* disabled_icon)
- : current_percent_(-1.0),
- target_percent_(-1.0),
- increase_icon_(increase_icon),
- decrease_icon_(decrease_icon),
- disabled_icon_(disabled_icon),
- bubble_(NULL),
- view_(NULL),
- is_animating_(false) {
+// SettingLevelBubbleDelegateView ----------------------------------------------
+class SettingLevelBubbleDelegateView : public views::BubbleDelegateView {
+ public:
+ // BubbleDelegate overrides:
+ virtual gfx::Point GetAnchorPoint() OVERRIDE;
+
+ // Create the bubble delegate view.
+ explicit SettingLevelBubbleDelegateView(views::Widget* parent);
+ virtual ~SettingLevelBubbleDelegateView();
+
+ SettingLevelBubbleView* view() { return view_; }
+
+ protected:
+ // BubbleDelegate overrides:
+ virtual void Init() OVERRIDE;
+
+ private:
+ views::Widget* parent_;
+
+ SettingLevelBubbleView* view_;
+
+ DISALLOW_COPY_AND_ASSIGN(SettingLevelBubbleDelegateView);
+};
+
+gfx::Point SettingLevelBubbleDelegateView::GetAnchorPoint() {
+ gfx::Size view_size = GetPreferredSize();
+ // Calculate the position in screen coordinates that the bubble should
+ // "point" at (since we use BubbleBorder::FLOAT, this position actually
+ // specifies the center of the bubble).
+ gfx::Rect monitor_area =
+ gfx::Screen::GetMonitorAreaNearestWindow(
+ parent_->GetNativeView());
+ return (gfx::Point(
+ monitor_area.x() + kBubbleXRatio * monitor_area.width(),
+ monitor_area.bottom() - view_size.height() / 2 - kBubbleBottomGap));
}
-SettingLevelBubble::~SettingLevelBubble() {}
+SettingLevelBubbleDelegateView::SettingLevelBubbleDelegateView(
+ views::Widget* parent)
+ : BubbleDelegateView(gfx::Point(),
+ views::BubbleBorder::FLOAT,
+ SK_ColorWHITE),
+ parent_(parent),
+ view_(NULL) {
+ set_close_on_esc(false);
+}
-void SettingLevelBubble::ShowBubble(double percent, bool enabled) {
- const double old_target_percent = target_percent_;
- UpdateTargetPercent(percent);
+SettingLevelBubbleDelegateView::~SettingLevelBubbleDelegateView() {
+ view_ = NULL;
+}
- SkBitmap* icon = increase_icon_;
- if (!enabled || target_percent_ == 0)
- icon = disabled_icon_;
- else if (old_target_percent >= 0 && target_percent_ < old_target_percent)
- icon = decrease_icon_;
+void SettingLevelBubbleDelegateView::Init() {
+ SetLayoutManager(new views::FillLayout());
+ view_ = new SettingLevelBubbleView();
Daniel Erat 2011/10/26 05:08:01 should probably call the SettingLevelBubbleView's
alicet1 2011/10/26 16:12:48 yes, didn't do that for a reason -- the view's ini
+ AddChildView(view_);
+}
- if (!bubble_) {
- views::Widget* parent_widget = GetToplevelWidget();
- if (parent_widget == NULL) {
- LOG(WARNING) << "Unable to locate parent widget to display a bubble";
- return;
- }
- DCHECK(view_ == NULL);
- view_ = new SettingLevelBubbleView;
- view_->Init(icon, current_percent_, enabled);
-
- // Calculate the position in screen coordinates that the bubble should
- // "point" at (since we use BubbleBorder::FLOAT, this position actually
- // specifies the center of the bubble).
- const gfx::Rect monitor_area =
- gfx::Screen::GetMonitorAreaNearestWindow(
- parent_widget->GetNativeView());
- const gfx::Size view_size = view_->GetPreferredSize();
- const gfx::Rect position_relative_to(
- monitor_area.x() + kBubbleXRatio * monitor_area.width(),
- monitor_area.bottom() - view_size.height() / 2 - kBubbleBottomGap,
- 0, 0);
-
- bubble_ = Bubble::ShowFocusless(parent_widget,
- position_relative_to,
- views::BubbleBorder::FLOAT,
- view_, // contents
- this, // delegate
- true); // show while screen is locked
- // TODO(derat): We probably shouldn't be using Bubble. It'd be nice to call
- // bubble_->set_fade_away_on_close(true) here, but then, if ShowBubble()
- // gets called while the bubble is fading away, we end up just adjusting the
- // value on the disappearing bubble; ideally we'd have a way to cancel the
- // fade and show the bubble at full opacity for another
- // kBubbleShowTimeoutMs.
- } else {
- DCHECK(view_);
- hide_timer_.Stop();
- view_->SetIcon(icon);
- view_->SetEnabled(enabled);
+// SettingLevelBubble ----------------------------------------------
+void SettingLevelBubble::OnWidgetClosing(views::Widget* widget) {
+ if (view_ && view_->GetWidget() == widget) {
+ view_->GetWidget()->RemoveObserver(this);
+ view_= NULL;
Daniel Erat 2011/10/26 05:08:01 nit: "view_ ="
alicet1 2011/10/26 16:12:48 Done.
}
+ // Update states.
+ current_percent_ = target_percent_;
+ target_time_ = TimeTicks();
+ last_animation_update_time_ = TimeTicks();
+ last_target_update_time_ = TimeTicks();
+ hide_timer_.Stop();
+ StopAnimation();
+}
+void SettingLevelBubble::ShowBubble(double percent, bool enabled) {
+ if (!view_)
+ view_ = CreateView();
+ UpdateWithoutShowingBubble(percent, enabled);
+ view_->GetWidget()->Show();
+ // Show the widget and start the timer. When the timer
+ // runs out, we start the fade sequence.
+ hide_timer_.Stop();
hide_timer_.Start(FROM_HERE,
base::TimeDelta::FromMilliseconds(kBubbleShowTimeoutMs),
this, &SettingLevelBubble::OnHideTimeout);
}
void SettingLevelBubble::HideBubble() {
- if (bubble_)
- bubble_->Close();
+ if (view_) {
+ view_->GetWidget()->Close();
+ view_ = NULL;
+ }
+}
+
+SettingLevelBubble::SettingLevelBubble(SkBitmap* increase_icon,
+ SkBitmap* decrease_icon,
+ SkBitmap* disabled_icon)
+ : current_percent_(-1.0),
+ target_percent_(-1.0),
+ increase_icon_(increase_icon),
+ decrease_icon_(decrease_icon),
+ disabled_icon_(disabled_icon),
+ is_animating_(false) {
+ view_ = CreateView();
+}
+
+SettingLevelBubble::~SettingLevelBubble() {
+ view_ = NULL;
+}
+
+SettingLevelBubbleView* SettingLevelBubble::CreateView() {
+ views::Widget* parent = GetToplevelWidget();
+ SettingLevelBubbleDelegateView* delegate =
+ new SettingLevelBubbleDelegateView(parent);
+ views::Widget* widget =
+ views::BubbleDelegateView::CreateBubble(delegate, parent);
+ widget->AddObserver(this);
+ // Hold on to the content view.
+ return delegate->view();
}
void SettingLevelBubble::UpdateWithoutShowingBubble(double percent,
bool enabled) {
+ const double old_target_percent = target_percent_;
UpdateTargetPercent(percent);
- if (view_)
- view_->SetEnabled(enabled);
+ SkBitmap* current_icon = increase_icon_;
+ if (!enabled || target_percent_ == 0)
+ current_icon = disabled_icon_;
+ else if (old_target_percent >= 0 && target_percent_ < old_target_percent)
+ current_icon = decrease_icon_;
+ if (view_) {
Daniel Erat 2011/10/26 05:08:01 nit: no curly braces for single-line if statements
alicet1 2011/10/26 16:12:48 Done.
+ view_->Init(current_icon, percent, enabled);
Daniel Erat 2011/10/26 05:08:01 i think that it's the case in all of the chrome co
alicet1 2011/10/26 16:12:48 removed.
+ }
}
void SettingLevelBubble::OnHideTimeout() {
- HideBubble();
+ // Start fading away.
+ if (view_) {
+ SettingLevelBubbleDelegateView* delegate =
+ static_cast<SettingLevelBubbleDelegateView*>
+ (view_->GetWidget()->widget_delegate());
+ delegate->StartFade(false);
+ }
}
void SettingLevelBubble::OnAnimationTimeout() {
@@ -194,26 +251,6 @@ void SettingLevelBubble::OnAnimationTimeout() {
view_->SetLevel(current_percent_);
}
-void SettingLevelBubble::BubbleClosing(Bubble* bubble, bool) {
- DCHECK(bubble == bubble_);
- hide_timer_.Stop();
- StopAnimation();
- bubble_ = NULL;
- view_ = NULL;
- current_percent_ = target_percent_;
- target_time_ = TimeTicks();
- last_animation_update_time_ = TimeTicks();
- last_target_update_time_ = TimeTicks();
-}
-
-bool SettingLevelBubble::CloseOnEscape() {
- return true;
-}
-
-bool SettingLevelBubble::FadeInOnShow() {
- return false;
-}
-
void SettingLevelBubble::UpdateTargetPercent(double percent) {
target_percent_ = LimitPercent(percent);
const TimeTicks now = TimeTicks::Now();

Powered by Google App Engine
This is Rietveld 408576698