diff -r a081458cc57b -r 144a6b854f70 eric7/EricWidgets/EricFileSaveConfirmDialog.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/EricWidgets/EricFileSaveConfirmDialog.py Sat May 22 19:58:24 2021 +0200 @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to enter a file system path using a file picker. +""" + +import os + +from PyQt6.QtWidgets import ( + QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit +) + +from .EricPathPicker import EricPathPicker, EricPathPickerModes + + +class EricFileSaveConfirmDialog(QDialog): + """ + Class implementing a dialog to enter a file system path using a file + picker. + """ + def __init__(self, filename, title, message="", picker=True, parent=None): + """ + Constructor + + @param filename file name to be shown + @type str + @param title title for the dialog + @type str + @param message message to be shown + @type str + @param picker flag indicating to use a path picker + @type bool + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + + self.setMinimumWidth(400) + + self.__selectedAction = "cancel" + self.__filename = filename + + self.__layout = QVBoxLayout(self) + + self.__label = QLabel(self) + self.__label.setWordWrap(True) + if message: + self.__label.setText(message) + else: + self.__label.setText(self.tr("The given file exists already.")) + + if picker: + self.__pathPicker = EricPathPicker(self) + self.__pathPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE) + else: + self.__pathPicker = QLineEdit(self) + self.__pathPicker.setClearButtonEnabled(True) + + self.__buttonBox = QDialogButtonBox(self) + self.__cancelButton = self.__buttonBox.addButton( + QDialogButtonBox.StandardButton.Cancel) + self.__overwriteButton = self.__buttonBox.addButton( + self.tr("Overwrite"), QDialogButtonBox.ButtonRole.AcceptRole) + self.__renameButton = self.__buttonBox.addButton( + self.tr("Rename"), QDialogButtonBox.ButtonRole.AcceptRole) + + self.__layout.addWidget(self.__label) + self.__layout.addWidget(self.__pathPicker) + self.__layout.addWidget(self.__buttonBox) + + # set values and states + self.__pathPicker.setText(filename) + if picker: + self.__pathPicker.setDefaultDirectory(os.path.dirname(filename)) + self.__renameButton.setEnabled(False) + self.__cancelButton.setDefault(True) + + self.__buttonBox.clicked.connect(self.__buttonBoxClicked) + self.__pathPicker.textChanged.connect(self.__filenameChanged) + + def __buttonBoxClicked(self, button): + """ + Private slot to handle the user clicking a button. + + @param button reference to the clicked button + @type QAbstractButton + """ + if button == self.__cancelButton: + self.__selectedAction = "cancel" + self.reject() + elif button == self.__renameButton: + self.__selectedAction = "rename" + self.accept() + elif button == self.__overwriteButton: + self.__selectedAction = "overwrite" + self.accept() + + def __filenameChanged(self, text): + """ + Private slot to handle a change of the file name. + + @param text new file name + @type str + """ + self.__renameButton.setEnabled(text != self.__filename) + + def selectedAction(self): + """ + Public method to get the selected action and associated data. + + @return tuple containing the selected action (cancel, rename, + overwrite) and the filename (in case of 'rename' or 'overwrite') + @rtype tuple of (str, str) + """ + if self.__selectedAction == "rename": + filename = self.__pathPicker.text() + elif self.__selectedAction == "overwrite": + filename = self.__filename + else: + filename = "" + return self.__selectedAction, filename + + +def confirmOverwrite(filename, title, message="", picker=True, parent=None): + """ + Function to confirm that a file shall be overwritten. + + @param filename file name to be shown + @type str + @param title title for the dialog + @type str + @param message message to be shown + @type str + @param picker flag indicating to use a path picker + @type bool + @param parent reference to the parent widget + @type QWidget + @return tuple containing the selected action (cancel, rename, + overwrite) and the filename (in case of 'rename' or 'overwrite') + @rtype tuple of (str, str) + """ + dlg = EricFileSaveConfirmDialog(filename, title, message=message, + picker=picker, parent=parent) + dlg.exec() + return dlg.selectedAction()