diff --git a/src/airunner/aihandler/engine.py b/src/airunner/aihandler/engine.py index aed93b0c2..d6264a274 100644 --- a/src/airunner/aihandler/engine.py +++ b/src/airunner/aihandler/engine.py @@ -104,9 +104,9 @@ def unload_llm(self): VRAM to keep the LLM loaded while using other models. """ - do_unload_model = self.settings_manager.unload_unused_model - do_move_to_cpu = not do_unload_model and self.settings_manager.move_unused_model_to_cpu - dtype = self.settings_manager.llm_generator_setting.dtype + do_unload_model = self.settings_manager.settings.unload_unused_model + do_move_to_cpu = not do_unload_model and self.settings_manager.settings.move_unused_model_to_cpu + dtype = self.settings_manager.llm_generator_settings.dtype if dtype in ["2bit", "4bit", "8bit"]: do_unload_model = True do_move_to_cpu = False diff --git a/src/airunner/aihandler/settings_manager.py b/src/airunner/aihandler/settings_manager.py deleted file mode 100644 index 6dc272a54..000000000 --- a/src/airunner/aihandler/settings_manager.py +++ /dev/null @@ -1,328 +0,0 @@ -from PyQt6.QtCore import QObject, pyqtSignal - -from airunner.aihandler.qtvar import StringVar, IntVar, BooleanVar, FloatVar, DictVar -from airunner.data.models import LLMGenerator, Settings, GeneratorSetting, AIModel, Pipeline, ControlnetModel, ImageFilter, \ - SavedPrompt, StandardImageWidgetSettings -from airunner.aihandler.logger import Logger as logger -from airunner.data.models import Document -from airunner.data.session_scope import session_scope, path_settings_scope - - -document = None -_app = None -variables = {} -variable_types = { - "VARCHAR": StringVar, - "INTEGER": IntVar, - "BOOLEAN": BooleanVar, - "FLOAT": FloatVar, - "JSON": DictVar, -} - - -class SettingsSignal(QObject): - _instances = {} - changed_signal = pyqtSignal(str, object, object) - - def __new__(cls): - if cls not in cls._instances: - cls._instances[cls] = super(SettingsSignal, cls).__new__(cls) - return cls._instances[cls] - - -class SettingsManager(QObject): - saved_signal = pyqtSignal() - changed_signal = SettingsSignal().changed_signal - - @property - def prompts(self): - """ - Return Prompt objects from the database - :return: - """ - with session_scope() as session: - return session.query(SavedPrompt).all() - - def create_saved_prompt(self, prompt, negative_prompt): - if prompt == "" and negative_prompt == "": - return - - saved_prompt = SavedPrompt( - prompt=prompt, - negative_prompt=negative_prompt - ) - with session_scope() as session: - session.add(saved_prompt) - self.changed_signal.emit("saved_prompt", saved_prompt, self) - - def delete_prompt(self, saved_prompt): - with session_scope() as session: - session.delete(saved_prompt) - self.save_and_emit("saved_prompt", saved_prompt) - self.changed_signal.emit("saved_prompt", saved_prompt, self) - - def save_and_emit(self, key, value): - self.changed_signal.emit(key, value, self) - - def available_models_by_category(self, category): - categories = [category] - if category in ["img2img", "txt2vid"]: - categories.append("txt2img") - with session_scope() as session: - return session.query(AIModel).filter( - AIModel.category.in_(categories), - AIModel.enabled.is_(True) - ).all() - - def set_model_enabled(self, key, model, enabled): - with session_scope() as session: - session.query(AIModel).filter_by( - name=model["name"], - path=model["path"], - branch=model["branch"], - version=model["version"], - category=model["category"] - ).update({"enabled": enabled == 2}) - self.save_settings() - - def available_pipeline_by_section(self, pipeline_action, version, category): - with session_scope() as session: - return session.query(Pipeline).filter_by( - category=category, - pipeline_action=pipeline_action, - version=version - ).first() - - def available_model_names(self, pipeline_action, category): - # returns a list of names of models - # that match the pipeline_action and category - with session_scope() as session: - names = [] - models = session.query(AIModel).filter_by( - pipeline_action=pipeline_action, - category=category, - enabled=True - ).all() - for model in models: - if model.name not in names: - names.append(model.name) - return names - - def add_model(self, model_data): - with session_scope() as session: - model = AIModel(**model_data) - session.add(model) - - def delete_model(self, model): - with session_scope() as session: - session.delete(model) - - def update_model(self, model): - with session_scope() as session: - session.add(model) - - def get_image_filter(self, name): - with session_scope() as session: - return session.query(ImageFilter).filter_by(name=name).first() - - def get_image_filters(self): - with session_scope() as session: - return session.query(ImageFilter).all() - - @property - def standard_image_widget_settings(self): - with session_scope() as session: - standard_image_widget_settings = session.query(StandardImageWidgetSettings).first() - if standard_image_widget_settings is None: - standard_image_widget_settings = StandardImageWidgetSettings() - session.add(standard_image_widget_settings) - return standard_image_widget_settings - - @property - def pipelines(self): - with session_scope() as session: - return session.query(Settings).all() - - @property - def models(self): - with session_scope() as session: - return session.query(AIModel).filter_by(enabled=True) - - def models_by_pipeline_action(self, pipeline_action): - return self.models.filter_by(pipeline_action=pipeline_action).all() - - @property - def controlnet_models(self): - with session_scope() as session: - return session.query(ControlnetModel).filter_by(enabled=True) - - def controlnet_model_by_name(self, name): - return self.controlnet_models.filter_by(name=name).first() - - @property - def pipeline_actions(self): - # return a list of unique pipeline_action properties from the AIModel table and - actions = [] - for model in self.models.all(): - if model.pipeline_action not in actions: - actions.append(model.pipeline_action) - return actions - - @property - def model_categories(self): - cateogires = [] - for model in self.models.all(): - if model.category not in cateogires: - cateogires.append(model.category) - return cateogires - - def get_pipeline_classname(self, pipeline_action, version, category): - try: - with session_scope() as session: - return session.query(Pipeline).filter_by( - category=category, - pipeline_action=pipeline_action, - version=version - ).first().classname - except AttributeError: - logger.error(f"Unable to find pipeline classname for {pipeline_action} {version} {category}") - return None - - @property - def model_versions(self): - versions = [] - for model in self.models.all(): - if model.version not in versions: - versions.append(model.version) - return versions - - @property - def current_prompt_generator_settings(self): - items = list(filter(lambda x: x.active, self.prompt_generator_settings)) - return items[0] if len(items) > 0 else None - - @property - def generator(self): - generator = self.find_generator(self.generator_section, self.generator_name) - if not generator: - logger.error(f"Unable to find generator {self.generator_section} {self.generator_name}") - return generator - - @property - def llm_generator_setting(self): - with session_scope() as session: - llm_generator = session.query(LLMGenerator).filter(LLMGenerator.name == self.current_llm_generator).first() - return llm_generator.generator_settings[0] - - _generator = None - - def find_generator(self, generator_section, generator_name): - # using sqlalchemy, query the document.settings.generator_settings column - # and find any with GeneratorSettings.section == self.generator_section and GeneratorSettings.generator_name == self.generator_name - # return the first result - with session_scope() as session: - if self.generator_settings_override_id: - generator_settings = session.query(GeneratorSetting).filter_by( - id=self.generator_settings_override_id - ).first() - else: - generator_settings = session.query(GeneratorSetting).filter_by( - is_preset=0 - ).first() - if generator_settings is None: - if not generator_section or generator_section == "" or not generator_name or generator_name == "": - return None - # generator_settings = GeneratorSetting( - # section=generator_section, - # generator_name=generator_name, - # is_preset=False - # ) - # session.add(generator_settings) - return generator_settings - - def __init__(self, app=None, *args, **kwargs): - global _app, document - self.can_save = True - - if app: - _app = app - document = _app.document - else: - with session_scope() as session: - document = session.query(Document).first() - - super().__init__(*args, **kwargs) - - _generator_section = None - _generator_name = None - - @property - def generator_section(self): - if self._generator_section: - return self._generator_section - return getattr(self, f"current_section_{self.current_tab}") - - @property - def generator_name(self): - if self._generator_name: - return self._generator_name - return self.current_tab - - @generator_section.setter - def generator_section(self, value): - self._generator_section = value - - @generator_name.setter - def generator_name(self, value): - self._generator_name = value - - def create_variable(self, name): - var_type = str(getattr(Settings, name).property.columns[0].type) - variables[name] = variable_types[var_type](_app, getattr(Settings, name).default.arg) - - def get_database_value(self, name): - return getattr(document.settings, name) - - def __getattr__(self, name): - with session_scope() as session: - session.add(document) - session.add(document.settings) - if document and hasattr(document.settings, name): - return getattr(document.settings, name) - return None - - def __setattr__(self, name, value): - if name in ["can_save", "generator_section", "generator_name", "_generator_section", "_generator_name"]: - super().__setattr__(name, value) - return - if document and hasattr(document.settings, name): - setattr(document.settings, name, value) - self.changed_signal.emit(name, value, self) - - def set_value(self, key, value): - keys = key.split('.') - obj = self - for k in keys[:-1]: # Traverse till second last key - obj = getattr(self, k) - setattr(obj, keys[-1], value) - self.save() - self.changed_signal.emit(key, value, self) - - def get_value(self, key): - keys = key.split('.') - obj = self - for k in keys: - try: - obj = getattr(obj, k) - except AttributeError: - logger.error(f"Unable to find key {key}") - return obj - - @property - def current_tab_action(self): - current_tab = self.current_tab - if current_tab == "stablediffusion": - return self.current_section_stablediffusion - - def save(self): - pass diff --git a/src/airunner/data/managers.py b/src/airunner/data/managers.py index 0da848ce3..32b264967 100644 --- a/src/airunner/data/managers.py +++ b/src/airunner/data/managers.py @@ -19,7 +19,8 @@ llm_generator_scope, llm_generator_settings_scope, canvas_settings_scope, - memory_settings_scope + memory_settings_scope, + metadata_settings_scope ) @@ -40,16 +41,14 @@ def get_property(self, name: str) -> str: except Exception as e: import traceback traceback.print_exc() - print(f"Error while getting property {name}: {e}") + Logger.error(f"Error while getting property {name}: {e}") value = None # Return None if there's an error return value def get_properties(self, name: str = None) -> Iterator[str]: try: - print(f"Scope function: {self.scope_function}") with self.scope_function() as objects: for object in objects: - print(f"Object: {object}, attributes: {dir(object)}") if name is None: yield object else: @@ -61,7 +60,7 @@ def get_properties(self, name: str = None) -> Iterator[str]: except Exception as e: import traceback traceback.print_exc() - print(f"Error while getting property {name}: {e}") + Logger.error(f"Error while getting property {name}: {e}") yield None # Yield None if there's an error def __getattr__(self, name): @@ -111,7 +110,27 @@ def __init__(self): self.llm_generator_settings = Modelmanager(llm_generator_settings_scope) self.canvas_settings = Modelmanager(canvas_settings_scope) self.memory_settings = Modelmanager(memory_settings_scope) + self.metadata_settings = Modelmanager(metadata_settings_scope) + @contextmanager + def available_pipeline_by_section(self, pipeline_action, version, category): + from airunner.data.models import Pipeline + with session_scope() as session: + pipelines = session.query(Pipeline).filter_by( + category=category, + pipeline_action=pipeline_action, + version=version + ).first() + yield pipelines + + @contextmanager + def model_by_name(self, name): + from airunner.data.models import AIModel + with session_scope() as session: + model = session.query(AIModel).options(joinedload('*')).filter( + AIModel.name.like(f"%{name}%") if name != "" else True).first() + yield model + @contextmanager def brushes(self): from airunner.data.models import Brush @@ -176,7 +195,6 @@ def get_value(self, key): return obj def set_value(self, key, value): - print(f"Setting value {key} to {value}") keys = key.split('.') obj = self for k in keys[:-1]: # Traverse till second last key @@ -185,5 +203,4 @@ def set_value(self, key, value): obj = object setattr(obj, keys[-1], value) - self.changed_signal.emit(key, value) - print(f"Emitted changed_signal with {key}, {value}") # Debug print statement \ No newline at end of file + self.changed_signal.emit(key, value) \ No newline at end of file diff --git a/src/airunner/data/session_scope.py b/src/airunner/data/session_scope.py index ea719443b..46c754704 100644 --- a/src/airunner/data/session_scope.py +++ b/src/airunner/data/session_scope.py @@ -131,4 +131,11 @@ def memory_settings_scope(): from airunner.data.models import MemorySettings with session_scope() as session: memory_settings = session.query(MemorySettings).options(joinedload('*')).first() - yield memory_settings \ No newline at end of file + yield memory_settings + +@contextmanager +def metadata_settings_scope(): + from airunner.data.models import MetadataSettings + with session_scope() as session: + metadata_settings = session.query(MetadataSettings).options(joinedload('*')).first() + yield metadata_settings \ No newline at end of file diff --git a/src/airunner/utils.py b/src/airunner/utils.py index 32734eb12..4b2f976d9 100644 --- a/src/airunner/utils.py +++ b/src/airunner/utils.py @@ -257,7 +257,7 @@ def prepare_metadata(data, index=0): from airunner.data.managers import SettingsManager settings_manager = SettingsManager() if not settings_manager.metadata_settings.export_metadata or \ - settings_manager.image_export_type != "png": + settings_manager.settings.image_export_type != "png": return None metadata = PngImagePlugin.PngInfo() options = data.get("options", {}) @@ -339,7 +339,7 @@ def auto_export_image( if not os.path.exists(path): os.makedirs(path) - extension = settings_manager.image_export_type + extension = settings_manager.settings.image_export_type if extension == "": extension = "png" extension = f".{extension}" diff --git a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py index 3271dd71f..d72c981f6 100644 --- a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py +++ b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py @@ -33,17 +33,19 @@ def __init__(self, widget, image, is_outpaint, image_root_point): self.image_root_point = image_root_point def run(self): - with session_scope() as session: - self.widget.current_active_image = self.image - if self.image_root_point is not None: - self.widget.current_layer.pos_x = self.image_root_point.x() - self.widget.current_layer.pos_y = self.image_root_point.y() - elif not self.is_outpaint: - self.widget.current_layer.pos_x = self.widget.active_grid_area_rect.x() - self.widget.current_layer.pos_y = self.widget.active_grid_area_rect.y() - session.add(self.widget.current_layer) - self.widget.do_draw() - self.finished.emit() + print("setting current_active_image") + self.widget.current_active_image = self.image + print("setting current_active_image 2") + # with self.widget.current_layer() as layer: + # if self.image_root_point is not None: + # layer.pos_x = self.image_root_point.x() + # layer.pos_y = self.image_root_point.y() + # elif not self.is_outpaint: + # layer.current_layer.pos_x = self.widget.active_grid_area_rect.x() + # layer.current_layer.pos_y = self.widget.active_grid_area_rect.y() + self.widget.do_draw() + print("setting current_active_image 3") + self.finished.emit() class DraggablePixmap(QGraphicsPixmapItem): @@ -273,18 +275,18 @@ def current_image(self): @property def image_pivot_point(self): - try: - return QPoint(self.current_layer.pivot_x, self.current_layer.pivot_y) - except Exception as e: - pass - return QPoint(0, 0) + with self.layer_container_widget.current_layer() as layer: + try: + return QPoint(layer.pivot_x, layer.pivot_y) + except Exception as e: + pass + return QPoint(0, 0) @image_pivot_point.setter def image_pivot_point(self, value): - with session_scope() as session: - session.add(self.current_layer) - self.current_layer.pivot_x = value.x() - self.current_layer.pivot_y = value.y() + with self.layer_container_widget.current_layer() as layer: + layer.pivot_x = value.x() + layer.pivot_y = value.y() @property def active_grid_area_selected(self): @@ -326,15 +328,13 @@ def active_grid_area_rect(self): @property def current_active_image(self): - return self.current_layer.image + with self.layer_container_widget.current_layer() as layer: + return layer.image @current_active_image.setter def current_active_image(self, value): - self.current_layer.image = value - - @property - def current_layer(self): - return self.layer_container_widget.current_layer + with self.layer_container_widget.current_layer() as layer: + layer.image = value @property def current_layer_index(self): @@ -483,59 +483,68 @@ def initialize(self): self.do_draw() def draw_layers(self): - for layer in self.layers: - image = layer.image - if image is None: - continue - - image = apply_opacity_to_image( - image, - layer.opacity / 100.0 - ) + print("draw layers") + with self.app.settings_manager.layers() as layers: + for layer in layers: + image = layer.image + print("layer image", image) + if image is None: + continue + + image = apply_opacity_to_image( + image, + layer.opacity / 100.0 + ) - if layer.id in self.layers: - if not layer.visible: - if self.layers[layer.id] in self.scene.items(): - self.scene.removeItem(self.layers[layer.id]) - elif layer.visible: - if not self.layers[layer.id] in self.scene.items(): - self.scene.addItem(self.layers[layer.id]) + if layer.id in self.layers: + if not layer.visible: + if self.layers[layer.id] in self.scene.items(): + self.scene.removeItem(self.layers[layer.id]) + elif layer.visible: + if not self.layers[layer.id] in self.scene.items(): + self.scene.addItem(self.layers[layer.id]) + self.layers[layer.id].pixmap.convertFromImage(ImageQt(image)) + continue + + draggable_pixmap = None + if layer.id in self.layers: self.layers[layer.id].pixmap.convertFromImage(ImageQt(image)) - continue - - draggable_pixmap = None - if layer.id in self.layers: - self.layers[layer.id].pixmap.convertFromImage(ImageQt(image)) - draggable_pixmap = self.layers[layer.id] - self.scene.removeItem(draggable_pixmap) - - if not draggable_pixmap: - draggable_pixmap = DraggablePixmap(self, QPixmap.fromImage(ImageQt(image))) - self.layers[layer.id] = draggable_pixmap - - if layer.visible: - self.scene.addItem(draggable_pixmap) - - pos = QPoint(layer.pos_x, layer.pos_y) - draggable_pixmap.setPos(QPointF( - self.app.settings_manager.canvas_settings.pos_x + pos.x(), - self.app.settings_manager.canvas_settings.pos_y + pos.y() - )) + draggable_pixmap = self.layers[layer.id] + self.scene.removeItem(draggable_pixmap) + + if not draggable_pixmap: + draggable_pixmap = DraggablePixmap(self, QPixmap.fromImage(ImageQt(image))) + self.layers[layer.id] = draggable_pixmap + + if layer.visible: + self.scene.addItem(draggable_pixmap) + + pos = QPoint(layer.pos_x, layer.pos_y) + draggable_pixmap.setPos(QPointF( + self.app.settings_manager.canvas_settings.pos_x + pos.x(), + self.app.settings_manager.canvas_settings.pos_y + pos.y() + )) + print("draw layers 2") def set_scene_rect(self): + print("set_scene_rect") self.scene.setSceneRect(0, 0, self.view_size.width(), self.view_size.height()) def draw_lines(self): + print("draw_lines") width_cells = math.ceil(self.view_size.width() / self.cell_size) height_cells = math.ceil(self.view_size.height() / self.cell_size) + print("draw_lines2") pen = QPen( QBrush(self.line_color), self.line_width, Qt.PenStyle.SolidLine ) + print("draw_lines3") if self.app.settings_manager.grid_settings.show_grid: + print("draw_lines4") # vertical lines h = self.view_size.height() + abs(self.app.settings_manager.canvas_settings.pos_y) % self.cell_size y = 0 @@ -549,11 +558,13 @@ def draw_lines(self): for i in range(height_cells): y = i * self.cell_size + self.app.settings_manager.canvas_settings.pos_y % self.cell_size self.scene.addLine(x, y, w, y, pen) + print("draw_lines6") def draw_active_grid_area_container(self): """ Draw a rectangle around the active grid area of """ + print("draw_active_grid_area_container") if not self.active_grid_area: self.active_grid_area = ActiveGridArea( parent=self, @@ -572,7 +583,9 @@ def action_button_clicked_focus(self): self.do_draw() def do_draw(self): + print("DO DRAW") if self.drawing or not self.initialized: + print("returning") return self.drawing = True self.view_size = self.view.viewport().size() @@ -606,6 +619,8 @@ def update_cursor(self): self.canvas_container.setCursor(QCursor(Qt.CursorShape.ArrowCursor)) def handle_image_data(self, data): + print("canvas plus widget handle image data") + print(data) options = data["data"]["options"] images = data["images"] outpaint_box_rect = options["outpaint_box_rect"] @@ -633,7 +648,8 @@ def handle_outpaint(self, outpaint_box_rect, outpainted_image, action=None): pivot_point = self.image_pivot_point root_point = QPoint(0, 0) - current_image_position = QPoint(self.current_layer.pos_x, self.current_layer.pos_y) + with self.layer_container_widget.current_layer() as layer: + current_image_position = QPoint(layer.pos_x, layer.pos_y) is_drawing_left = outpaint_box_rect.x() < current_image_position.x() is_drawing_right = outpaint_box_rect.x() > current_image_position.x() @@ -674,12 +690,14 @@ def handle_outpaint(self, outpaint_box_rect, outpainted_image, action=None): return new_image, image_root_point, image_pivot_point def load_image_from_path(self, image_path): + print("canvas_plus_widget load_image_from_path", image_path) if image_path is None or image_path == "": return image = Image.open(image_path) self.load_image_from_object(image) def load_image_from_object(self, image, is_outpaint=False, image_root_point=None): + print("load image from object") self.add_image_to_scene(image, is_outpaint=is_outpaint, image_root_point=image_root_point) def load_image(self, image_path): @@ -690,9 +708,10 @@ def load_image(self, image_path): self.add_image_to_scene(image) def current_draggable_pixmap(self): - index = self.current_layer_index + 1 - if index in self.layers: - return self.layers[index] + with self.layer_container_widget.current_layer() as layer: + index = layer + 1 + if index in self.layers: + return self.layers[index] def copy_image(self, image:Image=None) -> DraggablePixmap: pixmap = self.current_pixmap() if image is None else QPixmap.fromImage(ImageQt(image)) @@ -704,8 +723,9 @@ def cut_image(self): if not draggable_pixmap: return self.scene.removeItem(draggable_pixmap) - if self.current_layer.id in self.layers: - del self.layers[self.current_layer.id] + with self.layer_container_widget.current_layer() as layer: + if layer.id in self.layers: + del self.layers[layer.id] self.update() def delete_image(self): @@ -781,11 +801,13 @@ def switch_to_layer(self, layer_index): self.current_layer_index = layer_index def add_image_to_scene(self, image, is_outpaint=False, image_root_point=None): + print("add_image_to_scene") self.image_adder = ImageAdder(self, image, is_outpaint, image_root_point) self.image_adder.finished.connect(self.on_image_adder_finished) self.image_adder.start() def on_image_adder_finished(self): + print("on_image_adder_finished") pass def image_to_system_clipboard_windows(self, pixmap): diff --git a/src/airunner/widgets/canvas_plus/standard_base_widget.py b/src/airunner/widgets/canvas_plus/standard_base_widget.py index 821350fb2..ed303b793 100644 --- a/src/airunner/widgets/canvas_plus/standard_base_widget.py +++ b/src/airunner/widgets/canvas_plus/standard_base_widget.py @@ -11,6 +11,7 @@ def __init__(self, *args, **kwargs): self.app.load_image.connect(self.load_image_from_path) def handle_image_data(self, data): + print("standard base widget handle image data") pass def load_image_from_path(self, image_path): diff --git a/src/airunner/widgets/canvas_plus/standard_image_widget.py b/src/airunner/widgets/canvas_plus/standard_image_widget.py index 74289e359..c9f0177cb 100644 --- a/src/airunner/widgets/canvas_plus/standard_image_widget.py +++ b/src/airunner/widgets/canvas_plus/standard_image_widget.py @@ -14,6 +14,7 @@ from airunner.widgets.slider.slider_widget import SliderWidget from airunner.data.models import ActionScheduler, Pipeline from airunner.data.session_scope import session_scope +from airunner.aihandler.logger import Logger class StandardImageWidget(StandardBaseWidget): @@ -30,7 +31,10 @@ class StandardImageWidget(StandardBaseWidget): @property def image(self): if self._image is None: - self.image = self.app.canvas_widget.current_layer.image + try: + self.image = self.app.canvas_widget.current_layer.image + except Exception as e: + Logger.error(f"Error while getting image: {e}") return self._image @image.setter diff --git a/src/airunner/widgets/generator_form/generator_form_widget.py b/src/airunner/widgets/generator_form/generator_form_widget.py index ed89e717f..d0b6ce0fc 100644 --- a/src/airunner/widgets/generator_form/generator_form_widget.py +++ b/src/airunner/widgets/generator_form/generator_form_widget.py @@ -54,18 +54,15 @@ def is_txt2vid(self): @property def generator_section(self): - return getattr(self.app.settings_manager, f"current_section_{self.app.settings_manager.current_image_generator}") + return self.app.settings_manager.settings.current_section_stablediffusion @property def generator_name(self): - return self.app.settings_manager.current_image_generator + return self.app.settings_manager.settings.current_image_generator @property def generator_settings(self): - return self.app.settings_manager.find_generator( - self.generator_section, - self.generator_name - ) + return self.app.settings_manager.generator_settings @property def random_seed(self): @@ -100,12 +97,12 @@ def image_scale(self): @property def active_rect(self): rect = QRect( - self.active_grid_settings.pos_x, - self.active_grid_settings.pos_y, - self.active_grid_settings.width, - self.active_grid_settings.height + self.app.settings_manager.active_grid_settings.pos_x, + self.app.settings_manager.active_grid_settings.pos_y, + self.app.settings_manager.active_grid_settings.width, + self.app.settings_manager.active_grid_settings.height ) - rect.translate(-self.canvas_settings.pos_x, -self.canvas_settings.pos_y) + rect.translate(-self.app.settings_manager.canvas_settings.pos_x, -self.app.settings_manager.canvas_settings.pos_y) return rect @@ -120,9 +117,6 @@ def controlnet_image(self): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.ui.generator_form_tabs.tabBar().hide() - with session_scope() as session: - self.active_grid_settings = session.query(ActiveGridSettings).first() - self.canvas_settings = session.query(CanvasSettings).first() self.activate_ai_mode() def activate_ai_mode(self): @@ -164,7 +158,6 @@ def action_clicked_button_save_prompts(self): ) def handle_prompt_changed(self): - print("PROMPT CHANGED") if not self.initialized: return self.app.settings_manager.set_value("generator.prompt", self.ui.prompt.toPlainText()) @@ -350,132 +343,130 @@ def do_generate(self, extra_options=None, seed=None, latents_seed=None, do_deter enable_controlnet = bool(override_data.get("enable_controlnet", self.app.settings_manager.generator.enable_controlnet)) controlnet = override_data.get("controlnet", self.app.settings_manager.generator.controlnet) controlnet_conditioning_scale = float(override_data.get("controlnet_conditioning_scale", self.app.settings_manager.generator.controlnet_guidance_scale)) - width = int(override_data.get("width", self.app.settings_manager.working_width)) - height = int(override_data.get("height", self.app.settings_manager.working_height)) + width = int(override_data.get("width", self.app.settings_manager.settings.working_width)) + height = int(override_data.get("height", self.app.settings_manager.settings.working_height)) clip_skip = int(override_data.get("clip_skip", self.app.settings_manager.generator.clip_skip)) batch_size = int(override_data.get("batch_size", 1)) # get the model from the database - model = self.app.settings_manager.models.filter_by( - name=model_data["name"] if "name" in model_data \ - else self.app.settings_manager.generator.model - ).first() - if model: - # set the model data, first using model_data pulled from the override_data - model_data = dict( - name=model_data.get("name", model.name), - path=model_data.get("path", model.path), - branch=model_data.get("branch", model.branch), - version=model_data.get("version", model.version), - category=model_data.get("category", model.category), - pipeline_action=model_data.get("pipeline_action", model.pipeline_action), - enabled=model_data.get("enabled", model.enabled), - default=model_data.get("default", model.is_default) - ) - - input_image = override_data.get("input_image", None), - if input_image: - # check if input image is a tupil - if isinstance(input_image, tuple): - input_image = input_image[0] - - original_model_data = {} - if input_image is not None: - if isinstance(input_image, tuple): - input_image_info = input_image[0].info - else: - input_image_info = input_image.info - - keys = [ - "name", - "path", - "branch", - "version", - "category", - "pipeline_action", - "enabled", - "default", - ] - original_model_data = { - key: model_data.get( - key, input_image_info.get(key, "")) for key in keys - } - - # get controlnet_dropdown from active tab - options = dict( - prompt=prompt, - negative_prompt=negative_prompt, - steps=steps, - ddim_eta=ddim_eta, # only applies to ddim scheduler - n_iter=n_iter, - n_samples=n_samples, - scale=scale, - seed=seed, - latents_seed=latents_seed, - model=model, - model_data=model_data, - original_model_data=original_model_data, - scheduler=scheduler, - model_path=model.path, - model_branch=model.branch, - # lora=self.available_lora(action), - generator_section=self.generator_section, - width=width, - height=height, - do_nsfw_filter=self.app.settings_manager.settings.nsfw_filter, - pos_x=0, - pos_y=0, - outpaint_box_rect=self.active_rect, - hf_token=self.app.settings_manager.hf_api_key, - model_base_path=self.app.settings_manager.path_settings.model_base_path, - outpaint_model_path=self.app.settings_manager.path_settings.outpaint_model_path, - pix2pix_model_path=self.app.settings_manager.path_settings.pix2pix_model_path, - depth2img_model_path=self.app.settings_manager.path_settings.depth2img_model_path, - upscale_model_path=self.app.settings_manager.path_settings.upscale_model_path, - image_path=self.app.settings_manager.path_settings.image_path, - lora_path=self.app.settings_manager.lora_path, - embeddings_path=self.app.settings_manager.path_settings.embeddings_path, - video_path=self.app.settings_manager.path_settings.video_path, - clip_skip=clip_skip, - batch_size=batch_size, - variation=self.app.settings_manager.generator.variation, - deterministic_generation=False, - input_image=input_image, - enable_controlnet=enable_controlnet, - controlnet_conditioning_scale=controlnet_conditioning_scale, - controlnet=controlnet, - ) - - if self.controlnet_image: - options["controlnet_image"] = self.controlnet_image - - if action == "superresolution": - options["original_image_width"] = self.app.canvas_widget.current_active_image_data.image.width - options["original_image_height"] = self.app.canvas_widget.current_active_image_data.image.height - - if action in ["txt2img", "img2img", "outpaint", "depth2img"]: - options[f"strength"] = strength - elif action in ["pix2pix"]: - options[f"image_guidance_scale"] = image_guidance_scale - - """ - Emitting generate_signal with options allows us to pass more options to the dict from - modal windows such as the image interpolation window. - """ - self.app.generate_signal.emit(options) + name = model_data["name"] if "name" in model_data else self.app.settings_manager.generator.model + with self.app.settings_manager.model_by_name(name) as model: + if model: + # set the model data, first using model_data pulled from the override_data + model_data = dict( + name=model_data.get("name", model.name), + path=model_data.get("path", model.path), + branch=model_data.get("branch", model.branch), + version=model_data.get("version", model.version), + category=model_data.get("category", model.category), + pipeline_action=model_data.get("pipeline_action", model.pipeline_action), + enabled=model_data.get("enabled", model.enabled), + default=model_data.get("default", model.is_default) + ) - memory_options = self.get_memory_options() + input_image = override_data.get("input_image", None), + if input_image: + # check if input image is a tupil + if isinstance(input_image, tuple): + input_image = input_image[0] + + original_model_data = {} + if input_image is not None: + if isinstance(input_image, tuple): + input_image_info = input_image[0].info + else: + input_image_info = input_image.info + + keys = [ + "name", + "path", + "branch", + "version", + "category", + "pipeline_action", + "enabled", + "default", + ] + original_model_data = { + key: model_data.get( + key, input_image_info.get(key, "")) for key in keys + } + + # get controlnet_dropdown from active tab + options = dict( + prompt=prompt, + negative_prompt=negative_prompt, + steps=steps, + ddim_eta=ddim_eta, # only applies to ddim scheduler + n_iter=n_iter, + n_samples=n_samples, + scale=scale, + seed=seed, + latents_seed=latents_seed, + model=model, + model_data=model_data, + original_model_data=original_model_data, + scheduler=scheduler, + model_path=model.path, + model_branch=model.branch, + # lora=self.available_lora(action), + generator_section=self.generator_section, + width=width, + height=height, + do_nsfw_filter=self.app.settings_manager.settings.nsfw_filter, + pos_x=0, + pos_y=0, + outpaint_box_rect=self.active_rect, + hf_token=self.app.settings_manager.settings.hf_api_key, + model_base_path=self.app.settings_manager.path_settings.model_base_path, + outpaint_model_path=self.app.settings_manager.path_settings.outpaint_model_path, + pix2pix_model_path=self.app.settings_manager.path_settings.pix2pix_model_path, + depth2img_model_path=self.app.settings_manager.path_settings.depth2img_model_path, + upscale_model_path=self.app.settings_manager.path_settings.upscale_model_path, + image_path=self.app.settings_manager.path_settings.image_path, + lora_path=self.app.settings_manager.path_settings.lora_path, + embeddings_path=self.app.settings_manager.path_settings.embeddings_path, + video_path=self.app.settings_manager.path_settings.video_path, + clip_skip=clip_skip, + batch_size=batch_size, + variation=self.app.settings_manager.generator.variation, + deterministic_generation=False, + input_image=input_image, + enable_controlnet=enable_controlnet, + controlnet_conditioning_scale=controlnet_conditioning_scale, + controlnet=controlnet, + ) - data = { - "action": action, - "options": { - **options, - **extra_options, - **memory_options - } - } - self.app.client.message = data + if self.controlnet_image: + options["controlnet_image"] = self.controlnet_image + + if action == "superresolution": + options["original_image_width"] = self.app.canvas_widget.current_active_image_data.image.width + options["original_image_height"] = self.app.canvas_widget.current_active_image_data.image.height + + if action in ["txt2img", "img2img", "outpaint", "depth2img"]: + options[f"strength"] = strength + elif action in ["pix2pix"]: + options[f"image_guidance_scale"] = image_guidance_scale + + """ + Emitting generate_signal with options allows us to pass more options to the dict from + modal windows such as the image interpolation window. + """ + self.app.generate_signal.emit(options) + + memory_options = self.get_memory_options() + + data = { + "action": action, + "options": { + **options, + **extra_options, + **memory_options + } + } + self.app.client.message = data def get_memory_options(self): return { diff --git a/src/airunner/widgets/llm/templates/llm_settings.ui b/src/airunner/widgets/llm/templates/llm_settings.ui index 3e2dacf4d..c21fc33d7 100644 --- a/src/airunner/widgets/llm/templates/llm_settings.ui +++ b/src/airunner/widgets/llm/templates/llm_settings.ui @@ -216,7 +216,7 @@ true - llm_generator.repetition_penalty + llm_generator_settings.repetition_penalty 0 @@ -262,7 +262,7 @@ false - llm_generator.min_length + llm_generator_settings.min_length 1 @@ -312,7 +312,7 @@ true - llm_generator.top_p + llm_generator_settings.top_p 1 @@ -358,7 +358,7 @@ false - llm_generator.max_length + llm_generator_settings.max_length 1 @@ -445,7 +445,7 @@ false - llm_generator.ngram_size + llm_generator_settings.ngram_size 1 @@ -491,7 +491,7 @@ true - llm_generator.temperature + llm_generator_settings.temperature 1 @@ -541,7 +541,7 @@ true - llm_generator.length_penalty + llm_generator_settings.length_penalty 1 @@ -587,7 +587,7 @@ false - llm_generator.num_beams + llm_generator_settings.num_beams 1 @@ -644,7 +644,7 @@ false - llm_generator.sequences + llm_generator_settings.sequences 1 @@ -690,7 +690,7 @@ false - llm_generator.top_k + llm_generator_settings.top_k 1 diff --git a/src/airunner/widgets/llm/templates/llm_settings_ui.py b/src/airunner/widgets/llm/templates/llm_settings_ui.py index d16ea205f..ff5c5d19c 100644 --- a/src/airunner/widgets/llm/templates/llm_settings_ui.py +++ b/src/airunner/widgets/llm/templates/llm_settings_ui.py @@ -371,38 +371,38 @@ def retranslateUi(self, llm_settings_widget): self.early_stopping.setText(_translate("llm_settings_widget", "Early stopping")) self.do_sample.setText(_translate("llm_settings_widget", "Do sample")) self.groupBox_11.setTitle(_translate("llm_settings_widget", "Repetition penalty")) - self.repetition_penalty.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.repetition_penalty")) + self.repetition_penalty.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.repetition_penalty")) self.repetition_penalty.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_16.setTitle(_translate("llm_settings_widget", "Min length")) - self.min_length.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.min_length")) + self.min_length.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.min_length")) self.min_length.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_20.setTitle(_translate("llm_settings_widget", "Top P")) - self.top_p.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.top_p")) + self.top_p.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.top_p")) self.top_p.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_21.setTitle(_translate("llm_settings_widget", "Max length")) - self.max_length.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.max_length")) + self.max_length.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.max_length")) self.max_length.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.leave_in_vram.setText(_translate("llm_settings_widget", "Leave in VRAM")) self.move_to_cpu.setText(_translate("llm_settings_widget", "Move to CPU")) self.unload_model.setText(_translate("llm_settings_widget", "Unload model")) self.label_3.setText(_translate("llm_settings_widget", "Model management")) self.groupBox_17.setTitle(_translate("llm_settings_widget", "No repeat ngram size")) - self.ngram_size.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.ngram_size")) + self.ngram_size.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.ngram_size")) self.ngram_size.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_18.setTitle(_translate("llm_settings_widget", "Temperature")) - self.temperature.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.temperature")) + self.temperature.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.temperature")) self.temperature.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_24.setTitle(_translate("llm_settings_widget", "Length penalty")) - self.length_penalty.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.length_penalty")) + self.length_penalty.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.length_penalty")) self.length_penalty.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_25.setTitle(_translate("llm_settings_widget", "Num beams")) - self.num_beams.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.num_beams")) + self.num_beams.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.num_beams")) self.num_beams.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_22.setTitle(_translate("llm_settings_widget", "Sequences to generate")) - self.sequences.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.sequences")) + self.sequences.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.sequences")) self.sequences.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.groupBox_23.setTitle(_translate("llm_settings_widget", "Top k")) - self.top_k.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator.top_k")) + self.top_k.setProperty("settings_property", _translate("llm_settings_widget", "llm_generator_settings.top_k")) self.top_k.setProperty("slider_callback", _translate("llm_settings_widget", "handle_value_change")) self.label_4.setText(_translate("llm_settings_widget", "How to treat model when not in use")) from airunner.widgets.slider.slider_widget import SliderWidget diff --git a/src/airunner/widgets/slider/slider_widget.py b/src/airunner/widgets/slider/slider_widget.py index d46fe0fa4..8829980dd 100644 --- a/src/airunner/widgets/slider/slider_widget.py +++ b/src/airunner/widgets/slider/slider_widget.py @@ -123,7 +123,6 @@ def initialize_properties(self, **kwargs): self.divide_by = self.property("divide_by") or 1.0 if settings_property is not None: - print("GET SETTINGS PROPERTY", settings_property) current_value = self.app.settings_manager.get_value(settings_property) or 0 # check if slider_callback is str @@ -169,7 +168,6 @@ def initialize_properties(self, **kwargs): self.ui.slider_spinbox.setDecimals(2 if decimals < 2 else decimals) def set_slider_and_spinbox_values(self, val): - print("VAL", val) self.ui.slider.blockSignals(True) self.ui.slider_spinbox.blockSignals(True) diff --git a/src/airunner/windows/main/main_window.py b/src/airunner/windows/main/main_window.py index 998573a82..0cbd38db2 100644 --- a/src/airunner/windows/main/main_window.py +++ b/src/airunner/windows/main/main_window.py @@ -60,6 +60,7 @@ def process(self): self.finished.emit() def process_image_data(self, message): + print("process_image_data 1") images = message["images"] data = message["data"] nsfw_content_detected = message["nsfw_content_detected"] @@ -314,8 +315,6 @@ def handle_changed_signal(self, key, value): self.refresh_lora() elif key == "path_settings.model_base_path": self.generator_tab_widget.refresh_model_list() - elif key == "generator.seed": - self.prompt_builder.process_prompt() # elif key == "use_prompt_builder_checkbox": # self.generator_tab_widget.toggle_all_prompt_builder_checkboxes(value) elif key == "models":