DataSlotConnectionPin.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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 <QPainter>
  9. #include <Components/Slots/Data/DataSlotConnectionPin.h>
  10. #include <GraphCanvas/Components/Slots/SlotBus.h>
  11. #include <GraphCanvas/Components/StyleBus.h>
  12. #include <GraphCanvas/Components/Slots/Data/DataSlotBus.h>
  13. #include <GraphCanvas/Styling/definitions.h>
  14. #include <GraphCanvas/Utils/QtVectorMath.h>
  15. #include <GraphCanvas/Utils/QtDrawingUtils.h>
  16. namespace GraphCanvas
  17. {
  18. //////////////////////////
  19. // DataSlotConnectionPin
  20. //////////////////////////
  21. DataSlotConnectionPin::DataSlotConnectionPin(const AZ::EntityId& slotId)
  22. : SlotConnectionPin(slotId)
  23. , m_colorPalette(nullptr)
  24. {
  25. }
  26. DataSlotConnectionPin::~DataSlotConnectionPin()
  27. {
  28. }
  29. void DataSlotConnectionPin::OnRefreshStyle()
  30. {
  31. m_style.SetStyle(m_slotId, Styling::Elements::DataConnectionPin);
  32. size_t typeCount = 0;
  33. DataSlotRequestBus::EventResult(typeCount, GetEntityId(), &DataSlotRequests::GetContainedTypesCount);
  34. m_containerColorPalettes.clear();
  35. for (size_t i = 0; i < typeCount; ++i)
  36. {
  37. const Styling::StyleHelper* colorPalette = nullptr;
  38. DataSlotRequestBus::EventResult(colorPalette, GetEntityId(), &DataSlotRequests::GetContainedTypeColorPalette, i);
  39. if (colorPalette)
  40. {
  41. m_containerColorPalettes.emplace_back(colorPalette);
  42. }
  43. }
  44. DataSlotRequestBus::EventResult(m_colorPalette, GetEntityId(), &DataSlotRequests::GetDataColorPalette);
  45. update();
  46. }
  47. void DataSlotConnectionPin::DrawConnectionPin(QPainter *painter, QRectF drawRect, bool isConnected)
  48. {
  49. painter->save();
  50. DataSlotType dataType = DataSlotType::Unknown;
  51. DataSlotRequestBus::EventResult(dataType, GetEntityId(), &DataSlotRequests::GetDataSlotType);
  52. DataValueType valueType = DataValueType::Unknown;
  53. DataSlotRequestBus::EventResult(valueType, GetEntityId(), &DataSlotRequests::GetDataValueType);
  54. qreal radius = (AZ::GetMin(drawRect.width(), drawRect.height()) * 0.5) - m_style.GetBorder().width();
  55. QPen pen = m_style.GetBorder();
  56. QBrush brush = painter->brush();
  57. if (m_colorPalette)
  58. {
  59. pen.setColor(m_colorPalette->GetColor(Styling::Attribute::LineColor));
  60. brush.setColor(m_colorPalette->GetColor(Styling::Attribute::BackgroundColor));
  61. }
  62. else
  63. {
  64. brush.setColor(pen.color());
  65. }
  66. QRectF finalRect(drawRect.center().x() - radius, drawRect.center().y() - radius, radius * 2, radius * 2);
  67. QLinearGradient penGradient;
  68. QLinearGradient fillGradient;
  69. if (m_containerColorPalettes.size() > 0)
  70. {
  71. QtDrawingUtils::GenerateGradients(m_containerColorPalettes, finalRect, penGradient, fillGradient);
  72. penGradient.setColorAt(0, m_containerColorPalettes[0]->GetColor(Styling::Attribute::LineColor));
  73. fillGradient.setColorAt(0, m_containerColorPalettes[0]->GetColor(Styling::Attribute::BackgroundColor));
  74. double transition = 0.1 * (1.0 / m_containerColorPalettes.size());
  75. for (size_t i = 1; i < m_containerColorPalettes.size(); ++i)
  76. {
  77. double transitionStart = AZStd::max(0.0, (double)i / m_containerColorPalettes.size() - (transition * 0.5));
  78. double transitionEnd = AZStd::min(1.0, (double)i / m_containerColorPalettes.size() + (transition * 0.5));
  79. penGradient.setColorAt(transitionStart, m_containerColorPalettes[i - 1]->GetColor(Styling::Attribute::LineColor));
  80. penGradient.setColorAt(transitionEnd, m_containerColorPalettes[i]->GetColor(Styling::Attribute::LineColor));
  81. fillGradient.setColorAt(transitionStart, m_containerColorPalettes[i - 1]->GetColor(Styling::Attribute::BackgroundColor));
  82. fillGradient.setColorAt(transitionEnd, m_containerColorPalettes[i]->GetColor(Styling::Attribute::BackgroundColor));
  83. }
  84. penGradient.setColorAt(1, m_containerColorPalettes[m_containerColorPalettes.size() - 1]->GetColor(Styling::Attribute::LineColor));
  85. fillGradient.setColorAt(1, m_containerColorPalettes[m_containerColorPalettes.size() - 1]->GetColor(Styling::Attribute::BackgroundColor));
  86. pen.setBrush(penGradient);
  87. }
  88. // Add fill color for slots if it is connected
  89. if (m_containerColorPalettes.size() > 0)
  90. {
  91. brush = fillGradient;
  92. }
  93. else if (m_colorPalette)
  94. {
  95. brush.setColor(m_colorPalette->GetColor(Styling::Attribute::BackgroundColor));
  96. }
  97. else
  98. {
  99. brush.setColor(pen.color());
  100. }
  101. painter->setPen(pen);
  102. if (dataType == DataSlotType::Reference)
  103. {
  104. QRectF filledHalfRect = QRectF(drawRect.x(), drawRect.y(), drawRect.width() * 0.5, drawRect.height());
  105. QRectF unfilledHalfRect = filledHalfRect;
  106. unfilledHalfRect.moveLeft(drawRect.center().x());
  107. ConnectionType connectionType = CT_Invalid;
  108. SlotRequestBus::EventResult(connectionType, GetEntityId(), &SlotRequests::GetConnectionType);
  109. if (connectionType == CT_Output)
  110. {
  111. QRectF swapRect = filledHalfRect;
  112. filledHalfRect = unfilledHalfRect;
  113. unfilledHalfRect = swapRect;
  114. }
  115. // Draw the unfilled half
  116. painter->setClipRect(filledHalfRect);
  117. if (valueType == DataValueType::Container)
  118. {
  119. painter->drawRect(finalRect);
  120. }
  121. else
  122. {
  123. painter->drawEllipse(drawRect.center(), radius, radius);
  124. }
  125. painter->setClipRect(unfilledHalfRect);
  126. if (valueType == DataValueType::Container)
  127. {
  128. painter->fillRect(finalRect, brush);
  129. }
  130. else
  131. {
  132. painter->setBrush(brush);
  133. painter->drawEllipse(drawRect.center(), radius, radius);
  134. }
  135. }
  136. else if (dataType == DataSlotType::Value)
  137. {
  138. if (isConnected)
  139. {
  140. painter->setBrush(brush);
  141. }
  142. if (valueType == DataValueType::Primitive)
  143. {
  144. painter->drawEllipse(drawRect.center(), radius, radius);
  145. }
  146. else
  147. {
  148. painter->drawRect(finalRect);
  149. }
  150. }
  151. painter->restore();
  152. }
  153. }