ViewportUiClusterTests.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/std/smart_ptr/make_shared.h>
  9. #include <AzFramework/Viewport/ViewportScreen.h>
  10. #include <AzTest/AzTest.h>
  11. #include <AzToolsFramework/ViewportUi/ButtonGroup.h>
  12. #include <AzToolsFramework/ViewportUi/ViewportUiCluster.h>
  13. #include <QAction>
  14. #include <QApplication>
  15. #include <QKeyEvent>
  16. #include <QWidget>
  17. namespace UnitTest
  18. {
  19. using ViewportUiCluster = AzToolsFramework::ViewportUi::Internal::ViewportUiCluster;
  20. using ButtonGroup = AzToolsFramework::ViewportUi::Internal::ButtonGroup;
  21. using Button = AzToolsFramework::ViewportUi::Internal::Button;
  22. using ButtonId = AzToolsFramework::ViewportUi::ButtonId;
  23. TEST(ViewportUiCluster, RegisterButtonIncreasesClusterHeight)
  24. {
  25. auto buttonGroup = AZStd::make_shared<ButtonGroup>();
  26. ViewportUiCluster viewportUiCluster(buttonGroup);
  27. viewportUiCluster.resize(viewportUiCluster.minimumSizeHint());
  28. // need to initialize cluster with a single button or size will be invalid
  29. viewportUiCluster.RegisterButton(AZStd::make_unique<Button>("", ButtonId(1)).get());
  30. QSize initialSize = viewportUiCluster.size();
  31. // add a second button to increase the size
  32. viewportUiCluster.RegisterButton(AZStd::make_unique<Button>("", ButtonId(2)).get());
  33. QSize finalSize = viewportUiCluster.size();
  34. bool sizeIncrease = initialSize.width() == finalSize.width() && initialSize.height() < finalSize.height();
  35. EXPECT_TRUE(sizeIncrease);
  36. }
  37. TEST(ViewportUiCluster, RemoveClusterButtonDecreasesClusterHeight)
  38. {
  39. auto buttonGroup = AZStd::make_shared<ButtonGroup>();
  40. ViewportUiCluster viewportUiCluster(buttonGroup);
  41. viewportUiCluster.resize(viewportUiCluster.minimumSizeHint());
  42. // need to initialize cluster with a single button or size will be invalid
  43. viewportUiCluster.RegisterButton(AZStd::make_unique<Button>("", ButtonId(1)).get());
  44. // add a second button to increase the size
  45. viewportUiCluster.RegisterButton(AZStd::make_unique<Button>("", ButtonId(2)).get());
  46. QSize initialSize = viewportUiCluster.size();
  47. // remove the second button
  48. viewportUiCluster.RemoveButton(ButtonId(1));
  49. QSize finalSize = viewportUiCluster.size();
  50. bool sizeDecrease = initialSize.width() == finalSize.width() && initialSize.height() > finalSize.height();
  51. EXPECT_TRUE(sizeDecrease);
  52. }
  53. TEST(ViewportUiCluster, UpdateChangesActiveButton)
  54. {
  55. auto buttonGroup = AZStd::make_shared<ButtonGroup>();
  56. ViewportUiCluster viewportUiCluster(buttonGroup);
  57. // register a button to the cluster
  58. auto button = AZStd::make_unique<Button>("", ButtonId(1));
  59. viewportUiCluster.RegisterButton(button.get());
  60. // get the action corresponding to the button
  61. auto widgetCallbacks = viewportUiCluster.GetWidgetCallbacks();
  62. auto action = static_cast<QAction*>(widgetCallbacks.GetWidgets()[0].data());
  63. // verify action is not checked by default
  64. EXPECT_FALSE(action->isChecked());
  65. // set the button to selected and update the ViewportUiCluster to sync
  66. button->m_state = AzToolsFramework::ViewportUi::Internal::Button::State::Selected;
  67. viewportUiCluster.Update();
  68. EXPECT_TRUE(action->isChecked());
  69. }
  70. TEST(ViewportUiCluster, TriggeringActionTriggersClusterEventForButton)
  71. {
  72. auto buttonGroup = AZStd::make_shared<ButtonGroup>();
  73. ViewportUiCluster viewportUiCluster(buttonGroup);
  74. // create a handler which will be triggered by the button
  75. bool handlerTriggered = false;
  76. auto testButtonId = ButtonId(1);
  77. AZ::Event<ButtonId>::Handler handler(
  78. [&handlerTriggered, testButtonId](ButtonId buttonId)
  79. {
  80. if (buttonId == testButtonId)
  81. {
  82. handlerTriggered = true;
  83. }
  84. });
  85. buttonGroup->ConnectEventHandler(handler);
  86. // register the button
  87. auto button = AZStd::make_unique<Button>("", testButtonId);
  88. viewportUiCluster.RegisterButton(button.get());
  89. // trigger the action, which should activate the handler
  90. auto widgetCallbacks = viewportUiCluster.GetWidgetCallbacks();
  91. auto action = static_cast<QAction*>(widgetCallbacks.GetWidgets()[0].data());
  92. action->trigger();
  93. EXPECT_TRUE(handlerTriggered);
  94. }
  95. } // namespace UnitTest