text: from ..icons.icons import load_icons
  from ..rman_utils import prefs_utils                    
  
  # ------- Subclassed Panel Types -------
  class _RManPanelHeader():
      COMPAT_ENGINES = {'PRMAN_RENDER'}
  
      @classmethod
      def poll(cls, context):
          return context.engine in cls.COMPAT_ENGINES
  
      def draw_header(self, context):
          if prefs_utils.get_addon_prefs().draw_panel_icon:
              icons = load_icons()
              rfb_icon = icons.get("rfb_panel")
              self.layout.label(text="", icon_value=rfb_icon.icon_id)
          else:
              pass
  
  class CollectionPanel(_RManPanelHeader):
      bl_space_type = 'PROPERTIES'
      bl_region_type = 'WINDOW'
  
      def _draw_collection(self, context, layout, ptr, name, operator,
                           opcontext, prop_coll, collection_index, default_name='', ui_list_class="UI_UL_list"):
          layout.label(text=name)
          row = layout.row()
          row.template_list(ui_list_class, "PRMAN", ptr, prop_coll, ptr,
                            collection_index, rows=1)
          col = row.column(align=True)
  
          op = col.operator(operator, icon="ADD", text="")
          op.context = opcontext
          op.collection = prop_coll
          op.collection_index = collection_index
          op.defaultname = default_name
          op.action = 'ADD'
  
          op = col.operator(operator, icon="REMOVE", text="")
          op.context = opcontext
          op.collection = prop_coll
          op.collection_index = collection_index
          op.action = 'REMOVE'
  
          if hasattr(ptr, prop_coll) and len(getattr(ptr, prop_coll)) > 0 and \
                  getattr(ptr, collection_index) >= 0:
              item = getattr(ptr, prop_coll)[getattr(ptr, collection_index)]
              self.draw_item(layout, context, item)
  
  class PRManButtonsPanel(_RManPanelHeader):
      bl_space_type = "PROPERTIES"
      bl_region_type = "WINDOW"
      bl_context = "render"
  
  class ShaderNodePanel(_RManPanelHeader):
      bl_space_type = 'PROPERTIES'
      bl_region_type = 'WINDOW'
      bl_label = 'Node Panel'
  
      bl_context = ""
  
      @classmethod
      def poll(cls, context):
          if not _RManPanelHeader.poll(context):
              return False
          if cls.bl_context == 'material':
              if context.material and context.material.node_tree != '':
                  return True
          if cls.bl_context == 'data':
              if not context.light:
                  return False
              if context.light.renderman.use_renderman_node:
                  return True
          return False
  
  
  class ShaderPanel(_RManPanelHeader):
      bl_space_type = 'PROPERTIES'
      bl_region_type = 'WINDOW'
  
      shader_type = 'surface'
      param_exclude = {}
  
      @classmethod
      def poll(cls, context):
          is_rman = _RManPanelHeader.poll(context)
          if cls.bl_context == 'data' and cls.shader_type == 'light':
              return (hasattr(context, "light") and context.light is not None and is_rman)
          elif cls.bl_context == 'world':
              return (hasattr(context, "world") and context.world is not None and is_rman)
          elif cls.bl_context == 'material':
              return (hasattr(context, "material") and context.material is not None and is_rman)
  
  