def iner(): initial = self.get_color(self.custom_colors[button_]) color_dialog = QColorDialog(parent=parent) try: color_dialog.setCurrentColor(initial) except: # snake_case, true_property color_dialog.current_color = initial done = color_dialog.exec_() try: color_ = color_dialog.currentColor() except: # snake_case, true_property color_ = color_dialog.current_color try: if done and color_.isValid(): rgb_255 = [color_.red(), color_.green(), color_.blue()] color = '#' + ''.join([hex(v)[2:].ljust(2, '0') for v in rgb_255]) self.custom_colors[button_] = color self.update_theme(parent) except: # snake_case, true_property if done and color_.is_valid(): rgb_255 = [color_.red(), color_.green(), color_.blue()] color = '#' + ''.join([hex(v)[2:].ljust(2, '0') for v in rgb_255]) self.custom_colors[button_] = color self.update_theme(parent)
def editHighlightColor(self): current_color = self.model.activeView.highlightBackground dlg = QColorDialog(self) dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) if dlg.exec_(): new_color = dlg.currentColor().getRgb()[:3] self.model.activeView.highlightBackground = new_color self.colorDialog.updateHighlightColor()
class AliasLayout(QGridLayout): new_color = Signal(str) def __init__(self): super().__init__() self.alias_editor = QLineEdit() self.alias_editor.setMaxLength(32) # noinspection PyUnresolvedReferences self.alias_editor.returnPressed.connect(self.alias_editor.clearFocus) self.addWidget(QLabel('LN Node Alias'), column=1, column_span=1) self.addWidget(self.alias_editor, column=2, column_span=2, same_row=True) self.addWidget(QLabel('LN Node Color'), column=1, column_span=1) self.color_label = QLabel() self.color_label.setAutoFillBackground(True) self.color_label.setFixedSize(10, 10) self.addWidget(self.color_label, column_span=1, column=2, same_row=True) self.select_color_button = QPushButton('Select color') # noinspection PyUnresolvedReferences self.select_color_button.clicked.connect(self.select_color) self.addWidget(self.select_color_button, column=3, column_span=1, same_row=True) self.color_dialog = QColorDialog(self.parentWidget()) def select_color(self): color = self.color_dialog.getColor() if color.isValid(): self.set_palette(color) self.color_dialog.setCurrentColor(color) # noinspection PyUnresolvedReferences self.new_color.emit(color.name()) def set_alias(self, text: str): self.alias_editor.setText(text) def set_color(self, color_hex: str): color = QColor(color_hex) if color.isValid(): self.set_palette(color) self.color_dialog.setCurrentColor(color) def set_palette(self, color: QColor): palette = self.color_label.palette() palette.setColor(QPalette.Background, color) self.color_label.setPalette(palette)
def iner(): initial = self.get_color(self.custom_colors[button_]) color_dialog = QColorDialog(parent=parent) color_dialog.setCurrentColor(initial) done = color_dialog.exec_() color_ = color_dialog.currentColor() if done and color_.isValid(): color = '#' + ''.join([hex(v)[2:].ljust(2, '0') for v in color_.toTuple()[:3]]) self.custom_colors[button_] = color self.update_theme(parent)
def on_color_picker(self): """ Show color-picker dialog to select color. Qt will use the native dialog by default. """ dlg = QColorDialog(self) # We will need an RGBA color value dlg.setOption(QColorDialog.ShowAlphaChannel, True) dlg.setCurrentColor(self.color()) dlg.finished.connect(self.dialog_finished) dlg.open()
def editOverlapColor(self, apply=False): current_color = self.model.activeView.overlap_color dlg = QColorDialog(self) dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) if dlg.exec_(): new_color = dlg.currentColor().getRgb()[:3] self.model.activeView.overlap_color = new_color self.colorDialog.updateOverlapColor() if apply: self.applyChanges()
def editBackgroundColor(self, apply=False): current_color = self.model.activeView.domainBackground dlg = QColorDialog(self) dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) if dlg.exec_(): new_color = dlg.currentColor().getRgb()[:3] self.model.activeView.domainBackground = new_color self.colorDialog.updateBackgroundColor() if apply: self.applyChanges()
def _set_accent_color(self): color_btn_hex = webcolors.hex_to_rgb(self.accent_color_le.text()) accent_color = QColor(color_btn_hex.red, color_btn_hex.green, color_btn_hex.blue) dialog = QColorDialog() dialog.setCurrentColor(accent_color) color = dialog.getColor(accent_color, self, "Select Accent Color") if color.isValid(): hex_color = webcolors.rgb_to_hex( (color.red(), color.green(), color.blue())).upper() self.accent_color_le.setText(hex_color) self.accent_color_btn.setIcon( qta.icon('fa5s.brush', color=hex_color))
def editDomainColor(self, kind, id): if kind == 'Cell': domain = self.model.activeView.cells else: domain = self.model.activeView.materials current_color = domain[id].color dlg = QColorDialog(self) if isinstance(current_color, tuple): dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) elif isinstance(current_color, str): current_color = openmc.plots._SVG_COLORS[current_color] dlg.setCurrentColor(QtGui.QColor.fromRgb(*current_color)) if dlg.exec_(): new_color = dlg.currentColor().getRgb()[:3] domain[id].color = new_color self.applyChanges()
def mouseReleaseEvent(self, event): # pylint:disable=unused-argument dialog = QColorDialog() dialog.setCurrentColor(self.color.am_obj) dialog.exec() if dialog.result() == QColorDialog.Accepted: self.set_color(dialog.currentColor())
class IconColorEditor(QDialog): """An editor to let the user select an icon and a color for an object_class. """ def __init__(self, parent): """Init class.""" super().__init__(parent) # , Qt.Popup) icon_size = QSize(32, 32) self.icon_mngr = IconListManager(icon_size) self.setWindowTitle("Select icon and color") self.icon_widget = QWidget(self) self.icon_list = QListView(self.icon_widget) self.icon_list.setViewMode(QListView.IconMode) self.icon_list.setIconSize(icon_size) self.icon_list.setResizeMode(QListView.Adjust) self.icon_list.setItemDelegate(_IconPainterDelegate(self)) self.icon_list.setMovement(QListView.Static) self.icon_list.setMinimumHeight(400) icon_widget_layout = QVBoxLayout(self.icon_widget) icon_widget_layout.addWidget(QLabel("Font Awesome icons")) self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("Search icons for...") icon_widget_layout.addWidget(self.line_edit) icon_widget_layout.addWidget(self.icon_list) self.color_dialog = QColorDialog(self) self.color_dialog.setWindowFlags(Qt.Widget) self.color_dialog.setOption(QColorDialog.NoButtons, True) self.color_dialog.setOption(QColorDialog.DontUseNativeDialog, True) self.button_box = QDialogButtonBox(self) self.button_box.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) top_widget = QWidget(self) top_layout = QHBoxLayout(top_widget) top_layout.addWidget(self.icon_widget) top_layout.addWidget(self.color_dialog) layout = QVBoxLayout(self) layout.addWidget(top_widget) layout.addWidget(self.button_box) self.proxy_model = QSortFilterProxyModel(self) self.proxy_model.setSourceModel(self.icon_mngr.model) self.proxy_model.filterAcceptsRow = self._proxy_model_filter_accepts_row self.icon_list.setModel(self.proxy_model) self.setAttribute(Qt.WA_DeleteOnClose) self.connect_signals() def _proxy_model_filter_accepts_row(self, source_row, source_parent): """Overridden method to filter icons according to search terms. """ text = self.line_edit.text() if not text: return QSortFilterProxyModel.filterAcceptsRow( self.proxy_model, source_row, source_parent) searchterms = self.icon_mngr.model.index( source_row, 0, source_parent).data(Qt.UserRole + 1) return any([text in term for term in searchterms]) def connect_signals(self): """Connect signals to slots.""" self.line_edit.textEdited.connect(self.proxy_model.invalidateFilter) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) def set_data(self, data): icon_code, color_code = interpret_icon_id(data) self.icon_mngr.init_model() for i in range(self.proxy_model.rowCount()): index = self.proxy_model.index(i, 0) if index.data(Qt.UserRole) == icon_code: self.icon_list.setCurrentIndex(index) break self.color_dialog.setCurrentColor(QColor(color_code)) def data(self): icon_code = self.icon_list.currentIndex().data(Qt.UserRole) color_code = self.color_dialog.currentColor().rgb() return make_icon_id(icon_code, color_code)
class TabSettingsDialog(QDialog): """The TabSettingsDialog class provides a dialog for picking a new color and name for an EditorTabWidget object. Attributes: name: Current name of the tab. Color: Current color of the tab. """ color_changed = Signal(int, QColor) name_changed = Signal(int, str) def __init__( self, index=-1, name="", color=QColor("#FFFFFF"), parent: "QWidget" = None, ): super().__init__(parent) self.setWindowTitle("Tab settings") # Attributes self.index = index self.__name = name self.__color = color # Color picker self.__color_picker_dialog = QColorDialog(parent) self.__color_picker_dialog.setCurrentColor(self.__color) self.__color_picker_dialog.currentColorChanged.connect( lambda color: self.color_changed.emit(self.index, color)) self.__color_picker_dialog.finished.connect(self.done) # Button for displaying the color picker self.__show_color_picker_button = QPushButton("Color...", default=False, autoDefault=False) self.__show_color_picker_button.clicked.connect( lambda: self.__color_picker_dialog.show()) # Name edit self.__name_line_edit = QLineEdit(self.__name, parent=self) self.__name_line_edit.setFocus(Qt.PopupFocusReason) self.__name_line_edit.textEdited.connect( lambda new_text: self.name_changed.emit(self.index, new_text)) # Configure layout self.__main_layout = QHBoxLayout() self.__main_layout.addWidget(self.__show_color_picker_button) self.__main_layout.addWidget(self.__name_line_edit) self.setLayout(self.__main_layout) @property def name(self) -> "str": """Returns the current name of the tab.""" return self.__name @name.setter def name(self, name: str): """Sets a new name for the tab (programatically). Sends a `name_changed` signal. """ self.__name = name self.__name_line_edit.setText(self.__name) self.name_changed.emit(self.index, self.name) @property def color(self) -> "QColor": """Returns the current color picked for the tab.""" return self.__color_picker_dialog.currentColor() @color.setter def color(self, color): """Sets a new color for the tab (programatically). Sends a `color_changed` signal. """ self.__color_picker_dialog.setCurrentColor(color) def accept(self): """When the dialog is accepted (Closed saving the changes), send a signal to update the text and color.""" self.name_changed.emit(self.index, self.__name_line_edit.text()) self.color_changed.emit(self.index, self.__color_picker_dialog.currentColor()) super().accept() def keyPressEvent(self, event: "QKeyEvent"): """When the Return key is pressed, accept the dialog.""" if event.key() == Qt.Key_Return: self.accept() super().keyPressEvent(event)
class SoundBoard(QDialog): def __init__(self): super(SoundBoard, self).__init__() self.title = '=== SoundBoard ===' # positionnement de la fenêtre à l'ouverture self.left = 50 self.top = 50 # initialisation de la largeur et hauteur par défaut self.width = 500 self.height = 500 self.currFileName = "" self.pbPosToModify = -1 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.windowLayout = QHBoxLayout() self.tableWidget = QTableWidget() self.tableWidget.horizontalHeader().hide() self.tableWidget.verticalHeader().hide() self.initIcons() self.initMenu() self.initColorPicker() self.initButtons() self.windowLayout.setStretch(1, 0) self.setLayout(self.windowLayout) self.show() def initIcons(self): self.iEdit = QIcon() self.iEdit.addPixmap(QPixmap("./icons/edit.png"), QIcon.Normal, QIcon.Off) self.iPlus = QIcon() self.iPlus.addPixmap(QPixmap("./icons/plus.png"), QIcon.Normal, QIcon.Off) self.iMinus = QIcon() self.iMinus.addPixmap(QPixmap("./icons/minus.png"), QIcon.Normal, QIcon.Off) self.iParam = QIcon() self.iParam.addPixmap(QPixmap("./icons/cog.png"), QIcon.Normal, QIcon.Off) def initMenu(self): layout = QVBoxLayout() hlayout = QHBoxLayout() # bouton ajout self.tbPlus = QToolButton() self.tbPlus.setGeometry(QRect(0, 0, 32, 32)) self.tbPlus.setIcon(self.iPlus) self.tbPlus.setObjectName("tbPlus") hlayout.addWidget(self.tbPlus) self.tbPlus.clicked.connect(self.add) # bouton suppression self.tbMinus = QToolButton() self.tbMinus.setGeometry(QRect(0, 0, 32, 32)) self.tbMinus.setIcon(self.iMinus) self.tbMinus.setObjectName("tbMinus") hlayout.addWidget(self.tbMinus) self.tbMinus.clicked.connect(self.delete) # bouton édition self.tbEdit = QToolButton() self.tbEdit.setGeometry(QRect(0, 0, 32, 32)) self.tbEdit.setIcon(self.iEdit) self.tbEdit.setObjectName("tbEdit") hlayout.addWidget(self.tbEdit) self.tbEdit.clicked.connect(self.editBtn) # bouton paramètres self.tbParam = QToolButton() self.tbParam.setGeometry(QRect(0, 0, 32, 32)) self.tbParam.setIcon(self.iParam) self.tbParam.setObjectName("tbParam") hlayout.addWidget(self.tbParam) self.tbParam.clicked.connect(self.settings) layout.addLayout(hlayout) self.pbStop = QPushButton("Don't STOP\n\nthe\n\nSoundBoard") self.pbStop.setStyleSheet("font-weight: bold;") self.pbStop.setMinimumSize(QSize(100, 100)) self.pbStop.setGeometry(QRect(0, 0, 100, 100)) layout.addWidget(self.pbStop) self.pbStop.clicked.connect(self.stop) spacerMenu = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) layout.addItem(spacerMenu) self.windowLayout.addLayout(layout) def startInitButtons(self): self.tableWidget.clear() self.tableWidget.clearSpans() self.tableWidget.setColumnWidth(0, 100) self.tableWidget.setColumnWidth(2, 100) self.cdColorPicker.setVisible(False) self.tableWidget.horizontalHeader().hide() # import des informations boutons contenues dans le json with open('buttons.json', encoding='utf-8') as json_file: self.data_buttons = json.load(json_file) # stockage de la position la plus élevée pour le cadrage self.positions = [p['position'] for p in self.data_buttons['buttons']] self.max_pos = max(self.positions) # calcul du nombre de boutons par hauteur et largeur self.BtnH = self.data_buttons['buttons_grid']['height'] self.BtnW = self.data_buttons['buttons_grid']['width'] self.setGeometry(self.left, self.top, 140 + self.BtnW * 100, 175 if self.BtnH * 31 < 175 else 25 + self.BtnH * 30) self.tableWidget.setColumnCount(self.BtnW) self.tableWidget.setRowCount(self.BtnH) def endInitButtons(self): buttonsLayout = QVBoxLayout() buttonsLayout.setStretch(0, 1) buttonsLayout.addWidget(self.tableWidget) self.windowLayout.addLayout(buttonsLayout) self.setGeometry(self.left, self.top, 140 + self.BtnW * 100, 175 if self.BtnH * 31 < 175 else 25 + self.BtnH * 30) def initButtons(self): self.startInitButtons() # positionnement des boutons en fonction des positions du json for ligne in range(self.BtnH): for colonne in range(self.BtnW): if (ligne * self.BtnW) + (colonne + 1) in self.positions: for b in self.data_buttons['buttons']: if b['position'] == (ligne * self.BtnW) + (colonne + 1): pb = QPushButton(b['name'][:9]) pb.setProperty('pbPos', b['position']) # si fond clair, font noire, si sombre, font blanche if (b['r'] * 0.299 + b['g'] * 0.587 + b['b'] * 0.114) > 186: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #000000;" ) else: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #ffffff;" ) self.tableWidget.setCellWidget(ligne, colonne, pb) pb.clicked.connect(self.play) else: pb = QPushButton('Nouveau') calcPos = self.BtnW * ligne + colonne + 1 pb.setProperty('pbPos', f"nouveau,{calcPos}") pb.clicked.connect(self.add) self.tableWidget.setCellWidget(ligne, colonne, pb) colonne += 1 ligne += 1 self.endInitButtons() def initColorPicker(self): self.lColorPicker = QVBoxLayout() self.cdColorPicker = QColorDialog() self.cdColorPicker.setOption(self.cdColorPicker.NoButtons, True) self.colorSelected = self.cdColorPicker.currentColor() self.lColorPicker.addWidget(self.cdColorPicker) self.cdColorPicker.setVisible(False) self.cdColorPicker.currentColorChanged.connect(self.colorChanged) self.windowLayout.addLayout(self.lColorPicker) def play(self): pb = self.sender() pbPos = pb.property('pbPos') for b in self.data_buttons['buttons']: if pbPos == b['position']: pbFile = b['file'] if (p.get_state() == vlc.State.Playing): p.stop() media = instance.media_new(soundRep + pbFile) if (self.currFileName != pbFile): p.set_media(media) p.play() self.currFileName = pbFile else: media = instance.media_new(soundRep + pbFile) p.set_media(media) p.play() self.currFileName = pbFile def stop(self): p.stop() def add(self): self.cdColorPicker.setVisible(True) self.tableWidget.clear() self.tableWidget.clearSpans() self.tableWidget.setColumnWidth(2, 100) self.tableWidget.setColumnCount(6) self.tableWidget.setRowCount(len(self.data_buttons['buttons']) + 1) self.tableWidget.horizontalHeader().show() self.tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(0).setText('Nom') self.tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(1).setText('Fichier') self.tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(2).setText('') self.tableWidget.setColumnWidth(2, 22) self.tableWidget.setHorizontalHeaderItem(3, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(3).setText('Position') self.tableWidget.setHorizontalHeaderItem(4, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(4).setText('Couleur') self.tableWidget.setHorizontalHeaderItem(5, QTableWidgetItem()) self.tableWidget.horizontalHeaderItem(5).setText('') # nom self.leName = QLineEdit() self.leName.setPlaceholderText('Nom (10 max.)') self.tableWidget.setCellWidget(0, 0, self.leName) # fichier self.leFile = QLineEdit() self.leFile.setPlaceholderText('Fichier') self.tableWidget.setCellWidget(0, 1, self.leFile) # browse pbBrowser = QPushButton('...') pbBrowser.setMinimumSize(QSize(21, 21)) pbBrowser.clicked.connect(self.browseMedia) self.tableWidget.setCellWidget(0, 2, pbBrowser) # position self.lePos = QLineEdit() self.lePos.setPlaceholderText('Position') self.tableWidget.setCellWidget(0, 3, self.lePos) # couleur self.leColor = QLineEdit() self.leColor.setPlaceholderText('255,255,255') self.leColor.setText( str(self.colorSelected.red()) + "," + str(self.colorSelected.green()) + "," + str(self.colorSelected.blue())) self.tableWidget.setCellWidget(0, 4, self.leColor) # validation pbValid = QPushButton('Valider') pbValid.clicked.connect(self.addValid) self.tableWidget.setCellWidget(0, 5, pbValid) pb = self.sender() pbPos = pb.property('pbPos') if pbPos is not None: if str(pbPos)[:8] == 'nouveau,': self.lePos.setText(pbPos[8:]) def sortByPos(val): return val['position'] self.data_buttons['buttons'].sort(key=sortByPos) for ligne, b in enumerate(self.data_buttons['buttons'], start=1): self.tableWidget.setSpan(ligne, 1, 1, 2) self.tableWidget.setCellWidget(ligne, 0, QLabel(b['name'])) self.tableWidget.setCellWidget(ligne, 1, QLabel(b['file'])) self.tableWidget.setCellWidget(ligne, 3, QLabel(str(b['position']))) self.tableWidget.setCellWidget(ligne, 4, QLabel('Couleur')) # 530 color picker width self.setGeometry(self.left, self.top, 690 + 530, 300) def addValid(self): gName = self.leName.text() self.leName.setStyleSheet("color: rgb(0,0,0);") gFile = self.leFile.text() self.leFile.setStyleSheet("color: rgb(0,0,0);") gPos = self.lePos.text() self.lePos.setStyleSheet("color: rgb(0,0,0);") gColor = self.leColor.text() self.leColor.setStyleSheet("color: rgb(0,0,0);") # si champs vides if ((gName == '' or gName == 'Obligatoire !') or (gFile == '' or gFile == 'Obligatoire !') or (gPos == '' or gColor == 'Obligatoire !') or (gColor == '' or gColor == 'Obligatoire !')): if gName == '' or gName == 'Obligatoire !': self.leName.setText('Obligatoire !') self.leName.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") if gFile == '' or gFile == 'Obligatoire !': self.leFile.setText('Obligatoire !') self.leFile.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") if gPos == '' or gColor == 'Obligatoire !': self.lePos.setText('Obligatoire !') self.lePos.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") if gColor == '' or gColor == 'Obligatoire !': self.leColor.setText('Obligatoire !') self.leColor.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") else: # vérif si champ position est un nombre try: flag = 0 flag = int(gPos) except ValueError: self.lePos.setText(f"{str(gPos)} n'est pas un nombre") self.lePos.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") # si position est un nombre if flag != 0: # si position hors grille if int(gPos) < 0 or int(gPos) > self.data_buttons[ 'buttons_grid']['height'] * self.data_buttons[ 'buttons_grid']['width']: self.lePos.setText(f"{str(gPos)} hors grille") self.lePos.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") else: dictToAppend = { "name": gName, "file": gFile, "position": int(gPos), "r": self.colorSelected.red(), "g": self.colorSelected.green(), "b": self.colorSelected.blue() } # si c'est une modification if self.pbPosToModify != -1: for b in self.data_buttons['buttons']: if b['position'] == self.pbPosToModify: self.data_buttons['buttons'].remove(b) self.data_buttons['buttons'].append(dictToAppend) with open('buttons.json', 'w', encoding='utf-8') as outfile: json.dump(self.data_buttons, outfile, indent=4) self.initButtons() else: # si position déjà prise if int(gPos) in self.positions: self.lePos.setText(f"{str(gPos)} déjà prise") self.lePos.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") else: self.data_buttons['buttons'].append(dictToAppend) with open('buttons.json', 'w', encoding='utf-8') as outfile: json.dump(self.data_buttons, outfile, indent=4) self.initButtons() def delete(self): self.startInitButtons() # positionnement des boutons en fonction des positions du json for ligne in range(self.BtnH): for colonne in range(self.BtnW): if (ligne * self.BtnW) + (colonne + 1) in self.positions: for b in self.data_buttons['buttons']: if b['position'] == (ligne * self.BtnW) + (colonne + 1): pb = QPushButton(b['name'][:9]) pb.setProperty('pbPos', b['position']) pb.setIcon(self.iMinus) # si fond clair, font noire, si sombre, font blanche if (b['r'] * 0.299 + b['g'] * 0.587 + b['b'] * 0.114) > 186: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #000000;" ) else: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #ffffff;" ) self.tableWidget.setCellWidget(ligne, colonne, pb) pb.clicked.connect(self.deleteTw) else: pb = QPushButton('Nouveau') calcPos = self.BtnW * ligne + colonne + 1 pb.setProperty('pbPos', f"nouveau,{calcPos}") pb.clicked.connect(self.add) self.tableWidget.setCellWidget(ligne, colonne, pb) colonne += 1 ligne += 1 self.endInitButtons() def deleteTw(self): pb = self.sender() pbPos = pb.property('pbPos') for b in self.data_buttons['buttons']: if b['position'] == pbPos: self.data_buttons['buttons'].remove(b) with open('buttons.json', 'w', encoding='utf-8') as outfile: json.dump(self.data_buttons, outfile, indent=4) self.delete() def editBtn(self): self.startInitButtons() # positionnement des boutons en fonction des positions du json for ligne in range(self.BtnH): for colonne in range(self.BtnW): if (ligne * self.BtnW) + (colonne + 1) in self.positions: for b in self.data_buttons['buttons']: if b['position'] == (ligne * self.BtnW) + (colonne + 1): pb = QPushButton(b['name'][:9]) pb.setProperty('pbPos', b['position']) pb.setIcon(self.iEdit) # si fond clair, font noire, si sombre, font blanche if (b['r'] * 0.299 + b['g'] * 0.587 + b['b'] * 0.114) > 186: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #000000;" ) else: pb.setStyleSheet( f"background-color: rgb({b['r']},{b['g']},{b['b']}); color: #ffffff;" ) self.tableWidget.setCellWidget(ligne, colonne, pb) pb.clicked.connect(self.editTw) else: pb = QPushButton('Nouveau') pb.setIcon(self.iEdit) calcPos = self.BtnW * ligne + colonne + 1 pb.setProperty('pbPos', f"nouveau,{calcPos}") pb.clicked.connect(self.add) self.tableWidget.setCellWidget(ligne, colonne, pb) colonne += 1 ligne += 1 self.endInitButtons() def editTw(self): pb = self.sender() pbPos = pb.property('pbPos') self.pbPosToModify = pbPos self.add() for b in self.data_buttons['buttons']: if b['position'] == pbPos: self.leName.setText(b['name']) self.leFile.setText(b['file']) self.lePos.setText(str(b['position'])) self.cdColorPicker.setCurrentColor( QColor(b['r'], b['g'], b['b'])) def settings(self): self.tableWidget.clear() self.tableWidget.clearSpans() self.tableWidget.setColumnWidth(2, 100) self.cdColorPicker.setVisible(False) self.tableWidget.setColumnCount(2) self.tableWidget.setRowCount(4) self.tableWidget.horizontalHeader().setSectionResizeMode( 0, QHeaderView.Stretch) self.tableWidget.horizontalHeader().hide() # bouton validation pb = QPushButton('Valider') self.tableWidget.setCellWidget(3, 0, pb) pb.clicked.connect(self.saveSettings) # bouton annulation pb = QPushButton('Annuler') self.tableWidget.setCellWidget(3, 1, pb) pb.clicked.connect(self.refreshUI) # parameters self.tableWidget.setSpan(0, 0, 1, 2) self.lAlert = QLabel("La modification de ces valeurs entrainera la " "modification de position des boutons") self.lAlert.setStyleSheet("font-weight: bold;") self.tableWidget.setCellWidget(0, 0, self.lAlert) self.tableWidget.setCellWidget(1, 0, QLabel('Nombre de boutons en Hauteur')) self.leH = QLineEdit(str(self.data_buttons['buttons_grid']['height'])) self.tableWidget.setCellWidget(1, 1, self.leH) self.tableWidget.setCellWidget(2, 0, QLabel('Nombre de boutons en Largeur')) self.leW = QLineEdit(str(self.data_buttons['buttons_grid']['width'])) self.tableWidget.setCellWidget(2, 1, self.leW) settingsLayout = QVBoxLayout() settingsLayout.setStretch(0, 1) settingsLayout.addWidget(self.tableWidget) self.windowLayout.addLayout(settingsLayout) self.setGeometry(self.left, self.top, 600, 300) def saveSettings(self): h = int(self.leH.text()) w = int(self.leW.text()) if h * w < self.max_pos: self.lAlert.setText(f"Le bouton à la position {str(self.max_pos)} " f"est en dehors de la grille {h} x {w}") self.lAlert.setStyleSheet( "color: rgb(255,0,0); font-weight: bold;") else: self.data_buttons['buttons_grid']['height'] = int(self.leH.text()) self.data_buttons['buttons_grid']['width'] = int(self.leW.text()) with open('buttons.json', 'w', encoding='utf-8') as outfile: json.dump(self.data_buttons, outfile, indent=4) self.initButtons() def refreshUI(self): self.initButtons() def browseMedia(self): self.openFile = QFileDialog.getOpenFileName( self, "Sélectionner un média...", "./sons", "Image Files (*.avi *.mp3 *.wav)") filenameSplitted = self.openFile[0].split('/') self.leFile.setText(filenameSplitted[-1]) def colorChanged(self): self.colorSelected = self.cdColorPicker.currentColor() self.leColor.setText( str(self.colorSelected.red()) + "," + str(self.colorSelected.green()) + "," + str(self.colorSelected.blue()))