From f69a543110703e09adc830bbc65e3c39be0cc52b Mon Sep 17 00:00:00 2001 From: wwylele Date: Fri, 8 Apr 2016 19:28:54 +0300 Subject: implement wait tree widget --- src/citra_qt/debugger/wait_tree.h | 186 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/citra_qt/debugger/wait_tree.h (limited to 'src/citra_qt/debugger/wait_tree.h') diff --git a/src/citra_qt/debugger/wait_tree.h b/src/citra_qt/debugger/wait_tree.h new file mode 100644 index 000000000..5d1d964d1 --- /dev/null +++ b/src/citra_qt/debugger/wait_tree.h @@ -0,0 +1,186 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include + +#include +#include +#include + +#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> GetChildren() const; + virtual QString GetText() const = 0; + virtual QColor GetColor() const; + virtual ~WaitTreeItem(); + void Expand(); + WaitTreeItem* Parent() const; + const std::vector>& Children() const; + std::size_t Row() const; + static std::vector> MakeThreadItemList(); + +private: + std::size_t row; + bool expanded = false; + WaitTreeItem* parent = nullptr; + std::vector> 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 make(const Kernel::WaitObject& object); + QString GetText() const override; + std::vector> 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>& list, + bool wait_all); + QString GetText() const override; + std::vector> GetChildren() const override; + +private: + const std::vector>& 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> GetChildren() const override; +}; + +class WaitTreeEvent : public WaitTreeWaitObject { + Q_OBJECT +public: + WaitTreeEvent(const Kernel::Event& object); + std::vector> GetChildren() const override; +}; + +class WaitTreeMutex : public WaitTreeWaitObject { + Q_OBJECT +public: + WaitTreeMutex(const Kernel::Mutex& object); + std::vector> GetChildren() const override; +}; + +class WaitTreeSemaphore : public WaitTreeWaitObject { + Q_OBJECT +public: + WaitTreeSemaphore(const Kernel::Semaphore& object); + std::vector> GetChildren() const override; +}; + +class WaitTreeTimer : public WaitTreeWaitObject { + Q_OBJECT +public: + WaitTreeTimer(const Kernel::Timer& object); + std::vector> GetChildren() const override; +}; + +class WaitTreeMutexList : public WaitTreeExpandableItem { + Q_OBJECT +public: + WaitTreeMutexList(const boost::container::flat_set>& list); + QString GetText() const override; + std::vector> GetChildren() const override; + +private: + const boost::container::flat_set>& mutex_list; +}; + +class WaitTreeThreadList : public WaitTreeExpandableItem { + Q_OBJECT +public: + WaitTreeThreadList(const std::vector>& list); + QString GetText() const override; + std::vector> GetChildren() const override; + +private: + const std::vector>& 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> 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; +}; -- cgit v1.2.3