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