31 |
31 |
32 class TrayStarter(QSystemTrayIcon): |
32 class TrayStarter(QSystemTrayIcon): |
33 """ |
33 """ |
34 Class implementing a starter for the system tray. |
34 Class implementing a starter for the system tray. |
35 """ |
35 """ |
|
36 |
36 def __init__(self, settingsDir): |
37 def __init__(self, settingsDir): |
37 """ |
38 """ |
38 Constructor |
39 Constructor |
39 |
40 |
40 @param settingsDir directory to be used for the settings files |
41 @param settingsDir directory to be used for the settings files |
41 @type str |
42 @type str |
42 """ |
43 """ |
43 super().__init__( |
44 super().__init__( |
44 UI.PixmapCache.getIcon( |
45 UI.PixmapCache.getIcon(Preferences.getTrayStarter("TrayStarterIcon")) |
45 Preferences.getTrayStarter("TrayStarterIcon"))) |
46 ) |
46 |
47 |
47 self.settingsDir = settingsDir |
48 self.settingsDir = settingsDir |
48 |
49 |
49 self.maxMenuFilePathLen = 75 |
50 self.maxMenuFilePathLen = 75 |
50 |
51 |
51 self.rsettings = QSettings( |
52 self.rsettings = QSettings( |
52 QSettings.Format.IniFormat, |
53 QSettings.Format.IniFormat, |
53 QSettings.Scope.UserScope, |
54 QSettings.Scope.UserScope, |
54 Globals.settingsNameOrganization, |
55 Globals.settingsNameOrganization, |
55 Globals.settingsNameRecent) |
56 Globals.settingsNameRecent, |
56 |
57 ) |
|
58 |
57 self.recentProjects = [] |
59 self.recentProjects = [] |
58 self.__loadRecentProjects() |
60 self.__loadRecentProjects() |
59 self.recentMultiProjects = [] |
61 self.recentMultiProjects = [] |
60 self.__loadRecentMultiProjects() |
62 self.__loadRecentMultiProjects() |
61 self.recentFiles = [] |
63 self.recentFiles = [] |
62 self.__loadRecentFiles() |
64 self.__loadRecentFiles() |
63 |
65 |
64 self.activated.connect(self.__activated) |
66 self.activated.connect(self.__activated) |
65 |
67 |
66 self.__menu = QMenu(self.tr("eric tray starter")) |
68 self.__menu = QMenu(self.tr("eric tray starter")) |
67 |
69 |
68 self.recentProjectsMenu = QMenu( |
70 self.recentProjectsMenu = QMenu(self.tr("Recent Projects"), self.__menu) |
69 self.tr('Recent Projects'), self.__menu) |
71 self.recentProjectsMenu.aboutToShow.connect(self.__showRecentProjectsMenu) |
70 self.recentProjectsMenu.aboutToShow.connect( |
|
71 self.__showRecentProjectsMenu) |
|
72 self.recentProjectsMenu.triggered.connect(self.__openRecent) |
72 self.recentProjectsMenu.triggered.connect(self.__openRecent) |
73 |
73 |
74 self.recentMultiProjectsMenu = QMenu( |
74 self.recentMultiProjectsMenu = QMenu( |
75 self.tr('Recent Multiprojects'), self.__menu) |
75 self.tr("Recent Multiprojects"), self.__menu |
|
76 ) |
76 self.recentMultiProjectsMenu.aboutToShow.connect( |
77 self.recentMultiProjectsMenu.aboutToShow.connect( |
77 self.__showRecentMultiProjectsMenu) |
78 self.__showRecentMultiProjectsMenu |
|
79 ) |
78 self.recentMultiProjectsMenu.triggered.connect(self.__openRecent) |
80 self.recentMultiProjectsMenu.triggered.connect(self.__openRecent) |
79 |
81 |
80 self.recentFilesMenu = QMenu(self.tr('Recent Files'), self.__menu) |
82 self.recentFilesMenu = QMenu(self.tr("Recent Files"), self.__menu) |
81 self.recentFilesMenu.aboutToShow.connect(self.__showRecentFilesMenu) |
83 self.recentFilesMenu.aboutToShow.connect(self.__showRecentFilesMenu) |
82 self.recentFilesMenu.triggered.connect(self.__openRecent) |
84 self.recentFilesMenu.triggered.connect(self.__openRecent) |
83 |
85 |
84 act = self.__menu.addAction( |
86 act = self.__menu.addAction(self.tr("eric tray starter"), self.__about) |
85 self.tr("eric tray starter"), self.__about) |
|
86 font = act.font() |
87 font = act.font() |
87 font.setBold(True) |
88 font.setBold(True) |
88 act.setFont(font) |
89 act.setFont(font) |
89 self.__menu.addSeparator() |
90 self.__menu.addSeparator() |
90 |
91 |
91 self.__menu.addAction( |
92 self.__menu.addAction(self.tr("Show Versions"), self.__showVersions) |
92 self.tr("Show Versions"), self.__showVersions) |
93 self.__menu.addSeparator() |
93 self.__menu.addSeparator() |
94 |
94 |
95 self.__menu.addAction( |
95 self.__menu.addAction( |
96 self.tr("QRegularExpression editor"), self.__startQRegularExpression |
96 self.tr("QRegularExpression editor"), |
97 ) |
97 self.__startQRegularExpression) |
98 self.__menu.addAction(self.tr("Python re editor"), self.__startPyRe) |
98 self.__menu.addAction( |
99 self.__menu.addSeparator() |
99 self.tr("Python re editor"), self.__startPyRe) |
100 |
100 self.__menu.addSeparator() |
|
101 |
|
102 self.__menu.addAction( |
101 self.__menu.addAction( |
103 UI.PixmapCache.getIcon("uiPreviewer"), |
102 UI.PixmapCache.getIcon("uiPreviewer"), |
104 self.tr("UI Previewer"), self.__startUIPreviewer) |
103 self.tr("UI Previewer"), |
|
104 self.__startUIPreviewer, |
|
105 ) |
105 self.__menu.addAction( |
106 self.__menu.addAction( |
106 UI.PixmapCache.getIcon("trPreviewer"), |
107 UI.PixmapCache.getIcon("trPreviewer"), |
107 self.tr("Translations Previewer"), self.__startTRPreviewer) |
108 self.tr("Translations Previewer"), |
108 self.__menu.addAction( |
109 self.__startTRPreviewer, |
109 UI.PixmapCache.getIcon("unittest"), |
110 ) |
110 self.tr("Testing"), self.__startTesting) |
111 self.__menu.addAction( |
111 self.__menu.addSeparator() |
112 UI.PixmapCache.getIcon("unittest"), self.tr("Testing"), self.__startTesting |
112 |
113 ) |
|
114 self.__menu.addSeparator() |
|
115 |
113 self.__menu.addAction( |
116 self.__menu.addAction( |
114 UI.PixmapCache.getIcon("diffFiles"), |
117 UI.PixmapCache.getIcon("diffFiles"), |
115 self.tr("Compare Files"), self.__startDiff) |
118 self.tr("Compare Files"), |
|
119 self.__startDiff, |
|
120 ) |
116 self.__menu.addAction( |
121 self.__menu.addAction( |
117 UI.PixmapCache.getIcon("compareFiles"), |
122 UI.PixmapCache.getIcon("compareFiles"), |
118 self.tr("Compare Files side by side"), self.__startCompare) |
123 self.tr("Compare Files side by side"), |
119 self.__menu.addSeparator() |
124 self.__startCompare, |
120 |
125 ) |
|
126 self.__menu.addSeparator() |
|
127 |
121 self.__menu.addAction( |
128 self.__menu.addAction( |
122 UI.PixmapCache.getIcon("sqlBrowser"), |
129 UI.PixmapCache.getIcon("sqlBrowser"), |
123 self.tr("SQL Browser"), self.__startSqlBrowser) |
130 self.tr("SQL Browser"), |
124 self.__menu.addSeparator() |
131 self.__startSqlBrowser, |
125 |
132 ) |
|
133 self.__menu.addSeparator() |
|
134 |
126 self.__menu.addAction( |
135 self.__menu.addAction( |
127 UI.PixmapCache.getIcon("ericSnap"), |
136 UI.PixmapCache.getIcon("ericSnap"), |
128 self.tr("Snapshot"), self.__startSnapshot) |
137 self.tr("Snapshot"), |
|
138 self.__startSnapshot, |
|
139 ) |
129 self.__menu.addAction( |
140 self.__menu.addAction( |
130 UI.PixmapCache.getIcon("iconEditor"), |
141 UI.PixmapCache.getIcon("iconEditor"), |
131 self.tr("Icon Editor"), self.__startIconEditor) |
142 self.tr("Icon Editor"), |
132 self.__menu.addSeparator() |
143 self.__startIconEditor, |
133 |
144 ) |
|
145 self.__menu.addSeparator() |
|
146 |
134 self.__menu.addAction( |
147 self.__menu.addAction( |
135 UI.PixmapCache.getIcon("pluginInstall"), |
148 UI.PixmapCache.getIcon("pluginInstall"), |
136 self.tr("Install Plugin"), self.__startPluginInstall) |
149 self.tr("Install Plugin"), |
|
150 self.__startPluginInstall, |
|
151 ) |
137 self.__menu.addAction( |
152 self.__menu.addAction( |
138 UI.PixmapCache.getIcon("pluginUninstall"), |
153 UI.PixmapCache.getIcon("pluginUninstall"), |
139 self.tr("Uninstall Plugin"), self.__startPluginUninstall) |
154 self.tr("Uninstall Plugin"), |
|
155 self.__startPluginUninstall, |
|
156 ) |
140 self.__menu.addAction( |
157 self.__menu.addAction( |
141 UI.PixmapCache.getIcon("pluginRepository"), |
158 UI.PixmapCache.getIcon("pluginRepository"), |
142 self.tr("Plugin Repository"), self.__startPluginRepository) |
159 self.tr("Plugin Repository"), |
143 self.__menu.addSeparator() |
160 self.__startPluginRepository, |
144 |
161 ) |
|
162 self.__menu.addSeparator() |
|
163 |
145 self.__menu.addAction( |
164 self.__menu.addAction( |
146 UI.PixmapCache.getIcon("virtualenv"), |
165 UI.PixmapCache.getIcon("virtualenv"), |
147 self.tr("Virtual Environments"), self.__startVirtualenvManager) |
166 self.tr("Virtual Environments"), |
148 self.__menu.addSeparator() |
167 self.__startVirtualenvManager, |
149 |
168 ) |
|
169 self.__menu.addSeparator() |
|
170 |
150 self.__menu.addAction( |
171 self.__menu.addAction( |
151 UI.PixmapCache.getIcon("configure"), |
172 UI.PixmapCache.getIcon("configure"), |
152 self.tr('Preferences'), self.__startPreferences) |
173 self.tr("Preferences"), |
153 self.__menu.addSeparator() |
174 self.__startPreferences, |
154 |
175 ) |
|
176 self.__menu.addSeparator() |
|
177 |
155 self.__menu.addAction( |
178 self.__menu.addAction( |
156 UI.PixmapCache.getIcon("editor"), |
179 UI.PixmapCache.getIcon("editor"), |
157 self.tr("eric Mini Editor"), self.__startMiniEditor) |
180 self.tr("eric Mini Editor"), |
|
181 self.__startMiniEditor, |
|
182 ) |
158 self.__menu.addAction( |
183 self.__menu.addAction( |
159 UI.PixmapCache.getIcon("hexEditor"), |
184 UI.PixmapCache.getIcon("hexEditor"), |
160 self.tr("eric Hex Editor"), self.__startHexEditor) |
185 self.tr("eric Hex Editor"), |
|
186 self.__startHexEditor, |
|
187 ) |
161 self.__menu.addAction( |
188 self.__menu.addAction( |
162 UI.PixmapCache.getIcon("shell"), |
189 UI.PixmapCache.getIcon("shell"), |
163 self.tr("eric Shell Window"), self.__startShell) |
190 self.tr("eric Shell Window"), |
164 self.__menu.addSeparator() |
191 self.__startShell, |
165 |
192 ) |
|
193 self.__menu.addSeparator() |
|
194 |
166 self.__menu.addAction( |
195 self.__menu.addAction( |
167 UI.PixmapCache.getIcon("ericWeb"), |
196 UI.PixmapCache.getIcon("ericWeb"), |
168 self.tr("eric Web Browser"), self.__startWebBrowser) |
197 self.tr("eric Web Browser"), |
|
198 self.__startWebBrowser, |
|
199 ) |
169 self.__menu.addAction( |
200 self.__menu.addAction( |
170 UI.PixmapCache.getIcon("ericWeb"), |
201 UI.PixmapCache.getIcon("ericWeb"), |
171 self.tr("eric Web Browser (with QtHelp)"), |
202 self.tr("eric Web Browser (with QtHelp)"), |
172 self.__startWebBrowserQtHelp) |
203 self.__startWebBrowserQtHelp, |
|
204 ) |
173 self.__menu.addAction( |
205 self.__menu.addAction( |
174 UI.PixmapCache.getIcon("ericWeb"), |
206 UI.PixmapCache.getIcon("ericWeb"), |
175 self.tr("eric Web Browser (Private Mode)"), |
207 self.tr("eric Web Browser (Private Mode)"), |
176 self.__startWebBrowserPrivate) |
208 self.__startWebBrowserPrivate, |
177 self.__menu.addSeparator() |
209 ) |
178 |
210 self.__menu.addSeparator() |
|
211 |
179 # recent files |
212 # recent files |
180 self.menuRecentFilesAct = self.__menu.addMenu(self.recentFilesMenu) |
213 self.menuRecentFilesAct = self.__menu.addMenu(self.recentFilesMenu) |
181 # recent multi projects |
214 # recent multi projects |
182 self.menuRecentMultiProjectsAct = self.__menu.addMenu( |
215 self.menuRecentMultiProjectsAct = self.__menu.addMenu( |
183 self.recentMultiProjectsMenu) |
216 self.recentMultiProjectsMenu |
|
217 ) |
184 # recent projects |
218 # recent projects |
185 self.menuRecentProjectsAct = self.__menu.addMenu( |
219 self.menuRecentProjectsAct = self.__menu.addMenu(self.recentProjectsMenu) |
186 self.recentProjectsMenu) |
220 self.__menu.addSeparator() |
187 self.__menu.addSeparator() |
221 |
188 |
222 self.__menu.addAction( |
189 self.__menu.addAction( |
223 UI.PixmapCache.getIcon("erict"), self.tr("eric IDE"), self.__startEric |
190 UI.PixmapCache.getIcon("erict"), |
224 ) |
191 self.tr("eric IDE"), self.__startEric) |
225 self.__menu.addSeparator() |
192 self.__menu.addSeparator() |
226 |
193 |
|
194 self.__menu.addAction( |
227 self.__menu.addAction( |
195 UI.PixmapCache.getIcon("configure"), |
228 UI.PixmapCache.getIcon("configure"), |
196 self.tr('Configure Tray Starter'), self.__showPreferences) |
229 self.tr("Configure Tray Starter"), |
197 self.__menu.addSeparator() |
230 self.__showPreferences, |
198 |
231 ) |
199 self.__menu.addAction( |
232 self.__menu.addSeparator() |
200 UI.PixmapCache.getIcon("exit"), |
233 |
201 self.tr('Quit'), ericApp().quit) |
234 self.__menu.addAction( |
202 |
235 UI.PixmapCache.getIcon("exit"), self.tr("Quit"), ericApp().quit |
|
236 ) |
|
237 |
203 def __loadRecentProjects(self): |
238 def __loadRecentProjects(self): |
204 """ |
239 """ |
205 Private method to load the recently opened project filenames. |
240 Private method to load the recently opened project filenames. |
206 """ |
241 """ |
207 rp = self.rsettings.value(Globals.recentNameProject) |
242 rp = self.rsettings.value(Globals.recentNameProject) |
208 if rp is not None: |
243 if rp is not None: |
209 for f in rp: |
244 for f in rp: |
210 if pathlib.Path(f).exists(): |
245 if pathlib.Path(f).exists(): |
211 self.recentProjects.append(f) |
246 self.recentProjects.append(f) |
212 |
247 |
213 def __loadRecentMultiProjects(self): |
248 def __loadRecentMultiProjects(self): |
214 """ |
249 """ |
215 Private method to load the recently opened multi project filenames. |
250 Private method to load the recently opened multi project filenames. |
216 """ |
251 """ |
217 rmp = self.rsettings.value(Globals.recentNameMultiProject) |
252 rmp = self.rsettings.value(Globals.recentNameMultiProject) |
218 if rmp is not None: |
253 if rmp is not None: |
219 for f in rmp: |
254 for f in rmp: |
220 if pathlib.Path(f).exists(): |
255 if pathlib.Path(f).exists(): |
221 self.recentMultiProjects.append(f) |
256 self.recentMultiProjects.append(f) |
222 |
257 |
223 def __loadRecentFiles(self): |
258 def __loadRecentFiles(self): |
224 """ |
259 """ |
225 Private method to load the recently opened filenames. |
260 Private method to load the recently opened filenames. |
226 """ |
261 """ |
227 rf = self.rsettings.value(Globals.recentNameFiles) |
262 rf = self.rsettings.value(Globals.recentNameFiles) |
228 if rf is not None: |
263 if rf is not None: |
229 for f in rf: |
264 for f in rf: |
230 if pathlib.Path(f).exists(): |
265 if pathlib.Path(f).exists(): |
231 self.recentFiles.append(f) |
266 self.recentFiles.append(f) |
232 |
267 |
233 def __activated(self, reason): |
268 def __activated(self, reason): |
234 """ |
269 """ |
235 Private slot to handle the activated signal. |
270 Private slot to handle the activated signal. |
236 |
271 |
237 @param reason reason code of the signal |
272 @param reason reason code of the signal |
238 (QSystemTrayIcon.ActivationReason) |
273 (QSystemTrayIcon.ActivationReason) |
239 """ |
274 """ |
240 if reason in ( |
275 if reason in ( |
241 QSystemTrayIcon.ActivationReason.Context, |
276 QSystemTrayIcon.ActivationReason.Context, |
242 QSystemTrayIcon.ActivationReason.MiddleClick |
277 QSystemTrayIcon.ActivationReason.MiddleClick, |
243 ): |
278 ): |
244 self.__showContextMenu() |
279 self.__showContextMenu() |
245 elif reason == QSystemTrayIcon.ActivationReason.DoubleClick: |
280 elif reason == QSystemTrayIcon.ActivationReason.DoubleClick: |
246 self.__startEric() |
281 self.__startEric() |
247 |
282 |
248 def __showContextMenu(self): |
283 def __showContextMenu(self): |
249 """ |
284 """ |
250 Private slot to show the context menu. |
285 Private slot to show the context menu. |
251 """ |
286 """ |
252 self.menuRecentProjectsAct.setEnabled(len(self.recentProjects) > 0) |
287 self.menuRecentProjectsAct.setEnabled(len(self.recentProjects) > 0) |
253 self.menuRecentMultiProjectsAct.setEnabled( |
288 self.menuRecentMultiProjectsAct.setEnabled(len(self.recentMultiProjects) > 0) |
254 len(self.recentMultiProjects) > 0) |
|
255 self.menuRecentFilesAct.setEnabled(len(self.recentFiles) > 0) |
289 self.menuRecentFilesAct.setEnabled(len(self.recentFiles) > 0) |
256 |
290 |
257 pos = QCursor.pos() |
291 pos = QCursor.pos() |
258 x = pos.x() - self.__menu.sizeHint().width() |
292 x = pos.x() - self.__menu.sizeHint().width() |
259 pos.setX(x > 0 and x or 0) |
293 pos.setX(x > 0 and x or 0) |
260 y = pos.y() - self.__menu.sizeHint().height() |
294 y = pos.y() - self.__menu.sizeHint().height() |
261 pos.setY(y > 0 and y or 0) |
295 pos.setY(y > 0 and y or 0) |
262 self.__menu.popup(pos) |
296 self.__menu.popup(pos) |
263 |
297 |
264 def __startProc(self, applName, *applArgs): |
298 def __startProc(self, applName, *applArgs): |
265 """ |
299 """ |
266 Private method to start an eric application. |
300 Private method to start an eric application. |
267 |
301 |
268 @param applName name of the eric application script (string) |
302 @param applName name of the eric application script (string) |
269 @param *applArgs variable list of application arguments |
303 @param *applArgs variable list of application arguments |
270 """ |
304 """ |
271 proc = QProcess() |
305 proc = QProcess() |
272 applPath = os.path.join(getConfig("ericDir"), applName) |
306 applPath = os.path.join(getConfig("ericDir"), applName) |
273 |
307 |
274 args = [] |
308 args = [] |
275 args.append(applPath) |
309 args.append(applPath) |
276 args.append("--config={0}".format(Utilities.getConfigDir())) |
310 args.append("--config={0}".format(Utilities.getConfigDir())) |
277 if self.settingsDir: |
311 if self.settingsDir: |
278 args.append("--settings={0}".format(self.settingsDir)) |
312 args.append("--settings={0}".format(self.settingsDir)) |
279 for arg in applArgs: |
313 for arg in applArgs: |
280 args.append(arg) |
314 args.append(arg) |
281 |
315 |
282 if ( |
316 if not os.path.isfile(applPath) or not proc.startDetached( |
283 not os.path.isfile(applPath) or |
317 Globals.getPythonExecutable(), args |
284 not proc.startDetached(Globals.getPythonExecutable(), args) |
|
285 ): |
318 ): |
286 EricMessageBox.critical( |
319 EricMessageBox.critical( |
287 self, |
320 self, |
288 self.tr('Process Generation Error'), |
321 self.tr("Process Generation Error"), |
289 self.tr( |
322 self.tr( |
290 '<p>Could not start the process.<br>' |
323 "<p>Could not start the process.<br>" |
291 'Ensure that it is available as <b>{0}</b>.</p>' |
324 "Ensure that it is available as <b>{0}</b>.</p>" |
292 ).format(applPath), |
325 ).format(applPath), |
293 self.tr('OK')) |
326 self.tr("OK"), |
294 |
327 ) |
|
328 |
295 def __startMiniEditor(self): |
329 def __startMiniEditor(self): |
296 """ |
330 """ |
297 Private slot to start the eric Mini Editor. |
331 Private slot to start the eric Mini Editor. |
298 """ |
332 """ |
299 self.__startProc("eric7_editor.py") |
333 self.__startProc("eric7_editor.py") |
300 |
334 |
301 def __startEric(self): |
335 def __startEric(self): |
302 """ |
336 """ |
303 Private slot to start the eric IDE. |
337 Private slot to start the eric IDE. |
304 """ |
338 """ |
305 self.__startProc("eric7.py") |
339 self.__startProc("eric7.py") |
435 Private method to set up the recent projects menu. |
469 Private method to set up the recent projects menu. |
436 """ |
470 """ |
437 self.recentProjects = [] |
471 self.recentProjects = [] |
438 self.rsettings.sync() |
472 self.rsettings.sync() |
439 self.__loadRecentProjects() |
473 self.__loadRecentProjects() |
440 |
474 |
441 self.recentProjectsMenu.clear() |
475 self.recentProjectsMenu.clear() |
442 |
476 |
443 for idx, rp in enumerate(self.recentProjects, start=1): |
477 for idx, rp in enumerate(self.recentProjects, start=1): |
444 formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}' |
478 formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}" |
445 act = self.recentProjectsMenu.addAction( |
479 act = self.recentProjectsMenu.addAction( |
446 formatStr.format( |
480 formatStr.format( |
447 idx, Utilities.compactPath(rp, self.maxMenuFilePathLen))) |
481 idx, Utilities.compactPath(rp, self.maxMenuFilePathLen) |
|
482 ) |
|
483 ) |
448 act.setData(rp) |
484 act.setData(rp) |
449 |
485 |
450 def __showRecentMultiProjectsMenu(self): |
486 def __showRecentMultiProjectsMenu(self): |
451 """ |
487 """ |
452 Private method to set up the recent multi projects menu. |
488 Private method to set up the recent multi projects menu. |
453 """ |
489 """ |
454 self.recentMultiProjects = [] |
490 self.recentMultiProjects = [] |
455 self.rsettings.sync() |
491 self.rsettings.sync() |
456 self.__loadRecentMultiProjects() |
492 self.__loadRecentMultiProjects() |
457 |
493 |
458 self.recentMultiProjectsMenu.clear() |
494 self.recentMultiProjectsMenu.clear() |
459 |
495 |
460 for idx, rmp in enumerate(self.recentMultiProjects, start=1): |
496 for idx, rmp in enumerate(self.recentMultiProjects, start=1): |
461 formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}' |
497 formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}" |
462 act = self.recentMultiProjectsMenu.addAction( |
498 act = self.recentMultiProjectsMenu.addAction( |
463 formatStr.format( |
499 formatStr.format( |
464 idx, Utilities.compactPath(rmp, self.maxMenuFilePathLen))) |
500 idx, Utilities.compactPath(rmp, self.maxMenuFilePathLen) |
|
501 ) |
|
502 ) |
465 act.setData(rmp) |
503 act.setData(rmp) |
466 |
504 |
467 def __showRecentFilesMenu(self): |
505 def __showRecentFilesMenu(self): |
468 """ |
506 """ |
469 Private method to set up the recent files menu. |
507 Private method to set up the recent files menu. |
470 """ |
508 """ |
471 self.recentFiles = [] |
509 self.recentFiles = [] |
472 self.rsettings.sync() |
510 self.rsettings.sync() |
473 self.__loadRecentFiles() |
511 self.__loadRecentFiles() |
474 |
512 |
475 self.recentFilesMenu.clear() |
513 self.recentFilesMenu.clear() |
476 |
514 |
477 for idx, rf in enumerate(self.recentFiles, start=1): |
515 for idx, rf in enumerate(self.recentFiles, start=1): |
478 formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}' |
516 formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}" |
479 act = self.recentFilesMenu.addAction( |
517 act = self.recentFilesMenu.addAction( |
480 formatStr.format( |
518 formatStr.format( |
481 idx, Utilities.compactPath(rf, self.maxMenuFilePathLen))) |
519 idx, Utilities.compactPath(rf, self.maxMenuFilePathLen) |
|
520 ) |
|
521 ) |
482 act.setData(rf) |
522 act.setData(rf) |
483 |
523 |
484 def __openRecent(self, act): |
524 def __openRecent(self, act): |
485 """ |
525 """ |
486 Private method to open a project or file from the list of recently |
526 Private method to open a project or file from the list of recently |
487 opened projects or files. |
527 opened projects or files. |
488 |
528 |
489 @param act reference to the action that triggered (QAction) |
529 @param act reference to the action that triggered (QAction) |
490 """ |
530 """ |
491 filename = act.data() |
531 filename = act.data() |
492 if filename: |
532 if filename: |
493 self.__startProc( |
533 self.__startProc("eric7.py", filename) |
494 "eric7.py", |
534 |
495 filename) |
|
496 |
|
497 def __showPreferences(self): |
535 def __showPreferences(self): |
498 """ |
536 """ |
499 Private slot to set the preferences. |
537 Private slot to set the preferences. |
500 """ |
538 """ |
501 from Preferences.ConfigurationDialog import ( |
539 from Preferences.ConfigurationDialog import ( |
502 ConfigurationDialog, ConfigurationMode |
540 ConfigurationDialog, |
503 ) |
541 ConfigurationMode, |
|
542 ) |
|
543 |
504 dlg = ConfigurationDialog( |
544 dlg = ConfigurationDialog( |
505 None, 'Configuration', True, fromEric=True, |
545 None, |
506 displayMode=ConfigurationMode.TRAYSTARTERMODE) |
546 "Configuration", |
|
547 True, |
|
548 fromEric=True, |
|
549 displayMode=ConfigurationMode.TRAYSTARTERMODE, |
|
550 ) |
507 dlg.preferencesChanged.connect(self.preferencesChanged) |
551 dlg.preferencesChanged.connect(self.preferencesChanged) |
508 dlg.show() |
552 dlg.show() |
509 dlg.showConfigurationPageByName("trayStarterPage") |
553 dlg.showConfigurationPageByName("trayStarterPage") |
510 dlg.exec() |
554 dlg.exec() |
511 QApplication.processEvents() |
555 QApplication.processEvents() |
512 if dlg.result() == QDialog.DialogCode.Accepted: |
556 if dlg.result() == QDialog.DialogCode.Accepted: |
513 dlg.setPreferences() |
557 dlg.setPreferences() |
514 Preferences.syncPreferences() |
558 Preferences.syncPreferences() |
515 self.preferencesChanged() |
559 self.preferencesChanged() |
516 |
560 |
517 def preferencesChanged(self): |
561 def preferencesChanged(self): |
518 """ |
562 """ |
519 Public slot to handle a change of preferences. |
563 Public slot to handle a change of preferences. |
520 """ |
564 """ |
521 self.setIcon( |
565 self.setIcon( |
522 UI.PixmapCache.getIcon( |
566 UI.PixmapCache.getIcon(Preferences.getTrayStarter("TrayStarterIcon")) |
523 Preferences.getTrayStarter("TrayStarterIcon"))) |
567 ) |
524 |
568 |
525 def __about(self): |
569 def __about(self): |
526 """ |
570 """ |
527 Private slot to handle the About dialog. |
571 Private slot to handle the About dialog. |
528 """ |
572 """ |
529 from Plugins.AboutPlugin.AboutDialog import AboutDialog |
573 from Plugins.AboutPlugin.AboutDialog import AboutDialog |
|
574 |
530 dlg = AboutDialog() |
575 dlg = AboutDialog() |
531 dlg.exec() |
576 dlg.exec() |
532 |
577 |
533 def __showVersions(self): |
578 def __showVersions(self): |
534 """ |
579 """ |
535 Private slot to handle the Versions dialog. |
580 Private slot to handle the Versions dialog. |
536 """ |
581 """ |
537 from PyQt6.QtCore import qVersion, PYQT_VERSION_STR |
582 from PyQt6.QtCore import qVersion, PYQT_VERSION_STR |
538 from PyQt6.Qsci import QSCINTILLA_VERSION_STR |
583 from PyQt6.Qsci import QSCINTILLA_VERSION_STR |
539 |
584 |
540 try: |
585 try: |
541 try: |
586 try: |
542 from PyQt6 import sip |
587 from PyQt6 import sip |
543 except ImportError: |
588 except ImportError: |
544 import sip |
589 import sip |
545 sip_version_str = sip.SIP_VERSION_STR |
590 sip_version_str = sip.SIP_VERSION_STR |
546 except (ImportError, AttributeError): |
591 except (ImportError, AttributeError): |
547 sip_version_str = "sip version not available" |
592 sip_version_str = "sip version not available" |
548 |
593 |
549 versionText = self.tr( |
594 versionText = self.tr("""<h3>Version Numbers</h3>""" """<table>""") |
550 """<h3>Version Numbers</h3>""" |
595 |
551 """<table>""") |
|
552 |
|
553 # Python version |
596 # Python version |
554 versionText += ( |
597 versionText += """<tr><td><b>Python</b></td><td>{0}</td></tr>""".format( |
555 """<tr><td><b>Python</b></td><td>{0}</td></tr>""" |
598 sys.version.split()[0] |
556 .format(sys.version.split()[0]) |
599 ) |
557 ) |
600 |
558 |
|
559 # Qt version |
601 # Qt version |
560 versionText += ( |
602 versionText += """<tr><td><b>Qt</b></td><td>{0}</td></tr>""".format(qVersion()) |
561 """<tr><td><b>Qt</b></td><td>{0}</td></tr>""" |
603 |
562 .format(qVersion()) |
|
563 ) |
|
564 |
|
565 # PyQt versions |
604 # PyQt versions |
566 versionText += ( |
605 versionText += """<tr><td><b>PyQt</b></td><td>{0}</td></tr>""".format( |
567 """<tr><td><b>PyQt</b></td><td>{0}</td></tr>""" |
606 PYQT_VERSION_STR |
568 .format(PYQT_VERSION_STR) |
607 ) |
569 ) |
608 versionText += """<tr><td><b>sip</b></td><td>{0}</td></tr>""".format( |
570 versionText += ( |
609 sip_version_str |
571 """<tr><td><b>sip</b></td><td>{0}</td></tr>""" |
610 ) |
572 .format(sip_version_str) |
611 versionText += """<tr><td><b>QScintilla</b></td><td>{0}</td></tr>""".format( |
573 ) |
612 QSCINTILLA_VERSION_STR |
574 versionText += ( |
613 ) |
575 """<tr><td><b>QScintilla</b></td><td>{0}</td></tr>""" |
614 |
576 .format(QSCINTILLA_VERSION_STR) |
|
577 ) |
|
578 |
|
579 # webengine (chromium) version |
615 # webengine (chromium) version |
580 with contextlib.suppress(ImportError): |
616 with contextlib.suppress(ImportError): |
581 from WebBrowser.Tools import WebBrowserTools |
617 from WebBrowser.Tools import WebBrowserTools |
582 chromiumVersion, chromiumSecurityVersion = ( |
618 |
583 WebBrowserTools.getWebEngineVersions()[0:2] |
619 ( |
584 ) |
620 chromiumVersion, |
585 versionText += ( |
621 chromiumSecurityVersion, |
586 """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>""" |
622 ) = WebBrowserTools.getWebEngineVersions()[0:2] |
587 .format(chromiumVersion) |
623 versionText += """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>""".format( |
|
624 chromiumVersion |
588 ) |
625 ) |
589 if chromiumSecurityVersion: |
626 if chromiumSecurityVersion: |
590 versionText += self.tr( |
627 versionText += self.tr( |
591 """<tr><td><b>WebEngine (Security)</b></td>""" |
628 """<tr><td><b>WebEngine (Security)</b></td>""" |
592 """<td>{0}</td></tr>""" |
629 """<td>{0}</td></tr>""" |
593 ).format(chromiumSecurityVersion) |
630 ).format(chromiumSecurityVersion) |
594 |
631 |
595 # eric7 version |
632 # eric7 version |
596 versionText += ( |
633 versionText += """<tr><td><b>{0}</b></td><td>{1}</td></tr>""".format( |
597 """<tr><td><b>{0}</b></td><td>{1}</td></tr>""" |
634 Program, Version |
598 .format(Program, Version) |
635 ) |
599 ) |
636 |
600 |
|
601 # desktop and session type |
637 # desktop and session type |
602 desktop = Globals.desktopName() |
638 desktop = Globals.desktopName() |
603 session = Globals.sessionType() |
639 session = Globals.sessionType() |
604 if desktop or session: |
640 if desktop or session: |
605 versionText += "<tr><td></td><td></td></tr>" |
641 versionText += "<tr><td></td><td></td></tr>" |
606 if desktop: |
642 if desktop: |
607 versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>" |
643 versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format( |
608 ).format(self.tr("Desktop"), desktop) |
644 self.tr("Desktop"), desktop |
|
645 ) |
609 if session: |
646 if session: |
610 versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>" |
647 versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format( |
611 ).format(self.tr("Session Type"), session) |
648 self.tr("Session Type"), session |
612 |
649 ) |
|
650 |
613 versionText += self.tr("""</table>""") |
651 versionText += self.tr("""</table>""") |
614 |
652 |
615 EricMessageBox.about(None, Program, versionText) |
653 EricMessageBox.about(None, Program, versionText) |