Source code for schrodinger.ui.qt.forcefield.pathselectorwidget
from schrodinger.ui.qt import filedialog
from schrodinger.ui.qt.recent_completer import BrowsePlaceholderRecentCombo
from schrodinger.Qt import QtCore
[docs]class PathSelectorWidget(BrowsePlaceholderRecentCombo):
    """
    This class provides widget to add locations with 'Browse...' as the last item.
    Clicking on it will allow user to add more directories from directory selector.
    Note: if user selects/adds some directory, it will be moved to top of list.
    
    :cvar newLocationSelected: signal indication that new path is added and selected.
    :vartype newLocationSelected: QtCore.pyqtSignal
    """
    newLocationSelected = QtCore.pyqtSignal(str)
[docs]    def __init__(self, parent, suggestion_limit):
        """
        :param suggestion_limit: It is count of maximum items that can be displayed in the widget.
        """
        super().__init__(parent, suggestion_limit=suggestion_limit)
        self.currentTextChanged.connect(self._onLocationItemChanged)
    def _onLocationItemChanged(self, current_item):
        """
        Function called when currentText is changed in widget
        """
        last_selected_item = self.getTopLocationItem()
        if not current_item or last_selected_item == current_item:
            return
        new_location_item = self._browseNewLocationItem(
        ) if current_item == self.model().BROWSE else current_item
        if not new_location_item:
            self.setCurrentText(last_selected_item)
        else:
            self.addAndSelectLocationItem(new_location_item)
    def _browseNewLocationItem(self):
        """
        Opens existing directory selector to allow user to select new directory.
        :rtype   : str
        :return  : new directory if user selected any, else returns last selected item.
        """
        return filedialog.get_existing_directory(
            parent=self,
            caption="Custom Parameters Location",
            dir=self.getTopLocationItem(),
            accept_label='Select')
[docs]    def addAndSelectLocationItem(self, location_item):
        """
         Adds location item to the list and selects it.
        :param location_item: name of item to be added.
        """
        self.addSuggestion(location_item)
        self.setCurrentText(location_item)
        self.newLocationSelected.emit(location_item)
[docs]    def getLocationItems(self):
        """
        Returns list of location items present in list.
        :rtype: list[str]
        :return: list of user added items.
        """
        return self.model().stringList()
[docs]    def getTopLocationItem(self):
        """
        Returns empty string if no item is present, top item in list otherwise.
        :rtype: str
        :return: Combobox first item.
        """
        item_list = self.getLocationItems()
        return item_list[0] if item_list else ''