From 4d5c580dc0069c82c116ed4a85cfd5fee158cf9f Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 05:56:10 -0700 Subject: [PATCH 1/6] fix improts --- src/airunner/aihandler/offline_client.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/airunner/aihandler/offline_client.py b/src/airunner/aihandler/offline_client.py index c633ad039..97f6e74df 100644 --- a/src/airunner/aihandler/offline_client.py +++ b/src/airunner/aihandler/offline_client.py @@ -2,10 +2,9 @@ import queue import time import threading -from airunner.aihandler.engine import Engine +from airunner.aihandler.engine import Engine from airunner.aihandler.logger import Logger as logger -from airunner.aihandler.runner import SDRunner class OfflineClient: From 2d38329cd96cd1cb878db3d75bc10b0aa242eefc Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:24:34 -0700 Subject: [PATCH 2/6] improvements to image widget and loading of thumbnails --- src/airunner/aihandler/logger.py | 2 +- .../widgets/canvas_plus/canvas_plus_widget.py | 4 +- .../widgets/image/image_panel_widget.py | 95 +++++++++++++++---- src/airunner/widgets/image/image_widget.py | 29 ++++-- 4 files changed, 100 insertions(+), 30 deletions(-) diff --git a/src/airunner/aihandler/logger.py b/src/airunner/aihandler/logger.py index a22fe7dcf..7fb4cd976 100644 --- a/src/airunner/aihandler/logger.py +++ b/src/airunner/aihandler/logger.py @@ -71,7 +71,7 @@ def error(cls, msg): cls.logger.error(msg) -Logger.set_level(logging.DEBUG) +Logger.set_level(LOG_LEVEL) Logger.stream_handler.setFormatter(Logger.formatter) Logger.logger.addHandler(Logger.stream_handler) logging.getLogger("lightning").setLevel(logging.WARNING) diff --git a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py index 96d82312e..713376389 100644 --- a/src/airunner/widgets/canvas_plus/canvas_plus_widget.py +++ b/src/airunner/widgets/canvas_plus/canvas_plus_widget.py @@ -8,8 +8,8 @@ from PyQt6.QtCore import Qt, QPoint, QPointF, QRect from PyQt6.QtGui import QBrush, QColor, QPen, QPixmap, QPainter, QCursor from PyQt6.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsPixmapItem, QGraphicsLineItem -from airunner.aihandler.logger import Logger +from airunner.aihandler.logger import Logger from airunner.aihandler.settings_manager import SettingsManager from airunner.cursors.circle_brush import CircleCursor from airunner.data.db import session @@ -759,4 +759,4 @@ def rotate_90_clockwise(self): def rotate_90_counterclockwise(self): if self.current_active_image: self.current_active_image = self.current_active_image.transpose(Image.ROTATE_90) - self.do_draw() \ No newline at end of file + self.do_draw() diff --git a/src/airunner/widgets/image/image_panel_widget.py b/src/airunner/widgets/image/image_panel_widget.py index 9ec0226fc..2c6baebf9 100644 --- a/src/airunner/widgets/image/image_panel_widget.py +++ b/src/airunner/widgets/image/image_panel_widget.py @@ -1,4 +1,5 @@ import os +import threading from PyQt6.QtCore import QFileSystemWatcher @@ -14,8 +15,22 @@ class ImagePanelWidget(BaseWidget): total_per_page = 50 page_step = 512 last_page = False + sorted_files = [] + start = 0 + end = 0 + def __init__(self, *args, **kwargs): + """ + Initializes the ImagePanelWidget. + + Args: + *args: Variable length argument list. + **kwargs: Arbitrary keyword arguments. + + Returns: + None + """ super().__init__(*args, **kwargs) self.ui.scrollArea.verticalScrollBar().valueChanged.connect(self.handle_scroll) flowLayout = QFlowLayout() @@ -23,20 +38,31 @@ def __init__(self, *args, **kwargs): if self.settings_manager.path_settings.image_path != "": self.show_files() - # watch the image directory for new files or delete files. if anything changes in the directory call show_files + self.initialize_watcher() + self.load_files() + self.show_files() + self.display_thread = threading.Thread(target=self.display_thumbnails) + + def initialize_watcher(self): + """ + Initializes the file system watcher to monitor changes in the image directory. + + 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. + """ self.watcher = QFileSystemWatcher() - # recursively watch the image path 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() + #self.show_files() + pass def handle_files_changed(self, event): - self.show_files() + #self.show_files() + pass def clear_files(self): self.page = 0 @@ -47,21 +73,31 @@ def clear_files(self): widget.deleteLater() def show_files(self, clear_images=True, reset_scroll_bar=True, show_folders=True): - if clear_images: - self.clear_files() + """ + Displays the files in the image panel widget. + Args: + clear_images (bool, optional): Whether to clear the existing images. Defaults to True. + reset_scroll_bar (bool, optional): Whether to reset the scroll bar position. Defaults to True. + show_folders (bool, optional): Whether to show folders in the file list. Defaults to True. + """ if reset_scroll_bar: self.ui.scrollArea.verticalScrollBar().setValue(0) - start = self.page * self.total_per_page - end = start + self.total_per_page - + self.start = self.page * self.total_per_page + self.end = self.start + self.total_per_page + + self.display_thumbnails() - # recursively crawl self.settings_manager.path_settings.image_path and build a directory of the files sorted by the first folder name within self.settings_manager.path_settings.image_path - # for example, self.settings_manager.path_settings.image_path will have several folders, those should be the key in a dictionary, and the value should be a list of files which is sorted by the most recent first + def load_files(self): + """ + Load files from the specified image path and sort them based on modification time. + + Returns: + None + """ files_in_image_path = os.listdir(self.settings_manager.path_settings.image_path) sorted_files = {} - # recursively crawl the image path and build a dictionary of the files for file in files_in_image_path: if os.path.isdir(os.path.join(self.settings_manager.path_settings.image_path, file)): sorted_files[file] = [] @@ -70,21 +106,42 @@ def show_files(self, clear_images=True, reset_scroll_bar=True, show_folders=True section = "txt2img" files = sorted_files[section] - # sort the files by the most recent first files.sort(key=os.path.getmtime, reverse=True) - self.last_page = end >= len(files) - for file in files[start:end]: + self.sorted_files = files + + def display_thumbnails(self): + """ + Display thumbnails of images from the sorted_files list within the specified range. + + Args: + start (int): The starting index of the range. + end (int): The ending index of the range. + """ + for file in self.sorted_files[self.start:self.end]: if file.endswith(".png"): - image_widget = ImageWidget(self) + image_widget = ImageWidget(self, is_thumbnail=True) image_widget.set_image(os.path.join(self.settings_manager.path_settings.image_path, file)) self.ui.scrollAreaWidgetContents.layout().addWidget(image_widget) def handle_folder_clicked(self, path): + """ + Handles the event when a folder is clicked. + + Args: + path (str): The path of the clicked folder. + """ self.show_files() def handle_scroll(self, value): - if self.last_page: - return + """ + Handles the scroll event of the image panel widget. + + Args: + value (int): The value of the scroll event. + + Returns: + None + """ if value >= self.ui.scrollArea.verticalScrollBar().maximum() - self.page_step + 1: self.page += 1 self.show_files(clear_images=False, reset_scroll_bar=False, show_folders=False) diff --git a/src/airunner/widgets/image/image_widget.py b/src/airunner/widgets/image/image_widget.py index 8336a338e..786cfc78b 100644 --- a/src/airunner/widgets/image/image_widget.py +++ b/src/airunner/widgets/image/image_widget.py @@ -1,3 +1,4 @@ +import os import json from PyQt6.QtGui import QPixmap @@ -27,12 +28,12 @@ class ImageWidget(BaseWidget): image_width = 0 image_height = 0 clicked = pyqtSignal() - - def thumbnail(self, width=128, height=128): - if not self.pixmap: - return None - return self.pixmap.scaled(width, height, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + pixmap = None + def __init__(self, *args, **kwargs): + self.is_thumbnail = kwargs.pop("is_thumbnail", False) + super().__init__(*args, **kwargs) + def set_image(self, image_path): size = self.ui.image_frame.width() self.image_path = image_path @@ -40,13 +41,22 @@ def set_image(self, image_path): self.load_meta_data(image_path) # Create a QPixmap object - + if isinstance(self.image_path, Image.Image): qimage = ImageQt(self.image_path) # Convert the PngImageFile to a QImage pixmap = QPixmap.fromImage(qimage) # Create a QPixmap from the QImage else: - pixmap = QPixmap(self.image_path) - pixmap = pixmap.scaled(size - 20, size - 20, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + # check if thumbnail exists at path + # if not, create it + path = self.image_path + ".thumbnail.png" + if not os.path.exists(path): + image = Image.open(self.image_path) + image.thumbnail((size, size)) + image.save(path) + if self.is_thumbnail: + pixmap = QPixmap(path) + else: + pixmap = QPixmap(self.image_path) self.pixmap = pixmap # set width and height @@ -131,6 +141,7 @@ def load_meta_data(self, image_path): def send_image_to_grid(self): #self.app.ui.canvas_plus_widget.load_image(self.image_path) + print(self.image_path) self.app.load_image.emit(self.image_path) def view_image(self): @@ -186,6 +197,8 @@ def delete_image(self): def confirm_delete(self): delete_image(self.image_path) + delete_image(self.image_path + ".thumbnail.png") + self.deleteLater() def cancel_delete(self): pass From c80e9b4273b7a4d68bb02ba614c8748b3b7bdf3a Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:24:44 -0700 Subject: [PATCH 3/6] removed advanced mode from settings --- .../windows/settings/airunner_settings.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/airunner/windows/settings/airunner_settings.py b/src/airunner/windows/settings/airunner_settings.py index fc7a9cbb2..13f6c8261 100644 --- a/src/airunner/windows/settings/airunner_settings.py +++ b/src/airunner/windows/settings/airunner_settings.py @@ -93,17 +93,6 @@ def initialize_window(self): } ] }, - { - "section": "Enable Advanced Mode", - "files": [ - { - "name": "enable_advanced_mode", - "display_name": "Advanced mode", - "checkable": True, - "description": "If enabled, advanced generator options will be shown." - } - ] - }, { "section": "Memory Preferences", "files": [ @@ -209,8 +198,6 @@ def add_file(self, parent_item, name, display_name, checkable=False, description checked = self.app.settings_manager.resize_on_paste elif name == "image_to_new_layer": checked = self.app.settings_manager.image_to_new_layer - elif name == "enable_advanced_mode": - checked = self.app.settings_manager.enable_advanced_mode elif name == "dark_mode": checked = self.app.settings_manager.dark_mode_enabled elif name == "check_for_updates": @@ -245,9 +232,6 @@ def on_item_clicked(self, index): elif name == "image_to_new_layer": checked = item.checkState() == Qt.CheckState.Checked self.app.settings_manager.set_value("image_to_new_layer", checked) - elif name == "enable_advanced_mode": - checked = item.checkState() == Qt.CheckState.Checked - self.app.settings_manager.set_value("enable_advanced_mode", checked) elif name == "dark_mode": checked = item.checkState() == Qt.CheckState.Checked self.app.settings_manager.set_value("dark_mode_enabled", checked) From f9f027bc927b56bcb1de44955cfd402ba95f76de Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:25:15 -0700 Subject: [PATCH 4/6] modified buttons and layout of main window --- src/airunner/windows/main/main_window.py | 94 +-- .../windows/main/templates/main_window.ui | 711 +++++------------- .../windows/main/templates/main_window_ui.py | 230 ++---- 3 files changed, 292 insertions(+), 743 deletions(-) diff --git a/src/airunner/windows/main/main_window.py b/src/airunner/windows/main/main_window.py index fc6356c68..ce7bd258f 100644 --- a/src/airunner/windows/main/main_window.py +++ b/src/airunner/windows/main/main_window.py @@ -77,7 +77,7 @@ class MainWindow( button_clicked_signal = pyqtSignal(dict) status_widget = None splitters = None - + header_widget_spacer = None deterministic_window = None _tabs = { @@ -304,14 +304,13 @@ def __init__(self, *args, **kwargs): self.initialize_panel_tabs() self.initialize_tool_section_buttons() - self.toggle_header_buttons() if self.settings_manager.mode == Mode.IMAGE.value: self.image_generation_toggled() elif self.settings_manager.mode == Mode.LANGUAGE_PROCESSOR.value: self.language_processing_toggled() else: - self.model_manager_toggled() + self.model_manager_toggled(True) # This is used to check the state of the window and save splitter sizes if they have changed self.start_splitter_timer() @@ -705,11 +704,7 @@ def set_stylesheet(self): stylesheet = f.read() self.setStyleSheet(stylesheet) for icon_data in [ - ("image-file-icon", "image_generation_button"), ("tech-icon", "model_manager_button"), - ("photo-editor-icon", "image_generators_button"), - ("video-editor-icon", "txt2vid_button"), - ("prompt-editor-icon", "prompt_builder_button"), ("pencil-icon", "toggle_brush_button"), ("eraser-icon", "toggle_eraser_button"), ("frame-grid-icon", "toggle_grid_button"), @@ -1351,10 +1346,13 @@ def language_processing_toggled(self): self.activate_language_processing_section() self.set_all_section_buttons() - def model_manager_toggled(self): - self.settings_manager.set_value("mode", Mode.MODEL_MANAGER.value) - self.activate_model_manager_section() - self.set_all_section_buttons() + def model_manager_toggled(self, val): + if not val: + self.image_generators_toggled() + else: + self.settings_manager.set_value("mode", Mode.MODEL_MANAGER.value) + self.activate_model_manager_section() + self.set_all_section_buttons() def set_button_checked(self, name, val=True, block_signals=True): widget = getattr(self.ui, f"{name}_button") @@ -1365,75 +1363,24 @@ def set_button_checked(self, name, val=True, block_signals=True): widget.blockSignals(False) def set_all_section_buttons(self): - self.set_button_checked("image_generation", self.settings_manager.mode == Mode.IMAGE.value) self.set_button_checked("model_manager", self.settings_manager.mode == Mode.MODEL_MANAGER.value) - self.toggle_header_buttons() - - def toggle_header_buttons(self): - if self.settings_manager.mode == Mode.IMAGE.value: - self.ui.image_generator_header_tools.show() - self.ui.text_generator_header_tools.hide() - elif self.settings_manager.mode == Mode.LANGUAGE_PROCESSOR.value: - self.ui.image_generator_header_tools.hide() - self.ui.text_generator_header_tools.show() - else: - self.ui.image_generator_header_tools.hide() - self.ui.text_generator_header_tools.hide() - def toggle_llm_button_signals(self, blocked): - self.ui.chat_button.blockSignals(blocked) - self.ui.llm_preferences_button.blockSignals(blocked) - self.ui.llm_settings_button.blockSignals(blocked) - #self.ui.llm_quantization_button.blockSignals(blocked) - def activate_image_generation_section(self): self.ui.mode_tab_widget.setCurrentIndex(0) - self.toggle_tool_section_buttons_visibility() def activate_language_processing_section(self): self.ui.mode_tab_widget.setCurrentIndex(1) - self.toggle_tool_section_buttons_visibility() def activate_model_manager_section(self): - self.ui.mode_tab_widget.setCurrentIndex(2) - self.toggle_tool_section_buttons_visibility() + self.ui.center_tab.setCurrentIndex(2) def initialize_tool_section_buttons(self): - self.toggle_tool_section_buttons_visibility() - self.set_button_checked("image_generators", False) - self.set_button_checked("txt2vid", False) - self.set_button_checked("prompt_builder", False) - if self.settings_manager.mode == Mode.IMAGE.value: - if self.settings_manager.generator_section == GeneratorSection.TXT2VID.value: - self.set_button_checked("txt2vid") - elif self.settings_manager.generator_section == GeneratorSection.PROMPT_BUILDER.value: - self.set_button_checked("prompt_builder") - else: - self.set_button_checked("image_generators") + pass - header_widget_spacer = None - def toggle_tool_section_buttons_visibility(self): - image_mode = self.settings_manager.mode == Mode.IMAGE.value - lang_mode = self.settings_manager.mode == Mode.LANGUAGE_PROCESSOR.value - self.ui.image_generator_header_tools.setVisible(image_mode or lang_mode) - self.ui.text_generator_header_tools.setVisible(image_mode or lang_mode) - visible = image_mode or lang_mode - - # add a horizontal spacer to the right of the self.ui.header_widget - if not visible: - if not self.header_widget_spacer: - self.header_widget_spacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.ui.scrollAreaWidgetContents_3.layout().addItem(self.header_widget_spacer) - elif visible and self.header_widget_spacer: - self.ui.scrollAreaWidgetContents_3.layout().removeItem(self.header_widget_spacer) - def set_all_image_generator_buttons(self): is_image_generators = self.settings_manager.generator_section == GeneratorSection.TXT2IMG.value is_txt2vid = self.settings_manager.generator_section == GeneratorSection.TXT2VID.value is_prompt_builder = self.settings_manager.generator_section == GeneratorSection.PROMPT_BUILDER.value - self.set_button_checked("image_generators", is_image_generators) - self.set_button_checked("txt2vid", is_txt2vid) - self.set_button_checked("prompt_builder", is_prompt_builder) def image_generators_toggled(self): self.image_generation_toggled() @@ -1455,14 +1402,17 @@ def text_to_video_toggled(self): self.set_all_image_generator_buttons() self.change_content_widget() - def prompt_builder_toggled(self): - self.image_generation_toggled() - self.settings_manager.set_value(f"generator_section", GeneratorSection.PROMPT_BUILDER.value) - active_tab_obj = session.query(TabSection).filter(TabSection.panel == "center_tab").first() - active_tab_obj.active_tab = "Prompt Builder" - save_session() - self.set_all_image_generator_buttons() - self.change_content_widget() + def toggle_prompt_builder(self, val): + if not val: + self.image_generators_toggled() + else: + self.image_generation_toggled() + self.settings_manager.set_value(f"generator_section", GeneratorSection.PROMPT_BUILDER.value) + active_tab_obj = session.query(TabSection).filter(TabSection.panel == "center_tab").first() + active_tab_obj.active_tab = "Prompt Builder" + save_session() + self.set_all_image_generator_buttons() + self.change_content_widget() def redraw(self): self.set_stylesheet() diff --git a/src/airunner/windows/main/templates/main_window.ui b/src/airunner/windows/main/templates/main_window.ui index b941ec9f9..9df4feef8 100644 --- a/src/airunner/windows/main/templates/main_window.ui +++ b/src/airunner/windows/main/templates/main_window.ui @@ -7,8 +7,8 @@ 0 0 - 1144 - 964 + 1201 + 970 @@ -128,8 +128,8 @@ 0 0 - 1140 - 48 + 1197 + 46 @@ -148,94 +148,6 @@ 0 - - - - - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - PointingHandCursor - - - Image Generation - - - - - - - :/icons/light/image-file-icon.svg:/icons/light/image-file-icon.svg - - - - 32 - 32 - - - - true - - - true - - - - - - - - 48 - 48 - - - - - 48 - 48 - - - - PointingHandCursor - - - Model manager - - - - - - - :/icons/light/tech-icon.svg:/icons/light/tech-icon.svg - - - - 32 - 32 - - - - true - - - true - - - @@ -257,19 +169,6 @@ 0 - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -297,132 +196,6 @@ 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - PointingHandCursor - - - Image generators - - - - - - - :/icons/light/photo-editor-icon.svg:/icons/light/photo-editor-icon.svg - - - - 24 - 24 - - - - true - - - false - - - true - - - - - - - - 48 - 48 - - - - - 48 - 48 - - - - PointingHandCursor - - - Text to Video - - - - - - - :/icons/light/video-editor-icon.svg:/icons/light/video-editor-icon.svg - - - - 24 - 24 - - - - true - - - true - - - - - - - - 48 - 48 - - - - - 48 - 48 - - - - PointingHandCursor - - - Prompt Builder - - - - - - - :/icons/light/prompt-editor-icon.svg:/icons/light/prompt-editor-icon.svg - - - - 24 - 24 - - - - true - - - true - - - @@ -441,30 +214,6 @@ 0 - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - @@ -718,6 +467,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -853,11 +615,6 @@ - - - Video - - Prompt Builder @@ -880,6 +637,28 @@ + + + Model Manager + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + @@ -894,8 +673,8 @@ 0 0 - 386 - 835 + 407 + 841 @@ -1284,6 +1063,9 @@ PointingHandCursor + + Toggle AI Mode + @@ -1293,7 +1075,7 @@ - 20 + 18 20 @@ -1312,6 +1094,60 @@ + + + + + 0 + 0 + + + + + 50 + 45 + + + + + 50 + 45 + + + + PointingHandCursor + + + Model manager + + + + + + + :/icons/light/tech-icon.svg:/icons/light/tech-icon.svg + + + + 18 + 18 + + + + true + + + true + + + + + + + Qt::Horizontal + + + @@ -1374,28 +1210,6 @@ - - - Model Manager - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - @@ -1408,7 +1222,7 @@ 0 0 - 1144 + 1201 22 @@ -1509,6 +1323,7 @@ + @@ -2768,38 +2583,6 @@ - - image_generation_button - pressed() - MainWindow - image_generation_toggled() - - - 19 - 61 - - - 0 - 16 - - - - - model_manager_button - pressed() - MainWindow - model_manager_toggled() - - - 97 - 70 - - - 770 - 0 - - - center_tab currentChanged(int) @@ -2816,198 +2599,6 @@ - - file_new_button - clicked() - MainWindow - action_new_document_triggered() - - - 916 - 64 - - - 1002 - 0 - - - - - undo_button - clicked() - MainWindow - action_undo_triggered() - - - 1093 - 64 - - - 1002 - 105 - - - - - redo_button - clicked() - MainWindow - action_redo_triggered() - - - 1135 - 64 - - - 1002 - 86 - - - - - export_button - clicked() - MainWindow - action_export_image_triggered() - - - 1042 - 64 - - - 1002 - 28 - - - - - image_generators_button - pressed() - MainWindow - image_generators_toggled() - - - 667 - 70 - - - 0 - 297 - - - - - txt2vid_button - pressed() - MainWindow - text_to_video_toggled() - - - 715 - 70 - - - 0 - 415 - - - - - prompt_builder_button - pressed() - MainWindow - prompt_builder_toggled() - - - 763 - 70 - - - 0 - 482 - - - - - image_generation_button - released() - MainWindow - image_generation_toggled() - - - 24 - 46 - - - 583 - 473 - - - - - model_manager_button - released() - MainWindow - model_manager_toggled() - - - 97 - 69 - - - 0 - 222 - - - - - image_generators_button - released() - MainWindow - image_generators_toggled() - - - 667 - 70 - - - 754 - 0 - - - - - txt2vid_button - released() - MainWindow - text_to_video_toggled() - - - 715 - 70 - - - 1002 - 57 - - - - - prompt_builder_button - released() - MainWindow - prompt_builder_toggled() - - - 763 - 70 - - - 1002 - 651 - - - settings_button clicked() @@ -3015,8 +2606,8 @@ action_show_settings() - 1138 - 491 + 1195 + 551 1002 @@ -3031,7 +2622,7 @@ action_toggle_grid(bool) - 1138 + 1195 315 @@ -3047,7 +2638,7 @@ action_toggle_active_grid_area(bool) - 1138 + 1195 153 @@ -3063,7 +2654,7 @@ action_toggle_eraser(bool) - 1138 + 1195 255 @@ -3079,7 +2670,7 @@ action_toggle_brush(bool) - 1138 + 1195 204 @@ -3143,12 +2734,12 @@ action_center_clicked() - 1120 + 1177 350 806 - -15 + 0 @@ -3159,11 +2750,91 @@ action_ai_toggled(bool) - 1110 + 1167 412 917 + 0 + + + + + file_new_button + clicked() + MainWindow + action_new_document_triggered() + + + 45 + 63 + + + 1002 + 0 + + + + + export_button + clicked() + MainWindow + action_export_image_triggered() + + + 171 + 63 + + + 1002 + 28 + + + + + undo_button + clicked() + MainWindow + action_undo_triggered() + + + 222 + 63 + + + 1002 + 105 + + + + + redo_button + clicked() + MainWindow + action_redo_triggered() + + + 264 + 63 + + + 1002 + 86 + + + + + model_manager_button + toggled(bool) + MainWindow + model_manager_toggled(bool) + + + 1156 + 469 + + + 1021 -11 @@ -3247,7 +2918,7 @@ action_show_llm() image_generation_toggled() language_processing_toggled() - model_manager_toggled() + model_manager_toggled(bool) image_generators_toggled() text_to_video_toggled() prompt_builder_toggled() diff --git a/src/airunner/windows/main/templates/main_window_ui.py b/src/airunner/windows/main/templates/main_window_ui.py index 1c2c1ff46..a85a04c2e 100644 --- a/src/airunner/windows/main/templates/main_window_ui.py +++ b/src/airunner/windows/main/templates/main_window_ui.py @@ -12,7 +12,7 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(1144, 964) + MainWindow.resize(1201, 970) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -58,43 +58,12 @@ def setupUi(self, MainWindow): self.scrollArea_3.setWidgetResizable(True) self.scrollArea_3.setObjectName("scrollArea_3") self.scrollAreaWidgetContents_3 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 1140, 48)) + self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 1197, 46)) self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents_3) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.image_generation_button = QtWidgets.QPushButton(parent=self.scrollAreaWidgetContents_3) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.image_generation_button.sizePolicy().hasHeightForWidth()) - self.image_generation_button.setSizePolicy(sizePolicy) - self.image_generation_button.setMinimumSize(QtCore.QSize(48, 48)) - self.image_generation_button.setMaximumSize(QtCore.QSize(48, 48)) - self.image_generation_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) - self.image_generation_button.setText("") - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(":/icons/light/image-file-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.image_generation_button.setIcon(icon1) - self.image_generation_button.setIconSize(QtCore.QSize(32, 32)) - self.image_generation_button.setCheckable(True) - self.image_generation_button.setFlat(True) - self.image_generation_button.setObjectName("image_generation_button") - self.horizontalLayout_2.addWidget(self.image_generation_button) - self.model_manager_button = QtWidgets.QPushButton(parent=self.scrollAreaWidgetContents_3) - self.model_manager_button.setMinimumSize(QtCore.QSize(48, 48)) - self.model_manager_button.setMaximumSize(QtCore.QSize(48, 48)) - self.model_manager_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) - self.model_manager_button.setText("") - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(":/icons/light/tech-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.model_manager_button.setIcon(icon2) - self.model_manager_button.setIconSize(QtCore.QSize(32, 32)) - self.model_manager_button.setCheckable(True) - self.model_manager_button.setFlat(True) - self.model_manager_button.setObjectName("model_manager_button") - self.horizontalLayout_2.addWidget(self.model_manager_button) self.text_generator_header_tools = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents_3) self.text_generator_header_tools.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.text_generator_header_tools.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) @@ -102,8 +71,6 @@ def setupUi(self, MainWindow): self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.text_generator_header_tools) self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_5.setObjectName("horizontalLayout_5") - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem) self.horizontalLayout_2.addWidget(self.text_generator_header_tools) self.image_generator_header_tools = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents_3) self.image_generator_header_tools.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) @@ -113,61 +80,12 @@ def setupUi(self, MainWindow): self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_4.setSpacing(0) self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.image_generators_button = QtWidgets.QPushButton(parent=self.image_generator_header_tools) - self.image_generators_button.setMinimumSize(QtCore.QSize(48, 48)) - self.image_generators_button.setMaximumSize(QtCore.QSize(48, 48)) - self.image_generators_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) - self.image_generators_button.setText("") - icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(":/icons/light/photo-editor-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.image_generators_button.setIcon(icon3) - self.image_generators_button.setIconSize(QtCore.QSize(24, 24)) - self.image_generators_button.setCheckable(True) - self.image_generators_button.setChecked(False) - self.image_generators_button.setFlat(True) - self.image_generators_button.setObjectName("image_generators_button") - self.horizontalLayout_4.addWidget(self.image_generators_button) - self.txt2vid_button = QtWidgets.QPushButton(parent=self.image_generator_header_tools) - self.txt2vid_button.setMinimumSize(QtCore.QSize(48, 48)) - self.txt2vid_button.setMaximumSize(QtCore.QSize(48, 48)) - self.txt2vid_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) - self.txt2vid_button.setText("") - icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(":/icons/light/video-editor-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.txt2vid_button.setIcon(icon4) - self.txt2vid_button.setIconSize(QtCore.QSize(24, 24)) - self.txt2vid_button.setCheckable(True) - self.txt2vid_button.setFlat(True) - self.txt2vid_button.setObjectName("txt2vid_button") - self.horizontalLayout_4.addWidget(self.txt2vid_button) - self.prompt_builder_button = QtWidgets.QPushButton(parent=self.image_generator_header_tools) - self.prompt_builder_button.setMinimumSize(QtCore.QSize(48, 48)) - self.prompt_builder_button.setMaximumSize(QtCore.QSize(48, 48)) - self.prompt_builder_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) - self.prompt_builder_button.setText("") - icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap(":/icons/light/prompt-editor-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.prompt_builder_button.setIcon(icon5) - self.prompt_builder_button.setIconSize(QtCore.QSize(24, 24)) - self.prompt_builder_button.setCheckable(True) - self.prompt_builder_button.setFlat(True) - self.prompt_builder_button.setObjectName("prompt_builder_button") - self.horizontalLayout_4.addWidget(self.prompt_builder_button) self.image_generator_header_tool_buttons = QtWidgets.QWidget(parent=self.image_generator_header_tools) self.image_generator_header_tool_buttons.setObjectName("image_generator_header_tool_buttons") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.image_generator_header_tool_buttons) self.horizontalLayout_3.setContentsMargins(6, 0, 6, 0) self.horizontalLayout_3.setSpacing(6) self.horizontalLayout_3.setObjectName("horizontalLayout_3") - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_3.addItem(spacerItem1) - self.horizontalLayout_6 = QtWidgets.QHBoxLayout() - self.horizontalLayout_6.setObjectName("horizontalLayout_6") - self.section_label = QtWidgets.QLabel(parent=self.image_generator_header_tool_buttons) - self.section_label.setText("") - self.section_label.setObjectName("section_label") - self.horizontalLayout_6.addWidget(self.section_label) - self.horizontalLayout_3.addLayout(self.horizontalLayout_6) self.file_new_button = QtWidgets.QPushButton(parent=self.image_generator_header_tool_buttons) self.file_new_button.setMinimumSize(QtCore.QSize(36, 36)) self.file_new_button.setMaximumSize(QtCore.QSize(36, 36)) @@ -251,6 +169,8 @@ def setupUi(self, MainWindow): self.redo_button.setFlat(True) self.redo_button.setObjectName("redo_button") self.horizontalLayout_3.addWidget(self.redo_button) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_3.addItem(spacerItem) self.horizontalLayout_4.addWidget(self.image_generator_header_tool_buttons) self.horizontalLayout_2.addWidget(self.image_generator_header_tools) self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) @@ -310,9 +230,6 @@ def setupUi(self, MainWindow): self.image_browser.setObjectName("image_browser") self.gridLayout_10.addWidget(self.canvas_splitter, 0, 0, 1, 1) self.center_tab.addTab(self.tab_image, "") - self.tab_txt2vid = QtWidgets.QWidget() - self.tab_txt2vid.setObjectName("tab_txt2vid") - self.center_tab.addTab(self.tab_txt2vid, "") self.tab_prompt_builder = QtWidgets.QWidget() self.tab_prompt_builder.setObjectName("tab_prompt_builder") self.gridLayout_16 = QtWidgets.QGridLayout(self.tab_prompt_builder) @@ -322,12 +239,21 @@ def setupUi(self, MainWindow): self.prompt_builder.setObjectName("prompt_builder") self.gridLayout_16.addWidget(self.prompt_builder, 0, 0, 1, 1) self.center_tab.addTab(self.tab_prompt_builder, "") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.gridLayout_7 = QtWidgets.QGridLayout(self.tab) + self.gridLayout_7.setContentsMargins(0, 0, 0, 0) + self.gridLayout_7.setObjectName("gridLayout_7") + self.model_manager = ModelManagerWidget(parent=self.tab) + self.model_manager.setObjectName("model_manager") + self.gridLayout_7.addWidget(self.model_manager, 0, 0, 1, 1) + self.center_tab.addTab(self.tab, "") self.gridLayout_5.addWidget(self.center_tab, 0, 0, 1, 1) self.scrollArea = QtWidgets.QScrollArea(parent=self.content_splitter) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 386, 835)) + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 407, 841)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) self.gridLayout.setObjectName("gridLayout") @@ -391,9 +317,9 @@ def setupUi(self, MainWindow): self.toggle_active_grid_area_button.setMaximumSize(QtCore.QSize(50, 45)) self.toggle_active_grid_area_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.toggle_active_grid_area_button.setText("") - icon6 = QtGui.QIcon() - icon6.addPixmap(QtGui.QPixmap(":/icons/light/object-selected-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.toggle_active_grid_area_button.setIcon(icon6) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(":/icons/light/object-selected-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.toggle_active_grid_area_button.setIcon(icon1) self.toggle_active_grid_area_button.setIconSize(QtCore.QSize(18, 18)) self.toggle_active_grid_area_button.setCheckable(True) self.toggle_active_grid_area_button.setFlat(True) @@ -409,9 +335,9 @@ def setupUi(self, MainWindow): self.toggle_brush_button.setMaximumSize(QtCore.QSize(50, 45)) self.toggle_brush_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.toggle_brush_button.setText("") - icon7 = QtGui.QIcon() - icon7.addPixmap(QtGui.QPixmap(":/icons/light/pencil-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.toggle_brush_button.setIcon(icon7) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(":/icons/light/pencil-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.toggle_brush_button.setIcon(icon2) self.toggle_brush_button.setIconSize(QtCore.QSize(18, 18)) self.toggle_brush_button.setCheckable(True) self.toggle_brush_button.setFlat(True) @@ -427,9 +353,9 @@ def setupUi(self, MainWindow): self.toggle_eraser_button.setMaximumSize(QtCore.QSize(50, 45)) self.toggle_eraser_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.toggle_eraser_button.setText("") - icon8 = QtGui.QIcon() - icon8.addPixmap(QtGui.QPixmap(":/icons/light/eraser-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.toggle_eraser_button.setIcon(icon8) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(":/icons/light/eraser-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.toggle_eraser_button.setIcon(icon3) self.toggle_eraser_button.setIconSize(QtCore.QSize(18, 18)) self.toggle_eraser_button.setCheckable(True) self.toggle_eraser_button.setFlat(True) @@ -455,9 +381,9 @@ def setupUi(self, MainWindow): self.toggle_grid_button.setMaximumSize(QtCore.QSize(50, 45)) self.toggle_grid_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.toggle_grid_button.setText("") - icon9 = QtGui.QIcon() - icon9.addPixmap(QtGui.QPixmap(":/icons/light/frame-grid-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.toggle_grid_button.setIcon(icon9) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(":/icons/light/frame-grid-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.toggle_grid_button.setIcon(icon4) self.toggle_grid_button.setIconSize(QtCore.QSize(18, 18)) self.toggle_grid_button.setCheckable(True) self.toggle_grid_button.setFlat(True) @@ -473,9 +399,9 @@ def setupUi(self, MainWindow): self.focus_button.setMaximumSize(QtCore.QSize(50, 45)) self.focus_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.focus_button.setText("") - icon10 = QtGui.QIcon() - icon10.addPixmap(QtGui.QPixmap(":/icons/light/circle-center-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.focus_button.setIcon(icon10) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(":/icons/light/circle-center-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.focus_button.setIcon(icon5) self.focus_button.setIconSize(QtCore.QSize(18, 18)) self.focus_button.setFlat(True) self.focus_button.setObjectName("focus_button") @@ -494,10 +420,10 @@ def setupUi(self, MainWindow): self.ai_button.setMinimumSize(QtCore.QSize(50, 45)) self.ai_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.ai_button.setText("") - icon11 = QtGui.QIcon() - icon11.addPixmap(QtGui.QPixmap(":/icons/light/artificial-intelligence-ai-chip-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.ai_button.setIcon(icon11) - self.ai_button.setIconSize(QtCore.QSize(20, 20)) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(":/icons/light/artificial-intelligence-ai-chip-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.ai_button.setIcon(icon6) + self.ai_button.setIconSize(QtCore.QSize(18, 20)) self.ai_button.setCheckable(True) self.ai_button.setFlat(True) self.ai_button.setObjectName("ai_button") @@ -507,6 +433,29 @@ def setupUi(self, MainWindow): self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.line_3.setObjectName("line_3") self.verticalLayout.addWidget(self.line_3) + self.model_manager_button = QtWidgets.QPushButton(parent=self.button_menu) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.model_manager_button.sizePolicy().hasHeightForWidth()) + self.model_manager_button.setSizePolicy(sizePolicy) + self.model_manager_button.setMinimumSize(QtCore.QSize(50, 45)) + self.model_manager_button.setMaximumSize(QtCore.QSize(50, 45)) + self.model_manager_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) + self.model_manager_button.setText("") + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(":/icons/light/tech-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.model_manager_button.setIcon(icon7) + self.model_manager_button.setIconSize(QtCore.QSize(18, 18)) + self.model_manager_button.setCheckable(True) + self.model_manager_button.setFlat(True) + self.model_manager_button.setObjectName("model_manager_button") + self.verticalLayout.addWidget(self.model_manager_button) + self.line_5 = QtWidgets.QFrame(parent=self.button_menu) + self.line_5.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_5.setObjectName("line_5") + self.verticalLayout.addWidget(self.line_5) self.settings_button = QtWidgets.QPushButton(parent=self.button_menu) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) @@ -517,32 +466,23 @@ def setupUi(self, MainWindow): self.settings_button.setMaximumSize(QtCore.QSize(50, 45)) self.settings_button.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) self.settings_button.setText("") - icon12 = QtGui.QIcon() - icon12.addPixmap(QtGui.QPixmap(":/icons/light/setting-line-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.settings_button.setIcon(icon12) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(":/icons/light/setting-line-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.settings_button.setIcon(icon8) self.settings_button.setIconSize(QtCore.QSize(18, 18)) self.settings_button.setFlat(True) self.settings_button.setObjectName("settings_button") self.verticalLayout.addWidget(self.settings_button) - spacerItem2 = QtWidgets.QSpacerItem(20, 431, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.verticalLayout.addItem(spacerItem2) + spacerItem1 = QtWidgets.QSpacerItem(20, 431, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem1) self.gridLayout_4.addWidget(self.button_menu, 0, 1, 1, 1) self.mode_tab_widget.addTab(self.art, "") - self.tab_5 = QtWidgets.QWidget() - self.tab_5.setObjectName("tab_5") - self.gridLayout_6 = QtWidgets.QGridLayout(self.tab_5) - self.gridLayout_6.setContentsMargins(0, 0, 0, 0) - self.gridLayout_6.setObjectName("gridLayout_6") - self.model_manager = ModelManagerWidget(parent=self.tab_5) - self.model_manager.setObjectName("model_manager") - self.gridLayout_6.addWidget(self.model_manager, 0, 0, 1, 1) - self.mode_tab_widget.addTab(self.tab_5, "") self.gridLayout_3.addWidget(self.main_splitter, 1, 0, 1, 1) self.main_splitter.raise_() self.header_widget.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1144, 22)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1201, 22)) font = QtGui.QFont() font.setPointSize(11) self.menubar.setFont(font) @@ -579,15 +519,15 @@ def setupUi(self, MainWindow): self.actionPaste = QtGui.QAction(parent=MainWindow) self.actionPaste.setObjectName("actionPaste") self.actionUndo = QtGui.QAction(parent=MainWindow) - icon13 = QtGui.QIcon() - icon13.addPixmap(QtGui.QPixmap("/home/joe/Projects/imagetopixel/airunner/src/airunner/../../src/airunner/windows/main/templates/../../../../../../../../../../../../../../.designer/src/icons/007-undo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionUndo.setIcon(icon13) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap("/home/joe/Projects/imagetopixel/airunner/src/airunner/../../src/airunner/windows/main/templates/../../../../../../../../../../../../../../.designer/src/icons/007-undo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionUndo.setIcon(icon9) self.actionUndo.setWhatsThis("") self.actionUndo.setObjectName("actionUndo") self.actionRedo = QtGui.QAction(parent=MainWindow) - icon14 = QtGui.QIcon() - icon14.addPixmap(QtGui.QPixmap("/home/joe/Projects/imagetopixel/airunner/src/airunner/../../src/airunner/windows/main/templates/../../../../../../../../../../../../../../.designer/src/icons/008-redo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionRedo.setIcon(icon14) + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap("/home/joe/Projects/imagetopixel/airunner/src/airunner/../../src/airunner/windows/main/templates/../../../../../../../../../../../../../../.designer/src/icons/008-redo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionRedo.setIcon(icon10) self.actionRedo.setObjectName("actionRedo") self.actionGrid = QtGui.QAction(parent=MainWindow) self.actionGrid.setObjectName("actionGrid") @@ -703,10 +643,10 @@ def setupUi(self, MainWindow): self.actionClear_all_prompts = QtGui.QAction(parent=MainWindow) self.actionClear_all_prompts.setObjectName("actionClear_all_prompts") self.actionUndo_2 = QtGui.QAction(parent=MainWindow) - self.actionUndo_2.setIcon(icon13) + self.actionUndo_2.setIcon(icon9) self.actionUndo_2.setObjectName("actionUndo_2") self.actionRedo_2 = QtGui.QAction(parent=MainWindow) - self.actionRedo_2.setIcon(icon14) + self.actionRedo_2.setIcon(icon10) self.actionRedo_2.setObjectName("actionRedo_2") self.actionCut = QtGui.QAction(parent=MainWindow) self.actionCut.setObjectName("actionCut") @@ -822,6 +762,7 @@ def setupUi(self, MainWindow): self.menuBrowse_Models_Path.addAction(self.actionUpscale) self.menuBrowse_Models_Path.addAction(self.actionTxt2vid) self.menuView.addAction(self.actionPrompt_Browser) + self.menuView.addSeparator() self.menuView.addAction(self.actionHuggingface_Cache_manager) self.menuView.addAction(self.actionBrowse_AI_Runner_Path) self.menuView.addAction(self.menuBrowse_Models_Path.menuAction()) @@ -878,21 +819,7 @@ def setupUi(self, MainWindow): self.actionDeterministic_Batches.triggered.connect(MainWindow.action_show_deterministic_batches) # type: ignore self.actionStandard_Batches.triggered.connect(MainWindow.action_show_standard_batches) # type: ignore self.actionLLM_beta.triggered.connect(MainWindow.action_show_llm) # type: ignore - self.image_generation_button.pressed.connect(MainWindow.image_generation_toggled) # type: ignore - self.model_manager_button.pressed.connect(MainWindow.model_manager_toggled) # type: ignore self.center_tab.currentChanged['int'].connect(MainWindow.center_panel_tab_index_changed) # type: ignore - self.file_new_button.clicked.connect(MainWindow.action_new_document_triggered) # type: ignore - self.undo_button.clicked.connect(MainWindow.action_undo_triggered) # type: ignore - self.redo_button.clicked.connect(MainWindow.action_redo_triggered) # type: ignore - self.export_button.clicked.connect(MainWindow.action_export_image_triggered) # type: ignore - self.image_generators_button.pressed.connect(MainWindow.image_generators_toggled) # type: ignore - self.txt2vid_button.pressed.connect(MainWindow.text_to_video_toggled) # type: ignore - self.prompt_builder_button.pressed.connect(MainWindow.prompt_builder_toggled) # type: ignore - self.image_generation_button.released.connect(MainWindow.image_generation_toggled) # type: ignore - self.model_manager_button.released.connect(MainWindow.model_manager_toggled) # type: ignore - self.image_generators_button.released.connect(MainWindow.image_generators_toggled) # type: ignore - self.txt2vid_button.released.connect(MainWindow.text_to_video_toggled) # type: ignore - self.prompt_builder_button.released.connect(MainWindow.prompt_builder_toggled) # type: ignore self.settings_button.clicked.connect(MainWindow.action_show_settings) # type: ignore self.toggle_grid_button.toggled['bool'].connect(MainWindow.action_toggle_grid) # type: ignore self.toggle_active_grid_area_button.toggled['bool'].connect(MainWindow.action_toggle_active_grid_area) # type: ignore @@ -903,16 +830,16 @@ def setupUi(self, MainWindow): self.actionReport_vulnerability.triggered.connect(MainWindow.action_open_vulnerability_report) # type: ignore self.focus_button.clicked.connect(MainWindow.action_center_clicked) # type: ignore self.ai_button.toggled['bool'].connect(MainWindow.action_ai_toggled) # type: ignore + self.file_new_button.clicked.connect(MainWindow.action_new_document_triggered) # type: ignore + self.export_button.clicked.connect(MainWindow.action_export_image_triggered) # type: ignore + self.undo_button.clicked.connect(MainWindow.action_undo_triggered) # type: ignore + self.redo_button.clicked.connect(MainWindow.action_redo_triggered) # type: ignore + self.model_manager_button.toggled['bool'].connect(MainWindow.model_manager_toggled) # type: ignore QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "AI Runner")) - self.image_generation_button.setToolTip(_translate("MainWindow", "Image Generation")) - self.model_manager_button.setToolTip(_translate("MainWindow", "Model manager")) - self.image_generators_button.setToolTip(_translate("MainWindow", "Image generators")) - self.txt2vid_button.setToolTip(_translate("MainWindow", "Text to Video")) - self.prompt_builder_button.setToolTip(_translate("MainWindow", "Prompt Builder")) self.file_new_button.setToolTip(_translate("MainWindow", "New")) self.open_button.setToolTip(_translate("MainWindow", "Open")) self.save_button.setToolTip(_translate("MainWindow", "Save")) @@ -920,8 +847,8 @@ def retranslateUi(self, MainWindow): self.undo_button.setToolTip(_translate("MainWindow", "Undo")) self.redo_button.setToolTip(_translate("MainWindow", "Redo")) self.center_tab.setTabText(self.center_tab.indexOf(self.tab_image), _translate("MainWindow", "Canvas")) - self.center_tab.setTabText(self.center_tab.indexOf(self.tab_txt2vid), _translate("MainWindow", "Video")) self.center_tab.setTabText(self.center_tab.indexOf(self.tab_prompt_builder), _translate("MainWindow", "Prompt Builder")) + self.center_tab.setTabText(self.center_tab.indexOf(self.tab), _translate("MainWindow", "Model Manager")) self.tool_tab_widget.setTabText(self.tool_tab_widget.indexOf(self.tab_pen), _translate("MainWindow", "Pen")) self.tool_tab_widget.setTabText(self.tool_tab_widget.indexOf(self.tab_active_grid), _translate("MainWindow", "Active Grid")) self.toggle_active_grid_area_button.setToolTip(_translate("MainWindow", "Active grid area selection tool")) @@ -929,9 +856,10 @@ def retranslateUi(self, MainWindow): self.toggle_eraser_button.setToolTip(_translate("MainWindow", "Eraser tool")) self.toggle_grid_button.setToolTip(_translate("MainWindow", "Toggle Grid")) self.focus_button.setToolTip(_translate("MainWindow", "Recenter canvas")) + self.ai_button.setToolTip(_translate("MainWindow", "Toggle AI Mode")) + self.model_manager_button.setToolTip(_translate("MainWindow", "Model manager")) self.settings_button.setToolTip(_translate("MainWindow", "AI Runner Settings")) self.mode_tab_widget.setTabText(self.mode_tab_widget.indexOf(self.art), _translate("MainWindow", "Image Generation")) - self.mode_tab_widget.setTabText(self.mode_tab_widget.indexOf(self.tab_5), _translate("MainWindow", "Model Manager")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuEdit.setTitle(_translate("MainWindow", "Edit")) self.menuFilters.setTitle(_translate("MainWindow", "Filters")) From d166e73ea94f5be218ce1333339443cce8ed9a30 Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:25:24 -0700 Subject: [PATCH 5/6] added handle_prompt_builder_button_toggled --- src/airunner/widgets/generator_form/generator_form_widget.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/airunner/widgets/generator_form/generator_form_widget.py b/src/airunner/widgets/generator_form/generator_form_widget.py index 446e62d0d..7f6e25699 100644 --- a/src/airunner/widgets/generator_form/generator_form_widget.py +++ b/src/airunner/widgets/generator_form/generator_form_widget.py @@ -603,4 +603,7 @@ def update_prompt(self, prompt): self.ui.prompt.setPlainText(prompt) def update_negative_prompt(self, prompt): - self.ui.negative_prompt.setPlainText(prompt) \ No newline at end of file + self.ui.negative_prompt.setPlainText(prompt) + + def handle_prompt_builder_button_toggled(self, val): + self.app.toggle_prompt_builder(val) \ No newline at end of file From 7ae78be0decd261f54c42ca07d6a71bc350387ec Mon Sep 17 00:00:00 2001 From: w4ffl35 <25737761+w4ffl35@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:25:37 -0700 Subject: [PATCH 6/6] updated generator form widget --- .../generator_form/templates/generatorform.ui | 53 +++++++++++++++---- .../templates/generatorform_ui.py | 13 ++++- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/airunner/widgets/generator_form/templates/generatorform.ui b/src/airunner/widgets/generator_form/templates/generatorform.ui index 3eff2d839..342f41a8c 100644 --- a/src/airunner/widgets/generator_form/templates/generatorform.ui +++ b/src/airunner/widgets/generator_form/templates/generatorform.ui @@ -37,7 +37,7 @@ - 0 + 1 @@ -123,6 +123,20 @@ + + + + + + + + :/icons/light/prompt-editor-icon.svg:/icons/light/prompt-editor-icon.svg + + + true + + + @@ -232,16 +246,16 @@ - 8 + 0 - 8 + 0 - 8 + 0 - 8 + 0 @@ -288,8 +302,8 @@ handle_interrupt_button_clicked() - 350 - 1053 + 349 + 1052 0 @@ -304,8 +318,8 @@ handle_generate_button_clicked() - 39 - 1053 + 41 + 1052 0 @@ -336,8 +350,8 @@ handle_negative_prompt_changed() - 270 - 1024 + 272 + 1023 93 @@ -345,6 +359,22 @@ + + prompt_builder_button + toggled(bool) + generator_form + handle_prompt_builder_button_toggled(bool) + + + 251 + 49 + + + 212 + -12 + + + handle_prompt_changed() @@ -359,5 +389,6 @@ save_settings() handle_pipeline_changed(QString) handle_version_changed(QString) + handle_prompt_builder_button_toggled(bool) diff --git a/src/airunner/widgets/generator_form/templates/generatorform_ui.py b/src/airunner/widgets/generator_form/templates/generatorform_ui.py index fb3317724..747e441f8 100644 --- a/src/airunner/widgets/generator_form/templates/generatorform_ui.py +++ b/src/airunner/widgets/generator_form/templates/generatorform_ui.py @@ -50,6 +50,14 @@ def setupUi(self, generator_form): self.horizontalLayout_6.setObjectName("horizontalLayout_6") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout_6.addItem(spacerItem) + self.prompt_builder_button = QtWidgets.QPushButton(parent=self.layoutWidget) + self.prompt_builder_button.setText("") + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/icons/light/prompt-editor-icon.svg"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.prompt_builder_button.setIcon(icon) + self.prompt_builder_button.setCheckable(True) + self.prompt_builder_button.setObjectName("prompt_builder_button") + self.horizontalLayout_6.addWidget(self.prompt_builder_button) self.pushButton = QtWidgets.QPushButton(parent=self.layoutWidget) self.pushButton.setObjectName("pushButton") self.horizontalLayout_6.addWidget(self.pushButton) @@ -100,7 +108,7 @@ def setupUi(self, generator_form): self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_2) - self.gridLayout_5.setContentsMargins(8, 8, 8, 8) + self.gridLayout_5.setContentsMargins(0, 0, 0, 0) self.gridLayout_5.setObjectName("gridLayout_5") self.widget = ChatPromptWidget(parent=self.tab_2) self.widget.setObjectName("widget") @@ -109,12 +117,13 @@ def setupUi(self, generator_form): self.gridLayout_4.addWidget(self.generator_form_tabs, 0, 0, 1, 1) self.retranslateUi(generator_form) - self.generator_form_tabs.setCurrentIndex(0) + self.generator_form_tabs.setCurrentIndex(1) self.pushButton.clicked.connect(generator_form.action_clicked_button_save_prompts) # type: ignore self.interrupt_button.clicked.connect(generator_form.handle_interrupt_button_clicked) # type: ignore self.generate_button.clicked.connect(generator_form.handle_generate_button_clicked) # type: ignore self.prompt.textChanged.connect(generator_form.handle_prompt_changed) # type: ignore self.negative_prompt.textChanged.connect(generator_form.handle_negative_prompt_changed) # type: ignore + self.prompt_builder_button.toggled['bool'].connect(generator_form.handle_prompt_builder_button_toggled) # type: ignore QtCore.QMetaObject.connectSlotsByName(generator_form) def retranslateUi(self, generator_form):