Feat: Sidebar mit Suchfilter und lxml-Parser im XslDependencyDialog
- Ein-/ausblendbare Sidebar mit tab-übergreifender Suche hinzugefügt - Graph-Suchfilter blendet nicht-betroffene XSL-Dateien aus dem Netzwerkgraph aus - Regex-basierte XSL-Abhängigkeitserkennung durch lxml-Parser ersetzt - Suchfilter wird beim Tab-Wechsel erneut angewendet Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -47,9 +47,17 @@ class XslDependencyDialog(QDialog):
|
||||
self._graph_loaded = False
|
||||
self._temp_html_file: tempfile.NamedTemporaryFile | None = None
|
||||
|
||||
self._sidebar_visible = False
|
||||
|
||||
self.ui = Ui_XslDependencyDialog()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
# Sidebar initial ausblenden
|
||||
self.ui.settingsButton.setIcon(QIcon.fromTheme("preferences-system"))
|
||||
self.ui.sidebarWidget.setVisible(False)
|
||||
self.ui.mainSplitter.setSizes([1000, 0])
|
||||
self.ui.settingsButton.clicked.connect(self._toggle_sidebar)
|
||||
|
||||
# Netzwerkgraph-Tab ausblenden wenn WebEngine nicht verfügbar
|
||||
if not HAS_WEBENGINE:
|
||||
self.ui.tabWidget.removeTab(1)
|
||||
@@ -72,6 +80,9 @@ class XslDependencyDialog(QDialog):
|
||||
self.ui.fileTree.currentItemChanged.connect(self._on_file_selected)
|
||||
self.ui.searchEdit.textChanged.connect(self._on_search_changed)
|
||||
self.ui.tabWidget.currentChanged.connect(self._on_tab_changed)
|
||||
self.ui.graphFilterConnectedCheck.toggled.connect(
|
||||
lambda: self._on_search_changed(self.ui.searchEdit.text())
|
||||
)
|
||||
|
||||
def closeEvent(self, event):
|
||||
"""Räumt temporäre Dateien und QWebEngineView auf."""
|
||||
@@ -197,17 +208,46 @@ class XslDependencyDialog(QDialog):
|
||||
self.ui.depTree.addTopLevelItem(no_deps_item)
|
||||
|
||||
def _on_search_changed(self, text: str):
|
||||
"""Filtert je nach aktivem Tab die Dateiliste oder den Netzwerkgraph."""
|
||||
current_tab = self.ui.tabWidget.currentIndex()
|
||||
if current_tab == 0:
|
||||
self._search_tree(text)
|
||||
elif current_tab == 1 and self._web_view is not None:
|
||||
self._search_graph(text)
|
||||
|
||||
def _search_tree(self, text: str):
|
||||
"""Filtert die Dateiliste nach dem Suchbegriff."""
|
||||
search_lower = text.lower()
|
||||
for i in range(self.ui.fileTree.topLevelItemCount()):
|
||||
item = self.ui.fileTree.topLevelItem(i)
|
||||
matches = search_lower in item.text(0).lower()
|
||||
matches = not search_lower or search_lower in item.text(0).lower()
|
||||
item.setHidden(not matches)
|
||||
|
||||
def _search_graph(self, text: str):
|
||||
"""Filtert oder dimmt Knoten im Netzwerkgraph je nach Checkbox-Einstellung."""
|
||||
escaped = text.replace("\\", "\\\\").replace("'", "\\'")
|
||||
hide_unrelated = str(self.ui.graphFilterConnectedCheck.isChecked()).lower()
|
||||
self._web_view.page().runJavaScript(f"filterNodes('{escaped}', {hide_unrelated})")
|
||||
|
||||
# === Sidebar ===
|
||||
|
||||
def _toggle_sidebar(self):
|
||||
"""Blendet die Einstellungs-Sidebar ein oder aus."""
|
||||
self._sidebar_visible = not self._sidebar_visible
|
||||
if self._sidebar_visible:
|
||||
self.ui.sidebarWidget.setVisible(True)
|
||||
self.ui.mainSplitter.setSizes([750, 250])
|
||||
else:
|
||||
self.ui.mainSplitter.setSizes([1000, 0])
|
||||
self.ui.sidebarWidget.setVisible(False)
|
||||
|
||||
# === Netzwerkgraph (vis.js) ===
|
||||
|
||||
def _on_tab_changed(self, index: int):
|
||||
"""Lazy-Init des Netzwerkgraphs beim ersten Tab-Wechsel."""
|
||||
"""Lazy-Init des Netzwerkgraphs beim ersten Tab-Wechsel und Sidebar-Seite synchronisieren."""
|
||||
# Sidebar-Seite synchronisieren
|
||||
self.ui.settingsStack.setCurrentIndex(index)
|
||||
|
||||
if not HAS_WEBENGINE:
|
||||
return
|
||||
|
||||
@@ -215,6 +255,11 @@ class XslDependencyDialog(QDialog):
|
||||
if index == 1 and not self._graph_loaded:
|
||||
self._setup_network_graph()
|
||||
|
||||
# Suchbegriff auf den neuen Tab anwenden
|
||||
search_text = self.ui.searchEdit.text()
|
||||
if search_text:
|
||||
self._on_search_changed(search_text)
|
||||
|
||||
def _setup_network_graph(self):
|
||||
"""Erstellt QWebEngineView und lädt den vis.js Netzwerkgraph."""
|
||||
self._web_view = QWebEngineView(self.ui.graphContainer)
|
||||
@@ -474,6 +519,117 @@ class XslDependencyDialog(QDialog):
|
||||
}});
|
||||
edges.update(edgeUpdates);
|
||||
}});
|
||||
|
||||
// Suchfunktion: Knoten nach Label filtern
|
||||
function filterNodes(searchTerm, hideUnrelated) {{
|
||||
var term = searchTerm.toLowerCase();
|
||||
|
||||
if (hideUnrelated) {{
|
||||
// Originalzustand wiederherstellen
|
||||
nodes.clear();
|
||||
edges.clear();
|
||||
nodes.add(nodesData);
|
||||
edges.add(edgesData);
|
||||
allNodes = nodes.get();
|
||||
|
||||
if (!term) return;
|
||||
|
||||
// 1. Matching-Knoten finden
|
||||
var matchedIds = new Set();
|
||||
nodesData.forEach(function(node) {{
|
||||
if (node.label.toLowerCase().indexOf(term) !== -1) {{
|
||||
matchedIds.add(node.id);
|
||||
}}
|
||||
}});
|
||||
|
||||
// 2. Gerichtete Adjazenzlisten aufbauen
|
||||
var fwd = {{}}; // from → to (Import-Richtung)
|
||||
var bwd = {{}}; // to → from (Reverse)
|
||||
edgesData.forEach(function(edge) {{
|
||||
if (!fwd[edge.from]) fwd[edge.from] = [];
|
||||
if (!bwd[edge.to]) bwd[edge.to] = [];
|
||||
fwd[edge.from].push(edge.to);
|
||||
bwd[edge.to].push(edge.from);
|
||||
}});
|
||||
|
||||
// 3. BFS vorwärts (Nachkommen) + rückwärts (Vorfahren)
|
||||
var reachable = new Set(matchedIds);
|
||||
var queue = Array.from(matchedIds);
|
||||
while (queue.length > 0) {{
|
||||
var current = queue.shift();
|
||||
(fwd[current] || []).forEach(function(n) {{
|
||||
if (!reachable.has(n)) {{ reachable.add(n); queue.push(n); }}
|
||||
}});
|
||||
}}
|
||||
queue = Array.from(matchedIds);
|
||||
while (queue.length > 0) {{
|
||||
var current = queue.shift();
|
||||
(bwd[current] || []).forEach(function(n) {{
|
||||
if (!reachable.has(n)) {{ reachable.add(n); queue.push(n); }}
|
||||
}});
|
||||
}}
|
||||
|
||||
// 4. Nicht-erreichbare Knoten und Kanten entfernen
|
||||
var removeNodeIds = [];
|
||||
nodesData.forEach(function(node) {{
|
||||
if (!reachable.has(node.id)) removeNodeIds.push(node.id);
|
||||
}});
|
||||
nodes.remove(removeNodeIds);
|
||||
|
||||
var removeEdgeIds = [];
|
||||
edgesData.forEach(function(edge) {{
|
||||
if (!reachable.has(edge.from) || !reachable.has(edge.to))
|
||||
removeEdgeIds.push(edge.id);
|
||||
}});
|
||||
edges.remove(removeEdgeIds);
|
||||
|
||||
// Matching-Knoten hervorheben, verbundene leicht dimmen
|
||||
var updates = [];
|
||||
matchedIds.forEach(function(id) {{
|
||||
updates.push({{ id: id, opacity: 1.0 }});
|
||||
}});
|
||||
reachable.forEach(function(id) {{
|
||||
if (!matchedIds.has(id)) {{
|
||||
updates.push({{ id: id, opacity: 0.5 }});
|
||||
}}
|
||||
}});
|
||||
nodes.update(updates);
|
||||
allNodes = nodes.get();
|
||||
|
||||
}} else {{
|
||||
// Originalzustand wiederherstellen falls vorher gefiltert
|
||||
nodes.clear();
|
||||
edges.clear();
|
||||
nodes.add(nodesData);
|
||||
edges.add(edgesData);
|
||||
allNodes = nodes.get();
|
||||
|
||||
// Bisheriges Verhalten: nur dimmen
|
||||
var updates = [];
|
||||
var matchedIds = new Set();
|
||||
|
||||
allNodes.forEach(function(node) {{
|
||||
if (!term || node.label.toLowerCase().indexOf(term) !== -1) {{
|
||||
updates.push({{ id: node.id, opacity: 1.0 }});
|
||||
matchedIds.add(node.id);
|
||||
}} else {{
|
||||
updates.push({{ id: node.id, opacity: 0.12 }});
|
||||
}}
|
||||
}});
|
||||
nodes.update(updates);
|
||||
|
||||
var allEdges = edges.get();
|
||||
var edgeUpdates = [];
|
||||
allEdges.forEach(function(edge) {{
|
||||
if (!term || (matchedIds.has(edge.from) && matchedIds.has(edge.to))) {{
|
||||
edgeUpdates.push({{ id: edge.id, color: {{ opacity: 0.7 }} }});
|
||||
}} else {{
|
||||
edgeUpdates.push({{ id: edge.id, color: {{ opacity: 0.05 }} }});
|
||||
}}
|
||||
}});
|
||||
edges.update(edgeUpdates);
|
||||
}}
|
||||
}}
|
||||
</script>
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
+276
-145
@@ -15,157 +15,281 @@
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
<layout class="QHBoxLayout" name="toolbarLayout">
|
||||
<item>
|
||||
<spacer name="toolbarSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="settingsButton">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>28</width>
|
||||
<height>28</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Einstellungen ein-/ausblenden</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSplitter" name="mainSplitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="treeTab">
|
||||
<attribute name="title">
|
||||
<string>Baumansicht</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="treeTabLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="searchLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="searchLabel">
|
||||
<property name="text">
|
||||
<string>Suche:</string>
|
||||
</property>
|
||||
<property name="childrenCollapsible">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="treeTab">
|
||||
<attribute name="title">
|
||||
<string>Baumansicht</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="treeTabLayout">
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="leftWidget" native="true">
|
||||
<layout class="QVBoxLayout" name="leftLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="leftLabel">
|
||||
<property name="text">
|
||||
<string>XSL-Dateien</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="fileTree">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="searchEdit">
|
||||
<property name="placeholderText">
|
||||
<string>XSL-Datei filtern...</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="rightWidget" native="true">
|
||||
<layout class="QVBoxLayout" name="rightLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="rightLabel">
|
||||
<property name="text">
|
||||
<string>Abhängigkeiten</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="depTree">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="graphTab">
|
||||
<attribute name="title">
|
||||
<string>Netzwerkgraph</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="graphTabLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="graphContainer" native="true">
|
||||
<layout class="QVBoxLayout" name="graphContainerLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QWidget" name="sidebarWidget" native="true">
|
||||
<layout class="QVBoxLayout" name="sidebarLayout">
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<widget class="QLabel" name="sidebarLabel">
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Einstellungen</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="leftWidget" native="true">
|
||||
<layout class="QVBoxLayout" name="leftLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="leftLabel">
|
||||
<property name="text">
|
||||
<string>XSL-Dateien</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="fileTree">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::SingleSelection</enum>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="rightWidget" native="true">
|
||||
<layout class="QVBoxLayout" name="rightLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="rightLabel">
|
||||
<property name="text">
|
||||
<string>Abhängigkeiten</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="depTree">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="graphTab">
|
||||
<attribute name="title">
|
||||
<string>Netzwerkgraph</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="graphTabLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="graphContainer" native="true">
|
||||
<layout class="QVBoxLayout" name="graphContainerLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
<widget class="QLabel" name="searchLabel">
|
||||
<property name="text">
|
||||
<string>Suche:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="searchEdit">
|
||||
<property name="placeholderText">
|
||||
<string>XSL-Datei filtern...</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="settingsStack">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="treeSettingsPage">
|
||||
<layout class="QVBoxLayout" name="treeSettingsLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="treeSettingsLabel">
|
||||
<property name="text">
|
||||
<string>Baumansicht-Einstellungen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="treeSettingsSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="graphSettingsPage">
|
||||
<layout class="QVBoxLayout" name="graphSettingsLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="graphSettingsLabel">
|
||||
<property name="text">
|
||||
<string>Graph-Einstellungen</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="graphFilterConnectedCheck">
|
||||
<property name="text">
|
||||
<string>Nur betroffene Dateien anzeigen</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Entfernt alle XSL-Dateien aus dem Graph, die nicht zum Suchbegriff passen und nicht direkt oder indirekt mit passenden Dateien verbunden sind</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="graphSettingsSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@@ -174,6 +298,12 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="statusLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
@@ -182,10 +312,10 @@
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
<set>QDialogButtonBox::StandardButton::Close</set>
|
||||
</property>
|
||||
<property name="centerButtons">
|
||||
<bool>true</bool>
|
||||
@@ -194,6 +324,7 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
|
||||
@@ -15,10 +15,12 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
|
||||
QFont, QFontDatabase, QGradient, QIcon,
|
||||
QImage, QKeySequence, QLinearGradient, QPainter,
|
||||
QPalette, QPixmap, QRadialGradient, QTransform)
|
||||
from PySide6.QtWidgets import (QAbstractButton, QAbstractItemView, QApplication, QDialog,
|
||||
QDialogButtonBox, QHBoxLayout, QHeaderView, QLabel,
|
||||
QLineEdit, QSizePolicy, QSplitter, QTabWidget,
|
||||
from PySide6.QtWidgets import (QAbstractButton, QAbstractItemView, QApplication, QCheckBox,
|
||||
QDialog, QDialogButtonBox, QHBoxLayout, QHeaderView,
|
||||
QLabel, QLineEdit, QPushButton, QSizePolicy,
|
||||
QSpacerItem, QSplitter, QStackedWidget, QTabWidget,
|
||||
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget)
|
||||
|
||||
class Ui_XslDependencyDialog(object):
|
||||
def setupUi(self, XslDependencyDialog):
|
||||
if not XslDependencyDialog.objectName():
|
||||
@@ -26,31 +28,35 @@ class Ui_XslDependencyDialog(object):
|
||||
XslDependencyDialog.resize(1000, 700)
|
||||
self.verticalLayout = QVBoxLayout(XslDependencyDialog)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.tabWidget = QTabWidget(XslDependencyDialog)
|
||||
self.toolbarLayout = QHBoxLayout()
|
||||
self.toolbarLayout.setObjectName(u"toolbarLayout")
|
||||
self.toolbarSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
||||
|
||||
self.toolbarLayout.addItem(self.toolbarSpacer)
|
||||
|
||||
self.settingsButton = QPushButton(XslDependencyDialog)
|
||||
self.settingsButton.setObjectName(u"settingsButton")
|
||||
self.settingsButton.setMaximumSize(QSize(28, 28))
|
||||
self.settingsButton.setFlat(True)
|
||||
|
||||
self.toolbarLayout.addWidget(self.settingsButton)
|
||||
|
||||
|
||||
self.verticalLayout.addLayout(self.toolbarLayout)
|
||||
|
||||
self.mainSplitter = QSplitter(XslDependencyDialog)
|
||||
self.mainSplitter.setObjectName(u"mainSplitter")
|
||||
self.mainSplitter.setOrientation(Qt.Orientation.Horizontal)
|
||||
self.mainSplitter.setChildrenCollapsible(True)
|
||||
self.tabWidget = QTabWidget(self.mainSplitter)
|
||||
self.tabWidget.setObjectName(u"tabWidget")
|
||||
self.treeTab = QWidget()
|
||||
self.treeTab.setObjectName(u"treeTab")
|
||||
self.treeTabLayout = QVBoxLayout(self.treeTab)
|
||||
self.treeTabLayout.setObjectName(u"treeTabLayout")
|
||||
self.searchLayout = QHBoxLayout()
|
||||
self.searchLayout.setObjectName(u"searchLayout")
|
||||
self.searchLabel = QLabel(self.treeTab)
|
||||
self.searchLabel.setObjectName(u"searchLabel")
|
||||
|
||||
self.searchLayout.addWidget(self.searchLabel)
|
||||
|
||||
self.searchEdit = QLineEdit(self.treeTab)
|
||||
self.searchEdit.setObjectName(u"searchEdit")
|
||||
self.searchEdit.setClearButtonEnabled(True)
|
||||
|
||||
self.searchLayout.addWidget(self.searchEdit)
|
||||
|
||||
|
||||
self.treeTabLayout.addLayout(self.searchLayout)
|
||||
|
||||
self.splitter = QSplitter(self.treeTab)
|
||||
self.splitter.setObjectName(u"splitter")
|
||||
self.splitter.setOrientation(Qt.Horizontal)
|
||||
self.splitter.setOrientation(Qt.Orientation.Horizontal)
|
||||
self.leftWidget = QWidget(self.splitter)
|
||||
self.leftWidget.setObjectName(u"leftWidget")
|
||||
self.leftLayout = QVBoxLayout(self.leftWidget)
|
||||
@@ -67,7 +73,7 @@ class Ui_XslDependencyDialog(object):
|
||||
self.fileTree.setHeaderItem(__qtreewidgetitem)
|
||||
self.fileTree.setObjectName(u"fileTree")
|
||||
self.fileTree.setAlternatingRowColors(True)
|
||||
self.fileTree.setSelectionMode(QAbstractItemView.SingleSelection)
|
||||
self.fileTree.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
|
||||
self.fileTree.setRootIsDecorated(True)
|
||||
|
||||
self.leftLayout.addWidget(self.fileTree)
|
||||
@@ -112,18 +118,87 @@ class Ui_XslDependencyDialog(object):
|
||||
self.graphTabLayout.addWidget(self.graphContainer)
|
||||
|
||||
self.tabWidget.addTab(self.graphTab, "")
|
||||
self.mainSplitter.addWidget(self.tabWidget)
|
||||
self.sidebarWidget = QWidget(self.mainSplitter)
|
||||
self.sidebarWidget.setObjectName(u"sidebarWidget")
|
||||
self.sidebarLayout = QVBoxLayout(self.sidebarWidget)
|
||||
self.sidebarLayout.setObjectName(u"sidebarLayout")
|
||||
self.sidebarLabel = QLabel(self.sidebarWidget)
|
||||
self.sidebarLabel.setObjectName(u"sidebarLabel")
|
||||
font = QFont()
|
||||
font.setBold(True)
|
||||
self.sidebarLabel.setFont(font)
|
||||
|
||||
self.verticalLayout.addWidget(self.tabWidget)
|
||||
self.sidebarLayout.addWidget(self.sidebarLabel)
|
||||
|
||||
self.searchLabel = QLabel(self.sidebarWidget)
|
||||
self.searchLabel.setObjectName(u"searchLabel")
|
||||
|
||||
self.sidebarLayout.addWidget(self.searchLabel)
|
||||
|
||||
self.searchEdit = QLineEdit(self.sidebarWidget)
|
||||
self.searchEdit.setObjectName(u"searchEdit")
|
||||
self.searchEdit.setClearButtonEnabled(True)
|
||||
|
||||
self.sidebarLayout.addWidget(self.searchEdit)
|
||||
|
||||
self.settingsStack = QStackedWidget(self.sidebarWidget)
|
||||
self.settingsStack.setObjectName(u"settingsStack")
|
||||
self.treeSettingsPage = QWidget()
|
||||
self.treeSettingsPage.setObjectName(u"treeSettingsPage")
|
||||
self.treeSettingsLayout = QVBoxLayout(self.treeSettingsPage)
|
||||
self.treeSettingsLayout.setObjectName(u"treeSettingsLayout")
|
||||
self.treeSettingsLabel = QLabel(self.treeSettingsPage)
|
||||
self.treeSettingsLabel.setObjectName(u"treeSettingsLabel")
|
||||
|
||||
self.treeSettingsLayout.addWidget(self.treeSettingsLabel)
|
||||
|
||||
self.treeSettingsSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
||||
|
||||
self.treeSettingsLayout.addItem(self.treeSettingsSpacer)
|
||||
|
||||
self.settingsStack.addWidget(self.treeSettingsPage)
|
||||
self.graphSettingsPage = QWidget()
|
||||
self.graphSettingsPage.setObjectName(u"graphSettingsPage")
|
||||
self.graphSettingsLayout = QVBoxLayout(self.graphSettingsPage)
|
||||
self.graphSettingsLayout.setObjectName(u"graphSettingsLayout")
|
||||
self.graphSettingsLabel = QLabel(self.graphSettingsPage)
|
||||
self.graphSettingsLabel.setObjectName(u"graphSettingsLabel")
|
||||
|
||||
self.graphSettingsLayout.addWidget(self.graphSettingsLabel)
|
||||
|
||||
self.graphFilterConnectedCheck = QCheckBox(self.graphSettingsPage)
|
||||
self.graphFilterConnectedCheck.setObjectName(u"graphFilterConnectedCheck")
|
||||
self.graphFilterConnectedCheck.setChecked(True)
|
||||
|
||||
self.graphSettingsLayout.addWidget(self.graphFilterConnectedCheck)
|
||||
|
||||
self.graphSettingsSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
||||
|
||||
self.graphSettingsLayout.addItem(self.graphSettingsSpacer)
|
||||
|
||||
self.settingsStack.addWidget(self.graphSettingsPage)
|
||||
|
||||
self.sidebarLayout.addWidget(self.settingsStack)
|
||||
|
||||
self.mainSplitter.addWidget(self.sidebarWidget)
|
||||
|
||||
self.verticalLayout.addWidget(self.mainSplitter)
|
||||
|
||||
self.statusLabel = QLabel(XslDependencyDialog)
|
||||
self.statusLabel.setObjectName(u"statusLabel")
|
||||
sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.statusLabel.sizePolicy().hasHeightForWidth())
|
||||
self.statusLabel.setSizePolicy(sizePolicy)
|
||||
|
||||
self.verticalLayout.addWidget(self.statusLabel)
|
||||
|
||||
self.buttonBox = QDialogButtonBox(XslDependencyDialog)
|
||||
self.buttonBox.setObjectName(u"buttonBox")
|
||||
self.buttonBox.setOrientation(Qt.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QDialogButtonBox.Close)
|
||||
self.buttonBox.setOrientation(Qt.Orientation.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close)
|
||||
self.buttonBox.setCenterButtons(True)
|
||||
|
||||
self.verticalLayout.addWidget(self.buttonBox)
|
||||
@@ -133,6 +208,7 @@ class Ui_XslDependencyDialog(object):
|
||||
self.buttonBox.rejected.connect(XslDependencyDialog.reject)
|
||||
|
||||
self.tabWidget.setCurrentIndex(0)
|
||||
self.settingsStack.setCurrentIndex(0)
|
||||
|
||||
|
||||
QMetaObject.connectSlotsByName(XslDependencyDialog)
|
||||
@@ -140,12 +216,23 @@ class Ui_XslDependencyDialog(object):
|
||||
|
||||
def retranslateUi(self, XslDependencyDialog):
|
||||
XslDependencyDialog.setWindowTitle(QCoreApplication.translate("XslDependencyDialog", u"XSL-Abh\u00e4ngigkeitsgraph", None))
|
||||
self.searchLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Suche:", None))
|
||||
self.searchEdit.setPlaceholderText(QCoreApplication.translate("XslDependencyDialog", u"XSL-Datei filtern...", None))
|
||||
#if QT_CONFIG(tooltip)
|
||||
self.settingsButton.setToolTip(QCoreApplication.translate("XslDependencyDialog", u"Einstellungen ein-/ausblenden", None))
|
||||
#endif // QT_CONFIG(tooltip)
|
||||
self.settingsButton.setText("")
|
||||
self.leftLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"XSL-Dateien", None))
|
||||
self.rightLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Abh\u00e4ngigkeiten", None))
|
||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.treeTab), QCoreApplication.translate("XslDependencyDialog", u"Baumansicht", None))
|
||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.graphTab), QCoreApplication.translate("XslDependencyDialog", u"Netzwerkgraph", None))
|
||||
self.sidebarLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Einstellungen", None))
|
||||
self.searchLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Suche:", None))
|
||||
self.searchEdit.setPlaceholderText(QCoreApplication.translate("XslDependencyDialog", u"XSL-Datei filtern...", None))
|
||||
self.treeSettingsLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Baumansicht-Einstellungen", None))
|
||||
self.graphSettingsLabel.setText(QCoreApplication.translate("XslDependencyDialog", u"Graph-Einstellungen", None))
|
||||
self.graphFilterConnectedCheck.setText(QCoreApplication.translate("XslDependencyDialog", u"Nur betroffene Dateien anzeigen", None))
|
||||
#if QT_CONFIG(tooltip)
|
||||
self.graphFilterConnectedCheck.setToolTip(QCoreApplication.translate("XslDependencyDialog", u"Entfernt alle XSL-Dateien aus dem Graph, die nicht zum Suchbegriff passen und nicht direkt oder indirekt mit passenden Dateien verbunden sind", None))
|
||||
#endif // QT_CONFIG(tooltip)
|
||||
self.statusLabel.setText("")
|
||||
# retranslateUi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user