개정판 8804d0d9
dev issue #627: add instrument data list
DTI_PID/DTI_PID/AppDocData.py | ||
---|---|---|
141 | 141 | |
142 | 142 |
self._areas = [] |
143 | 143 |
self.equipments = [] |
144 |
self.equipmentDataList = [] |
|
144 |
#self.equipmentDataList = []
|
|
145 | 145 |
self.lineNos = [] |
146 | 146 |
self.lines = [] |
147 | 147 |
self.symbols = [] |
... | ... | |
1812 | 1812 |
conn.close() |
1813 | 1813 | |
1814 | 1814 |
''' |
1815 |
@brief delete inst data list |
|
1816 |
@author kyouho |
|
1817 |
@date 2018.08.14 |
|
1818 |
''' |
|
1819 |
def deleteInstDataList(self, removeUID): |
|
1820 |
try: |
|
1821 |
# Creates or opens a file called mydb with a SQLite3 DB |
|
1822 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db') |
|
1823 |
conn = sqlite3.connect(dbPath) |
|
1824 |
# Get a cursor object |
|
1825 |
cursor = conn.cursor() |
|
1826 |
|
|
1827 |
for uid in removeUID: |
|
1828 |
sql = "delete from INSTRUMENT_DATA_LIST where uid = '{}'".format(uid) |
|
1829 |
cursor.execute(sql) |
|
1830 | ||
1831 |
conn.commit() |
|
1832 | ||
1833 |
# Catch the exception |
|
1834 |
except Exception as ex: |
|
1835 |
# Roll back any change if something goes wrong |
|
1836 |
conn.rollback() |
|
1837 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
1838 |
finally: |
|
1839 |
# Close the db connection |
|
1840 |
conn.close() |
|
1841 | ||
1842 |
''' |
|
1815 | 1843 |
@brief get equipment data list |
1816 | 1844 |
@author humkyung |
1817 | 1845 |
@date 2018.05.03 |
1818 | 1846 |
''' |
1819 | 1847 |
def getEquipmentDataList(self, docName = None): |
1820 |
if not self.equipmentDataList:
|
|
1821 |
try:
|
|
1822 |
# Creates or opens a file called mydb with a SQLite3 DB
|
|
1823 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
|
|
1824 |
conn = sqlite3.connect(dbPath)
|
|
1825 |
# Get a cursor object
|
|
1826 |
cursor = conn.cursor()
|
|
1848 |
result = []
|
|
1849 |
try: |
|
1850 |
# Creates or opens a file called mydb with a SQLite3 DB |
|
1851 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db') |
|
1852 |
conn = sqlite3.connect(dbPath) |
|
1853 |
# Get a cursor object |
|
1854 |
cursor = conn.cursor() |
|
1827 | 1855 | |
1828 |
sql = 'select UID, ITEM_NO, SERVICE, NO_REQ, FLUID, DESC_OF_PART, OPERATION_CONDITION_TEMP, OPERATION_CONDITION_PRESS, DESIGN_CONDITION_TEMP, DESIGN_CONDITION_PRESS, MATERIAL, WEIGHT, POWER, INSULATION, PNID_NO, REV from EQUIPMENT_DATA_LIST'
|
|
1829 |
if docName is not None:
|
|
1830 |
sql += " where PNID_NO = '{}'".format(docName)
|
|
1856 |
sql = 'select UID, ITEM_NO, SERVICE, NO_REQ, FLUID, DESC_OF_PART, OPERATION_CONDITION_TEMP, OPERATION_CONDITION_PRESS, DESIGN_CONDITION_TEMP, DESIGN_CONDITION_PRESS, MATERIAL, WEIGHT, POWER, INSULATION, PNID_NO, REV from EQUIPMENT_DATA_LIST' |
|
1857 |
if docName is not None: |
|
1858 |
sql += " where PNID_NO = '{}'".format(docName) |
|
1831 | 1859 | |
1832 |
cursor.execute(sql) |
|
1833 |
rows = cursor.fetchall() |
|
1834 |
for row in rows: |
|
1835 |
data = [] |
|
1836 |
for index in range(len(cursor.description)): |
|
1837 |
data.append(row[index]) |
|
1838 |
self.equipmentDataList.append(data) |
|
1839 |
# Catch the exception |
|
1840 |
except Exception as ex: |
|
1841 |
# Roll back any change if something goes wrong |
|
1842 |
conn.rollback() |
|
1843 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
1844 |
finally: |
|
1845 |
# Close the db connection |
|
1846 |
conn.close() |
|
1860 |
cursor.execute(sql) |
|
1861 |
rows = cursor.fetchall() |
|
1862 |
for row in rows: |
|
1863 |
data = [] |
|
1864 |
for index in range(len(cursor.description)): |
|
1865 |
data.append(row[index]) |
|
1866 |
result.append(data) |
|
1867 |
# Catch the exception |
|
1868 |
except Exception as ex: |
|
1869 |
# Roll back any change if something goes wrong |
|
1870 |
conn.rollback() |
|
1871 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
1872 |
finally: |
|
1873 |
# Close the db connection |
|
1874 |
conn.close() |
|
1875 | ||
1876 |
return result |
|
1877 | ||
1878 |
''' |
|
1879 |
@brief get instrument data list |
|
1880 |
@author kyouho |
|
1881 |
@date 2018.08.14 |
|
1882 |
''' |
|
1883 |
def getInstrumentDataList(self, docName = None): |
|
1884 |
result = [] |
|
1885 |
try: |
|
1886 |
# Creates or opens a file called mydb with a SQLite3 DB |
|
1887 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db') |
|
1888 |
conn = sqlite3.connect(dbPath) |
|
1889 |
# Get a cursor object |
|
1890 |
cursor = conn.cursor() |
|
1891 | ||
1892 |
sql = 'select UID, ITEM_NO, SERVICE, FLOW_RATE, PRESSURE, TEMPERATURE, TPYE, RANGE, NOR_LEVEL_MM, NOR_LEVEL_PERCENT, DEL_PRESS, SHUT_OFF, LOCATION, PNID_NO, REV from INSTRUMENT_DATA_LIST' |
|
1893 |
if docName is not None: |
|
1894 |
sql += " where PNID_NO = '{}'".format(docName) |
|
1895 | ||
1896 |
cursor.execute(sql) |
|
1897 |
rows = cursor.fetchall() |
|
1898 |
for row in rows: |
|
1899 |
data = [] |
|
1900 |
for index in range(len(cursor.description)): |
|
1901 |
data.append(row[index]) |
|
1902 |
result.append(data) |
|
1903 |
# Catch the exception |
|
1904 |
except Exception as ex: |
|
1905 |
# Roll back any change if something goes wrong |
|
1906 |
conn.rollback() |
|
1907 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
1908 |
finally: |
|
1909 |
# Close the db connection |
|
1910 |
conn.close() |
|
1847 | 1911 | |
1848 |
return self.equipmentDataList
|
|
1912 |
return result
|
|
1849 | 1913 | |
1850 | 1914 |
''' |
1851 | 1915 |
@brief set equipment data list |
... | ... | |
1865 | 1929 |
param = tuple(data) |
1866 | 1930 |
cursor.execute(sql, param) |
1867 | 1931 |
conn.commit() |
1932 |
# Catch the exception |
|
1933 |
except Exception as ex: |
|
1934 |
# Roll back any change if something goes wrong |
|
1935 |
conn.rollback() |
|
1936 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
1937 |
finally: |
|
1938 |
# Close the db connection |
|
1939 |
conn.close() |
|
1940 | ||
1941 |
''' |
|
1942 |
@brief set instrumnet data list |
|
1943 |
@author kyoyho |
|
1944 |
@date 2018.08.14 |
|
1945 |
''' |
|
1946 |
def setInstrumentDataList(self, dataList): |
|
1947 |
try: |
|
1948 |
# Creates or opens a file called mydb with a SQLite3 DB |
|
1949 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db') |
|
1950 |
conn = sqlite3.connect(dbPath) |
|
1951 |
# Get a cursor object |
|
1952 |
cursor = conn.cursor() |
|
1953 | ||
1954 |
for data in dataList: |
|
1955 |
sql = "insert or replace into INSTRUMENT_DATA_LIST(UID, ITEM_NO, SERVICE, FLOW_RATE, PRESSURE, TEMPERATURE, TPYE, RANGE, NOR_LEVEL_MM, NOR_LEVEL_PERCENT, DEL_PRESS, SHUT_OFF, LOCATION, PNID_NO, REV) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" |
|
1956 |
param = tuple(data) |
|
1957 |
cursor.execute(sql, param) |
|
1958 |
conn.commit() |
|
1868 | 1959 | |
1869 |
self.equipmentDataList = dataList |
|
1870 | 1960 |
# Catch the exception |
1871 | 1961 |
except Exception as ex: |
1872 | 1962 |
# Roll back any change if something goes wrong |
DTI_PID/DTI_PID/ItemDataExportDialog.py | ||
---|---|---|
15 | 15 | |
16 | 16 |
self.sceneLineData = {} |
17 | 17 |
self.sceneEquipData = {} |
18 |
self.sceneInstData = {} |
|
18 | 19 | |
19 | 20 |
self.lineColumnList = [] |
20 | 21 |
self.equipColumnList = [] |
... | ... | |
78 | 79 |
# Table Header Label 설정 |
79 | 80 |
self.lineColumnList = ['UID', 'LINE_SIZE', 'LINE_SYMBOL', 'LINE_NO', 'LINE_CLASS', 'LINE_ROUTING_FROM', 'LINE_ROUTING_TO', 'SERVICE_FLUID', 'SERVICE_DENSITY', 'SERVICE_STATE', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'TEST_CONDITION_TEMP', 'TEST_CONDITION_PRESS', 'INSUL_CODE', 'PAINT_CODE', 'NDE_CODE', 'PWHT', 'PNID_NO'] |
80 | 81 |
self.equipColumnList = ['UID', 'ITEM_NO', 'SERVICE', 'NO_REQ', 'FLUID', 'DESC_OF_PART', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'MATERIAL', 'WEIGHT', 'POWER', 'INSULATION', 'PNID_NO', 'REV'] |
81 |
self.instColumnList = ['UID', 'NAME', 'VARIABLECODE', 'TYPEMODIFIER', 'TAGSEQNO', 'TAGSUFFIX', 'DOCUMENTNAME']
|
|
82 |
self.instColumnList = ['UID', 'ITEM_NO', 'SERVICE', 'FLOW_RATE', 'PRESSURE', 'TEMPERATURE', 'TPYE', 'RANGE', 'NOR_LEVEL_MM', 'NOR_LEVEL_PERCENT', 'DEL_PRESS', 'SHUT_OFF', 'LOCATION', 'PNID_NO', 'REV']
|
|
82 | 83 | |
83 | 84 |
lineTable.setHorizontalHeaderLabels(['UID', 'LINE_SIZE', 'LINE_SYMBOL', 'LINE_NO', 'LINE_CLASS', 'LINE_ROUTING_FROM', 'LINE_ROUTING_TO', 'SERVICE_FLUID', 'SERVICE_DENSITY', 'SERVICE_STATE', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'TEST_CONDITION_TEMP', 'TEST_CONDITION_PRESS', 'INSUL_CODE', 'PAINT_CODE', 'NDE_CODE', 'PWHT', 'PNID_NO']) |
84 | 85 |
equipTable.setHorizontalHeaderLabels(['UID', 'ITEM_NO', 'SERVICE', 'NO_REQ', 'FLUID', 'DESC_OF_PART', 'OPERATION_CONDITION_TEMP', 'OPERATION_CONDITION_PRESS', 'DESIGN_CONDITION_TEMP', 'DESIGN_CONDITION_PRESS', 'MATERIAL', 'WEIGHT', 'POWER', 'INSULATION', 'PNID_NO', 'REV']) |
85 |
instTable.setHorizontalHeaderLabels(['UID', 'Name', 'Variable Code', 'Type Modifier', 'Tag Seq No', 'Tag Suffix', 'Document Name'])
|
|
86 |
instTable.setHorizontalHeaderLabels(['UID', 'ITEM_NO', 'SERVICE', 'FLOW_RATE', 'PRESSURE', 'TEMPERATURE', 'TPYE', 'RANGE', 'NOR_LEVEL_MM', 'NOR_LEVEL_PERCENT', 'DEL_PRESS', 'SHUT_OFF', 'LOCATION', 'PNID_NO', 'REV'])
|
|
86 | 87 |
# Table Header 크기 설정 |
87 | 88 |
lineTable.horizontalHeaderItem(1).setSizeHint(QSize(40, 40)) |
88 | 89 |
equipTable.horizontalHeaderItem(1).setSizeHint(QSize(40, 40)) |
... | ... | |
91 | 92 |
# talbe Data 설정 |
92 | 93 |
self.settingLineData() |
93 | 94 |
self.settingEquipmentData() |
95 |
self.settingInstrumentData() |
|
94 | 96 | |
95 | 97 |
''' |
96 | 98 |
@brief setting line data |
... | ... | |
182 | 184 |
widgetItem.setBackground(QColor(int(134), int(229), int(127))) |
183 | 185 |
equipTable.setItem(rowCount - 1, index, widgetItem) |
184 | 186 | |
187 |
''' |
|
188 |
@brief setting equip data |
|
189 |
@author kyouho |
|
190 |
@date 2018.08.14 |
|
191 |
''' |
|
192 |
def settingInstrumentData(self): |
|
193 |
instTable = self.ui.tableWidgetInstrumentDataList |
|
194 |
docData = AppDocData.instance() |
|
195 | ||
196 |
# 기존 저장된 데이터 불러옴 |
|
197 |
index = self.ui.comboBoxDoc.currentIndex() |
|
198 |
text = self.ui.comboBoxDoc.itemText(index) |
|
199 |
if self.ui.comboBoxDoc.currentIndex() == 0: |
|
200 |
text = None |
|
201 |
dataList = docData.getInstrumentDataList(text) |
|
202 |
instTable.setRowCount(len(dataList)) |
|
203 |
row = 0 |
|
204 |
for data in dataList: |
|
205 |
for dataIndex in range(len(data)): |
|
206 |
instTable.setItem(row, dataIndex, QTableWidgetItem(data[dataIndex] if data[dataIndex] is not None else '')) |
|
207 |
row += 1 |
|
208 | ||
209 |
# 현재 문서명이 같으면 중복 체크 (Equipment 경우 uid로) |
|
210 |
if docData.imgName is not None and (docData.imgName == text or self.ui.comboBoxDoc.currentIndex() == 0): |
|
211 |
rowCount = instTable.rowCount() |
|
212 |
uidList = [] |
|
213 |
for row in range(rowCount): |
|
214 |
uidList.append(instTable.item(row, 0).text()) |
|
215 | ||
216 |
for uid in self.sceneInstData.keys(): |
|
217 |
# 중복 (어떻게 할지) |
|
218 |
if uidList.count(uid) >= 1: |
|
219 |
continue |
|
220 |
# 신규 |
|
221 |
else: |
|
222 |
rowCount += 1 |
|
223 |
instTable.setRowCount(rowCount) |
|
224 |
equipData = self.sceneInstData[uid] |
|
225 | ||
226 |
for index in range(len(equipData)): |
|
227 |
widgetItem = QTableWidgetItem(equipData[index] if equipData[index] is not None else '') |
|
228 |
if widgetItem.text() != '': |
|
229 |
widgetItem.setBackground(QColor(int(134), int(229), int(127))) |
|
230 |
instTable.setItem(rowCount - 1, index, widgetItem) |
|
231 | ||
232 | ||
185 | 233 | |
186 | 234 |
''' |
187 | 235 |
@brief doc name change event |
... | ... | |
213 | 261 |
for item in items: |
214 | 262 |
self.sceneEquipData[item.uid] = item.getEquipmentDataList() |
215 | 263 | |
264 |
from QEngineeringInstrumentItem import QEngineeringInstrumentItem |
|
265 |
items = [item for item in self.parent.graphicsView.scene.items() if type(item) is QEngineeringInstrumentItem] |
|
266 |
for item in items: |
|
267 |
self.sceneInstData[item.uid] = item.getInstrumentDataList() |
|
216 | 268 | |
217 |
#self.sceneEquipData |
|
218 | 269 | |
219 |
''' |
|
270 |
''' self.equipmentDataList
|
|
220 | 271 |
@brief save Datas |
221 | 272 |
@author kyouho |
222 | 273 |
@date 2018.08.13 |
... | ... | |
227 | 278 |
docData.deleteLineDataList(self.removeUID[0]) |
228 | 279 |
self.saveEquipmentDataList() |
229 | 280 |
docData.deleteEquipDataList(self.removeUID[1]) |
230 | ||
281 |
self.saveInstrumentDataList() |
|
282 |
docData.deleteInstDataList(self.removeUID[2]) |
|
231 | 283 | |
232 | 284 |
QDialog.accept(self) |
233 | 285 | |
... | ... | |
285 | 337 |
|
286 | 338 |
docData.setEquipmentDataList(dataLists) |
287 | 339 | |
340 |
''' |
|
341 |
@brief save Equip Data |
|
342 |
@author kyouho |
|
343 |
@date 2018.08.13 |
|
344 |
''' |
|
345 |
def saveInstrumentDataList(self): |
|
346 |
|
|
347 |
instTable = self.ui.tableWidgetInstrumentDataList |
|
348 |
docData = AppDocData.instance() |
|
349 | ||
350 |
dataLists = [] |
|
351 |
for rowIndex in range(instTable.rowCount()): |
|
352 |
dataList = [] |
|
353 |
for columnIndex in range(instTable.columnCount()): |
|
354 |
widgetItem = instTable.item(rowIndex, columnIndex) |
|
355 | ||
356 |
if widgetItem is not None: |
|
357 |
dataList.append(widgetItem.text()) |
|
358 |
else: |
|
359 |
dataList.append('') |
|
360 |
|
|
361 |
dataLists.append(dataList) |
|
362 |
|
|
363 |
docData.setInstrumentDataList(dataLists) |
|
364 | ||
288 | 365 | |
289 | 366 |
''' |
290 | 367 |
@brief key press event |
DTI_PID/DTI_PID/ItemDataExport_UI.py | ||
---|---|---|
46 | 46 |
self.gridLayout_7 = QtWidgets.QGridLayout(self.tabInstrumentList) |
47 | 47 |
self.gridLayout_7.setObjectName("gridLayout_7") |
48 | 48 |
self.tableWidgetInstrumentDataList = QtWidgets.QTableWidget(self.tabInstrumentList) |
49 |
self.tableWidgetInstrumentDataList.setColumnCount(7)
|
|
49 |
self.tableWidgetInstrumentDataList.setColumnCount(15)
|
|
50 | 50 |
self.tableWidgetInstrumentDataList.setObjectName("tableWidgetInstrumentDataList") |
51 | 51 |
self.tableWidgetInstrumentDataList.setRowCount(0) |
52 | 52 |
self.tableWidgetInstrumentDataList.verticalHeader().setVisible(False) |
... | ... | |
70 | 70 |
self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1) |
71 | 71 | |
72 | 72 |
self.retranslateUi(ItemDataExportDialog) |
73 |
self.tabWidget.setCurrentIndex(1)
|
|
73 |
self.tabWidget.setCurrentIndex(2)
|
|
74 | 74 |
self.buttonBox.accepted.connect(ItemDataExportDialog.accept) |
75 | 75 |
self.buttonBox.rejected.connect(ItemDataExportDialog.reject) |
76 | 76 |
QtCore.QMetaObject.connectSlotsByName(ItemDataExportDialog) |
DTI_PID/DTI_PID/Shapes/QEngineeringInstrumentItem.py | ||
---|---|---|
11 | 11 |
from SymbolSvgItem import SymbolSvgItem |
12 | 12 |
from EngineeringConnectorItem import QEngineeringConnectorItem |
13 | 13 | |
14 |
instColumnList = ['UID', 'ITEM_NO', 'SERVICE', 'FLOW_RATE', 'PRESSURE', 'TEMPERATURE', 'TPYE', 'RANGE', 'NOR_LEVEL_MM', 'NOR_LEVEL_PERCENT', 'DEL_PRESS', 'SHUT_OFF', 'LOCATION', 'PNID_NO', 'REV'] |
|
15 | ||
14 | 16 |
class QEngineeringInstrumentItem(SymbolSvgItem): |
15 | 17 |
clicked = pyqtSignal(QGraphicsSvgItem) |
16 | 18 |
#removed = pyqtSignal(QGraphicsItem) |
... | ... | |
245 | 247 |
parentNode.append(attrNode) |
246 | 248 |
except Exception as ex: |
247 | 249 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
250 | ||
251 | ||
252 |
''' |
|
253 |
@brief return equip Data List |
|
254 |
@author kyouho |
|
255 |
@date 2018.08.14 |
|
256 |
''' |
|
257 |
def getInstrumentDataList(self): |
|
258 |
dataList = [] |
|
259 |
try: |
|
260 |
from AppDocData import AppDocData |
|
261 | ||
262 |
global instColumnList |
|
263 | ||
264 |
docData = AppDocData.instance() |
|
265 |
attrs = self.attrs |
|
266 | ||
267 |
for index in range(len(instColumnList)): |
|
268 |
dataList.append('') |
|
269 | ||
270 |
dataList[0] = self.uid |
|
271 |
dataList[13] = docData.imgName |
|
272 | ||
273 |
for attr in attrs: |
|
274 |
pass |
|
275 |
|
|
276 |
except Exception as ex: |
|
277 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
|
278 | ||
279 |
return dataList |
DTI_PID/DTI_PID/UI/ItemDataExport.ui | ||
---|---|---|
22 | 22 |
<item row="0" column="1"> |
23 | 23 |
<widget class="QTabWidget" name="tabWidget"> |
24 | 24 |
<property name="currentIndex"> |
25 |
<number>1</number>
|
|
25 |
<number>2</number>
|
|
26 | 26 |
</property> |
27 | 27 |
<widget class="QWidget" name="tabLineList"> |
28 | 28 |
<attribute name="title"> |
... | ... | |
103 | 103 |
<item row="0" column="0"> |
104 | 104 |
<widget class="QTableWidget" name="tableWidgetInstrumentDataList"> |
105 | 105 |
<property name="columnCount"> |
106 |
<number>7</number>
|
|
106 |
<number>15</number>
|
|
107 | 107 |
</property> |
108 | 108 |
<attribute name="verticalHeaderVisible"> |
109 | 109 |
<bool>false</bool> |
... | ... | |
115 | 115 |
<column/> |
116 | 116 |
<column/> |
117 | 117 |
<column/> |
118 |
<column/> |
|
119 |
<column/> |
|
120 |
<column/> |
|
121 |
<column/> |
|
122 |
<column/> |
|
123 |
<column/> |
|
124 |
<column/> |
|
125 |
<column/> |
|
118 | 126 |
</widget> |
119 | 127 |
</item> |
120 | 128 |
</layout> |
내보내기 Unified diff