# Path: objbrowser/qtpy/QtCore.py

# 
# Path: objbrowser/qtpy/QtGui.py

# 
# Path: objbrowser/qtpy/QtWidgets.py

# 
# Path: objbrowser/qtpy/QtCore.py

# 
# Path: objbrowser/treeitem.py
# class TreeItem(object):
#     """ Tree node class that can be used to build trees of objects.
#     """
#     def __init__(self, obj, name, obj_path, is_attribute, parent=None):
#         self.parent_item = parent
#         self.obj = obj
#         self.obj_name = str(name)
#         self.obj_path = str(obj_path)
#         self.is_attribute = is_attribute
#         self.child_items = []
#         self.has_children = True
#         self.children_fetched = False
# 
# 
#     def __str__(self):
#         n_children = len(self.child_items)
#         if n_children == 0:
#             return "<TreeItem(0x{:x}): {} = {}>" \
#                 .format(id(self.obj), self.obj_path, cut_off_str(self.obj, MAX_OBJ_STR_LEN))
#         else:
#             return "<TreeItem(0x{:x}): {} ({:d} children)>" \
#                 .format(id(self.obj), self.obj_path, len(self.child_items))
# 
# 
#     def __repr__(self):
#         n_children = len(self.child_items)
#         return "<TreeItem(0x{:x}): {} ({:d} children)>" \
#             .format(id(self.obj), self.obj_path, n_children)
#             
#     @property
#     def is_special_attribute(self):
#         " Return true if the items is an attribute and its name begins and end with 2 underscores" 
#         return self.is_attribute and name_is_special(self.obj_name)
# 
#     @property
#     def is_callable_attribute(self):
#         " Return true if the items is an attribute and it is callable."
#         return self.is_attribute and self.is_callable
# 
#     @property
#     def is_callable(self):
#         " Return true if the underlying object is callable "
#         return callable(self.obj)
#     
#     def append_child(self, item):
#         item.parent_item = self
#         self.child_items.append(item)
# 
#     def insert_children(self, idx, items):
#         self.child_items[idx:idx] = items
#         for item in items:
#             item.parent_item = self
# 
#     def child(self, row):
#         return self.child_items[row]
# 
#     def child_count(self):
#         return len(self.child_items)
# 
#     def parent(self):
#         return self.parent_item
# 
#     def row(self):
#         if self.parent_item:
#             return self.parent_item.child_items.index(self)
#         else:
#             return 0
# 
#     def pretty_print(self, indent=0):
#         if 0:
#             print(indent * "    " + str(self))
#         else:
#             logger.debug(indent * "    " + str(self))
#         for child_item in self.child_items:
#             child_item.pretty_print(indent + 1)


import logging, inspect
from difflib import SequenceMatcher
from collections import OrderedDict
from six import unichr
from objbrowser.qtpy import QtCore, QtGui, QtWidgets
from objbrowser.qtpy.QtCore import Qt
from objbrowser.treeitem import TreeItem
from objbrowser.utils import cut_off_str
                # Replace carriage returns and line feeds with unicode glyphs 
                # so that all table rows fit on one line. 
                #return attr.replace('\n', unichr(0x240A)).replace('\r', unichr(0x240D))
                return (attr.replace('\r\n', unichr(0x21B5))
                            .replace('\n', unichr(0x21B5))
                            .replace('\r', unichr(0x21B5)))
            except Exception as ex:
                #logger.exception(ex)
                return "**ERROR**: {}".format(ex) 
            
        elif role == Qt.TextAlignmentRole:
            return self._attr_cols[col].alignment
            
        elif role == Qt.ForegroundRole:
            if tree_item.is_callable:
                return self.callable_color
            else:
                return self.regular_color
            
        elif role == Qt.FontRole:
            if tree_item.is_attribute:
                return self.special_attribute_font
            else:
                return self.regular_font
        else:
            return None


    def flags(self, index):
        if not index.isValid():

# Path: objbrowser/qtpy/QtCore.py

# 
# Path: objbrowser/qtpy/QtGui.py

# 
# Path: objbrowser/qtpy/QtWidgets.py

# 
# Path: objbrowser/qtpy/QtCore.py

# 
# Path: objbrowser/treeitem.py
# class TreeItem(object):
#     """ Tree node class that can be used to build trees of objects.
#     """
#     def __init__(self, obj, name, obj_path, is_attribute, parent=None):
#         self.parent_item = parent
#         self.obj = obj
#         self.obj_name = str(name)
#         self.obj_path = str(obj_path)
#         self.is_attribute = is_attribute
#         self.child_items = []
#         self.has_children = True
#         self.children_fetched = False
# 
# 
#     def __str__(self):
#         n_children = len(self.child_items)
#         if n_children == 0:
#             return "<TreeItem(0x{:x}): {} = {}>" \
#                 .format(id(self.obj), self.obj_path, cut_off_str(self.obj, MAX_OBJ_STR_LEN))
#         else:
#             return "<TreeItem(0x{:x}): {} ({:d} children)>" \
#                 .format(id(self.obj), self.obj_path, len(self.child_items))
# 
# 
#     def __repr__(self):
#         n_children = len(self.child_items)
#         return "<TreeItem(0x{:x}): {} ({:d} children)>" \
#             .format(id(self.obj), self.obj_path, n_children)
#             
#     @property
#     def is_special_attribute(self):
#         " Return true if the items is an attribute and its name begins and end with 2 underscores" 
#         return self.is_attribute and name_is_special(self.obj_name)
# 
#     @property
#     def is_callable_attribute(self):
#         " Return true if the items is an attribute and it is callable."
#         return self.is_attribute and self.is_callable
# 
#     @property
#     def is_callable(self):
#         " Return true if the underlying object is callable "
#         return callable(self.obj)
#     
#     def append_child(self, item):
#         item.parent_item = self
#         self.child_items.append(item)
# 
#     def insert_children(self, idx, items):
#         self.child_items[idx:idx] = items
#         for item in items:
#             item.parent_item = self
# 
#     def child(self, row):
#         return self.child_items[row]
# 
#     def child_count(self):
#         return len(self.child_items)
# 
#     def parent(self):
#         return self.parent_item
# 
#     def row(self):
#         if self.parent_item:
#             return self.parent_item.child_items.index(self)
#         else:
#             return 0
# 
#     def pretty_print(self, indent=0):
#         if 0:
#             print(indent * "    " + str(self))
#         else:
#             logger.debug(indent * "    " + str(self))
#         for child_item in self.child_items:
#             child_item.pretty_print(indent + 1)


# Path: objbrowser/treemodel.py
import logging, inspect
from difflib import SequenceMatcher
from collections import OrderedDict
from six import unichr
from objbrowser.qtpy import QtCore, QtGui, QtWidgets
from objbrowser.qtpy.QtCore import Qt
from objbrowser.treeitem import TreeItem
from objbrowser.utils import cut_off_str

                # Replace carriage returns and line feeds with unicode glyphs 
                # so that all table rows fit on one line. 
                #return attr.replace('\n', unichr(0x240A)).replace('\r', unichr(0x240D))
                return (attr.replace('\r\n', unichr(0x21B5))
                            .replace('\n', unichr(0x21B5))
                            .replace('\r', unichr(0x21B5)))
            except Exception as ex:
                #logger.exception(ex)
                return "**ERROR**: {}".format(ex) 
            
        elif role == Qt.TextAlignmentRole:
            return self._attr_cols[col].alignment
            
        elif role == Qt.ForegroundRole:
            if tree_item.is_callable:
                return self.callable_color
            else:
                return self.regular_color
            
        elif role == Qt.FontRole:
            if tree_item.is_attribute:
                return self.special_attribute_font
            else:
                return self.regular_font
        else:
            return None


    def flags(self, index):
        if not index.isValid():

            return Qt.NoItemFlags