consolidator

Форк
0
/
TodoWindow.py 
145 строк · 6.3 Кб
1
import os
2
import re
3
import sys
4
from PySide6.QtCore import (Slot,QRect)
5
from PySide6.QtWidgets import (
6
    QDialog,
7
    QDialogButtonBox,
8
    QTableWidget,
9
    QTableWidgetItem,
10
    QCheckBox,
11
    QPushButton, 
12
    QMessageBox,
13
    QLabel,
14
    QLineEdit
15
    )
16
from PySide6.QtUiTools import QUiLoader
17
import pandas as pd
18
from ModuleMaker import ModuleMaker
19
import codecs
20

21
class TodoWindow(QDialog):
22

23
    def __init__(self,data:pd.DataFrame) -> None:
24
        super().__init__()
25
        loader = QUiLoader()
26
        try:
27
            self.cur_path = sys._MEIPASS
28
        except:
29
            self.cur_path = os.path.dirname(os.path.realpath(__file__))
30
        self.TodoDialog:QDialog = loader.load(f"{self.cur_path}\\TodoWindow.ui", None)
31
        self.data:pd.DataFrame = data
32

33
        self.new_modules = []
34
        self.deleted_modules = []
35

36
        # init components
37
        self.buttonBox:QDialogButtonBox = self.TodoDialog.buttonBox
38
        self.mainTable:QTableWidget = self.TodoDialog.mainTable
39
        self.delModuleButton:QPushButton = self.TodoDialog.delModuleButton
40
        self.newModuleButton:QPushButton = self.TodoDialog.newModuleButton
41
        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setDisabled(True)
42

43
        # init handlers
44
        self.newModuleButton.clicked.connect(self.make_new_model)
45
        self.delModuleButton.clicked.connect(self.unbind_model)
46

47
        # init table data
48
        self.mainTable.setColumnWidth(0,400)
49
        self.refresh_table()
50

51

52
    def refresh_table(self):
53
        try:
54
            self.mainTable.clear()
55
            self.mainTable.setRowCount(0)
56
            for r,record in self.data.iterrows():
57
                self.mainTable.setRowCount(self.mainTable.rowCount()+1)
58
                self.mainTable.setItem(r,0,QTableWidgetItem(record["key"]))
59
                self.mainTable.setItem(r,1,QTableWidgetItem(record["module"]))           
60
                chb = QCheckBox(self.mainTable)
61
                chb.setProperty("key",record["key"])
62
                chb.setChecked(record["done"])
63
                chb.stateChanged.connect(self.item_state_changed)
64
                self.mainTable.setCellWidget(r,2,chb) 
65
        except: raise 
66

67
    def show(self)->int:
68
        result = self.TodoDialog.exec()
69
        if result==1:
70
            if self.deleted_modules.__len__()>0:
71
                for f_ in self.deleted_modules:
72
                    f:str = f_
73
                    os.rename(f,f.replace(".py","-deleted.py"))
74
        else:
75
            if self.new_modules.__len__()>0:
76
                for f in self.new_modules: os.remove(f)
77
        return result
78

79
    @Slot() # декоратор нужен для того, чтобы получить доступ к методу sender()
80
    def item_state_changed(self):
81
        chb:QCheckBox = self.sender()
82
        key:str=chb.property("key")
83
        checked = chb.isChecked()
84
        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setDisabled(False)
85
        self.data.loc[self.data["key"]==key,"done"]=checked
86
        
87
    def make_new_model(self):
88
        try:
89
            dialog=QDialog(self.TodoDialog)
90
            dialog.setWindowTitle("Новый модуль")
91
            dialog.setFixedSize(670,150)
92
            label1= QLabel(dialog)
93
            label2= QLabel(dialog)
94
            moduleName = QLineEdit(dialog)
95
            handlerName = QLineEdit(dialog)
96
            okButton = QPushButton(dialog)
97
            label1.setText("Модуль")
98
            label2.setText("Обработчик")
99
            okButton.setText("Ok")
100
            label1.setGeometry(QRect(10, 10, 51, 16))
101
            label2.setGeometry(QRect(10, 60, 81, 16))            
102
            moduleName.setGeometry(QRect( 10, 30, 651, 22))
103
            handlerName.setGeometry(QRect(10, 80, 651, 22))
104
            okButton.setGeometry(QRect(20,120,60,22))
105
            okButton.clicked.connect(dialog.accept)           
106
            if dialog.exec()==1:
107
                
108
                mName = moduleName.text() #.encode("utf-8").decode("utf-8")
109
                hName = handlerName.text()
110
                mm:list =re.findall("(?!([a-zA-Z_0-9]+)).",hName)
111
                if mm.__len__()>0 : raise Exception("Имя обработчика должно содержать a-zA-Z_0-9")
112
                if mName is None or mName.__len__()==0: raise Exception("Имя модуля должно содержать хоть один символ")
113
                hPath = f"{self.cur_path}\\handlers2\\{hName}.py"
114
                if os.path.isfile(hPath): raise Exception(f"Обработчик '{hPath}' уже существует.")
115
                mess = ModuleMaker.make_from_file(f"{self.cur_path}\\handlers2\\module_pattern.py",mName,hName,f"{self.cur_path}\\handlers2")
116
                print(mess)
117
                self.new_modules.append(f"{self.cur_path}\\handlers2\\{hName}.py")
118
                self.data.loc[len(self.data)] = [mName,hName,False]
119
                r = self.mainTable.rowCount()
120
                self.mainTable.setRowCount(r+1)
121
                self.mainTable.setItem(r,0,QTableWidgetItem(mName))
122
                self.mainTable.setItem(r,1,QTableWidgetItem(hName))           
123
                chb = QCheckBox(self.mainTable)
124
                chb.setProperty("key",mName)
125
                chb.setChecked(False)
126
                chb.stateChanged.connect(self.item_state_changed)
127
                self.mainTable.setCellWidget(r,2,chb)
128
                self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setDisabled(False)
129
        except: raise
130
        
131
    def unbind_model(self):
132
        try:
133
            key = self.mainTable.selectedItems()[0].data(0)
134
            hName = self.mainTable.selectedItems()[1].data(0)
135
            result = QMessageBox.warning(self.TodoDialog, "Удаление модуля",
136
                f"Вы действительно хотите отвязать обработчик от модуля <b>'{key}'</b>?",
137
                QMessageBox.Ok | QMessageBox.Cancel,
138
                QMessageBox.Cancel)
139
            if result==QMessageBox.Ok:
140
                self.deleted_modules.append(f"{self.cur_path}\\handlers2\\{hName}.py")
141
                self.data.drop(self.data[self.data.key==key].index,inplace=True)
142
                self.refresh_table()
143
                self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setDisabled(False)
144
                
145
        except: raise
146
    
147
    
148

149
    
150

151

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.