Commit 579b6770 authored by dmMaze's avatar dmMaze
Browse files

resolve duplicate preset name

parent c4dfb9ef
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -661,6 +661,8 @@ class FontFormatPanel(Widget):
    def on_load_preset(self, preset: FontFormat):
        self.global_format = preset
        if self.textblk_item is not None:
            if self.textblk_item.isEditing():
                self.textblk_item.endEdit()
            self.set_textblk_item(None)
                
        self.set_active_format(preset)
+1 −0
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ class MainWindow(QMainWindow):
        self.presetPanel = PresetPanel(self)
        self.presetPanel.setParent(self)
        self.presetPanel.setWindowFlags(Qt.WindowType.Window)
        self.presetPanel.global_fmt_str = self.textPanel.formatpanel.global_fontfmt_str
        self.presetPanel.hide()
        self.presetPanel.hide_signal.connect(self.save_config)
        self.presetPanel.load_preset.connect(self.textPanel.formatpanel.on_load_preset)
+30 −12
Original line number Diff line number Diff line
from qtpy.QtWidgets import QMenu, QAbstractItemView, QListWidget, QListWidgetItem, QWidget, QGridLayout, QPushButton, QVBoxLayout
from qtpy.QtCore import Qt, Signal
from qtpy.QtCore import Qt, Signal, QModelIndex, QEvent, QObject
from qtpy.QtGui import QContextMenuEvent, QShowEvent, QHideEvent
from typing import List, Union

@@ -25,21 +25,23 @@ class PresetListWidget(QListWidget):
        super().__init__(parent)
        self.presets = {}
        self.current_fmt = {}
        self.last_editing_item = None
        self.default_preset_name = self.tr('preset')
        self.itemDoubleClicked.connect(self.on_edit_item)
        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
        self.itemDelegate().commitData.connect(self.on_commit_data)

    def on_edit_item(self):
        self.last_editing_item = self.currentItem()

    def on_commit_data(self, editor: QWidget):
        item = self.last_editing_item
        text = editor.text()
        item = self.findItems(text, Qt.MatchFlag.MatchExactly)

        # remove duplicates
        if len(item) > 1:
            preset = self.presets[text]
            self.removeItems(item[:-1])
            self.presets[text] = preset
        founds = self.findItems(text, Qt.MatchFlag.MatchExactly)
        
        item = item[-1]
        if len(founds) > 1:
            text = self.handle_duplicate_name(text)
            item.setText(text)
        mutate_dict_key(self.presets, self.row(item), text)

    def removeItems(self, items: List[QListWidgetItem]):
@@ -64,15 +66,30 @@ class PresetListWidget(QListWidget):

        return super().contextMenuEvent(e)

    def handle_duplicate_name(self, name: str, preset_num=0) -> str:
        dd_name = name
        while True:
            if not dd_name in self.presets:
                break
            preset_num += 1
            dd_name = name + '_' + str(preset_num).zfill(3)
        return dd_name

    def add_new_preset(self, preset_name: str = None):
        if preset_name is None:
            preset_name = self.default_preset_name + '_' + str(self.count()).zfill(3)
            preset_num = self.count() + 1
            preset_name = self.default_preset_name + '_' + str(preset_num).zfill(3)
            preset_name = self.handle_duplicate_name(preset_name)
        item = QListWidgetItem(preset_name)
        item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable)
        self.addItem(item)
        self.presets[preset_name] = self.current_fmt.copy()
        self.editItem(item)

    def editItem(self, item: QListWidgetItem) -> None:
        self.last_editing_item = item
        return super().editItem(item)


class PresetPanel(Widget):

@@ -95,7 +112,7 @@ class PresetPanel(Widget):
        self.exit_btn.clicked.connect(self.on_exit_clicked)

        self.editing_item: QListWidgetItem = None
        
        self.global_fmt_str = ''
        
        layout = QGridLayout()
        layout.addWidget(self.new_btn, 0, 0)
@@ -126,6 +143,7 @@ class PresetPanel(Widget):
            preset = self.list_widget.presets[sel.text()]
            preset = FontFormat(**preset)
            self.list_widget.current_fmt = vars(preset)
            self.new_btn.setToolTip(self.new_tip + self.global_fmt_str)
            self.load_preset.emit(preset)

    def on_exit_clicked(self):
+0 −1
Original line number Diff line number Diff line
@@ -383,7 +383,6 @@ class TextBlkItem(QGraphicsTextItem):
    def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget) -> None:
        br = self.boundingRect()
        painter.save()

        if self.background_pixmap is not None:
            painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform)
            painter.drawPixmap(br.toRect(), self.background_pixmap)