16 from PyQt6.QtCore import QProcess, QThread, pyqtSignal |
16 from PyQt6.QtCore import QProcess, QThread, pyqtSignal |
17 from PyQt6.QtWidgets import QApplication, QDialog, QMenu |
17 from PyQt6.QtWidgets import QApplication, QDialog, QMenu |
18 |
18 |
19 from eric7 import Preferences |
19 from eric7 import Preferences |
20 from eric7.EricGui import EricPixmapCache |
20 from eric7.EricGui import EricPixmapCache |
21 from eric7.EricWidgets import EricMessageBox |
21 from eric7.EricWidgets import EricMessageBox, EricPathPickerDialog |
22 from eric7.EricWidgets.EricApplication import ericApp |
22 from eric7.EricWidgets.EricApplication import ericApp |
|
23 from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes |
23 from eric7.EricWidgets.EricProgressDialog import EricProgressDialog |
24 from eric7.EricWidgets.EricProgressDialog import EricProgressDialog |
24 from eric7.Project.FileCategoryRepositoryItem import FileCategoryRepositoryItem |
25 from eric7.Project.FileCategoryRepositoryItem import FileCategoryRepositoryItem |
25 from eric7.Project.ProjectBaseBrowser import ProjectBaseBrowser |
26 from eric7.Project.ProjectBaseBrowser import ProjectBaseBrowser |
26 from eric7.Project.ProjectBrowserModel import ( |
27 from eric7.Project.ProjectBrowserModel import ( |
27 ProjectBrowserDirectoryItem, |
28 ProjectBrowserDirectoryItem, |
209 ) |
210 ) |
210 self.menuActions.append(act) |
211 self.menuActions.append(act) |
211 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
212 act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile) |
212 self.menuActions.append(act) |
213 self.menuActions.append(act) |
213 self.sourceMenu.addSeparator() |
214 self.sourceMenu.addSeparator() |
|
215 self.sourceMenu.addAction( |
|
216 self.tr("New protocol file..."), self.__addNewProtocolFile |
|
217 ) |
|
218 self.sourceMenu.addSeparator() |
214 self.sourceMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
219 self.sourceMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
215 self.sourceMenu.addAction( |
220 self.sourceMenu.addAction( |
216 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
221 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
217 ) |
222 ) |
218 self.sourceMenu.addSeparator() |
223 self.sourceMenu.addSeparator() |
247 self.tr("Compile all protocols as gRPC"), |
252 self.tr("Compile all protocols as gRPC"), |
248 functools.partial(self.__compileAllProtocols, grpc=True), |
253 functools.partial(self.__compileAllProtocols, grpc=True), |
249 ) |
254 ) |
250 self.menu.addSeparator() |
255 self.menu.addSeparator() |
251 self.menu.addAction(self.tr("Open"), self._openItem) |
256 self.menu.addAction(self.tr("Open"), self._openItem) |
|
257 self.menu.addSeparator() |
|
258 self.menu.addAction(self.tr("New protocol file..."), self.__addNewProtocolFile) |
252 self.menu.addSeparator() |
259 self.menu.addSeparator() |
253 self.menu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
260 self.menu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
254 self.menu.addAction( |
261 self.menu.addAction( |
255 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
262 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
256 ) |
263 ) |
268 ) |
275 ) |
269 self.backMenu.addSeparator() |
276 self.backMenu.addSeparator() |
270 self.backMenu.addAction( |
277 self.backMenu.addAction( |
271 self.tr("Compile all protocols as gRPC"), |
278 self.tr("Compile all protocols as gRPC"), |
272 functools.partial(self.__compileAllProtocols, grpc=True), |
279 functools.partial(self.__compileAllProtocols, grpc=True), |
|
280 ) |
|
281 self.backMenu.addSeparator() |
|
282 self.backMenu.addAction( |
|
283 self.tr("New protocol file..."), self.__addNewProtocolFile |
273 ) |
284 ) |
274 self.backMenu.addSeparator() |
285 self.backMenu.addSeparator() |
275 self.backMenu.addAction( |
286 self.backMenu.addAction( |
276 self.tr("Add protocols..."), lambda: self.project.addFiles("PROTOCOLS") |
287 self.tr("Add protocols..."), lambda: self.project.addFiles("PROTOCOLS") |
277 ) |
288 ) |
332 ) |
343 ) |
333 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile) |
344 act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile) |
334 self.dirMenuActions.append(act) |
345 self.dirMenuActions.append(act) |
335 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
346 act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory) |
336 self.dirMenuActions.append(act) |
347 self.dirMenuActions.append(act) |
|
348 self.dirMenu.addSeparator() |
|
349 self.dirMenu.addAction( |
|
350 self.tr("New protocol file..."), self.__addNewProtocolFile |
|
351 ) |
337 self.dirMenu.addSeparator() |
352 self.dirMenu.addSeparator() |
338 self.dirMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
353 self.dirMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles) |
339 self.dirMenu.addAction( |
354 self.dirMenu.addAction( |
340 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
355 self.tr("Add protocols directory..."), self.__addProtocolsDirectory |
341 ) |
356 ) |
516 ) |
531 ) |
517 elif isinstance(itm, BrowserClassAttributeItem): |
532 elif isinstance(itm, BrowserClassAttributeItem): |
518 self.sourceFile[str, int].emit( |
533 self.sourceFile[str, int].emit( |
519 itm.fileName(), itm.attributeObject().lineno |
534 itm.fileName(), itm.attributeObject().lineno |
520 ) |
535 ) |
|
536 |
|
537 def __addNewProtocolFile(self): |
|
538 """ |
|
539 Private method to add a new interface file to the project. |
|
540 """ |
|
541 itm = self.model().item(self.currentIndex()) |
|
542 if isinstance( |
|
543 itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem) |
|
544 ): |
|
545 dn = os.path.dirname(itm.fileName()) |
|
546 elif isinstance( |
|
547 itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
548 ): |
|
549 dn = itm.dirName() |
|
550 else: |
|
551 dn = "" |
|
552 |
|
553 filename, ok = EricPathPickerDialog.getStrPath( |
|
554 self, |
|
555 self.tr("New protocol file"), |
|
556 self.tr("Enter the path of the new protocol file:"), |
|
557 mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE, |
|
558 strPath=dn, |
|
559 defaultDirectory=dn, |
|
560 filters=self.project.getFileCategoryFilters( |
|
561 categories=["PROTOCOLS"], withAll=False |
|
562 ), |
|
563 ) |
|
564 if ok: |
|
565 if not os.path.splitext(filename)[1]: |
|
566 filename += ".proto" |
|
567 |
|
568 if os.path.exists(filename): |
|
569 EricMessageBox.critical( |
|
570 self, |
|
571 self.tr("New protocol file"), |
|
572 self.tr( |
|
573 "<p>The file <b>{0}</b> already exists. The action will be" |
|
574 " aborted.</p>" |
|
575 ).format(filename), |
|
576 ) |
|
577 return |
|
578 |
|
579 try: |
|
580 with open(filename, "w") as f: |
|
581 f.write("// {0}\n".format(self.project.getRelativePath(filename))) |
|
582 f.write('syntax = "proto2";\n') |
|
583 except OSError as err: |
|
584 EricMessageBox.critical( |
|
585 self, |
|
586 self.tr("New protocol file"), |
|
587 self.tr( |
|
588 "<p>The file <b>{0}</b> could not be created. Aborting...</p>" |
|
589 "<p>Reason: {1}</p>" |
|
590 ).format(filename, str(err)), |
|
591 ) |
|
592 return |
|
593 |
|
594 self.project.appendFile(filename) |
|
595 self.sourceFile[str].emit(filename) |
521 |
596 |
522 def __addProtocolFiles(self): |
597 def __addProtocolFiles(self): |
523 """ |
598 """ |
524 Private method to add protocol files to the project. |
599 Private method to add protocol files to the project. |
525 """ |
600 """ |