From 4591178a4b8a0bfcc82d2e2078a0975ebf100eff Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Tue, 25 Feb 2025 19:24:38 -0700 Subject: [PATCH] Reincorporated Old Code with Pipe Color Overrides --- ...lyff_character_status_node.cpython-312.pyc | Bin 5132 -> 5132 bytes Workflows/Basic_Data_Node_Connection.json | 101 +++++ __pycache__/monkey_patches.cpython-312.pyc | Bin 0 -> 4089 bytes borealis.py | 383 ++++++------------ 4 files changed, 236 insertions(+), 248 deletions(-) create mode 100644 Workflows/Basic_Data_Node_Connection.json create mode 100644 __pycache__/monkey_patches.cpython-312.pyc diff --git a/Nodes/Flyff/__pycache__/flyff_character_status_node.cpython-312.pyc b/Nodes/Flyff/__pycache__/flyff_character_status_node.cpython-312.pyc index cbe246a1b62117e54bde9ff60daa95d9045e42f8..25f26b3a08f8d96f352d6391bba5992bff45ccf0 100644 GIT binary patch delta 20 acmeCt=+WRl&CAQh00b+`_HE>56afG>`~?vJ delta 20 acmeCt=+WRl&CAQh00b)UH*Mr*6afG=^91<- diff --git a/Workflows/Basic_Data_Node_Connection.json b/Workflows/Basic_Data_Node_Connection.json new file mode 100644 index 0000000..902306b --- /dev/null +++ b/Workflows/Basic_Data_Node_Connection.json @@ -0,0 +1,101 @@ +{ + "graph":{ + "layout_direction":0, + "acyclic":true, + "pipe_collision":false, + "pipe_slicing":true, + "pipe_style":1, + "accept_connection_types":{}, + "reject_connection_types":{} + }, + "nodes":{ + "0x1ad82a5c620":{ + "type_":"bunny-lab.io.data_node.DataNode", + "icon":null, + "name":"Data Node", + "color":[ + 13, + 18, + 23, + 255 + ], + "border_color":[ + 74, + 84, + 85, + 255 + ], + "text_color":[ + 255, + 255, + 255, + 180 + ], + "disabled":false, + "selected":false, + "visible":true, + "width":269.0, + "height":74.2, + "pos":[ + -93.6890385514249, + 181.13214119942148 + ], + "layout_direction":0, + "port_deletion_allowed":false, + "subgraph_session":{}, + "custom":{ + "value":"57" + } + }, + "0x1ad82a5cef0":{ + "type_":"bunny-lab.io.data_node.DataNode", + "icon":null, + "name":"Data Node 1", + "color":[ + 13, + 18, + 23, + 255 + ], + "border_color":[ + 74, + 84, + 85, + 255 + ], + "text_color":[ + 255, + 255, + 255, + 180 + ], + "disabled":false, + "selected":false, + "visible":true, + "width":269.0, + "height":74.2, + "pos":[ + 361.37200584121035, + 287.313051557703 + ], + "layout_direction":0, + "port_deletion_allowed":false, + "subgraph_session":{}, + "custom":{ + "value":"57" + } + } + }, + "connections":[ + { + "out":[ + "0x1ad82a5c620", + "Output" + ], + "in":[ + "0x1ad82a5cef0", + "Input" + ] + } + ] +} \ No newline at end of file diff --git a/__pycache__/monkey_patches.cpython-312.pyc b/__pycache__/monkey_patches.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b294426797616148de3d0caef9198530e58843e GIT binary patch literal 4089 zcmbVPUu+Y}8K3d4?e+hJ{3n4dgg|{q&E>eG1p>++4#HJ6386(XNM^G;iPx;XW_Od| z$We1G6$yt*DqTg;sk*eP)T?ME9{O+()#>1*zVszN3^7~KA+;|&R7#0dA+A#U&Dv{+ z6ok}~{LSplH{Z;Be}3QRzXSqa1nnQ$&&QX82>p$I*v(lUtbL9Vx{f3iLlTx83XWk9 z9Wja{#l#p)$E?DpoH1w06?0kNPQ{(#VjM<$+P;q(0tgb4#I1DAq){ZkA&y2y;6DZD|dZ~dOD7hb^?e1R)vbA@ZC zuXw+&rq7cspAif(L3Dmh)%Y>_qMRP*VWdtHO_L@1rDupJkI5oGN)p1PtZF(hr+ISG zAX-{bctsx71WhJ-#Cr%^huAzQaQ8id|4H^BaMnu-uI`ka;82GLI+49I7PL@4o z9S^!${=mqfyjC-8U$#70VkGuvS+1?G88*iz-8O%z>~w#s4n?D-sU z=Nvi4KF8V}uve?SecKsl&Y28V=k3w!Zw`{3|L4uuz0Ih^P7X;f+q<=Pcypb7mujCw z$%g8eJ+j|Y)d%cuvRA9U%?GjL4s+87y?nVHRW%Vj6MTlxfM@U`^#z?bRNhDsUKdh? zpA?h{5~=KX(hXvtT%_cWl>7(CIQ(eqFsPE9?uAJ+Ax_6%y6(`d86r02)bYxn#oC;Ff|B5H9r;O)`)I^lZIVz0#U|H zx3!&Urc2EjvI_n@B}?PPFkPu^9As)#%eo6l>BY}Gj~+NXsHsUJ8u31mBq*|eHf04W zT*V61NG59r;^G9Hlqy|MYXbrGRMPK(%%W8ed1|it=lxfM4{IAf8e2TMRJSC4y7zA5 zp1ZYg&AEzPaD{8mbIpr&1#U}`3tbD&2Nxy_+}4L&-NKQ@T}%5u-B;k=E(RN}ou5Dd zVQP*kay}~XqaQBzE$T~qm-M?0Zx*=SbUH8}SP%=`W?PP4;9CFg+qCe`Vq?L_7yWfB z{?9JgxhdLMgEu|D?~cL1JZbhevp>b zVM7qlPoI9tQ6+PH+cF1V<&E$o>I9z>vb;_R59nzDOoQsH5vv#A7UcyNjTy|V$F0 zIVz+Yz>rBWurR8Wu|lJ%Kg^h(AsY7(k-A2s&~y$N$0lTPeHx+aXouh0LmW}Nff%TkdItTV3CjdM(n%{gv|vmC(pm8|WVyC1>cb*QlL$cMFi`-#K<&K%U*8H>v6+f2>D_61 zPGvLXJsKmXW5_UTPLhlwh@`UDtUI2D`a%auIxPr>6GDbSWS-K5v<{U@D(uy0y=Jn4 zHm;kl^HWyuE8{K1d&2Ys1eb0SS2Jd?`jvu!Gd+ea%CfxHL8WcBKwpNkCcg0{It>B( z1ZcCfvsx?VZz+Sa^gry=-?h9keqo%3KIkW|TMFt{R8XUSIP%J!CqS_NBOuQxl6wMa z{Gh4p){f<-fzRr{Y8v>WG2b+>Tr=?OVO`r(R1+jjl7@|`j(J-g&gu7|mDWTy|GG6e-jb_b86PnJ9Mzgu^xK(;u?iY5J#B{wN zOQV&)PNRh9dwP0G#%_42MYVmvb(FH70rH&MtjT!>f6eX5b9)|lMpilxLtjxTUs54pf{@Yp>L%<5}=iZDp9rbg~_u~mkCKG*60 zrl0mQy&iPiQ{T%ox7#t$Fph>do9=jAQpI@OWb~|VZeEvjA{7se&>X7KJYae+7@2Iu z!n$=;5KCvvIA{fuMqR+FF0^;(=v}(k^WH^~l&Tp_%wSoPjiOsApA}2(>o1Xpkkcch z<%}1npBe>KjTVy{PYKl{RQadm6x2&z9sYSJWH_N3zeCyye*FX1}+_);c$@?nI3pvjdl+ z4_ME#_dtO?xVp)S34X+e|H_7nZ98X=Tz>z9_X}*xYS4)XVZP^qZ_{#J$I?i_x2M?A zxy&^eIR0r(D?Wo)yAgI@4tx+;LCty8yjZ*3)^!iP{cLp#Bd!kYh!0uE9K6qV7u_{< zqMJ_m_uaa1ON8TB*n@fY;5YRC-QTR%mp2h??Go>^5?vv" - "Flask API Server: http://127.0.0.1:5000/data  " - ) - self.statusBar().addPermanentWidget(self.link_label) - - # Resize - self.resize(1200, 800) - - def _build_graph_context_menu(self, custom_nodes_by_category): - """ - Build context menu and apply custom stylesheet for the 'blue-ish' highlight. - """ - graph_context_menu = self.graph.get_context_menu("graph") - menu_stylesheet = """ - QMenu { - background-color: rgb(30, 30, 30); - border: 1px solid rgba(200, 200, 200, 60); - } - QMenu::item { - padding: 5px 18px 2px; - background-color: transparent; - } - QMenu::item:selected { - color: rgb(255, 255, 255); - background-color: rgba(60, 120, 180, 150); - } - QMenu::separator { - height: 1px; - background: rgba(255, 255, 255, 50); - margin: 4px 8px; - } - """ - if graph_context_menu and graph_context_menu.qmenu: - graph_context_menu.qmenu.setStyleSheet(menu_stylesheet) - - add_nodes_menu = graph_context_menu.add_menu("Add Nodes") - if add_nodes_menu and add_nodes_menu.qmenu: - add_nodes_menu.qmenu.setStyleSheet(menu_stylesheet) - - for category, node_classes in custom_nodes_by_category.items(): - category_menu = add_nodes_menu.add_menu(category) - if category_menu and category_menu.qmenu: - category_menu.qmenu.setStyleSheet(menu_stylesheet) - - for node_class in node_classes: - node_type = f"{node_class.__identifier__}.{node_class.__name__}" - node_name = node_class.NODE_NAME - category_menu.add_command( - node_name, - make_node_command(self.graph, node_type) - ) - - graph_context_menu.add_command( - "Remove Selected Node", - lambda: [self.graph.remove_node(node) - for node in self.graph.selected_nodes()] - if self.graph.selected_nodes() else None - ) - - def _build_menubar(self): - menubar = self.menuBar() - - # Workflows menu - workflows_menu = menubar.addMenu("Workflows") - - load_action = QtWidgets.QAction("Load Workflow", self) - load_action.triggered.connect(lambda: load_workflow(self.graph)) - workflows_menu.addAction(load_action) - - save_action = QtWidgets.QAction("Save Workflow", self) - save_action.triggered.connect(lambda: save_workflow(self.graph)) - workflows_menu.addAction(save_action) - - close_action = QtWidgets.QAction("Close Workflow", self) - close_action.triggered.connect(lambda: close_workflow(self.graph)) - workflows_menu.addAction(close_action) - - # About menu - about_menu = menubar.addMenu("About") - - gitea_action = QtWidgets.QAction("Gitea Project", self) - gitea_action.triggered.connect(self._open_gitea_project) - about_menu.addAction(gitea_action) - - credits_action = QtWidgets.QAction("Credits", self) - credits_action.triggered.connect(self._show_credits_popup) - about_menu.addAction(credits_action) - - updates_action = QtWidgets.QAction("Check for Updates", self) - updates_action.triggered.connect(self._show_updates_popup) - about_menu.addAction(updates_action) - - def _open_gitea_project(self): - url = QtCore.QUrl("https://git.bunny-lab.io/Scripts/Project_Borealis") - QtGui.QDesktopServices.openUrl(url) - - def _show_credits_popup(self): - QtWidgets.QMessageBox.information( - self, - "Credits", - "Created by Nicole Rappe" - ) - - def _show_updates_popup(self): - QtWidgets.QMessageBox.information( - self, - "Check for Updates", - "Built-in update functionality has not been built yet, but it's on the roadmap. Stay tuned." - ) - - -def main(): - app = QtWidgets.QApplication(sys.argv) - window = BorealisWindow() - window.show() - sys.exit(app.exec_()) +def load_workflow(graph: NodeGraph): + """ + Loads a workflow (including node values, connections, positions, etc.) from a specified JSON file. + """ + ensure_workflows_folder() + file_filter = "JSON Files (*.json);;All Files (*.*)" + dlg = FileDialog.getOpenFileName(None, "Load Workflow", os.path.join("Workflows", ""), file_filter) + file_path = dlg[0] + if not file_path: + return # User canceled + try: + graph.load_session(file_path) + print(f"Workflow loaded from {file_path}") + except Exception as e: + QtWidgets.QMessageBox.critical(None, "Error Loading Workflow", str(e)) if __name__ == "__main__": - main() + app = QtWidgets.QApplication([]) + + # Start Flask API Server + data_manager.start_api_server() + + # Create the NodeGraph + graph = NodeGraph() + graph.widget.setWindowTitle("Project Borealis - Workflow Automation System") + + # Dynamically import custom node classes from the 'Nodes' package. + custom_nodes_by_category = import_nodes_from_folder("Nodes") + + # Register each node in its category + for category, node_classes in custom_nodes_by_category.items(): + for node_class in node_classes: + graph.register_node(node_class) + + # Create categorized context menu + graph_context_menu = graph.get_context_menu("graph") + + for category, node_classes in custom_nodes_by_category.items(): + category_menu = graph_context_menu.add_menu(category) # Create submenu for category + for node_class in node_classes: + node_type = f"{node_class.__identifier__}.{node_class.__name__}" + node_name = node_class.NODE_NAME + category_menu.add_command( + f"Create: {node_name}", + make_node_command(graph, node_type) + ) + + # Add a "Remove Selected Node" command + graph_context_menu.add_command( + "Remove Selected Node", + lambda: [graph.remove_node(node) for node in graph.selected_nodes()] if graph.selected_nodes() else None + ) + + # Add workflow menu commands + workflow_menu = graph_context_menu.add_menu("Workflow") + workflow_menu.add_command("Load Workflow", lambda: load_workflow(graph)) + workflow_menu.add_command("Save Workflow", lambda: save_workflow(graph)) + workflow_menu.add_command("Close Workflow", lambda: close_workflow(graph)) + + # Grid styling changes + graph.set_background_color(20, 20, 20) # Dark gray + graph.set_grid_color(60, 60, 60) # Gray grid lines + + # Add gradient background + scene = graph.scene() + gradient = QtGui.QLinearGradient(0, 0, 0, 1) + gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode) + gradient.setColorAt(0.0, QtGui.QColor(9, 44, 68)) + gradient.setColorAt(0.3, QtGui.QColor(30, 30, 30)) + gradient.setColorAt(0.7, QtGui.QColor(30, 30, 30)) + gradient.setColorAt(1.0, QtGui.QColor(9, 44, 68)) + scene.setBackgroundBrush(QtGui.QBrush(gradient)) + + # Resize and show the graph widget + graph.widget.resize(1600, 900) + graph.widget.show() + + # Global update function + def global_update(): + for node in graph.all_nodes(): + if hasattr(node, "process_input"): + try: + node.process_input() + except Exception as e: + print("Error updating node", node, e) + + timer = QtCore.QTimer() + timer.timeout.connect(global_update) + timer.start(500) + + sys.exit(app.exec_())