# 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
# at the Qt simple tree model example.
# See: http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-simpletreemodel.html
# pylint: disable=C0103, C0111

# The main window inherits from a Qt class, therefore it has many 
# ancestors public methods and attributes.
# pylint: disable=R0901, R0902, R0904, W0201 
    
class TreeModel(QtCore.QAbstractItemModel):
    """ Model that provides an interface to an objectree that is build of TreeItems. 
    """
    def __init__(self, obj, 
                 obj_name = '',
                 attr_cols = None, 
                 parent = None):
        """ Constructor
        
            :param obj: any Python object or variable
            :param obj_name: name of the object as it will appear in the root node
                             If empty, no root node will be drawn. 
            :param attr_cols: list of AttributeColumn definitions
            :param parent: the parent widget
        """
        super(TreeModel, self).__init__(parent)
        self._attr_cols = attr_cols

        self.regular_font = QtGui.QFont()  # Font for members (non-functions)
        self.special_attribute_font = QtGui.QFont()  # Font for __special_attributes__
        self.special_attribute_font.setItalic(True)
        

# 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

# at the Qt simple tree model example.
# See: http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-simpletreemodel.html
# pylint: disable=C0103, C0111

# The main window inherits from a Qt class, therefore it has many 
# ancestors public methods and attributes.
# pylint: disable=R0901, R0902, R0904, W0201 
    
class TreeModel(QtCore.QAbstractItemModel):
    """ Model that provides an interface to an objectree that is build of TreeItems. 
    """
    def __init__(self, obj, 
                 obj_name = '',
                 attr_cols = None, 
                 parent = None):
        """ Constructor
        
            :param obj: any Python object or variable
            :param obj_name: name of the object as it will appear in the root node
                             If empty, no root node will be drawn. 
            :param attr_cols: list of AttributeColumn definitions
            :param parent: the parent widget
        """
        super(TreeModel, self).__init__(parent)
        self._attr_cols = attr_cols

        self.regular_font = QtGui.QFont()  # Font for members (non-functions)
        self.special_attribute_font = QtGui.QFont()  # Font for __special_attributes__
        self.special_attribute_font.setItalic(True)
        

        self.regular_color = QtGui.QBrush(QtGui.QColor('black'))    