summaryrefslogtreecommitdiffstats
path: root/ash/system/tray/throbber_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/system/tray/throbber_view.cc')
-rw-r--r--ash/system/tray/throbber_view.cc110
1 files changed, 110 insertions, 0 deletions
diff --git a/ash/system/tray/throbber_view.cc b/ash/system/tray/throbber_view.cc
new file mode 100644
index 0000000..89d4ed4
--- /dev/null
+++ b/ash/system/tray/throbber_view.cc
@@ -0,0 +1,110 @@
+// 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.
+
+#include "ash/system/tray/throbber_view.h"
+
+#include "ash/system/tray/tray_constants.h"
+#include "grit/ash_resources.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/scoped_layer_animation_settings.h"
+
+namespace ash {
+namespace internal {
+
+namespace {
+
+// Time in ms per throbber frame.
+const int kThrobberFrameMs = 30;
+
+// Duration for showing/hiding animation in milliseconds.
+const int kThrobberAnimationDurationMs = 200;
+
+} // namespace
+
+SystemTrayThrobber::SystemTrayThrobber(int frame_delay_ms)
+ : views::SmoothedThrobber(frame_delay_ms) {
+}
+
+SystemTrayThrobber::~SystemTrayThrobber() {
+}
+
+void SystemTrayThrobber::SetTooltipText(const string16& tooltip_text) {
+ tooltip_text_ = tooltip_text;
+}
+
+bool SystemTrayThrobber::GetTooltipText(const gfx::Point& p,
+ string16* tooltip) const {
+ if (tooltip_text_.empty())
+ return false;
+
+ *tooltip = tooltip_text_;
+ return true;
+}
+
+ThrobberView::ThrobberView() {
+ throbber_ = new SystemTrayThrobber(kThrobberFrameMs);
+ throbber_->SetFrames(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ IDR_AURA_CROS_DEFAULT_THROBBER).ToImageSkia());
+ throbber_->set_stop_delay_ms(kThrobberAnimationDurationMs);
+ AddChildView(throbber_);
+
+ SetPaintToLayer(true);
+ layer()->SetFillsBoundsOpaquely(false);
+ layer()->SetOpacity(0.0);
+}
+
+ThrobberView::~ThrobberView() {
+}
+
+gfx::Size ThrobberView::GetPreferredSize() {
+ return gfx::Size(ash::kTrayPopupItemHeight, ash::kTrayPopupItemHeight);
+}
+
+void ThrobberView::Layout() {
+ View* child = child_at(0);
+ gfx::Size ps = child->GetPreferredSize();
+ child->SetBounds((width() - ps.width()) / 2,
+ (height() - ps.height()) / 2,
+ ps.width(), ps.height());
+ SizeToPreferredSize();
+}
+
+bool ThrobberView::GetTooltipText(const gfx::Point& p,
+ string16* tooltip) const {
+ if (tooltip_text_.empty())
+ return false;
+
+ *tooltip = tooltip_text_;
+ return true;
+}
+
+void ThrobberView::Start() {
+ ScheduleAnimation(true);
+ throbber_->Start();
+}
+
+void ThrobberView::Stop() {
+ ScheduleAnimation(false);
+ throbber_->Stop();
+}
+
+void ThrobberView::SetTooltipText(const string16& tooltip_text) {
+ tooltip_text_ = tooltip_text;
+ throbber_->SetTooltipText(tooltip_text);
+}
+
+void ThrobberView::ScheduleAnimation(bool start_throbber) {
+ // Stop any previous animation.
+ layer()->GetAnimator()->StopAnimating();
+
+ ui::ScopedLayerAnimationSettings animation(layer()->GetAnimator());
+ animation.SetTransitionDuration(
+ base::TimeDelta::FromMilliseconds(kThrobberAnimationDurationMs));
+
+ layer()->SetOpacity(start_throbber ? 1.0 : 0.0);
+}
+
+} // namespace internal
+} // namespace ash