13 |
13 |
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QFile, QFileInfo, QSize, \ |
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QFile, QFileInfo, QSize, \ |
15 QCoreApplication, QLocale |
15 QCoreApplication, QLocale |
16 from PyQt5.QtGui import QKeySequence |
16 from PyQt5.QtGui import QKeySequence |
17 from PyQt5.QtWidgets import QWhatsThis, QLabel, QWidget, QVBoxLayout, \ |
17 from PyQt5.QtWidgets import QWhatsThis, QLabel, QWidget, QVBoxLayout, \ |
18 QDialog, QAction, QFrame |
18 QDialog, QAction, QFrame, QMenu |
19 |
19 |
20 from E5Gui.E5Action import E5Action |
20 from E5Gui.E5Action import E5Action |
21 from E5Gui.E5MainWindow import E5MainWindow |
21 from E5Gui.E5MainWindow import E5MainWindow |
22 from E5Gui import E5FileDialog, E5MessageBox |
22 from E5Gui import E5FileDialog, E5MessageBox |
23 from E5Gui.E5ClickableLabel import E5ClickableLabel |
23 from E5Gui.E5ClickableLabel import E5ClickableLabel |
24 |
24 |
25 from Globals import strGroup |
25 from Globals import strGroup, recentNameHexFiles |
26 |
26 |
27 from .HexEditWidget import HexEditWidget |
27 from .HexEditWidget import HexEditWidget |
28 from .HexEditSearchReplaceWidget import HexEditSearchReplaceWidget |
28 from .HexEditSearchReplaceWidget import HexEditSearchReplaceWidget |
29 from .HexEditGotoWidget import HexEditGotoWidget |
29 from .HexEditGotoWidget import HexEditGotoWidget |
30 |
30 |
31 import UI.PixmapCache |
31 import UI.PixmapCache |
32 import UI.Config |
32 import UI.Config |
33 |
33 |
34 import Preferences |
34 import Preferences |
|
35 import Utilities |
35 |
36 |
36 |
37 |
37 class HexEditMainWindow(E5MainWindow): |
38 class HexEditMainWindow(E5MainWindow): |
38 """ |
39 """ |
39 Class implementing the web browser main window. |
40 Class implementing the web browser main window. |
41 @signal editorClosed() emitted after the window was requested to close down |
42 @signal editorClosed() emitted after the window was requested to close down |
42 """ |
43 """ |
43 editorClosed = pyqtSignal() |
44 editorClosed = pyqtSignal() |
44 |
45 |
45 windows = [] |
46 windows = [] |
|
47 |
|
48 maxMenuFilePathLen = 75 |
46 |
49 |
47 def __init__(self, fileName="", parent=None, fromEric=False, project=None): |
50 def __init__(self, fileName="", parent=None, fromEric=False, project=None): |
48 """ |
51 """ |
49 Constructor |
52 Constructor |
50 |
53 |
123 Preferences.getHexEditor("OpenInOverwriteMode")) |
126 Preferences.getHexEditor("OpenInOverwriteMode")) |
124 |
127 |
125 self.__project = project |
128 self.__project = project |
126 self.__lastOpenPath = "" |
129 self.__lastOpenPath = "" |
127 self.__lastSavePath = "" |
130 self.__lastSavePath = "" |
|
131 |
|
132 self.__recent = [] |
|
133 self.__loadRecent() |
128 |
134 |
129 self.__setCurrentFile("") |
135 self.__setCurrentFile("") |
130 if fileName: |
136 if fileName: |
131 self.__loadHexFile(fileName) |
137 self.__loadHexFile(fileName) |
132 |
138 |
648 |
654 |
649 def __initMenus(self): |
655 def __initMenus(self): |
650 """ |
656 """ |
651 Private method to create the menus. |
657 Private method to create the menus. |
652 """ |
658 """ |
653 # TODO: add "Open recent menu" |
|
654 mb = self.menuBar() |
659 mb = self.menuBar() |
655 |
660 |
656 menu = mb.addMenu(self.tr('&File')) |
661 menu = mb.addMenu(self.tr('&File')) |
657 menu.setTearOffEnabled(True) |
662 menu.setTearOffEnabled(True) |
|
663 self.__recentMenu = QMenu(self.tr('Open &Recent Files'), menu) |
658 menu.addAction(self.newWindowAct) |
664 menu.addAction(self.newWindowAct) |
659 menu.addAction(self.openAct) |
665 menu.addAction(self.openAct) |
660 menu.addAction(self.openReadOnlyAct) |
666 menu.addAction(self.openReadOnlyAct) |
|
667 self.__menuRecentAct = menu.addMenu(self.__recentMenu) |
661 menu.addSeparator() |
668 menu.addSeparator() |
662 menu.addAction(self.saveAct) |
669 menu.addAction(self.saveAct) |
663 menu.addAction(self.saveAsAct) |
670 menu.addAction(self.saveAsAct) |
664 menu.addAction(self.saveReadableAct) |
671 menu.addAction(self.saveReadableAct) |
665 menu.addSeparator() |
672 menu.addSeparator() |
668 if self.__fromEric: |
675 if self.__fromEric: |
669 menu.addAction(self.closeAllAct) |
676 menu.addAction(self.closeAllAct) |
670 else: |
677 else: |
671 menu.addSeparator() |
678 menu.addSeparator() |
672 menu.addAction(self.exitAct) |
679 menu.addAction(self.exitAct) |
|
680 menu.aboutToShow.connect(self.__showFileMenu) |
|
681 self.__recentMenu.aboutToShow.connect(self.__showRecentMenu) |
|
682 self.__recentMenu.triggered.connect(self.__openRecentHexFile) |
673 |
683 |
674 menu = mb.addMenu(self.tr("&Edit")) |
684 menu = mb.addMenu(self.tr("&Edit")) |
675 menu.setTearOffEnabled(True) |
685 menu.setTearOffEnabled(True) |
676 menu.addAction(self.undoAct) |
686 menu.addAction(self.undoAct) |
677 menu.addAction(self.redoAct) |
687 menu.addAction(self.redoAct) |
1202 |
1214 |
1203 @param fileName name of the file to register |
1215 @param fileName name of the file to register |
1204 @type str |
1216 @type str |
1205 """ |
1217 """ |
1206 self.__fileName = fileName |
1218 self.__fileName = fileName |
|
1219 # insert filename into list of recently opened files |
|
1220 self.__addToRecentList(fileName) |
1207 |
1221 |
1208 if not self.__fileName: |
1222 if not self.__fileName: |
1209 shownName = self.tr("Untitled") |
1223 shownName = self.tr("Untitled") |
1210 else: |
1224 else: |
1211 shownName = self.__strippedName(self.__fileName) |
1225 shownName = self.__strippedName(self.__fileName) |
1378 @rtype list of tuples of (int, str) |
1392 @rtype list of tuples of (int, str) |
1379 """ |
1393 """ |
1380 assert key in ['search', 'replace'] |
1394 assert key in ['search', 'replace'] |
1381 |
1395 |
1382 return self.__srHistory[key] |
1396 return self.__srHistory[key] |
|
1397 |
|
1398 @pyqtSlot() |
|
1399 def __showFileMenu(self): |
|
1400 """ |
|
1401 Private slot to modify the file menu before being shown. |
|
1402 """ |
|
1403 self.__menuRecentAct.setEnabled(len(self.__recent) > 0) |
|
1404 |
|
1405 @pyqtSlot() |
|
1406 def __showRecentMenu(self): |
|
1407 """ |
|
1408 Private slot to set up the recent files menu. |
|
1409 """ |
|
1410 self.__loadRecent() |
|
1411 |
|
1412 self.__recentMenu.clear() |
|
1413 |
|
1414 idx = 1 |
|
1415 for rs in self.__recent: |
|
1416 if idx < 10: |
|
1417 formatStr = '&{0:d}. {1}' |
|
1418 else: |
|
1419 formatStr = '{0:d}. {1}' |
|
1420 act = self.__recentMenu.addAction( |
|
1421 formatStr.format( |
|
1422 idx, |
|
1423 Utilities.compactPath( |
|
1424 rs, HexEditMainWindow.maxMenuFilePathLen))) |
|
1425 act.setData(rs) |
|
1426 act.setEnabled(QFileInfo(rs).exists()) |
|
1427 idx += 1 |
|
1428 |
|
1429 self.__recentMenu.addSeparator() |
|
1430 self.__recentMenu.addAction(self.tr('&Clear'), self.__clearRecent) |
|
1431 |
|
1432 @pyqtSlot(QAction) |
|
1433 def __openRecentHexFile(self, act): |
|
1434 """ |
|
1435 Private method to open a file from the list of recently opened files. |
|
1436 |
|
1437 @param act reference to the action that triggered (QAction) |
|
1438 """ |
|
1439 fileName = act.data() |
|
1440 if fileName and self.__maybeSave(): |
|
1441 self.__loadHexFile(fileName) |
|
1442 self.__editor.setReadOnly(Preferences.getHexEditor("OpenReadOnly")) |
|
1443 self.__checkActions() |
|
1444 |
|
1445 @pyqtSlot() |
|
1446 def __clearRecent(self): |
|
1447 """ |
|
1448 Private method to clear the list of recently opened files. |
|
1449 """ |
|
1450 self.__recent = [] |
|
1451 |
|
1452 def __loadRecent(self): |
|
1453 """ |
|
1454 Private method to load the list of recently opened files. |
|
1455 """ |
|
1456 self.__recent = [] |
|
1457 Preferences.Prefs.rsettings.sync() |
|
1458 rs = Preferences.Prefs.rsettings.value(recentNameHexFiles) |
|
1459 if rs is not None: |
|
1460 for f in Preferences.toList(rs): |
|
1461 if QFileInfo(f).exists(): |
|
1462 self.__recent.append(f) |
|
1463 |
|
1464 def __saveRecent(self): |
|
1465 """ |
|
1466 Private method to save the list of recently opened files. |
|
1467 """ |
|
1468 Preferences.Prefs.rsettings.setValue(recentNameHexFiles, self.__recent) |
|
1469 Preferences.Prefs.rsettings.sync() |
|
1470 |
|
1471 def __addToRecentList(self, fileName): |
|
1472 """ |
|
1473 Private method to add a file name to the list of recently opened files. |
|
1474 |
|
1475 @param fileName name of the file to be added |
|
1476 """ |
|
1477 if fileName: |
|
1478 for recent in self.__recent[:]: |
|
1479 if Utilities.samepath(fileName, recent): |
|
1480 self.__recent.remove(recent) |
|
1481 self.__recent.insert(0, fileName) |
|
1482 maxRecent = Preferences.getHexEditor("RecentNumber") |
|
1483 if len(self.__recent) > maxRecent: |
|
1484 self.__recent = self.__recent[:maxRecent] |
|
1485 self.__saveRecent() |