src/eric7/Plugins/VcsPlugins/vcsGit/GitFetchDialog.py

Wed, 04 Oct 2023 17:50:59 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 04 Oct 2023 17:50:59 +0200
branch
eric7
changeset 10217
7888177e7463
parent 9971
773ad1f1ed22
child 10373
093dcebe5ecb
permissions
-rw-r--r--

Fixed in issue with several editable combo box selectors, that the value could not be changed if the edited text differed by case only. This was caused by the standard QComboBox completer.

# -*- coding: utf-8 -*-

# Copyright (c) 2015 - 2023 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to enter data for a Fetch operation.
"""

from PyQt6.QtCore import pyqtSlot
from PyQt6.QtWidgets import QDialog, QDialogButtonBox

from .Ui_GitFetchDialog import Ui_GitFetchDialog


class GitFetchDialog(QDialog, Ui_GitFetchDialog):
    """
    Class implementing a dialog to enter data for a Fetch operation.
    """

    def __init__(self, vcs, repodir, parent=None):
        """
        Constructor

        @param vcs reference to the git object
        @param repodir directory name of the local repository (string)
        @param parent reference to the parent widget (QWidget)
        """
        super().__init__(parent)
        self.setupUi(self)

        self.__vcs = vcs
        self.__repodir = repodir

        self.__all = self.tr("<All>")
        self.__custom = self.tr("<Custom>")

        remoteUrlsList = self.__vcs.gitGetRemoteUrlsList(self.__repodir)
        self.__repos = {name: url for name, url in remoteUrlsList}

        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)

        self.remotesComboBox.addItems(sorted(self.__repos.keys()))
        self.remotesComboBox.addItem(self.__all)
        self.remotesComboBox.addItem(self.__custom)

        index = self.remotesComboBox.findText("origin")
        if index == -1:
            index = 0
        self.remotesComboBox.setCurrentIndex(index)

        localBranches = self.__vcs.gitGetBranchesList(self.__repodir)
        self.localBranchComboBox.addItems([""] + sorted(localBranches))
        self.localBranchComboBox.setEnabled(False)

    def __okButtonEnable(self):
        """
        Private slot to set the enabled state of the OK button.
        """
        self.__okButton.setEnabled(
            self.remoteBranchesList.count() > 0
            or self.remotesComboBox.currentText() == self.__all
        )

    def __updateButtonEnable(self):
        """
        Private slot to set the enabled state of the update button.
        """
        remote = self.remotesComboBox.currentText()
        enable = remote != self.__all
        if remote == self.__custom:
            enable = self.remoteEdit.text() != ""

        self.updateButton.setEnabled(enable)

    @pyqtSlot(str)
    def on_remotesComboBox_currentTextChanged(self, txt):
        """
        Private slot to handle changes of the selected repository.

        @param txt current text of the combo box (string)
        """
        self.remoteEdit.setReadOnly(txt != self.__custom)
        self.remoteBranchesList.setEnabled(txt != self.__all)
        self.remoteEdit.clear()
        self.remoteBranchesList.clear()
        self.__updateButtonEnable()
        self.__okButtonEnable()

        if txt not in [self.__all, self.__custom]:
            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
            self.remoteBranchesList.addItems(sorted(remoteBranches))

            if txt in self.__repos:
                self.remoteEdit.setText(self.__repos[txt])

    @pyqtSlot(str)
    def on_remoteEdit_textChanged(self, txt):
        """
        Private slot to handle changes of the URL edit.

        @param txt current text of the URL edit (string)
        """
        self.__updateButtonEnable()

        if self.remotesComboBox.currentText() == self.__custom and txt != "":
            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
            self.remoteBranchesList.clear()
            self.remoteBranchesList.addItems(sorted(remoteBranches))

        self.__okButtonEnable()

    @pyqtSlot()
    def on_remoteBranchesList_itemSelectionChanged(self):
        """
        Private slot to handle a change of selected remote branches.
        """
        singleSelection = len(self.remoteBranchesList.selectedItems()) == 1
        self.localBranchComboBox.setEnabled(singleSelection)
        txt = (
            self.remoteBranchesList.selectedItems()[0].text() if singleSelection else ""
        )
        index = self.localBranchComboBox.findText(txt)
        if index == -1:
            self.localBranchComboBox.setEditText(txt)
        else:
            self.localBranchComboBox.setCurrentIndex(index)

    @pyqtSlot()
    def on_updateButton_clicked(self):
        """
        Private slot to update the list of remote branches.
        """
        remote = self.remotesComboBox.currentText()
        if remote == self.__all:
            # shouldn't happen
            return

        if remote == self.__custom:
            remote = self.remoteEdit.text()
            if remote == "":
                # shouldn't happen either
                return

        remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, remote)
        self.remoteBranchesList.clear()
        self.remoteBranchesList.addItems(sorted(remoteBranches))

        self.__okButtonEnable()

    def getData(self):
        """
        Public method to get the entered data.

        @return tuple of remote name, remote url (for custom remotes),
            remote branches, local branch, a flag indicating to fetch from
            all repositories, a flag indicating to remove obsolete tracking
            references and a flag indicating to fetch tags as well
            (string, string, list of strings, string, boolean, boolean,
             boolean)
        """
        remote = ""
        url = ""
        remoteBranches = []
        allRepos = False
        localBranch = ""

        remoteRepo = self.remotesComboBox.currentText()
        if remoteRepo == self.__all:
            allRepos = True
        else:
            if remoteRepo == self.__custom:
                url = self.remoteEdit.text()
            else:
                remote = remoteRepo
            for itm in self.remoteBranchesList.selectedItems():
                remoteBranches.append(itm.text())
            if len(remoteBranches) == 1:
                localBranch = self.localBranchComboBox.currentText()

        return (
            remote,
            url,
            remoteBranches,
            localBranch,
            allRepos,
            self.pruneCheckBox.isChecked(),
            self.tagsCheckBox.isChecked(),
        )

eric ide

mercurial