From 9a78bf306696da16be97bb381af199d010482717 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:30:29 -0700 Subject: [PATCH] feat(ui): show file creation/modified dates + restyle path label (#430) * feat(ui): show file dates, change path look * use `os.path.sep` * refactor: simplify file label cases --- tagstudio/src/qt/widgets/preview_panel.py | 101 +++++++++++++++++----- 1 file changed, 80 insertions(+), 21 deletions(-) diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 9dc68db40..cf02d45fd 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -3,6 +3,7 @@ # Created for TagStudio: https://github.com/CyanVoxel/TagStudio import logging +import os from pathlib import Path import platform import time @@ -98,6 +99,21 @@ def __init__(self, library: Library, driver: "QtDriver"): image_layout = QHBoxLayout(self.image_container) image_layout.setContentsMargins(0, 0, 0, 0) + file_label_style = "font-size: 12px" + properties_style = ( + f"background-color:{self.label_bg_color};" + "color:#FFFFFF;" + "font-family:Oxanium;" + "font-weight:bold;" + "font-size:12px;" + "border-radius:3px;" + "padding-top: 4px;" + "padding-right: 1px;" + "padding-bottom: 1px;" + "padding-left: 1px;" + ) + date_style = "font-size:12px;" + self.open_file_action = QAction("Open file", self) self.trash_term: str = "Trash" if platform.system() == "Windows": @@ -157,31 +173,26 @@ def __init__(self, library: Library, driver: "QtDriver"): image_layout.addWidget(self.preview_vid) image_layout.setAlignment(self.preview_vid, Qt.AlignmentFlag.AlignCenter) self.image_container.setMinimumSize(*self.img_button_size) - self.file_label = FileOpenerLabel("Filename") + self.file_label = FileOpenerLabel("filename") + self.file_label.setTextFormat(Qt.TextFormat.RichText) self.file_label.setWordWrap(True) self.file_label.setTextInteractionFlags( Qt.TextInteractionFlag.TextSelectableByMouse ) - self.file_label.setStyleSheet("font-weight: bold; font-size: 12px") + self.file_label.setStyleSheet(file_label_style) - self.dimensions_label = QLabel("Dimensions") - self.dimensions_label.setWordWrap(True) - # self.dim_label.setTextInteractionFlags( - # Qt.TextInteractionFlag.TextSelectableByMouse) + self.date_created_label = QLabel("dateCreatedLabel") + self.date_created_label.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.date_created_label.setTextFormat(Qt.TextFormat.RichText) + self.date_created_label.setStyleSheet(date_style) - properties_style = ( - f"background-color:{self.label_bg_color};" - "color:#FFFFFF;" - "font-family:Oxanium;" - "font-weight:bold;" - "font-size:12px;" - "border-radius:3px;" - "padding-top: 4px;" - "padding-right: 1px;" - "padding-bottom: 1px;" - "padding-left: 1px;" - ) + self.date_modified_label = QLabel("dateModifiedLabel") + self.date_modified_label.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.date_modified_label.setTextFormat(Qt.TextFormat.RichText) + self.date_modified_label.setStyleSheet(date_style) + self.dimensions_label = QLabel("dimensionsLabel") + self.dimensions_label.setWordWrap(True) self.dimensions_label.setStyleSheet(properties_style) self.scroll_layout = QVBoxLayout() @@ -219,7 +230,15 @@ def __init__(self, library: Library, driver: "QtDriver"): ) scroll_area.setWidget(scroll_container) + date_container = QWidget() + date_layout = QVBoxLayout(date_container) + date_layout.setContentsMargins(0, 2, 0, 0) + date_layout.setSpacing(0) + date_layout.addWidget(self.date_created_label) + date_layout.addWidget(self.date_modified_label) + info_layout.addWidget(self.file_label) + info_layout.addWidget(date_container) info_layout.addWidget(self.dimensions_label) info_layout.addWidget(scroll_area) @@ -470,6 +489,28 @@ def add_field_to_selected(self, field_list: list[QModelIndex]): for field_item in field_list: self.lib.add_field_to_entry(item_id, field_item.row()) + def update_date_label(self, filepath: Path | None = None) -> None: + """Update the "Date Created" and "Date Modified" file property labels.""" + if filepath and filepath.is_file(): + created: dt = dt.fromtimestamp(filepath.stat().st_ctime) + modified: dt = dt.fromtimestamp(filepath.stat().st_mtime) + self.date_created_label.setText( + f"Date Created: {dt.strftime(created, "%a, %x, %X")}" + ) + self.date_modified_label.setText( + f"Date Modified: {dt.strftime(modified, "%a, %x, %X")}" + ) + self.date_created_label.setHidden(False) + self.date_modified_label.setHidden(False) + elif filepath: + self.date_created_label.setText("Date Created: N/A") + self.date_modified_label.setText("Date Modified: N/A") + self.date_created_label.setHidden(False) + self.date_modified_label.setHidden(False) + else: + self.date_created_label.setHidden(True) + self.date_modified_label.setHidden(True) + # def update_widgets(self, item: Union[Entry, Collation, Tag]): def update_widgets(self): """ @@ -486,11 +527,12 @@ def update_widgets(self): # 0 Selected Items if not self.driver.selected: if self.selected or not self.initialized: - self.file_label.setText("No Items Selected") + self.file_label.setText("No Items Selected") self.file_label.setFilePath("") self.file_label.setCursor(Qt.CursorShape.ArrowCursor) self.dimensions_label.setText("") + self.update_date_label() self.preview_img.setContextMenuPolicy( Qt.ContextMenuPolicy.NoContextMenu ) @@ -546,7 +588,17 @@ def update_widgets(self): ratio, update_on_ratio_change=True, ) - self.file_label.setText("\u200b".join(str(filepath))) + file_str: str = "" + separator: str = ( + f"{os.path.sep}" # Gray + ) + for i, part in enumerate(filepath.parts): + part_ = part.strip(os.path.sep) + if i != len(filepath.parts) - 1: + file_str += f"{"\u200b".join(part_)}{separator}" + else: + file_str += f"
{"\u200b".join(part_)}" + self.file_label.setText(file_str) self.file_label.setCursor(Qt.CursorShape.PointingHandCursor) self.preview_img.setContextMenuPolicy( @@ -675,6 +727,7 @@ def update_widgets(self): self.dimensions_label.setText( f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}" ) + self.update_date_label(filepath) if not filepath.is_file(): raise FileNotFoundError @@ -684,12 +737,14 @@ def update_widgets(self): logging.info( f"[PreviewPanel][ERROR] Couldn't Render thumbnail for {filepath} (because of {e})" ) + self.update_date_label() except (FileNotFoundError, cv2.error) as e: self.dimensions_label.setText(f"{ext.upper()[1:]}") logging.info( f"[PreviewPanel][ERROR] Couldn't Render thumbnail for {filepath} (because of {e})" ) + self.update_date_label() except ( UnidentifiedImageError, DecompressionBombError, @@ -700,6 +755,7 @@ def update_widgets(self): logging.info( f"[PreviewPanel][ERROR] Couldn't Render thumbnail for {filepath} (because of {e})" ) + self.update_date_label(filepath) # TODO: Implement a clickable label to use for the GIF preview. if self.preview_img.is_connected: @@ -735,8 +791,11 @@ def update_widgets(self): self.preview_gif.hide() self.preview_vid.stop() self.preview_vid.hide() + self.update_date_label() if self.selected != self.driver.selected: - self.file_label.setText(f"{len(self.driver.selected)} Items Selected") + self.file_label.setText( + f"{len(self.driver.selected)} Items Selected" + ) self.file_label.setCursor(Qt.CursorShape.ArrowCursor) self.file_label.setFilePath("") self.dimensions_label.setText("")