1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing a dialog to enter data for a Pull operation.
8"""
9
10from PyQt5.QtCore import pyqtSlot
11from PyQt5.QtWidgets import QDialog, QDialogButtonBox
12
13from .Ui_GitPullDialog import Ui_GitPullDialog
14
15
16class GitPullDialog(QDialog, Ui_GitPullDialog):
17    """
18    Class implementing a dialog to enter data for a Pull operation.
19    """
20    def __init__(self, vcs, repodir, parent=None):
21        """
22        Constructor
23
24        @param vcs reference to the git object
25        @param repodir directory name of the local repository (string)
26        @param parent reference to the parent widget (QWidget)
27        """
28        super().__init__(parent)
29        self.setupUi(self)
30
31        self.__vcs = vcs
32        self.__repodir = repodir
33
34        self.__all = self.tr("<All>")
35        self.__custom = self.tr("<Custom>")
36
37        remoteUrlsList = self.__vcs.gitGetRemoteUrlsList(self.__repodir)
38        self.__repos = {name: url for name, url in remoteUrlsList}
39
40        self.__okButton = self.buttonBox.button(
41            QDialogButtonBox.StandardButton.Ok)
42
43        self.remotesComboBox.addItems(sorted(self.__repos.keys()))
44        self.remotesComboBox.addItem(self.__all)
45        self.remotesComboBox.addItem(self.__custom)
46
47        index = self.remotesComboBox.findText("origin")
48        if index == -1:
49            index = 0
50        self.remotesComboBox.setCurrentIndex(index)
51
52    def __okButtonEnable(self):
53        """
54        Private slot to set the enabled state of the OK button.
55        """
56        self.__okButton.setEnabled(
57            self.remoteBranchesList.count() > 0 or
58            self.remotesComboBox.currentText() == self.__all
59        )
60
61    def __updateButtonEnable(self):
62        """
63        Private slot to set the enabled state of the update button.
64        """
65        remote = self.remotesComboBox.currentText()
66        enable = remote != self.__all
67        if remote == self.__custom:
68            enable = self.remoteEdit.text() != ""
69
70        self.updateButton.setEnabled(enable)
71
72    @pyqtSlot(str)
73    def on_remotesComboBox_currentTextChanged(self, txt):
74        """
75        Private slot to handle changes of the selected repository.
76
77        @param txt current text of the combo box (string)
78        """
79        self.remoteEdit.setReadOnly(txt != self.__custom)
80        self.remoteBranchesList.setEnabled(txt != self.__all)
81        self.remoteEdit.clear()
82        self.remoteBranchesList.clear()
83        self.__updateButtonEnable()
84        self.__okButtonEnable()
85
86        if txt not in [self.__all, self.__custom]:
87            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
88                self.__repodir, txt)
89            self.remoteBranchesList.addItems(sorted(remoteBranches))
90
91            if txt in self.__repos:
92                self.remoteEdit.setText(self.__repos[txt])
93
94    @pyqtSlot(str)
95    def on_remoteEdit_textChanged(self, txt):
96        """
97        Private slot to handle changes of the URL edit.
98
99        @param txt current text of the URL edit (string)
100        """
101        self.__updateButtonEnable()
102
103        if (
104            self.remotesComboBox.currentText() == self.__custom and
105            txt != ""
106        ):
107            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
108                self.__repodir, txt)
109            self.remoteBranchesList.clear()
110            self.remoteBranchesList.addItems(sorted(remoteBranches))
111
112        self.__okButtonEnable()
113
114    @pyqtSlot()
115    def on_updateButton_clicked(self):
116        """
117        Private slot to update the list of remote branches.
118        """
119        remote = self.remotesComboBox.currentText()
120        if remote == self.__all:
121            # shouldn't happen
122            return
123
124        if remote == self.__custom:
125            remote = self.remoteEdit.text()
126            if remote == "":
127                # shouldn't happen either
128                return
129
130        remoteBranches = self.__vcs.gitGetRemoteBranchesList(
131            self.__repodir, remote)
132        self.remoteBranchesList.clear()
133        self.remoteBranchesList.addItems(sorted(remoteBranches))
134
135        self.__okButtonEnable()
136
137    def getData(self):
138        """
139        Public method to get the entered data.
140
141        @return tuple of remote name, remote url (for custom remotes),
142            remote branches, a flag indicating to pull from all repositories
143            and a flag indicating to remove obsolete tracking references
144            (string, string, list of strings, boolean, boolean)
145        """
146        remote = ""
147        url = ""
148        branches = []
149        allRepos = False
150
151        remoteRepo = self.remotesComboBox.currentText()
152        if remoteRepo == self.__all:
153            allRepos = True
154        else:
155            if remoteRepo == self.__custom:
156                url = self.remoteEdit.text()
157            else:
158                remote = remoteRepo
159            for itm in self.remoteBranchesList.selectedItems():
160                branches.append(itm.text())
161
162        return remote, url, branches, allRepos, self.pruneCheckBox.isChecked()
163