feat: add date_format and hour_format settings (#904)

* feat: add date_format and hour_format settings

* fix: fix ruff validation errors

* fix: use ruff format command

* fix: Refactor code and improve some logic

* fix: remove unused import

* Added zero padding setting and implement some comments

* Add test assert property

* fix: Unclutter selector and clarify zero-padding literal

* fix: Use static strings

Co-authored-by: Tony <1414927+zfbx@users.noreply.github.com>

---------

Co-authored-by: Tony <1414927+zfbx@users.noreply.github.com>
This commit is contained in:
JCC1998
2025-05-04 19:46:26 +02:00
committed by GitHub
parent 97ee43c875
commit f770614c4e
6 changed files with 87 additions and 2 deletions

View File

@@ -49,6 +49,9 @@ class GlobalSettings(BaseModel):
page_size: int = Field(default=100)
show_filepath: ShowFilepathOption = Field(default=ShowFilepathOption.DEFAULT)
theme: Theme = Field(default=Theme.SYSTEM)
date_format: str = Field(default="%x")
hour_format: bool = Field(default=True)
zero_padding: bool = Field(default=True)
@staticmethod
def read_settings(path: Path = DEFAULT_GLOBAL_SETTINGS_PATH) -> "GlobalSettings":

View File

@@ -3,6 +3,7 @@
# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
from datetime import datetime as dt
from typing import TYPE_CHECKING
from PySide6.QtCore import Qt
@@ -37,6 +38,24 @@ THEME_MAP: dict[Theme, str] = {
Theme.SYSTEM: Translations["settings.theme.system"],
}
DATE_FORMAT_MAP: dict[str, str] = {
"%d/%m/%y": "21/08/24",
"%d/%m/%Y": "21/08/2024",
"%d.%m.%y": "21.08.24",
"%d.%m.%Y": "21.08.2024",
"%d-%m-%y": "21-08-24",
"%d-%m-%Y": "21-08-2024",
"%x": "08/21/24",
"%m/%d/%Y": "08/21/2024",
"%m-%d-%y": "08-21-24",
"%m-%d-%Y": "08-21-2024",
"%m.%d.%y": "08.21.24",
"%m.%d.%Y": "08.21.2024",
"%Y/%m/%d": "2024/08/21",
"%Y-%m-%d": "2024-08-21",
"%Y.%m.%d": "2024.08.21",
}
class SettingsPanel(PanelWidget):
driver: "QtDriver"
@@ -147,6 +166,27 @@ class SettingsPanel(PanelWidget):
self.theme_combobox.currentIndexChanged.connect(self.__update_restart_label)
form_layout.addRow(Translations["settings.theme.label"], self.theme_combobox)
# Date Format
self.dateformat_combobox = QComboBox()
for k in DATE_FORMAT_MAP:
self.dateformat_combobox.addItem(DATE_FORMAT_MAP[k], k)
dateformat: str = self.driver.settings.date_format
if dateformat not in DATE_FORMAT_MAP:
dateformat = "%x"
self.dateformat_combobox.setCurrentIndex(list(DATE_FORMAT_MAP.keys()).index(dateformat))
self.dateformat_combobox.currentIndexChanged.connect(self.__update_restart_label)
form_layout.addRow(Translations["settings.dateformat.label"], self.dateformat_combobox)
# 24-Hour Format
self.hourformat_checkbox = QCheckBox()
self.hourformat_checkbox.setChecked(self.driver.settings.hour_format)
form_layout.addRow(Translations["settings.hourformat.label"], self.hourformat_checkbox)
# Zero-padding
self.zeropadding_checkbox = QCheckBox()
self.zeropadding_checkbox.setChecked(self.driver.settings.zero_padding)
form_layout.addRow(Translations["settings.zeropadding.label"], self.zeropadding_checkbox)
def __build_library_settings(self):
self.library_settings_container = QWidget()
form_layout = QFormLayout(self.library_settings_container)
@@ -167,6 +207,9 @@ class SettingsPanel(PanelWidget):
"page_size": int(self.page_size_line_edit.text()),
"show_filepath": self.filepath_combobox.currentData(),
"theme": self.theme_combobox.currentData(),
"date_format": self.dateformat_combobox.currentData(),
"hour_format": self.hourformat_checkbox.isChecked(),
"zero_padding": self.zeropadding_checkbox.isChecked(),
}
def update_settings(self, driver: "QtDriver"):
@@ -179,6 +222,9 @@ class SettingsPanel(PanelWidget):
driver.settings.page_size = settings["page_size"]
driver.settings.show_filepath = settings["show_filepath"]
driver.settings.theme = settings["theme"]
driver.settings.date_format = settings["date_format"]
driver.settings.hour_format = settings["hour_format"]
driver.settings.zero_padding = settings["zero_padding"]
driver.settings.save()

View File

@@ -109,11 +109,11 @@ class FileAttributes(QWidget):
created = dt.fromtimestamp(filepath.stat().st_ctime)
modified: dt = dt.fromtimestamp(filepath.stat().st_mtime)
self.date_created_label.setText(
f"<b>{Translations['file.date_created']}:</b> {dt.strftime(created, '%a, %x, %X')}"
f"<b>{Translations['file.date_created']}:</b> {self.get_date_with_format(created)}"
)
self.date_modified_label.setText(
f"<b>{Translations['file.date_modified']}:</b> "
f"{dt.strftime(modified, '%a, %x, %X')}"
f"{self.get_date_with_format(modified)}"
)
self.date_created_label.setHidden(False)
self.date_modified_label.setHidden(False)
@@ -246,3 +246,21 @@ class FileAttributes(QWidget):
self.file_label.set_file_path("")
self.dimensions_label.setText("")
self.dimensions_label.setHidden(True)
def get_date_with_format(self, date: dt) -> str:
date_format = self.driver.settings.date_format
is_24h = self.driver.settings.hour_format
hour_format = "%H:%M:%S" if is_24h else "%I:%M:%S %p"
zero_padding = self.driver.settings.zero_padding
zero_padding_symbol = ""
if not zero_padding:
zero_padding_symbol = "#" if platform.system() == "Windows" else "-"
date_format = date_format.replace("%d", f"%{zero_padding_symbol}d").replace(
"%m", f"%{zero_padding_symbol}m"
)
hour_format = hour_format.replace("%H", f"%{zero_padding_symbol}H").replace(
"%I", f"%{zero_padding_symbol}I"
)
return dt.strftime(date, f"{date_format}, {hour_format}")

View File

@@ -247,6 +247,12 @@
"settings.theme.label": "Theme:",
"settings.theme.light": "Light",
"settings.theme.system": "System",
"settings.dateformat.label": "Date Format",
"settings.dateformat.system": "System",
"settings.dateformat.english": "English",
"settings.dateformat.international": "International",
"settings.hourformat.label": "24-Hour Time",
"settings.zeropadding.label": "Date Zero-Padding",
"settings.title": "Settings",
"sorting.direction.ascending": "Ascending",
"sorting.direction.descending": "Descending",

View File

@@ -236,6 +236,12 @@
"settings.restart_required": "Por favor, reinicia TagStudio para que se los cambios surtan efecto.",
"settings.show_filenames_in_grid": "Mostrar el nombre de archivo en la cuadrícula",
"settings.show_recent_libraries": "Mostrar bibliotecas recientes",
"settings.dateformat.label": "Formato fecha",
"settings.dateformat.system": "Sistema",
"settings.dateformat.english": "Inglés",
"settings.dateformat.international": "Internacional",
"settings.hourformat.label": "Formato 24-horas",
"settings.zeropadding.label": "Rellenar ceros en fechas",
"settings.title": "Ajustes",
"sorting.direction.ascending": "Ascendiente",
"sorting.direction.descending": "Descendiente",

View File

@@ -16,6 +16,9 @@ def test_read_settings():
page_size = 1337
show_filepath = 0
dark_mode = 2
date_format = "%x"
hour_format = true
zero_padding = true
""")
settings = GlobalSettings.read_settings(settings_path)
@@ -26,3 +29,6 @@ def test_read_settings():
assert settings.page_size == 1337
assert settings.show_filepath == 0
assert settings.theme == Theme.SYSTEM
assert settings.date_format == "%x"
assert settings.hour_format
assert settings.zero_padding