diff --git a/negstation/widgets/log_widget.py b/negstation/widgets/log_widget.py new file mode 100644 index 0000000..2006ac9 --- /dev/null +++ b/negstation/widgets/log_widget.py @@ -0,0 +1,53 @@ +import dearpygui.dearpygui as dpg +import logging +from .base_widget import BaseWidget + + +class DPGLogHandler(logging.Handler): + def __init__(self, callback): + super().__init__() + self.callback = callback + + def emit(self, record): + msg = self.format(record) + self.callback(msg) + + +class LogWindowWidget(BaseWidget): + name = "Log Window" + register = True + + def __init__(self, manager, logger): + super().__init__(manager, logger) + self.initialized = False + self.log_tag = dpg.generate_uuid() + self.log_lines = [] + + # Create and attach handler + self.handler = DPGLogHandler(self._on_log) + self.handler.setFormatter(logging.Formatter( + '%(asctime)s [%(levelname)s] %(message)s')) + self.logger.addHandler(self.handler) + + def create_content(self): + dpg.add_text("Live Log Output") + dpg.add_separator() + dpg.add_child_window(tag=self.log_tag, autosize_x=True, + autosize_y=True, horizontal_scrollbar=True) + self.initialized = True + + def _on_log(self, msg: str): + self.log_lines.append(msg) + if self.initialized: + dpg.add_text(msg, parent=self.log_tag) + dpg.set_y_scroll(self.log_tag, dpg.get_y_scroll_max(self.log_tag)) + + def on_resize(self, width: int, height: int): + # Optional: could resize child window here if needed + pass + + def _on_window_close(self): + if self.initialized: + self.logger.removeHandler(self.handler) + self.handler = None + super()._on_window_close() diff --git a/negstation/widgets/open_raw_widget.py b/negstation/widgets/open_raw_widget.py index 173290e..bc4c5bd 100644 --- a/negstation/widgets/open_raw_widget.py +++ b/negstation/widgets/open_raw_widget.py @@ -39,6 +39,9 @@ class OpenRawWidget(PipelineStageWidget): "four_color_rgb": False, } + def get_config(self): + return {} + def create_pipeline_stage_content(self): with dpg.file_dialog( directory_selector=False, @@ -140,7 +143,7 @@ class OpenRawWidget(PipelineStageWidget): "four_color_rgb", a) ) - with dpg.group(tag=self.busy_group): + with dpg.group(tag=self.busy_group, show=False): dpg.add_text("Processing...") def _on_open_file(self): diff --git a/negstation_layout.ini b/negstation_layout.ini index bde30e1..400a68f 100644 --- a/negstation_layout.ini +++ b/negstation_layout.ini @@ -3,169 +3,129 @@ Pos=0,19 Size=800,581 Collapsed=0 +[Window][###33] +Pos=301,400 +Size=499,200 +Collapsed=0 +DockId=0x00000002,0 + +[Window][###39] +Pos=0,19 +Size=299,86 +Collapsed=0 +DockId=0x00000007,0 + +[Window][###51] +Pos=0,19 +Size=244,474 +Collapsed=0 +DockId=0x00000014,1 + +[Window][###59] +Pos=0,494 +Size=299,106 +Collapsed=0 +DockId=0x00000006,0 + +[Window][###67] +Pos=0,107 +Size=299,385 +Collapsed=0 +DockId=0x00000008,0 + [Window][Debug##Default] Pos=60,60 Size=400,400 Collapsed=0 -[Window][###28] -Pos=0,19 -Size=299,379 -Collapsed=0 -DockId=0x00000003,0 - -[Window][###27] -Pos=0,19 -Size=300,200 -Collapsed=0 - -[Window][###34] -Pos=0,480 -Size=250,120 -Collapsed=0 -DockId=0x00000010,0 - -[Window][###33] -Pos=0,445 -Size=250,383 +[Window][###57] +Pos=0,120 +Size=196,373 Collapsed=0 DockId=0x0000000E,0 -[Window][###37] -Pos=0,400 -Size=299,200 -Collapsed=0 -DockId=0x00000004,0 - -[Window][###22] -Pos=0,19 -Size=288,427 -Collapsed=0 -DockId=0x00000007,0 - -[Window][###31] -Pos=0,448 -Size=288,152 -Collapsed=0 -DockId=0x00000008,0 - [Window][###23] Pos=0,19 -Size=305,85 +Size=244,474 Collapsed=0 -DockId=0x00000021,0 +DockId=0x00000014,0 -[Window][###32] -Pos=0,376 -Size=250,224 +[Window][###29] +Pos=0,19 +Size=244,423 +Collapsed=0 +DockId=0x00000012,0 + +[Window][###41] +Pos=198,19 +Size=602,425 +Collapsed=0 +DockId=0x00000011,0 + +[Window][###49] +Pos=0,495 +Size=196,105 Collapsed=0 DockId=0x0000000C,0 -[Window][###46] -Pos=252,19 -Size=569,605 -Collapsed=0 -DockId=0x00000002,0 - -[Window][###39] -Pos=252,19 -Size=663,581 -Collapsed=0 -DockId=0x00000002,0 - -[Window][###53] -Pos=252,19 -Size=548,581 -Collapsed=0 -DockId=0x00000002,0 - -[Window][###41] -Pos=252,19 -Size=857,809 -Collapsed=0 -DockId=0x00000002,0 - [Window][###42] -Pos=252,19 -Size=548,581 +Pos=246,19 +Size=554,379 Collapsed=0 -DockId=0x00000002,0 +DockId=0x00000011,0 -[Window][###57] -Pos=0,400 -Size=250,200 +[Window][###60] +Pos=0,19 +Size=244,423 Collapsed=0 -DockId=0x00000018,0 +DockId=0x00000012,1 -[Window][###65] -Pos=0,400 -Size=250,200 +[Window][###107] +Pos=246,400 +Size=554,200 Collapsed=0 DockId=0x00000016,0 -[Window][###73] -Pos=237,120 -Size=300,200 +[Window][###35] +Pos=246,19 +Size=554,425 Collapsed=0 +DockId=0x00000011,0 [Window][###43] -Pos=307,19 -Size=493,581 +Pos=0,495 +Size=244,105 Collapsed=0 -DockId=0x00000002,0 +DockId=0x00000015,0 -[Window][###35] -Pos=0,500 -Size=305,100 +[Window][###81] +Pos=246,446 +Size=554,154 Collapsed=0 -DockId=0x0000001A,0 - -[Window][###60] -Pos=0,192 -Size=250,306 -Collapsed=0 -DockId=0x00000020,0 - -[Window][###51] -Pos=0,106 -Size=305,392 -Collapsed=0 -DockId=0x00000022,0 +DockId=0x00000010,0 [Docking][Data] -DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,19 Size=800,581 Split=X - DockNode ID=0x00000009 Parent=0x7C6B3D9B SizeRef=305,581 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000000B Parent=0x00000009 SizeRef=147,355 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000000D Parent=0x0000000B SizeRef=250,304 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000000F Parent=0x0000000D SizeRef=250,459 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000011 Parent=0x0000000F SizeRef=250,379 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000013 Parent=0x00000011 SizeRef=250,379 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000015 Parent=0x00000013 SizeRef=250,379 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000017 Parent=0x00000015 SizeRef=250,379 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000019 Parent=0x00000017 SizeRef=250,479 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000001B Parent=0x00000019 SizeRef=250,161 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000001D Parent=0x0000001B SizeRef=250,192 Split=Y Selected=0xD36850C8 - DockNode ID=0x0000001F Parent=0x0000001D SizeRef=250,171 Split=Y Selected=0xD36850C8 - DockNode ID=0x00000021 Parent=0x0000001F SizeRef=250,85 Selected=0xD36850C8 - DockNode ID=0x00000022 Parent=0x0000001F SizeRef=250,392 Selected=0xB4AD3310 - DockNode ID=0x00000020 Parent=0x0000001D SizeRef=250,306 Selected=0x0F59680E - DockNode ID=0x0000001E Parent=0x0000001B SizeRef=250,285 Selected=0x0F59680E - DockNode ID=0x0000001C Parent=0x00000019 SizeRef=250,316 Selected=0x0F59680E - DockNode ID=0x0000001A Parent=0x00000017 SizeRef=250,100 Selected=0x977476CD - DockNode ID=0x00000018 Parent=0x00000015 SizeRef=250,200 Selected=0x3BEDC6B0 - DockNode ID=0x00000016 Parent=0x00000013 SizeRef=250,200 Selected=0xC7B9E77E - DockNode ID=0x00000014 Parent=0x00000011 SizeRef=250,200 Selected=0x3BEDC6B0 - DockNode ID=0x00000012 Parent=0x0000000F SizeRef=250,200 Selected=0x83A5C17B - DockNode ID=0x00000010 Parent=0x0000000D SizeRef=250,120 Selected=0xAA145F7D - DockNode ID=0x0000000E Parent=0x0000000B SizeRef=250,275 Selected=0x1834836D - DockNode ID=0x0000000C Parent=0x00000009 SizeRef=147,224 Selected=0x2554AADD - DockNode ID=0x0000000A Parent=0x7C6B3D9B SizeRef=493,581 Split=X - DockNode ID=0x00000005 Parent=0x0000000A SizeRef=288,581 Split=Y Selected=0xEE087978 - DockNode ID=0x00000007 Parent=0x00000005 SizeRef=147,427 Selected=0xEE087978 - DockNode ID=0x00000008 Parent=0x00000005 SizeRef=147,152 Selected=0x62F4D00D - DockNode ID=0x00000006 Parent=0x0000000A SizeRef=510,581 Split=X - DockNode ID=0x00000001 Parent=0x00000006 SizeRef=299,581 Split=Y Selected=0xA4B861D9 - DockNode ID=0x00000003 Parent=0x00000001 SizeRef=299,379 Selected=0xA4B861D9 - DockNode ID=0x00000004 Parent=0x00000001 SizeRef=299,200 Selected=0xEDB425AD - DockNode ID=0x00000002 Parent=0x00000006 SizeRef=499,581 CentralNode=1 Selected=0x0531B3D5 +DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,19 Size=800,581 Split=X + DockNode ID=0x00000009 Parent=0x7C6B3D9B SizeRef=244,581 Split=Y Selected=0x3BEDC6B0 + DockNode ID=0x0000000B Parent=0x00000009 SizeRef=196,474 Split=Y Selected=0x3BEDC6B0 + DockNode ID=0x0000000D Parent=0x0000000B SizeRef=196,99 Split=Y Selected=0x99D84869 + DockNode ID=0x00000012 Parent=0x0000000D SizeRef=196,423 Selected=0x0F59680E + DockNode ID=0x00000013 Parent=0x0000000D SizeRef=196,156 Split=Y Selected=0xB4AD3310 + DockNode ID=0x00000014 Parent=0x00000013 SizeRef=244,474 Selected=0xB4AD3310 + DockNode ID=0x00000015 Parent=0x00000013 SizeRef=244,105 Selected=0x0531B3D5 + DockNode ID=0x0000000E Parent=0x0000000B SizeRef=196,373 Selected=0x3BEDC6B0 + DockNode ID=0x0000000C Parent=0x00000009 SizeRef=196,105 Selected=0x4F81AB74 + DockNode ID=0x0000000A Parent=0x7C6B3D9B SizeRef=554,581 Split=X + DockNode ID=0x00000003 Parent=0x0000000A SizeRef=299,581 Split=Y Selected=0x52849BCC + DockNode ID=0x00000005 Parent=0x00000003 SizeRef=299,473 Split=Y Selected=0x52849BCC + DockNode ID=0x00000007 Parent=0x00000005 SizeRef=299,86 Selected=0x52849BCC + DockNode ID=0x00000008 Parent=0x00000005 SizeRef=299,385 Selected=0xBD79B41E + DockNode ID=0x00000006 Parent=0x00000003 SizeRef=299,106 Selected=0x84DD78D1 + DockNode ID=0x00000004 Parent=0x0000000A SizeRef=499,581 Split=Y + DockNode ID=0x00000001 Parent=0x00000004 SizeRef=800,379 Split=Y Selected=0x7FF1E0B5 + DockNode ID=0x0000000F Parent=0x00000001 SizeRef=602,425 Split=Y Selected=0x38519A65 + DockNode ID=0x00000011 Parent=0x0000000F SizeRef=554,379 CentralNode=1 Selected=0x977476CD + DockNode ID=0x00000016 Parent=0x0000000F SizeRef=554,200 Selected=0x3A881EEF + DockNode ID=0x00000010 Parent=0x00000001 SizeRef=602,154 Selected=0x083320CE + DockNode ID=0x00000002 Parent=0x00000004 SizeRef=800,200 Selected=0x1834836D diff --git a/negstation_widgets.json b/negstation_widgets.json index 8c7b7d7..d6213dc 100644 --- a/negstation_widgets.json +++ b/negstation_widgets.json @@ -3,16 +3,20 @@ "widget_type": "OpenImageWidget", "config": {} }, - { - "widget_type": "InvertStage", - "config": {} - }, { "widget_type": "PipelineStageViewer", "config": {} }, + { + "widget_type": "InvertStage", + "config": {} + }, { "widget_type": "OpenRawWidget", "config": {} + }, + { + "widget_type": "LogWindowWidget", + "config": {} } ] \ No newline at end of file