| | |
| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <span> |
| | #include <QAbstractItemModel> |
| | #include <QDockWidget> |
| | #include <QTreeView> |
| | #include <boost/container/flat_set.hpp> |
| | #include "core/core.h" |
| | #include "core/hle/kernel/object.h" |
| |
|
| | class EmuThread; |
| |
|
| | namespace Kernel { |
| | class WaitObject; |
| | class Event; |
| | class Mutex; |
| | class Semaphore; |
| | class Thread; |
| | class Timer; |
| | } |
| |
|
| | namespace Core { |
| | class System; |
| | } |
| |
|
| | class WaitTreeThread; |
| |
|
| | class WaitTreeItem : public QObject { |
| | Q_OBJECT |
| | public: |
| | ~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; |
| | std::span<const 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: |
| | bool IsExpandable() const override; |
| | }; |
| |
|
| | class WaitTreeWaitObject : public WaitTreeExpandableItem { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeWaitObject(const Kernel::WaitObject& object); |
| | static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object); |
| | QString GetText() const override; |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| |
|
| | protected: |
| | const Kernel::WaitObject& object; |
| |
|
| | static QString GetResetTypeQString(Kernel::ResetType reset_type); |
| | }; |
| |
|
| | class WaitTreeObjectList : public WaitTreeExpandableItem { |
| | Q_OBJECT |
| | public: |
| | WaitTreeObjectList(const std::vector<std::shared_ptr<Kernel::WaitObject>>& list, bool wait_all); |
| | QString GetText() const override; |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| |
|
| | private: |
| | const std::vector<std::shared_ptr<Kernel::WaitObject>>& object_list; |
| | bool wait_all; |
| | }; |
| |
|
| | class WaitTreeThread : public WaitTreeWaitObject { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeThread(const Kernel::Thread& thread); |
| | QString GetText() const override; |
| | QColor GetColor() const override; |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| | }; |
| |
|
| | class WaitTreeEvent : public WaitTreeWaitObject { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeEvent(const Kernel::Event& object); |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| | }; |
| |
|
| | class WaitTreeMutex : public WaitTreeWaitObject { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeMutex(const Kernel::Mutex& object); |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| | }; |
| |
|
| | class WaitTreeSemaphore : public WaitTreeWaitObject { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeSemaphore(const Kernel::Semaphore& object); |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| | }; |
| |
|
| | class WaitTreeTimer : public WaitTreeWaitObject { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeTimer(const Kernel::Timer& object); |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| | }; |
| |
|
| | class WaitTreeMutexList : public WaitTreeExpandableItem { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeMutexList( |
| | const boost::container::flat_set<std::shared_ptr<Kernel::Mutex>>& list); |
| |
|
| | QString GetText() const override; |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| |
|
| | private: |
| | const boost::container::flat_set<std::shared_ptr<Kernel::Mutex>>& mutex_list; |
| | }; |
| |
|
| | class WaitTreeThreadList : public WaitTreeExpandableItem { |
| | Q_OBJECT |
| | public: |
| | explicit WaitTreeThreadList(const std::vector<std::shared_ptr<Kernel::Thread>>& list); |
| | QString GetText() const override; |
| | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; |
| |
|
| | private: |
| | const std::vector<std::shared_ptr<Kernel::Thread>>& thread_list; |
| | }; |
| |
|
| | class WaitTreeModel : public QAbstractItemModel { |
| | Q_OBJECT |
| |
|
| | public: |
| | explicit WaitTreeModel(QObject* parent = nullptr); |
| |
|
| | 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(Core::System& system); |
| |
|
| | private: |
| | std::vector<std::unique_ptr<WaitTreeThread>> thread_items; |
| | }; |
| |
|
| | class WaitTreeWidget : public QDockWidget { |
| | Q_OBJECT |
| |
|
| | public: |
| | explicit WaitTreeWidget(Core::System& system, QWidget* parent = nullptr); |
| |
|
| | public slots: |
| | void OnDebugModeEntered(); |
| | void OnDebugModeLeft(); |
| |
|
| | void OnEmulationStarting(EmuThread* emu_thread); |
| | void OnEmulationStopping(); |
| |
|
| | private: |
| | QTreeView* view; |
| | WaitTreeModel* model; |
| | Core::System& system; |
| | }; |
| |
|