WatchesPanel.hxx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #ifndef WATCHES_VIEW_H
  9. #define WATCHES_VIEW_H
  10. #if !defined(Q_MOC_RUN)
  11. #include <AzCore/base.h>
  12. #include <AzCore/Memory/SystemAllocator.h>
  13. #include <QObject>
  14. #include <QWidget>
  15. #include <QStandardItem>
  16. #include <AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx>
  17. #include "LUAWatchesDebuggerMessages.h"
  18. #include "LUALocalsTrackerMessages.h"
  19. #include <AzCore/Script/ScriptContextDebug.h>
  20. #include "LUABreakpointTrackerMessages.h"
  21. #endif
  22. #pragma once
  23. class WatchesFilterModel;
  24. enum WatchesItemID
  25. {
  26. WATCHES_NAMEITEM = QStandardItem::UserType,
  27. WATCHES_VALUEITEM,
  28. WATCHES_TYPEITEM,
  29. WATCHES_NEWITEM,
  30. };
  31. enum WatchesOperatingMode
  32. {
  33. WATCHES_MODE_GENERAL = 0,
  34. WATCHES_MODE_LOCALS,
  35. };
  36. enum WatchesOperatingState
  37. {
  38. WATCHES_STATE_CONNECTED = 0,
  39. WATCHES_STATE_DISCONNECTED,
  40. };
  41. class WatchesNameItem;
  42. class WatchesDataModel : public QAbstractItemModel
  43. {
  44. Q_OBJECT;
  45. public:
  46. WatchesDataModel();
  47. ~WatchesDataModel();
  48. virtual int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
  49. virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
  50. virtual Qt::ItemFlags flags ( const QModelIndex & index ) const;
  51. virtual QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const;
  52. virtual QModelIndex parent ( const QModelIndex & index ) const;
  53. virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
  54. virtual QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
  55. virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
  56. virtual bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() );
  57. void SetOperatingMode( WatchesOperatingMode newMode );
  58. void AddWatch( const AZ::ScriptContextDebug::DebugValue& newData );
  59. void AddWatch( AZStd::string );
  60. void RemoveWatch( QModelIndex &index );
  61. void UpdateMatchingDVs(const AZ::ScriptContextDebug::DebugValue& newData);
  62. bool IsTypeChangeAllowed( const QModelIndex &index ) const;
  63. void SetType( const QModelIndex &index, char newType );
  64. protected:
  65. // the data = an array of LUA tables
  66. typedef AZStd::vector<AZ::ScriptContextDebug::DebugValue> DVVector;
  67. DVVector m_DebugValues;
  68. // the mapping of child to parent, maintained during all data updates
  69. typedef AZStd::unordered_map<const AZ::ScriptContextDebug::DebugValue*, const AZ::ScriptContextDebug::DebugValue* > ParentContainer;
  70. mutable ParentContainer m_parents;
  71. mutable bool m_parentsDirty;
  72. WatchesOperatingMode m_OperatingMode;
  73. void RegenerateParentsMap() const;
  74. void RegenerateParentsMapRecurse(const AZ::ScriptContextDebug::DebugValue& dv) const;
  75. const char *SafetyType( char ) const;
  76. const AZ::ScriptContextDebug::DebugValue *GetDV(const QModelIndex & index) const;
  77. const QModelIndex GetTopmostIndex( const QModelIndex & index );
  78. const bool IsRealIndex( const QModelIndex & index ) const;
  79. void MarkValuesAsOld(AZ::ScriptContextDebug::DebugValue& dv);
  80. void ApplyNewData(AZ::ScriptContextDebug::DebugValue& original, const AZ::ScriptContextDebug::DebugValue& newvalues);
  81. void DVRecursePrint(const AZ::ScriptContextDebug::DebugValue& dv, int indent) const;
  82. };
  83. class DHWatchesWidget
  84. : public AzToolsFramework::QTreeViewWithStateSaving
  85. , private LUAEditor::LUAWatchesDebuggerMessages::Handler
  86. , public LUAEditor::LUALocalsTrackerMessages::Handler
  87. , public LUAEditor::LUABreakpointTrackerMessages::Bus::Handler
  88. {
  89. Q_OBJECT
  90. public:
  91. DHWatchesWidget( QWidget * parent = 0 );
  92. virtual ~DHWatchesWidget();
  93. void SetOperatingMode( WatchesOperatingMode newMode );
  94. virtual void WatchesUpdate(const AZ::ScriptContextDebug::DebugValue& topmostDebugReference);
  95. virtual void OnDebuggerAttached();
  96. virtual void OnDebuggerDetached();
  97. virtual void LocalsUpdate(const AZStd::vector<AZStd::string>& vars);
  98. virtual void LocalsClear();
  99. //////////////////////////////////////////////////////////////////////////
  100. //Debugger Messages, from the LUAEditor::LUABreakpointTrackerMessages::Bus
  101. virtual void BreakpointsUpdate(const LUAEditor::BreakpointMap& uniqueBreakpoints){(void)uniqueBreakpoints;}
  102. virtual void BreakpointHit(const LUAEditor::Breakpoint& breakpoint);
  103. virtual void BreakpointResume(){}
  104. protected:
  105. void CaptureVariables();
  106. virtual void keyPressEvent ( QKeyEvent * event );
  107. void ForceSelectNewWatch();
  108. QStandardItemModel m_WatchesModel;
  109. WatchesOperatingMode m_OperatingMode;
  110. WatchesOperatingState m_OperatingState;
  111. WatchesDataModel m_DM;
  112. WatchesFilterModel* m_pFilterModel;
  113. QMetaObject::Connection m_dataModelDataChangedConnection;
  114. QMetaObject::Connection m_dataModelRestConnection;
  115. void disconnectDataModelUpdate();
  116. void connectDataModelUpdate();
  117. public Q_SLOTS:
  118. void OnItemChanged();
  119. void OnDoubleClicked( const QModelIndex & );
  120. };
  121. #endif