Skip to content

Commit

Permalink
Improve handling of signals from main window
Browse files Browse the repository at this point in the history
Removes some unused code
  • Loading branch information
w4ffl35 committed Feb 1, 2024
1 parent eb6d7bf commit a73542c
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 128 deletions.
9 changes: 7 additions & 2 deletions src/airunner/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ class ServiceCode(Enum):
GET_PIPELINE_CLASSNAME = "get_pipeline_classname"
PIPELINE_ACTIONS = "pipeline_actions"
GET_PIPELINES = "get_pipelines"
LAYER_WIDGET = "layer_widget"
GET_LLM_WIDGET = "get_llm_widget"
DISPLAY_IMPORT_IMAGE_DIALOG = "display_import_image_dialog"
GET_SETTINGS_VALUE = "get_settings_value"
Expand Down Expand Up @@ -83,6 +82,11 @@ class SignalCode(Enum):
CANVAS_UPDATE_CURSOR = "canvas_update_cursor"
CANVAS_ZOOM_LEVEL_CHANGED = "zoom_level_changed"
CANVAS_CLEAR = "clear_canvas"
CANVAS_PASTE_IMAGE_SIGNAL = "canvas_paste_image_signal"
CANVAS_COPY_IMAGE_SIGNAL = "canvas_copy_image_signal"
CANVAS_CUT_IMAGE_SIGNAL = "canvas_cut_image_signal"
CANVAS_ROTATE_90_CLOCKWISE_SIGNAL = "canvas_rotate_90_clockwise_signal"
CANVAS_ROTATE_90_COUNTER_CLOCKWISE_SIGNAL = "canvas_rotate_90_counter_clockwise_signal"

CLEAR_MEMORY_SIGNAL = "clear_memory_signal"
CONTROLNET_IMAGE_GENERATED_SIGNAL = "controlnet_image_generated_signal"
Expand All @@ -107,6 +111,7 @@ class SignalCode(Enum):
LAYER_MOVE_UP_SIGNAL = "move_layer_up_signal"
LAYER_MOVE_DOWN_SIGNAL = "move_layer_down_signal"
LAYERS_SHOW_SIGNAL = "show_layers_signal"
LAYER_OPACITY_CHANGED_SIGNAL = "layers_layer_opacity_changed_signal"

# TODO: combine clear history signals - we have two by mistake
LLM_CLEAR_HISTORY = "llm_clear_history"
Expand Down Expand Up @@ -264,4 +269,4 @@ class LLMToolName(Enum):
TTS_DISABLE = "tts_disable"
VISION_PROCESS_IMAGES = "vision_process_images"
VISION_START_CAPTURE = "vision_start_capture"
VISION_STOP_CAPTURE = "vision_stop_capture"
VISION_STOP_CAPTURE = "vision_stop_capture"
27 changes: 21 additions & 6 deletions src/airunner/widgets/canvas_plus/canvas_plus_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ def __init__(self, *args, **kwargs):
SignalCode.CANVAS_UPDATE_SIGNAL: self.on_update_canvas_signal,
SignalCode.LAYER_SET_CURRENT_SIGNAL: self.on_set_current_layer_signal,
SignalCode.APPLICATION_SETTINGS_CHANGED_SIGNAL: self.on_application_settings_changed_signal,
SignalCode.CANVAS_CLEAR: self.on_canvas_clear_signal
SignalCode.CANVAS_CLEAR: self.on_canvas_clear_signal,
SignalCode.CANVAS_PASTE_IMAGE_SIGNAL: self.on_canvas_paste_image_signal,
SignalCode.CANVAS_COPY_IMAGE_SIGNAL: self.on_canvas_copy_image_signal,
SignalCode.CANVAS_CUT_IMAGE_SIGNAL: self.on_canvas_cut_image_signal,
SignalCode.CANVAS_ROTATE_90_CLOCKWISE_SIGNAL: self.on_canvas_rotate_90_clockwise_signal,
SignalCode.CANVAS_ROTATE_90_COUNTER_CLOCKWISE_SIGNAL: self.on_canvas_rotate_90_counter_clockwise_signal,
}

# Map service codes to class functions
Expand Down Expand Up @@ -137,15 +142,25 @@ def current_active_image(self):
def current_active_image(self, value):
self.add_image_to_current_layer(value)

@property
def layer_container_widget(self):
# TODO
return ServiceLocator.get(ServiceCode.LAYER_WIDGET)()

@property
def canvas_container(self):
return self.ui.canvas_container

def on_canvas_paste_image_signal(self, _event):
self.paste_image_from_clipboard()

def on_canvas_copy_image_signal(self, _event):
self.copy_image(ServiceLocator.get(ServiceCode.CURRENT_ACTIVE_IMAGE)())

def on_canvas_cut_image_signal(self, _event):
self.cut_image()

def on_canvas_rotate_90_clockwise_signal(self, _event):
self.rotate_90_clockwise()

def on_canvas_rotate_90_counter_clockwise_signal(self, _event):
self.rotate_90_counterclockwise()

def on_canvas_update_cursor_signal(self, event):
if self.settings["current_tool"] in ['brush', 'eraser']:
self.setCursor(CircleCursor(
Expand Down
8 changes: 8 additions & 0 deletions src/airunner/widgets/layers/layer_container_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ def __init__(self, *args, **kwargs):
self.selected_layers = {}
self.layers = []
self.current_layer_index = 0
self.signal_handlers = {
SignalCode.CANVAS_CLEAR: self.reset_layers,
SignalCode.LAYER_OPACITY_CHANGED_SIGNAL: self.set_layer_opacity,
}

def reset_layers(self):
self.clear_layers()
self.show_layers()

# def initialize(self):
# current_layer = self.get_service(ServiceCode.CURRENT_LAYER)()
Expand Down
137 changes: 17 additions & 120 deletions src/airunner/windows/main/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,30 +176,6 @@ def standard_image_panel(self):
def generator_tab_widget(self):
return self.ui.generator_widget

@property
def canvas_widget(self):
return self.standard_image_panel.canvas_widget

@property
def toolbar_widget(self):
return self.ui.toolbar_widget

@property
def prompt_builder(self):
return self.ui.prompt_builder

@property
def footer_widget(self):
return self.ui.footer_widget

@property
def generator_type(self):
"""
Returns stablediffusion
:return: string
"""
return self._generator_type

@property
def version(self):
if self._version is None:
Expand All @@ -216,8 +192,6 @@ def latest_version(self, val):

@property
def document_name(self):
# name = f"{self._document_name}{'*' if self.canvas and self.canvas_widget.is_dirty else ''}"
# return f"{name} - {self.version}"
return "Untitled"

@property
Expand All @@ -243,18 +217,6 @@ def handle_button_clicked(self, kwargs):
if action == "toggle_tool":
self.toggle_tool(kwargs["tool"])

@pyqtSlot(str, object)
def handle_changed_signal(self, key, value):
print("main_window: handle_changed_signal", key, value)
if key == "grid_settings.cell_size":
self.set_size_form_element_step_values()
elif key == "settings.line_color":
self.canvas_widget.update_grid_pen()
# elif key == "use_prompt_builder_checkbox":
# self.generator_tab_widget.toggle_all_prompt_builder_checkboxes(value)
elif key == "models":
self.model_manager.models_changed(key, value)

def show_layers(self):
self.emit(SignalCode.LAYERS_SHOW_SIGNAL)

Expand Down Expand Up @@ -293,15 +255,12 @@ def __init__(self, *args, **kwargs):

def register_services(self):
self.logger.info("Registering services")
ServiceLocator.register(ServiceCode.LAYER_WIDGET, lambda: self.ui.layer_widget)
ServiceLocator.register(ServiceCode.GET_LLM_WIDGET, lambda: self.ui.llm_widget)
ServiceLocator.register(ServiceCode.DISPLAY_IMPORT_IMAGE_DIALOG, self.display_import_image_dialog)
ServiceLocator.register(ServiceCode.GET_SETTINGS_VALUE, self.get_settings_value)
ServiceLocator.register(ServiceCode.GET_CALLBACK_FOR_SLIDER, self.get_callback_for_slider)

def register_signals(self):
# on window resize:
# self.windowStateChanged.connect(self.on_state_changed)
self.logger.info("Connecting signals")
self.register(SignalCode.VISION_DESCRIBE_IMAGE_SIGNAL, self.on_describe_image_signal)
self.register(SignalCode.SD_SAVE_PROMPT_SIGNAL, self.on_save_stablediffusion_prompt_signal)
Expand All @@ -313,8 +272,6 @@ def initialize_ui(self):
self.logger.info("Loading ui")
self.ui.setupUi(self)

# self.ui.layer_widget.initialize()

self.status_widget = StatusWidget()
self.statusBar().addPermanentWidget(self.status_widget)
self.emit(SignalCode.APPLICATION_CLEAR_STATUS_MESSAGE_SIGNAL)
Expand Down Expand Up @@ -355,26 +312,7 @@ def mode_tab_index_changed(self, index):
self.settings = settings

def layer_opacity_changed(self, attr_name, value=None, widget=None):
print("layer_opacity_changed", attr_name, value)
self.ui.layer_widget.set_layer_opacity(value)

def quick_export(self):
if os.path.isdir(self.image_path) is False:
self.choose_image_export_path()
if os.path.isdir(self.image_path) is False:
return
path, image = auto_export_image(
self.base_path,
self.settings["path_settings"]["image_path"],
self.settings["image_export_type"],
self.ui.layer_widget.current_layer.image_data.image,
seed=self.seed
)
if path is not None:
self.emit(
SignalCode.APPLICATION_STATUS_INFO_SIGNAL,
f"Image exported to {path}"
)
self.emit(SignalCode.LAYER_OPACITY_CHANGED_SIGNAL, value)

"""
Slot functions
Expand All @@ -387,7 +325,7 @@ def action_new_document_triggered(self):
self.emit(SignalCode.CANVAS_CLEAR)

def action_quick_export_image_triggered(self):
self.quick_export()
print("TODO: remove this")

def action_export_image_triggered(self):
self.export_image()
Expand Down Expand Up @@ -415,23 +353,33 @@ def action_redo_triggered(self):

def action_paste_image_triggered(self):
if self.settings["mode"] == Mode.IMAGE.value:
self.canvas_widget.paste_image_from_clipboard()
self.emit(
SignalCode.CANVAS_PASTE_IMAGE_SIGNAL
)

def action_copy_image_triggered(self):
if self.settings["mode"] == Mode.IMAGE.value:
self.canvas_widget.copy_image(ServiceLocator.get(ServiceCode.CURRENT_ACTIVE_IMAGE)())
self.emit(
SignalCode.CANVAS_COPY_IMAGE_SIGNAL
)

def action_cut_image_triggered(self):
if self.settings["mode"] == Mode.IMAGE.value:
self.canvas_widget.cut_image()
self.emit(
SignalCode.CANVAS_CUT_IMAGE_SIGNAL
)

def action_rotate_90_clockwise_triggered(self):
if self.settings["mode"] == Mode.IMAGE.value:
self.canvas_widget.rotate_90_clockwise()
self.emit(
SignalCode.CANVAS_ROTATE_90_CLOCKWISE_SIGNAL
)

def action_rotate_90_counterclockwise_triggered(self):
if self.settings["mode"] == Mode.IMAGE.value:
self.canvas_widget.rotate_90_counterclockwise()
self.emit(
SignalCode.CANVAS_ROTATE_90_COUNTER_CLOCKWISE_SIGNAL
)

def action_show_prompt_browser_triggered(self):
self.show_prompt_browser()
Expand Down Expand Up @@ -553,41 +501,14 @@ def action_open_discord(self):
End slot functions
"""

def set_size_increment_levels(self):
size = self.settings["grid_settings"]["cell_size"]
self.ui.width_slider_widget.slider_single_step = size
self.ui.width_slider_widget.slider_tick_interval = size

self.ui.height_slider_widget.slider_single_step = size
self.ui.height_slider_widget.slider_tick_interval = size

self.canvas_widget.update()

def toggle_nsfw_filter(self):
# self.canvas_widget.update()
self.set_nsfw_filter_tooltip()

def set_nsfw_filter_tooltip(self):
self.ui.safety_checker_button.setToolTip(
f"Click to {'enable' if not self.settings['nsfw_filter'] else 'disable'} NSFW filter"
)

def dragmode_pressed(self):
# self.canvas_widget.is_canvas_drag_mode = True
pass

def dragmode_released(self):
# self.canvas_widget.is_canvas_drag_mode = False
pass

def shift_pressed(self):
# self.canvas_widget.shift_is_pressed = True
pass

def shift_released(self):
# self.canvas_widget.shift_is_pressed = False
pass

def toggle_fullscreen(self):
if self.isFullScreen():
self.showNormal()
Expand Down Expand Up @@ -763,12 +684,6 @@ def show_update_message(self):
def show_update_popup(self):
self.update_popup = UpdateWindow()

def on_state_changed(self, state):
if state == Qt.ApplicationState.ApplicationActive:
self.canvas_widget.pos_x = int(self.x() / 4)
self.canvas_widget.pos_y = int(self.y() / 2)
self.canvas_widget.update()

def refresh_styles(self):
self.set_stylesheet()

Expand Down Expand Up @@ -801,9 +716,6 @@ def showEvent(self, event):

self.initialize_window()
self.register(SignalCode.CONTROLNET_IMAGE_GENERATED_SIGNAL, self.on_controlnet_image_generated_signal)
self.initialize_mixins()
# self.header_widget.initialize()
# self.header_widget.set_size_increment_levels()
self.initialize_default_buttons()
try:
self.prompt_builder.process_prompt()
Expand Down Expand Up @@ -842,10 +754,6 @@ def toggle_tool(self, tool):
settings["current_tool"] = tool
self.settings = settings

def initialize_mixins(self):
#self.canvas = Canvas()
pass

def show_section(self, section):
section_lists = {
"center": [self.ui.center_tab.tabText(i) for i in range(self.ui.center_tab.count())],
Expand Down Expand Up @@ -963,13 +871,10 @@ def set_window_title(self):
self.setWindowTitle(f"AI Runner")

def new_document(self):
self.ui.layer_widget.clear_layers()
self.is_saved = False
self._document_name = "Untitled"
self.set_window_title()
self.current_filter = None
#self.canvas_widget.update()
self.ui.layer_widget.show_layers()

def handle_controlnet_image_generated(self, message):
self.controlnet_image = message["image"]
Expand All @@ -987,14 +892,6 @@ def post_process_images(self, images):
def handle_unknown(self, message):
self.logger.error(f"Unknown message code: {message}")

def set_size_form_element_step_values(self):
"""
This function is called when grid_size is changed in the settings.
:return:
"""
self.set_size_increment_levels()

def update(self):
self.standard_image_panel.update_thumbnails()

Expand Down

0 comments on commit a73542c

Please sign in to comment.