Source code for camelot.view.controls.inheritance
# ============================================================================
#
# Copyright (C) 2007-2013 Conceptive Engineering bvba. All rights reserved.
# www.conceptive.be / info@conceptive.be
#
# This file is part of the Camelot Library.
#
# This file may be used under the terms of the GNU General Public
# License version 2.0 as published by the Free Software Foundation
# and appearing in the file license.txt included in the packaging of
# this file. Please review this information to ensure GNU
# General Public Licensing requirements will be met.
#
# If you are unsure which license is appropriate for your use, please
# visit www.python-camelot.com or contact info@conceptive.be
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# For use of this library in commercial applications, please contact
# info@conceptive.be
#
# ============================================================================
"""Controls related to visualizing object hierarchy"""
import logging
logger = logging.getLogger( 'camelot.view.controls.inheritance' )
from PyQt4 import QtGui
from PyQt4 import QtCore
from camelot.view.model_thread import post
from camelot.view.controls.modeltree import ModelTree
from camelot.view.controls.modeltree import ModelItem
QT_MAJOR_VERSION = float('.'.join(str(QtCore.QT_VERSION_STR).split('.')[0:2]))
class SubclassItem(ModelItem):
def __init__(self, parent, admin):
ModelItem.__init__(self, parent, [admin.get_verbose_name()], None)
self.admin = admin
[docs]class SubclassTree( ModelTree ):
"""Widget to select subclasses of a certain entity, where the subclasses
are represented in a tree
emits subclassClicked when a subclass has been selected
"""
subclass_clicked_signal = QtCore.pyqtSignal(object)
def __init__(self, admin, parent):
header_labels = ['Types']
ModelTree.__init__(self, header_labels, parent)
self.admin = admin
self.subclasses = []
post(self.admin.get_subclass_tree, self.setSubclasses)
self.setSizePolicy(
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding
)
self.clicked.connect( self.emit_subclass_clicked )
def setSubclasses(self, subclasses):
logger.debug('setting subclass tree')
self.subclasses = subclasses
def append_subclasses(class_item, subclasses):
for subclass_admin, subsubclasses in subclasses:
subclass_item = SubclassItem(class_item, subclass_admin)
self.modelitems.append(subclass_item)
append_subclasses(subclass_item, subsubclasses)
if len(subclasses):
self.clear_model_items()
top_level_item = SubclassItem(self, self.admin)
self.modelitems.append(top_level_item)
append_subclasses(top_level_item, subclasses)
top_level_item.setExpanded(True)
self.setMaximumWidth(self.fontMetrics().width(' ')*70)
else:
self.setMaximumWidth(0)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def emit_subclass_clicked(self, index):
logger.debug('subclass clicked at position %s' % index.row())
item = self.itemFromIndex(index)
self.subclass_clicked_signal.emit( item.admin )
[docs]class SubclassDialog(QtGui.QDialog):
"""A dialog requesting the user to select a subclass"""
def __init__(self, parent, admin):
QtGui.QDialog.__init__(self, parent)
subclass_tree = SubclassTree(admin, self)
layout = QtGui.QVBoxLayout()
layout.addWidget(subclass_tree)
layout.addStretch(1)
self.setLayout(layout)
self.selected_subclass = None
subclass_tree.subclass_clicked_signal.connect( self._subclass_clicked )
@QtCore.pyqtSlot(object)
def _subclass_clicked(self, admin):
self.selected_subclass = admin
self.accept()