프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / StreamlineDialog.py @ 08433949

이력 | 보기 | 이력해설 | 다운로드 (11.6 KB)

1
# coding: utf-8
2
""" This is Streamline dialog module """
3

    
4
import os
5
import sys
6
from functools import partial
7
from PyQt5.QtCore import *
8
from PyQt5.QtGui import *
9
from PyQt5.QtWidgets import *
10

    
11
from AppDocData import AppDocData, MessageType
12

    
13
from UI.Streamline_UI import Ui_StreamlineDialog
14

    
15

    
16
class FromToModel(QStandardItemModel):
17
    def __init__(self, parent=None, *args):
18
        QStandardItemModel.__init__(self, parent, *args)
19

    
20
        self._need_to_pick_backcolor = QColor(255, 0, 255)
21
        self._target_drawing_backcolor = QColor(0, 255, 0)
22
        self._new_data_backcolor = Qt.yellow
23

    
24
    def data(self, index, role):
25
        if not index.isValid():
26
            return None
27

    
28
        if role in [Qt.BackgroundRole]:
29
            item = super(FromToModel, self).item(index.row(), index.column())
30

    
31
            if index.column() in [1, 2]:
32
                uid = item.data(Qt.UserRole)
33
                if not uid:
34
                    return self._need_to_pick_backcolor
35
                elif hasattr(item, '_new') and item._new:
36
                    return self._new_data_backcolor
37
            elif index.column() in [0]:
38
                app_doc_data = AppDocData.instance()
39
                uid = item.data(Qt.UserRole)
40
                if uid and uid == app_doc_data.activeDrawing.UID:
41
                    return self._target_drawing_backcolor
42

    
43
        return super(FromToModel, self).data(index, role)
44

    
45

    
46
class FromToWidget(QWidget):
47
    def __init__(self, parent, column: int, from_to: str = ''):
48
        QWidget.__init__(self, parent)
49
        self._column = column
50

    
51
        layout = QHBoxLayout()
52
        layout.setAlignment(Qt.AlignRight)
53
        layout.setContentsMargins(0, 0, 0, 0)
54
        pick = QToolButton(self)
55
        pick.setIcon(QIcon(':/newPrefix/OK.svg'))
56
        pick.setMaximumHeight(32)
57
        pick.setMaximumWidth(32)
58
        pick.clicked.connect(partial(parent.parent().parent().parent().on_select_comp, self._column))
59
        layout.addWidget(pick)
60
        self.setLayout(layout)
61

    
62

    
63
class QStreamlineDialog(QDialog):
64
    """ This Streamline dialog class """
65

    
66
    def __init__(self, parent):
67
        QDialog.__init__(self, parent)
68
        self._from_to_widgets = {}
69
        self._from_to_models = {}
70

    
71
        self.ui = Ui_StreamlineDialog()
72
        self.ui.setupUi(self)
73
        self.ui.splitterHorizontal.setSizes([200, 700])
74

    
75
        self.fill_hmb_data()
76
        self.ui.tableViewStreamNo.selectionModel().selectionChanged.connect(self.on_selection_changed)
77

    
78
        self.ui.toolButtonAddFromTo.clicked.connect(self.on_add_new_from_to)
79
        self.ui.toolButtonDelFromTo.clicked.connect(self.on_del_from_to)
80
        self.ui.pushButtonSaveFromTo.clicked.connect(self.on_save_from_to)
81

    
82
        #self.ui.buttonBox.button(QDialogButtonBox.Ok).setIcon(QIcon(':/newPrefix/OK.svg'))
83
        self.ui.buttonBox.button(QDialogButtonBox.Close).setIcon(QIcon(':/newPrefix/Remove.svg'))
84

    
85
        self.ui.tableViewFromTo.clicked.connect(self.listCellClicked)
86

    
87
    def listCellClicked(self, index):
88
        from HighlightCommand import HighlightCommand
89

    
90
        if index.isValid():
91
            col = index.column()
92
            row = index.row()
93
        else:
94
            return
95

    
96
        if not (col == 1 or col == 2):
97
            return
98
            
99
        self.ui.tableViewFromTo.clearSelection()
100
        HighlightCommand(self.parent().graphicsView).execute(index.model().item(row, col).text())
101

    
102
    def fill_hmb_data(self):
103
        """load hmb data and fill table view"""
104
        import uuid
105

    
106
        hmbs = AppDocData.get_hmb_data(None)
107
        if not hmbs:
108
            return
109

    
110
        model = QStandardItemModel()
111
        header = ['UID', 'Stream No']
112

    
113
        for hmb in hmbs:
114
            UID = hmb.uid
115
            STREAM_NO = hmb.stream_no
116
            items = [QStandardItem(UID), QStandardItem(STREAM_NO)]
117

    
118
            for data in sorted(hmb.data, key=lambda param: param.index):
119
                if hmbs.index(hmb) == 0:
120
                    header.append(f"{data.name}\n({data.unit})" if data.unit else f"{data.name}")
121
                items.append(QStandardItem(data.value))
122
            model.appendRow(items)
123

    
124
        model.setHorizontalHeaderLabels(header)
125

    
126
        self.ui.tableViewStreamNo.setModel(model)
127
        self.ui.tableViewStreamNo.resizeColumnsToContents()
128
        self.ui.tableViewStreamNo.setEditTriggers(QAbstractItemView.NoEditTriggers)
129
        for col in range(self.ui.tableViewStreamNo.model().columnCount()):
130
            self.ui.tableViewStreamNo.setColumnHidden(col, col != 1)  # hide all columns except index is 1
131

    
132
    def on_selection_changed(self, selection):
133
        """show stream line from, to related to selected hmb"""
134

    
135
        if selection.indexes():
136
            row = selection.indexes()[0].row()
137
            stream_no = self.ui.tableViewStreamNo.model().item(row, 1).text()
138

    
139
            if stream_no not in self._from_to_models:
140
                model = FromToModel()
141
                self._from_to_models[stream_no] = model
142
                self.ui.tableViewFromTo.setModel(model)
143

    
144
                app_doc_data = AppDocData.instance()
145
                rows = app_doc_data.get_stream_from_to(stream_no=stream_no)
146
                if rows:
147
                    for row_ in rows:
148
                        from_ = row_['From_Component_UID']
149
                        from_item = QStandardItem(from_)
150
                        from_item.setData(row_['From_Component_UID'], Qt.UserRole)
151

    
152
                        to_ = row_['To_Component_UID']
153
                        to_item = QStandardItem(to_)
154
                        to_item.setData(row_['To_Component_UID'], Qt.UserRole)
155

    
156
                        drawing = row_['Name']
157
                        drawing_item = QStandardItem(drawing)
158
                        drawing_item.setData(row_['Drawing_UID'], Qt.UserRole)
159

    
160
                        items = [drawing_item, from_item, to_item]
161
                        model.appendRow(items)
162

    
163
                model.setHorizontalHeaderLabels(['Drawing No', 'From', 'To'])
164
            else:
165
                model = self._from_to_models[stream_no]
166

    
167
            self.ui.tableViewFromTo.setModel(model)
168
            self.ui.tableViewFromTo.resizeColumnsToContents()
169

    
170
            self._from_to_widgets.clear()
171
            for row_ in range(self.ui.tableViewFromTo.model().rowCount()):
172
                i = self.ui.tableViewFromTo.model().index(row_, 1)
173
                data = self.ui.tableViewFromTo.model().data(i, Qt.DisplayRole)
174
                from_button = FromToWidget(self.ui.tableViewFromTo, 1, data)
175
                i = self.ui.tableViewFromTo.model().index(row_, 1)
176
                self.ui.tableViewFromTo.setIndexWidget(i, from_button)
177
                self._from_to_widgets[from_button] = (row_, 1)
178

    
179
                i = self.ui.tableViewFromTo.model().index(row_, 2)
180
                data = self.ui.tableViewFromTo.model().data(i, Qt.DisplayRole)
181
                to_button = FromToWidget(self.ui.tableViewFromTo, 2, data)
182
                self.ui.tableViewFromTo.setIndexWidget(i, to_button)
183
                self._from_to_widgets[to_button] = (row_, 2)
184

    
185
            """Properties"""
186
            if not self.ui.tableViewProperties.model():
187
                model_property = QStandardItemModel()
188
                self.ui.tableViewProperties.setModel(model_property)
189

    
190
            model_property = self.ui.tableViewProperties.model()
191
            model_property.clear()
192

    
193
            for col in range(self.ui.tableViewStreamNo.model().columnCount()):
194
                value = self.ui.tableViewStreamNo.model().item(row, col).text()
195
                property_ = self.ui.tableViewStreamNo.model().headerData(col, Qt.Horizontal)
196
                items = [QStandardItem(property_), QStandardItem(value)]
197
                model_property.appendRow(items)
198

    
199
            model_property.setHorizontalHeaderLabels(['Property', 'Value'])
200
            self.ui.tableViewProperties.setModel(model_property)
201
            self.ui.tableViewFromTo.horizontalHeader().setResizeMode(QHeaderView.Stretch)
202
            self.ui.tableViewProperties.resizeColumnsToContents()
203
            self.ui.tableViewProperties.setEditTriggers(QAbstractItemView.NoEditTriggers)
204
            self.ui.tableViewProperties.setRowHidden(0, True)  # hide all columns except index is 1
205
            self.ui.tableViewProperties.verticalHeader().setVisible(False)
206

    
207
    def on_add_new_from_to(self):
208
        """add a new from/to record"""
209
        if not self.ui.tableViewFromTo.model():
210
            return
211
        rows = self.ui.tableViewFromTo.model().rowCount()
212
        index = self.ui.tableViewFromTo.model().index(rows, 0)
213

    
214
        app_doc_data = AppDocData.instance()
215
        drawing_item = QStandardItem(app_doc_data.activeDrawing.name)
216
        drawing_item.setData(app_doc_data.activeDrawing.UID, Qt.UserRole)
217

    
218
        self.ui.tableViewFromTo.model().insertRow(rows, [drawing_item, QStandardItem(), QStandardItem()])
219
        self.ui.tableViewFromTo.selectionModel().setCurrentIndex(index, QItemSelectionModel.NoUpdate)
220

    
221
        from_button = FromToWidget(self.ui.tableViewFromTo, 1)
222
        i = self.ui.tableViewFromTo.model().index(rows, 1)
223
        self.ui.tableViewFromTo.setIndexWidget(i, from_button)
224
        self._from_to_widgets[from_button] = (i.row(), 1)
225

    
226
        to_button = FromToWidget(self.ui.tableViewFromTo, 2)
227
        i = self.ui.tableViewFromTo.model().index(rows, 2)
228
        self.ui.tableViewFromTo.setIndexWidget(i, to_button)
229
        self._from_to_widgets[to_button] = (i.row(), 2)
230

    
231
    def on_del_from_to(self):
232
        """delete selected from/to"""
233
        current = self.ui.tableViewFromTo.selectionModel().currentIndex()
234
        self.ui.tableViewFromTo.model().removeRow(current.row())
235

    
236
    def on_select_comp(self, column: int):
237
        """select from or to component"""
238
        from App import App
239
        from Commands.SelectCompCommand import SelectCompCommand
240

    
241
        def on_success_select_comp(selected):
242
            current = self.ui.tableViewFromTo.selectionModel().currentIndex()
243
            row = current.row()
244
            column = current.column()
245
            item = self.ui.tableViewFromTo.model().item(row, column)
246
            item.setText(str(selected))
247
            item.setData(str(selected.uid), Qt.UserRole)
248
            item._new = True
249
            App.mainWnd().graphicsView.useDefaultCommand()
250

    
251
        # save column index
252
        if self.sender().parent() in self._from_to_widgets:
253
            row, column = self._from_to_widgets[self.sender().parent()]
254
            self.ui.tableViewFromTo.setCurrentIndex(self.ui.tableViewFromTo.model().index(row, column))
255

    
256
            app_doc_data = AppDocData.instance()
257
            drawing_item = self.ui.tableViewFromTo.model().item(row, 0)
258
            if drawing_item.data(Qt.UserRole) != app_doc_data.activeDrawing.UID:
259
                return
260
        # up to here
261

    
262
        cmd = SelectCompCommand(App.mainWnd().graphicsView)
263
        cmd.onSuccess.connect(on_success_select_comp)
264
        App.mainWnd().graphicsView.command = cmd
265

    
266
    def on_save_from_to(self):
267
        """save current from/to data"""
268
        row = self.ui.tableViewStreamNo.selectionModel().currentIndex().row()
269
        stream_no = self.ui.tableViewStreamNo.model().item(row, 1).text()
270

    
271
        from_to_data = []
272

    
273
        model = self.ui.tableViewFromTo.model()
274
        for row in range(model.rowCount()):
275
            drawing_ = model.item(row, 0)
276
            drawing_uid = drawing_.data(Qt.UserRole)
277
            from_ = model.item(row, 1)
278
            from_uid = from_.data(Qt.UserRole)
279
            to_ = model.item(row, 2)
280
            to_uid = to_.data(Qt.UserRole)
281

    
282
            from_to_data.append((drawing_uid, from_uid, to_uid, stream_no))
283

    
284
        AppDocData.save_stream_line_data([stream_no, from_to_data])
285

    
286
    def accept(self):
287
        QDialog.accept(self)
288

    
289
    def reject(self):
290
        QDialog.reject(self)