def __init__(self, template, character, parent=None):
		super(MeritWidget, self).__init__(template, character, parent)

		self.__layout = QVBoxLayout()
		self.setLayout( self.__layout )

		self.__toolBox = QToolBox()
		## Die Auflistung der Merits soll auch unter Windows einen transparenten Hintergrund haben.
		self.__toolBox.setObjectName("transparentWidget")
		## \todo Sollte nicht vom Betriebssystem, sondern vom verwendeten Style abhängen.
		if os.name == "nt":
			self.__toolBox.setStyleSheet( "QScrollArea{ background: transparent; } QWidget#transparentWidget { background: transparent; }" )
		self.__layout.addWidget(self.__toolBox)

		self.__typ = "Merit"
		categories = []
		categories.extend(Config.CATEGORIES_MERITS)
		categories.extend(self._storage.categories(self.__typ))
		# Duplikate werden entfernt. Dadurch wird die in der Config-Klasse vorgegebene Reihenfolge eingehalten und zusätzliche, dort nicht erwähnte Kategorien werden hinterher angehängt.
		categories = ListTools.uniqify_ordered(categories)

		# Diese Liste speichert den Index der ToolBox-Seite bei den unterschiedlichen Kategorien
		self.__categoryIndex = {}

		# Merits werden in einer Spalte heruntergeschrieben, aber mit vertikalem Platz dazwischen.
		for item in categories:
			# Für jede Kategorie wird ein eigener Abschnitt erzeugt.
			widgetMeritCategory = QWidget()
			## Dank des Namens übernimmt dieses Widget den Stil des Eltern-Widgets.
			widgetMeritCategory.setObjectName("transparentWidget")

			layoutMeritCategory = QVBoxLayout()
			widgetMeritCategory.setLayout( layoutMeritCategory )

			self.__toolBox.addItem( widgetMeritCategory, item )
			self.__categoryIndex[item] = self.__toolBox.count() - 1
			#Debug.debug(self.__categoryIndex)

			__list = list( self._character.traits[self.__typ][item].items() )
			__list.sort()
			for merit in __list:
				#Debug.debug(merit)
				# Anlegen des Widgets, das diese Eigenschaft repräsentiert.
				traitWidget = CharaTrait( merit[1], self )
				traitWidget.setSpecialtiesHidden(True)
				if not merit[1].custom:
					traitWidget.setDescriptionHidden(True)

				# Bei Merits sind nur bestimmte Werte erlaubt.
				#Debug.debug(self._storage.traits[self.__typ][item][merit[0]])
				traitWidget.setPossibleValues(self._storage.traits[self.__typ][item][merit[1].identifier]["values"])

				# Es werden nur Eigenschaften der richtigen Alters- und Zeit-Kategorie angezeigt.
				self.hideReasonChanged.connect(traitWidget.hideOrShowTrait)

				layoutMeritCategory.addWidget( traitWidget )

				merit[1].valueChanged.connect(self.countMerits)
				#self._character.speciesChanged.connect(traitWidget.hideOrShowTrait_species)


			# Stretch einfügen, damit die Eigenschaften besser angeordnet sind.
			layoutMeritCategory.addStretch()

		self.setMinimumWidth(Config.TRAIT_WIDTH_MIN)

		self._character.speciesChanged.connect(self.countMerits)
	def __init__(self, template, character, parent=None):
		super(AttributeWidget, self).__init__(template, character, parent)

		self.__layout = QVBoxLayout()
		self.setLayout( self.__layout )

		self.__layoutAttributes = QGridLayout()
		self.__layout.addLayout( self.__layoutAttributes )

		self.__labelPower = QLabel( "<b>" + self.tr( "Power" ) + "</b>" )
		self.__labelPower.setAlignment( Qt.AlignRight )

		self.__labelFinesse = QLabel( "<b>" + self.tr( "Finesse" ) + "</b>" )
		self.__labelFinesse.setAlignment( Qt.AlignRight )

		self.__labelResistance = QLabel( "<b>" + self.tr( "Resistance" ) + "</b>" )
		self.__labelResistance.setAlignment( Qt.AlignRight )

		actualRow = 1
		actualColumn = 0

		self.__layoutAttributes.addWidget( self.__labelPower, actualRow, actualColumn )
		actualRow += 1
		self.__layoutAttributes.addWidget( self.__labelFinesse, actualRow, actualColumn )
		actualRow += 1
		self.__layoutAttributes.addWidget( self.__labelResistance, actualRow, actualColumn )

		self.__labelStr = QLabel( self )
		self.__labelDex = QLabel( self )
		self.__labelSta = QLabel( self )
		self.__labelMan = QLabel( self )

		#connect( self, SIGNAL( speciesChanged( bool ) ), labelStr, SLOT( setHidden( bool ) ) )
		#connect( self, SIGNAL( speciesChanged( bool ) ), labelDex, SLOT( setHidden( bool ) ) )
		#connect( self, SIGNAL( speciesChanged( bool ) ), labelSta, SLOT( setHidden( bool ) ) )
		#connect( self, SIGNAL( speciesChanged( bool ) ), labelMan, SLOT( setHidden( bool ) ) )

		for item in Config.ATTRIBUTES:
			#Debug.debug(self._character.traits)

			actualColumn += 1

			vLine = QFrame( self )
			vLine.setFrameStyle( QFrame.VLine)
			self.__layoutAttributes.addWidget( vLine, 1, actualColumn, len(item[1]), 1, Qt.AlignHCenter )

			self.__layoutAttributes.setColumnStretch( actualColumn, 1 )

			# Jetzt sind wir in der Spalte für die tatsächlchen Attribute
			actualColumn += 1

			# Aber zuerst kommt die Überschrift für die einzelnen Kategorien.
			header = QLabel()
			header.setAlignment( Qt.AlignHCenter )
			header.setText( "<b>" + item[0] + "</b>" )
			self.__layoutAttributes.addWidget( header, 0, actualColumn )

			# Einfügen der tatsächlichen Attribute
			i = 0
			for subitem in item[1]:
				attrib = self._character.traits["Attribute"][item[0]][subitem]
				#Debug.debug(attrib)
				# Anlegen des Widgets, das diese Eigenschaft repräsentiert.
				traitWidget = CharaTrait( attrib, self )
				traitWidget.setSpecialtiesHidden( True )
				traitWidget.setDescriptionHidden( True )

				# An welcher Position sitzt dieses Attribut in der Config.ATTRIBUTES-Liste?

				self.__layoutAttributes.addWidget( traitWidget, i + 1, actualColumn )

				self.maxTraitChanged.connect(traitWidget.setMaximum)

				#if ( item == "Physical" ):
					#if ( attrib["name"] == "Strength" ):
						#self.__layoutAttributes.addWidget( self.__labelStr, j + 1, actualColumn + 1 )
						#connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesStr( int ) ) )
					#} else if ( trait.name() == "Dexterity" ) {
						#layoutAttributes.addWidget( self.__labelDex, j + 1, actualColumn + 1 )
						#connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesDex( int ) ) )
					#} else if ( trait.name() == "Stamina" ) {
						#layoutAttributes.addWidget( self.__labelSta, j + 1, actualColumn + 1 )
						#connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesSta( int ) ) )
				#} else if ( trait.category() == cv_AbstractTrait::Social ) {
					#if ( self.__trait.name() == "Manipulation" ) {
						#layoutAttributes.addWidget( labelMan, j + 1, actualColumn + 1 )
						#connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesMan( int ) ) )

				i += 1

			# Bei Werwölfen erscheint hier Zusatztext. Und damit der Sparator richtig gesetzt wird, muß die aktuelle Spalte ein weitergezählt werden.
			actualColumn += 1

		self.__layout.addSpacing( Config.SPACE_VERTICAL_STD )

		self.__layoutBonus = QGridLayout()
		self.__layout.addLayout( self.__layoutBonus )

		self.__labelBonus = QLabel( self )
		self.__labelBonus.setText( self.tr( "Bonus Attribute:" ) )

		self.__layoutButtonsBonus = QVBoxLayout()

		self.__buttonsBonus = QButtonGroup( self )

		self.__layoutBonus.addWidget( self.__labelBonus, 0, 0, Qt.AlignTop | Qt.AlignLeft )
		self.__layoutBonus.addLayout( self.__layoutButtonsBonus, 0, 1 )
	#// 	layoutBonus.addItem(new QSpacerItem(0,0), 0, 2)
		self.__layoutBonus.addWidget( QWidget( self ), 0, 2 )
		self.__layoutBonus.setColumnStretch( 2, 1 )
    def __init__(self, template, character, parent=None):
        super(AttributeWidget, self).__init__(template, character, parent)

        self.__layout = QVBoxLayout()
        self.setLayout(self.__layout)

        self.__layoutAttributes = QGridLayout()
        self.__layout.addLayout(self.__layoutAttributes)

        self.__labelPower = QLabel("<b>" + self.tr("Power") + "</b>")
        self.__labelPower.setAlignment(Qt.AlignRight)

        self.__labelFinesse = QLabel("<b>" + self.tr("Finesse") + "</b>")
        self.__labelFinesse.setAlignment(Qt.AlignRight)

        self.__labelResistance = QLabel("<b>" + self.tr("Resistance") + "</b>")
        self.__labelResistance.setAlignment(Qt.AlignRight)

        actualRow = 1
        actualColumn = 0

        self.__layoutAttributes.addWidget(self.__labelPower, actualRow,
                                          actualColumn)
        actualRow += 1
        self.__layoutAttributes.addWidget(self.__labelFinesse, actualRow,
                                          actualColumn)
        actualRow += 1
        self.__layoutAttributes.addWidget(self.__labelResistance, actualRow,
                                          actualColumn)

        self.__labelStr = QLabel(self)
        self.__labelDex = QLabel(self)
        self.__labelSta = QLabel(self)
        self.__labelMan = QLabel(self)

        #connect( self, SIGNAL( speciesChanged( bool ) ), labelStr, SLOT( setHidden( bool ) ) )
        #connect( self, SIGNAL( speciesChanged( bool ) ), labelDex, SLOT( setHidden( bool ) ) )
        #connect( self, SIGNAL( speciesChanged( bool ) ), labelSta, SLOT( setHidden( bool ) ) )
        #connect( self, SIGNAL( speciesChanged( bool ) ), labelMan, SLOT( setHidden( bool ) ) )

        for item in Config.ATTRIBUTES:
            #Debug.debug(self._character.traits)

            actualColumn += 1

            vLine = QFrame(self)
            vLine.setFrameStyle(QFrame.VLine)
            self.__layoutAttributes.addWidget(vLine, 1, actualColumn,
                                              len(item[1]), 1, Qt.AlignHCenter)

            self.__layoutAttributes.setColumnStretch(actualColumn, 1)

            # Jetzt sind wir in der Spalte für die tatsächlchen Attribute
            actualColumn += 1

            # Aber zuerst kommt die Überschrift für die einzelnen Kategorien.
            header = QLabel()
            header.setAlignment(Qt.AlignHCenter)
            header.setText("<b>" + item[0] + "</b>")
            self.__layoutAttributes.addWidget(header, 0, actualColumn)

            # Einfügen der tatsächlichen Attribute
            i = 0
            for subitem in item[1]:
                attrib = self._character.traits["Attribute"][item[0]][subitem]
                #Debug.debug(attrib)
                # Anlegen des Widgets, das diese Eigenschaft repräsentiert.
                traitWidget = CharaTrait(attrib, self)
                traitWidget.setSpecialtiesHidden(True)
                traitWidget.setDescriptionHidden(True)

                # An welcher Position sitzt dieses Attribut in der Config.ATTRIBUTES-Liste?

                self.__layoutAttributes.addWidget(traitWidget, i + 1,
                                                  actualColumn)

                self.maxTraitChanged.connect(traitWidget.setMaximum)

                #if ( item == "Physical" ):
                #if ( attrib["name"] == "Strength" ):
                #self.__layoutAttributes.addWidget( self.__labelStr, j + 1, actualColumn + 1 )
                #connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesStr( int ) ) )
                #} else if ( trait.name() == "Dexterity" ) {
                #layoutAttributes.addWidget( self.__labelDex, j + 1, actualColumn + 1 )
                #connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesDex( int ) ) )
                #} else if ( trait.name() == "Stamina" ) {
                #layoutAttributes.addWidget( self.__labelSta, j + 1, actualColumn + 1 )
                #connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesSta( int ) ) )
                #} else if ( trait.category() == cv_AbstractTrait::Social ) {
                #if ( self.__trait.name() == "Manipulation" ) {
                #layoutAttributes.addWidget( labelMan, j + 1, actualColumn + 1 )
                #connect( trait, SIGNAL( valueChanged( int ) ), self, SLOT( updateshapeValuesMan( int ) ) )

                i += 1

            # Bei Werwölfen erscheint hier Zusatztext. Und damit der Sparator richtig gesetzt wird, muß die aktuelle Spalte ein weitergezählt werden.
            actualColumn += 1

        self.__layout.addSpacing(Config.SPACE_VERTICAL_STD)

        self.__layoutBonus = QGridLayout()
        self.__layout.addLayout(self.__layoutBonus)

        self.__labelBonus = QLabel(self)
        self.__labelBonus.setText(self.tr("Bonus Attribute:"))

        self.__layoutButtonsBonus = QVBoxLayout()

        self.__buttonsBonus = QButtonGroup(self)

        self.__layoutBonus.addWidget(self.__labelBonus, 0, 0,
                                     Qt.AlignTop | Qt.AlignLeft)
        self.__layoutBonus.addLayout(self.__layoutButtonsBonus, 0, 1)
        #// 	layoutBonus.addItem(new QSpacerItem(0,0), 0, 2)
        self.__layoutBonus.addWidget(QWidget(self), 0, 2)
        self.__layoutBonus.setColumnStretch(2, 1)
    def __init__(self, template, character, parent=None):
        super(MeritWidget, self).__init__(template, character, parent)

        self.__layout = QVBoxLayout()
        self.setLayout(self.__layout)

        self.__toolBox = QToolBox()
        ## Die Auflistung der Merits soll auch unter Windows einen transparenten Hintergrund haben.
        self.__toolBox.setObjectName("transparentWidget")
        ## \todo Sollte nicht vom Betriebssystem, sondern vom verwendeten Style abhängen.
        if os.name == "nt":
            self.__toolBox.setStyleSheet(
                "QScrollArea{ background: transparent; } QWidget#transparentWidget { background: transparent; }"
            )
        self.__layout.addWidget(self.__toolBox)

        self.__typ = "Merit"
        categories = []
        categories.extend(Config.CATEGORIES_MERITS)
        categories.extend(self._storage.categories(self.__typ))
        # Duplikate werden entfernt. Dadurch wird die in der Config-Klasse vorgegebene Reihenfolge eingehalten und zusätzliche, dort nicht erwähnte Kategorien werden hinterher angehängt.
        categories = ListTools.uniqify_ordered(categories)

        # Diese Liste speichert den Index der ToolBox-Seite bei den unterschiedlichen Kategorien
        self.__categoryIndex = {}

        # Merits werden in einer Spalte heruntergeschrieben, aber mit vertikalem Platz dazwischen.
        for item in categories:
            # Für jede Kategorie wird ein eigener Abschnitt erzeugt.
            widgetMeritCategory = QWidget()
            ## Dank des Namens übernimmt dieses Widget den Stil des Eltern-Widgets.
            widgetMeritCategory.setObjectName("transparentWidget")

            layoutMeritCategory = QVBoxLayout()
            widgetMeritCategory.setLayout(layoutMeritCategory)

            self.__toolBox.addItem(widgetMeritCategory, item)
            self.__categoryIndex[item] = self.__toolBox.count() - 1
            #Debug.debug(self.__categoryIndex)

            __list = list(self._character.traits[self.__typ][item].items())
            __list.sort()
            for merit in __list:
                #Debug.debug(merit)
                # Anlegen des Widgets, das diese Eigenschaft repräsentiert.
                traitWidget = CharaTrait(merit[1], self)
                traitWidget.setSpecialtiesHidden(True)
                if not merit[1].custom:
                    traitWidget.setDescriptionHidden(True)

                # Bei Merits sind nur bestimmte Werte erlaubt.
                #Debug.debug(self._storage.traits[self.__typ][item][merit[0]])
                traitWidget.setPossibleValues(self._storage.traits[
                    self.__typ][item][merit[1].identifier]["values"])

                # Es werden nur Eigenschaften der richtigen Alters- und Zeit-Kategorie angezeigt.
                self.hideReasonChanged.connect(traitWidget.hideOrShowTrait)

                layoutMeritCategory.addWidget(traitWidget)

                merit[1].valueChanged.connect(self.countMerits)
                #self._character.speciesChanged.connect(traitWidget.hideOrShowTrait_species)

            # Stretch einfügen, damit die Eigenschaften besser angeordnet sind.
            layoutMeritCategory.addStretch()

        self.setMinimumWidth(Config.TRAIT_WIDTH_MIN)

        self._character.speciesChanged.connect(self.countMerits)