Fri, 14 Jun 2024 14:01:18 +0200
Updated translations.
10539 | 1 | # -*- coding: utf-8 -*- |
2 | ||
3 | # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> | |
4 | # | |
5 | ||
6 | """ | |
7 | Module implementing a file dialog showing the file system of the eric-ide server. | |
8 | """ | |
9 | ||
10 | import enum | |
11 | import fnmatch | |
12 | import re | |
13 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
14 | from PyQt6.QtCore import QLocale, QPoint, Qt, pyqtSlot |
10539 | 15 | from PyQt6.QtWidgets import ( |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
16 | QAbstractItemView, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
17 | QCompleter, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
18 | QDialog, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
19 | QInputDialog, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
20 | QLineEdit, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
21 | QMenu, |
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
22 | QTreeWidgetItem, |
10539 | 23 | ) |
24 | ||
25 | from eric7.EricGui import EricPixmapCache | |
26 | from eric7.EricGui.EricFileIconProvider import EricFileIconProvider | |
27 | from eric7.EricWidgets import EricMessageBox | |
28 | from eric7.EricWidgets.EricApplication import ericApp | |
29 | from eric7.Globals import dataString | |
30 | from eric7.SystemUtilities import FileSystemUtilities | |
31 | ||
32 | from .Ui_EricServerFileDialog import Ui_EricServerFileDialog | |
33 | ||
34 | ||
35 | class AcceptMode(enum.Enum): | |
36 | """ | |
37 | Class defining the dialog accept modes. | |
38 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
39 | |
10539 | 40 | AcceptOpen = 0 |
41 | AcceptSave = 1 | |
42 | ||
43 | ||
44 | class FileMode(enum.Enum): | |
45 | """ | |
46 | Class defining what the user may select in the file dialog. | |
47 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
48 | |
10539 | 49 | AnyFile = 0 |
50 | ExistingFile = 1 | |
51 | Directory = 2 | |
52 | ExistingFiles = 3 | |
53 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
54 | |
10539 | 55 | class EricServerFileDialog(QDialog, Ui_EricServerFileDialog): |
56 | """ | |
57 | Class implementing a file dialog showing the file system of the eric-ide server. | |
58 | """ | |
59 | ||
60 | IsDirectoryRole = Qt.ItemDataRole.UserRole | |
61 | ||
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
62 | def __init__(self, parent=None, caption="", directory="", filter=""): # noqa: M132 |
10539 | 63 | """ |
64 | Constructor | |
65 | ||
66 | @param parent reference to the parent widget (defaults to None) | |
67 | @type QWidget (optional) | |
68 | @param caption dialog title (defaults to "") | |
69 | @type str (optional) | |
70 | @param directory initial directory (defaults to "") | |
71 | @type str (optional) | |
72 | @param filter Qt file filter string (defaults to "") | |
73 | @type str (optional) | |
74 | """ | |
75 | super().__init__(parent) | |
76 | self.setupUi(self) | |
77 | ||
78 | # finish UI setup | |
79 | self.backButton.setIcon(EricPixmapCache.getIcon("1leftarrow")) | |
80 | self.forwardButton.setIcon(EricPixmapCache.getIcon("1rightarrow")) | |
81 | self.upButton.setIcon(EricPixmapCache.getIcon("1uparrow")) | |
82 | self.newDirButton.setIcon(EricPixmapCache.getIcon("dirNew")) | |
83 | self.reloadButton.setIcon(EricPixmapCache.getIcon("reload")) | |
84 | self.cancelButton.setIcon(EricPixmapCache.getIcon("dialog-cancel")) | |
85 | ||
86 | self.setWindowTitle(caption) | |
87 | ||
88 | self.__iconProvider = EricFileIconProvider() | |
89 | ||
90 | self.__nameCompleter = QCompleter() | |
91 | self.__nameCompleter.setModel(self.listing.model()) | |
92 | self.__nameCompleter.setCompletionColumn(0) | |
93 | self.__nameCompleter.activated.connect(self.__nameCompleterActivated) | |
94 | self.nameEdit.setCompleter(self.__nameCompleter) | |
95 | ||
96 | self.__contextMenu = QMenu(self) | |
97 | ||
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
98 | self.__fsInterface = ( |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
99 | ericApp().getObject("EricServer").getServiceInterface("FileSystem") |
10539 | 100 | ) |
101 | ||
102 | # set some default values | |
103 | self.__fileMode = FileMode.ExistingFile | |
104 | self.__dirsOnly = False | |
105 | self.__acceptMode = AcceptMode.AcceptOpen | |
106 | self.__showHidden = False | |
107 | self.__sep = "/" | |
108 | self.__filters = [] | |
109 | ||
110 | self.__history = [] | |
111 | self.__currentHistoryIndex = -1 # empty history | |
112 | self.__updateHistoryButtons() | |
113 | ||
114 | self.__filenameCache = [] | |
115 | self.__directoryCache = [] | |
116 | self.__selectedDirectory = None | |
117 | ||
10722
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
118 | if filter: |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
119 | self.setNameFilters(filter.split(";;")) |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
120 | else: |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
121 | self.setNameFilters([self.tr("All Files (*)")]) |
10539 | 122 | |
123 | self.reloadButton.clicked.connect(self.__reload) | |
124 | self.cancelButton.clicked.connect(self.reject) | |
125 | ||
126 | self.treeCombo.currentTextChanged.connect(self.setDirectory) | |
127 | ||
10630
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
128 | self.setDirectory(directory) |
10539 | 129 | |
130 | def acceptMode(self): | |
131 | """ | |
132 | Public method to get the accept mode of the dialog. | |
133 | ||
134 | @return accept mode | |
135 | @rtype AcceptMode | |
136 | """ | |
137 | return self.__acceptMode | |
138 | ||
139 | def setAcceptMode(self, mode): | |
140 | """ | |
141 | Public method to set the accept mode of the dialog. | |
142 | ||
143 | @param mode accept mode | |
144 | @type AcceptMode | |
145 | """ | |
146 | self.__acceptMode = mode | |
147 | ||
148 | self.__updateOkButton() | |
149 | ||
150 | def fileMode(self): | |
151 | """ | |
152 | Public method to get the current file mode of the dialog. | |
153 | ||
154 | @return file mode | |
155 | @rtype FileMode | |
156 | """ | |
157 | return self.__fileMode | |
158 | ||
159 | def setFileMode(self, mode): | |
160 | """ | |
161 | Public method to set the file mode of the dialog. | |
162 | ||
163 | @param mode file mode | |
164 | @type FileMode | |
165 | """ | |
166 | self.__fileMode = mode | |
167 | ||
168 | self.listing.clearSelection() | |
169 | if mode == FileMode.ExistingFiles: | |
170 | self.listing.setSelectionMode( | |
171 | QAbstractItemView.SelectionMode.ExtendedSelection | |
172 | ) | |
173 | else: | |
174 | self.listing.setSelectionMode( | |
175 | QAbstractItemView.SelectionMode.SingleSelection | |
176 | ) | |
177 | ||
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
178 | if mode == FileMode.Directory: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
179 | self.setNameFilters([self.tr("Directories")]) |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
180 | |
10539 | 181 | self.__updateOkButton() |
182 | ||
183 | def setNameFilters(self, filters): | |
184 | """ | |
185 | Public method to set the list of file/directory name filters. | |
186 | ||
187 | @param filters list of filter expressions | |
188 | ("filter_name (pattern1 ... patternN)") | |
189 | @type list of str | |
190 | """ | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
191 | self.__filters = [] |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
192 | for f in filters: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
193 | if " (" in f and ")" in f: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
194 | self.__filters.append(f.split(" (", 1)[1].split(")", 1)[0].split()) |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
195 | elif f: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
196 | self.__filters.append(f) |
10539 | 197 | |
198 | self.filterCombo.clear() | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
199 | self.filterCombo.addItems([f for f in filters if f]) |
10539 | 200 | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
201 | def setNameFilter(self, filter): # noqa: M132 |
10539 | 202 | """ |
203 | Public method to set the current name filter. | |
204 | ||
205 | @param filter filter text to make current | |
206 | @type str | |
207 | """ | |
208 | self.filterCombo.setCurrentText(filter) | |
209 | ||
210 | def setDirectoriesOnly(self, dirsOnly): | |
211 | """ | |
212 | Public method to set a flag to just show directories. | |
213 | ||
214 | @param dirsOnly flag indicating to just show directories | |
215 | @type bool | |
216 | """ | |
217 | self.__dirsOnly = dirsOnly | |
218 | ||
219 | filters = self.__filters[self.filterCombo.currentIndex()] | |
220 | self.__filterList(filters) | |
221 | ||
222 | def __addToHistory(self, entry): | |
223 | """ | |
224 | Private method to add a directory to the history list. | |
225 | ||
226 | @param entry name of the directory to be added | |
227 | @type str | |
228 | """ | |
229 | try: | |
230 | # is in the history already? | |
231 | index = self.__history.index(entry) | |
232 | self.__currentHistoryIndex = index | |
233 | except ValueError: | |
234 | # new entry | |
235 | self.__history.append(entry) | |
236 | self.__currentHistoryIndex = len(self.__history) - 1 | |
237 | ||
238 | self.__updateHistoryButtons() | |
239 | ||
240 | @pyqtSlot() | |
241 | def __updateHistoryButtons(self): | |
242 | """ | |
243 | Private method to update the enabled state of the back and forward buttons. | |
244 | """ | |
245 | if not self.__history: | |
246 | self.backButton.setEnabled(False) | |
247 | self.forwardButton.setEnabled(False) | |
248 | else: | |
249 | self.backButton.setEnabled(self.__currentHistoryIndex > 0) | |
250 | self.forwardButton.setEnabled( | |
251 | self.__currentHistoryIndex < len(self.__history) - 1 | |
252 | ) | |
253 | ||
254 | @pyqtSlot() | |
255 | def on_backButton_clicked(self): | |
256 | """ | |
257 | Private slot to move back in history of visited directories. | |
258 | """ | |
259 | self.setDirectory(self.__history[self.__currentHistoryIndex - 1]) | |
260 | ||
261 | @pyqtSlot() | |
262 | def on_forwardButton_clicked(self): | |
263 | """ | |
264 | Private slot to move forward in history of visited directories. | |
265 | """ | |
266 | self.setDirectory(self.__history[self.__currentHistoryIndex + 1]) | |
267 | ||
268 | @pyqtSlot() | |
269 | def __updateUpButton(self): | |
270 | """ | |
271 | Private slot to update the enabled state of the 'Up' button. | |
272 | """ | |
273 | self.upButton.setEnabled( | |
274 | self.treeCombo.currentIndex() < self.treeCombo.count() - 1 | |
275 | ) | |
276 | ||
277 | @pyqtSlot() | |
278 | def on_upButton_clicked(self): | |
279 | """ | |
280 | Private slot to move up one level in the hierarchy. | |
281 | """ | |
282 | self.treeCombo.setCurrentIndex(self.treeCombo.currentIndex() + 1) | |
283 | ||
284 | @pyqtSlot() | |
285 | def on_newDirButton_clicked(self): | |
286 | """ | |
287 | Private slot to create a new directory. | |
288 | """ | |
289 | newDir, ok = QInputDialog.getText( | |
290 | self, | |
291 | self.tr("New Directory"), | |
292 | self.tr("Enter the name for the new directory:"), | |
293 | QLineEdit.EchoMode.Normal, | |
294 | ) | |
295 | if ok and newDir: | |
296 | if newDir in self.__directoryCache or newDir in self.__filenameCache: | |
297 | EricMessageBox.warning( | |
298 | self, | |
299 | self.tr("New Directory"), | |
300 | self.tr( | |
301 | "<p>A file or directory with the name <b>{0}</b> exists" | |
302 | " already. Aborting...</p>" | |
303 | ).format(newDir), | |
304 | ) | |
305 | return | |
306 | ||
307 | ok, error = self.__fsInterface.mkdir(self.__getFullPath(newDir)) | |
308 | if ok: | |
309 | # refresh | |
310 | self.__reload() | |
311 | else: | |
312 | EricMessageBox.critical( | |
313 | self, | |
314 | self.tr("New Directory"), | |
315 | self.tr( | |
316 | "<p>The directory <b>{0}</b> could not be created.</p>" | |
317 | "<p>Reason: {1}</p>" | |
318 | ).format( | |
319 | self.__getFullPath(newDir), | |
320 | error if error else self.tr("Unknown"), | |
321 | ), | |
322 | ) | |
323 | ||
324 | @pyqtSlot() | |
325 | def __reload(self): | |
326 | """ | |
327 | Private slot to reload the directory listing. | |
328 | """ | |
329 | self.setDirectory(self.treeCombo.currentText()) | |
330 | ||
331 | @pyqtSlot(QTreeWidgetItem, int) | |
332 | def on_listing_itemActivated(self, item, column): | |
333 | """ | |
334 | Private slot to handle the activation of an item in the list. | |
335 | ||
336 | @param item reference to the activated item | |
337 | @type QTreeWidgetItem | |
338 | @param column column number (unused) | |
339 | @type int | |
340 | """ | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
341 | if item.data(0, EricServerFileDialog.IsDirectoryRole): |
10539 | 342 | self.setDirectory(self.__getFullPath(item.text(0))) |
343 | else: | |
344 | self.accept() | |
345 | ||
346 | @pyqtSlot() | |
347 | def on_listing_itemSelectionChanged(self): | |
348 | """ | |
349 | Private slot to handle the selection of listed items. | |
350 | """ | |
351 | for itm in self.listing.selectedItems(): | |
352 | if itm.data(0, EricServerFileDialog.IsDirectoryRole): | |
353 | self.__selectedDirectory = itm.text(0) | |
354 | break | |
355 | else: | |
356 | self.__selectedDirectory = None | |
357 | ||
10602
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
358 | selectedNames = [] |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
359 | selectedItems = self.listing.selectedItems() |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
360 | for itm in selectedItems: |
10539 | 361 | isDir = itm.data(0, EricServerFileDialog.IsDirectoryRole) |
362 | if self.__fileMode == FileMode.Directory and isDir: | |
10602
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
363 | selectedNames.append(itm.text(0)) |
10539 | 364 | elif not isDir: |
10602
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
365 | selectedNames.append(itm.text(0)) |
10539 | 366 | |
10602
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
367 | blocked = self.nameEdit.blockSignals(True) |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
368 | if len(selectedNames) == 1: |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
369 | self.nameEdit.setText(selectedNames[0]) |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
370 | elif len(selectedNames) > 1: |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
371 | self.nameEdit.setText('"{0}"'.format('" "'.join(selectedNames))) |
a767e9c400fa
Corrected an issue in the server file selection dialog causing the selection not to work properly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10597
diff
changeset
|
372 | self.nameEdit.blockSignals(blocked) |
10539 | 373 | |
374 | self.__updateOkButton() | |
375 | ||
376 | @pyqtSlot() | |
377 | def __nameCompleterActivated(self): | |
378 | """ | |
379 | Private slot handling the activation of the completer. | |
380 | """ | |
381 | if self.okButton.isEnabled(): | |
382 | self.okButton.animateClick() | |
383 | ||
384 | @pyqtSlot(str) | |
385 | def on_nameEdit_textChanged(self, name): | |
386 | """ | |
387 | Private slot handling the editing of a file or directory name. | |
388 | ||
389 | @param name current text of the name edit | |
390 | @type str | |
391 | """ | |
392 | self.listing.clearSelection() | |
393 | items = self.listing.findItems(name, Qt.MatchFlag.MatchExactly) | |
394 | for itm in items: | |
395 | itm.setSelected(True) | |
396 | ||
397 | self.__updateOkButton() | |
398 | ||
399 | def __getNames(self): | |
400 | """ | |
401 | Private method to get the selected names list. | |
402 | ||
403 | @return list containing the selected names | |
404 | @rtype list of str | |
405 | """ | |
406 | namesStr = self.nameEdit.text() | |
407 | if namesStr.startswith('"'): | |
408 | namesStr = namesStr[1:] | |
409 | if namesStr.endswith('"'): | |
410 | namesStr = namesStr[:-1] | |
411 | names = re.split(r'"\s+"', namesStr) | |
412 | return names | |
413 | ||
414 | def __getFullPath(self, name): | |
415 | """ | |
416 | Private method to get the full path for a given file or directory name. | |
417 | ||
418 | @param name name of the file or directory | |
419 | @type str | |
420 | @return full path of the file or directory | |
421 | @rtype str | |
422 | """ | |
423 | return "{0}{1}{2}".format(self.treeCombo.currentText(), self.__sep, name) | |
424 | ||
425 | @pyqtSlot() | |
426 | def __updateOkButton(self): | |
427 | """ | |
428 | Private slot to set the 'OK' button state, icon and label. | |
429 | """ | |
430 | # 1. adjust icon and label | |
431 | if ( | |
432 | self.__acceptMode == AcceptMode.AcceptOpen | |
433 | or self.__selectedDirectory is not None | |
434 | ): | |
435 | self.okButton.setIcon(EricPixmapCache.getIcon("dialog-ok")) | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
436 | if self.__fileMode != FileMode.Directory: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
437 | self.okButton.setText(self.tr("Open")) |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
438 | else: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
439 | self.okButton.setText(self.tr("Choose")) |
10539 | 440 | else: |
441 | self.okButton.setIcon(EricPixmapCache.getIcon("fileSave")) | |
442 | self.okButton.setText(self.tr("Save")) | |
443 | ||
444 | # 2. adjust enabled state | |
445 | if self.__selectedDirectory and self.__fileMode != FileMode.Directory: | |
446 | self.okButton.setEnabled(True) | |
447 | elif self.__fileMode == FileMode.AnyFile: | |
448 | self.okButton.setEnabled(bool(self.nameEdit.text())) | |
449 | elif self.__fileMode == FileMode.ExistingFile: | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
450 | self.okButton.setEnabled(self.nameEdit.text() in self.__filenameCache) |
10539 | 451 | elif self.__fileMode == FileMode.ExistingFiles: |
452 | names = self.__getNames() | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
453 | self.okButton.setEnabled(all(n in self.__filenameCache for n in names)) |
10539 | 454 | elif self.__fileMode == FileMode.Directory: |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
455 | self.okButton.setEnabled(True) |
10539 | 456 | else: |
457 | self.okButton.setEnabled(False) | |
458 | ||
459 | @pyqtSlot() | |
460 | def on_okButton_clicked(self): | |
461 | """ | |
462 | Private slot handling the press of the OK button. | |
463 | """ | |
464 | if self.__selectedDirectory and self.__fileMode != FileMode.Directory: | |
465 | self.setDirectory(self.__getFullPath(self.__selectedDirectory)) | |
466 | else: | |
467 | self.accept() | |
468 | ||
469 | @pyqtSlot(int) | |
470 | def on_filterCombo_currentIndexChanged(self, index): | |
471 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
472 | Private slot handling the selection of a new file filter.. |
10539 | 473 | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
474 | @param index index of the selected entry |
10539 | 475 | @type int |
476 | """ | |
477 | filters = self.__filters[index] | |
478 | self.__filterList(filters) | |
479 | ||
480 | @pyqtSlot(str) | |
481 | def setDirectory(self, directory): | |
482 | """ | |
483 | Public slot to set the current directory and populate the tree list. | |
484 | ||
485 | @param directory directory to be set as current. An empty directory sets the | |
486 | server's current directory. | |
487 | @type str | |
488 | """ | |
489 | self.__filenameCache.clear() | |
490 | self.__directoryCache.clear() | |
491 | ||
10630
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
492 | if self.__fsInterface.isfile(directory): |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
493 | directory, basename = self.__fsInterface.split(directory) |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
494 | else: |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
495 | basename = "" |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
496 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
497 | try: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
498 | directory, sep, dirListing = self.__fsInterface.listdir(directory) |
10539 | 499 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
500 | self.__sep = sep |
10539 | 501 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
502 | # 1. populate the directory tree combo box |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
503 | self.treeCombo.blockSignals(True) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
504 | self.treeCombo.clear() |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
505 | if len(directory) > 1 and directory.endswith(sep): |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
506 | directory = directory[:-1] |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
507 | if len(directory) > 2 and directory[1] == ":": |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
508 | # starts with a Windows drive letter |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
509 | directory = directory[2:] |
10722
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
510 | if sep: |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
511 | directoryParts = directory.split(sep) |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
512 | while directoryParts: |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
513 | if directoryParts[-1]: |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
514 | self.treeCombo.addItem(sep.join(directoryParts)) |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
515 | directoryParts.pop() |
b74d46513011
Corrected some issues in the remote server and the remote file dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10633
diff
changeset
|
516 | self.treeCombo.addItem(sep) |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
517 | self.treeCombo.blockSignals(False) |
10539 | 518 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
519 | # 2. populate the directory listing |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
520 | self.listing.clear() |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
521 | for dirEntry in sorted( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
522 | dirListing, |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
523 | key=lambda d: ( |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
524 | " " + d["name"].lower() if d["is_dir"] else d["name"].lower() |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
525 | ), |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
526 | ): |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
527 | if dirEntry["is_dir"]: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
528 | type_ = self.tr("Directory") |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
529 | iconName = "dirClosed" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
530 | sizeStr = "" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
531 | self.__directoryCache.append(dirEntry["name"]) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
532 | else: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
533 | type_ = self.tr("File") |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
534 | iconName = self.__iconProvider.fileIconName(dirEntry["name"]) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
535 | sizeStr = dataString(dirEntry["size"], QLocale.system()) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
536 | self.__filenameCache.append(dirEntry["name"]) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
537 | itm = QTreeWidgetItem( |
10633
dda7e43934dc
Corrected some code formatting and coding style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10630
diff
changeset
|
538 | self.listing, |
dda7e43934dc
Corrected some code formatting and coding style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10630
diff
changeset
|
539 | [dirEntry["name"], sizeStr, type_, dirEntry["mtime_str"]], |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
540 | ) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
541 | itm.setIcon(0, EricPixmapCache.getIcon(iconName)) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
542 | itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
543 | itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
544 | itm.setData(0, EricServerFileDialog.IsDirectoryRole, dirEntry["is_dir"]) |
10539 | 545 | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
546 | currentFilterIndex = self.filterCombo.currentIndex() |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
547 | filters = ( |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
548 | [] if currentFilterIndex == -1 else self.__filters[currentFilterIndex] |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
549 | ) |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
550 | self.__filterList(filters) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
551 | |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
552 | # 3. add the directory to the history |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
553 | self.__addToHistory(directory) |
10539 | 554 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
555 | except OSError as err: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
556 | EricMessageBox.critical( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
557 | self, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
558 | self.tr("Remote Directory Listung"), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
559 | self.tr( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
560 | "<p>The directory <b>{0}</b> could not be listed due to an error" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
561 | " reported by the eric-ide server.</p><p>Reason: {1}</p>" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
562 | ).format(directory, str(err)), |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
563 | ) |
10539 | 564 | |
565 | # 4. update some dependent states | |
10630
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
566 | if basename: |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
567 | self.nameEdit.setText(basename) |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
568 | else: |
552a790fd9bc
Corrected some issues and improved some existing code with respect to eric-ide server use.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10610
diff
changeset
|
569 | self.nameEdit.clear() |
10539 | 570 | self.__updateUpButton() |
571 | ||
572 | @pyqtSlot(QPoint) | |
573 | def on_listing_customContextMenuRequested(self, pos): | |
574 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
575 | Private slot to show a context menu. |
10539 | 576 | |
577 | @param pos mouse pointer position to show the menu at | |
578 | @type QPoint | |
579 | """ | |
580 | self.__contextMenu.clear() | |
581 | ||
582 | itm = self.listing.itemAt(pos) | |
583 | if itm is not None: | |
584 | self.__contextMenu.addAction( | |
585 | self.tr("Rename"), lambda: self.__renameItem(itm) | |
586 | ) | |
587 | self.__contextMenu.addAction( | |
588 | self.tr("Delete"), lambda: self.__deleteItem(itm) | |
589 | ) | |
590 | self.__contextMenu.addSeparator() | |
591 | act = self.__contextMenu.addAction(self.tr("Show Hidden Files")) | |
592 | act.setCheckable(True) | |
593 | act.setChecked(self.__showHidden) | |
594 | act.toggled.connect(self.__showHiddenToggled) | |
595 | self.__contextMenu.addAction( | |
596 | self.tr("New Directory"), self.on_newDirButton_clicked | |
597 | ) | |
598 | ||
599 | self.__contextMenu.popup(self.listing.mapToGlobal(pos)) | |
600 | ||
601 | @pyqtSlot(QTreeWidgetItem) | |
602 | def __renameItem(self, item): | |
603 | """ | |
604 | Private slot to rename the given file/directory item. | |
605 | ||
606 | @param item reference to the item to be renamed | |
607 | @type QTreeWidgetItem | |
608 | """ | |
609 | title = ( | |
610 | self.tr("Rename Directory") | |
611 | if item.data(0, EricServerFileDialog.IsDirectoryRole) | |
612 | else self.tr("Rename File") | |
613 | ) | |
614 | ||
615 | newName, ok = QInputDialog.getText( | |
616 | self, | |
617 | title, | |
10785
82d8a5606135
Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10722
diff
changeset
|
618 | self.tr("<p>Enter the new name for <b>{0}</b>:</p>").format(item.text(0)), |
10539 | 619 | QLineEdit.EchoMode.Normal, |
620 | item.text(0), | |
621 | ) | |
622 | if ok and newName: | |
623 | if newName in self.__directoryCache or newName in self.__filenameCache: | |
624 | EricMessageBox.warning( | |
625 | self, | |
626 | title, | |
627 | self.tr( | |
628 | "<p>A file or directory with the name <b>{0}</b> exists" | |
629 | " already. Aborting...</p>" | |
630 | ).format(newName), | |
631 | ) | |
632 | return | |
633 | ||
634 | ok, error = self.__fsInterface.replace( | |
635 | self.__getFullPath(item.text(0)), self.__getFullPath(newName) | |
636 | ) | |
637 | if ok: | |
638 | # refresh | |
639 | self.__reload() | |
640 | else: | |
641 | EricMessageBox.critical( | |
642 | self, | |
643 | title, | |
644 | self.tr( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
645 | "<p>The renaming operation failed.</p><p>Reason: {0}</p>" |
10539 | 646 | ).format(error if error else self.tr("Unknown")), |
647 | ) | |
648 | ||
649 | @pyqtSlot(QTreeWidgetItem) | |
650 | def __deleteItem(self, item): | |
651 | """ | |
652 | Private slot to delete the given file/directory item. | |
653 | ||
654 | @param item reference to the item to be deleted | |
655 | @type QTreeWidgetItem | |
656 | """ | |
657 | isDir = item.data(0, EricServerFileDialog.IsDirectoryRole) | |
658 | if isDir: | |
659 | title = self.tr("Delete Directory") | |
10785
82d8a5606135
Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10722
diff
changeset
|
660 | question = self.tr("Shall the selected directory really be deleted?") |
10539 | 661 | else: |
662 | title = self.tr("Delete File") | |
10785
82d8a5606135
Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10722
diff
changeset
|
663 | question = self.tr("Shall the selected file really be deleted?") |
10539 | 664 | |
10785
82d8a5606135
Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10722
diff
changeset
|
665 | yes = EricMessageBox.yesNo(self, title, question) |
10539 | 666 | if yes: |
667 | ok, error = ( | |
668 | self.__fsInterface.rmdir(self.__getFullPath(item.text(0))) | |
669 | if isDir | |
670 | else self.__fsInterface.remove(self.__getFullPath(item.text(0))) | |
671 | ) | |
672 | if ok: | |
673 | # refresh | |
674 | self.__reload() | |
675 | else: | |
676 | EricMessageBox.critical( | |
677 | self, | |
678 | title, | |
679 | self.tr( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
680 | "<p>The deletion operation failed.</p><p>Reason: {0}</p>" |
10539 | 681 | ).format(error if error else self.tr("Unknown")), |
682 | ) | |
683 | ||
684 | @pyqtSlot(bool) | |
685 | def __showHiddenToggled(self, on): | |
686 | """ | |
687 | Private slot to handle toggling the display of hidden files/directories. | |
688 | ||
689 | @param on flag indicating to show hidden files and directories | |
690 | @type bool | |
691 | """ | |
692 | self.__showHidden = on | |
693 | filters = self.__filters[self.filterCombo.currentIndex()] | |
694 | self.__filterList(filters) | |
695 | ||
696 | def selectedFiles(self): | |
697 | """ | |
698 | Public method to get the selected files or the current viewport path. | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
699 | |
10539 | 700 | @return selected files or current viewport path |
701 | @rtype str | |
702 | """ | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
703 | if self.__fileMode == FileMode.Directory and not self.nameEdit.text(): |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
704 | return [self.treeCombo.currentText()] |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
705 | else: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
706 | return [self.__getFullPath(n) for n in self.__getNames()] |
10539 | 707 | |
708 | def selectedNameFilter(self): | |
709 | """ | |
710 | Public method to get the selected name filter. | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
711 | |
10539 | 712 | @return selected name filter |
713 | @rtype str | |
714 | """ | |
715 | return self.filterCombo.currentText() | |
716 | ||
717 | def __isHidden(self, name): | |
718 | """ | |
719 | Private method to check, if the given name is indicating a hidden file or | |
720 | directory. | |
721 | ||
722 | @param name name of the file or directory | |
723 | @type str | |
724 | @return flag indicating a hidden file or directory | |
725 | @rtype bool | |
726 | """ | |
727 | return name.startswith(".") or name.endswith("~") | |
728 | ||
729 | def __filterList(self, filters): | |
730 | """ | |
731 | Private method to filter the files and directories list based on the given | |
732 | filters and whether hidden files/directories should be shown. | |
733 | ||
734 | @param filters list of filter patterns (only applied to files | |
735 | @type list of str | |
736 | """ | |
737 | self.listing.clearSelection() | |
738 | for row in range(self.listing.topLevelItemCount()): | |
739 | itm = self.listing.topLevelItem(row) | |
740 | name = itm.text(0) | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
741 | if self.__dirsOnly and not itm.data( |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
742 | 0, EricServerFileDialog.IsDirectoryRole |
10539 | 743 | ): |
744 | itm.setHidden(True) | |
745 | elif not self.__showHidden and self.__isHidden(name): | |
746 | # applies to files and directories | |
747 | itm.setHidden(True) | |
748 | elif not itm.data(0, EricServerFileDialog.IsDirectoryRole): | |
749 | # it is a file item, apply the filter | |
750 | itm.setHidden(not any(fnmatch.fnmatch(name, pat) for pat in filters)) | |
751 | else: | |
752 | itm.setHidden(False) | |
753 | ||
754 | # resize the columns | |
755 | for column in range(4): | |
756 | self.listing.resizeColumnToContents(column) | |
757 | ||
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
758 | |
10539 | 759 | ########################################################################### |
760 | ## Module functions mimicing the interface of EricFileDialog/QFileDialog | |
761 | ########################################################################### | |
762 | ||
763 | ||
764 | def getOpenFileName( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
765 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
766 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
767 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
768 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
769 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
770 | withRemote=True, |
10539 | 771 | ): |
772 | """ | |
773 | Module function to get the name of a file for opening it. | |
774 | ||
775 | @param parent parent widget of the dialog (defaults to None) | |
776 | @type QWidget (optional) | |
777 | @param caption window title of the dialog (defaults to "") | |
778 | @type str (optional) | |
779 | @param directory working directory of the dialog (defaults to "") | |
780 | @type str (optional) | |
781 | @param filterStr filter string for the dialog (defaults to "") | |
782 | @type str (optional) | |
783 | @param initialFilter initial filter for the dialog (defaults to "") | |
784 | @type str (optional) | |
785 | @param withRemote flag indicating to create the file names with the remote | |
786 | indicator (defaults to True) | |
787 | @type bool (optional) | |
788 | @return name of file to be opened | |
789 | @rtype str | |
790 | """ | |
791 | return getOpenFileNameAndFilter( | |
792 | parent, caption, directory, filterStr, initialFilter, withRemote | |
793 | )[0] | |
794 | ||
795 | ||
796 | def getOpenFileNameAndFilter( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
797 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
798 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
799 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
800 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
801 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
802 | withRemote=True, |
10539 | 803 | ): |
804 | """ | |
805 | Module function to get the name of a file for opening it and the selected | |
806 | file name filter. | |
807 | ||
808 | @param parent parent widget of the dialog (defaults to None) | |
809 | @type QWidget (optional) | |
810 | @param caption window title of the dialog (defaults to "") | |
811 | @type str (optional) | |
812 | @param directory working directory of the dialog (defaults to "") | |
813 | @type str (optional) | |
814 | @param filterStr filter string for the dialog (defaults to "") | |
815 | @type str (optional) | |
816 | @param initialFilter initial filter for the dialog (defaults to "") | |
817 | @type str (optional) | |
818 | @param withRemote flag indicating to create the file names with the remote | |
819 | indicator (defaults to True) | |
820 | @type bool (optional) | |
821 | @return tuple containing the list of file names to be opened and the | |
822 | selected file name filter | |
823 | @rtype tuple of (list of str, str) | |
824 | """ | |
825 | dlg = EricServerFileDialog( | |
826 | parent=parent, caption=caption, directory=directory, filter=filterStr | |
827 | ) | |
828 | dlg.setFileMode(FileMode.ExistingFile) | |
829 | dlg.setNameFilter(initialFilter) | |
830 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
831 | if withRemote: | |
832 | fileName = FileSystemUtilities.remoteFileName(dlg.selectedFiles()[0]) | |
833 | else: | |
834 | fileName = dlg.selectedFiles()[0] | |
835 | selectedFilter = dlg.selectedNameFilter() | |
836 | else: | |
837 | fileName = "" | |
838 | selectedFilter = "" | |
839 | ||
840 | return fileName, selectedFilter | |
841 | ||
842 | ||
843 | def getOpenFileNames( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
844 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
845 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
846 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
847 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
848 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
849 | withRemote=True, |
10539 | 850 | ): |
851 | """ | |
852 | Module function to get a list of names of files for opening. | |
853 | ||
854 | @param parent parent widget of the dialog (defaults to None) | |
855 | @type QWidget (optional) | |
856 | @param caption window title of the dialog (defaults to "") | |
857 | @type str (optional) | |
858 | @param directory working directory of the dialog (defaults to "") | |
859 | @type str (optional) | |
860 | @param filterStr filter string for the dialog (defaults to "") | |
861 | @type str (optional) | |
862 | @param initialFilter initial filter for the dialog (defaults to "") | |
863 | @type str (optional) | |
864 | @param withRemote flag indicating to create the file names with the remote | |
865 | indicator (defaults to True) | |
866 | @type bool (optional) | |
867 | @return list of file names to be opened | |
868 | @rtype list of str | |
869 | """ | |
870 | return getOpenFileNamesAndFilter( | |
871 | parent, caption, directory, filterStr, initialFilter, withRemote | |
872 | )[0] | |
873 | ||
874 | ||
875 | def getOpenFileNamesAndFilter( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
876 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
877 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
878 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
879 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
880 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
881 | withRemote=True, |
10539 | 882 | ): |
883 | """ | |
884 | Module function to get a list of names of files for opening and the | |
885 | selected file name filter. | |
886 | ||
887 | @param parent parent widget of the dialog (defaults to None) | |
888 | @type QWidget (optional) | |
889 | @param caption window title of the dialog (defaults to "") | |
890 | @type str (optional) | |
891 | @param directory working directory of the dialog (defaults to "") | |
892 | @type str (optional) | |
893 | @param filterStr filter string for the dialog (defaults to "") | |
894 | @type str (optional) | |
895 | @param initialFilter initial filter for the dialog (defaults to "") | |
896 | @type str (optional) | |
897 | @param withRemote flag indicating to create the file names with the remote | |
898 | indicator (defaults to True) | |
899 | @type bool (optional) | |
900 | @return tuple containing the list of file names to be opened and the | |
901 | selected file name filter | |
902 | @rtype tuple of (list of str, str) | |
903 | """ | |
904 | dlg = EricServerFileDialog( | |
905 | parent=parent, caption=caption, directory=directory, filter=filterStr | |
906 | ) | |
907 | dlg.setFileMode(FileMode.ExistingFiles) | |
908 | dlg.setNameFilter(initialFilter) | |
909 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
910 | if withRemote: | |
911 | filesList = [ | |
912 | FileSystemUtilities.remoteFileName(f) for f in dlg.selectedFiles() | |
913 | ] | |
914 | else: | |
915 | filesList = dlg.selectedFiles() | |
916 | selectedFilter = dlg.selectedNameFilter() | |
917 | else: | |
918 | filesList = [] | |
919 | selectedFilter = "" | |
920 | ||
921 | return filesList, selectedFilter | |
922 | ||
923 | ||
924 | def getSaveFileName( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
925 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
926 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
927 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
928 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
929 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
930 | withRemote=True, |
10539 | 931 | ): |
932 | """ | |
933 | Module function to get the name of a file for saving. | |
934 | ||
935 | @param parent parent widget of the dialog (defaults to None) | |
936 | @type QWidget (optional) | |
937 | @param caption window title of the dialog (defaults to "") | |
938 | @type str (optional) | |
939 | @param directory working directory of the dialog (defaults to "") | |
940 | @type str (optional) | |
941 | @param filterStr filter string for the dialog (defaults to "") | |
942 | @type str (optional) | |
943 | @param initialFilter initial filter for the dialog (defaults to "") | |
944 | @type str (optional) | |
945 | @param withRemote flag indicating to create the file names with the remote | |
946 | indicator (defaults to True) | |
947 | @type bool (optional) | |
948 | @return name of file to be saved | |
949 | @rtype str | |
950 | """ | |
951 | return getSaveFileNameAndFilter( | |
952 | parent, caption, directory, filterStr, initialFilter, withRemote | |
953 | )[0] | |
954 | ||
955 | ||
956 | def getSaveFileNameAndFilter( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
957 | parent=None, |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
958 | caption="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
959 | directory="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
960 | filterStr="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
961 | initialFilter="", |
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
962 | withRemote=True, |
10539 | 963 | ): |
964 | """ | |
965 | Module function to get the name of a file for saving and the selected file name | |
966 | filter. | |
967 | ||
968 | @param parent parent widget of the dialog (defaults to None) | |
969 | @type QWidget (optional) | |
970 | @param caption window title of the dialog (defaults to "") | |
971 | @type str (optional) | |
972 | @param directory working directory of the dialog (defaults to "") | |
973 | @type str (optional) | |
974 | @param filterStr filter string for the dialog (defaults to "") | |
975 | @type str (optional) | |
976 | @param initialFilter initial filter for the dialog (defaults to "") | |
977 | @type str (optional) | |
978 | @param withRemote flag indicating to create the file names with the remote | |
979 | indicator (defaults to True) | |
980 | @type bool (optional) | |
981 | @return name of file to be saved and selected filte | |
982 | @rtype tuple of (str, str) | |
983 | """ | |
984 | dlg = EricServerFileDialog( | |
985 | parent=parent, caption=caption, directory=directory, filter=filterStr | |
986 | ) | |
987 | dlg.setFileMode(FileMode.AnyFile) | |
988 | dlg.setNameFilter(initialFilter) | |
989 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
990 | if withRemote: | |
991 | fileName = FileSystemUtilities.remoteFileName(dlg.selectedFiles()[0]) | |
992 | else: | |
993 | fileName = dlg.selectedFiles()[0] | |
994 | selectedFilter = dlg.selectedNameFilter() | |
995 | else: | |
996 | fileName = "" | |
997 | selectedFilter = "" | |
998 | ||
999 | return fileName, selectedFilter | |
1000 | ||
1001 | ||
1002 | def getExistingDirectory( | |
1003 | parent=None, caption="", directory="", dirsOnly=True, withRemote=True | |
1004 | ): | |
1005 | """ | |
1006 | Module function to get the name of a directory. | |
1007 | ||
1008 | @param parent parent widget of the dialog (defaults to None) | |
1009 | @type QWidget (optional) | |
1010 | @param caption window title of the dialog (defaults to "") | |
1011 | @type str (optional) | |
1012 | @param directory working directory of the dialog (defaults to "") | |
1013 | @type str (optional) | |
1014 | @param dirsOnly flag indicating to just show directories (defaults to True) | |
1015 | @type bool (optional) | |
1016 | @param withRemote flag indicating to create the file names with the remote | |
1017 | indicator (defaults to True) | |
1018 | @type bool (optional) | |
1019 | @return name of selected directory | |
1020 | @rtype str | |
1021 | """ | |
1022 | dlg = EricServerFileDialog(parent=parent, caption=caption, directory=directory) | |
1023 | dlg.setFileMode(FileMode.Directory) | |
1024 | dlg.setDirectoriesOnly(dirsOnly) | |
1025 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
1026 | if withRemote: | |
1027 | dirName = FileSystemUtilities.remoteFileName(dlg.selectedFiles()[0]) | |
1028 | else: | |
1029 | dirName = dlg.selectedFiles()[0] | |
1030 | else: | |
1031 | dirName = "" | |
1032 | ||
1033 | return dirName |