| |
| |
|
|
| #pragma once |
|
|
| #include <cstddef> |
| #include <memory> |
| #include <vector> |
|
|
| #include <QDockWidget> |
| #include <QTreeView> |
|
|
| #include "common/common_types.h" |
| #include "core/hle/kernel/k_auto_object.h" |
| #include "core/hle/kernel/svc_common.h" |
|
|
| class EmuThread; |
|
|
| namespace Core { |
| class System; |
| } |
|
|
| namespace Kernel { |
| class KHandleTable; |
| class KReadableEvent; |
| class KSynchronizationObject; |
| class KThread; |
| } |
|
|
| class WaitTreeThread; |
|
|
| class WaitTreeItem : public QObject { |
| Q_OBJECT |
| public: |
| WaitTreeItem(); |
| ~WaitTreeItem() override; |
|
|
| virtual bool IsExpandable() const; |
| virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const; |
| virtual QString GetText() const = 0; |
| virtual QColor GetColor() const; |
|
|
| void Expand(); |
| WaitTreeItem* Parent() const; |
| const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const; |
| std::size_t Row() const; |
| static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(Core::System& system); |
|
|
| private: |
| std::size_t row; |
| bool expanded = false; |
| WaitTreeItem* parent = nullptr; |
| std::vector<std::unique_ptr<WaitTreeItem>> children; |
| }; |
|
|
| class WaitTreeText : public WaitTreeItem { |
| Q_OBJECT |
| public: |
| explicit WaitTreeText(QString text); |
| ~WaitTreeText() override; |
|
|
| QString GetText() const override; |
|
|
| private: |
| QString text; |
| }; |
|
|
| class WaitTreeExpandableItem : public WaitTreeItem { |
| Q_OBJECT |
| public: |
| WaitTreeExpandableItem(); |
| ~WaitTreeExpandableItem() override; |
|
|
| bool IsExpandable() const override; |
| }; |
|
|
| class WaitTreeCallstack : public WaitTreeExpandableItem { |
| Q_OBJECT |
| public: |
| explicit WaitTreeCallstack(const Kernel::KThread& thread_, Core::System& system_); |
| ~WaitTreeCallstack() override; |
|
|
| QString GetText() const override; |
| std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
|
|
| private: |
| const Kernel::KThread& thread; |
|
|
| Core::System& system; |
| }; |
|
|
| class WaitTreeSynchronizationObject : public WaitTreeExpandableItem { |
| Q_OBJECT |
| public: |
| explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object_, |
| Core::System& system_); |
| ~WaitTreeSynchronizationObject() override; |
|
|
| static std::unique_ptr<WaitTreeSynchronizationObject> make( |
| const Kernel::KSynchronizationObject& object, Core::System& system); |
| QString GetText() const override; |
| std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
|
|
| protected: |
| const Kernel::KSynchronizationObject& object; |
|
|
| private: |
| Core::System& system; |
| }; |
|
|
| class WaitTreeThread : public WaitTreeSynchronizationObject { |
| Q_OBJECT |
| public: |
| explicit WaitTreeThread(const Kernel::KThread& thread, Core::System& system_); |
| ~WaitTreeThread() override; |
|
|
| QString GetText() const override; |
| QColor GetColor() const override; |
| std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
|
|
| private: |
| Core::System& system; |
| }; |
|
|
| class WaitTreeEvent : public WaitTreeSynchronizationObject { |
| Q_OBJECT |
| public: |
| explicit WaitTreeEvent(const Kernel::KReadableEvent& object_, Core::System& system_); |
| ~WaitTreeEvent() override; |
| }; |
|
|
| class WaitTreeThreadList : public WaitTreeExpandableItem { |
| Q_OBJECT |
| public: |
| explicit WaitTreeThreadList(std::vector<Kernel::KThread*>&& list, Core::System& system_); |
| ~WaitTreeThreadList() override; |
|
|
| QString GetText() const override; |
| std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
|
|
| private: |
| std::vector<Kernel::KThread*> thread_list; |
|
|
| Core::System& system; |
| }; |
|
|
| class WaitTreeModel : public QAbstractItemModel { |
| Q_OBJECT |
|
|
| public: |
| explicit WaitTreeModel(Core::System& system_, QObject* parent = nullptr); |
| ~WaitTreeModel() override; |
|
|
| QVariant data(const QModelIndex& index, int role) const override; |
| QModelIndex index(int row, int column, const QModelIndex& parent) const override; |
| QModelIndex parent(const QModelIndex& index) const override; |
| int rowCount(const QModelIndex& parent) const override; |
| int columnCount(const QModelIndex& parent) const override; |
|
|
| void ClearItems(); |
| void InitItems(); |
|
|
| private: |
| std::vector<std::unique_ptr<WaitTreeThread>> thread_items; |
|
|
| Core::System& system; |
| }; |
|
|
| class WaitTreeWidget : public QDockWidget { |
| Q_OBJECT |
|
|
| public: |
| explicit WaitTreeWidget(Core::System& system_, QWidget* parent = nullptr); |
| ~WaitTreeWidget() override; |
|
|
| public slots: |
| void OnDebugModeEntered(); |
| void OnDebugModeLeft(); |
|
|
| void OnEmulationStarting(EmuThread* emu_thread); |
| void OnEmulationStopping(); |
|
|
| private: |
| QTreeView* view; |
| WaitTreeModel* model; |
|
|
| Core::System& system; |
| }; |
|
|