|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a stand alone shell window. |
|
8 """ |
|
9 |
|
10 import sys |
|
11 import os |
|
12 |
|
13 from PyQt5.QtCore import ( |
|
14 Qt, QCoreApplication, QPoint, QSize, QSignalMapper, QProcess |
|
15 ) |
|
16 from PyQt5.QtGui import QKeySequence |
|
17 from PyQt5.QtWidgets import ( |
|
18 QWidget, QVBoxLayout, QApplication, QAction, QWhatsThis, QDialog |
|
19 ) |
|
20 from PyQt5.Qsci import QsciScintilla |
|
21 |
|
22 from E5Gui.E5MainWindow import E5MainWindow |
|
23 from E5Gui.E5Action import E5Action, createActionGroup |
|
24 from E5Gui.E5Application import e5App |
|
25 from E5Gui.E5ZoomWidget import E5ZoomWidget |
|
26 from E5Gui import E5MessageBox |
|
27 |
|
28 import UI.Config |
|
29 import UI.PixmapCache |
|
30 import Preferences |
|
31 |
|
32 from Globals import isMacPlatform |
|
33 |
|
34 from .Shell import Shell |
|
35 from .APIsManager import APIsManager |
|
36 |
|
37 from Debugger.DebugServer import DebugServer |
|
38 from UI.SearchWidget import SearchWidget |
|
39 from VirtualEnv.VirtualenvManager import VirtualenvManager |
|
40 |
|
41 from eric6config import getConfig |
|
42 |
|
43 |
|
44 class ShellWindow(E5MainWindow): |
|
45 """ |
|
46 Class implementing a stand alone shell window. |
|
47 """ |
|
48 def __init__(self, originalPathString, parent=None, name=None): |
|
49 """ |
|
50 Constructor |
|
51 |
|
52 @param originalPathString original PATH environment variable |
|
53 @type str |
|
54 @param parent reference to the parent widget |
|
55 @type QWidget |
|
56 @param name object name of the window |
|
57 @type str |
|
58 """ |
|
59 super().__init__(parent) |
|
60 if name is not None: |
|
61 self.setObjectName(name) |
|
62 self.setWindowIcon(UI.PixmapCache.getIcon("shell")) |
|
63 self.setWindowTitle(self.tr("eric Shell")) |
|
64 |
|
65 self.setStyle(Preferences.getUI("Style"), |
|
66 Preferences.getUI("StyleSheet")) |
|
67 |
|
68 self.__lastDebuggerId = "" |
|
69 |
|
70 # initialize the APIs manager |
|
71 self.__apisManager = APIsManager(parent=self) |
|
72 |
|
73 # initialize the debug server and shell widgets |
|
74 self.__debugServer = DebugServer(originalPathString, |
|
75 preventPassiveDebugging=True, |
|
76 parent=self) |
|
77 self.__debugServer.clientDebuggerId.connect(self.__clientDebuggerId) |
|
78 |
|
79 self.__shell = Shell(self.__debugServer, self, None, True, self) |
|
80 self.__shell.registerDebuggerIdMethod(self.getDebuggerId) |
|
81 |
|
82 self.__searchWidget = SearchWidget(self.__shell, self, showLine=True) |
|
83 |
|
84 centralWidget = QWidget() |
|
85 layout = QVBoxLayout() |
|
86 layout.setContentsMargins(1, 1, 1, 1) |
|
87 layout.addWidget(self.__shell) |
|
88 layout.addWidget(self.__searchWidget) |
|
89 centralWidget.setLayout(layout) |
|
90 self.setCentralWidget(centralWidget) |
|
91 self.__searchWidget.hide() |
|
92 |
|
93 self.__searchWidget.searchNext.connect(self.__shell.searchNext) |
|
94 self.__searchWidget.searchPrevious.connect(self.__shell.searchPrev) |
|
95 self.__shell.searchStringFound.connect( |
|
96 self.__searchWidget.searchStringFound) |
|
97 |
|
98 self.__shell.zoomValueChanged.connect(self.__zoomValueChanged) |
|
99 |
|
100 self.__createActions() |
|
101 self.__createMenus() |
|
102 self.__createToolBars() |
|
103 self.__createStatusBar() |
|
104 |
|
105 self.__readSettings() |
|
106 |
|
107 self.__shell.historyStyleChanged.connect(self.__historyStyleChanged) |
|
108 |
|
109 # Generate the virtual environment manager and register it |
|
110 self.virtualenvManager = VirtualenvManager(self) |
|
111 e5App().registerObject("VirtualEnvManager", self.virtualenvManager) |
|
112 |
|
113 self.__shell.virtualEnvironmentChanged.connect( |
|
114 self.__virtualEnvironmentChanged) |
|
115 |
|
116 # now start the debug client with the most recently used virtual |
|
117 # environment |
|
118 self.__debugServer.startClient( |
|
119 False, venvName=Preferences.getShell("LastVirtualEnvironment") |
|
120 ) |
|
121 |
|
122 # set the keyboard input interval |
|
123 interval = Preferences.getUI("KeyboardInputInterval") |
|
124 if interval > 0: |
|
125 QApplication.setKeyboardInputInterval(interval) |
|
126 |
|
127 def closeEvent(self, event): |
|
128 """ |
|
129 Protected method to handle the close event. |
|
130 |
|
131 @param event close event |
|
132 @type QCloseEvent |
|
133 """ |
|
134 self.__writeSettings() |
|
135 self.__debugServer.shutdownServer() |
|
136 self.__shell.closeShell() |
|
137 Preferences.syncPreferences() |
|
138 |
|
139 event.accept() |
|
140 |
|
141 def __clientDebuggerId(self, debuggerId): |
|
142 """ |
|
143 Private slot to receive the ID of a newly connected debugger backend. |
|
144 |
|
145 @param debuggerId ID of a newly connected debugger backend |
|
146 @type str |
|
147 """ |
|
148 self.__lastDebuggerId = debuggerId |
|
149 |
|
150 def getDebuggerId(self): |
|
151 """ |
|
152 Public method to get the most recently registered debugger ID. |
|
153 |
|
154 @return debugger ID |
|
155 @rtype str |
|
156 """ |
|
157 return self.__lastDebuggerId |
|
158 |
|
159 ################################################################## |
|
160 ## Below are API handling methods |
|
161 ################################################################## |
|
162 |
|
163 def getAPIsManager(self): |
|
164 """ |
|
165 Public method to get a reference to the APIs manager. |
|
166 |
|
167 @return the APIs manager object (eric6.QScintilla.APIsManager) |
|
168 """ |
|
169 return self.__apisManager |
|
170 |
|
171 ################################################################## |
|
172 ## Below are action related methods |
|
173 ################################################################## |
|
174 |
|
175 def __readShortcut(self, act, category): |
|
176 """ |
|
177 Private function to read a single keyboard shortcut from the settings. |
|
178 |
|
179 @param act reference to the action object |
|
180 @type E5Action |
|
181 @param category category the action belongs to |
|
182 @type str |
|
183 """ |
|
184 if act.objectName(): |
|
185 accel = Preferences.Prefs.settings.value( |
|
186 "Shortcuts/{0}/{1}/Accel".format(category, act.objectName())) |
|
187 if accel is not None: |
|
188 act.setShortcut(QKeySequence(accel)) |
|
189 accel = Preferences.Prefs.settings.value( |
|
190 "Shortcuts/{0}/{1}/AltAccel".format( |
|
191 category, act.objectName())) |
|
192 if accel is not None: |
|
193 act.setAlternateShortcut(QKeySequence(accel), removeEmpty=True) |
|
194 |
|
195 def __createActions(self): |
|
196 """ |
|
197 Private method to create the actions. |
|
198 """ |
|
199 self.fileActions = [] |
|
200 self.editActions = [] |
|
201 self.searchActions = [] |
|
202 self.viewActions = [] |
|
203 self.helpActions = [] |
|
204 |
|
205 self.viewActGrp = createActionGroup(self) |
|
206 |
|
207 self.__createFileActions() |
|
208 self.__createEditActions() |
|
209 self.__createSearchActions() |
|
210 self.__createViewActions() |
|
211 self.__createHelpActions() |
|
212 self.__createHistoryActions() |
|
213 |
|
214 # read the keyboard shortcuts and make them identical to the main |
|
215 # eric shortcuts |
|
216 for act in self.helpActions: |
|
217 self.__readShortcut(act, "General") |
|
218 for act in self.editActions: |
|
219 self.__readShortcut(act, "Edit") |
|
220 for act in self.fileActions: |
|
221 self.__readShortcut(act, "View") |
|
222 for act in self.searchActions: |
|
223 self.__readShortcut(act, "Search") |
|
224 |
|
225 def __createFileActions(self): |
|
226 """ |
|
227 Private method defining the user interface actions for the file |
|
228 commands. |
|
229 """ |
|
230 self.exitAct = E5Action( |
|
231 self.tr('Quit'), |
|
232 UI.PixmapCache.getIcon("exit"), |
|
233 self.tr('&Quit'), |
|
234 QKeySequence(self.tr("Ctrl+Q", "File|Quit")), |
|
235 0, self, 'quit') |
|
236 self.exitAct.setStatusTip(self.tr('Quit the Shell')) |
|
237 self.exitAct.setWhatsThis(self.tr( |
|
238 """<b>Quit the Shell</b>""" |
|
239 """<p>This quits the Shell window.</p>""" |
|
240 )) |
|
241 self.exitAct.triggered.connect(self.quit) |
|
242 self.exitAct.setMenuRole(QAction.MenuRole.QuitRole) |
|
243 self.fileActions.append(self.exitAct) |
|
244 |
|
245 self.newWindowAct = E5Action( |
|
246 self.tr('New Window'), |
|
247 UI.PixmapCache.getIcon("newWindow"), |
|
248 self.tr('New &Window'), |
|
249 QKeySequence(self.tr("Ctrl+Shift+N", "File|New Window")), |
|
250 0, self, 'new_window') |
|
251 self.newWindowAct.setStatusTip(self.tr( |
|
252 'Open a new Shell window')) |
|
253 self.newWindowAct.setWhatsThis(self.tr( |
|
254 """<b>New Window</b>""" |
|
255 """<p>This opens a new instance of the Shell window.</p>""" |
|
256 )) |
|
257 self.newWindowAct.triggered.connect(self.__newWindow) |
|
258 self.fileActions.append(self.newWindowAct) |
|
259 |
|
260 self.restartAct = E5Action( |
|
261 self.tr('Restart'), |
|
262 UI.PixmapCache.getIcon("restart"), |
|
263 self.tr('Restart'), |
|
264 0, 0, self, 'shell_restart') |
|
265 self.restartAct.setStatusTip(self.tr( |
|
266 'Restart the shell')) |
|
267 self.restartAct.setWhatsThis(self.tr( |
|
268 """<b>Restart</b>""" |
|
269 """<p>Restart the shell for the currently selected""" |
|
270 """ environment.</p>""" |
|
271 )) |
|
272 self.restartAct.triggered.connect(self.__shell.doRestart) |
|
273 self.fileActions.append(self.restartAct) |
|
274 |
|
275 self.clearRestartAct = E5Action( |
|
276 self.tr('Restart and Clear'), |
|
277 UI.PixmapCache.getIcon("restartDelete"), |
|
278 self.tr('Restart and Clear'), |
|
279 Qt.Key.Key_F4, 0, self, 'shell_clear_restart') |
|
280 self.clearRestartAct.setStatusTip(self.tr( |
|
281 'Clear the window and restart the shell')) |
|
282 self.clearRestartAct.setWhatsThis(self.tr( |
|
283 """<b>Restart and Clear</b>""" |
|
284 """<p>Clear the shell window and restart the shell for the""" |
|
285 """ currently selected environment.</p>""" |
|
286 )) |
|
287 self.clearRestartAct.triggered.connect(self.__shell.doClearRestart) |
|
288 self.fileActions.append(self.clearRestartAct) |
|
289 |
|
290 def __createEditActions(self): |
|
291 """ |
|
292 Private method defining the user interface actions for the edit |
|
293 commands. |
|
294 """ |
|
295 self.editActGrp = createActionGroup(self) |
|
296 self.copyActGrp = createActionGroup(self.editActGrp) |
|
297 |
|
298 self.cutAct = E5Action( |
|
299 QCoreApplication.translate('ViewManager', 'Cut'), |
|
300 UI.PixmapCache.getIcon("editCut"), |
|
301 QCoreApplication.translate('ViewManager', 'Cu&t'), |
|
302 QKeySequence(QCoreApplication.translate( |
|
303 'ViewManager', "Ctrl+X", "Edit|Cut")), |
|
304 QKeySequence(QCoreApplication.translate( |
|
305 'ViewManager', "Shift+Del", "Edit|Cut")), |
|
306 self.copyActGrp, 'vm_edit_cut') |
|
307 self.cutAct.setStatusTip(QCoreApplication.translate( |
|
308 'ViewManager', 'Cut the selection')) |
|
309 self.cutAct.setWhatsThis(self.tr( |
|
310 """<b>Cut</b>""" |
|
311 """<p>Cut the selected text to the clipboard.</p>""" |
|
312 )) |
|
313 self.cutAct.triggered.connect(self.__shell.cut) |
|
314 self.editActions.append(self.cutAct) |
|
315 |
|
316 self.copyAct = E5Action( |
|
317 QCoreApplication.translate('ViewManager', 'Copy'), |
|
318 UI.PixmapCache.getIcon("editCopy"), |
|
319 QCoreApplication.translate('ViewManager', '&Copy'), |
|
320 QKeySequence(QCoreApplication.translate( |
|
321 'ViewManager', "Ctrl+C", "Edit|Copy")), |
|
322 QKeySequence(QCoreApplication.translate( |
|
323 'ViewManager', "Ctrl+Ins", "Edit|Copy")), |
|
324 self.copyActGrp, 'vm_edit_copy') |
|
325 self.copyAct.setStatusTip(QCoreApplication.translate( |
|
326 'ViewManager', 'Copy the selection')) |
|
327 self.copyAct.setWhatsThis(self.tr( |
|
328 """<b>Copy</b>""" |
|
329 """<p>Copy the selected text to the clipboard.</p>""" |
|
330 )) |
|
331 self.copyAct.triggered.connect(self.__shell.copy) |
|
332 self.editActions.append(self.copyAct) |
|
333 |
|
334 self.pasteAct = E5Action( |
|
335 QCoreApplication.translate('ViewManager', 'Paste'), |
|
336 UI.PixmapCache.getIcon("editPaste"), |
|
337 QCoreApplication.translate('ViewManager', '&Paste'), |
|
338 QKeySequence(QCoreApplication.translate( |
|
339 'ViewManager', "Ctrl+V", "Edit|Paste")), |
|
340 QKeySequence(QCoreApplication.translate( |
|
341 'ViewManager', "Shift+Ins", "Edit|Paste")), |
|
342 self.copyActGrp, 'vm_edit_paste') |
|
343 self.pasteAct.setStatusTip(QCoreApplication.translate( |
|
344 'ViewManager', 'Paste the last cut/copied text')) |
|
345 self.pasteAct.setWhatsThis(self.tr( |
|
346 """<b>Paste</b>""" |
|
347 """<p>Paste the last cut/copied text from the clipboard.</p>""" |
|
348 )) |
|
349 self.pasteAct.triggered.connect(self.__shell.paste) |
|
350 self.editActions.append(self.pasteAct) |
|
351 |
|
352 self.clearAct = E5Action( |
|
353 QCoreApplication.translate('ViewManager', 'Clear'), |
|
354 UI.PixmapCache.getIcon("editDelete"), |
|
355 QCoreApplication.translate('ViewManager', 'Clear'), |
|
356 QKeySequence(QCoreApplication.translate( |
|
357 'ViewManager', "Alt+Shift+C", "Edit|Clear")), |
|
358 0, |
|
359 self.copyActGrp, 'vm_edit_clear') |
|
360 self.clearAct.setStatusTip(QCoreApplication.translate( |
|
361 'ViewManager', 'Clear all text')) |
|
362 self.clearAct.setWhatsThis(self.tr( |
|
363 """<b>Clear</b>""" |
|
364 """<p>Delete all text.</p>""" |
|
365 )) |
|
366 self.clearAct.triggered.connect(self.__shell.clear) |
|
367 self.editActions.append(self.clearAct) |
|
368 |
|
369 self.cutAct.setEnabled(False) |
|
370 self.copyAct.setEnabled(False) |
|
371 self.__shell.copyAvailable.connect(self.cutAct.setEnabled) |
|
372 self.__shell.copyAvailable.connect(self.copyAct.setEnabled) |
|
373 |
|
374 #################################################################### |
|
375 ## Below follow the actions for QScintilla standard commands. |
|
376 #################################################################### |
|
377 |
|
378 self.esm = QSignalMapper(self) |
|
379 try: |
|
380 self.esm.mappedInt.connect(self.__shell.editorCommand) |
|
381 except AttributeError: |
|
382 # pre Qt 5.15 |
|
383 self.esm.mapped[int].connect(self.__shell.editorCommand) |
|
384 |
|
385 self.editorActGrp = createActionGroup(self) |
|
386 |
|
387 act = E5Action( |
|
388 QCoreApplication.translate('ViewManager', 'Delete current line'), |
|
389 QCoreApplication.translate('ViewManager', 'Delete current line'), |
|
390 QKeySequence(QCoreApplication.translate( |
|
391 'ViewManager', 'Ctrl+Shift+L')), |
|
392 0, |
|
393 self.editorActGrp, 'vm_edit_delete_current_line') |
|
394 self.esm.setMapping(act, QsciScintilla.SCI_LINEDELETE) |
|
395 act.triggered.connect(self.esm.map) |
|
396 self.editActions.append(act) |
|
397 |
|
398 act = E5Action( |
|
399 QCoreApplication.translate('ViewManager', 'Indent one level'), |
|
400 QCoreApplication.translate('ViewManager', 'Indent one level'), |
|
401 QKeySequence(QCoreApplication.translate('ViewManager', 'Tab')), 0, |
|
402 self.editorActGrp, 'vm_edit_indent_one_level') |
|
403 self.esm.setMapping(act, QsciScintilla.SCI_TAB) |
|
404 act.triggered.connect(self.esm.map) |
|
405 self.editActions.append(act) |
|
406 |
|
407 act = E5Action( |
|
408 QCoreApplication.translate('ViewManager', 'Insert new line'), |
|
409 QCoreApplication.translate('ViewManager', 'Insert new line'), |
|
410 QKeySequence(QCoreApplication.translate('ViewManager', 'Return')), |
|
411 QKeySequence(QCoreApplication.translate('ViewManager', 'Enter')), |
|
412 self.editorActGrp, 'vm_edit_insert_line') |
|
413 self.esm.setMapping(act, QsciScintilla.SCI_NEWLINE) |
|
414 act.triggered.connect(self.esm.map) |
|
415 self.editActions.append(act) |
|
416 |
|
417 act = E5Action( |
|
418 QCoreApplication.translate('ViewManager', |
|
419 'Delete previous character'), |
|
420 QCoreApplication.translate('ViewManager', |
|
421 'Delete previous character'), |
|
422 QKeySequence(QCoreApplication.translate('ViewManager', |
|
423 'Backspace')), |
|
424 0, self.editorActGrp, 'vm_edit_delete_previous_char') |
|
425 if isMacPlatform(): |
|
426 act.setAlternateShortcut(QKeySequence( |
|
427 QCoreApplication.translate('ViewManager', 'Meta+H'))) |
|
428 else: |
|
429 act.setAlternateShortcut(QKeySequence( |
|
430 QCoreApplication.translate('ViewManager', 'Shift+Backspace'))) |
|
431 self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACK) |
|
432 act.triggered.connect(self.esm.map) |
|
433 self.editActions.append(act) |
|
434 |
|
435 act = E5Action( |
|
436 QCoreApplication.translate('ViewManager', |
|
437 'Delete current character'), |
|
438 QCoreApplication.translate('ViewManager', |
|
439 'Delete current character'), |
|
440 QKeySequence(QCoreApplication.translate('ViewManager', 'Del')), |
|
441 0, self.editorActGrp, 'vm_edit_delete_current_char') |
|
442 if isMacPlatform(): |
|
443 act.setAlternateShortcut(QKeySequence( |
|
444 QCoreApplication.translate('ViewManager', 'Meta+D'))) |
|
445 self.esm.setMapping(act, QsciScintilla.SCI_CLEAR) |
|
446 act.triggered.connect(self.esm.map) |
|
447 self.editActions.append(act) |
|
448 |
|
449 act = E5Action( |
|
450 QCoreApplication.translate('ViewManager', 'Delete word to left'), |
|
451 QCoreApplication.translate('ViewManager', 'Delete word to left'), |
|
452 QKeySequence(QCoreApplication.translate( |
|
453 'ViewManager', 'Ctrl+Backspace')), |
|
454 0, |
|
455 self.editorActGrp, 'vm_edit_delete_word_left') |
|
456 self.esm.setMapping(act, QsciScintilla.SCI_DELWORDLEFT) |
|
457 act.triggered.connect(self.esm.map) |
|
458 self.editActions.append(act) |
|
459 |
|
460 act = E5Action( |
|
461 QCoreApplication.translate('ViewManager', 'Delete word to right'), |
|
462 QCoreApplication.translate('ViewManager', 'Delete word to right'), |
|
463 QKeySequence(QCoreApplication.translate('ViewManager', |
|
464 'Ctrl+Del')), |
|
465 0, self.editorActGrp, 'vm_edit_delete_word_right') |
|
466 self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHT) |
|
467 act.triggered.connect(self.esm.map) |
|
468 self.editActions.append(act) |
|
469 |
|
470 act = E5Action( |
|
471 QCoreApplication.translate('ViewManager', 'Delete line to left'), |
|
472 QCoreApplication.translate('ViewManager', 'Delete line to left'), |
|
473 QKeySequence(QCoreApplication.translate( |
|
474 'ViewManager', 'Ctrl+Shift+Backspace')), |
|
475 0, |
|
476 self.editorActGrp, 'vm_edit_delete_line_left') |
|
477 self.esm.setMapping(act, QsciScintilla.SCI_DELLINELEFT) |
|
478 act.triggered.connect(self.esm.map) |
|
479 self.editActions.append(act) |
|
480 |
|
481 act = E5Action( |
|
482 QCoreApplication.translate('ViewManager', 'Delete line to right'), |
|
483 QCoreApplication.translate('ViewManager', 'Delete line to right'), |
|
484 0, 0, |
|
485 self.editorActGrp, 'vm_edit_delete_line_right') |
|
486 if isMacPlatform(): |
|
487 act.setShortcut(QKeySequence( |
|
488 QCoreApplication.translate('ViewManager', 'Meta+K'))) |
|
489 else: |
|
490 act.setShortcut(QKeySequence( |
|
491 QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Del'))) |
|
492 self.esm.setMapping(act, QsciScintilla.SCI_DELLINERIGHT) |
|
493 act.triggered.connect(self.esm.map) |
|
494 self.editActions.append(act) |
|
495 |
|
496 act = E5Action( |
|
497 QCoreApplication.translate('ViewManager', |
|
498 'Move left one character'), |
|
499 QCoreApplication.translate('ViewManager', |
|
500 'Move left one character'), |
|
501 QKeySequence(QCoreApplication.translate('ViewManager', 'Left')), 0, |
|
502 self.editorActGrp, 'vm_edit_move_left_char') |
|
503 self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFT) |
|
504 if isMacPlatform(): |
|
505 act.setAlternateShortcut(QKeySequence( |
|
506 QCoreApplication.translate('ViewManager', 'Meta+B'))) |
|
507 act.triggered.connect(self.esm.map) |
|
508 self.editActions.append(act) |
|
509 |
|
510 act = E5Action( |
|
511 QCoreApplication.translate('ViewManager', |
|
512 'Move right one character'), |
|
513 QCoreApplication.translate('ViewManager', |
|
514 'Move right one character'), |
|
515 QKeySequence(QCoreApplication.translate('ViewManager', 'Right')), |
|
516 0, self.editorActGrp, 'vm_edit_move_right_char') |
|
517 if isMacPlatform(): |
|
518 act.setAlternateShortcut(QKeySequence( |
|
519 QCoreApplication.translate('ViewManager', 'Meta+F'))) |
|
520 self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHT) |
|
521 act.triggered.connect(self.esm.map) |
|
522 self.editActions.append(act) |
|
523 |
|
524 act = E5Action( |
|
525 QCoreApplication.translate('ViewManager', 'Move left one word'), |
|
526 QCoreApplication.translate('ViewManager', 'Move left one word'), |
|
527 0, 0, |
|
528 self.editorActGrp, 'vm_edit_move_left_word') |
|
529 if isMacPlatform(): |
|
530 act.setShortcut(QKeySequence( |
|
531 QCoreApplication.translate('ViewManager', 'Alt+Left'))) |
|
532 else: |
|
533 act.setShortcut(QKeySequence( |
|
534 QCoreApplication.translate('ViewManager', 'Ctrl+Left'))) |
|
535 self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFT) |
|
536 act.triggered.connect(self.esm.map) |
|
537 self.editActions.append(act) |
|
538 |
|
539 act = E5Action( |
|
540 QCoreApplication.translate('ViewManager', 'Move right one word'), |
|
541 QCoreApplication.translate('ViewManager', 'Move right one word'), |
|
542 0, 0, |
|
543 self.editorActGrp, 'vm_edit_move_right_word') |
|
544 if not isMacPlatform(): |
|
545 act.setShortcut(QKeySequence( |
|
546 QCoreApplication.translate('ViewManager', 'Ctrl+Right'))) |
|
547 self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHT) |
|
548 act.triggered.connect(self.esm.map) |
|
549 self.editActions.append(act) |
|
550 |
|
551 act = E5Action( |
|
552 QCoreApplication.translate( |
|
553 'ViewManager', |
|
554 'Move to first visible character in document line'), |
|
555 QCoreApplication.translate( |
|
556 'ViewManager', |
|
557 'Move to first visible character in document line'), |
|
558 0, 0, |
|
559 self.editorActGrp, 'vm_edit_move_first_visible_char') |
|
560 if not isMacPlatform(): |
|
561 act.setShortcut(QKeySequence( |
|
562 QCoreApplication.translate('ViewManager', 'Home'))) |
|
563 self.esm.setMapping(act, QsciScintilla.SCI_VCHOME) |
|
564 act.triggered.connect(self.esm.map) |
|
565 self.editActions.append(act) |
|
566 |
|
567 act = E5Action( |
|
568 QCoreApplication.translate( |
|
569 'ViewManager', 'Move to end of document line'), |
|
570 QCoreApplication.translate( |
|
571 'ViewManager', 'Move to end of document line'), |
|
572 0, 0, |
|
573 self.editorActGrp, 'vm_edit_move_end_line') |
|
574 if isMacPlatform(): |
|
575 act.setShortcut(QKeySequence( |
|
576 QCoreApplication.translate('ViewManager', 'Meta+E'))) |
|
577 else: |
|
578 act.setShortcut(QKeySequence( |
|
579 QCoreApplication.translate('ViewManager', 'End'))) |
|
580 self.esm.setMapping(act, QsciScintilla.SCI_LINEEND) |
|
581 act.triggered.connect(self.esm.map) |
|
582 self.editActions.append(act) |
|
583 |
|
584 act = E5Action( |
|
585 QCoreApplication.translate('ViewManager', 'Move up one line'), |
|
586 QCoreApplication.translate('ViewManager', 'Move up one line'), |
|
587 QKeySequence(QCoreApplication.translate('ViewManager', 'Up')), 0, |
|
588 self.editorActGrp, 'vm_edit_move_up_line') |
|
589 if isMacPlatform(): |
|
590 act.setAlternateShortcut(QKeySequence( |
|
591 QCoreApplication.translate('ViewManager', 'Meta+P'))) |
|
592 self.esm.setMapping(act, QsciScintilla.SCI_LINEUP) |
|
593 act.triggered.connect(self.esm.map) |
|
594 self.editActions.append(act) |
|
595 |
|
596 act = E5Action( |
|
597 QCoreApplication.translate('ViewManager', 'Move down one line'), |
|
598 QCoreApplication.translate('ViewManager', 'Move down one line'), |
|
599 QKeySequence(QCoreApplication.translate('ViewManager', 'Down')), 0, |
|
600 self.editorActGrp, 'vm_edit_move_down_line') |
|
601 if isMacPlatform(): |
|
602 act.setAlternateShortcut(QKeySequence( |
|
603 QCoreApplication.translate('ViewManager', 'Meta+N'))) |
|
604 self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWN) |
|
605 act.triggered.connect(self.esm.map) |
|
606 self.editActions.append(act) |
|
607 |
|
608 act = E5Action( |
|
609 self.tr('Move forward one history entry'), |
|
610 self.tr('Move forward one history entry'), |
|
611 QKeySequence(QCoreApplication.translate('ViewManager', |
|
612 'Ctrl+Down')), |
|
613 0, self.editorActGrp, 'vm_edit_scroll_down_line') |
|
614 self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLDOWN) |
|
615 act.triggered.connect(self.esm.map) |
|
616 self.editActions.append(act) |
|
617 |
|
618 act = E5Action( |
|
619 self.tr('Move back one history entry'), |
|
620 self.tr('Move back one history entry'), |
|
621 QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+Up')), |
|
622 0, self.editorActGrp, 'vm_edit_scroll_up_line') |
|
623 self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLUP) |
|
624 act.triggered.connect(self.esm.map) |
|
625 self.editActions.append(act) |
|
626 |
|
627 act = E5Action( |
|
628 QCoreApplication.translate('ViewManager', 'Move up one page'), |
|
629 QCoreApplication.translate('ViewManager', 'Move up one page'), |
|
630 QKeySequence(QCoreApplication.translate('ViewManager', 'PgUp')), 0, |
|
631 self.editorActGrp, 'vm_edit_move_up_page') |
|
632 self.esm.setMapping(act, QsciScintilla.SCI_PAGEUP) |
|
633 act.triggered.connect(self.esm.map) |
|
634 self.editActions.append(act) |
|
635 |
|
636 act = E5Action( |
|
637 QCoreApplication.translate('ViewManager', 'Move down one page'), |
|
638 QCoreApplication.translate('ViewManager', 'Move down one page'), |
|
639 QKeySequence(QCoreApplication.translate('ViewManager', 'PgDown')), |
|
640 0, self.editorActGrp, 'vm_edit_move_down_page') |
|
641 if isMacPlatform(): |
|
642 act.setAlternateShortcut(QKeySequence( |
|
643 QCoreApplication.translate('ViewManager', 'Meta+V'))) |
|
644 self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWN) |
|
645 act.triggered.connect(self.esm.map) |
|
646 self.editActions.append(act) |
|
647 |
|
648 act = E5Action( |
|
649 QCoreApplication.translate('ViewManager', 'Escape'), |
|
650 QCoreApplication.translate('ViewManager', 'Escape'), |
|
651 QKeySequence(QCoreApplication.translate('ViewManager', 'Esc')), 0, |
|
652 self.editorActGrp, 'vm_edit_escape') |
|
653 self.esm.setMapping(act, QsciScintilla.SCI_CANCEL) |
|
654 act.triggered.connect(self.esm.map) |
|
655 self.editActions.append(act) |
|
656 |
|
657 act = E5Action( |
|
658 QCoreApplication.translate( |
|
659 'ViewManager', 'Extend selection left one character'), |
|
660 QCoreApplication.translate( |
|
661 'ViewManager', 'Extend selection left one character'), |
|
662 QKeySequence(QCoreApplication.translate('ViewManager', |
|
663 'Shift+Left')), |
|
664 0, self.editorActGrp, 'vm_edit_extend_selection_left_char') |
|
665 if isMacPlatform(): |
|
666 act.setAlternateShortcut(QKeySequence( |
|
667 QCoreApplication.translate('ViewManager', 'Meta+Shift+B'))) |
|
668 self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTEXTEND) |
|
669 act.triggered.connect(self.esm.map) |
|
670 self.editActions.append(act) |
|
671 |
|
672 act = E5Action( |
|
673 QCoreApplication.translate( |
|
674 'ViewManager', 'Extend selection right one character'), |
|
675 QCoreApplication.translate( |
|
676 'ViewManager', 'Extend selection right one character'), |
|
677 QKeySequence(QCoreApplication.translate('ViewManager', |
|
678 'Shift+Right')), |
|
679 0, self.editorActGrp, 'vm_edit_extend_selection_right_char') |
|
680 if isMacPlatform(): |
|
681 act.setAlternateShortcut(QKeySequence( |
|
682 QCoreApplication.translate('ViewManager', 'Meta+Shift+F'))) |
|
683 self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTEXTEND) |
|
684 act.triggered.connect(self.esm.map) |
|
685 self.editActions.append(act) |
|
686 |
|
687 act = E5Action( |
|
688 QCoreApplication.translate( |
|
689 'ViewManager', 'Extend selection left one word'), |
|
690 QCoreApplication.translate( |
|
691 'ViewManager', 'Extend selection left one word'), |
|
692 0, 0, |
|
693 self.editorActGrp, 'vm_edit_extend_selection_left_word') |
|
694 if isMacPlatform(): |
|
695 act.setShortcut(QKeySequence( |
|
696 QCoreApplication.translate('ViewManager', 'Alt+Shift+Left'))) |
|
697 else: |
|
698 act.setShortcut(QKeySequence( |
|
699 QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Left'))) |
|
700 self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEXTEND) |
|
701 act.triggered.connect(self.esm.map) |
|
702 self.editActions.append(act) |
|
703 |
|
704 act = E5Action( |
|
705 QCoreApplication.translate( |
|
706 'ViewManager', 'Extend selection right one word'), |
|
707 QCoreApplication.translate( |
|
708 'ViewManager', 'Extend selection right one word'), |
|
709 0, 0, |
|
710 self.editorActGrp, 'vm_edit_extend_selection_right_word') |
|
711 if isMacPlatform(): |
|
712 act.setShortcut(QKeySequence( |
|
713 QCoreApplication.translate('ViewManager', 'Alt+Shift+Right'))) |
|
714 else: |
|
715 act.setShortcut(QKeySequence( |
|
716 QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right'))) |
|
717 self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEXTEND) |
|
718 act.triggered.connect(self.esm.map) |
|
719 self.editActions.append(act) |
|
720 |
|
721 act = E5Action( |
|
722 QCoreApplication.translate( |
|
723 'ViewManager', |
|
724 'Extend selection to first visible character in document' |
|
725 ' line'), |
|
726 QCoreApplication.translate( |
|
727 'ViewManager', |
|
728 'Extend selection to first visible character in document' |
|
729 ' line'), |
|
730 0, 0, |
|
731 self.editorActGrp, 'vm_edit_extend_selection_first_visible_char') |
|
732 if not isMacPlatform(): |
|
733 act.setShortcut(QKeySequence( |
|
734 QCoreApplication.translate('ViewManager', 'Shift+Home'))) |
|
735 self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEEXTEND) |
|
736 act.triggered.connect(self.esm.map) |
|
737 self.editActions.append(act) |
|
738 |
|
739 act = E5Action( |
|
740 QCoreApplication.translate( |
|
741 'ViewManager', 'Extend selection to end of document line'), |
|
742 QCoreApplication.translate( |
|
743 'ViewManager', 'Extend selection to end of document line'), |
|
744 0, 0, |
|
745 self.editorActGrp, 'vm_edit_extend_selection_end_line') |
|
746 if isMacPlatform(): |
|
747 act.setShortcut(QKeySequence( |
|
748 QCoreApplication.translate('ViewManager', 'Meta+Shift+E'))) |
|
749 else: |
|
750 act.setShortcut(QKeySequence( |
|
751 QCoreApplication.translate('ViewManager', 'Shift+End'))) |
|
752 self.esm.setMapping(act, QsciScintilla.SCI_LINEENDEXTEND) |
|
753 act.triggered.connect(self.esm.map) |
|
754 self.editActions.append(act) |
|
755 |
|
756 def __createSearchActions(self): |
|
757 """ |
|
758 Private method defining the user interface actions for the search |
|
759 commands. |
|
760 """ |
|
761 self.searchActGrp = createActionGroup(self) |
|
762 |
|
763 self.searchAct = E5Action( |
|
764 QCoreApplication.translate('ViewManager', 'Search'), |
|
765 UI.PixmapCache.getIcon("find"), |
|
766 QCoreApplication.translate('ViewManager', '&Search...'), |
|
767 QKeySequence(QCoreApplication.translate( |
|
768 'ViewManager', "Ctrl+F", "Search|Search")), |
|
769 0, |
|
770 self, 'vm_search') |
|
771 self.searchAct.setStatusTip(QCoreApplication.translate( |
|
772 'ViewManager', 'Search for a text')) |
|
773 self.searchAct.setWhatsThis(QCoreApplication.translate( |
|
774 'ViewManager', |
|
775 """<b>Search</b>""" |
|
776 """<p>Search for some text in the shell window. A""" |
|
777 """ dialog is shown to enter the search text and options""" |
|
778 """ for the search.</p>""" |
|
779 )) |
|
780 self.searchAct.triggered.connect(self.__showFind) |
|
781 self.searchActions.append(self.searchAct) |
|
782 |
|
783 self.searchNextAct = E5Action( |
|
784 QCoreApplication.translate( |
|
785 'ViewManager', 'Search next'), |
|
786 UI.PixmapCache.getIcon("findNext"), |
|
787 QCoreApplication.translate('ViewManager', 'Search &next'), |
|
788 QKeySequence(QCoreApplication.translate( |
|
789 'ViewManager', "F3", "Search|Search next")), |
|
790 0, |
|
791 self, 'vm_search_next') |
|
792 self.searchNextAct.setStatusTip(QCoreApplication.translate( |
|
793 'ViewManager', 'Search next occurrence of text')) |
|
794 self.searchNextAct.setWhatsThis(QCoreApplication.translate( |
|
795 'ViewManager', |
|
796 """<b>Search next</b>""" |
|
797 """<p>Search the next occurrence of some text in the shell""" |
|
798 """ window. The previously entered search text and options are""" |
|
799 """ reused.</p>""" |
|
800 )) |
|
801 self.searchNextAct.triggered.connect( |
|
802 self.__searchWidget.on_findNextButton_clicked) |
|
803 self.searchActions.append(self.searchNextAct) |
|
804 |
|
805 self.searchPrevAct = E5Action( |
|
806 QCoreApplication.translate('ViewManager', 'Search previous'), |
|
807 UI.PixmapCache.getIcon("findPrev"), |
|
808 QCoreApplication.translate('ViewManager', 'Search &previous'), |
|
809 QKeySequence(QCoreApplication.translate( |
|
810 'ViewManager', "Shift+F3", "Search|Search previous")), |
|
811 0, |
|
812 self, 'vm_search_previous') |
|
813 self.searchPrevAct.setStatusTip(QCoreApplication.translate( |
|
814 'ViewManager', 'Search previous occurrence of text')) |
|
815 self.searchPrevAct.setWhatsThis(QCoreApplication.translate( |
|
816 'ViewManager', |
|
817 """<b>Search previous</b>""" |
|
818 """<p>Search the previous occurrence of some text in the shell""" |
|
819 """ window. The previously entered search text and options are""" |
|
820 """ reused.</p>""" |
|
821 )) |
|
822 self.searchPrevAct.triggered.connect( |
|
823 self.__searchWidget.on_findPrevButton_clicked) |
|
824 self.searchActions.append(self.searchPrevAct) |
|
825 |
|
826 def __createViewActions(self): |
|
827 """ |
|
828 Private method defining the user interface actions for the view |
|
829 commands. |
|
830 """ |
|
831 self.viewActGrp = createActionGroup(self) |
|
832 |
|
833 self.zoomInAct = E5Action( |
|
834 QCoreApplication.translate('ViewManager', 'Zoom in'), |
|
835 UI.PixmapCache.getIcon("zoomIn"), |
|
836 QCoreApplication.translate('ViewManager', 'Zoom &in'), |
|
837 QKeySequence(QCoreApplication.translate( |
|
838 'ViewManager', "Ctrl++", "View|Zoom in")), |
|
839 QKeySequence(QCoreApplication.translate( |
|
840 'ViewManager', "Zoom In", "View|Zoom in")), |
|
841 self.viewActGrp, 'vm_view_zoom_in') |
|
842 self.zoomInAct.setStatusTip(QCoreApplication.translate( |
|
843 'ViewManager', 'Zoom in on the text')) |
|
844 self.zoomInAct.setWhatsThis(QCoreApplication.translate( |
|
845 'ViewManager', |
|
846 """<b>Zoom in</b>""" |
|
847 """<p>Zoom in on the text. This makes the text bigger.</p>""" |
|
848 )) |
|
849 self.zoomInAct.triggered.connect(self.__zoomIn) |
|
850 self.viewActions.append(self.zoomInAct) |
|
851 |
|
852 self.zoomOutAct = E5Action( |
|
853 QCoreApplication.translate('ViewManager', 'Zoom out'), |
|
854 UI.PixmapCache.getIcon("zoomOut"), |
|
855 QCoreApplication.translate('ViewManager', 'Zoom &out'), |
|
856 QKeySequence(QCoreApplication.translate( |
|
857 'ViewManager', "Ctrl+-", "View|Zoom out")), |
|
858 QKeySequence(QCoreApplication.translate( |
|
859 'ViewManager', "Zoom Out", "View|Zoom out")), |
|
860 self.viewActGrp, 'vm_view_zoom_out') |
|
861 self.zoomOutAct.setStatusTip(QCoreApplication.translate( |
|
862 'ViewManager', 'Zoom out on the text')) |
|
863 self.zoomOutAct.setWhatsThis(QCoreApplication.translate( |
|
864 'ViewManager', |
|
865 """<b>Zoom out</b>""" |
|
866 """<p>Zoom out on the text. This makes the text smaller.</p>""" |
|
867 )) |
|
868 self.zoomOutAct.triggered.connect(self.__zoomOut) |
|
869 self.viewActions.append(self.zoomOutAct) |
|
870 |
|
871 self.zoomResetAct = E5Action( |
|
872 QCoreApplication.translate('ViewManager', 'Zoom reset'), |
|
873 UI.PixmapCache.getIcon("zoomReset"), |
|
874 QCoreApplication.translate('ViewManager', 'Zoom &reset'), |
|
875 QKeySequence(QCoreApplication.translate( |
|
876 'ViewManager', "Ctrl+0", "View|Zoom reset")), |
|
877 0, |
|
878 self.viewActGrp, 'vm_view_zoom_reset') |
|
879 self.zoomResetAct.setStatusTip(QCoreApplication.translate( |
|
880 'ViewManager', 'Reset the zoom of the text')) |
|
881 self.zoomResetAct.setWhatsThis(QCoreApplication.translate( |
|
882 'ViewManager', |
|
883 """<b>Zoom reset</b>""" |
|
884 """<p>Reset the zoom of the text. """ |
|
885 """This sets the zoom factor to 100%.</p>""" |
|
886 )) |
|
887 self.zoomResetAct.triggered.connect(self.__zoomReset) |
|
888 self.viewActions.append(self.zoomResetAct) |
|
889 |
|
890 self.zoomToAct = E5Action( |
|
891 QCoreApplication.translate('ViewManager', 'Zoom'), |
|
892 UI.PixmapCache.getIcon("zoomTo"), |
|
893 QCoreApplication.translate('ViewManager', '&Zoom'), |
|
894 QKeySequence(QCoreApplication.translate( |
|
895 'ViewManager', "Ctrl+#", "View|Zoom")), |
|
896 0, |
|
897 self.viewActGrp, 'vm_view_zoom') |
|
898 self.zoomToAct.setStatusTip(QCoreApplication.translate( |
|
899 'ViewManager', 'Zoom the text')) |
|
900 self.zoomToAct.setWhatsThis(QCoreApplication.translate( |
|
901 'ViewManager', |
|
902 """<b>Zoom</b>""" |
|
903 """<p>Zoom the text. This opens a dialog where the""" |
|
904 """ desired size can be entered.</p>""" |
|
905 )) |
|
906 self.zoomToAct.triggered.connect(self.__zoom) |
|
907 self.viewActions.append(self.zoomToAct) |
|
908 |
|
909 def __createHistoryActions(self): |
|
910 """ |
|
911 Private method defining the user interface actions for the history |
|
912 commands. |
|
913 """ |
|
914 self.showHistoryAct = E5Action( |
|
915 self.tr('Show History'), |
|
916 UI.PixmapCache.getIcon("history"), |
|
917 self.tr('&Show History...'), |
|
918 0, 0, |
|
919 self, 'shell_show_history') |
|
920 self.showHistoryAct.setStatusTip(self.tr( |
|
921 "Show the shell history in a dialog")) |
|
922 self.showHistoryAct.triggered.connect(self.__shell.showHistory) |
|
923 |
|
924 self.clearHistoryAct = E5Action( |
|
925 self.tr('Clear History'), |
|
926 UI.PixmapCache.getIcon("historyClear"), |
|
927 self.tr('&Clear History...'), |
|
928 0, 0, |
|
929 self, 'shell_clear_history') |
|
930 self.clearHistoryAct.setStatusTip(self.tr( |
|
931 "Clear the shell history")) |
|
932 self.clearHistoryAct.triggered.connect(self.__shell.clearHistory) |
|
933 |
|
934 self.selectHistoryAct = E5Action( |
|
935 self.tr('Select History Entry'), |
|
936 self.tr('Select History &Entry'), |
|
937 0, 0, |
|
938 self, 'shell_select_history') |
|
939 self.selectHistoryAct.setStatusTip(self.tr( |
|
940 "Select an entry of the shell history")) |
|
941 self.selectHistoryAct.triggered.connect(self.__shell.selectHistory) |
|
942 |
|
943 def __createHelpActions(self): |
|
944 """ |
|
945 Private method to create the Help actions. |
|
946 """ |
|
947 self.aboutAct = E5Action( |
|
948 self.tr('About'), |
|
949 self.tr('&About'), |
|
950 0, 0, self, 'about_eric') |
|
951 self.aboutAct.setStatusTip(self.tr( |
|
952 'Display information about this software')) |
|
953 self.aboutAct.setWhatsThis(self.tr( |
|
954 """<b>About</b>""" |
|
955 """<p>Display some information about this software.</p>""")) |
|
956 self.aboutAct.triggered.connect(self.__about) |
|
957 self.helpActions.append(self.aboutAct) |
|
958 |
|
959 self.aboutQtAct = E5Action( |
|
960 self.tr('About Qt'), |
|
961 self.tr('About &Qt'), |
|
962 0, 0, self, 'about_qt') |
|
963 self.aboutQtAct.setStatusTip( |
|
964 self.tr('Display information about the Qt toolkit')) |
|
965 self.aboutQtAct.setWhatsThis(self.tr( |
|
966 """<b>About Qt</b>""" |
|
967 """<p>Display some information about the Qt toolkit.</p>""" |
|
968 )) |
|
969 self.aboutQtAct.triggered.connect(self.__aboutQt) |
|
970 self.helpActions.append(self.aboutQtAct) |
|
971 |
|
972 self.whatsThisAct = E5Action( |
|
973 self.tr('What\'s This?'), |
|
974 UI.PixmapCache.getIcon("whatsThis"), |
|
975 self.tr('&What\'s This?'), |
|
976 QKeySequence(self.tr("Shift+F1", "Help|What's This?'")), |
|
977 0, self, 'help_help_whats_this') |
|
978 self.whatsThisAct.setStatusTip(self.tr('Context sensitive help')) |
|
979 self.whatsThisAct.setWhatsThis(self.tr( |
|
980 """<b>Display context sensitive help</b>""" |
|
981 """<p>In What's This? mode, the mouse cursor shows an arrow""" |
|
982 """ with a question mark, and you can click on the interface""" |
|
983 """ elements to get a short description of what they do and""" |
|
984 """ how to use them. In dialogs, this feature can be""" |
|
985 """ accessed using the context help button in the titlebar.""" |
|
986 """</p>""" |
|
987 )) |
|
988 self.whatsThisAct.triggered.connect(self.__whatsThis) |
|
989 self.helpActions.append(self.whatsThisAct) |
|
990 |
|
991 def __showFind(self): |
|
992 """ |
|
993 Private method to display the search widget. |
|
994 """ |
|
995 txt = self.__shell.selectedText() |
|
996 self.showFind(txt) |
|
997 |
|
998 def showFind(self, txt=""): |
|
999 """ |
|
1000 Public method to display the search widget. |
|
1001 |
|
1002 @param txt text to be shown in the combo |
|
1003 @type str |
|
1004 """ |
|
1005 self.__searchWidget.showFind(txt) |
|
1006 |
|
1007 def activeWindow(self): |
|
1008 """ |
|
1009 Public method to get a reference to the active shell. |
|
1010 |
|
1011 @return reference to the shell widget |
|
1012 @rtype Shell |
|
1013 """ |
|
1014 return self.__shell |
|
1015 |
|
1016 def __readSettings(self): |
|
1017 """ |
|
1018 Private method to read the settings remembered last time. |
|
1019 """ |
|
1020 settings = Preferences.Prefs.settings |
|
1021 pos = settings.value("ShellWindow/Position", QPoint(0, 0)) |
|
1022 size = settings.value("ShellWindow/Size", QSize(800, 600)) |
|
1023 self.resize(size) |
|
1024 self.move(pos) |
|
1025 |
|
1026 def __writeSettings(self): |
|
1027 """ |
|
1028 Private method to write the settings for reuse. |
|
1029 """ |
|
1030 settings = Preferences.Prefs.settings |
|
1031 settings.setValue("ShellWindow/Position", self.pos()) |
|
1032 settings.setValue("ShellWindow/Size", self.size()) |
|
1033 |
|
1034 def quit(self): |
|
1035 """ |
|
1036 Public method to quit the application. |
|
1037 """ |
|
1038 e5App().closeAllWindows() |
|
1039 |
|
1040 def __newWindow(self): |
|
1041 """ |
|
1042 Private slot to start a new instance of eric. |
|
1043 """ |
|
1044 program = sys.executable |
|
1045 eric6 = os.path.join(getConfig("ericDir"), "eric6_shell.py") |
|
1046 args = [eric6] |
|
1047 QProcess.startDetached(program, args) |
|
1048 |
|
1049 def __virtualEnvironmentChanged(self, venvName): |
|
1050 """ |
|
1051 Private slot handling a change of the shell's virtual environment. |
|
1052 |
|
1053 @param venvName name of the virtual environment of the shell |
|
1054 @type str |
|
1055 """ |
|
1056 if venvName: |
|
1057 self.setWindowTitle(self.tr("eric Shell [{0}]").format(venvName)) |
|
1058 else: |
|
1059 self.setWindowTitle(self.tr("eric Shell")) |
|
1060 |
|
1061 ################################################################## |
|
1062 ## Below are the action methods for the view menu |
|
1063 ################################################################## |
|
1064 |
|
1065 def __zoomIn(self): |
|
1066 """ |
|
1067 Private method to handle the zoom in action. |
|
1068 """ |
|
1069 self.__shell.zoomIn() |
|
1070 self.__sbZoom.setValue(self.__shell.getZoom()) |
|
1071 |
|
1072 def __zoomOut(self): |
|
1073 """ |
|
1074 Private method to handle the zoom out action. |
|
1075 """ |
|
1076 self.__shell.zoomOut() |
|
1077 self.__sbZoom.setValue(self.__shell.getZoom()) |
|
1078 |
|
1079 def __zoomReset(self): |
|
1080 """ |
|
1081 Private method to reset the zoom factor. |
|
1082 """ |
|
1083 self.__shell.zoomTo(0) |
|
1084 self.__sbZoom.setValue(self.__shell.getZoom()) |
|
1085 |
|
1086 def __zoom(self): |
|
1087 """ |
|
1088 Private method to handle the zoom action. |
|
1089 """ |
|
1090 from QScintilla.ZoomDialog import ZoomDialog |
|
1091 dlg = ZoomDialog(self.__shell.getZoom(), self, None, True) |
|
1092 if dlg.exec() == QDialog.DialogCode.Accepted: |
|
1093 value = dlg.getZoomSize() |
|
1094 self.__zoomTo(value) |
|
1095 |
|
1096 def __zoomTo(self, value): |
|
1097 """ |
|
1098 Private slot to zoom to a given value. |
|
1099 |
|
1100 @param value zoom value to be set |
|
1101 @type int |
|
1102 """ |
|
1103 self.__shell.zoomTo(value) |
|
1104 self.__sbZoom.setValue(self.__shell.getZoom()) |
|
1105 |
|
1106 def __zoomValueChanged(self, value): |
|
1107 """ |
|
1108 Private slot to handle changes of the zoom value. |
|
1109 |
|
1110 @param value new zoom value |
|
1111 @type int |
|
1112 """ |
|
1113 self.__sbZoom.setValue(value) |
|
1114 |
|
1115 ################################################################## |
|
1116 ## Below are the action methods for the help menu |
|
1117 ################################################################## |
|
1118 |
|
1119 def __about(self): |
|
1120 """ |
|
1121 Private slot to show a little About message. |
|
1122 """ |
|
1123 E5MessageBox.about( |
|
1124 self, |
|
1125 self.tr("About eric Shell Window"), |
|
1126 self.tr( |
|
1127 "The eric Shell is a standalone shell window." |
|
1128 " It uses the same backend as the debugger of" |
|
1129 " the full IDE, but is executed independently.")) |
|
1130 |
|
1131 def __aboutQt(self): |
|
1132 """ |
|
1133 Private slot to handle the About Qt dialog. |
|
1134 """ |
|
1135 E5MessageBox.aboutQt(self, "eric Shell Window") |
|
1136 |
|
1137 def __whatsThis(self): |
|
1138 """ |
|
1139 Private slot called in to enter Whats This mode. |
|
1140 """ |
|
1141 QWhatsThis.enterWhatsThisMode() |
|
1142 |
|
1143 ################################################################## |
|
1144 ## Below are the main menu handling methods |
|
1145 ################################################################## |
|
1146 |
|
1147 def __createMenus(self): |
|
1148 """ |
|
1149 Private method to create the menus of the menu bar. |
|
1150 """ |
|
1151 self.__fileMenu = self.menuBar().addMenu(self.tr("&File")) |
|
1152 self.__fileMenu.setTearOffEnabled(True) |
|
1153 self.__fileMenu.addAction(self.newWindowAct) |
|
1154 self.__fileMenu.addSeparator() |
|
1155 self.__fileMenu.addAction(self.restartAct) |
|
1156 self.__fileMenu.addAction(self.clearRestartAct) |
|
1157 self.__fileMenu.addSeparator() |
|
1158 self.__fileMenu.addAction(self.exitAct) |
|
1159 |
|
1160 self.__editMenu = self.menuBar().addMenu(self.tr("&Edit")) |
|
1161 self.__editMenu.setTearOffEnabled(True) |
|
1162 self.__editMenu.addAction(self.cutAct) |
|
1163 self.__editMenu.addAction(self.copyAct) |
|
1164 self.__editMenu.addAction(self.pasteAct) |
|
1165 self.__editMenu.addAction(self.clearAct) |
|
1166 self.__editMenu.addSeparator() |
|
1167 self.__editMenu.addAction(self.searchAct) |
|
1168 self.__editMenu.addAction(self.searchNextAct) |
|
1169 self.__editMenu.addAction(self.searchPrevAct) |
|
1170 |
|
1171 self.__viewMenu = self.menuBar().addMenu(self.tr("&View")) |
|
1172 self.__viewMenu.setTearOffEnabled(True) |
|
1173 self.__viewMenu.addAction(self.zoomInAct) |
|
1174 self.__viewMenu.addAction(self.zoomOutAct) |
|
1175 self.__viewMenu.addAction(self.zoomResetAct) |
|
1176 self.__viewMenu.addAction(self.zoomToAct) |
|
1177 |
|
1178 self.__historyMenu = self.menuBar().addMenu(self.tr("Histor&y")) |
|
1179 self.__historyMenu.setTearOffEnabled(True) |
|
1180 self.__historyMenu.addAction(self.selectHistoryAct) |
|
1181 self.__historyMenu.addAction(self.showHistoryAct) |
|
1182 self.__historyMenu.addAction(self.clearHistoryAct) |
|
1183 self.__historyMenu.setEnabled(self.__shell.isHistoryEnabled()) |
|
1184 |
|
1185 self.__startMenu = self.menuBar().addMenu(self.tr("&Start")) |
|
1186 self.__startMenu.aboutToShow.connect(self.__showStartMenu) |
|
1187 self.__startMenu.triggered.connect(self.__startShell) |
|
1188 |
|
1189 self.menuBar().addSeparator() |
|
1190 |
|
1191 self.__helpMenu = self.menuBar().addMenu(self.tr("&Help")) |
|
1192 self.__helpMenu.setTearOffEnabled(True) |
|
1193 self.__helpMenu.addAction(self.aboutAct) |
|
1194 self.__helpMenu.addAction(self.aboutQtAct) |
|
1195 self.__helpMenu.addSeparator() |
|
1196 self.__helpMenu.addAction(self.whatsThisAct) |
|
1197 |
|
1198 def __showStartMenu(self): |
|
1199 """ |
|
1200 Private slot to prepare the language menu. |
|
1201 """ |
|
1202 self.__startMenu.clear() |
|
1203 for venvName in sorted(self.virtualenvManager.getVirtualenvNames()): |
|
1204 self.__startMenu.addAction(venvName) |
|
1205 |
|
1206 def __startShell(self, action): |
|
1207 """ |
|
1208 Private slot to start a shell according to the action triggered. |
|
1209 |
|
1210 @param action menu action that was triggered (QAction) |
|
1211 """ |
|
1212 venvName = action.text() |
|
1213 self.__debugServer.startClient(False, venvName=venvName) |
|
1214 self.__debugServer.remoteBanner() |
|
1215 |
|
1216 ################################################################## |
|
1217 ## Below are the toolbar handling methods |
|
1218 ################################################################## |
|
1219 |
|
1220 def __createToolBars(self): |
|
1221 """ |
|
1222 Private method to create the various toolbars. |
|
1223 """ |
|
1224 filetb = self.addToolBar(self.tr("File")) |
|
1225 filetb.setIconSize(UI.Config.ToolBarIconSize) |
|
1226 filetb.addAction(self.newWindowAct) |
|
1227 filetb.addSeparator() |
|
1228 filetb.addAction(self.restartAct) |
|
1229 filetb.addAction(self.clearRestartAct) |
|
1230 filetb.addSeparator() |
|
1231 filetb.addAction(self.exitAct) |
|
1232 |
|
1233 edittb = self.addToolBar(self.tr("Edit")) |
|
1234 edittb.setIconSize(UI.Config.ToolBarIconSize) |
|
1235 edittb.addAction(self.cutAct) |
|
1236 edittb.addAction(self.copyAct) |
|
1237 edittb.addAction(self.pasteAct) |
|
1238 edittb.addAction(self.clearAct) |
|
1239 |
|
1240 findtb = self.addToolBar(self.tr("Find")) |
|
1241 findtb.setIconSize(UI.Config.ToolBarIconSize) |
|
1242 findtb.addAction(self.searchAct) |
|
1243 findtb.addAction(self.searchNextAct) |
|
1244 findtb.addAction(self.searchPrevAct) |
|
1245 |
|
1246 viewtb = self.addToolBar(self.tr("View")) |
|
1247 viewtb.setIconSize(UI.Config.ToolBarIconSize) |
|
1248 viewtb.addAction(self.zoomInAct) |
|
1249 viewtb.addAction(self.zoomOutAct) |
|
1250 viewtb.addAction(self.zoomResetAct) |
|
1251 viewtb.addAction(self.zoomToAct) |
|
1252 |
|
1253 self.__historyToolbar = self.addToolBar(self.tr("History")) |
|
1254 self.__historyToolbar.setIconSize(UI.Config.ToolBarIconSize) |
|
1255 self.__historyToolbar.addAction(self.showHistoryAct) |
|
1256 self.__historyToolbar.addAction(self.clearHistoryAct) |
|
1257 self.__historyToolbar.setEnabled(self.__shell.isHistoryEnabled()) |
|
1258 |
|
1259 helptb = self.addToolBar(self.tr("Help")) |
|
1260 helptb.setIconSize(UI.Config.ToolBarIconSize) |
|
1261 helptb.addAction(self.whatsThisAct) |
|
1262 |
|
1263 ################################################################## |
|
1264 ## Below are the status bar handling methods |
|
1265 ################################################################## |
|
1266 |
|
1267 def __createStatusBar(self): |
|
1268 """ |
|
1269 Private slot to set up the status bar. |
|
1270 """ |
|
1271 self.__statusBar = self.statusBar() |
|
1272 self.__statusBar.setSizeGripEnabled(True) |
|
1273 |
|
1274 self.__sbZoom = E5ZoomWidget( |
|
1275 UI.PixmapCache.getPixmap("zoomOut"), |
|
1276 UI.PixmapCache.getPixmap("zoomIn"), |
|
1277 UI.PixmapCache.getPixmap("zoomReset"), |
|
1278 self.__statusBar) |
|
1279 self.__statusBar.addPermanentWidget(self.__sbZoom) |
|
1280 self.__sbZoom.setWhatsThis(self.tr( |
|
1281 """<p>This part of the status bar allows zooming the shell.</p>""" |
|
1282 )) |
|
1283 |
|
1284 self.__sbZoom.valueChanged.connect(self.__zoomTo) |
|
1285 self.__sbZoom.setValue(0) |
|
1286 |
|
1287 def __historyStyleChanged(self, historyStyle): |
|
1288 """ |
|
1289 Private slot to handle a change of the shell history style. |
|
1290 |
|
1291 @param historyStyle style to be used for the history |
|
1292 @type ShellHistoryStyle |
|
1293 """ |
|
1294 enabled = self.__shell.isHistoryEnabled() |
|
1295 self.__historyMenu.setEnabled(enabled) |
|
1296 self.__historyToolbar.setEnabled(enabled) |