eric6/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.py

changeset 6942
2602857055c5
parent 6707
30f0ac20df50
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2017 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to enter the data to add a submodule.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import pyqtSlot, QUrl
13 from PyQt5.QtWidgets import QDialog, QDialogButtonBox
14
15 from E5Gui.E5Completers import E5DirCompleter
16 from E5Gui import E5FileDialog
17
18 from .Ui_GitSubmoduleAddDialog import Ui_GitSubmoduleAddDialog
19 from .Config import ConfigGitSchemes
20
21 import Utilities
22 import Preferences
23 import UI.PixmapCache
24
25
26 class GitSubmoduleAddDialog(QDialog, Ui_GitSubmoduleAddDialog):
27 """
28 Class implementing a dialog to enter the data to add a submodule.
29 """
30 def __init__(self, vcs, repodir, parent=None):
31 """
32 Constructor
33
34 @param vcs reference to the version control object
35 @type Git
36 @param repodir directory containing the superproject
37 @type str
38 @param parent reference to the parent widget
39 @type QWidget
40 """
41 super(GitSubmoduleAddDialog, self).__init__(parent)
42 self.setupUi(self)
43
44 self.__vcs = vcs
45 self.__repodir = repodir
46
47 self.submoduleDirButton.setIcon(UI.PixmapCache.getIcon("open.png"))
48 self.submoduleUrlButton.setIcon(UI.PixmapCache.getIcon("open.png"))
49 self.submoduleUrlClearHistoryButton.setIcon(
50 UI.PixmapCache.getIcon("editDelete.png"))
51
52 submoduleUrlHistory = self.__vcs.getPlugin().getPreferences(
53 "RepositoryUrlHistory")
54 self.submoduleUrlCombo.addItems(submoduleUrlHistory)
55 self.submoduleUrlCombo.setEditText("")
56
57 self.submoduleUrlDirCompleter = E5DirCompleter(self.submoduleUrlCombo)
58 self.submoduleDirCompleter = E5DirCompleter(self.submoduleDirEdit)
59
60 ipath = Preferences.getMultiProject("Workspace") or \
61 Utilities.getHomeDir()
62 self.__initPaths = [
63 Utilities.fromNativeSeparators(ipath),
64 Utilities.fromNativeSeparators(ipath) + "/",
65 ]
66
67 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
68
69 msh = self.minimumSizeHint()
70 self.resize(max(self.width(), msh.width()), msh.height())
71
72 @pyqtSlot(str)
73 def on_submoduleUrlCombo_editTextChanged(self, txt):
74 """
75 Private slot to handle changes of the submodule repository URL.
76
77 @param txt current text of the combo box
78 @type str
79 """
80 enable = False
81 vcsUrlEnable = False
82
83 if txt:
84 url = QUrl.fromUserInput(txt)
85 if url.isValid():
86 if url.scheme() in ConfigGitSchemes:
87 enable = True
88 vcsUrlEnable = url.scheme() == "file"
89 elif ':' in txt:
90 # assume scp like repository URL
91 enable = True
92 else:
93 vcsUrlEnable = True
94
95 self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable)
96 self.submoduleUrlButton.setEnabled(vcsUrlEnable)
97
98 @pyqtSlot()
99 def on_submoduleUrlButton_clicked(self):
100 """
101 Private slot to display a directory selection dialog.
102 """
103 directory = E5FileDialog.getExistingDirectory(
104 self,
105 self.tr("Select Submodule Repository Directory"),
106 self.submoduleUrlCombo.currentText(),
107 E5FileDialog.Options(E5FileDialog.ShowDirsOnly))
108
109 if directory:
110 self.submoduleUrlCombo.setEditText(
111 Utilities.toNativeSeparators(directory))
112
113 @pyqtSlot()
114 def on_submoduleUrlClearHistoryButton_clicked(self):
115 """
116 Private slot to clear the history of entered repository URLs.
117 """
118 currentUrl = self.submoduleUrlCombo.currentText()
119 self.submoduleUrlCombo.clear()
120 self.submoduleUrlCombo.setEditText(currentUrl)
121
122 self.__saveHistory()
123
124 @pyqtSlot()
125 def on_submoduleDirButton_clicked(self):
126 """
127 Private slot to display a directory selection dialog.
128 """
129 directory = E5FileDialog.getExistingDirectory(
130 self,
131 self.tr("Select Submodule Directory"),
132 self.submoduleDirEdit.text(),
133 E5FileDialog.Options(E5FileDialog.ShowDirsOnly))
134
135 if directory:
136 self.submoduleDirEdit.setText(
137 Utilities.toNativeSeparators(directory))
138
139 def getData(self):
140 """
141 Public method to get the entered data.
142
143 @return tuple containing the repository URL, optional branch name,
144 optional logical name, optional submodule path and a flag
145 indicating to enforce the operation
146 @rtype tuple of (str, str, str, str, bool)
147 """
148 self.__saveHistory()
149
150 path = self.submoduleDirEdit.text()
151 if path:
152 path = self.__getRelativePath(path)
153
154 return (
155 self.submoduleUrlCombo.currentText().replace("\\", "/"),
156 self.branchEdit.text(),
157 self.nameEdit.text(),
158 path,
159 self.forceCheckBox.isChecked(),
160 )
161
162 def __saveHistory(self):
163 """
164 Private method to save the repository URL history.
165 """
166 url = self.submoduleUrlCombo.currentText()
167 submoduleUrlHistory = []
168 for index in range(self.submoduleUrlCombo.count()):
169 submoduleUrlHistory.append(self.submoduleUrlCombo.itemText(index))
170 if url not in submoduleUrlHistory:
171 submoduleUrlHistory.insert(0, url)
172
173 # max. list sizes is hard coded to 20 entries
174 newSubmoduleUrlHistory = [url for url in submoduleUrlHistory if url]
175 if len(newSubmoduleUrlHistory) > 20:
176 newSubmoduleUrlHistory = newSubmoduleUrlHistory[:20]
177
178 self.__vcs.getPlugin().setPreferences(
179 "RepositoryUrlHistory", newSubmoduleUrlHistory)
180
181 def __getRelativePath(self, path):
182 """
183 Private method to convert a file path to a relative path.
184
185 @param path file or directory name to convert
186 @type str
187 @return relative path or unchanged path, if path doesn't
188 belong to the project
189 @rtype str
190 """
191 if path == self.__repodir:
192 return ""
193 elif Utilities.normcasepath(Utilities.toNativeSeparators(path))\
194 .startswith(Utilities.normcasepath(
195 Utilities.toNativeSeparators(self.__repodir + "/"))):
196 relpath = path[len(self.__repodir):]
197 if relpath.startswith(("/", "\\")):
198 relpath = relpath[1:]
199 return relpath
200 else:
201 return path

eric ide

mercurial