classify_ui_context.py 5.3 KB
Newer Older
D
dongshuilong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
import os

from PyQt5 import QtCore, QtWidgets
from mod import image_list_manager as imglistmgr
from mod import utils
from mod import ui_addclassifydialog
from mod import ui_renameclassifydialog


class ClassifyUiContext(QtCore.QObject):
    # 分类界面相关业务
    selected = QtCore.pyqtSignal(str)  # 选择分类信号

    def __init__(self, ui: QtWidgets.QListView, parent: QtWidgets.QMainWindow,
                 image_list_mgr: imglistmgr.ImageListManager):
        super(ClassifyUiContext, self).__init__()
        self.__ui = ui
        self.__parent = parent
        self.__imageListMgr = image_list_mgr
        self.__menu = QtWidgets.QMenu()
        self.__initMenu()
        self.__initUi()
        self.__connectSignal()

    @property
    def ui(self):
        return self.__ui

    @property
    def parent(self):
        return self.__parent

    @property
    def imageListManager(self):
        return self.__imageListMgr

    @property
    def menu(self):
        return self.__menu

    def __initUi(self):
        """初始化分类界面"""
        self.__ui.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

    def __connectSignal(self):
        """连接信号"""
        self.__ui.clicked.connect(self.uiClicked)
        self.__ui.doubleClicked.connect(self.uiDoubleClicked)

    def __initMenu(self):
        """初始化分类界面菜单"""
        utils.setMenu(self.__menu, "添加分类", self.addClassify)
        utils.setMenu(self.__menu, "移除分类", self.removeClassify)
        utils.setMenu(self.__menu, "重命名分类", self.renemeClassify)

        self.__ui.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.__ui.customContextMenuRequested.connect(self.__showMenu)

    def __showMenu(self, pos):
        """显示分类界面菜单"""
        if len(self.__imageListMgr.filePath) > 0:
            self.__menu.exec_(self.__ui.mapToGlobal(pos))

    def setClassifyList(self, classify_list):
        """设置分类列表"""
        list_model = QtCore.QStringListModel(classify_list)
        self.__ui.setModel(list_model)

    def uiClicked(self, index):
        """分类列表点击"""
        if not self.__ui.currentIndex().isValid():
            return
        txt = index.data()
        self.selected.emit(txt)

    def uiDoubleClicked(self, index):
        """分类列表双击"""
        if not self.__ui.currentIndex().isValid():
            return
        ole_name = index.data()
        dlg = QtWidgets.QDialog(parent=self.parent)
        ui = ui_renameclassifydialog.Ui_RenameClassifyDialog()
        ui.setupUi(dlg)
        ui.oldNameLineEdit.setText(ole_name)
        result = dlg.exec_()
        new_name = ui.newNameLineEdit.text()
        if result == QtWidgets.QDialog.Accepted:
            mgr_result = self.__imageListMgr.renameClassify(ole_name, new_name)
            if not mgr_result:
                QtWidgets.QMessageBox.warning(self.parent, "重命名分类", "重命名分类错误")
            else:
                self.setClassifyList(self.__imageListMgr.classifyList)
                self.__imageListMgr.writeFile()

    def addClassify(self):
        """添加分类"""
        if not os.path.exists(self.__imageListMgr.filePath):
            QtWidgets.QMessageBox.information(self.__parent, "提示",
                                              "请先打开正确的图像库")
            return
        dlg = QtWidgets.QDialog(parent=self.parent)
        ui = ui_addclassifydialog.Ui_AddClassifyDialog()
        ui.setupUi(dlg)
        result = dlg.exec_()
        txt = ui.lineEdit.text()
        if result == QtWidgets.QDialog.Accepted:
            mgr_result = self.__imageListMgr.addClassify(txt)
            if not mgr_result:
                QtWidgets.QMessageBox.warning(self.parent, "添加分类", "添加分类错误")
            else:
                self.setClassifyList(self.__imageListMgr.classifyList)

    def removeClassify(self):
        """移除分类"""
        if not os.path.exists(self.__imageListMgr.filePath):
            QtWidgets.QMessageBox.information(self.__parent, "提示",
                                              "请先打开正确的图像库")
            return
        if not self.__ui.currentIndex().isValid():
            return
        classify = self.__ui.currentIndex().data()
        result = QtWidgets.QMessageBox.information(
            self.parent,
            "移除分类",
            "确定移除分类: {}".format(classify),
            buttons=QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,
            defaultButton=QtWidgets.QMessageBox.Cancel)
        if result == QtWidgets.QMessageBox.Ok:
            if len(self.__imageListMgr.imageList(classify)) > 0:
                QtWidgets.QMessageBox.warning(self.parent, "移除分类",
                                              "分类下存在图片,请先移除图片")
            else:
                self.__imageListMgr.removeClassify(classify)
D
dongshuilong 已提交
134
                self.setClassifyList(self.__imageListMgr.classifyList)
D
dongshuilong 已提交
135 136 137 138 139 140 141 142 143 144

    def renemeClassify(self):
        """重命名分类"""
        idx = self.__ui.currentIndex()
        if idx.isValid():
            self.uiDoubleClicked(idx)

    def searchClassify(self, classify):
        """查找分类"""
        self.setClassifyList(self.__imageListMgr.findLikeClassify(classify))