| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ash/common/system/toast/toast_overlay.h" | 5 #include "ash/common/system/toast/toast_overlay.h" |
| 6 | 6 |
| 7 #include "ash/common/shelf/wm_shelf.h" | 7 #include "ash/common/shelf/wm_shelf.h" |
| 8 #include "ash/common/wm_lookup.h" | 8 #include "ash/common/wm_lookup.h" |
| 9 #include "ash/common/wm_root_window_controller.h" | 9 #include "ash/common/wm_root_window_controller.h" |
| 10 #include "ash/common/wm_shell.h" | 10 #include "ash/common/wm_shell.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 int verticalSpacing = kToastVerticalSpacing - | 122 int verticalSpacing = kToastVerticalSpacing - |
| 123 (GetPreferredSize().height() - label()->GetBaseline()); | 123 (GetPreferredSize().height() - label()->GetBaseline()); |
| 124 SetBorder(views::CreateEmptyBorder(verticalSpacing, kToastHorizontalSpacing, | 124 SetBorder(views::CreateEmptyBorder(verticalSpacing, kToastHorizontalSpacing, |
| 125 verticalSpacing, kToastHorizontalSpacing)); | 125 verticalSpacing, kToastHorizontalSpacing)); |
| 126 } | 126 } |
| 127 | 127 |
| 128 /////////////////////////////////////////////////////////////////////////////// | 128 /////////////////////////////////////////////////////////////////////////////// |
| 129 // ToastOverlayView | 129 // ToastOverlayView |
| 130 class ToastOverlayView : public views::View, public views::ButtonListener { | 130 class ToastOverlayView : public views::View, public views::ButtonListener { |
| 131 public: | 131 public: |
| 132 // This object is not owned by the views hiearchy or by the widget. | 132 // This object is not owned by the views hierarchy or by the widget. |
| 133 ToastOverlayView(ToastOverlay* overlay, | 133 ToastOverlayView(ToastOverlay* overlay, |
| 134 const base::string16& text, | 134 const base::string16& text, |
| 135 const base::string16& dismiss_text); | 135 const base::Optional<base::string16>& dismiss_text); |
| 136 ~ToastOverlayView() override; | 136 ~ToastOverlayView() override; |
| 137 | 137 |
| 138 // views::View overrides: | 138 // views::View overrides: |
| 139 void OnPaint(gfx::Canvas* canvas) override; | 139 void OnPaint(gfx::Canvas* canvas) override; |
| 140 | 140 |
| 141 ToastOverlayButton* button() { return button_; } | 141 ToastOverlayButton* button() { return button_; } |
| 142 | 142 |
| 143 private: | 143 private: |
| 144 ToastOverlay* overlay_; // weak | 144 // views::View overrides: |
| 145 ToastOverlayButton* button_; // weak | |
| 146 | |
| 147 gfx::Size GetMaximumSize() const override; | 145 gfx::Size GetMaximumSize() const override; |
| 148 gfx::Size GetMinimumSize() const override; | 146 gfx::Size GetMinimumSize() const override; |
| 149 | 147 |
| 148 // views::ButtonListener overrides: |
| 150 void ButtonPressed(views::Button* sender, const ui::Event& event) override; | 149 void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
| 151 | 150 |
| 151 ToastOverlay* overlay_ = nullptr; // weak |
| 152 ToastOverlayButton* button_ = nullptr; // weak |
| 153 |
| 152 DISALLOW_COPY_AND_ASSIGN(ToastOverlayView); | 154 DISALLOW_COPY_AND_ASSIGN(ToastOverlayView); |
| 153 }; | 155 }; |
| 154 | 156 |
| 155 ToastOverlayView::ToastOverlayView(ToastOverlay* overlay, | 157 ToastOverlayView::ToastOverlayView( |
| 156 const base::string16& text, | 158 ToastOverlay* overlay, |
| 157 const base::string16& dismiss_text) | 159 const base::string16& text, |
| 158 : overlay_(overlay), | 160 const base::Optional<base::string16>& dismiss_text) |
| 159 button_(new ToastOverlayButton( | 161 : overlay_(overlay) { |
| 160 this, | |
| 161 dismiss_text.empty() | |
| 162 ? l10n_util::GetStringUTF16(IDS_ASH_TOAST_DISMISS_BUTTON) | |
| 163 : dismiss_text)) { | |
| 164 ToastOverlayLabel* label = new ToastOverlayLabel(text); | |
| 165 label->SetMaximumWidth( | |
| 166 GetMaximumSize().width() - button_->GetPreferredSize().width() - | |
| 167 kToastHorizontalSpacing * 2 - kToastHorizontalSpacing * 2); | |
| 168 AddChildView(label); | |
| 169 | |
| 170 AddChildView(button_); | |
| 171 | |
| 172 auto* layout = new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); | 162 auto* layout = new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); |
| 173 SetLayoutManager(layout); | 163 SetLayoutManager(layout); |
| 164 |
| 165 if (dismiss_text.has_value()) { |
| 166 button_ = new ToastOverlayButton( |
| 167 this, dismiss_text.value().empty() |
| 168 ? l10n_util::GetStringUTF16(IDS_ASH_TOAST_DISMISS_BUTTON) |
| 169 : dismiss_text.value()); |
| 170 } |
| 171 |
| 172 ToastOverlayLabel* label = new ToastOverlayLabel(text); |
| 173 AddChildView(label); |
| 174 layout->SetFlexForView(label, 1); | 174 layout->SetFlexForView(label, 1); |
| 175 layout->SetFlexForView(button_, 0); | 175 |
| 176 if (button_) { |
| 177 label->SetMaximumWidth( |
| 178 GetMaximumSize().width() - button_->GetPreferredSize().width() - |
| 179 kToastHorizontalSpacing * 2 - kToastHorizontalSpacing * 2); |
| 180 AddChildView(button_); |
| 181 } |
| 176 } | 182 } |
| 177 | 183 |
| 178 ToastOverlayView::~ToastOverlayView() {} | 184 ToastOverlayView::~ToastOverlayView() {} |
| 179 | 185 |
| 180 void ToastOverlayView::OnPaint(gfx::Canvas* canvas) { | 186 void ToastOverlayView::OnPaint(gfx::Canvas* canvas) { |
| 181 SkPaint paint; | 187 SkPaint paint; |
| 182 paint.setStyle(SkPaint::kFill_Style); | 188 paint.setStyle(SkPaint::kFill_Style); |
| 183 paint.setColor(kButtonBackgroundColor); | 189 paint.setColor(kButtonBackgroundColor); |
| 184 canvas->DrawRoundRect(GetLocalBounds(), 2, paint); | 190 canvas->DrawRoundRect(GetLocalBounds(), 2, paint); |
| 185 views::View::OnPaint(canvas); | 191 views::View::OnPaint(canvas); |
| 186 } | 192 } |
| 187 | 193 |
| 188 gfx::Size ToastOverlayView::GetMinimumSize() const { | 194 gfx::Size ToastOverlayView::GetMinimumSize() const { |
| 189 return gfx::Size(kToastMinimumWidth, 0); | 195 return gfx::Size(kToastMinimumWidth, 0); |
| 190 } | 196 } |
| 191 | 197 |
| 192 gfx::Size ToastOverlayView::GetMaximumSize() const { | 198 gfx::Size ToastOverlayView::GetMaximumSize() const { |
| 193 gfx::Rect work_area_bounds = GetUserWorkAreaBounds(); | 199 gfx::Rect work_area_bounds = GetUserWorkAreaBounds(); |
| 194 return gfx::Size(kToastMaximumWidth, work_area_bounds.height() - kOffset * 2); | 200 return gfx::Size(kToastMaximumWidth, work_area_bounds.height() - kOffset * 2); |
| 195 } | 201 } |
| 196 | 202 |
| 197 void ToastOverlayView::ButtonPressed(views::Button* sender, | 203 void ToastOverlayView::ButtonPressed(views::Button* sender, |
| 198 const ui::Event& event) { | 204 const ui::Event& event) { |
| 205 DCHECK_EQ(button_, sender); |
| 199 overlay_->Show(false); | 206 overlay_->Show(false); |
| 200 } | 207 } |
| 201 | 208 |
| 202 /////////////////////////////////////////////////////////////////////////////// | 209 /////////////////////////////////////////////////////////////////////////////// |
| 203 // ToastOverlay | 210 // ToastOverlay |
| 204 ToastOverlay::ToastOverlay(Delegate* delegate, | 211 ToastOverlay::ToastOverlay(Delegate* delegate, |
| 205 const base::string16& text, | 212 const base::string16& text, |
| 206 const base::string16& dismiss_text) | 213 base::Optional<base::string16> dismiss_text) |
| 207 : delegate_(delegate), | 214 : delegate_(delegate), |
| 208 text_(text), | 215 text_(text), |
| 209 dismiss_text_(dismiss_text), | 216 dismiss_text_(dismiss_text), |
| 210 overlay_widget_(new views::Widget), | 217 overlay_widget_(new views::Widget), |
| 211 overlay_view_(new ToastOverlayView(this, text, dismiss_text)), | 218 overlay_view_(new ToastOverlayView(this, text, dismiss_text)), |
| 212 widget_size_(overlay_view_->GetPreferredSize()) { | 219 widget_size_(overlay_view_->GetPreferredSize()) { |
| 213 views::Widget::InitParams params; | 220 views::Widget::InitParams params; |
| 214 params.type = views::Widget::InitParams::TYPE_POPUP; | 221 params.type = views::Widget::InitParams::TYPE_POPUP; |
| 215 params.name = "ToastOverlay"; | 222 params.name = "ToastOverlay"; |
| 216 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 223 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 | 293 |
| 287 void ToastOverlay::OnImplicitAnimationsCompleted() { | 294 void ToastOverlay::OnImplicitAnimationsCompleted() { |
| 288 if (!overlay_widget_->GetLayer()->GetTargetVisibility()) | 295 if (!overlay_widget_->GetLayer()->GetTargetVisibility()) |
| 289 delegate_->OnClosed(); | 296 delegate_->OnClosed(); |
| 290 } | 297 } |
| 291 | 298 |
| 292 views::Widget* ToastOverlay::widget_for_testing() { | 299 views::Widget* ToastOverlay::widget_for_testing() { |
| 293 return overlay_widget_.get(); | 300 return overlay_widget_.get(); |
| 294 } | 301 } |
| 295 | 302 |
| 303 ToastOverlayButton* ToastOverlay::dismiss_button_for_testing() { |
| 304 return overlay_view_->button(); |
| 305 } |
| 306 |
| 296 void ToastOverlay::ClickDismissButtonForTesting(const ui::Event& event) { | 307 void ToastOverlay::ClickDismissButtonForTesting(const ui::Event& event) { |
| 308 DCHECK(overlay_view_->button()); |
| 297 overlay_view_->button()->NotifyClick(event); | 309 overlay_view_->button()->NotifyClick(event); |
| 298 } | 310 } |
| 299 | 311 |
| 300 } // namespace ash | 312 } // namespace ash |
| OLD | NEW |