Fri, 08 Mar 2024 16:08:43 +0100
Corrected some code formatting and coding style issues.
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 | ||
118 | self.setNameFilters(filter.split(";;")) | |
119 | ||
120 | self.reloadButton.clicked.connect(self.__reload) | |
121 | self.cancelButton.clicked.connect(self.reject) | |
122 | ||
123 | self.treeCombo.currentTextChanged.connect(self.setDirectory) | |
124 | ||
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
|
125 | self.setDirectory(directory) |
10539 | 126 | |
127 | def acceptMode(self): | |
128 | """ | |
129 | Public method to get the accept mode of the dialog. | |
130 | ||
131 | @return accept mode | |
132 | @rtype AcceptMode | |
133 | """ | |
134 | return self.__acceptMode | |
135 | ||
136 | def setAcceptMode(self, mode): | |
137 | """ | |
138 | Public method to set the accept mode of the dialog. | |
139 | ||
140 | @param mode accept mode | |
141 | @type AcceptMode | |
142 | """ | |
143 | self.__acceptMode = mode | |
144 | ||
145 | self.__updateOkButton() | |
146 | ||
147 | def fileMode(self): | |
148 | """ | |
149 | Public method to get the current file mode of the dialog. | |
150 | ||
151 | @return file mode | |
152 | @rtype FileMode | |
153 | """ | |
154 | return self.__fileMode | |
155 | ||
156 | def setFileMode(self, mode): | |
157 | """ | |
158 | Public method to set the file mode of the dialog. | |
159 | ||
160 | @param mode file mode | |
161 | @type FileMode | |
162 | """ | |
163 | self.__fileMode = mode | |
164 | ||
165 | self.listing.clearSelection() | |
166 | if mode == FileMode.ExistingFiles: | |
167 | self.listing.setSelectionMode( | |
168 | QAbstractItemView.SelectionMode.ExtendedSelection | |
169 | ) | |
170 | else: | |
171 | self.listing.setSelectionMode( | |
172 | QAbstractItemView.SelectionMode.SingleSelection | |
173 | ) | |
174 | ||
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
175 | 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
|
176 | 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
|
177 | |
10539 | 178 | self.__updateOkButton() |
179 | ||
180 | def setNameFilters(self, filters): | |
181 | """ | |
182 | Public method to set the list of file/directory name filters. | |
183 | ||
184 | @param filters list of filter expressions | |
185 | ("filter_name (pattern1 ... patternN)") | |
186 | @type list of str | |
187 | """ | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
188 | 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
|
189 | 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
|
190 | 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
|
191 | 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
|
192 | 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
|
193 | self.__filters.append(f) |
10539 | 194 | |
195 | 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
|
196 | self.filterCombo.addItems([f for f in filters if f]) |
10539 | 197 | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
198 | def setNameFilter(self, filter): # noqa: M132 |
10539 | 199 | """ |
200 | Public method to set the current name filter. | |
201 | ||
202 | @param filter filter text to make current | |
203 | @type str | |
204 | """ | |
205 | self.filterCombo.setCurrentText(filter) | |
206 | ||
207 | def setDirectoriesOnly(self, dirsOnly): | |
208 | """ | |
209 | Public method to set a flag to just show directories. | |
210 | ||
211 | @param dirsOnly flag indicating to just show directories | |
212 | @type bool | |
213 | """ | |
214 | self.__dirsOnly = dirsOnly | |
215 | ||
216 | filters = self.__filters[self.filterCombo.currentIndex()] | |
217 | self.__filterList(filters) | |
218 | ||
219 | def __addToHistory(self, entry): | |
220 | """ | |
221 | Private method to add a directory to the history list. | |
222 | ||
223 | @param entry name of the directory to be added | |
224 | @type str | |
225 | """ | |
226 | try: | |
227 | # is in the history already? | |
228 | index = self.__history.index(entry) | |
229 | self.__currentHistoryIndex = index | |
230 | except ValueError: | |
231 | # new entry | |
232 | self.__history.append(entry) | |
233 | self.__currentHistoryIndex = len(self.__history) - 1 | |
234 | ||
235 | self.__updateHistoryButtons() | |
236 | ||
237 | @pyqtSlot() | |
238 | def __updateHistoryButtons(self): | |
239 | """ | |
240 | Private method to update the enabled state of the back and forward buttons. | |
241 | """ | |
242 | if not self.__history: | |
243 | self.backButton.setEnabled(False) | |
244 | self.forwardButton.setEnabled(False) | |
245 | else: | |
246 | self.backButton.setEnabled(self.__currentHistoryIndex > 0) | |
247 | self.forwardButton.setEnabled( | |
248 | self.__currentHistoryIndex < len(self.__history) - 1 | |
249 | ) | |
250 | ||
251 | @pyqtSlot() | |
252 | def on_backButton_clicked(self): | |
253 | """ | |
254 | Private slot to move back in history of visited directories. | |
255 | """ | |
256 | self.setDirectory(self.__history[self.__currentHistoryIndex - 1]) | |
257 | ||
258 | @pyqtSlot() | |
259 | def on_forwardButton_clicked(self): | |
260 | """ | |
261 | Private slot to move forward in history of visited directories. | |
262 | """ | |
263 | self.setDirectory(self.__history[self.__currentHistoryIndex + 1]) | |
264 | ||
265 | @pyqtSlot() | |
266 | def __updateUpButton(self): | |
267 | """ | |
268 | Private slot to update the enabled state of the 'Up' button. | |
269 | """ | |
270 | self.upButton.setEnabled( | |
271 | self.treeCombo.currentIndex() < self.treeCombo.count() - 1 | |
272 | ) | |
273 | ||
274 | @pyqtSlot() | |
275 | def on_upButton_clicked(self): | |
276 | """ | |
277 | Private slot to move up one level in the hierarchy. | |
278 | """ | |
279 | self.treeCombo.setCurrentIndex(self.treeCombo.currentIndex() + 1) | |
280 | ||
281 | @pyqtSlot() | |
282 | def on_newDirButton_clicked(self): | |
283 | """ | |
284 | Private slot to create a new directory. | |
285 | """ | |
286 | newDir, ok = QInputDialog.getText( | |
287 | self, | |
288 | self.tr("New Directory"), | |
289 | self.tr("Enter the name for the new directory:"), | |
290 | QLineEdit.EchoMode.Normal, | |
291 | ) | |
292 | if ok and newDir: | |
293 | if newDir in self.__directoryCache or newDir in self.__filenameCache: | |
294 | EricMessageBox.warning( | |
295 | self, | |
296 | self.tr("New Directory"), | |
297 | self.tr( | |
298 | "<p>A file or directory with the name <b>{0}</b> exists" | |
299 | " already. Aborting...</p>" | |
300 | ).format(newDir), | |
301 | ) | |
302 | return | |
303 | ||
304 | ok, error = self.__fsInterface.mkdir(self.__getFullPath(newDir)) | |
305 | if ok: | |
306 | # refresh | |
307 | self.__reload() | |
308 | else: | |
309 | EricMessageBox.critical( | |
310 | self, | |
311 | self.tr("New Directory"), | |
312 | self.tr( | |
313 | "<p>The directory <b>{0}</b> could not be created.</p>" | |
314 | "<p>Reason: {1}</p>" | |
315 | ).format( | |
316 | self.__getFullPath(newDir), | |
317 | error if error else self.tr("Unknown"), | |
318 | ), | |
319 | ) | |
320 | ||
321 | @pyqtSlot() | |
322 | def __reload(self): | |
323 | """ | |
324 | Private slot to reload the directory listing. | |
325 | """ | |
326 | self.setDirectory(self.treeCombo.currentText()) | |
327 | ||
328 | @pyqtSlot(QTreeWidgetItem, int) | |
329 | def on_listing_itemActivated(self, item, column): | |
330 | """ | |
331 | Private slot to handle the activation of an item in the list. | |
332 | ||
333 | @param item reference to the activated item | |
334 | @type QTreeWidgetItem | |
335 | @param column column number (unused) | |
336 | @type int | |
337 | """ | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
338 | if item.data(0, EricServerFileDialog.IsDirectoryRole): |
10539 | 339 | self.setDirectory(self.__getFullPath(item.text(0))) |
340 | else: | |
341 | self.accept() | |
342 | ||
343 | @pyqtSlot() | |
344 | def on_listing_itemSelectionChanged(self): | |
345 | """ | |
346 | Private slot to handle the selection of listed items. | |
347 | """ | |
348 | for itm in self.listing.selectedItems(): | |
349 | if itm.data(0, EricServerFileDialog.IsDirectoryRole): | |
350 | self.__selectedDirectory = itm.text(0) | |
351 | break | |
352 | else: | |
353 | self.__selectedDirectory = None | |
354 | ||
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
|
355 | 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
|
356 | 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
|
357 | for itm in selectedItems: |
10539 | 358 | isDir = itm.data(0, EricServerFileDialog.IsDirectoryRole) |
359 | 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
|
360 | selectedNames.append(itm.text(0)) |
10539 | 361 | 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
|
362 | selectedNames.append(itm.text(0)) |
10539 | 363 | |
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
|
364 | 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
|
365 | 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
|
366 | 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
|
367 | 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
|
368 | 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
|
369 | self.nameEdit.blockSignals(blocked) |
10539 | 370 | |
371 | self.__updateOkButton() | |
372 | ||
373 | @pyqtSlot() | |
374 | def __nameCompleterActivated(self): | |
375 | """ | |
376 | Private slot handling the activation of the completer. | |
377 | """ | |
378 | if self.okButton.isEnabled(): | |
379 | self.okButton.animateClick() | |
380 | ||
381 | @pyqtSlot(str) | |
382 | def on_nameEdit_textChanged(self, name): | |
383 | """ | |
384 | Private slot handling the editing of a file or directory name. | |
385 | ||
386 | @param name current text of the name edit | |
387 | @type str | |
388 | """ | |
389 | self.listing.clearSelection() | |
390 | items = self.listing.findItems(name, Qt.MatchFlag.MatchExactly) | |
391 | for itm in items: | |
392 | itm.setSelected(True) | |
393 | ||
394 | self.__updateOkButton() | |
395 | ||
396 | def __getNames(self): | |
397 | """ | |
398 | Private method to get the selected names list. | |
399 | ||
400 | @return list containing the selected names | |
401 | @rtype list of str | |
402 | """ | |
403 | namesStr = self.nameEdit.text() | |
404 | if namesStr.startswith('"'): | |
405 | namesStr = namesStr[1:] | |
406 | if namesStr.endswith('"'): | |
407 | namesStr = namesStr[:-1] | |
408 | names = re.split(r'"\s+"', namesStr) | |
409 | return names | |
410 | ||
411 | def __getFullPath(self, name): | |
412 | """ | |
413 | Private method to get the full path for a given file or directory name. | |
414 | ||
415 | @param name name of the file or directory | |
416 | @type str | |
417 | @return full path of the file or directory | |
418 | @rtype str | |
419 | """ | |
420 | return "{0}{1}{2}".format(self.treeCombo.currentText(), self.__sep, name) | |
421 | ||
422 | @pyqtSlot() | |
423 | def __updateOkButton(self): | |
424 | """ | |
425 | Private slot to set the 'OK' button state, icon and label. | |
426 | """ | |
427 | # 1. adjust icon and label | |
428 | if ( | |
429 | self.__acceptMode == AcceptMode.AcceptOpen | |
430 | or self.__selectedDirectory is not None | |
431 | ): | |
432 | 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
|
433 | 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
|
434 | 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
|
435 | else: |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
436 | self.okButton.setText(self.tr("Choose")) |
10539 | 437 | else: |
438 | self.okButton.setIcon(EricPixmapCache.getIcon("fileSave")) | |
439 | self.okButton.setText(self.tr("Save")) | |
440 | ||
441 | # 2. adjust enabled state | |
442 | if self.__selectedDirectory and self.__fileMode != FileMode.Directory: | |
443 | self.okButton.setEnabled(True) | |
444 | elif self.__fileMode == FileMode.AnyFile: | |
445 | self.okButton.setEnabled(bool(self.nameEdit.text())) | |
446 | elif self.__fileMode == FileMode.ExistingFile: | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
447 | self.okButton.setEnabled(self.nameEdit.text() in self.__filenameCache) |
10539 | 448 | elif self.__fileMode == FileMode.ExistingFiles: |
449 | names = self.__getNames() | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
450 | self.okButton.setEnabled(all(n in self.__filenameCache for n in names)) |
10539 | 451 | 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
|
452 | self.okButton.setEnabled(True) |
10539 | 453 | else: |
454 | self.okButton.setEnabled(False) | |
455 | ||
456 | @pyqtSlot() | |
457 | def on_okButton_clicked(self): | |
458 | """ | |
459 | Private slot handling the press of the OK button. | |
460 | """ | |
461 | if self.__selectedDirectory and self.__fileMode != FileMode.Directory: | |
462 | self.setDirectory(self.__getFullPath(self.__selectedDirectory)) | |
463 | else: | |
464 | self.accept() | |
465 | ||
466 | @pyqtSlot(int) | |
467 | def on_filterCombo_currentIndexChanged(self, index): | |
468 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
469 | Private slot handling the selection of a new file filter.. |
10539 | 470 | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
471 | @param index index of the selected entry |
10539 | 472 | @type int |
473 | """ | |
474 | filters = self.__filters[index] | |
475 | self.__filterList(filters) | |
476 | ||
477 | @pyqtSlot(str) | |
478 | def setDirectory(self, directory): | |
479 | """ | |
480 | Public slot to set the current directory and populate the tree list. | |
481 | ||
482 | @param directory directory to be set as current. An empty directory sets the | |
483 | server's current directory. | |
484 | @type str | |
485 | """ | |
486 | self.__filenameCache.clear() | |
487 | self.__directoryCache.clear() | |
488 | ||
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
|
489 | 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
|
490 | 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
|
491 | 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
|
492 | 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
|
493 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
494 | try: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
495 | directory, sep, dirListing = self.__fsInterface.listdir(directory) |
10539 | 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 | self.__sep = sep |
10539 | 498 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
499 | # 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
|
500 | 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
|
501 | 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
|
502 | 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
|
503 | 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
|
504 | 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
|
505 | # 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
|
506 | directory = directory[2:] |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
507 | directoryParts = directory.split(sep) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
508 | while directoryParts: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
509 | if directoryParts[-1]: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
510 | self.treeCombo.addItem(sep.join(directoryParts)) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
511 | directoryParts.pop() |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
512 | self.treeCombo.addItem(sep) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
513 | self.treeCombo.blockSignals(False) |
10539 | 514 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
515 | # 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
|
516 | 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
|
517 | 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
|
518 | dirListing, |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
519 | key=lambda d: ( |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
520 | " " + 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
|
521 | ), |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
522 | ): |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
523 | 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
|
524 | 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
|
525 | iconName = "dirClosed" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
526 | sizeStr = "" |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
527 | 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
|
528 | else: |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
529 | 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
|
530 | 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
|
531 | 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
|
532 | 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
|
533 | itm = QTreeWidgetItem( |
10633
dda7e43934dc
Corrected some code formatting and coding style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10630
diff
changeset
|
534 | self.listing, |
dda7e43934dc
Corrected some code formatting and coding style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10630
diff
changeset
|
535 | [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
|
536 | ) |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
537 | 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
|
538 | 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
|
539 | 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
|
540 | itm.setData(0, EricServerFileDialog.IsDirectoryRole, dirEntry["is_dir"]) |
10539 | 541 | |
10590
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
542 | 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
|
543 | filters = ( |
e7fe32611a80
Corrected the remote file dialog with respect to selection of a directory.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10561
diff
changeset
|
544 | [] 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
|
545 | ) |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
546 | 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
|
547 | |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
548 | # 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
|
549 | self.__addToHistory(directory) |
10539 | 550 | |
10548
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
551 | 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
|
552 | EricMessageBox.critical( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
553 | self, |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
554 | 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
|
555 | self.tr( |
d3e21f44887b
Improved the 'listdir()' remote server method in order to report issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10539
diff
changeset
|
556 | "<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
|
557 | " 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
|
558 | ).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
|
559 | ) |
10539 | 560 | |
561 | # 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
|
562 | 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
|
563 | 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
|
564 | 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
|
565 | self.nameEdit.clear() |
10539 | 566 | self.__updateUpButton() |
567 | ||
568 | @pyqtSlot(QPoint) | |
569 | def on_listing_customContextMenuRequested(self, pos): | |
570 | """ | |
10561
be23a662d709
Implemented (most) of the eric-ide server debugging functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10548
diff
changeset
|
571 | Private slot to show a context menu. |
10539 | 572 | |
573 | @param pos mouse pointer position to show the menu at | |
574 | @type QPoint | |
575 | """ | |
576 | self.__contextMenu.clear() | |
577 | ||
578 | itm = self.listing.itemAt(pos) | |
579 | if itm is not None: | |
580 | self.__contextMenu.addAction( | |
581 | self.tr("Rename"), lambda: self.__renameItem(itm) | |
582 | ) | |
583 | self.__contextMenu.addAction( | |
584 | self.tr("Delete"), lambda: self.__deleteItem(itm) | |
585 | ) | |
586 | self.__contextMenu.addSeparator() | |
587 | act = self.__contextMenu.addAction(self.tr("Show Hidden Files")) | |
588 | act.setCheckable(True) | |
589 | act.setChecked(self.__showHidden) | |
590 | act.toggled.connect(self.__showHiddenToggled) | |
591 | self.__contextMenu.addAction( | |
592 | self.tr("New Directory"), self.on_newDirButton_clicked | |
593 | ) | |
594 | ||
595 | self.__contextMenu.popup(self.listing.mapToGlobal(pos)) | |
596 | ||
597 | @pyqtSlot(QTreeWidgetItem) | |
598 | def __renameItem(self, item): | |
599 | """ | |
600 | Private slot to rename the given file/directory item. | |
601 | ||
602 | @param item reference to the item to be renamed | |
603 | @type QTreeWidgetItem | |
604 | """ | |
605 | title = ( | |
606 | self.tr("Rename Directory") | |
607 | if item.data(0, EricServerFileDialog.IsDirectoryRole) | |
608 | else self.tr("Rename File") | |
609 | ) | |
610 | ||
611 | newName, ok = QInputDialog.getText( | |
612 | self, | |
613 | title, | |
614 | self.tr("<p>Enter the new name <b>{0}</b>:</p>").format(item.text(0)), | |
615 | QLineEdit.EchoMode.Normal, | |
616 | item.text(0), | |
617 | ) | |
618 | if ok and newName: | |
619 | if newName in self.__directoryCache or newName in self.__filenameCache: | |
620 | EricMessageBox.warning( | |
621 | self, | |
622 | title, | |
623 | self.tr( | |
624 | "<p>A file or directory with the name <b>{0}</b> exists" | |
625 | " already. Aborting...</p>" | |
626 | ).format(newName), | |
627 | ) | |
628 | return | |
629 | ||
630 | ok, error = self.__fsInterface.replace( | |
631 | self.__getFullPath(item.text(0)), self.__getFullPath(newName) | |
632 | ) | |
633 | if ok: | |
634 | # refresh | |
635 | self.__reload() | |
636 | else: | |
637 | EricMessageBox.critical( | |
638 | self, | |
639 | title, | |
640 | self.tr( | |
10597
fbe93720ee9f
Corrected a few formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10590
diff
changeset
|
641 | "<p>The renaming operation failed.</p><p>Reason: {0}</p>" |
10539 | 642 | ).format(error if error else self.tr("Unknown")), |
643 | ) | |
644 | ||
645 | @pyqtSlot(QTreeWidgetItem) | |
646 | def __deleteItem(self, item): | |
647 | """ | |
648 | Private slot to delete the given file/directory item. | |
649 | ||
650 | @param item reference to the item to be deleted | |
651 | @type QTreeWidgetItem | |
652 | """ | |
653 | isDir = item.data(0, EricServerFileDialog.IsDirectoryRole) | |
654 | if isDir: | |
655 | title = self.tr("Delete Directory") | |
656 | itemType = self.tr("directory") | |
657 | else: | |
658 | title = self.tr("Delete File") | |
659 | itemType = self.tr("file") | |
660 | ||
661 | yes = EricMessageBox.yesNo( | |
662 | self, | |
663 | title, | |
664 | self.tr("Shall the selected {0} really be deleted?").format(itemType), | |
665 | ) | |
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 |