-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwindow.py
153 lines (121 loc) · 6.07 KB
/
window.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import sys
from functools import wraps
from PySide2.QtWidgets import QFileDialog
from qtpy.QtGui import QFont, QFontDatabase
from qtpy.QtWidgets import QApplication
from ryven import NodesPackage
from ryven.gui.main_console import init_main_console, MainConsole
from ryven.gui.main_window import MainWindow
from ryven.gui.styling.window_theme import apply_stylesheet
from ryven.main.utils import abs_path_from_package_dir
from ryvencore.NodePort import NodePort
from ryvencore_qt.src.flows.connections.ConnectionItem import ConnectionItem
from shiboken2 import shiboken2
from exporter import Exporter
from nodes import nodes
class IPv8VisualProgrammer(MainWindow):
"""
This class hot-patches the Ryven MainWindow to remove elements that are not needed for IPv8 Community design.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
MainConsole.instance.deleteLater()
def import_nodes(self, package: NodesPackage = None, path: str = None):
self.session.register_nodes(nodes)
for n in nodes:
self.node_packages[n] = NodesPackage(".")
self.nodes_list_widget.update_list(self.session.nodes)
def setup_menu_actions(self):
super().setup_menu_actions()
self.ui.actionImport_Nodes.setText("Load Project")
self.ui.actionImport_Example_Nodes.setText("Export as IPv8 Code")
self.ui.menuDebugging.deleteLater()
self.ui.menuScripts.deleteLater()
self.ui.scripts_groupBox.deleteLater()
self.ui.scripts_tab_widget.tabBar().setFont(QFont('source code pro', 10))
self.nodes_list_widget.search_line_edit.setFont(QFont('source code pro', 10))
self.session.create_script("workspace")
def remove_workspace_garbage(self):
for workspace_pane in list(self.script_UIs.values()):
if shiboken2.isValid(workspace_pane.ui.contents_widget):
# Removals
workspace_pane.ui.contents_widget.deleteLater()
workspace_pane.ui.source_code_groupBox.deleteLater()
workspace_pane.flow_view._stylus_modes_widget.deleteLater()
workspace_pane.flow_view.set_stylus_proxy_pos = lambda: None
# Overwrites
@wraps(workspace_pane.flow_view._add_connection_item)
def connection_item_added_overwrite(item: ConnectionItem):
nonlocal workspace_pane
connection_item_added_overwrite.__wrapped__(item)
def remove_on_click(event):
nonlocal item
nonlocal workspace_pane
workspace_pane.flow_view.flow.remove_connection(item.connection)
item.mousePressEvent = remove_on_click
workspace_pane.flow_view._add_connection_item = connection_item_added_overwrite
@wraps(workspace_pane.flow_view.flow.check_connection_validity)
def check_connection_validity_overwrite(p1: NodePort, p2: NodePort):
nonlocal workspace_pane
valid = True
# Custom checks
p1_is_single = p1.label_str in getattr(p1.node, "singleton_ports", [])
p2_is_single = p2.label_str in getattr(p2.node, "singleton_ports", [])
if p1_is_single and len(p1.connections) > 0:
valid = False
if p2_is_single and len(p2.connections) > 0:
valid = False
if valid:
return check_connection_validity_overwrite.__wrapped__(p1, p2)
else:
return False
workspace_pane.flow_view.flow.check_connection_validity = check_connection_validity_overwrite
def on_import_nodes_triggered(self):
"""
Overwritten -> now "Load Project" action.
"""
file_path = QFileDialog.getOpenFileName(self, 'select nodes file', '.', '(*.json)', )[0]
if file_path != '':
while self.ui.scripts_tab_widget.count() > 0:
self.ui.scripts_tab_widget.removeTab(0)
for key in list(self.script_UIs.keys()):
del self.script_UIs[key]
del self.session.flow_views[key]
self.session.scripts = []
import json
with open(file_path, 'r') as fp:
self.session.load(json.load(fp))
for flow_view in self.session.flow_views.values():
flow_view.hide()
selected = flow_view.scene().selectedItems()
flow_view.select_all()
QApplication.instance().processEvents()
flow_view.clear_selection()
flow_view.select_components(selected)
flow_view.show()
def on_import_example_nodes_triggered(self):
"""
Overwritten -> now "Export" action.
"""
# Dialog to select save file
file_path = QFileDialog.getSaveFileName(self, 'select file name', '', 'PY(*.py)')[0]
if file_path != '':
exporter = Exporter(self.session.all_node_objects())
exporter.export(file_path)
def script_created(self, script, flow_view):
super().script_created(script, flow_view)
self.remove_workspace_garbage()
def run():
app = QApplication(sys.argv)
db = QFontDatabase()
db.addApplicationFont(abs_path_from_package_dir('resources/fonts/poppins/Poppins-Medium.ttf'))
db.addApplicationFont(abs_path_from_package_dir('resources/fonts/source_code_pro/SourceCodePro-Regular.ttf'))
db.addApplicationFont(abs_path_from_package_dir('resources/fonts/asap/Asap-Regular.ttf'))
window_theme_name='dark'
window_theme = apply_stylesheet(window_theme_name)
editor_init_config = {'action': None}
flow_theme = 'pure dark' if window_theme.name == 'dark' else 'pure light'
init_main_console(window_theme)
editor = IPv8VisualProgrammer(editor_init_config, "IPv8 Visual Community Creator", window_theme, flow_theme)
editor.show()
sys.exit(app.exec_())