Added invert widget

This commit is contained in:
2025-08-01 14:54:29 +02:00
parent 679b47262a
commit af4371ebe4
8 changed files with 121 additions and 10 deletions

View File

@ -5,7 +5,6 @@ import importlib
import inspect
import sys
from pathlib import Path
from importlib.machinery import SourceFileLoader
from .event_bus import EventBus
from .image_pipeline import ImagePipeline
@ -59,6 +58,7 @@ class EditorManager:
ModuleBaseWidget
and issubclass(cls, ModuleBaseWidget)
and cls is not ModuleBaseWidget
and cls.register
):
logging.info(
f" -> Found and registered widget: {name}")

View File

@ -9,6 +9,7 @@ if TYPE_CHECKING:
class BaseWidget:
name: str = "BaseWidget"
register: bool = False
def __init__(self, manager: "EditorManager", logger: logging.Logger):
self.manager = manager

View File

@ -0,0 +1,25 @@
import dearpygui.dearpygui as dpg
import numpy as np
from .pipeline_stage_widget import PipelineStageWidget
class InvertStage(PipelineStageWidget):
name = "Invert Image"
register = True
def __init__(self, manager, logger):
super().__init__(manager, logger)
self.stage_out = "inverted_image"
def create_content(self):
dpg.add_button(label="Invert", callback=lambda s, a, u: self._do_invert())
def on_stage(self, img):
self._do_invert()
def _do_invert(self):
if self.img is None:
return
inverted = self.img.copy()
inverted[...,:3] = 1.0 - inverted[...,:3]
self.publish(inverted)

View File

@ -7,6 +7,7 @@ from .base_widget import BaseWidget
class OpenImageWidget(BaseWidget):
name: str = "Open Image"
register = True
def __init__(self, manager, logger, stage_out="loaded_image"):
super().__init__(manager, logger)

View File

@ -0,0 +1,63 @@
import dearpygui.dearpygui as dpg
import numpy as np
from .base_widget import BaseWidget
class PipelineStageWidget(BaseWidget):
register = False
def __init__(self, manager, logger):
super().__init__(manager, logger)
self.stage_in = ""
self.stage_out = ""
self.img = None
self.manager.bus.subscribe(
"pipeline_stage", self._on_pipeline, main_thread=True
)
self.manager.bus.subscribe(
"pipeline_stages", self._on_stage_list, main_thread=True
)
def create(self):
with dpg.window(label=self.name, tag=self.window_tag, width=400, height=300):
# toprow: input / output
dpg.add_text("Configuration:")
self.combo = dpg.add_combo(
label="Stage In", items=[], callback=self._on_select
)
dpg.add_input_text(
label="Stage Out",
default_value=self.stage_out,
callback=lambda s, a, u: setattr(self, "stage_out", a),
)
dpg.add_separator()
# now let subclasses populate the rest
self.create_content()
def _on_select(self, sender, selected_stage):
self.stage_in = selected_stage
self.img = self.manager.pipeline.get_stage(selected_stage)
self.on_stage(self.img)
def update(self):
pass
def create_content(self):
raise NotImplementedError
def _on_pipeline(self, data):
name, img = data
if name == self.stage_in:
self.img = img
self.on_stage(img)
def _on_stage_list(self, stages):
self.stages = stages
dpg.configure_item(self.combo, items=stages)
def on_stage(self, img: np.ndarray):
pass
def publish(self, img: np.ndarray):
self.manager.pipeline.add_stage(self.stage_out, img)

View File

@ -6,6 +6,7 @@ from .base_widget import BaseWidget
class StageViewerWidget(BaseWidget):
name: str = "Image Stage Viewer"
register = True
def __init__(self, manager, logger):
super().__init__(manager, logger)