forked from eden-emu/eden
		
	
		
			
	
	
		
			187 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | // Copyright 2016 Citra Emulator Project
 | ||
|  | // Licensed under GPLv2 or any later version
 | ||
|  | // Refer to the license.txt file included.
 | ||
|  | 
 | ||
|  | #include <boost/container/flat_set.hpp>
 | ||
|  | 
 | ||
|  | #include <QAbstractItemModel>
 | ||
|  | #include <QDockWidget>
 | ||
|  | #include <QTreeView>
 | ||
|  | 
 | ||
|  | #include "core/core.h"
 | ||
|  | #include "core/hle/kernel/kernel.h"
 | ||
|  | 
 | ||
|  | class EmuThread; | ||
|  | 
 | ||
|  | namespace Kernel { | ||
|  | class WaitObject; | ||
|  | class Event; | ||
|  | class Mutex; | ||
|  | class Semaphore; | ||
|  | class Session; | ||
|  | class Thread; | ||
|  | class Timer; | ||
|  | } | ||
|  | 
 | ||
|  | class WaitTreeThread; | ||
|  | 
 | ||
|  | class WaitTreeItem : public QObject { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     virtual bool IsExpandable() const; | ||
|  |     virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const; | ||
|  |     virtual QString GetText() const = 0; | ||
|  |     virtual QColor GetColor() const; | ||
|  |     virtual ~WaitTreeItem(); | ||
|  |     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(); | ||
|  | 
 | ||
|  | 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: | ||
|  |     WaitTreeText(const QString& text); | ||
|  |     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: | ||
|  |     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<Kernel::SharedPtr<Kernel::WaitObject>>& list, | ||
|  |                        bool wait_all); | ||
|  |     QString GetText() const override; | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | 
 | ||
|  | private: | ||
|  |     const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& object_list; | ||
|  |     bool wait_all; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeThread : public WaitTreeWaitObject { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     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: | ||
|  |     WaitTreeEvent(const Kernel::Event& object); | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeMutex : public WaitTreeWaitObject { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     WaitTreeMutex(const Kernel::Mutex& object); | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeSemaphore : public WaitTreeWaitObject { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     WaitTreeSemaphore(const Kernel::Semaphore& object); | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeTimer : public WaitTreeWaitObject { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     WaitTreeTimer(const Kernel::Timer& object); | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeMutexList : public WaitTreeExpandableItem { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     WaitTreeMutexList(const boost::container::flat_set<Kernel::SharedPtr<Kernel::Mutex>>& list); | ||
|  |     QString GetText() const override; | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | 
 | ||
|  | private: | ||
|  |     const boost::container::flat_set<Kernel::SharedPtr<Kernel::Mutex>>& mutex_list; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeThreadList : public WaitTreeExpandableItem { | ||
|  |     Q_OBJECT | ||
|  | public: | ||
|  |     WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list); | ||
|  |     QString GetText() const override; | ||
|  |     std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
|  | 
 | ||
|  | private: | ||
|  |     const std::vector<Kernel::SharedPtr<Kernel::Thread>>& thread_list; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeModel : public QAbstractItemModel { | ||
|  |     Q_OBJECT | ||
|  | 
 | ||
|  | public: | ||
|  |     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(); | ||
|  | 
 | ||
|  | private: | ||
|  |     std::vector<std::unique_ptr<WaitTreeThread>> thread_items; | ||
|  | }; | ||
|  | 
 | ||
|  | class WaitTreeWidget : public QDockWidget { | ||
|  |     Q_OBJECT | ||
|  | 
 | ||
|  | public: | ||
|  |     WaitTreeWidget(QWidget* parent = nullptr); | ||
|  | 
 | ||
|  | public slots: | ||
|  |     void OnDebugModeEntered(); | ||
|  |     void OnDebugModeLeft(); | ||
|  | 
 | ||
|  |     void OnEmulationStarting(EmuThread* emu_thread); | ||
|  |     void OnEmulationStopping(); | ||
|  | 
 | ||
|  | private: | ||
|  |     QTreeView* view; | ||
|  |     WaitTreeModel* model; | ||
|  | }; |