Source code for camelot.view.controls.field_label

#  ============================================================================
#
#  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
#
#  ============================================================================
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

from camelot.core.utils import ugettext as _
from camelot.admin.object_admin import ObjectAdmin
from camelot.view.controls.editors.one2manyeditor import One2ManyEditor
from user_translatable_label import UserTranslatableLabel

[docs]class Attribute(object): """Helper class representing a field attribute's name and its value""" def __init__(self, name, value): self.name = unicode(name) self.value = unicode(value) class Admin(ObjectAdmin): list_display = ['name', 'value'] field_attributes = {'name':{'minimal_column_width':25}, 'value':{'minimal_column_width':25}}
[docs]class FieldLabel(UserTranslatableLabel): """A Label widget used to display the name of a field on a form. This label provides the user with the possibility to change the translation of the label and review its field attributes. """ font_width = None def __init__(self, field_name, text, field_attributes, admin, parent=None): """ :param field_name: the name of the field :param text: user translatable string to be used as field label :param field_attributes: the field attributes associated with the field for which this is a label :param admin: the admin of the object of the field """ super(FieldLabel, self).__init__(text, parent) if FieldLabel.font_width == None: FieldLabel.font_width = QtGui.QFontMetrics( QtGui.QApplication.font() ).size( Qt.TextSingleLine, 'A' ).width() show_field_attributes_action = QtGui.QAction(_('View attributes'), self) show_field_attributes_action.triggered.connect( self.show_field_attributes ) self.addAction(show_field_attributes_action) self._field_name = field_name self._admin = admin self._field_attributes = field_attributes def sizeHint( self ): size_hint = super(FieldLabel, self).sizeHint() size_hint.setWidth( self.font_width * max( 20, len( self._field_name ) ) ) return size_hint def get_attributes(self): import inspect def attribute_value_to_string(key, value): if inspect.isclass(value): return value.__name__ return unicode(value) return [Attribute(key,attribute_value_to_string(key, value)) for key,value in self._field_attributes.items()] @QtCore.pyqtSlot() def show_field_attributes(self): from camelot.view.proxy.collection_proxy import CollectionProxy admin = self._admin.get_related_admin( Attribute ) attributes_collection = CollectionProxy(admin=admin, collection_getter=self.get_attributes, columns_getter=admin.get_columns) class FieldAttributesDialog(QtGui.QDialog): def __init__(self, field_name, parent=None): super(FieldAttributesDialog, self).__init__(parent) self.setWindowTitle(_('Field Attributes')) layout = QtGui.QVBoxLayout() layout.addWidget( QtGui.QLabel(field_name) ) editor = One2ManyEditor(admin=admin, editable=False, parent=self) editor.set_value(attributes_collection) editor.setMinimumSize(600, 400) layout.addWidget(editor) self.setLayout(layout) dialog = FieldAttributesDialog(self._field_name, self) dialog.exec_()