wait_tree.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // SPDX-FileCopyrightText: 2016 Citra Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <cstddef>
  5. #include <memory>
  6. #include <vector>
  7. #include <QDockWidget>
  8. #include <QTreeView>
  9. #include "common/common_types.h"
  10. #include "core/hle/kernel/k_auto_object.h"
  11. #include "core/hle/kernel/svc_common.h"
  12. class EmuThread;
  13. namespace Core {
  14. class System;
  15. }
  16. namespace Kernel {
  17. class KHandleTable;
  18. class KReadableEvent;
  19. class KSynchronizationObject;
  20. class KThread;
  21. } // namespace Kernel
  22. class WaitTreeThread;
  23. class WaitTreeItem : public QObject {
  24. Q_OBJECT
  25. public:
  26. WaitTreeItem();
  27. ~WaitTreeItem() override;
  28. virtual bool IsExpandable() const;
  29. virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const;
  30. virtual QString GetText() const = 0;
  31. virtual QColor GetColor() const;
  32. void Expand();
  33. WaitTreeItem* Parent() const;
  34. const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const;
  35. std::size_t Row() const;
  36. static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(Core::System& system);
  37. private:
  38. std::size_t row;
  39. bool expanded = false;
  40. WaitTreeItem* parent = nullptr;
  41. std::vector<std::unique_ptr<WaitTreeItem>> children;
  42. };
  43. class WaitTreeText : public WaitTreeItem {
  44. Q_OBJECT
  45. public:
  46. explicit WaitTreeText(QString text);
  47. ~WaitTreeText() override;
  48. QString GetText() const override;
  49. private:
  50. QString text;
  51. };
  52. class WaitTreeExpandableItem : public WaitTreeItem {
  53. Q_OBJECT
  54. public:
  55. WaitTreeExpandableItem();
  56. ~WaitTreeExpandableItem() override;
  57. bool IsExpandable() const override;
  58. };
  59. class WaitTreeCallstack : public WaitTreeExpandableItem {
  60. Q_OBJECT
  61. public:
  62. explicit WaitTreeCallstack(const Kernel::KThread& thread_, Core::System& system_);
  63. ~WaitTreeCallstack() override;
  64. QString GetText() const override;
  65. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  66. private:
  67. const Kernel::KThread& thread;
  68. Core::System& system;
  69. };
  70. class WaitTreeSynchronizationObject : public WaitTreeExpandableItem {
  71. Q_OBJECT
  72. public:
  73. explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object_,
  74. Core::System& system_);
  75. ~WaitTreeSynchronizationObject() override;
  76. static std::unique_ptr<WaitTreeSynchronizationObject> make(
  77. const Kernel::KSynchronizationObject& object, Core::System& system);
  78. QString GetText() const override;
  79. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  80. protected:
  81. const Kernel::KSynchronizationObject& object;
  82. private:
  83. Core::System& system;
  84. };
  85. class WaitTreeThread : public WaitTreeSynchronizationObject {
  86. Q_OBJECT
  87. public:
  88. explicit WaitTreeThread(const Kernel::KThread& thread, Core::System& system_);
  89. ~WaitTreeThread() override;
  90. QString GetText() const override;
  91. QColor GetColor() const override;
  92. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  93. private:
  94. Core::System& system;
  95. };
  96. class WaitTreeEvent : public WaitTreeSynchronizationObject {
  97. Q_OBJECT
  98. public:
  99. explicit WaitTreeEvent(const Kernel::KReadableEvent& object_, Core::System& system_);
  100. ~WaitTreeEvent() override;
  101. };
  102. class WaitTreeThreadList : public WaitTreeExpandableItem {
  103. Q_OBJECT
  104. public:
  105. explicit WaitTreeThreadList(std::vector<Kernel::KThread*>&& list, Core::System& system_);
  106. ~WaitTreeThreadList() override;
  107. QString GetText() const override;
  108. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  109. private:
  110. std::vector<Kernel::KThread*> thread_list;
  111. Core::System& system;
  112. };
  113. class WaitTreeModel : public QAbstractItemModel {
  114. Q_OBJECT
  115. public:
  116. explicit WaitTreeModel(Core::System& system_, QObject* parent = nullptr);
  117. ~WaitTreeModel() override;
  118. QVariant data(const QModelIndex& index, int role) const override;
  119. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  120. QModelIndex parent(const QModelIndex& index) const override;
  121. int rowCount(const QModelIndex& parent) const override;
  122. int columnCount(const QModelIndex& parent) const override;
  123. void ClearItems();
  124. void InitItems();
  125. private:
  126. std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
  127. Core::System& system;
  128. };
  129. class WaitTreeWidget : public QDockWidget {
  130. Q_OBJECT
  131. public:
  132. explicit WaitTreeWidget(Core::System& system_, QWidget* parent = nullptr);
  133. ~WaitTreeWidget() override;
  134. public slots:
  135. void OnDebugModeEntered();
  136. void OnDebugModeLeft();
  137. void OnEmulationStarting(EmuThread* emu_thread);
  138. void OnEmulationStopping();
  139. private:
  140. QTreeView* view;
  141. WaitTreeModel* model;
  142. Core::System& system;
  143. };