comparison python/ide.py @ 259:ac603eb66b63

Added function call
author Windel Bouwman
date Mon, 05 Aug 2013 20:41:25 +0200
parents 04c19282a5aa
children 046017431c6a
comparison
equal deleted inserted replaced
258:04c19282a5aa 259:ac603eb66b63
14 stutil = __import__('st-util') 14 stutil = __import__('st-util')
15 import c3 15 import c3
16 import zcc 16 import zcc
17 import outstream 17 import outstream
18 18
19
19 class BuildOutput(QTextEdit): 20 class BuildOutput(QTextEdit):
20 """ Build output component """ 21 """ Build output component """
21 def __init__(self, parent=None): 22 def __init__(self, parent=None):
22 super(BuildOutput, self).__init__(parent) 23 super(BuildOutput, self).__init__(parent)
23 fmt = logging.Formatter(fmt=zcc.logformat) 24 fmt = logging.Formatter(fmt=zcc.logformat)
25
24 class MyHandler(logging.Handler): 26 class MyHandler(logging.Handler):
25 def emit(self2, x): 27 def emit(self2, x):
26 self.append(str(fmt.format(x))) 28 self.append(str(fmt.format(x)))
27 29
28 logging.getLogger().addHandler(MyHandler()) 30 logging.getLogger().addHandler(MyHandler())
31 logging.info('Build output will appear here!') 33 logging.info('Build output will appear here!')
32 34
33 35
34 class BuildErrors(QTreeView): 36 class BuildErrors(QTreeView):
35 sigErrorSelected = pyqtSignal(object) 37 sigErrorSelected = pyqtSignal(object)
38
36 def __init__(self, parent=None): 39 def __init__(self, parent=None):
37 super(BuildErrors, self).__init__(parent) 40 super(BuildErrors, self).__init__(parent)
38 model = QStandardItemModel() 41 model = QStandardItemModel()
39 self.setModel(model) 42 self.setModel(model)
40 self.clicked.connect(self.itemSelected) 43 self.clicked.connect(self.itemSelected)
42 self.model = QStandardItemModel() 45 self.model = QStandardItemModel()
43 self.model.setHorizontalHeaderLabels(['Message', 'Row', 'Column']) 46 self.model.setHorizontalHeaderLabels(['Message', 'Row', 'Column'])
44 self.setModel(self.model) 47 self.setModel(self.model)
45 48
46 def setErrorList(self, errorlist): 49 def setErrorList(self, errorlist):
47 c = self.model.rowCount() 50 c = self.model.rowCount()
48 self.model.removeRows(0, c) 51 self.model.removeRows(0, c)
49 for e in errorlist: 52 for e in errorlist:
50 item = QStandardItem(self.errorIcon, str(e.msg)) 53 item = QStandardItem(self.errorIcon, str(e.msg))
51 item.setData(e) 54 item.setData(e)
52 irow = QStandardItem(str(e.loc.row)) 55 irow = QStandardItem(str(e.loc.row))
53 irow.setData(e) 56 irow.setData(e)
54 icol = QStandardItem(str(e.loc.col)) 57 icol = QStandardItem(str(e.loc.col))
55 icol.setData(e) 58 icol.setData(e)
56 self.model.appendRow([item, irow, icol]) 59 self.model.appendRow([item, irow, icol])
57 60
58 def itemSelected(self, index): 61 def itemSelected(self, index):
59 if not index.isValid(): 62 if not index.isValid():
60 return 63 return
61 item = self.model.itemFromIndex(index) 64 item = self.model.itemFromIndex(index)
85 88
86 class Ide(QMainWindow): 89 class Ide(QMainWindow):
87 def __init__(self, parent=None): 90 def __init__(self, parent=None):
88 super(Ide, self).__init__(parent) 91 super(Ide, self).__init__(parent)
89 self.to_open_files = [] 92 self.to_open_files = []
93 self.logger = logging.getLogger('ide')
90 94
91 self.setWindowTitle('LCFOS IDE') 95 self.setWindowTitle('LCFOS IDE')
92 icon = QIcon('icons/logo.png') 96 icon = QIcon('icons/logo.png')
93 self.setWindowIcon(icon) 97 self.setWindowIcon(icon)
94 98
105 self.mdiArea.setTabsMovable(True) 109 self.mdiArea.setTabsMovable(True)
106 self.setCentralWidget(self.mdiArea) 110 self.setCentralWidget(self.mdiArea)
107 111
108 # Create components: 112 # Create components:
109 def addComponent(name, widget): 113 def addComponent(name, widget):
110 dw = QDockWidget(name) 114 dw = QDockWidget(name)
111 dw.setWidget(widget) 115 dw.setWidget(widget)
112 dw.setObjectName(name) 116 dw.setObjectName(name)
113 self.addDockWidget(Qt.RightDockWidgetArea, dw) 117 self.addDockWidget(Qt.RightDockWidgetArea, dw)
114 self.viewMenu.addAction(dw.toggleViewAction()) 118 self.viewMenu.addAction(dw.toggleViewAction())
115 return widget 119 return widget
116 120
117 self.buildOutput = addComponent('Build output', BuildOutput()) 121 self.buildOutput = addComponent('Build output', BuildOutput())
118 self.astViewer = addComponent('AST viewer', AstViewer()) 122 self.astViewer = addComponent('AST viewer', AstViewer())
119 self.astViewer.sigNodeSelected.connect(lambda node: self.showLoc(node.loc)) 123 self.astViewer.sigNodeSelected.connect(lambda node: self.showLoc(node.loc))
120 self.builderrors = addComponent('Build errors', BuildErrors()) 124 self.builderrors = addComponent('Build errors', BuildErrors())
133 self.ctrlToolbar.codePosition.connect(self.pointCode) 137 self.ctrlToolbar.codePosition.connect(self.pointCode)
134 138
135 # About dialog: 139 # About dialog:
136 self.aboutDialog = AboutDialog() 140 self.aboutDialog = AboutDialog()
137 self.aboutDialog.setWindowIcon(icon) 141 self.aboutDialog.setWindowIcon(icon)
142
138 # Create actions: 143 # Create actions:
139 def addMenuEntry(name, menu, callback, shortcut=None): 144 def addMenuEntry(name, menu, callback, shortcut=None):
140 a = QAction(name, self) 145 a = QAction(name, self)
141 menu.addAction(a) 146 menu.addAction(a)
142 a.triggered.connect(callback) 147 a.triggered.connect(callback)
143 if shortcut: 148 if shortcut:
144 a.setShortcut(shortcut) 149 a.setShortcut(shortcut)
145 150
146 addMenuEntry("New", self.fileMenu, self.newFile, shortcut=QKeySequence(QKeySequence.New)) 151 addMenuEntry("New", self.fileMenu, self.newFile, shortcut=QKeySequence(QKeySequence.New))
147 addMenuEntry("Open", self.fileMenu, self.openFile, shortcut=QKeySequence(QKeySequence.Open)) 152 addMenuEntry("Open", self.fileMenu, self.openFile, shortcut=QKeySequence(QKeySequence.Open))
148 addMenuEntry("Save", self.fileMenu, self.saveFile, shortcut=QKeySequence(QKeySequence.Save)) 153 addMenuEntry("Save", self.fileMenu, self.saveFile, shortcut=QKeySequence(QKeySequence.Save))
149 addMenuEntry("Build", self.fileMenu, self.buildFile, shortcut=QKeySequence("F7")) 154 addMenuEntry("Build", self.fileMenu, self.buildFile, shortcut=QKeySequence("F7"))
150 addMenuEntry("Build and flash", self.fileMenu, self.buildFileAndFlash, shortcut=QKeySequence("F8")) 155 addMenuEntry("Build and flash", self.fileMenu, self.buildFileAndFlash, shortcut=QKeySequence("F8"))
151 156
152 self.helpAction = QAction('Help', self) 157 self.helpAction = QAction('Help', self)
153 self.helpAction.setShortcut(QKeySequence('F1')) 158 self.helpAction.setShortcut(QKeySequence('F1'))
154 self.helpMenu.addAction(self.helpAction) 159 self.helpMenu.addAction(self.helpAction)
155 addMenuEntry('About', self.helpMenu, self.aboutDialog.open) 160 addMenuEntry('About', self.helpMenu, self.aboutDialog.open)
156 161
157 addMenuEntry('Cascade windows', self.viewMenu, self.mdiArea.cascadeSubWindows) 162 addMenuEntry('Cascade windows', self.viewMenu, self.mdiArea.cascadeSubWindows)
168 def newFile(self): 173 def newFile(self):
169 self.newCodeEdit() 174 self.newCodeEdit()
170 175
171 def openFile(self): 176 def openFile(self):
172 filename = QFileDialog.getOpenFileName(self, "Open C3 file...", "*.c3", 177 filename = QFileDialog.getOpenFileName(self, "Open C3 file...", "*.c3",
173 "C3 source files (*.c3)") 178 "C3 source files (*.c3)")
174 if filename: 179 if filename:
175 self.loadFile(filename) 180 self.loadFile(filename)
176 181
177 def saveFile(self): 182 def saveFile(self):
178 ac = self.activeMdiChild() 183 ac = self.activeMdiChild()
272 277
273 # Set errors: 278 # Set errors:
274 self.builderrors.setErrorList(self.diag.diags) 279 self.builderrors.setErrorList(self.diag.diags)
275 ce.setErrors(self.diag.diags) 280 ce.setErrors(self.diag.diags)
276 self.astViewer.setAst(pkg) 281 self.astViewer.setAst(pkg)
277 logging.info('Done!') 282 self.logger.info('Done!')
278 283
279 def buildFile(self): 284 def buildFile(self):
280 ce = self.activeMdiChild() 285 ce = self.activeMdiChild()
281 if not ce: 286 if not ce:
282 return 287 return
308 self.ctrlToolbar.device.writeFlash(0x08000000, bts) 313 self.ctrlToolbar.device.writeFlash(0x08000000, bts)
309 stl = self.ctrlToolbar.device.iface 314 stl = self.ctrlToolbar.device.iface
310 stl.reset() 315 stl.reset()
311 stl.halt() 316 stl.halt()
312 stl.run() 317 stl.run()
313 logging.info('Done!') 318 logging.info('Done!')
319 else:
320 self.logger.warning('Not connected to device, skipping flash')
314 321
315 322
316 if __name__ == '__main__': 323 if __name__ == '__main__':
317 logging.basicConfig(format=zcc.logformat, level=logging.DEBUG) 324 logging.basicConfig(format=zcc.logformat, level=logging.DEBUG)
318 app = QApplication(sys.argv) 325 app = QApplication(sys.argv)
319 ide = Ide() 326 ide = Ide()
320 ide.show() 327 ide.show()
321 logging.info('IDE started') 328 ide.logger.info('IDE started')
322 app.exec_() 329 app.exec_()
323 330