Skip to content
114 changes: 67 additions & 47 deletions taggui/dialogs/settings_dialog.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from PySide6.QtCore import Qt, Slot
from PySide6.QtWidgets import (QDialog, QFileDialog, QGridLayout, QLabel,
QLineEdit, QPushButton, QVBoxLayout)
QLineEdit, QPushButton, QTabWidget, QVBoxLayout,
QWidget)

from utils.settings import DEFAULT_SETTINGS, get_settings
from utils.settings_widgets import (SettingsBigCheckBox, SettingsLineEdit,
Expand All @@ -16,33 +17,43 @@ def __init__(self, parent):
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(20)

grid_layout = QGridLayout()
grid_layout.addWidget(QLabel('Font size (pt)'), 0, 0,
Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('File types to show in image list'), 1, 0,
Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('Image width in image list (px)'), 2, 0,
Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('Tag separator'), 3, 0,
Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('Insert space after tag separator'), 4, 0,
Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('Show tag autocomplete suggestions'),
5, 0, Qt.AlignmentFlag.AlignRight)
grid_layout.addWidget(QLabel('Auto-captioning models directory'), 6, 0,
Qt.AlignmentFlag.AlignRight)
# Create tab widget and tabs
tabs = QTabWidget()
appearance_tab = QWidget()
tagging_tab = QWidget()
directories_tab = QWidget()

tabs.addTab(appearance_tab, "Appearance")
tabs.addTab(tagging_tab, "Tagging")
tabs.addTab(directories_tab, "Directories")

# Appearance Tab
appearance_layout = QGridLayout(appearance_tab)
appearance_layout.addWidget(QLabel('Font size (pt)'), 0, 0,
Qt.AlignmentFlag.AlignRight)
font_size_spin_box = SettingsSpinBox(
key='font_size', default=DEFAULT_SETTINGS['font_size'],
minimum=1, maximum=99)
key='font_size', default=DEFAULT_SETTINGS['font_size'], minimum=1,
maximum=99)
font_size_spin_box.valueChanged.connect(self.show_restart_warning)
# Images that are too small cause lag, so set a minimum width.
appearance_layout.addWidget(font_size_spin_box, 0, 1,
Qt.AlignmentFlag.AlignLeft)

appearance_layout.addWidget(QLabel('Image width in image list (px)'),
1, 0, Qt.AlignmentFlag.AlignRight)
image_list_image_width_spin_box = SettingsSpinBox(
key='image_list_image_width',
default=DEFAULT_SETTINGS['image_list_image_width'],
minimum=16, maximum=9999)
default=DEFAULT_SETTINGS['image_list_image_width'], minimum=16,
maximum=9999)
image_list_image_width_spin_box.valueChanged.connect(
self.show_restart_warning)
appearance_layout.addWidget(image_list_image_width_spin_box, 1, 1,
Qt.AlignmentFlag.AlignLeft)

# Tagging Tab
tagging_layout = QGridLayout(tagging_tab)

tagging_layout.addWidget(QLabel('Tag separator'), 1, 0,
Qt.AlignmentFlag.AlignRight)
tag_separator_line_edit = QLineEdit()
tag_separator = self.settings.value(
'tag_separator', defaultValue=DEFAULT_SETTINGS['tag_separator'],
Expand All @@ -51,50 +62,61 @@ def __init__(self, parent):
tag_separator_line_edit.setText(tag_separator)
tag_separator_line_edit.textChanged.connect(
self.handle_tag_separator_change)
tagging_layout.addWidget(tag_separator_line_edit, 1, 1,
Qt.AlignmentFlag.AlignLeft)

tagging_layout.addWidget(QLabel('Insert space after tag separator'),
2, 0, Qt.AlignmentFlag.AlignRight)
insert_space_after_tag_separator_check_box = SettingsBigCheckBox(
key='insert_space_after_tag_separator',
default=DEFAULT_SETTINGS['insert_space_after_tag_separator'])
insert_space_after_tag_separator_check_box.stateChanged.connect(
self.show_restart_warning)
tagging_layout.addWidget(insert_space_after_tag_separator_check_box,
2, 1, Qt.AlignmentFlag.AlignLeft)

tagging_layout.addWidget(QLabel('Show tag autocomplete suggestions'),
3, 0, Qt.AlignmentFlag.AlignRight)
autocomplete_tags_check_box = SettingsBigCheckBox(
key='autocomplete_tags',
default=DEFAULT_SETTINGS['autocomplete_tags'])
autocomplete_tags_check_box.stateChanged.connect(
self.show_restart_warning)
tagging_layout.addWidget(autocomplete_tags_check_box, 3, 1,
Qt.AlignmentFlag.AlignLeft)

# Directories Tab
files_layout = QGridLayout(directories_tab)
files_layout.addWidget(QLabel('File types to show in image list'),
0, 0, Qt.AlignmentFlag.AlignRight)
file_types_line_edit = SettingsLineEdit(
key='image_list_file_formats',
default=DEFAULT_SETTINGS['image_list_file_formats'])
file_types_line_edit.setMinimumWidth(400)
file_types_line_edit.textChanged.connect(self.show_restart_warning)
files_layout.addWidget(file_types_line_edit, 0, 1,
Qt.AlignmentFlag.AlignLeft)

files_layout.addWidget(QLabel('Auto-captioning models directory'),
1, 0, Qt.AlignmentFlag.AlignRight)
self.models_directory_line_edit = SettingsLineEdit(
key='models_directory_path',
default=DEFAULT_SETTINGS['models_directory_path'])
self.models_directory_line_edit.setMinimumWidth(400)
self.models_directory_line_edit.setClearButtonEnabled(True)
self.models_directory_line_edit.textChanged.connect(
self.show_restart_warning)
files_layout.addWidget(self.models_directory_line_edit, 1, 1,
Qt.AlignmentFlag.AlignLeft)

models_directory_button = QPushButton('Select Directory...')
models_directory_button.setFixedWidth(
int(models_directory_button.sizeHint().width() * 1.3))
models_directory_button.clicked.connect(self.set_models_directory_path)
file_types_line_edit = SettingsLineEdit(
key='image_list_file_formats',
default=DEFAULT_SETTINGS['image_list_file_formats'])
file_types_line_edit.setMinimumWidth(400)
file_types_line_edit.textChanged.connect(self.show_restart_warning)
files_layout.addWidget(models_directory_button, 2, 1,
Qt.AlignmentFlag.AlignLeft)

grid_layout.addWidget(font_size_spin_box, 0, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(file_types_line_edit, 1, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(image_list_image_width_spin_box, 2, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(tag_separator_line_edit, 3, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(insert_space_after_tag_separator_check_box, 4, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(autocomplete_tags_check_box, 5, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(self.models_directory_line_edit, 6, 1,
Qt.AlignmentFlag.AlignLeft)
grid_layout.addWidget(models_directory_button, 7, 1,
Qt.AlignmentFlag.AlignLeft)
layout.addLayout(grid_layout)
layout.addWidget(tabs)

# Prevent the grid layout from moving to the center when the warning
# label is hidden.
Expand All @@ -105,8 +127,6 @@ def __init__(self, parent):
self.warning_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.warning_label.setStyleSheet('color: red;')
layout.addWidget(self.warning_label)
# Fix the size of the dialog to its size when the warning label is
# shown.
self.setFixedSize(self.sizeHint())
self.warning_label.hide()

Expand Down Expand Up @@ -136,8 +156,8 @@ def set_models_directory_path(self):
else:
initial_directory_path = ''
models_directory_path = QFileDialog.getExistingDirectory(
parent=self, caption='Select directory containing auto-captioning '
'models',
parent=self,
caption='Select directory containing auto-captioning models',
dir=initial_directory_path)
if models_directory_path:
self.models_directory_line_edit.setText(models_directory_path)