class QuickInsert(QWidget): def __init__(self, dockwidget): super(QuickInsert, self).__init__(dockwidget) self._dockwidget = weakref.ref(dockwidget) # filled in by ButtonGroup subclasses self.actionDict = {} layout = QVBoxLayout() self.setLayout(layout) layout.setContentsMargins(0, 0, 0, 0) self.helpButton = QToolButton( icon = icons.get("help-contents"), autoRaise = True, clicked = lambda: userguide.show("quickinsert")) self.directionLabel = QLabel() self.direction = QComboBox() self.direction.addItems(['', '', '']) self.direction.setItemIcon(0, icons.get("go-up")) self.direction.setItemIcon(2, icons.get("go-down")) self.direction.setCurrentIndex(1) hor = QHBoxLayout() hor.setContentsMargins(0, 0, 0, 0) hor.addWidget(self.helpButton) hor.addWidget(self.directionLabel) hor.addWidget(self.direction) layout.addLayout(hor) self.toolbox = QToolBox(self) widgets.toolboxwheeler.ToolBoxWheeler(self.toolbox) layout.addWidget(self.toolbox) for cls in ( articulations.Articulations, dynamics.Dynamics, spanners.Spanners, barlines.BarLines, ): widget = cls(self) self.toolbox.addItem(widget, widget.icon(), '') app.translateUI(self) userguide.openWhatsThis(self) # restore remembered current page name = QSettings().value("quickinsert/current_tool", "", type("")) if name: for i in range(self.toolbox.count()): if name == self.toolbox.widget(i).__class__.__name__.lower(): self.toolbox.setCurrentIndex(i) break self.toolbox.currentChanged.connect(self.slotCurrentChanged) def slotCurrentChanged(self, index): name = self.toolbox.widget(index).__class__.__name__.lower() QSettings().setValue("quickinsert/current_tool", name) def translateUI(self): self.setWhatsThis(_( "<p>With the Quick Insert Panel you can add various music " "elements to the current note or selected music.</p>\n" "<p>See {link} for more information.</p>").format(link= userguide.util.format_link("quickinsert"))) self.helpButton.setToolTip(_("Help")) self.directionLabel.setText(_("Direction:")) for item, text in enumerate((_("Up"), _("Neutral"), _("Down"))): self.direction.setItemText(item, text) for i in range(self.toolbox.count()): self.toolbox.setItemText(i, self.toolbox.widget(i).title()) self.toolbox.setItemToolTip(i, self.toolbox.widget(i).tooltip()) def actionForName(self, name): """This is called by the ShortcutCollection of our dockwidget, e.g. if the user presses a key.""" try: return self.actionDict[name] except KeyError: pass def dockwidget(self): return self._dockwidget()
class FlawWidget(QWidget): """ @brief Das Widget, in welchem sämtliche Nachteile angeordnet sind. """ def __init__(self, template, character, parent=None): super(FlawWidget, self).__init__(parent) self.__storage = template self.__character = character 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 = "Flaw" categories = [] categories.extend(Config.CATEGORIES_FLAWS) 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 = {} # Flaws werden in einer Spalte heruntergeschrieben, aber mit vertikalem Platz dazwischen. for item in categories: # Für jede Kategorie wird ein eigener Abschnitt erzeugt. widgetFlawCategory = QWidget() ## Dank des Namens übernimmt dieses Widget den Stil des Eltern-Widgets. widgetFlawCategory.setObjectName("transparentWidget") layoutFlawCategory = QVBoxLayout() widgetFlawCategory.setLayout( layoutFlawCategory ) self.__toolBox.addItem( widgetFlawCategory, item ) self.__categoryIndex[item] = self.__toolBox.count() - 1 #Debug.debug(self.__categoryIndex) __list = list( self.__character.traits[self.__typ][item].items() ) __list.sort() for flaw in __list: # Anlegen des Widgets, das diese Eigenschaft repräsentiert. traitWidget = CheckTrait( flaw[1], self ) if not flaw[1].custom: traitWidget.setDescriptionHidden(True) layoutFlawCategory.addWidget( traitWidget ) flaw[1].valueChanged.connect(self.countItems) self.__character.speciesChanged.connect(traitWidget.hideOrShowTrait) # Stretch einfügen, damit die Eigenschaften besser angeordnet sind. layoutFlawCategory.addStretch() self.setMinimumWidth(Config.TRAIT_WIDTH_MIN) def countItems(self): """ Zält die Nachteile in einer Kategorie, deren Wert größer 0 ist. Dieser Wert wird dann in die Überschrift der einzelnen ToolBox-Seiten angezeigt, um dem Benutzer die Übersicht zu bewahren. Es wird nur dann etwas angezeigt, wenn der Weert größer 0 ist. """ for item in self.__character.traits[self.__typ]: numberInCategory = 0 for subitem in self.__character.traits[self.__typ][item].values(): if subitem.value > 0: numberInCategory += 1 # ToolBox-Seite des entsprechenden Kategorie mit der Anzahl gewählter Merits beschriften. if numberInCategory > 0: self.__toolBox.setItemText( self.__categoryIndex[item], "{} ({})".format(item, numberInCategory) ) else: self.__toolBox.setItemText( self.__categoryIndex[item], item )
class MeritWidget(TraitWidget): """ @brief Das Widget, in welchem sämtliche Merits angeordnet sind. \todo Einen Knopf erstellen, über den der Benutzer angeben kann, welche Merits er denn wirklich alle angezeigt haben will. \todo Bei Merits mit Zusatztext (Language) in diesem men+ ein Zahlenfle dangeben, bei welchem der benutzer einstellen kann, wieviele verschiedene dieser scheinbar identischen merits er angezeigt haben will. """ 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) #// dialog = new SelectMeritsDialog( this ); #// #// QHBoxLayout* layout_button = new QHBoxLayout(); #// layoutTop.addLayout( layout_button ); #// #// button = new QPushButton(); #// button.setIcon( style().standardIcon( QStyle::SP_FileDialogStart ) ); #// #// layout_button.addStretch(); #// layout_button.addWidget( button ); #// #// connect( button, SIGNAL( clicked( bool ) ), dialog, SLOT( exec() ) ); def countMerits(self): """ Zält die Merits in einer Kategorie, deren Wert größer 0 ist. Dieser Wert wird dann in die Überschrift der einzelnen ToolBox-Seiten angezeigt, um dem Benutzer die Übersicht zu bewahren. Es wird nur dann etwas angezeigt, wenn der Weert größer 0 ist. Versteckte Eigenschaften. also solche, die der Spezies nicht zur Verfügung stehen, können einen Wert > 0 haben, sollten aber nicht mitgezählt werden. """ for item in self._character.traits[self.__typ]: numberInCategory = 0 for subitem in self._character.traits[self.__typ][item].values(): if subitem.value > 0 and (not subitem.species or subitem.species == self._character.species): numberInCategory += 1 # ToolBox-Seite des entsprechenden Kategorie mit der Anzahl gewählter Merits beschriften. if numberInCategory > 0: self.__toolBox.setItemText( self.__categoryIndex[item], "{} ({})".format(item, numberInCategory) ) else: self.__toolBox.setItemText( self.__categoryIndex[item], item )
class MultipleCategoriesView(QWidget): def __init__(self, action, parent, logger): super(MultipleCategoriesView, self).__init__(parent) self.logger = logger self._action = action self._mode = PrivacySettings.get().getPolicy(self._action, None, useModified=True, categoryPolicy=PrivacySettings.CATEGORY_NEVER) self._currentSingleViews = {} self._currentToolBox = None topView = self._initTopView() self._initSettingsWidget() mainLayout = QVBoxLayout(self) mainLayout.addWidget(topView) mainLayout.addWidget(self._settingsWidget, 1) self._modeChanged(self._mode, False) get_notification_center().connectPrivacySettingsChanged(self._privacySettingsChanged) get_notification_center().connectPrivacySettingsDiscarded(self._privacySettingsChanged) def finish(self): get_notification_center().disconnectPrivacySettingsChanged(self._privacySettingsChanged) get_notification_center().disconnectPrivacySettingsDiscarded(self._privacySettingsChanged) self._clearCurrentView() def _initTopView(self): topWidget = QWidget(self) self._modeCombo = QComboBox(topWidget) self._modeCombo.addItem(u"from nobody") self._modeCombo.addItem(u"from nobody, except") self._modeCombo.addItem(u"from everybody, except") self._modeCombo.addItem(u"from everybody") self._modeCombo.addItem(u"depending on category") self._modeCombo.setCurrentIndex(self._mode) self._modeCombo.currentIndexChanged.connect(self._modeChanged) topLayout = QHBoxLayout(topWidget) topLayout.setContentsMargins(0, 0, 0, 0) topLayout.addWidget(QLabel(u"Accept"), 0) topLayout.addWidget(self._modeCombo, 1, Qt.AlignLeft) return topWidget def _initSettingsWidget(self): self._settingsWidget = QWidget(self) layout = QVBoxLayout(self._settingsWidget) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) def _clearCurrentView(self): for _cat, view in self._currentSingleViews.iteritems(): view.finish() self._currentSingleViews = {} layout = self._settingsWidget.layout() child = layout.takeAt(0) while child != None: child.widget().deleteLater() child = layout.takeAt(0) _PEER_EXCEPTIONS_VIEW = -1 def _createAndInsertSingleView(self, category, index): singleView = SingleCategoryView(self._action, self._currentToolBox, self.logger, category) self._currentSingleViews[category] = singleView icon = self._action.getCategoryIcon(category) title = u"Not Categorized" if category == PrivacySettings.NO_CATEGORY else category if icon is not None: self._currentToolBox.insertItem(index, singleView, icon, title) else: self._currentToolBox.insertItem(index, singleView, title) def _createCategoryView(self): self._clearCurrentView() self._currentToolBox = QToolBox(self) self._currentToolBox.setAutoFillBackground(False) for category in self._action.getPrivacyCategories(): self._createAndInsertSingleView(category, -1) peerExceptions = SingleCategoryView(self._action, self._currentToolBox, self.logger, category=None, mode=PrivacySettings.POLICY_PEER_EXCEPTION) self._currentSingleViews[self._PEER_EXCEPTIONS_VIEW] = peerExceptions self._currentToolBox.addItem(peerExceptions, "Special Peers") w = QScrollArea(self) w.setAutoFillBackground(False) w.viewport().setAutoFillBackground(False) w.setWidgetResizable(True) w.setWidget(self._currentToolBox) w.setFrameShape(QFrame.NoFrame) self._settingsWidget.layout().addWidget(w) def _updateCategoryView(self): if self._currentToolBox is None: self.logger.debug("Current tool box is None. Have to reset.") self._createCategoryView() return newCategories = self._action.getPrivacyCategories() last = self._currentToolBox.count() - 1 oldCategories = [convert_string(self._currentToolBox.widget(i).getCategory()) for i in xrange(last)] # remove categories that are not there any more reverse_enumerate = lambda l: izip(xrange(len(l)-1, -1, -1), reversed(l)) for i, oldCat in reverse_enumerate(oldCategories): if oldCat not in newCategories: self._currentToolBox.removeItem(i) # add new categories lastFound = -1 for i, newCat in reverse_enumerate(newCategories): if newCat in oldCategories: lastFound = i else: self._createAndInsertSingleView(newCat, lastFound) def _createSingleView(self, mode): self._clearCurrentView() w = SingleCategoryView(self._action, self, self.logger, mode=mode) self._currentSingleViews[None] = w self._settingsWidget.layout().addWidget(w) @loggingSlot(int) def _modeChanged(self, newMode, notify=True): if newMode == self._mode and newMode == PrivacySettings.POLICY_BY_CATEGORY: self._updateCategoryView() return self._currentToolBox = None if newMode in (PrivacySettings.POLICY_EVERYBODY_EX, PrivacySettings.POLICY_NOBODY_EX): # single mode if len(self._currentSingleViews) == 0 or self._mode not in (PrivacySettings.POLICY_EVERYBODY_EX, PrivacySettings.POLICY_NOBODY_EX): # only reset if not already in single mode self._createSingleView(newMode) else: # only change mode self._currentSingleViews[None].setMode(newMode) elif newMode == PrivacySettings.POLICY_BY_CATEGORY: self._createCategoryView() else: self._clearCurrentView() self._mode = newMode if self._modeCombo.currentIndex() != newMode: self._modeCombo.setCurrentIndex(newMode) if notify: PrivacySettings.get().setPolicy(self._action, None, self._mode, applyImmediately=False, categoryPolicy=PrivacySettings.CATEGORY_NEVER) @loggingSlot(object, object) def _privacySettingsChanged(self, pluginName, actionName): if pluginName != self._action.getPluginName() or actionName != self._action.getName(): return newMode = PrivacySettings.get().getPolicy(self._action, None, categoryPolicy=PrivacySettings.CATEGORY_NEVER) self._modeChanged(newMode, notify=False)
class QuickInsert(QWidget): def __init__(self, dockwidget): super(QuickInsert, self).__init__(dockwidget) self._dockwidget = weakref.ref(dockwidget) # filled in by ButtonGroup subclasses self.actionDict = {} layout = QVBoxLayout() self.setLayout(layout) layout.setContentsMargins(0, 0, 0, 0) self.helpButton = QToolButton( icon=icons.get("help-contents"), autoRaise=True, clicked=lambda: userguide.show("quickinsert")) self.directionLabel = QLabel() self.direction = QComboBox() self.direction.addItems(['', '', '']) self.direction.setItemIcon(0, icons.get("go-up")) self.direction.setItemIcon(2, icons.get("go-down")) self.direction.setCurrentIndex(1) hor = QHBoxLayout() hor.setContentsMargins(0, 0, 0, 0) hor.addWidget(self.helpButton) hor.addWidget(self.directionLabel) hor.addWidget(self.direction) layout.addLayout(hor) self.toolbox = QToolBox(self) widgets.toolboxwheeler.ToolBoxWheeler(self.toolbox) layout.addWidget(self.toolbox) for cls in ( articulations.Articulations, dynamics.Dynamics, spanners.Spanners, barlines.BarLines, ): widget = cls(self) self.toolbox.addItem(widget, widget.icon(), '') app.translateUI(self) userguide.openWhatsThis(self) # restore remembered current page name = QSettings().value("quickinsert/current_tool", "", type("")) if name: for i in range(self.toolbox.count()): if name == self.toolbox.widget(i).__class__.__name__.lower(): self.toolbox.setCurrentIndex(i) break self.toolbox.currentChanged.connect(self.slotCurrentChanged) def slotCurrentChanged(self, index): name = self.toolbox.widget(index).__class__.__name__.lower() QSettings().setValue("quickinsert/current_tool", name) def translateUI(self): self.setWhatsThis( _("<p>With the Quick Insert Panel you can add various music " "elements to the current note or selected music.</p>\n" "<p>See {link} for more information.</p>").format( link=userguide.util.format_link("quickinsert"))) self.helpButton.setToolTip(_("Help")) self.directionLabel.setText(_("Direction:")) for item, text in enumerate((_("Up"), _("Neutral"), _("Down"))): self.direction.setItemText(item, text) for i in range(self.toolbox.count()): self.toolbox.setItemText(i, self.toolbox.widget(i).title()) self.toolbox.setItemToolTip(i, self.toolbox.widget(i).tooltip()) def actionForName(self, name): """This is called by the ShortcutCollection of our dockwidget, e.g. if the user presses a key.""" try: return self.actionDict[name] except KeyError: pass def dockwidget(self): return self._dockwidget()
class MeritWidget(TraitWidget): """ @brief Das Widget, in welchem sämtliche Merits angeordnet sind. \todo Einen Knopf erstellen, über den der Benutzer angeben kann, welche Merits er denn wirklich alle angezeigt haben will. \todo Bei Merits mit Zusatztext (Language) in diesem men+ ein Zahlenfle dangeben, bei welchem der benutzer einstellen kann, wieviele verschiedene dieser scheinbar identischen merits er angezeigt haben will. """ 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) #// dialog = new SelectMeritsDialog( this ); #// #// QHBoxLayout* layout_button = new QHBoxLayout(); #// layoutTop.addLayout( layout_button ); #// #// button = new QPushButton(); #// button.setIcon( style().standardIcon( QStyle::SP_FileDialogStart ) ); #// #// layout_button.addStretch(); #// layout_button.addWidget( button ); #// #// connect( button, SIGNAL( clicked( bool ) ), dialog, SLOT( exec() ) ); def countMerits(self): """ Zält die Merits in einer Kategorie, deren Wert größer 0 ist. Dieser Wert wird dann in die Überschrift der einzelnen ToolBox-Seiten angezeigt, um dem Benutzer die Übersicht zu bewahren. Es wird nur dann etwas angezeigt, wenn der Weert größer 0 ist. Versteckte Eigenschaften. also solche, die der Spezies nicht zur Verfügung stehen, können einen Wert > 0 haben, sollten aber nicht mitgezählt werden. """ for item in self._character.traits[self.__typ]: numberInCategory = 0 for subitem in self._character.traits[self.__typ][item].values(): if subitem.value > 0 and (not subitem.species or subitem.species == self._character.species): numberInCategory += 1 # ToolBox-Seite des entsprechenden Kategorie mit der Anzahl gewählter Merits beschriften. if numberInCategory > 0: self.__toolBox.setItemText( self.__categoryIndex[item], "{} ({})".format(item, numberInCategory)) else: self.__toolBox.setItemText(self.__categoryIndex[item], item)