test_child_modal_parent.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/wm/test_child_modal_parent.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "ui/aura/window.h"
  9. #include "ui/views/background.h"
  10. #include "ui/views/controls/button/md_text_button.h"
  11. #include "ui/views/controls/native/native_view_host.h"
  12. #include "ui/views/controls/textfield/textfield.h"
  13. #include "ui/views/widget/widget.h"
  14. #include "ui/views/widget/widget_delegate.h"
  15. #include "ui/wm/core/window_modality_controller.h"
  16. #include "ui/wm/core/window_util.h"
  17. using views::Widget;
  18. namespace ash {
  19. namespace {
  20. // Parent window layout.
  21. const int kWindowLeft = 170;
  22. const int kWindowTop = 200;
  23. const int kWindowWidth = 400;
  24. const int kWindowHeight = 400;
  25. const int kButtonHeight = 35;
  26. // Child window size.
  27. const int kChildWindowWidth = 330;
  28. const int kChildWindowHeight = 200;
  29. // Child window layout.
  30. const int kTextfieldLeft = 10;
  31. const int kTextfieldTop = 20;
  32. const int kTextfieldWidth = 300;
  33. const int kTextfieldHeight = 35;
  34. const SkColor kModalParentColor = SK_ColorBLUE;
  35. const SkColor kChildColor = SK_ColorWHITE;
  36. views::WidgetDelegateView* CreateChildModalWindow() {
  37. auto child = std::make_unique<views::WidgetDelegateView>();
  38. child->SetModalType(ui::MODAL_TYPE_CHILD);
  39. child->SetTitle(u"Examples: Child Modal Window");
  40. child->SetBackground(views::CreateSolidBackground(kChildColor));
  41. child->SetPreferredSize(gfx::Size(kChildWindowWidth, kChildWindowHeight));
  42. auto textfield = std::make_unique<views::Textfield>();
  43. textfield->SetBounds(kTextfieldLeft, kTextfieldTop, kTextfieldWidth,
  44. kTextfieldHeight);
  45. textfield->SetPlaceholderText(u"modal child window");
  46. child->AddChildView(std::move(textfield));
  47. return child.release();
  48. }
  49. } // namespace
  50. // static
  51. TestChildModalParent* TestChildModalParent::Show(aura::Window* context) {
  52. auto* test_child_modal_parent = new TestChildModalParent(context);
  53. views::Widget* widget = new views::Widget;
  54. views::Widget::InitParams params;
  55. params.delegate = test_child_modal_parent;
  56. params.context = context;
  57. params.bounds =
  58. gfx::Rect(kWindowLeft, kWindowTop, kWindowWidth, kWindowHeight);
  59. widget->Init(std::move(params));
  60. widget->Show();
  61. return test_child_modal_parent;
  62. }
  63. TestChildModalParent::TestChildModalParent(aura::Window* context)
  64. : modal_parent_(std::make_unique<Widget>()),
  65. textfield_(new views::Textfield),
  66. host_(new views::NativeViewHost) {
  67. SetTitle(u"Examples: Child Modal Parent");
  68. textfield_->SetPlaceholderText(u"top level window");
  69. Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
  70. params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
  71. params.context = context;
  72. modal_parent_->Init(std::move(params));
  73. modal_parent_->GetRootView()->SetBackground(
  74. views::CreateSolidBackground(kModalParentColor));
  75. auto* modal_parent_textfield = new views::Textfield;
  76. modal_parent_->GetRootView()->AddChildView(modal_parent_textfield);
  77. modal_parent_textfield->SetBounds(kTextfieldLeft, kTextfieldTop,
  78. kTextfieldWidth, kTextfieldHeight);
  79. modal_parent_textfield->SetPlaceholderText(u"modal parent window");
  80. modal_parent_->GetNativeView()->SetName("ModalParent");
  81. auto button = std::make_unique<views::MdTextButton>(
  82. base::BindRepeating(&TestChildModalParent::ButtonPressed,
  83. base::Unretained(this)),
  84. u"Show/Hide Child Modal Window");
  85. button_ = AddChildView(std::move(button));
  86. AddChildView(textfield_);
  87. AddChildView(host_);
  88. }
  89. TestChildModalParent::~TestChildModalParent() = default;
  90. aura::Window* TestChildModalParent::GetModalParent() const {
  91. return modal_parent_->GetNativeView();
  92. }
  93. aura::Window* TestChildModalParent::ShowModalChild() {
  94. DCHECK(!modal_child_);
  95. modal_child_ = Widget::CreateWindowWithParent(CreateChildModalWindow(),
  96. GetWidget()->GetNativeView());
  97. wm::SetModalParent(modal_child_->GetNativeView(),
  98. modal_parent_->GetNativeView());
  99. modal_child_->AddObserver(this);
  100. modal_child_->GetNativeView()->SetName("ChildModalWindow");
  101. modal_child_->Show();
  102. return modal_child_->GetNativeView();
  103. }
  104. void TestChildModalParent::Layout() {
  105. int running_y = y();
  106. button_->SetBounds(x(), running_y, width(), kButtonHeight);
  107. running_y += kButtonHeight;
  108. textfield_->SetBounds(x(), running_y, width(), kTextfieldHeight);
  109. running_y += kTextfieldHeight;
  110. host_->SetBounds(x(), running_y, width(), height() - running_y);
  111. }
  112. void TestChildModalParent::AddedToWidget() {
  113. // The function requires a Widget be present.
  114. DCHECK(GetWidget());
  115. host_->Attach(modal_parent_->GetNativeView());
  116. GetWidget()->GetNativeView()->SetName("Parent");
  117. }
  118. void TestChildModalParent::OnWidgetDestroying(Widget* widget) {
  119. DCHECK_EQ(modal_child_, widget);
  120. modal_child_ = nullptr;
  121. }
  122. void TestChildModalParent::ButtonPressed() {
  123. if (modal_child_)
  124. modal_child_->Close();
  125. else
  126. ShowModalChild();
  127. }
  128. } // namespace ash