diff --git a/src/airunner/widgets/brush/brush_container_widget.py b/src/airunner/widgets/brush/brush_container_widget.py index c23ae65f3..629c56ea4 100644 --- a/src/airunner/widgets/brush/brush_container_widget.py +++ b/src/airunner/widgets/brush/brush_container_widget.py @@ -16,5 +16,5 @@ def brush(self): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.ui.brush_size_slider.setProperty("current_value", self.app.brush_size) + self.ui.brush_size_slider.setProperty("current_value", self.app.brush_settings["size"]) self.ui.brush_size_slider.initialize() diff --git a/src/airunner/widgets/brush/templates/brush_widget.ui b/src/airunner/widgets/brush/templates/brush_widget.ui index c5466d1a9..a6fe15788 100644 --- a/src/airunner/widgets/brush/templates/brush_widget.ui +++ b/src/airunner/widgets/brush/templates/brush_widget.ui @@ -47,7 +47,7 @@ Brush Size - action_slider_changed + handle_value_change brush_settings.size diff --git a/src/airunner/widgets/brush/templates/brush_widget_ui.py b/src/airunner/widgets/brush/templates/brush_widget_ui.py index f0b1efdc9..6652cc8c5 100644 --- a/src/airunner/widgets/brush/templates/brush_widget_ui.py +++ b/src/airunner/widgets/brush/templates/brush_widget_ui.py @@ -25,7 +25,7 @@ def setupUi(self, brush_widget): self.brush_size_slider.setProperty("slider_page_step", 10) self.brush_size_slider.setProperty("spinbox_single_step", 1) self.brush_size_slider.setProperty("spinbox_page_step", 10) - self.brush_size_slider.setProperty("slider_callback", "action_slider_changed") + self.brush_size_slider.setProperty("slider_callback", "handle_value_change") self.brush_size_slider.setProperty("settings_property", "brush_settings.size") self.brush_size_slider.setProperty("display_as_float", False) self.brush_size_slider.setObjectName("brush_size_slider") diff --git a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py index 4105dfcf7..b85f51c94 100644 --- a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py +++ b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py @@ -12,6 +12,8 @@ from PyQt6.QtCore import QThread, pyqtSignal from PyQt6.QtCore import QLineF from PyQt6.QtWidgets import QGraphicsItemGroup +from PyQt6.QtCore import QRectF, QSizeF +from PyQt6.QtGui import QPainterPath from airunner.aihandler.logger import Logger from airunner.cursors.circle_brush import CircleCursor @@ -197,24 +199,40 @@ def mouseReleaseEvent(self, event): class CustomScene(QGraphicsScene): def __init__(self, parent=None): + self.app = parent.app super().__init__(parent) - self.drawing = False - self.last_point = QPointF() + self.image = QImage(800, 600, QImage.Format.Format_ARGB32) + self.image.fill(Qt.GlobalColor.white) + self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image)) + self.addItem(self.item) + + def drawAt(self, position): + painter = QPainter(self.image) + print(self.app.brush_settings["size"]) + painter.setPen(QPen(Qt.GlobalColor.black, self.app.brush_settings["size"], Qt.PenStyle.SolidLine, Qt.PenCapStyle.RoundCap)) + painter.drawPoint(position) + painter.end() + self.item.setPixmap(QPixmap.fromImage(self.image)) + + def eraseAt(self, position): + painter = QPainter(self.image) + painter.setPen(QPen(Qt.GlobalColor.transparent, self.app.brush_settings["size"], Qt.PenStyle.SolidLine, Qt.PenCapStyle.RoundCap)) + painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Clear) + painter.drawPoint(position) + painter.end() + self.item.setPixmap(QPixmap.fromImage(self.image)) def mousePressEvent(self, event): - if event.button() == Qt.MouseButton.LeftButton: - self.drawing = True - self.last_point = event.scenePos() + if self.app.current_tool == "brush": + self.drawAt(event.scenePos()) + elif self.app.current_tool == "eraser": + self.eraseAt(event.scenePos()) def mouseMoveEvent(self, event): - if self.drawing: - new_point = event.scenePos() - self.addLine(QLineF(self.last_point, new_point), QPen(Qt.GlobalColor.red, 5)) - self.last_point = new_point - - def mouseReleaseEvent(self, event): - if event.button() == Qt.MouseButton.LeftButton: - self.drawing = False + if self.app.current_tool == "brush": + self.drawAt(event.scenePos()) + elif self.app.current_tool == "eraser": + self.eraseAt(event.scenePos()) class CanvasPlusWidget(CanvasBaseWidget): @@ -345,6 +363,12 @@ def __init__(self, *args, **kwargs): self.app.line_width_changed_signal.connect(self.line_width_changed) self.app.line_color_changed_signal.connect(self.line_color_changed) self.app.canvas_color_changed_signal.connect(self.canvas_color_changed) + self.app.window_resized_signal.connect(self.window_resized) + self.canvas_container.resizeEvent = self.window_resized + + def window_resized(self, event): + self.redraw_lines = True + self.do_draw() def toggle_grid(self, val): self.do_draw() @@ -457,7 +481,7 @@ def resizeEvent(self, event): def initialize(self): # Create a QGraphicsScene object - self.scene = CustomScene() + self.scene = CustomScene(parent=self) self.view = self.canvas_container original_mouse_event = self.view.mouseMoveEvent diff --git a/src/airunner/widgets/generator_form/generator_form_widget.py b/src/airunner/widgets/generator_form/generator_form_widget.py index 7cdff120e..fca0deb28 100644 --- a/src/airunner/widgets/generator_form/generator_form_widget.py +++ b/src/airunner/widgets/generator_form/generator_form_widget.py @@ -76,9 +76,9 @@ def latents_seed(self): @latents_seed.setter def latents_seed(self, val): - generator_settings = self.app.settings_manager.generator + generator_settings = self.app.generator_settings generator_settings["latents_seed"] = val - self.app.settings_manager.generator = generator_settings + self.app.generator_settings = generator_settings self.app.standard_image_panel.ui.seed_widget_latents.ui.lineEdit.setText(str(val)) @property @@ -87,9 +87,9 @@ def seed(self): @seed.setter def seed(self, val): - generator_settings = self.app.settings_manager.generator + generator_settings = self.app.generator_settings generator_settings["seed"] = val - self.app.settings_manager.generator = generator_settings + self.app.generator_settings = generator_settings self.app.standard_image_panel.ui.seed_widget.ui.lineEdit.setText(str(val)) @property diff --git a/src/airunner/widgets/seed/seed_widget.py b/src/airunner/widgets/seed/seed_widget.py index dc0ba1701..975a086bb 100644 --- a/src/airunner/widgets/seed/seed_widget.py +++ b/src/airunner/widgets/seed/seed_widget.py @@ -7,13 +7,6 @@ class SeedWidget(BaseWidget): widget_class_ = Ui_seed_widget name = "seed_widget" - # def initialize(self, generator_section, generator_name): - # self.ui.lineEdit.setText(str(self.seed)) - # self.app.settings_manager.generator_section = generator_section - # self.app.settings_manager.generator_name = generator_name - # self.ui.random_button.setChecked(self.app.generator_settings["random_seed"]) - # self.ui.lineEdit.setEnabled(not self.app.generator_settings["random_seed"]) - def update_seed(self): self.ui.lineEdit.setText(str(self.seed)) @@ -28,11 +21,3 @@ def action_value_changed_seed(self, value): class LatentsSeedWidget(SeedWidget): setting_name = "generator.random_latents_seed" - - # def initialize(self, generator_section, generator_name): - # self.app.settings_manager.generator_section = generator_section - # self.app.settings_manager.generator_name = generator_name - # self.ui.label.setText("Image Seed") - # self.update_seed() - # self.ui.random_button.setChecked(self.app.generator_settings["random_latents_seed"]) - # self.ui.lineEdit.setEnabled(not self.app.generator_settings["random_latents_seed"]) diff --git a/src/airunner/windows/main/main_window.py b/src/airunner/windows/main/main_window.py index eb2ab63db..cb94a2abe 100644 --- a/src/airunner/windows/main/main_window.py +++ b/src/airunner/windows/main/main_window.py @@ -20,7 +20,7 @@ from airunner.aihandler.logger import Logger as logger from airunner.aihandler.pyqt_client import OfflineClient from airunner.aihandler.qtvar import MessageHandlerVar -from airunner.aihandler.settings import LOG_LEVEL +from airunner.aihandler.settings import DEFAULT_BRUSH_PRIMARY_COLOR, DEFAULT_BRUSH_SECONDARY_COLOR, LOG_LEVEL from airunner.airunner_api import AIRunnerAPI from airunner.data.models import DEFAULT_PATHS, LLMGenerator from airunner.filters.windows.filter_base import FilterBase @@ -168,6 +168,7 @@ def add_event(self, *args, **kwargs): image_data = pyqtSignal(dict) load_image = pyqtSignal(str) load_image_object = pyqtSignal(object) + window_resized_signal = pyqtSignal(object) generator = None _generator = None @@ -269,30 +270,18 @@ def tome_sd_ratio(self): def tome_sd_ratio(self, val): self.application_settings.setValue("tome_sd_ratio", val) - @property - def brush_size(self): - return self.application_settings.value("brush_size", 1, type=int) - - @brush_size.setter - def brush_size(self, val): - self.application_settings.setValue("brush_size", val) - - @property - def brush_primary_color(self): - return self.application_settings.value("brush_primary_color", "#000000") - - @brush_primary_color.setter - def brush_primary_color(self, val): - self.application_settings.setValue("brush_primary_color", val) + def brush_settings(self): + return self.application_settings.value("brush_settings", dict( + size=1, + primary_color=DEFAULT_BRUSH_PRIMARY_COLOR, + secondary_color=DEFAULT_BRUSH_SECONDARY_COLOR, + )) - @property - def brush_secondary_color(self): - return self.application_settings.value("brush_secondary_color", "#ffffff") - - @brush_secondary_color.setter - def brush_secondary_color(self, val): - self.application_settings.setValue("brush_secondary_color", val) + @brush_settings.setter + def brush_settings(self, val): + print("SET BRUSH_SETTINGS", val) + self.application_settings.setValue("brush_settings", val) @property def ai_mode(self): @@ -462,6 +451,9 @@ def set_path_settings(self, key, val): path_settings = self.path_settings path_settings[key] = val self.path_settings = path_settings + + def resizeEvent(self, event): + self.window_resized_signal.emit(event) @property def resize_on_paste(self): @@ -1500,7 +1492,7 @@ def handle_button_clicked(self, kwargs): self.toggle_tool(kwargs["tool"]) def toggle_tool(self, tool): - self.settings_manager.set_value("settings.current_tool", tool) + self.current_tool = tool def initialize_mixins(self): #self.canvas = Canvas()