BuilderInfoMetricsModel.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 <ui/BuilderInfoMetricsModel.h>
  9. #include <ui/BuilderDataItem.h>
  10. #include <ui/BuilderData.h>
  11. #include <AssetBuilderSDK/AssetBuilderSDK.h>
  12. #include <QTime>
  13. namespace AssetProcessor
  14. {
  15. QString DurationToQString(AZ::s64 durationInMs)
  16. {
  17. const AZ::s64 dayInMs = 86400000;
  18. if (durationInMs < 0)
  19. {
  20. return QString();
  21. }
  22. AZ::s64 dayCount = durationInMs / dayInMs;
  23. QTime duration = QTime::fromMSecsSinceStartOfDay(durationInMs % dayInMs);
  24. if (dayCount > 0)
  25. {
  26. return duration.toString("zzz' ms, 'ss' sec, 'mm' min, 'hh' hr, %1 day'").arg(dayCount);
  27. }
  28. if (duration.isValid())
  29. {
  30. if (duration.hour() > 0)
  31. {
  32. return duration.toString("zzz' ms, 'ss' sec, 'mm' min, 'hh' hr'");
  33. }
  34. if (duration.minute() > 0)
  35. {
  36. return duration.toString("zzz' ms, 'ss' sec, 'mm' min'");
  37. }
  38. if (duration.second() > 0)
  39. {
  40. return duration.toString("zzz' ms, 'ss' sec'");
  41. }
  42. return duration.toString("zzz' ms'");
  43. }
  44. return QString();
  45. }
  46. BuilderInfoMetricsModel::BuilderInfoMetricsModel(BuilderData* builderData, QObject* parent)
  47. : QAbstractItemModel(parent)
  48. , m_data(builderData)
  49. {
  50. }
  51. void BuilderInfoMetricsModel::Reset()
  52. {
  53. beginResetModel();
  54. m_data->Reset();
  55. endResetModel();
  56. }
  57. QModelIndex BuilderInfoMetricsModel::index(int row, int column, const QModelIndex& parent) const
  58. {
  59. if (!hasIndex(row, column, parent))
  60. {
  61. return QModelIndex();
  62. }
  63. BuilderDataItem* const parentItem =
  64. parent.isValid() ? static_cast<BuilderDataItem*>(parent.internalPointer()) : m_data->m_root.get();
  65. if (parentItem)
  66. {
  67. AZStd::shared_ptr<BuilderDataItem> childItem = parentItem->GetChild(row);
  68. if (childItem)
  69. {
  70. QModelIndex index = createIndex(row, column, childItem.get());
  71. Q_ASSERT(checkIndex(index));
  72. return index;
  73. }
  74. }
  75. return QModelIndex();
  76. }
  77. int BuilderInfoMetricsModel::rowCount(const QModelIndex& parent) const
  78. {
  79. BuilderDataItem* const parentItem =
  80. parent.isValid() ? static_cast<BuilderDataItem*>(parent.internalPointer()) : m_data->m_root.get();
  81. if (!parentItem || parent.column() > 0)
  82. {
  83. return 0;
  84. }
  85. return parentItem->ChildCount();
  86. }
  87. int BuilderInfoMetricsModel::columnCount([[maybe_unused]] const QModelIndex& parent) const
  88. {
  89. return aznumeric_cast<int>(Column::Max);
  90. }
  91. QVariant BuilderInfoMetricsModel::data(const QModelIndex& index, int role) const
  92. {
  93. if (!index.isValid())
  94. {
  95. return QVariant();
  96. }
  97. BuilderDataItem* item = static_cast<BuilderDataItem*>(index.internalPointer());
  98. switch (role)
  99. {
  100. case aznumeric_cast<int>(Role::SortRole):
  101. switch (index.column())
  102. {
  103. case aznumeric_cast<int>(Column::AverageDuration):
  104. if (item->GetJobCount() == 0)
  105. {
  106. return QVariant();
  107. }
  108. return item->GetTotalDuration() / item->GetJobCount();
  109. case aznumeric_cast<int>(Column::TotalDuration):
  110. return item->GetTotalDuration();
  111. // Other columns are sorted by Qt::DisplayRole immediately below
  112. }
  113. case Qt::DisplayRole:
  114. switch (index.column())
  115. {
  116. case aznumeric_cast<int>(Column::Name):
  117. return item->GetName().c_str();
  118. case aznumeric_cast<int>(Column::JobCount):
  119. return item->GetJobCount();
  120. case aznumeric_cast<int>(Column::AverageDuration):
  121. if (item->GetJobCount() == 0)
  122. {
  123. return QVariant();
  124. }
  125. return DurationToQString(item->GetTotalDuration() / item->GetJobCount());
  126. case aznumeric_cast<int>(Column::TotalDuration):
  127. return DurationToQString(item->GetTotalDuration());
  128. default:
  129. break;
  130. }
  131. default:
  132. break;
  133. }
  134. return QVariant();
  135. }
  136. QVariant BuilderInfoMetricsModel::headerData(int section, Qt::Orientation orientation, int role) const
  137. {
  138. if (orientation != Qt::Horizontal || role != Qt::DisplayRole || section < 0 || section >= aznumeric_cast<int>(Column::Max))
  139. {
  140. return QVariant();
  141. }
  142. switch (section)
  143. {
  144. case aznumeric_cast<int>(Column::Name):
  145. return tr("Name");
  146. case aznumeric_cast<int>(Column::JobCount):
  147. return tr("Job Count");
  148. case aznumeric_cast<int>(Column::AverageDuration):
  149. return tr("Average Duration");
  150. case aznumeric_cast<int>(Column::TotalDuration):
  151. return tr("Total Duration");
  152. default:
  153. AZ_Warning("Asset Processor", false, "Unhandled BuilderInfoMetricsModel header %d", section);
  154. break;
  155. }
  156. return QVariant();
  157. }
  158. QModelIndex BuilderInfoMetricsModel::parent(const QModelIndex& index) const
  159. {
  160. if (!index.isValid())
  161. {
  162. return QModelIndex();
  163. }
  164. auto currentItem = static_cast<BuilderDataItem*>(index.internalPointer());
  165. auto parentItem = currentItem->GetParent();
  166. auto rootItem = m_data->m_root;
  167. if (parentItem.expired())
  168. {
  169. return QModelIndex();
  170. }
  171. auto sharedParentItem = parentItem.lock();
  172. if (sharedParentItem == rootItem || sharedParentItem == nullptr)
  173. {
  174. return QModelIndex();
  175. }
  176. int rowNum = sharedParentItem->GetRow();
  177. if (rowNum < 0)
  178. {
  179. return QModelIndex();
  180. }
  181. QModelIndex parentIndex = createIndex(rowNum, 0, sharedParentItem.get());
  182. Q_ASSERT(checkIndex(parentIndex));
  183. return parentIndex;
  184. }
  185. void BuilderInfoMetricsModel::OnDurationChanged(BuilderDataItem* item)
  186. {
  187. while (item)
  188. {
  189. const int rowNum = item->GetRow();
  190. if (rowNum < 0)
  191. {
  192. return;
  193. }
  194. dataChanged(
  195. createIndex(rowNum, aznumeric_cast<int>(Column::JobCount), item),
  196. createIndex(rowNum, aznumeric_cast<int>(Column::AverageDuration), item));
  197. item = item->GetParent().expired() ? nullptr : item->GetParent().lock().get();
  198. }
  199. }
  200. BuilderInfoMetricsSortModel::BuilderInfoMetricsSortModel(QObject* parent)
  201. : QSortFilterProxyModel(parent)
  202. {
  203. }
  204. }