wait_tree.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <boost/container/flat_set.hpp>
  6. #include <QAbstractItemModel>
  7. #include <QDockWidget>
  8. #include <QTreeView>
  9. #include "core/core.h"
  10. #include "core/hle/kernel/kernel.h"
  11. class EmuThread;
  12. namespace Kernel {
  13. class WaitObject;
  14. class Event;
  15. class Mutex;
  16. class Semaphore;
  17. class Session;
  18. class Thread;
  19. class Timer;
  20. }
  21. class WaitTreeThread;
  22. class WaitTreeItem : public QObject {
  23. Q_OBJECT
  24. public:
  25. virtual bool IsExpandable() const;
  26. virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const;
  27. virtual QString GetText() const = 0;
  28. virtual QColor GetColor() const;
  29. virtual ~WaitTreeItem();
  30. void Expand();
  31. WaitTreeItem* Parent() const;
  32. const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const;
  33. std::size_t Row() const;
  34. static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList();
  35. private:
  36. std::size_t row;
  37. bool expanded = false;
  38. WaitTreeItem* parent = nullptr;
  39. std::vector<std::unique_ptr<WaitTreeItem>> children;
  40. };
  41. class WaitTreeText : public WaitTreeItem {
  42. Q_OBJECT
  43. public:
  44. WaitTreeText(const QString& text);
  45. QString GetText() const override;
  46. private:
  47. QString text;
  48. };
  49. class WaitTreeExpandableItem : public WaitTreeItem {
  50. Q_OBJECT
  51. public:
  52. bool IsExpandable() const override;
  53. };
  54. class WaitTreeWaitObject : public WaitTreeExpandableItem {
  55. Q_OBJECT
  56. public:
  57. WaitTreeWaitObject(const Kernel::WaitObject& object);
  58. static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object);
  59. QString GetText() const override;
  60. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  61. protected:
  62. const Kernel::WaitObject& object;
  63. static QString GetResetTypeQString(Kernel::ResetType reset_type);
  64. };
  65. class WaitTreeObjectList : public WaitTreeExpandableItem {
  66. Q_OBJECT
  67. public:
  68. WaitTreeObjectList(const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list,
  69. bool wait_all);
  70. QString GetText() const override;
  71. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  72. private:
  73. const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& object_list;
  74. bool wait_all;
  75. };
  76. class WaitTreeThread : public WaitTreeWaitObject {
  77. Q_OBJECT
  78. public:
  79. WaitTreeThread(const Kernel::Thread& thread);
  80. QString GetText() const override;
  81. QColor GetColor() const override;
  82. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  83. };
  84. class WaitTreeEvent : public WaitTreeWaitObject {
  85. Q_OBJECT
  86. public:
  87. WaitTreeEvent(const Kernel::Event& object);
  88. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  89. };
  90. class WaitTreeMutex : public WaitTreeWaitObject {
  91. Q_OBJECT
  92. public:
  93. WaitTreeMutex(const Kernel::Mutex& object);
  94. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  95. };
  96. class WaitTreeSemaphore : public WaitTreeWaitObject {
  97. Q_OBJECT
  98. public:
  99. WaitTreeSemaphore(const Kernel::Semaphore& object);
  100. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  101. };
  102. class WaitTreeTimer : public WaitTreeWaitObject {
  103. Q_OBJECT
  104. public:
  105. WaitTreeTimer(const Kernel::Timer& object);
  106. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  107. };
  108. class WaitTreeMutexList : public WaitTreeExpandableItem {
  109. Q_OBJECT
  110. public:
  111. WaitTreeMutexList(const boost::container::flat_set<Kernel::SharedPtr<Kernel::Mutex>>& list);
  112. QString GetText() const override;
  113. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  114. private:
  115. const boost::container::flat_set<Kernel::SharedPtr<Kernel::Mutex>>& mutex_list;
  116. };
  117. class WaitTreeThreadList : public WaitTreeExpandableItem {
  118. Q_OBJECT
  119. public:
  120. WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list);
  121. QString GetText() const override;
  122. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  123. private:
  124. const std::vector<Kernel::SharedPtr<Kernel::Thread>>& thread_list;
  125. };
  126. class WaitTreeModel : public QAbstractItemModel {
  127. Q_OBJECT
  128. public:
  129. WaitTreeModel(QObject* parent = nullptr);
  130. QVariant data(const QModelIndex& index, int role) const override;
  131. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  132. QModelIndex parent(const QModelIndex& index) const override;
  133. int rowCount(const QModelIndex& parent) const override;
  134. int columnCount(const QModelIndex& parent) const override;
  135. void ClearItems();
  136. void InitItems();
  137. private:
  138. std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
  139. };
  140. class WaitTreeWidget : public QDockWidget {
  141. Q_OBJECT
  142. public:
  143. WaitTreeWidget(QWidget* parent = nullptr);
  144. public slots:
  145. void OnDebugModeEntered();
  146. void OnDebugModeLeft();
  147. void OnEmulationStarting(EmuThread* emu_thread);
  148. void OnEmulationStopping();
  149. private:
  150. QTreeView* view;
  151. WaitTreeModel* model;
  152. };