프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

hytos / DTI_PID / DTI_PID / ItemTreeWidget.py @ 990644d9

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

1
# coding: utf-8
2
""" This is item tree widget module """
3

    
4
import os
5
import re
6
import sys
7

    
8
try:
9
    from PyQt5.QtCore import *
10
    from PyQt5.QtGui import *
11
    from PyQt5.QtWidgets import *
12
except ImportError:
13
    try:
14
        from PyQt4.QtCore import *
15
        from PyQt4.QtGui import *
16
    except ImportError:
17
        raise ImportError("ImageViewerQt: Requires PyQt5 or PyQt4.")
18

    
19
from EngineeringAbstractItem import QEngineeringAbstractItem
20
from SymbolSvgItem import SymbolSvgItem
21
from EngineeringTextItem import QEngineeringTextItem
22
from EngineeringNoteItem import QEngineeringNoteItem
23
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem
24
from EngineeringEquipmentItem import QEngineeringEquipmentItem
25
from EngineeringInstrumentItem import QEngineeringInstrumentItem
26
from QEngineeringTrimLineNoTextItem import QEngineeringTrimLineNoTextItem
27
from EngineeringUnknownItem import QEngineeringUnknownItem
28
from EngineeringErrorItem import QEngineeringErrorItem
29
from AppDocData import AppDocData
30
from Drawing import Drawing
31

    
32
class CustomTreeWidgetItem(QTreeWidgetItem):
33
    def __init__(self, *args, **kwargs):
34
        super(CustomTreeWidgetItem, self).__init__(*args, **kwargs)
35

    
36
    def setData(self, column, role, value):
37
        if role == Qt.EditRole:
38
            pass
39
        elif role == Qt.CheckStateRole:
40
            if self.treeWidget() is not None:
41
                state = Qt.CheckState.Unchecked if value is 0 else Qt.CheckState.Checked
42
                self.treeWidget().checkBoxToggled.emit(self, state)
43

    
44
        super(CustomTreeWidgetItem, self).setData(column, role, value)
45

    
46
class QItemTreeWidget(QTreeWidget):
47
    """ This is item tree widget """
48
    TREE_DATA_ROLE = Qt.UserRole
49

    
50
    #Add Signal
51
    singleClicked = pyqtSignal(SymbolSvgItem)
52
    noteNoSingleClicked = pyqtSignal(str, dict)
53
    lineNoSingleClicked = pyqtSignal(QEngineeringAbstractItem)
54
    drawingClicked = pyqtSignal(Drawing)
55
    checkBoxToggled = pyqtSignal(QTreeWidgetItem, Qt.CheckState)
56

    
57
    '''
58
        @history    2018.05.11  Jeongwoo    Add Context Menu settings
59
    '''
60
    def __init__(self, imageViewer):
61
        QTreeWidget.__init__(self)
62

    
63
        self.checkBoxToggled.connect(self.itemCheckBoxToggled)
64

    
65
        self.itemClicked.connect(self.itemClickEvent)
66
        self.imageViewer = imageViewer
67
        self.scene = imageViewer.scene
68
        self.root = None
69
        self.setContextMenuPolicy(Qt.CustomContextMenu)
70
        self.customContextMenuRequested.connect(self.openContextMenu)
71

    
72
    '''
73
        @brief      delete selected symbol
74
        @author     humkyung
75
        @date       2018.07.20
76
    '''
77
    def keyPressEvent(self, event):
78
        try:
79
            if event.key() == Qt.Key_Delete:
80
                if self.selectedItems():
81
                    for item in self.selectedItems():
82
                        data = item.data(0, self.TREE_DATA_ROLE)
83
                        if data is not None:
84
                            self.imageViewer.scene.removeItem(data)
85

    
86
                            if type(data) is QEngineeringLineNoTextItem:
87
                                self.imageViewer.mainWindow.removedItems['LINE'].append(str(data.uid))
88
                            elif type(data) is QEngineeringInstrumentItem:
89
                                self.imageViewer.mainWindow.removedItems['INST'].append(str(data.uid))
90
                            elif type(data) is QEngineeringEquipmentItem:
91
                                self.imageViewer.mainWindow.removedItems['EQUIP'].append(str(data.uid))
92
                            elif type(data) is QEngineeringNoteItem:
93
                                self.imageViewer.mainWindow.removedItems['NOTE'].append(str(data.uid))
94

    
95
                            item.parent().removeChild(item)
96
                event.accept()
97
            elif event.key() == Qt.Key_Up:
98
                if self.selectedItems():
99
                    item = self.selectedItems()[0]
100
                    aboveItem = self.itemAbove(item)
101
                    if aboveItem is not None:
102
                        self.setCurrentItem(aboveItem)
103
                        self.scrollToItem(aboveItem, QAbstractItemView.EnsureVisible)
104
                        self.itemClickEvent(aboveItem, 0)
105
                event.accept()
106
            elif event.key() == Qt.Key_Down:
107
                if self.selectedItems():
108
                    item = self.selectedItems()[0]
109
                    belowItem = self.itemBelow(item)
110
                    if belowItem is not None:
111
                        self.setCurrentItem(belowItem)
112
                        self.scrollToItem(belowItem, QAbstractItemView.EnsureVisible)
113
                        self.itemClickEvent(belowItem, 0)
114
                event.accept()
115
            else:
116
                event.ignore()
117
        except Exception as ex:
118
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
119
    
120
    '''
121
        @brief      Show Context Menu
122
        @author     Jeongwoo
123
        @date       18.05.11
124
        @history    18.06.14    Jeongwoo    Add item None check
125
                    humkyung 2018.06.27 add menu of run item for selecting line type
126
    '''
127
    def openContextMenu(self, position):
128
        from EngineeringRunItem import QEngineeringRunItem
129

    
130
        indexes = self.selectedIndexes()
131
        itemPosition = self.mapTo(self, position)
132
        item = self.itemAt(itemPosition)
133
        if item is not None:
134
            if item is self.LineNoTreeItem:
135
                menu = QMenu()
136
                explode_action = QAction(self.tr("Explode"))
137
                explode_action.triggered.connect(lambda : self.explode_all_line_nos(item))
138
                menu.addAction(explode_action)
139
                menu.exec_(self.viewport().mapToGlobal(position))
140
            else:
141
                data = item.data(0, self.TREE_DATA_ROLE)
142
                if len(indexes) > 0 and data is not None and issubclass(type(data), QEngineeringLineNoTextItem):
143
                    index = indexes[0]
144
                    menu = QMenu()
145
                    pickColorAction = QAction(self.tr("Select Line Color"))
146
                    pickColorAction.triggered.connect(lambda : self.pickColorClickEvent(item))
147
                    menu.addAction(pickColorAction)
148
                    explode_action = QAction(self.tr("Explode"))
149
                    explode_action.triggered.connect(lambda : self.explode_line_no(item))
150
                    menu.addAction(explode_action)
151
                    menu.exec_(self.viewport().mapToGlobal(position))
152
                elif len(indexes) > 0 and data is not None and issubclass(type(data), QEngineeringRunItem):
153
                    index = indexes[0]
154
                    menu = QMenu()
155
                    lineTypeAction = QAction(self.tr("Select Line Type"))
156
                    lineTypeAction.triggered.connect(lambda : self.lineTypeClickEvent(item))
157
                    menu.addAction(lineTypeAction)
158
                    explode_action = QAction(self.tr("Explode"))
159
                    explode_action.triggered.connect(lambda : self.explode_line_run(item))
160
                    menu.addAction(explode_action)
161
                    menu.exec_(self.viewport().mapToGlobal(position))
162

    
163
    '''
164
        @brief      Pick Color for Line No
165
        @author     Jeongwoo
166
        @date       18.05.11
167
        @history    18.05.14    Jeongwoo    Change method to change color by changeTreeWidgetItemColorRecursively()
168
    '''
169
    def pickColorClickEvent(self, lineNoTreeWidgetItem):
170
        color = QColorDialog.getColor() # Dialog returns QColor
171
        
172
        if color is not None:
173
            lineNoTreeWidgetItem.setForeground(0, QBrush(color))
174
            lineNoTreeWidgetItem.setFont(0, lineNoTreeWidgetItem.font(0))
175
            lineNoItem = lineNoTreeWidgetItem.data(0, self.TREE_DATA_ROLE)
176
            if lineNoItem:
177
                lineNoItem.change_color(color.name())
178
                lineNoItem.setColor(color.name())
179
                connectedItems = lineNoItem.getConnectedItems()
180
                if connectedItems is not None:
181
                    for connectedItem in connectedItems:
182
                        connectedItem.setColor(color.name())
183
                    self.changeTreeWidgetItemColorRecursively(lineNoTreeWidgetItem, color)
184

    
185
    def explode_line_run(self, tree_widget_item):
186
        """ explode line run """
187

    
188
        try:
189
            line_run = tree_widget_item.data(0, self.TREE_DATA_ROLE)
190
            if line_run:
191
                for item in line_run.items:
192
                    if issubclass(type(item), SymbolSvgItem): self.addTreeItem(self.SymbolsTreeItem, item)
193

    
194
                for i in reversed(range(tree_widget_item.childCount())):
195
                    tree_widget_item.takeChild(i)
196

    
197
                line_run.explode()
198
                tree_widget_item.parent().takeChild(tree_widget_item.parent().indexOfChild(tree_widget_item))
199
        finally:
200
            pass
201

    
202
    def explode_all_line_nos(self, tree_widget_item):
203
        """ explode all line nos """
204

    
205
        try:
206
            for i in self.LineNoTreeItem.childCount():
207
                self.explode_line_no(self.LineNoTreeItem.child(i))
208
        finally:
209
            pass
210

    
211
    def explode_line_no(self, lineNoTreeWidgetItem):
212
        """ explode line no """
213

    
214
        try:
215
            line_no_item = lineNoTreeWidgetItem.data(0, self.TREE_DATA_ROLE)
216
            if line_no_item:
217
                connected_items = line_no_item.getConnectedItems()
218
                for item in connected_items:
219
                    self.addTreeItem(self.SymbolsTreeItem, item)
220

    
221
                for i in reversed(range(lineNoTreeWidgetItem.childCount())):
222
                    lineNoTreeWidgetItem.takeChild(i)
223

    
224
                line_no_item.explode()
225
        finally:
226
            pass
227

    
228
    '''
229
        @brief      pick line type
230
        @author     humkyung 
231
        @date       2018.06.27
232
    '''
233
    def lineTypeClickEvent(self, item):
234
        pass
235

    
236
    '''
237
        @brief      Change Color recursively
238
        @author     Jeongwoo
239
        @date       18.05.14
240
    '''
241
    def changeTreeWidgetItemColorRecursively(self, item, color):
242
        for index in range(item.childCount()):
243
            child = item.child(index)
244
            child.setForeground(0, QBrush(color))
245
            child.setFont(0, child.font(0))
246
            self.changeTreeWidgetItemColorRecursively(child, color)
247

    
248
    '''
249
        @brief      Clear TreeWidget and Set Current PID
250
        @author     Jeongwoo
251
        @date       18.04.11
252
        @history    2018.04.26  Jeongwoo    Add Child [SYMBOLS, NOTES] into root item
253
                    2018.05.09  Jeongwoo    Change method to add default tree items
254
                    humkyung 2018.06.10 add tree item for Line No and Unknown Item
255
    '''
256
    def setCurrentPID(self, drawingName):
257
        appDocData = AppDocData.instance()
258

    
259
        self.clear()
260
        self.root = QTreeWidgetItem(self, [drawingName])
261
        self.root.setIcon(0, QIcon(':newPrefix/objects.png'))
262
        self.root.setData(0, self.TREE_DATA_ROLE, appDocData.activeDrawing)
263
        child = self.root.addChild(QTreeWidgetItem(['LINE NO']))
264
        self.LineNoTreeItem = self.root.child(self.root.childCount() - 1)
265
        self.LineNoTreeItem.setFlags(self.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
266
        self.LineNoTreeItem.setCheckState(0, Qt.Checked)
267
        self.root.addChild(QTreeWidgetItem(['EQUIPMENTS']))
268
        self.EqpTreeItem = self.root.child(self.root.childCount() - 1)
269
        self.root.addChild(QTreeWidgetItem(['SYMBOLS']))
270
        self.SymbolsTreeItem = self.root.child(self.root.childCount() - 1)
271
        self.root.addChild(QTreeWidgetItem(['NOTES']))
272
        self.NotesTreeItem = self.root.child(self.root.childCount() - 1)
273
        self.root.addChild(QTreeWidgetItem(['UNKNOWN']))
274
        self.UnknownTreeItem = self.root.child(self.root.childCount() - 1)
275

    
276
        for idx in range(self.root.childCount()):
277
            child = self.root.child(idx)
278
            child.setIcon(0, QIcon(':newPrefix/folder-black.png'))
279

    
280
    '''
281
        @brief  create tree item for pipe run if need
282
        @author humkyung
283
        @date   2018.05.15
284
        @history    2018.05.17  Jeongwoo    Change run item color with parent(LineNo Item) color
285
    '''
286
    def addPipeRunTreeItemIfNeed(self, lineNoTreeItem, pipeRun):
287
        for index in range(lineNoTreeItem.childCount()):
288
            treeItem = lineNoTreeItem.child(index)
289
            itemData = treeItem.data(0, self.TREE_DATA_ROLE)
290
            if itemData is not None and itemData == pipeRun:
291
                return treeItem
292

    
293
        runItem = QTreeWidgetItem(['RUNS {}'.format(lineNoTreeItem.childCount()+1)])
294
        runItem.setData(0, self.TREE_DATA_ROLE, pipeRun)
295

    
296
        brush = lineNoTreeItem.foreground(0)
297
        runItem.setForeground(0, brush)
298
        runItem.setFont(0, runItem.font(0))
299

    
300
        lineNoTreeItem.addChild(runItem)
301

    
302
        return runItem
303

    
304
    '''
305
        @brief      add a tree item
306
        @author     humkyung
307
        @date       2018.04.17
308
        @history    humkyung 2018.04.19 treat a case parent is changed
309
                    Jeongwoo 2018.04.26 QEngineeringTextItem → QEngineeringLineNoTextItem
310
                                        Insert if-statement for QEngineeringNoteItem
311
                                        Add if-statement for QEngineeringLineNoTextItem
312
                    Jeongwoo 2018.05.11 Set color when SymbolSvgItem moved into new parent(Line No)
313
                    Jeongwoo 2018.05.15 Add break keyword on if-statement
314
                    Jeongwoo 2018.05.17 Set TreeWidgetItem's color with data's color And Set Data's color on LineNoTextItem Setting
315
                    humkyung 2018.06.12 add unknown item
316
                    humkyung 2018.07.20 append nozzle to equipment
317
    '''
318
    def addTreeItem(self, parent, child):
319
        item = None
320
        appDocData = AppDocData.instance()
321

    
322
        try:
323
            if (not hasattr(child, 'treeItem')) or (child.treeItem is None):
324
                if issubclass(type(child), SymbolSvgItem):
325
                    isEquipmentType = appDocData.isEquipmentType(child.type)
326
                    if isEquipmentType:
327
                        item = QTreeWidgetItem(self.EqpTreeItem, [child.name])
328
                        item.setData(0, self.TREE_DATA_ROLE, child)
329
                    elif child.type == 'Nozzles':
330
                        for i in range(self.EqpTreeItem.childCount()):
331
                            eqpTreeItem = eqpRootTreeItem[0].child(i)
332
                            eqpSymbol = eqpTreeItem.data(0, self.TREE_DATA_ROLE)
333
                            if child.owner is eqpSymbol:
334
                                symbolsRootItem = eqpTreeItem
335
                                item = QTreeWidgetItem(eqpTreeItem, [child.name])
336
                                item.setData(0, self.TREE_DATA_ROLE, child)
337
                                break
338
                        
339
                        if item is None:
340
                            item = QTreeWidgetItem(self.SymbolsTreeItem, [child.name])
341
                    elif child.type == 'Notes':
342
                        return item
343
                    else:
344
                        item = QTreeWidgetItem(self.SymbolsTreeItem, [child.name])
345
                    
346
                    if item is not None:
347
                        iconPath = os.path.join(AppDocData.instance().getCurrentProject().getSvgFilePath(), child.type , child.name + ".svg")
348
                        item.setIcon(0, QIcon(iconPath))
349
                        item.setData(0, self.TREE_DATA_ROLE, child)
350
                        brush = QBrush()
351
                        brush.setColor(QColor(child.getColor()))
352
                        item.setForeground(0, brush)
353
                        item.setFont(0, item.font(0))
354
                        child.treeItem = item
355
                        if isEquipmentType:
356
                            self.EqpTreeItem.addChild(item)
357
                            self.EqpTreeItem.sortChildren(0, Qt.AscendingOrder)  # sort childrens
358
                        else:
359
                            self.SymbolsTreeItem.addChild(item)
360
                            self.SymbolsTreeItem.sortChildren(0, Qt.AscendingOrder)  # sort childrens
361
                elif type(child) is QEngineeringLineNoTextItem:
362
                    for index in range(self.LineNoTreeItem.childCount()):
363
                        if child.text() == self.LineNoTreeItem.child(0).text(index) and self.LineNoTreeItem.child(0).childCount() is 0:
364
                            self.LineNoTreeItem.takeChild(index)
365
                            break
366
                    item = CustomTreeWidgetItem([child.text()])
367
                    item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
368
                    item.setData(0, self.TREE_DATA_ROLE, child)
369
                    item.setCheckState(0, Qt.Checked if child.isVisible() else Qt.Unchecked)
370
                    brush = QBrush()
371
                    brush.setColor(QColor(child.getColor()))
372
                    item.setForeground(0, brush)
373
                    item.setFont(0, item.font(0))
374
                    child.treeItem = item
375
                    self.LineNoTreeItem.addChild(item)
376
                elif type(child) is QEngineeringTrimLineNoTextItem:
377
                    item = CustomTreeWidgetItem(['Unknown Line'])
378
                    item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
379
                    item.setData(0, self.TREE_DATA_ROLE, child)
380
                    item.setCheckState(0, Qt.Checked if child.isVisible() else Qt.Unchecked)
381
                    brush = QBrush()
382
                    brush.setColor(QColor(child.getColor()))
383
                    item.setForeground(0, brush)
384
                    item.setFont(0, item.font(0))
385
                    child.treeItem = item
386
                    self.LineNoTreeItem.addChild(item)
387
                elif (type(child) is QEngineeringNoteItem):
388
                    founds = None
389
                    for i in range(self.NotesTreeItem.childCount()):
390
                        item = self.NotesTreeItem.child(i)
391
                        notes = item.data(0, self.TREE_DATA_ROLE)
392
                        founds = [note for note in notes if note.text() == child.text()]
393
                        if founds: break
394

    
395
                    if founds:
396
                        item.setData(0, self.TREE_DATA_ROLE, founds + [child, ])
397
                    else:
398
                        item = QTreeWidgetItem([child.text()])
399
                        item.setData(0, self.TREE_DATA_ROLE, [child, ])
400
                        if parent is not None:
401
                            parent.addChild(item)
402
                            parent.sortChildren(0, Qt.AscendingOrder)  # sort childrens
403
                    child.treeItem = item
404
                    item.setText(0, '{}({})'.format(child.text(), len(item.data(0, self.TREE_DATA_ROLE))))
405

    
406
                    # show note icon if note icon is setted
407
                    if child.symbol:
408
                        iconPath = os.path.join(appDocData.getCurrentProject().getSvgFilePath(), 'Notes' , child.symbol.name + '.svg')
409
                        item.setIcon(0, QIcon(iconPath))
410
                elif (type(child) is QEngineeringUnknownItem):
411
                    item = QTreeWidgetItem(['Unknown'])
412
                    item.setData(0, self.TREE_DATA_ROLE, child)
413
                    child.treeItem = item
414
                    self.UnknownTreeItem.addChild(item)
415
                    if child.lineIndicator == 'Match':
416
                        item.setHidden(True)
417
            elif issubclass(type(child), SymbolSvgItem):  # change item's parent
418
                foundItems = self.findItems(child.name, Qt.MatchExactly|Qt.MatchRecursive, 0)
419
                if foundItems is not None:
420
                    for item in foundItems:
421
                        data = item.data(0, self.TREE_DATA_ROLE)
422
                        if data is not None and (data == child) and (parent is not item.parent()):
423
                            parentData = parent.data(0, self.TREE_DATA_ROLE)
424
                            if parentData is not None and issubclass(type(parentData), QEngineeringLineNoTextItem):
425
                                for index in range(len(parentData.runs)):
426
                                    runGroup = parentData.runs[index]
427
                                    if data in runGroup.items:
428
                                        item.parent().removeChild(item) # remove item from original parent
429
                                        runItem = self.addPipeRunTreeItemIfNeed(parent, runGroup) #parent.child(index)
430
                                        brush = QBrush()
431
                                        brush.setColor(QColor(item.data(0, self.TREE_DATA_ROLE).getColor()))
432
                                        item.setForeground(0, brush)
433
                                        #item.data(0, self.TREE_DATA_ROLE).setColor(brush.color().name())
434
                                        item.setFont(0, item.font(0))
435
                                        runItem.addChild(item)
436
                                        break
437
                                    else:
438
                                        pass
439
                            elif parent is not None:
440
                                item.parent().removeChild(item) # remove item from original parent
441
                                parent.addChild(item)
442
                            break
443
            elif type(child) is QEngineeringLineNoTextItem:
444
                foundItems = self.findItems(child.text(), Qt.MatchExactly|Qt.MatchRecursive, 0)
445
                if foundItems is not None:
446
                    for item in foundItems:
447
                        data = item.data(0, self.TREE_DATA_ROLE)
448
                        if data is not None and (data == child):
449
                            connectedItems = data.getConnectedItems()
450
                            color = data.getColor()
451
                            for connectedItem in connectedItems:
452
                                connectedItem.setColor(color)
453
                            return item
454
        except Exception as ex:
455
            from App import App
456
            from AppDocData import MessageType
457

    
458
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
459
            App.mainWnd().addMessage.emit(MessageType.Error, message)
460

    
461
        return item
462

    
463
    '''
464
        @brief      Scene Changed Listener
465
        @author     Jeongwoo
466
        @date       18.04.11
467
        @history    Jeongwoo 2018.04.25 Add QEngineeringNoteItem to list for loop  / NOT QEngineeringTextItem
468
                    Jeongwoo 2018.04.26 Change changedSceneItems conditions in loop (QEngineeringTextItem → QEngineeringLineNoTextItem)
469
                    humkyung 2018.07.20 put items which's owner is None before item which's owner is not None
470
    '''
471
    lastSceneItems = None
472
    def sceneChanged(self, sceneItems):
473
        try:
474
            changedSceneItems = [item for item in sceneItems if ((issubclass(type(item), SymbolSvgItem) and type(item) is not QEngineeringErrorItem) or (type(item) is QEngineeringNoteItem) or (type(item) is QEngineeringLineNoTextItem) 
475
                                or (type(item) is QEngineeringUnknownItem)) and (not hasattr(item, 'treeItem') or item.treeItem is None)] # Sublist includes SymbolSvgItem
476
            first = [item for item in changedSceneItems if item.owner is None]
477
            second = [item for item in changedSceneItems if item.owner is not None]
478
            if first + second: self.initResultTreeWidget(first + second)
479
        finally:
480
            self.update_item_count()
481

    
482
    '''
483
        @brief      Initialize TreeWidget
484
                    Tree Item Clear and Add Item
485
        @author     Jeongwoo
486
        @date       2018.04.11
487
        @history    2018.04.12 Jeongwoo    Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
488
        @history    2018.04.17 humkyung NOT remove child of root
489
                    2018.04.25 Jeongwoo     Add QEngineeringNoteItem Child
490
                    2018.04.26 Jeongwoo     Change method to insert child
491
    '''
492
    def initResultTreeWidget(self, items):
493
        for item in items:
494
            if (type(item) is QEngineeringNoteItem):
495
                self.addTreeItem(self.NotesTreeItem, item)
496
            else:
497
                self.addTreeItem(self.root, item)
498
                    
499
        if self.NotesTreeItem is not None:
500
            self.NotesTreeItem.sortChildren(0, Qt.AscendingOrder)
501

    
502
        self.expandAll()
503
        
504
    def itemCheckBoxToggled(self, item, checkState):
505
        """
506
        set visible of invisible of item
507
        """
508
        try:
509
            itemData = item.data(0, self.TREE_DATA_ROLE)   
510
            if (type(itemData) is QEngineeringLineNoTextItem) or (type(itemData) is QEngineeringTrimLineNoTextItem):
511
                itemData.setVisible(checkState == Qt.CheckState.Checked)
512
        except Exception as ex:
513
            from App import App
514
            from AppDocData import MessageType
515

    
516
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
517
            App.mainWnd().addMessage.emit(MessageType.Error, message)
518
        finally:
519
            pass
520

    
521
    '''
522
        @brief      TreeWidget Item click listener
523
        @author     Jeongwoo
524
        @date       18.04.11
525
        @history    18.04.12    Jeongwoo    Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
526
                    18.04.13    Jeongwoo    Signal 'singleClicked' emit SymbolSvgItem
527
                                            CenterOn() with Symbol's center
528
                    18.04.25    Jeongwoo    Add QEngineeringNoteItem Click event
529
                    18.04.26    Jeongwoo    QEngineeringTextItem → QEngineeringLineNoTextItem
530
                    18.04.27    Jeongwoo    Find NOTE Contents when NOTE No. Clicked
531
                                            Move singClicked to if-statement type(itemData) is SymbolSvgItem:
532
                    18.05.10    Jeongwoo    Add lineNoSingleClicked emit
533
                    humkyung 2018.07.07 emit singleClicked signal when user click drawing name
534
    '''
535
    def itemClickEvent(self, item, columnNo, isSvgClick = False):
536
        from Drawing import Drawing
537
        from EngineeringRunItem import QEngineeringRunItem
538
        from HighlightCommand import HighlightCommand
539

    
540
        hilightColor = QColor(255, 0, 0, 127)
541

    
542
        itemData = item.data(0, self.TREE_DATA_ROLE)
543
        
544
        if itemData is not None: ## Not PID Name
545
            if issubclass(type(itemData), SymbolSvgItem):
546
                HighlightCommand(self.imageViewer).execute(itemData)
547
                ## Draw rectangle on selected symbol
548
                #rect = itemData.sceneBoundingRect()
549
                #if isSvgClick == False:
550
                #    self.imageViewer.centerOn(rect.center())
551
                ## Send new event to imageViewer's zoomImage Method
552
                #self.imageViewer.zoomImage(True, QMouseEvent(QEvent.MouseButtonPress, self.imageViewer.mapFromScene(QPointF(rect.left(), rect.top())), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier), 3)
553

    
554
                self.singleClicked.emit(itemData)
555
            elif (type(itemData) is QEngineeringLineNoTextItem) or (type(itemData) is QEngineeringRunItem):
556
                HighlightCommand(self.imageViewer).execute(itemData)
557
                self.lineNoSingleClicked.emit(itemData)
558
                for child in range(item.childCount()):
559
                    item.child(child).setSelected(True)
560
            elif type(itemData) is list and type(itemData[0]) is QEngineeringNoteItem:
561
                HighlightCommand(self.imageViewer).execute(itemData)
562
                '''
563
                rect = itemData.sceneBoundingRect()
564
                if isSvgClick == False:
565
                    self.imageViewer.centerOn(rect.center())
566
                ## Send new event to imageViewer's zoomImage Method
567
                self.imageViewer.zoomImage(True, QMouseEvent(QEvent.MouseButtonPress, self.imageViewer.mapFromScene(QPointF(rect.left(), rect.top())), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier), 3)
568
                '''
569
                noteContentsList = itemData[0].findNoteContents(itemData[0].text())
570

    
571
                self.noteNoSingleClicked.emit(itemData[0].text(), noteContentsList)
572
            elif type(itemData) is QEngineeringUnknownItem:
573
                HighlightCommand(self.imageViewer).execute(itemData)
574
            elif type(itemData) is Drawing:
575
                self.drawingClicked.emit(itemData)
576
                
577
            '''
578
            if issubclass(type(itemData), QGraphicsItem):
579
                itemData.setSelected(True)
580
                itemData.update()
581
            '''
582

    
583
    '''
584
        @brief  find item which has data is given item
585
        @author humkyung
586
        @date   2018.04.23
587
        @history    2018.06.18  Jeongwoo    Add if-statement for QEngineeringUnknownItem
588
        @history    2018.11.22  euisung     add delete note
589
    '''
590
    def findItemByData(self, item):
591
        if issubclass(type(item), SymbolSvgItem):
592
            foundItems = self.findItems(item.name, Qt.MatchExactly|Qt.MatchRecursive, 0)
593
            for foundItem in foundItems:
594
                data = foundItem.data(0, self.TREE_DATA_ROLE)
595
                if data is not None and data is item:
596
                    return foundItem
597
        elif type(item) is QEngineeringLineNoTextItem:
598
            foundItems = self.findItems(item.text() , Qt.MatchExactly|Qt.MatchRecursive, 0)
599
            for foundItem in foundItems:
600
                data = foundItem.data(0, self.TREE_DATA_ROLE)
601
                if data is not None and data is item:
602
                    return foundItem
603
        elif type(item) is QEngineeringUnknownItem:
604
            foundItems = self.findItems('Unknown' , Qt.MatchExactly|Qt.MatchRecursive, 0)
605
            for foundItem in foundItems:
606
                data = foundItem.data(0, self.TREE_DATA_ROLE)
607
                if data is not None and data is item:
608
                    return foundItem
609
        elif type(item) is QEngineeringNoteItem:
610
            foundItems = self.findItems(item.text() , Qt.MatchExactly|Qt.MatchRecursive, 0)
611
            for foundItem in foundItems:
612
                data = foundItem.data(0, self.TREE_DATA_ROLE)
613
                if data is not None and data is item:
614
                    return foundItem
615
        
616
        return None
617

    
618
    '''
619
        @brief  Init LineNoItems child
620
        @author kyouho
621
        @date   2018.09.17
622
    '''
623
    def InitLineNoItems(self):
624
        try: 
625
            removeLineItem = []
626
            for lineIndex in range(self.LineNoTreeItem.childCount()):
627
                ## LineNoItem, TrimLine Item
628
                lineItem = self.LineNoTreeItem.child(lineIndex)
629

    
630
                removeRunItem = []
631
                for runIndex in range(lineItem.childCount()):
632
                    ## RUN Item
633
                    runItem = lineItem.child(runIndex)
634
                    for symbolIndex in range(runItem.childCount()):
635
                        symbolItem = runItem.child(0)
636
                        symbol = symbolItem.data(0, self.TREE_DATA_ROLE)
637

    
638
                        symbolItem.parent().removeChild(symbolItem)
639

    
640
                        if AppDocData.instance().isEquipmentType(symbol.type):
641
                            self.EqpTreeItem.addChild(symbolItem)
642
                        else:
643
                            self.SymbolsTreeItem.addChild(symbolItem)
644

    
645
                    ## 지울 Item 모음
646
                    removeRunItem.append(runItem)
647
                ## Run Item들 삭제
648
                for removeItem in removeRunItem:
649
                    lineItem.removeChild(removeItem)
650
                ## 지울 Trim Line 모음
651
                if lineItem.text(0) == 'Trim Line':
652
                    removeLineItem.append(lineItem)
653
            ## Trim Line들 삭제
654
            for removeItem in removeLineItem:
655
                self.LineNoTreeItem.removeChild(removeItem)
656

    
657
        except Exception as ex:
658
            from App import App
659
            from AppDocData import MessageType
660

    
661
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
662
            App.mainWnd().addMessage.emit(MessageType.Error, message)
663

    
664
    '''
665
        @brief      Find QTreeWidgetItem by SymbolSvgItem object
666
        @author     Jeongwoo
667
        @date       18.04.11
668
        @history    18.04.12    Jeongwoo    Change Flags (Qt.MatchExactly → Qt.MatchExactly|Qt.MatchRecursive)
669
                                            Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
670
        @history    2018.11.22  euisung     add note, unknown
671
    '''
672
    @pyqtSlot(SymbolSvgItem)
673
    def findItem(self, item):
674
        if issubclass(type(item), SymbolSvgItem):
675
            foundItems = self.findItems(item.name, Qt.MatchExactly|Qt.MatchRecursive, 0)
676
            if foundItems is not None:
677
                for fItem in foundItems:
678
                    data = fItem.data(0, self.TREE_DATA_ROLE)
679
                    if data is not None and data == item:
680
                        self.setCurrentItem(fItem)
681
                        return
682
        elif type(item) is QEngineeringLineNoTextItem:
683
            foundItems = self.findItems(item.text(), Qt.MatchExactly|Qt.MatchRecursive, 0)
684
            if foundItems is not None:
685
                for fItem in foundItems:
686
                    data = fItem.data(0, self.TREE_DATA_ROLE)
687
                    if data is not None and data == item:
688
                        self.setCurrentItem(fItem)
689
                        return
690
        elif type(item) is QEngineeringNoteItem:
691
            founds = None
692
            for i in range(self.NotesTreeItem.childCount()):
693
                child = self.NotesTreeItem.child(i)
694
                notes = child.data(0, self.TREE_DATA_ROLE)
695
                founds = [note for note in notes if note.text() == item.text()]
696
                if founds:
697
                    self.setCurrentItem(child)
698
                    return
699
        elif type(item) is QEngineeringUnknownItem:
700
            foundItems = self.findItems('Unknown', Qt.MatchExactly|Qt.MatchRecursive, 0)
701
            if foundItems is not None:
702
                for fItem in foundItems:
703
                    data = fItem.data(0, self.TREE_DATA_ROLE)
704
                    if data is not None and data == item:
705
                        self.setCurrentItem(fItem)
706
                        return
707

    
708
        ## Not found
709
        msg = QMessageBox()
710
        msg.setIcon(QMessageBox.Warning)
711
        msg.setText('선택하신 심볼의 데이터를 찾을 수 없습니다.')
712
    
713
    '''
714
        @brief      remove given item
715
        @author     humkyung
716
        @date       2018.04.23
717
        @history    Jeongwoo 2018.05.25 Remove Highlighting when item removed
718
                    humkyung 2018.07.22 removed code to Remove highlighting
719
    '''
720
    @pyqtSlot(QGraphicsItem)
721
    def itemRemoved(self, item):
722
        try:
723
            foundItem = self.findItemByData(item)
724
            if foundItem is not None:
725
                foundItem.parent().removeChild(foundItem)
726
        finally:
727
            self.update_item_count()
728

    
729
    def update_item_count(self):
730
        """
731
        update items count
732
        """
733
        if hasattr(self, 'LineNoTreeItem'):
734
            self.LineNoTreeItem.setText(0, 'LINE NO({})'.format(self.LineNoTreeItem.childCount()))
735
        if hasattr(self, 'EqpTreeItem'):
736
            self.EqpTreeItem.setText(0, 'EQUIPMENTS({})'.format(self.EqpTreeItem.childCount()))
737
        if hasattr(self, 'SymbolsTreeItem'):
738
            self.SymbolsTreeItem.setText(0, 'SYMBOLS({})'.format(self.SymbolsTreeItem.childCount()))
739
        if hasattr(self, 'NotesTreeItem'):
740
            self.NotesTreeItem.setText(0, 'NOTES({})'.format(self.NotesTreeItem.childCount()))
741
        if hasattr(self, 'UnknownTreeItem'):
742
            self.UnknownTreeItem.setText(0, 'UNKNOWN({})'.format(self.UnknownTreeItem.childCount()))
클립보드 이미지 추가 (최대 크기: 500 MB)