diff --git a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py index 713376389..61294b7e5 100644 --- a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py +++ b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py @@ -150,6 +150,7 @@ def paint(self, painter: QPainter, option, widget=None): self.pixmap.fill(QColor(0, 0, 0, 1)) if self.settings_manager.active_grid_settings.render_border: + print(self.active_grid_area_rect) size = 4 painter.setPen(QPen( self.active_grid_area_color, @@ -187,8 +188,6 @@ def change_fill_opacity(self, value): def mouseReleaseEvent(self, event): super().mouseReleaseEvent(event) pos = self.pos() - self.settings_manager.set_value("active_grid_settings.pos_x", pos.x()) - self.settings_manager.set_value("active_grid_settings.pos_y", pos.y()) class CanvasPlusWidget(CanvasBaseWidget): diff --git a/src/airunner/widgets/canvas_plus/standard_image_widget.py b/src/airunner/widgets/canvas_plus/standard_image_widget.py index 845e9b017..e576708a4 100644 --- a/src/airunner/widgets/canvas_plus/standard_image_widget.py +++ b/src/airunner/widgets/canvas_plus/standard_image_widget.py @@ -43,6 +43,7 @@ def canvas_widget(self): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.ui.settings_tab_widget.tabBar().hide() self.ui.advanced_settings.hide() self.load_upscale_options() self.set_controlnet_settings_properties() @@ -107,6 +108,7 @@ def handle_image_data(self, data): def load_image_from_path(self, image_path): image = Image.open(image_path) self.load_image_from_object(image=image, image_path=image_path) + self.app.ui.image_browser.add_image(image_path) def load_image_from_object(self, image, image_path=NotImplemented): self.set_pixmap(image=image, image_path=image_path) @@ -401,6 +403,8 @@ def initialize_generator_form(self, override_id=None): def handle_settings_manager_changed(self, key, val, settings_manager): if key == "generator_settings_override_id": self.initialize_generator_form(val) + elif key == "ai_mode": + self.ui.settings_tab_widget.setCurrentIndex(1 if self.settings_manager.ai_mode else 0) def initialize(self): self.set_form_values() diff --git a/src/airunner/widgets/canvas_plus/templates/standard_image_widget.ui b/src/airunner/widgets/canvas_plus/templates/standard_image_widget.ui index 072abcc5d..521be74d9 100644 --- a/src/airunner/widgets/canvas_plus/templates/standard_image_widget.ui +++ b/src/airunner/widgets/canvas_plus/templates/standard_image_widget.ui @@ -80,7 +80,7 @@ Qt::LeftToRight - 0 + 5 @@ -353,16 +353,17 @@ 0 - + QTabWidget::East - 1 + 0 - + + .. Image @@ -762,7 +763,8 @@ - + + .. Text @@ -831,15 +833,15 @@ - LLMSettingsWidget + SliderWidget QWidget -
airunner/widgets/llm/llm_settings_widget
+
airunner/widgets/slider/slider_widget
1
- SliderWidget + LLMSettingsWidget QWidget -
airunner/widgets/slider/slider_widget
+
airunner/widgets/llm/llm_settings_widget
1
diff --git a/src/airunner/widgets/canvas_plus/templates/standard_image_widget_ui.py b/src/airunner/widgets/canvas_plus/templates/standard_image_widget_ui.py index 82365fdaa..2bfee2847 100644 --- a/src/airunner/widgets/canvas_plus/templates/standard_image_widget_ui.py +++ b/src/airunner/widgets/canvas_plus/templates/standard_image_widget_ui.py @@ -150,9 +150,9 @@ def setupUi(self, standard_image_widget): self.gridLayout_11 = QtWidgets.QGridLayout(self.tab_6) self.gridLayout_11.setContentsMargins(0, 0, 0, 0) self.gridLayout_11.setObjectName("gridLayout_11") - self.tabWidget_2 = QtWidgets.QTabWidget(parent=self.tab_6) - self.tabWidget_2.setTabPosition(QtWidgets.QTabWidget.TabPosition.East) - self.tabWidget_2.setObjectName("tabWidget_2") + self.settings_tab_widget = QtWidgets.QTabWidget(parent=self.tab_6) + self.settings_tab_widget.setTabPosition(QtWidgets.QTabWidget.TabPosition.East) + self.settings_tab_widget.setObjectName("settings_tab_widget") self.tab_7 = QtWidgets.QWidget() self.tab_7.setObjectName("tab_7") self.gridLayout_13 = QtWidgets.QGridLayout(self.tab_7) @@ -324,7 +324,7 @@ def setupUi(self, standard_image_widget): self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) self.gridLayout_13.addWidget(self.scrollArea_2, 0, 0, 1, 1) icon = QtGui.QIcon.fromTheme("applications-graphics") - self.tabWidget_2.addTab(self.tab_7, icon, "") + self.settings_tab_widget.addTab(self.tab_7, icon, "") self.tab_8 = QtWidgets.QWidget() self.tab_8.setObjectName("tab_8") self.gridLayout_12 = QtWidgets.QGridLayout(self.tab_8) @@ -333,8 +333,8 @@ def setupUi(self, standard_image_widget): self.llm_settings_widget.setObjectName("llm_settings_widget") self.gridLayout_12.addWidget(self.llm_settings_widget, 0, 0, 1, 1) icon = QtGui.QIcon.fromTheme("emblem-documents") - self.tabWidget_2.addTab(self.tab_8, icon, "") - self.gridLayout_11.addWidget(self.tabWidget_2, 0, 0, 1, 1) + self.settings_tab_widget.addTab(self.tab_8, icon, "") + self.gridLayout_11.addWidget(self.settings_tab_widget, 0, 0, 1, 1) icon = QtGui.QIcon.fromTheme("document-properties") self.tabWidget.addTab(self.tab_6, icon, "") self.gridLayout_7.addWidget(self.tabWidget, 0, 0, 1, 1) @@ -358,8 +358,8 @@ def setupUi(self, standard_image_widget): self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1) self.retranslateUi(standard_image_widget) - self.tabWidget.setCurrentIndex(0) - self.tabWidget_2.setCurrentIndex(1) + self.tabWidget.setCurrentIndex(5) + self.settings_tab_widget.setCurrentIndex(0) self.upscale_model.currentTextChanged['QString'].connect(standard_image_widget.upscale_model_changed) # type: ignore self.face_enhance.clicked['bool'].connect(standard_image_widget.face_enhance_toggled) # type: ignore self.comboBox.currentIndexChanged['int'].connect(standard_image_widget.upscale_number_changed) # type: ignore @@ -412,8 +412,8 @@ def retranslateUi(self, standard_image_widget): self.label_6.setText(_translate("standard_image_widget", "Version")) self.label_3.setText(_translate("standard_image_widget", "Model")) self.label_4.setText(_translate("standard_image_widget", "Scheduler")) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_7), _translate("standard_image_widget", "Image")) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_8), _translate("standard_image_widget", "Text")) + self.settings_tab_widget.setTabText(self.settings_tab_widget.indexOf(self.tab_7), _translate("standard_image_widget", "Image")) + self.settings_tab_widget.setTabText(self.settings_tab_widget.indexOf(self.tab_8), _translate("standard_image_widget", "Text")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_6), _translate("standard_image_widget", "Settings")) self.tabWidget.setTabToolTip(self.tabWidget.indexOf(self.tab_6), _translate("standard_image_widget", "Stable Diffusion settings")) from airunner.widgets.brushes.brushes_container import BrushesContainer diff --git a/src/airunner/widgets/generator_form/generator_form_widget.py b/src/airunner/widgets/generator_form/generator_form_widget.py index 7f6e25699..c5275e0be 100644 --- a/src/airunner/widgets/generator_form/generator_form_widget.py +++ b/src/airunner/widgets/generator_form/generator_form_widget.py @@ -147,6 +147,8 @@ def handle_changed_signal(self, key, value): self.ui.seed_widget_latents.update_seed() elif key == "enable_advanced_mode": self.toggle_advanced_generation() + elif key == "ai_mode": + self.activate_ai_mode() """ Slot functions diff --git a/src/airunner/widgets/image/image_panel_widget.py b/src/airunner/widgets/image/image_panel_widget.py index 2c6baebf9..5a576fbad 100644 --- a/src/airunner/widgets/image/image_panel_widget.py +++ b/src/airunner/widgets/image/image_panel_widget.py @@ -38,31 +38,24 @@ def __init__(self, *args, **kwargs): if self.settings_manager.path_settings.image_path != "": self.show_files() - self.initialize_watcher() self.load_files() self.show_files() self.display_thread = threading.Thread(target=self.display_thumbnails) - def initialize_watcher(self): + def add_image(self, image_path): """ - Initializes the file system watcher to monitor changes in the image directory. + Adds an image to the image panel widget. - This method adds the image directory and its subdirectories to the file system watcher, - and connects the directoryChanged and fileChanged signals to their respective handler methods. + Args: + image_path (str): The path of the image to be added. + + Returns: + None """ - self.watcher = QFileSystemWatcher() - for root, dirs, files in os.walk(self.settings_manager.path_settings.image_path): - self.watcher.addPath(root) - self.watcher.directoryChanged.connect(self.handle_directory_changed) - self.watcher.fileChanged.connect(self.handle_files_changed) - - def handle_directory_changed(self, event): - #self.show_files() - pass - - def handle_files_changed(self, event): - #self.show_files() - pass + image_widget = ImageWidget(self, is_thumbnail=True) + image_widget.set_image(image_path) + + self.ui.scrollAreaWidgetContents.layout().addWidget(image_widget) def clear_files(self): self.page = 0 @@ -102,7 +95,11 @@ def load_files(self): if os.path.isdir(os.path.join(self.settings_manager.path_settings.image_path, file)): sorted_files[file] = [] for root, dirs, files_in_dir in os.walk(os.path.join(self.settings_manager.path_settings.image_path, file)): - sorted_files[file].extend([os.path.join(root, f) for f in files_in_dir]) + files = [] + for f in files_in_dir: + if ".png.thumbnail.png" not in f: + files.append(os.path.join(root, f)) + sorted_files[file].extend(files) section = "txt2img" files = sorted_files[section] diff --git a/src/airunner/widgets/llm/llm_settings_widget.py b/src/airunner/widgets/llm/llm_settings_widget.py index 41f2ce8c8..64aeb2095 100644 --- a/src/airunner/widgets/llm/llm_settings_widget.py +++ b/src/airunner/widgets/llm/llm_settings_widget.py @@ -40,7 +40,7 @@ def generator_settings(self): @property def current_generator(self): return self.settings_manager.get_value("current_llm_generator") - + def initialize(self): self.initialize_form() @@ -72,6 +72,9 @@ def initialize_form(self): self.ui.early_stopping.blockSignals(True) self.ui.use_gpu_checkbox.blockSignals(True) self.ui.override_parameters.blockSignals(True) + self.ui.leave_in_vram.blockSignals(True) + self.ui.move_to_cpu.blockSignals(True) + self.ui.unload_model.blockSignals(True) self.ui.top_p.initialize_properties() self.ui.max_length.initialize_properties() self.ui.max_length.initialize_properties() @@ -88,6 +91,10 @@ def initialize_form(self): self.ui.prompt_template.clear() self.ui.prompt_template.addItems(prompt_templates) + self.ui.leave_in_vram.setChecked(not self.settings_manager.unload_unused_model and not self.settings_manager.move_unused_model_to_cpu) + self.ui.move_to_cpu.setChecked(self.settings_manager.move_unused_model_to_cpu) + self.ui.unload_model.setChecked(self.settings_manager.unload_unused_model) + if self.generator: self.ui.radio_button_2bit.setChecked(self.generator.generator_settings[0].dtype == "2bit") self.ui.radio_button_4bit.setChecked(self.generator.generator_settings[0].dtype == "4bit") @@ -125,6 +132,9 @@ def initialize_form(self): self.ui.use_gpu_checkbox.blockSignals(False) self.ui.override_parameters.blockSignals(False) self.ui.prompt_template.blockSignals(False) + self.ui.leave_in_vram.blockSignals(False) + self.ui.move_to_cpu.blockSignals(False) + self.ui.unload_model.blockSignals(False) def model_text_changed(self, val): print("model_text_changed", val) @@ -191,13 +201,12 @@ def use_gpu_toggled(self, val): def set_dtype_by_gpu(self, use_gpu): if not use_gpu: + if self.generator.generator_settings[0].dtype in ["2bit","4bit", "8bit"]: + self.ui.radio_button_16bit.setChecked(True) self.ui.radio_button_2bit.setEnabled(False) self.ui.radio_button_4bit.setEnabled(False) self.ui.radio_button_8bit.setEnabled(False) self.ui.radio_button_32bit.setEnabled(True) - - if self.generator.generator_settings[0].dtype in ["4bit", "8bit"]: - self.ui.radio_button_16bit.setChecked(True) else: self.ui.radio_button_2bit.setEnabled(True) self.ui.radio_button_4bit.setEnabled(True) diff --git a/src/airunner/windows/main/main_window.py b/src/airunner/windows/main/main_window.py index ce7bd258f..a661e3cba 100644 --- a/src/airunner/windows/main/main_window.py +++ b/src/airunner/windows/main/main_window.py @@ -1425,4 +1425,3 @@ def action_center_clicked(self): def action_ai_toggled(self, val): self.settings_manager.set_value("ai_mode", val) - self.generator_tab_widget.activate_ai_mode()