Mon, 20 Sep 2021 19:47:18 +0200
Continued implementing the VCS status widget for the left side.
--- a/eric7/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py Mon Sep 20 19:47:18 2021 +0200 @@ -51,6 +51,8 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul> @@ -107,6 +109,8 @@ else: status = flags[1] states[name] = status + elif flags == "??": + states[name] = "?" # step 2: collect the status to be reported back for name in states:
--- a/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py Mon Sep 20 19:47:18 2021 +0200 @@ -42,6 +42,8 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul> @@ -59,6 +61,8 @@ args = self.vcs.initCommand("status") args.append('--noninteractive') args.append('--all') + if self.vcs.hasSubrepositories(): + args.append("--subrepos") output, error = self.__client.runcommand(args) @@ -69,7 +73,7 @@ for line in output.splitlines(): if not line.startswith(" "): flag, name = line.split(" ", 1) - if flag in "AMR": + if flag in "AMR?!": if flag == "R": status = "O" else:
--- a/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py Mon Sep 20 19:47:18 2021 +0200 @@ -46,6 +46,8 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul> @@ -110,6 +112,16 @@ file.prop_status == pysvn.wc_status_kind.replaced ): status = "R" + elif ( + file.text_status == pysvn.wc_status_kind.unversioned or + file.prop_status == pysvn.wc_status_kind.unversioned + ): + status = "?" + elif ( + file.text_status == pysvn.wc_status_kind.missing or + file.prop_status == pysvn.wc_status_kind.missing + ): + status = "!" if status: states[file.path] = status try:
--- a/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py Mon Sep 20 19:47:18 2021 +0200 @@ -52,6 +52,8 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul> @@ -90,19 +92,22 @@ flags = match.group(1) path = match.group(5).strip() if ( - flags[0] in "ACDMR" or - (flags[0] == " " and flags[-1] == "*") + flags[0] in "ACDMR?!" or + (flags[0] == " " and flags[-1] == "*") or + flags[1] in "CM" ): if flags[-1] == "*": status = "U" else: status = flags[0] - if status == "C": + if status == "C" or flags[1] == "C": status = "Z" # give it highest priority elif status == "D": status = "O" if status == "U": self.shouldUpdate = True + if status == " " and flags[1] == "M": + status = "M" name = path states[name] = status try:
--- a/eric7/Project/Project.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/Project/Project.py Mon Sep 20 19:47:18 2021 +0200 @@ -103,10 +103,13 @@ @signal completeRepopulateItem(str) emitted after an item of the model was repopulated @signal vcsStatusMonitorData(list) emitted to signal the VCS status data + @signal vcsStatusMonitorAllData(dict) emitted to signal all VCS status + (key is project relative file name, value is status) @signal vcsStatusMonitorStatus(str, str) emitted to signal the status of the monitoring thread (ok, nok, op, off) and a status message @signal vcsStatusMonitorInfo(str) emitted to signal some info of the monitoring thread + @signal vcsCommitted() emitted to indicate a completed commit action @signal reinitVCS() emitted after the VCS has been reinitialized @signal showMenu(str, QMenu) emitted when a menu is about to be shown. The name of the menu and a reference to the menu are given. @@ -151,8 +154,10 @@ prepareRepopulateItem = pyqtSignal(str) completeRepopulateItem = pyqtSignal(str) vcsStatusMonitorData = pyqtSignal(list) + vcsStatusMonitorAllData = pyqtSignal(dict) vcsStatusMonitorStatus = pyqtSignal(str, str) vcsStatusMonitorInfo = pyqtSignal(str) + vcsCommitted = pyqtSignal() reinitVCS = pyqtSignal() showMenu = pyqtSignal(str, QMenu) lexerAssociationsChanged = pyqtSignal() @@ -2826,15 +2831,7 @@ # reinit VCS self.vcs = self.initVCS() # start the VCS monitor thread - if self.vcs is not None: - self.vcs.startStatusMonitor(self) - self.vcs.vcsStatusMonitorData.connect( - self.__model.changeVCSStates) - self.vcs.vcsStatusMonitorStatus.connect( - self.__statusMonitorStatus) - self.vcs.vcsStatusMonitorInfo.connect( - self.vcsStatusMonitorInfo) - self.vcs.vcsStatusChanged.connect(self.__vcsStatusChanged) + self.__vcsConnectStatusMonitor() self.reinitVCS.emit() if self.pudata["VCSSTATUSMONITORINTERVAL"]: @@ -3074,18 +3071,7 @@ self.__readSession(quiet=True) # start the VCS monitor thread - if self.vcs is not None: - self.vcs.startStatusMonitor(self) - self.vcs.vcsStatusMonitorData.connect( - self.__model.changeVCSStates) - self.vcs.vcsStatusMonitorData.connect( - self.vcsStatusMonitorData) - self.vcs.vcsStatusMonitorStatus.connect( - self.vcsStatusMonitorStatus) - self.vcs.vcsStatusMonitorInfo.connect( - self.vcsStatusMonitorInfo) - self.vcs.vcsStatusChanged.connect( - self.__vcsStatusChanged) + self.__vcsConnectStatusMonitor() def reopenProject(self): """ @@ -4925,6 +4911,27 @@ """ self.projectChanged.emit() + def __vcsConnectStatusMonitor(self): + """ + Private method to start the VCS monitor and connect its signals. + """ + if self.vcs is not None: + self.vcs.committed.connect(self.vcsCommitted) + + self.vcs.startStatusMonitor(self) + self.vcs.vcsStatusMonitorData.connect( + self.__model.changeVCSStates) + self.vcs.vcsStatusMonitorData.connect( + self.vcsStatusMonitorData) + self.vcs.vcsStatusMonitorAllData.connect( + self.vcsStatusMonitorAllData) + self.vcs.vcsStatusMonitorStatus.connect( + self.vcsStatusMonitorStatus) + self.vcs.vcsStatusMonitorInfo.connect( + self.vcsStatusMonitorInfo) + self.vcs.vcsStatusChanged.connect( + self.__vcsStatusChanged) + ######################################################################### ## Below is the interface to the checker tools #########################################################################
--- a/eric7/VCS/StatusMonitorThread.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/VCS/StatusMonitorThread.py Mon Sep 20 19:47:18 2021 +0200 @@ -19,12 +19,15 @@ Class implementing the VCS status monitor thread base class. @signal vcsStatusMonitorData(list of str) emitted to update the VCS status + @signal vcsStatusMonitorAllData(dict) emitted to signal all VCS status + (key is project relative file name, value is status) @signal vcsStatusMonitorStatus(str, str) emitted to signal the status of the monitoring thread (ok, nok, op) and a status message @signal vcsStatusMonitorInfo(str) emitted to signal some info of the monitoring thread """ vcsStatusMonitorData = pyqtSignal(list) + vcsStatusMonitorAllData = pyqtSignal(dict) vcsStatusMonitorStatus = pyqtSignal(str, str) vcsStatusMonitorInfo = pyqtSignal(str) @@ -89,6 +92,7 @@ "send", QCoreApplication.translate( "VcsStatusMonitorThread", "Sending data")) self.vcsStatusMonitorData.emit(self.statusList) + self.vcsStatusMonitorAllData.emit(self.reportedStates) self.vcsStatusMonitorStatus.emit(status, statusMsg) self.vcsStatusMonitorInfo.emit(infoMsg) else: @@ -193,6 +197,8 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul>
--- a/eric7/VCS/StatusWidget.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/VCS/StatusWidget.py Mon Sep 20 19:47:18 2021 +0200 @@ -7,12 +7,19 @@ Module implementing a VCS Status widget for the sidebar/toolbar. """ +import contextlib +import os + from PyQt6.QtCore import pyqtSlot, Qt from PyQt6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QListView, - QListWidget, QListWidgetItem, QToolButton + QListWidget, QListWidgetItem, QToolButton, QAbstractItemView ) +from EricWidgets.EricApplication import ericApp +from EricWidgets import EricMessageBox + +import Preferences import UI.PixmapCache @@ -20,6 +27,8 @@ """ Class implementing a VCS Status widget for the sidebar/toolbox. """ + StatusDataRole = Qt.ItemDataRole.UserRole + 1 + def __init__(self, project, parent=None): """ Constructor @@ -46,8 +55,31 @@ QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) self.__topLayout.addWidget(self.__infoLabel) + self.__commitToggleButton = QToolButton(self) + self.__commitToggleButton.setIcon(UI.PixmapCache.getIcon("check")) + self.__commitToggleButton.setToolTip( + self.tr("Press to toggle the commit markers")) + self.__commitToggleButton.clicked.connect(self.__toggleCheckMark) + self.__topLayout.addWidget(self.__commitToggleButton) + + self.__commitButton = QToolButton(self) + self.__commitButton.setIcon(UI.PixmapCache.getIcon("vcsCommit")) + self.__commitButton.setToolTip( + self.tr("Press to commit the marked entries")) + self.__commitButton.clicked.connect(self.__commit) + self.__topLayout.addWidget(self.__commitButton) + + self.__addButton = QToolButton(self) + self.__addButton.setIcon(UI.PixmapCache.getIcon("vcsAdd")) + self.__addButton.setToolTip( + self.tr("Press to add the selected, untracked entries")) + self.__addButton.clicked.connect(self.__addUntracked) + self.__topLayout.addWidget(self.__addButton) + self.__reloadButton = QToolButton(self) self.__reloadButton.setIcon(UI.PixmapCache.getIcon("reload")) + self.__reloadButton.setToolTip( + self.tr("Press to reload the status list")) self.__reloadButton.clicked.connect(self.__reload) self.__topLayout.addWidget(self.__reloadButton) @@ -58,10 +90,33 @@ self.__statusList.setSortingEnabled(True) self.__statusList.setViewMode(QListView.ViewMode.ListMode) self.__statusList.setTextElideMode(Qt.TextElideMode.ElideLeft) + self.__statusList.setSelectionMode( + QAbstractItemView.SelectionMode.ExtendedSelection) self.__layout.addWidget(self.__statusList) self.setLayout(self.__layout) + self.__statusIcons = { + "A": "vcs-added", # added + "M": "vcs-modified", # modified + "O": "vcs-removed", # removed + "R": "vcs-renamed", # renamed + "U": "vcs-update-required", # update needed + "Z": "vcs-conflicting", # conflict + "?": "vcs-untracked", # not tracked + "!": "vcs-missing", # missing + } + self.__statusTexts = { + "A": self.tr("added"), + "M": self.tr("modified"), + "O": self.tr("removed"), + "R": self.tr("renamed"), + "U": self.tr("needs update"), + "Z": self.tr("conflict"), + "?": self.tr("not tracked"), + "!": self.tr("missing"), + } + if self.__project.isOpen(): self.__projectOpened() else: @@ -69,8 +124,10 @@ self.__project.projectOpened.connect(self.__projectOpened) self.__project.projectClosed.connect(self.__projectClosed) + self.__project.vcsCommitted.connect(self.__committed) self.__project.vcsStatusMonitorInfo.connect(self.__setInfoText) - self.__project.vcsStatusMonitorData.connect(self.__processStatusData) + self.__project.vcsStatusMonitorAllData.connect( + self.__processStatusData) @pyqtSlot() def __projectOpened(self): @@ -107,7 +164,7 @@ """ self.__project.checkVCSStatus() - @pyqtSlot(list) + @pyqtSlot(dict) def __processStatusData(self, data): """ Private slot to process the status data emitted by the project. @@ -122,14 +179,106 @@ <li>"R" path was deleted and then re-added</li> <li>"U" path needs an update</li> <li>"Z" path contains a conflict</li> + <li>"?" path is not tracked</li> + <li>"!" path is missing</li> <li>" " path is back at normal</li> </ul> - @param data list of VCS status data - @type list of str + @param data dictionary containing the status data + @type dict """ self.__statusList.clear() - for entry in data: - QListWidgetItem(entry, self.__statusList) + for name, status in data.items(): + if status: + itm = QListWidgetItem(name, self.__statusList) + with contextlib.suppress(KeyError): + itm.setToolTip(self.__statusTexts[status]) + itm.setIcon(UI.PixmapCache.getIcon( + self.__statusIcons[status])) + itm.setData(self.StatusDataRole, status) + if status in "AMOR": + itm.setFlags( + itm.flags() | Qt.ItemFlag.ItemIsUserCheckable) + itm.setCheckState(Qt.CheckState.Checked) + else: + itm.setFlags( + itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable) + self.__statusList.sortItems(Qt.SortOrder.AscendingOrder) + + @pyqtSlot() + def __toggleCheckMark(self): + """ + Private slot to toggle the check marks. + """ + for row in range(self.__statusList.count()): + itm = self.__statusList.item(row) + if ( + itm.flags() & Qt.ItemFlag.ItemIsUserCheckable == + Qt.ItemFlag.ItemIsUserCheckable + ): + if itm.checkState() == Qt.CheckState.Unchecked: + itm.setCheckState(Qt.CheckState.Checked) + else: + itm.setCheckState(Qt.CheckState.Unchecked) + + @pyqtSlot() + def __commit(self): + """ + Private slot to handle the commit button. + """ + projectPath = self.__project.getProjectPath() + names = [] + + for row in range(self.__statusList.count()): + itm = self.__statusList.item(row) + if itm.checkState() == Qt.CheckState.Checked: + names.append(os.path.join(projectPath, itm.text())) + + if not names: + EricMessageBox.information( + self, + self.tr("Commit"), + self.tr("""There are no entries selected to be""" + """ committed.""")) + return + + if Preferences.getVCS("AutoSaveFiles"): + vm = ericApp().getObject("ViewManager") + for name in names: + vm.saveEditor(name) + vcs = self.__project.getVcs() + vcs and vcs.vcsCommit(names, '') + + @pyqtSlot() + def __committed(self): + """ + Private slot called after the commit has been completed. + """ + self.__reload() + + @pyqtSlot() + def __addUntracked(self): + """ + Private slot to add the selected untracked entries. + """ + projectPath = self.__project.getProjectPath() + + names = [ + os.path.join(projectPath, itm.text()) + for itm in self.__statusList.selectedItems() + if itm.data(self.StatusDataRole) == "?" + ] + + if not names: + EricMessageBox.information( + self, + self.tr("Add"), + self.tr("""There are no unversioned entries""" + """ available/selected.""")) + return + + vcs = self.__project.getVcs() + vcs and vcs.vcsAdd(names) + self.__reload()
--- a/eric7/VCS/VersionControl.py Mon Sep 20 07:29:27 2021 +0200 +++ b/eric7/VCS/VersionControl.py Mon Sep 20 19:47:18 2021 +0200 @@ -29,7 +29,10 @@ It defines the vcs interface to be implemented by subclasses and the common methods. + @signal committed() emitted after the commit action has completed @signal vcsStatusMonitorData(list of str) emitted to update the VCS status + @signal vcsStatusMonitorAllData(dict) emitted to signal all VCS status + (key is project relative file name, value is status) @signal vcsStatusMonitorStatus(str, str) emitted to signal the status of the monitoring thread (ok, nok, op, off) and a status message @signal vcsStatusMonitorInfo(str) emitted to signal some info of the @@ -37,7 +40,9 @@ @signal vcsStatusChanged() emitted to indicate a change of the overall VCS status """ + committed = pyqtSignal() vcsStatusMonitorData = pyqtSignal(list) + vcsStatusMonitorAllData = pyqtSignal(dict) vcsStatusMonitorStatus = pyqtSignal(str, str) vcsStatusMonitorInfo = pyqtSignal(str) vcsStatusChanged = pyqtSignal() @@ -685,7 +690,7 @@ def __statusMonitorData(self, statusList): """ - Private method to receive the status monitor status. + Private method to receive the status monitor data update. It simply re-emits the received status list. @@ -695,6 +700,18 @@ self.vcsStatusMonitorData.emit(statusList) QCoreApplication.processEvents() + def __statusMonitorAllData(self, statusDict): + """ + Private method to receive all status monitor data. + + It simply re-emits the received status list. + + @param statusDict dictionary of status records + @type dict + """ + self.vcsStatusMonitorAllData.emit(statusDict) + QCoreApplication.processEvents() + def __statusMonitorInfo(self, info): """ Private slot to receive the status monitor info message. @@ -726,6 +743,9 @@ self.statusMonitorThread.vcsStatusMonitorData.connect( self.__statusMonitorData, Qt.ConnectionType.QueuedConnection) + self.statusMonitorThread.vcsStatusMonitorAllData.connect( + self.__statusMonitorAllData, + Qt.ConnectionType.QueuedConnection) self.statusMonitorThread.vcsStatusMonitorStatus.connect( self.__statusMonitorStatus, Qt.ConnectionType.QueuedConnection) @@ -747,6 +767,8 @@ self.__statusMonitorData(["--RESET--"]) self.statusMonitorThread.vcsStatusMonitorData.disconnect( self.__statusMonitorData) + self.statusMonitorThread.vcsStatusMonitorAllData.disconnect( + self.__statusMonitorAllData) self.statusMonitorThread.vcsStatusMonitorStatus.disconnect( self.__statusMonitorStatus) self.statusMonitorThread.vcsStatusMonitorInfo.disconnect(
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/check.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0 0 22 22" + id="svg8" + sodipodi:docname="check.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1592" + inkscape:window-height="896" + id="namedview10" + showgrid="false" + inkscape:zoom="32.5" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg8" /> + <defs + id="defs4"> + <style + type="text/css" + id="style2">.ColorScheme-Text { + color:#eff0f1; + }</style> + </defs> + <path + class="ColorScheme-Text" + d="m19.216 3.9646-11.784 12.357-4.6814-4.9089-0.79824 0.83705 4.6814 4.9089-0.00226 0.0024 0.79826 0.83704 0.00226-0.0024 0.00226 0.0024 0.79823-0.83704-0.00226-0.0024 11.784-12.357-0.79824-0.83703z" + color="#eff0f1" + fill="#eff0f1" + stroke="#eff0f1" + stroke-width="1.3788" + id="path6" /> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-added.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M7 2v5H2v2h5v5h2V9h5V7H9V2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-conflicting.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M7 2v9h2V2zm0 10v2h2v-2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-missing.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" d="M8.008 0a1 1 0 0 0-.903.553l-7 14A1 1 0 0 0 1 16h14a1 1 0 0 0 .895-1.447l-7-14A1 1 0 0 0 8.008 0z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8.008 0a1 1 0 0 0-.903.553l-7 14A1 1 0 0 0 1 16h14a1 1 0 0 0 .895-1.447l-7-14A1 1 0 0 0 8.008 0zM8 1l7 14H1z"/> + <path d="M7 3v9h2V3zm0 10v2h2v-2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-modified.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M10 5v2H4a2 2 0 0 0-2 2v2.59a7 7 0 0 0 2 2.152V10a1 1 0 0 1 1-1h5v2l4-3z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-removed.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NegativeText { + color:#da4453; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NegativeText" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M2 7v2h12V7z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-renamed.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <rect style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" height="16" rx="2" width="16"/> + <path d="M2 0C.892 0 0 .892 0 2v12c0 1.108.892 2 2 2h12c1.108 0 2-.892 2-2V2c0-1.108-.892-2-2-2zm0 1h12c.554 0 1 .446 1 1v12c0 .554-.446 1-1 1H2c-.554 0-1-.446-1-1V2c0-.554.446-1 1-1z" style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text"/> + <path d="M8 1v2a5 5 0 0 0-5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5h-2a3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3v2l4-3z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-untracked.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,11 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <path d="m2 0c-1.108 0-2 .892-2 2v12c0 1.108.892 2 2 2h12c1.108 0 2-.892 2-2v-12c0-1.108-.892-2-2-2zm0 1h12c.554 0 1 .446 1 1v12c0 .554-.446 1-1 1h-12c-.554 0-1-.446-1-1v-12c0-.554.446-1 1-1z" style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text"/> + <path d="m8 2 1.1480503 3.2283614 3.0945907-1.4710021-1.471002 3.0945905 3.228361 1.1480502-3.228361 1.1480503 1.471002 3.0945907-3.0945908-1.471002-1.1480502 3.228361-1.1480503-3.228361-3.0945904 1.471002 1.4710021-3.0945908-3.2283614-1.1480502 3.2283614-1.1480503-1.4710021-3.0945904 3.0945905 1.4710021z" fill="#fdbc4b"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-dark/vcs-update-required.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#eff0f1; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M8 1v2a5 5 0 0 0-5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5h-2a3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3v2l4-3z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/check.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0 0 22 22" + id="svg8" + sodipodi:docname="check.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1574" + inkscape:window-height="756" + id="namedview10" + showgrid="false" + inkscape:zoom="32.5" + inkscape:cx="11" + inkscape:cy="11" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg8" /> + <defs + id="defs4"> + <style + type="text/css" + id="style2">.ColorScheme-Text { + color:#eff0f1; + }</style> + </defs> + <path + class="ColorScheme-Text" + d="m19.216 3.9646-11.784 12.357-4.6814-4.9089-0.79824 0.83705 4.6814 4.9089-0.00226 0.0024 0.79826 0.83704 0.00226-0.0024 0.00226 0.0024 0.79823-0.83704-0.00226-0.0024 11.784-12.357-0.79824-0.83703z" + color="#eff0f1" + fill="#232629" + stroke="#232629" + stroke-width="1.3788" + id="path6" /> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-added.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M7 2v5H2v2h5v5h2V9h5V7H9V2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-conflicting.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M7 2v9h2V2zm0 10v2h2v-2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-missing.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" d="M8.008 0a1 1 0 0 0-.903.553l-7 14A1 1 0 0 0 1 16h14a1 1 0 0 0 .895-1.447l-7-14A1 1 0 0 0 8.008 0z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8.008 0a1 1 0 0 0-.903.553l-7 14A1 1 0 0 0 1 16h14a1 1 0 0 0 .895-1.447l-7-14A1 1 0 0 0 8.008 0zM8 1l7 14H1z"/> + <path d="M7 3v9h2V3zm0 10v2h2v-2z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-modified.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M10 5v2H4a2 2 0 0 0-2 2v2.59a7 7 0 0 0 2 2.152V10a1 1 0 0 1 1-1h5v2l4-3z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-removed.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NegativeText { + color:#da4453; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <path style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NegativeText" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8z"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M2 7v2h12V7z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-renamed.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Highlight { + color:#3daee9; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <rect style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-Highlight" height="16" rx="2" width="16"/> + <path d="M2 0C.892 0 0 .892 0 2v12c0 1.108.892 2 2 2h12c1.108 0 2-.892 2-2V2c0-1.108-.892-2-2-2zm0 1h12c.554 0 1 .446 1 1v12c0 .554-.446 1-1 1H2c-.554 0-1-.446-1-1V2c0-.554.446-1 1-1z" style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text"/> + <path d="M8 1v2a5 5 0 0 0-5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5h-2a3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3v2l4-3z" fill="#fff"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-untracked.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,11 @@ +<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-Text { + color:#232629; + } + </style> + <path d="m2 0c-1.108 0-2 .892-2 2v12c0 1.108.892 2 2 2h12c1.108 0 2-.892 2-2v-12c0-1.108-.892-2-2-2zm0 1h12c.554 0 1 .446 1 1v12c0 .554-.446 1-1 1h-12c-.554 0-1-.446-1-1v-12c0-.554.446-1 1-1z" style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text"/> + <path d="m8 2 1.1480503 3.2283614 3.0945907-1.4710021-1.471002 3.0945905 3.228361 1.1480502-3.228361 1.1480503 1.471002 3.0945907-3.0945908-1.471002-1.1480502 3.228361-1.1480503-3.228361-3.0945904 1.471002 1.4710021-3.0945908-3.2283614-1.1480502 3.2283614-1.1480503-1.4710021-3.0945904 3.0945905 1.4710021z" fill="#fdbc4b"/> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric7/icons/breeze-light/vcs-update-required.svg Mon Sep 20 19:47:18 2021 +0200 @@ -0,0 +1,15 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> + <style + type="text/css" + id="current-color-scheme"> + .ColorScheme-NeutralText { + color:#f67400; + } + .ColorScheme-Text { + color:#232629; + } + </style> + <circle style="fill:currentColor;fill-opacity:1;stroke:none" class="ColorScheme-NeutralText" cx="8" cy="8" r="8"/> + <path style="fill:currentColor;fill-opacity:0.6;stroke:none" class="ColorScheme-Text" d="M8 0a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8zm0 1a7 7 0 0 1 7 7 7 7 0 0 1-7 7 7 7 0 0 1-7-7 7 7 0 0 1 7-7z"/> + <path d="M8 1v2a5 5 0 0 0-5 5 5 5 0 0 0 5 5 5 5 0 0 0 5-5h-2a3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3v2l4-3z" fill="#fff"/> +</svg>