E5Gui/E5PathPicker.py

changeset 4578
5d611151cdec
parent 4576
a258569d44db
child 4581
76999ca7bbf1
diff -r e79a139aacc4 -r 5d611151cdec E5Gui/E5PathPicker.py
--- a/E5Gui/E5PathPicker.py	Fri Nov 27 20:06:52 2015 +0100
+++ b/E5Gui/E5PathPicker.py	Fri Nov 27 20:07:22 2015 +0100
@@ -22,6 +22,7 @@
 from . import E5FileDialog
 from .E5LineEdit import E5ClearableLineEdit
 from .E5Completers import E5FileCompleter, E5DirCompleter
+from .E5ComboBox import E5ClearableComboBox
 
 import UI.PixmapCache
 import Utilities
@@ -328,6 +329,349 @@
                 directory,
                 E5FileDialog.Options(E5FileDialog.ShowDirsOnly))
             path = Utilities.toNativeSeparators(path)
+            while path.endswith(os.sep):
+                path = path[:-1]
         
         if path:
             self.__editor.setText(path)
+
+
+class E5ComboPathPicker(QWidget):
+    """
+    Class implementing a path picker widget consisting of a combobox and a
+    tool button to open a file dialog.
+    
+    @signal editTextChanged(path) emitted when the entered path has changed
+    """
+    DefaultMode = E5PathPickerModes.OpenFileMode
+    
+    editTextChanged = pyqtSignal(str)
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super(E5ComboPathPicker, self).__init__(parent)
+        
+        self.__mode = E5PathPicker.DefaultMode
+        self.__editorEnabled = True
+        
+        self.__completer = None
+        self.__filters = ""
+        self.__defaultDirectory = ""
+        self.__windowTitle = ""
+        
+        self.__layout = QHBoxLayout()
+        self.__layout.setSpacing(0)
+        self.__layout.setContentsMargins(0, 0, 0, 0)
+        self.setLayout(self.__layout)
+        
+        self.__editor = E5ClearableComboBox(self, self.tr("Enter Path Name"))
+        
+        self.__button = QToolButton(self)
+        self.__button.setToolButtonStyle(Qt.ToolButtonIconOnly)
+        self.__button.setIcon(UI.PixmapCache.getIcon("open.png"))
+        
+        self.__layout.addWidget(self.__editor)
+        self.__layout.addWidget(self.__button)
+        
+        self.__button.clicked.connect(self.__showPathPickerDialog)
+        self.__editor.editTextChanged.connect(self.editTextChanged)
+    
+    def setMode(self, mode):
+        """
+        Public method to set the path picker mode.
+        
+        @param mode picker mode
+        @type E5PathPickerModes
+        """
+        assert mode in E5PathPickerModes
+        
+        oldMode = self.__mode
+        self.__mode = mode
+        
+        if mode != oldMode:
+            # Remove current completer
+            self.__editor.setCompleter(None)
+            self.__completer = None
+            
+            # Set a new completer
+            if mode == E5PathPickerModes.DiretoryMode:
+                self.__completer = E5DirCompleter(self.__editor)
+            else:
+                self.__completer = E5FileCompleter(self.__editor)
+    
+    def mode(self):
+        """
+        Public method to get the path picker mode.
+        
+        @return path picker mode
+        @rtype E5PathPickerModes
+        """
+        return self.__mode
+    
+    def clear(self):
+        """
+        Public method to clear the list of paths.
+        """
+        self.__editor.clear()
+    
+    def clearEditText(self):
+        """
+        Public method to clear the current path.
+        """
+        self.__editor.clearEditText()
+    
+    def setEditText(self, path):
+        """
+        Public method to set the current path.
+        
+        @param path path to be set
+        @type str
+        """
+        if self.__mode == E5PathPickerModes.OpenFilesMode:
+            self.__editor.setEditText(path)
+        else:
+            self.__editor.setEditText(Utilities.toNativeSeparators(path))
+    
+    def currentText(self):
+        """
+        Public method to get the current path.
+        
+        @return current path
+        @rtype str
+        """
+        if self.__mode == E5PathPickerModes.OpenFilesMode:
+            return self.__editor.currentText()
+        else:
+            return os.path.expanduser(
+                Utilities.toNativeSeparators(self.__editor.currentText()))
+    
+    def setPath(self, path):
+        """
+        Public method to set the current path.
+        
+        @param path path to be set
+        @type str
+        """
+        self.setEditText(path)
+    
+    def path(self):
+        """
+        Public method to get the current path.
+        
+        @return current path
+        @rtype str
+        """
+        return self.currentText()
+    
+    def addItems(self, pathsList):
+        """
+        Public method to add paths to the current list.
+        
+        @param pathsList list of paths to add
+        @type list of str
+        """
+        self.__editor.addItems(pathsList)
+    
+    def addItem(self, path):
+        """
+        Public method to add a paths to the current list.
+        
+        @param path path to add
+        @type str
+        """
+        self.__editor.addItem(path)
+    
+    def setPathsList(self, pathsList):
+        """
+        Public method to set the paths list.
+        
+        @param pathsList list of paths
+        @type list of str
+        """
+        self.clear()
+        self.addItems(pathsList)
+    
+    def setCurrentIndex(self, index):
+        """
+        Public slot to set the current index.
+        
+        @param index index of the item to set current
+        @type int
+        """
+        self.__editor.setCurrentIndex(index)
+    
+    def setEditorEnabled(self, enable):
+        """
+        Public method to set the path editor's enabled state.
+        
+        @param enable flag indicating the enable state
+        @type bool
+        """
+        if enable != self.__editorEnabled:
+            self.__editorEnabled = enable
+            self.__editor.setEnabled(enable)
+    
+    def editorEnabled(self):
+        """
+        Public method to get the path editor's enabled state.
+        
+        @return flag indicating the enabled state
+        @rtype bool
+        """
+        return self.__editorEnabled
+    
+    def setDefaultDirectory(self, directory):
+        """
+        Public method to set the default directory.
+        
+        @param directory default directory
+        @type str
+        """
+        self.__defaultDirectory = directory
+    
+    def defaultDirectory(self):
+        """
+        Public method to get the default directory.
+        
+        @return default directory
+        @rtype str
+        """
+        return self.__defaultDirectory
+    
+    def setWindowTitle(self, title):
+        """
+        Public method to set the path picker dialog window title.
+        
+        @param title window title
+        @type str
+        """
+        self.__windowTitle = title
+    
+    def windowTitle(self):
+        """
+        Public method to get the path picker dialog's window title.
+        
+        @return window title
+        @rtype str
+        """
+        return self.__windowTitle
+    
+    def setFilters(self, filters):
+        """
+        Public method to set the filters for the path picker dialog.
+        
+        Note: Multiple filters must be separated by ';;'.
+        
+        @param filters string containing the file filters
+        @type str
+        """
+        self.__filters = filters
+    
+    def filters(self):
+        """
+        Public methods to get the filter string.
+        
+        @return filter string
+        @rtype str
+        """
+        return self.__filters
+    
+    def setButtonToolTip(self, tooltip):
+        """
+        Public method to set the tool button tool tip.
+        
+        @param tooltip text to be set as a tool tip
+        @type str
+        """
+        self.__button.setToolTip(tooltip)
+    
+    def buttonToolTip(self):
+        """
+        Public method to get the tool button tool tip.
+        
+        @return tool tip text
+        @rtype str
+        """
+        return self.__button.toolTip()
+    
+    def setEditorToolTip(self, tooltip):
+        """
+        Public method to set the editor tool tip.
+        
+        @param tooltip text to be set as a tool tip
+        @type str
+        """
+        self.__editor.setToolTip(tooltip)
+    
+    def editorToolTip(self):
+        """
+        Public method to get the editor tool tip.
+        
+        @return tool tip text
+        @rtype str
+        """
+        return self.__editor.toolTip()
+    
+    def __showPathPickerDialog(self):
+        """
+        Private slot to show the path picker dialog.
+        """
+        windowTitle = self.__windowTitle
+        if not windowTitle:
+            if self.__mode == E5PathPickerModes.OpenFileMode:
+                windowTitle = self.tr("Choose a file to open")
+            elif self.__mode == E5PathPickerModes.OpenFilesMode:
+                windowTitle = self.tr("Choose files to open")
+            elif self.__mode == E5PathPickerModes.SaveFileMode:
+                windowTitle = self.tr("Choose a file to save")
+            elif self.__mode == E5PathPickerModes.DiretoryMode:
+                windowTitle = self.tr("Choose a directory")
+        
+        directory = self.__editor.currentText()
+        if self.__mode == E5PathPickerModes.OpenFilesMode:
+            directory = os.path.expanduser(
+                Utilities.fromNativeSeparators(directory.split(";")[0]))
+        else:
+            directory = os.path.expanduser(
+                Utilities.fromNativeSeparators(directory))
+        
+        if self.__mode == E5PathPickerModes.OpenFileMode:
+            path = E5FileDialog.getOpenFileName(
+                self,
+                windowTitle,
+                directory,
+                self.__filters)
+            path = Utilities.toNativeSeparators(path)
+        elif self.__mode == E5PathPickerModes.OpenFilesMode:
+            paths = E5FileDialog.getOpenFileNames(
+                self,
+                windowTitle,
+                directory,
+                self.__filters)
+            path = ";".join([Utilities.toNativeSeparators(path)
+                             for path in paths])
+        elif self.__mode == E5PathPickerModes.SaveFileMode:
+            path = E5FileDialog.getSaveFileName(
+                self,
+                windowTitle,
+                directory,
+                self.__filters,
+                E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
+            path = Utilities.toNativeSeparators(path)
+        elif self.__mode == E5PathPickerModes.DiretoryMode:
+            path = E5FileDialog.getExistingDirectory(
+                self,
+                windowTitle,
+                directory,
+                E5FileDialog.Options(E5FileDialog.ShowDirsOnly))
+            path = Utilities.toNativeSeparators(path)
+            while path.endswith(os.sep):
+                path = path[:-1]
+        
+        if path:
+            self.__editor.setEditText(path)

eric ide

mercurial