Spaces:
Running
Running
| import __main__ | |
| BaseNode = __main__.BaseNode | |
| QtGui = __main__.QtGui | |
| import cv2 | |
| import numpy as np | |
| class ButtonNode(BaseNode): | |
| """ | |
| A simple clickable button node. | |
| """ | |
| NODE_CATEGORY = "Input" | |
| NODE_COLOR = QtGui.QColor(200, 200, 100) | |
| def __init__(self, label="Button", mode="Toggle"): | |
| super().__init__() | |
| self.node_title = "Button" | |
| self.label = str(label) | |
| self.mode = str(mode) # "Toggle" or "Hold" | |
| self.inputs = {} | |
| self.outputs = {'signal_out': 'signal'} | |
| self.is_pressed = False | |
| self.value = 0.0 | |
| def get_output(self, port_name): | |
| if port_name == 'signal_out': | |
| return self.value | |
| return None | |
| def step(self): | |
| if self.mode == "Hold": | |
| self.value = 1.0 if self.is_pressed else 0.0 | |
| # For "Toggle", value is changed in mousePressEvent | |
| def mousePressEvent(self, event): | |
| self.is_pressed = True | |
| if self.mode == "Toggle": | |
| self.value = 1.0 - self.value # Flip | |
| self.update_display() | |
| def mouseReleaseEvent(self, event): | |
| self.is_pressed = False | |
| self.update_display() | |
| def get_display_image(self): | |
| w, h = 256, 128 | |
| img = np.zeros((h, w, 3), dtype=np.uint8) | |
| if self.value > 0.5: | |
| # Active state | |
| cv2.rectangle(img, (0, 0), (w-1, h-1), (0, 255, 0), -1) | |
| cv2.putText(img, self.label, (w//2 - 4*len(self.label), h//2), | |
| cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2) | |
| else: | |
| # Inactive state | |
| cv2.rectangle(img, (5, 5), (w-6, h-6), (100, 100, 100), -1) | |
| cv2.putText(img, self.label, (w//2 - 4*len(self.label), h//2), | |
| cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1) | |
| return QtGui.QImage(img.data, w, h, w*3, QtGui.QImage.Format.Format_RGB888) | |
| def get_config_options(self): | |
| return [ | |
| ("Label", "label", self.label, None), | |
| ("Mode", "mode", self.mode, ["Toggle", "Hold"]) | |
| ] |