Mercurial > lcfOS
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 |