HexEdit/HexEditMainWindow.py

changeset 4695
9dc08852de25
parent 4687
f1d921533cc5
child 4696
bf4d19a7cade
equal deleted inserted replaced
4692:7b3b75d494c8 4695:9dc08852de25
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)
912 pass 922 pass
913 923
914 if not self.__fromEric: 924 if not self.__fromEric:
915 Preferences.syncPreferences() 925 Preferences.syncPreferences()
916 926
927 self.__saveRecent()
928
917 evt.accept() 929 evt.accept()
918 self.editorClosed.emit() 930 self.editorClosed.emit()
919 else: 931 else:
920 evt.ignore() 932 evt.ignore()
921 933
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()

eric ide

mercurial