LookinDisplayItem.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #ifdef SHOULD_COMPILE_LOOKIN_SERVER
  2. //
  3. // LookinDisplayItem.h
  4. // qmuidemo
  5. //
  6. // Created by Li Kai on 2018/11/15.
  7. // Copyright © 2018 QMUI Team. All rights reserved.
  8. //
  9. #import "TargetConditionals.h"
  10. #import "LookinObject.h"
  11. #import "LookinDefines.h"
  12. #import "LookinCustomDisplayItemInfo.h"
  13. #if TARGET_OS_IPHONE
  14. #import <UIKit/UIKit.h>
  15. #elif TARGET_OS_MAC
  16. #import <Appkit/Appkit.h>
  17. #endif
  18. @class LookinAttributesGroup, LookinIvarTrace, LookinPreviewItemLayer, LookinEventHandler, LKDisplayItemNode, LookinDisplayItem;
  19. typedef NS_ENUM(NSUInteger, LookinDisplayItemImageEncodeType) {
  20. LookinDisplayItemImageEncodeTypeNone, // 不进行 encode
  21. LookinDisplayItemImageEncodeTypeNSData, // 转换为 NSData
  22. LookinDisplayItemImageEncodeTypeImage // 使用 NSImage / UIImage 自身的 encode 方法
  23. };
  24. typedef NS_ENUM(NSUInteger, LookinDoNotFetchScreenshotReason) {
  25. // can sync screenshot
  26. LookinFetchScreenshotPermitted,
  27. // layer is too large
  28. LookinDoNotFetchScreenshotForTooLarge,
  29. // refused by user config in LookinServer
  30. LookinDoNotFetchScreenshotForUserConfig
  31. };
  32. typedef NS_ENUM(NSUInteger, LookinDisplayItemProperty) {
  33. // 当初次设置 delegate 对象时,会立即以该值触发一次 displayItem:propertyDidChange:
  34. LookinDisplayItemProperty_None,
  35. LookinDisplayItemProperty_FrameToRoot,
  36. LookinDisplayItemProperty_DisplayingInHierarchy,
  37. LookinDisplayItemProperty_InHiddenHierarchy,
  38. LookinDisplayItemProperty_IsExpandable,
  39. LookinDisplayItemProperty_IsExpanded,
  40. LookinDisplayItemProperty_SoloScreenshot,
  41. LookinDisplayItemProperty_GroupScreenshot,
  42. LookinDisplayItemProperty_IsSelected,
  43. LookinDisplayItemProperty_IsHovered,
  44. LookinDisplayItemProperty_AvoidSyncScreenshot,
  45. LookinDisplayItemProperty_InNoPreviewHierarchy,
  46. LookinDisplayItemProperty_IsInSearch,
  47. LookinDisplayItemProperty_HighlightedSearchString,
  48. };
  49. @protocol LookinDisplayItemDelegate <NSObject>
  50. - (void)displayItem:(LookinDisplayItem *)displayItem propertyDidChange:(LookinDisplayItemProperty)property;
  51. @end
  52. @interface LookinDisplayItem : NSObject <NSSecureCoding, NSCopying>
  53. /// 当 customInfo 不为 nil 时,意思是该 DisplayItem 为 UserCustom 配置的。此时,Encode 属性中仅 subitems 和 customAttrGroupList 属性有意义,其它几乎所有属性都无意义
  54. @property(nonatomic, strong) LookinCustomDisplayItemInfo *customInfo;
  55. @property(nonatomic, copy) NSArray<LookinDisplayItem *> *subitems;
  56. @property(nonatomic, assign) BOOL isHidden;
  57. @property(nonatomic, assign) float alpha;
  58. @property(nonatomic, assign) CGRect frame;
  59. @property(nonatomic, assign) CGRect bounds;
  60. /// 不存在 subitems 时,该属性的值为 nil
  61. @property(nonatomic, strong) LookinImage *soloScreenshot;
  62. /// 无论是否存在 subitems,该属性始终存在
  63. @property(nonatomic, strong) LookinImage *groupScreenshot;
  64. @property(nonatomic, strong) LookinObject *viewObject;
  65. @property(nonatomic, strong) LookinObject *layerObject;
  66. @property(nonatomic, strong) LookinObject *hostViewControllerObject;
  67. /// attrGroups 列表
  68. @property(nonatomic, copy) NSArray<LookinAttributesGroup *> *attributesGroupList;
  69. /// 通过 lookin_customDebugInfos 返回的属性列表
  70. @property(nonatomic, copy) NSArray<LookinAttributesGroup *> *customAttrGroupList;
  71. /// attributesGroupList + customAttrGroupList
  72. - (NSArray<LookinAttributesGroup *> *)queryAllAttrGroupList;
  73. @property(nonatomic, copy) NSArray<LookinEventHandler *> *eventHandlers;
  74. // 如果当前 item 代表 UIWindow 且是 keyWindow,则该属性为 YES
  75. @property(nonatomic, assign) BOOL representedAsKeyWindow;
  76. /// view 或 layer 的 backgroundColor,利用该属性来提前渲染 node 的背景色,使得用户感觉加载的快一点
  77. /// 注意有一个缺点是,理论上应该像 screenshot 一样拆成 soloBackgroundColor 和 groupBackgroundColor,这里的 backgroundColor 实际上是 soloBackgroundColor,因此某些场景的显示会有瑕疵
  78. @property(nonatomic, strong) LookinColor *backgroundColor;
  79. /// 用户可以在 iOS 项目中添加 Lookin 自定义配置来显式地拒绝传输某些图层的图像,通常是屏蔽一些不重要的 View 以提升刷新速度。如果用户这么配置了,那么这个 shouldCaptureImage 就会被置为 NO
  80. /// 默认为 YES
  81. @property(nonatomic, assign) BOOL shouldCaptureImage;
  82. /// 用户通过重写 lookin_customDebugInfos 而自定义的该实例的名字
  83. /// 可能为 nil
  84. @property(nonatomic, copy) NSString *customDisplayTitle;
  85. /// 为 DanceUI SDK 预留的内部字段,用于文件跳转
  86. /// 可能为 nil
  87. @property(nonatomic, copy) NSString *danceuiSource;
  88. #pragma mark - No Encode/Decode
  89. @property(nonatomic, weak) id<LookinDisplayItemDelegate> previewItemDelegate;
  90. @property(nonatomic, weak) id<LookinDisplayItemDelegate> rowViewDelegate;
  91. /// 父节点
  92. @property(nonatomic, weak) LookinDisplayItem *superItem;
  93. /// 如果存在 viewObject 则返回 viewObject,否则返回 layerObject
  94. - (LookinObject *)displayingObject;
  95. /// 在 hierarchy 中的层级,比如顶层的 UIWindow.indentLevel 为 0,UIWindow 的 subitem 的 indentLevel 为 1
  96. - (NSInteger)indentLevel;
  97. /**
  98. 该项是否被展开
  99. @note 假如自己没有被折叠,但是 superItem 被折叠了,则自己仍然不会被看到,但是 self.isExpanded 值仍然为 NO
  100. @note 如果 item 没有 subitems(也就是 isExpandable 为 NO),则该值没有意义。换句话说,在获取该值之前,必须先判断一下 isExpandable
  101. */
  102. @property(nonatomic, assign) BOOL isExpanded;
  103. /// 如果有 subitems,则该属性返回 YES,否则返回 NO
  104. @property(nonatomic, assign, readonly) BOOL isExpandable;
  105. /**
  106. 是否能在 hierarchy panel 上被看到,假如有任意一层的父级元素的 isExpanded 为 NO,则 displayingInHierarchy 为 NO。如果所有父级元素的 isExpanded 均为 YES,则 displayingInHierarchy 为 YES
  107. */
  108. @property(nonatomic, assign, readonly) BOOL displayingInHierarchy;
  109. /**
  110. 如果自身或任意一个上层元素的 isHidden 为 YES 或 alpha 为 0,则该属性返回 YES
  111. */
  112. @property(nonatomic, assign, readonly) BOOL inHiddenHierarchy;
  113. @property(nonatomic, assign) LookinDisplayItemImageEncodeType screenshotEncodeType;
  114. /// Whether to fetch screenshot and why. Default to LookinFetchScreenshotPermitted.
  115. @property(nonatomic, assign) LookinDoNotFetchScreenshotReason doNotFetchScreenshotReason;
  116. @property(nonatomic, weak) LookinPreviewItemLayer *previewLayer;
  117. @property(nonatomic, weak) LKDisplayItemNode *previewNode;
  118. /// 如果该值为 YES,则该 item 及所有子 item 均不会在 preview 中被显示出来,只能在 hierarchy 中选择。默认为 NO
  119. @property(nonatomic, assign) BOOL noPreview;
  120. /// 如果自身或某个上级元素的 noPreview 值为 YES,则该方法返回 YES
  121. /// 注意:当 userCustom 为 YES 时,该属性也可能返回 YES
  122. @property(nonatomic, assign, readonly) BOOL inNoPreviewHierarchy;
  123. /// 当小于 0 时表示未被设置
  124. @property(nonatomic, assign) NSInteger previewZIndex;
  125. @property(nonatomic, assign) BOOL preferToBeCollapsed;
  126. - (void)notifySelectionChangeToDelegates;
  127. - (void)notifyHoverChangeToDelegates;
  128. /// 根据 subItems 属性将 items 打平为一维数组
  129. + (NSArray<LookinDisplayItem *> *)flatItemsFromHierarchicalItems:(NSArray<LookinDisplayItem *> *)items;
  130. @property(nonatomic, assign) BOOL hasDeterminedExpansion;
  131. /// 设置当前是否处于搜索状态
  132. @property(nonatomic, assign) BOOL isInSearch;
  133. /// 因为搜索而应该被高亮的字符串
  134. @property(nonatomic, copy) NSString *highlightedSearchString;
  135. @end
  136. #endif /* SHOULD_COMPILE_LOOKIN_SERVER */