From 7ec29228b5eb193c33c3da6a22345df488a6b9c7 Mon Sep 17 00:00:00 2001 From: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:15:17 +0200 Subject: [PATCH 01/22] Update requirements.txt to also support python3.12 --- requirements.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0ce28a21..93936d66 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ humanfriendly==10.0 -opencv_python==4.8.0.74 +opencv_python>=4.8.0.74,<=4.9.0.80 Pillow==10.3.0 -pillow_avif_plugin==1.3.1 -PySide6==6.5.1.1 -PySide6_Addons==6.5.1.1 -PySide6_Essentials==6.5.1.1 -typing_extensions==3.10.0.0 -ujson==5.8.0 +pillow_avif_plugin>=1.3.1,<=1.4.3 +PySide6>=6.5.1.1,<=6.7 +PySide6_Addons>=6.5.1.1,<=6.7 +PySide6_Essentials>=6.5.1.1,<=6.7 +typing_extensions>=3.10.0.0,<=4.11.0 +ujson>=5.8.0,<=5.9.0 From e8ab8059cdc0d1194341f5fc185ed38c49dbf26f Mon Sep 17 00:00:00 2001 From: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:18:24 +0200 Subject: [PATCH 02/22] Update requirements.txt to support python 3.12 --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 93936d66..0456b920 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,8 +2,8 @@ humanfriendly==10.0 opencv_python>=4.8.0.74,<=4.9.0.80 Pillow==10.3.0 pillow_avif_plugin>=1.3.1,<=1.4.3 -PySide6>=6.5.1.1,<=6.7 -PySide6_Addons>=6.5.1.1,<=6.7 -PySide6_Essentials>=6.5.1.1,<=6.7 +PySide6>=6.5.1.1,<=6.6.3.1 +PySide6_Addons>=6.5.1.1,<=6.6.3.1 +PySide6_Essentials>=6.5.1.1,<=6.6.3.1 typing_extensions>=3.10.0.0,<=4.11.0 ujson>=5.8.0,<=5.9.0 From 0b9b4dac73ed2f85301a2cbd20c67fce88d665d4 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Wed, 24 Apr 2024 13:14:11 -0700 Subject: [PATCH 03/22] Updated Prerequisites to Python 3.12 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a701e635..2afe1c0b 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ TagStudio is a photo & file organization application with an underlying system t ### Prerequisites -- Python 3.9.6 - ~3.10 *(Not working on 3.12)* +- Python 3.12 ### Creating the Virtual Environment From c7492b78d3f442abecc42260b851cf1f3d5d7ce6 Mon Sep 17 00:00:00 2001 From: Dakota Marshall Date: Wed, 24 Apr 2024 15:39:12 -0400 Subject: [PATCH 04/22] Add flake files for working Nix environment --- flake.lock | 27 +++++++++++++++++++++ flake.nix | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..fa6aa60e --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1688072080, + "narHash": "sha256-mPsxREerkmDU2m7zi8j19ooc1F9wKPWBJ77S7swXMmI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5a8650469a9f8a1958ff9373bd27fb8e54c4365d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..ec551544 --- /dev/null +++ b/flake.nix @@ -0,0 +1,70 @@ +{ + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + outputs = { self, nixpkgs, }: + let + pkgs = nixpkgs.legacyPackages.x86_64-linux; + in { + devShells.x86_64-linux.default = pkgs.mkShell { + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ + pkgs.gcc-unwrapped + pkgs.zlib + pkgs.libglvnd + pkgs.glib + pkgs.stdenv.cc.cc + pkgs.fontconfig + pkgs.libxkbcommon + pkgs.xorg.libxcb + pkgs.freetype + pkgs.dbus + pkgs.qt6.qtwayland + pkgs.zstd + ]; + buildInputs = with pkgs; [ + cmake + gdb + zstd + qt6.qtbase + qt6.full + qt6.qtwayland + qtcreator + python310Packages.pip + python310Full + python310Packages.virtualenv # run virtualenv . + # python3Packages.pyqt5 # avoid installing via pip + python310Packages.pyusb # fixes the pyusb 'No backend available' when installed directly via pip + + gcc.cc.libgcc + makeWrapper + bashInteractive + glib + libxkbcommon + freetype + binutils + dbus + coreutils + libGL + libGLU + fontconfig + # wrapQtAppsHook + xorg.libxcb + + + # this is for the shellhook portion + qt6.wrapQtAppsHook + makeWrapper + bashInteractive + ]; + # set the environment variables that Qt apps expect + shellHook = '' + export QT_QPA_PLATFORM=wayland + export LIBRARY_PATH=/usr/lib:/usr/lib64:$LIBRARY_PATH + # export LD_LIBRARY_PATH=${pkgs.stdenv.cc.cc.lib}/lib/:/run/opengl-driver/lib/ + export QT_PLUGIN_PATH=${pkgs.qt6.qtbase}/${pkgs.qt6.qtbase.qtPluginPrefix} + bashdir=$(mktemp -d) + makeWrapper "$(type -p bash)" "$bashdir/bash" "''${qtWrapperArgs[@]}" + exec "$bashdir/bash" + ''; + }; + }; +} From c4e8d40abe84f90b5e4b16a769e75cb954ef9ded Mon Sep 17 00:00:00 2001 From: Dakota Marshall Date: Wed, 24 Apr 2024 15:39:21 -0400 Subject: [PATCH 05/22] Update bash script to use env for nix support --- TagStudio.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TagStudio.sh b/TagStudio.sh index 82036413..cff969c3 100755 --- a/TagStudio.sh +++ b/TagStudio.sh @@ -1,5 +1,5 @@ -#! /bin/bash +#! /usr/bin/env bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -python tagstudio/tagstudio.py \ No newline at end of file +python tagstudio/tagstudio.py From bc0f8b991ea5ba6ef2ad278d815ae9b47ac4173f Mon Sep 17 00:00:00 2001 From: Dakota Marshall Date: Wed, 24 Apr 2024 15:39:36 -0400 Subject: [PATCH 06/22] Update install documentation for NixOS --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2afe1c0b..3563733f 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,10 @@ With the virtual environment loaded, run the python file at "tagstudio/tagstudio Run the "TagStudio.sh" script, and the program should launch! (Make sure that the script is marked as executable). Note that launching from the script from outside of a terminal will not launch a terminal window with any debug or crash information. If you wish to see this information, just launch the shell script directly from your terminal with `sh TagStudio.sh`. +##### NixOS + +Use the provided `flake.nix` file to create and enter a working environment by running `nix develop`. Then, run the above `TagStudio.sh` script. + ## Usage ### Creating/Opening a Library From 4184848f9ce623a6a6ab32c8f5fec62af6c75706 Mon Sep 17 00:00:00 2001 From: Dakota Marshall Date: Wed, 24 Apr 2024 16:51:06 -0400 Subject: [PATCH 07/22] Update Nix flake pinned hash for python3.12 and QT 6.6.3 support --- flake.lock | 6 +++--- flake.nix | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/flake.lock b/flake.lock index fa6aa60e..5dafd370 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1688072080, - "narHash": "sha256-mPsxREerkmDU2m7zi8j19ooc1F9wKPWBJ77S7swXMmI=", + "lastModified": 1712473363, + "narHash": "sha256-TIScFAVdI2yuybMxxNjC4YZ/j++c64wwuKbpnZnGiyU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "5a8650469a9f8a1958ff9373bd27fb8e54c4365d", + "rev": "e89cf1c932006531f454de7d652163a9a5c86668", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index ec551544..f827ba07 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,8 @@ pkgs.freetype pkgs.dbus pkgs.qt6.qtwayland + pkgs.qt6.full + pkgs.qt6.qtbase pkgs.zstd ]; buildInputs = with pkgs; [ @@ -28,13 +30,12 @@ qt6.full qt6.qtwayland qtcreator - python310Packages.pip - python310Full - python310Packages.virtualenv # run virtualenv . - # python3Packages.pyqt5 # avoid installing via pip - python310Packages.pyusb # fixes the pyusb 'No backend available' when installed directly via pip + python312Packages.pip + python312Full + python312Packages.virtualenv # run virtualenv . + python312Packages.pyusb # fixes the pyusb 'No backend available' when installed directly via pip - gcc.cc.libgcc + libgcc makeWrapper bashInteractive glib @@ -46,7 +47,6 @@ libGL libGLU fontconfig - # wrapQtAppsHook xorg.libxcb From 432f4851f3e02baa487951f0d889bc24fa35180a Mon Sep 17 00:00:00 2001 From: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Date: Thu, 25 Apr 2024 00:02:32 +0200 Subject: [PATCH 08/22] Update library.py to not duplicate default tags on save --- tagstudio/src/core/library.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index 06caf78b..4b74fe08 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -576,7 +576,7 @@ class Library: if not os.path.isdir(full_collage_path): os.mkdir(full_collage_path) - def verify_default_tags(self, tag_list: list) -> dict: + def verify_default_tags(self, tag_list: list) -> list: """ Ensures that the default builtin tags are present in the Library's save file. Takes in and returns the tag dictionary from the JSON file. @@ -856,10 +856,10 @@ class Library: } print('[LIBRARY] Formatting Tags to JSON...') - file_to_save['tags'] = self.verify_default_tags(file_to_save['tags']) for tag in self.tags: file_to_save["tags"].append(tag.compressed_dict()) - + + file_to_save['tags'] = self.verify_default_tags(file_to_save['tags']) print('[LIBRARY] Formatting Entries to JSON...') for entry in self.entries: file_to_save["entries"].append(entry.compressed_dict()) From 4a55af66ee7e72c24e598d2ef707d0004b188fb4 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Wed, 24 Apr 2024 16:22:36 -0700 Subject: [PATCH 09/22] Remove duplicate tag IDs when loading library Tags with duplicate IDs inside a library save file are removed when opening the library. Cleans up the mess from #38. --- tagstudio/src/core/library.py | 68 ++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index 4b74fe08..ac35ec7f 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -630,41 +630,45 @@ class Library: if 'id' in tag.keys(): id = tag['id'] - if int(id) >= self._next_tag_id: - self._next_tag_id = int(id) + 1 + # Don't load tags with duplicate IDs + if id not in [t.id for t in self.tags]: + if int(id) >= self._next_tag_id: + self._next_tag_id = int(id) + 1 - name = '' - if 'name' in tag.keys(): - name = tag['name'] - shorthand = '' - if 'shorthand' in tag.keys(): - shorthand = tag['shorthand'] - aliases = [] - if 'aliases' in tag.keys(): - aliases = tag['aliases'] - subtag_ids = [] - if 'subtag_ids' in tag.keys(): - subtag_ids = tag['subtag_ids'] - color = '' - if 'color' in tag.keys(): - color = tag['color'] + name = '' + if 'name' in tag.keys(): + name = tag['name'] + shorthand = '' + if 'shorthand' in tag.keys(): + shorthand = tag['shorthand'] + aliases = [] + if 'aliases' in tag.keys(): + aliases = tag['aliases'] + subtag_ids = [] + if 'subtag_ids' in tag.keys(): + subtag_ids = tag['subtag_ids'] + color = '' + if 'color' in tag.keys(): + color = tag['color'] - t = Tag( - id=int(id), - name=name, - shorthand=shorthand, - aliases=aliases, - subtags_ids=subtag_ids, - color=color - ) + t = Tag( + id=int(id), + name=name, + shorthand=shorthand, + aliases=aliases, + subtags_ids=subtag_ids, + color=color + ) - # NOTE: This does NOT use the add_tag_to_library() method! - # That method is only used for Tags added at runtime. - # This process uses the same inner methods, but waits until all of the - # Tags are registered in the Tags list before creating the Tag clusters. - self.tags.append(t) - self._map_tag_id_to_index(t, -1) - self._map_tag_strings_to_tag_id(t) + # NOTE: This does NOT use the add_tag_to_library() method! + # That method is only used for Tags added at runtime. + # This process uses the same inner methods, but waits until all of the + # Tags are registered in the Tags list before creating the Tag clusters. + self.tags.append(t) + self._map_tag_id_to_index(t, -1) + self._map_tag_strings_to_tag_id(t) + else: + logging.info(f'[LIBRARY]Skipping Tag with duplicate ID: {tag}') # Step 3: Map each Tag's subtags together now that all Tag objects in it. for t in self.tags: From 6e7567a192848ff2cb9f89c03c3bca85fce8acbf Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Wed, 24 Apr 2024 17:12:40 -0700 Subject: [PATCH 10/22] Update launch.json Updated launch.json to be cross-platform between Windows and UNIX systems --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e9505d33..f3e42404 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,7 @@ "name": "TagStudio", "type": "python", "request": "launch", - "program": "${workspaceRoot}\\TagStudio\\tagstudio.py", + "program": "${workspaceRoot}/tagstudio/tagstudio.py", "console": "integratedTerminal", "justMyCode": true, "args": [] From 7b48e5e17e005d177e4e417474bdeea13fd226d1 Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 19:48:25 -0600 Subject: [PATCH 11/22] Prevent Import collisions Rename tagstudio.py to tag_studio.py --- tagstudio/{tagstudio.py => tag_studio.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tagstudio/{tagstudio.py => tag_studio.py} (100%) diff --git a/tagstudio/tagstudio.py b/tagstudio/tag_studio.py similarity index 100% rename from tagstudio/tagstudio.py rename to tagstudio/tag_studio.py From c0c18dabc135409dc94508bf62179c245aa8266a Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 19:52:10 -0600 Subject: [PATCH 12/22] Optimize & Sort Imports --- tagstudio/src/core/library.py | 25 ++++++++++---------- tagstudio/src/core/ts_core.py | 7 ++---- tagstudio/src/qt/flowlayout.py | 3 +-- tagstudio/src/qt/main_window.py | 15 ++++-------- tagstudio/src/qt/pagination.py | 4 ++-- tagstudio/src/qt/ts_qt.py | 41 +++++++++++++++------------------ 6 files changed, 39 insertions(+), 56 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index ac35ec7f..e64b1b26 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -5,24 +5,23 @@ """The Library object and related methods for TagStudio.""" import datetime -from enum import Enum -import os -import traceback -from typing import Optional -import json import glob -from pathlib import Path -# from typing_extensions import deprecated -import src.core.ts_core as ts_core -from src.core.utils.web import * -from src.core.utils.str import * -from src.core.utils.fs import * -import xml.etree.ElementTree as ET +import json +import logging import sys import time -import logging +import traceback +import xml.etree.ElementTree as ET +from enum import Enum + import ujson +# from typing_extensions import deprecated +import tagstudio.src.core.ts_core as ts_core +from tagstudio.src.core.utils.fs import * +from tagstudio.src.core.utils.str import * +from tagstudio.src.core.utils.web import * + TYPE = ['file', 'meta', 'alt', 'mask'] # RESULT_TYPE = Enum('Result', ['ENTRY', 'COLLATION', 'TAG_GROUP']) class ItemType(Enum): diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index 1ef7f028..da507e23 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -4,16 +4,13 @@ """The core classes and methods of TagStudio.""" -import os -from types import FunctionType # from typing import Dict, Optional, TypedDict, List import json -from pathlib import Path -import traceback +import os + # import requests # from bs4 import BeautifulSoup as bs from src.core.library import * -from src.core.field_template import FieldTemplate VERSION: str = '9.1.0' # Major.Minor.Patch VERSION_BRANCH: str = 'Alpha' # 'Alpha', 'Beta', or '' for Full Release diff --git a/tagstudio/src/qt/flowlayout.py b/tagstudio/src/qt/flowlayout.py index 1e3c5075..b71c962d 100644 --- a/tagstudio/src/qt/flowlayout.py +++ b/tagstudio/src/qt/flowlayout.py @@ -4,9 +4,8 @@ """PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x""" -import sys from PySide6.QtCore import Qt, QMargins, QPoint, QRect, QSize -from PySide6.QtWidgets import QApplication, QLayout, QPushButton, QSizePolicy, QWidget +from PySide6.QtWidgets import QLayout, QSizePolicy, QWidget # class Window(QWidget): diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index 38c1c099..b82946c0 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -12,17 +12,10 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio -from re import S -import time -from typing import Optional -from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, - QMetaObject, QObject, QPoint, QRect, - QSize, QTime, QUrl, Qt) -from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, - QFont, QFontDatabase, QGradient, QIcon, - QImage, QKeySequence, QLinearGradient, QPainter, - QPalette, QPixmap, QRadialGradient, QTransform, QAction) -from PySide6.QtWidgets import (QApplication, QComboBox, QFrame, QGridLayout, +from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, + QSize, Qt) +from PySide6.QtGui import (QFont, QAction) +from PySide6.QtWidgets import (QComboBox, QFrame, QGridLayout, QHBoxLayout, QVBoxLayout, QLayout, QLineEdit, QMainWindow, QMenuBar, QPushButton, QScrollArea, QSizePolicy, QStatusBar, QWidget, QSplitter, QMenu) diff --git a/tagstudio/src/qt/pagination.py b/tagstudio/src/qt/pagination.py index 642cd103..c190fa14 100644 --- a/tagstudio/src/qt/pagination.py +++ b/tagstudio/src/qt/pagination.py @@ -5,10 +5,10 @@ """A pagination widget created for TagStudio.""" # I never want to see this code again. -from PySide6 import QtCore +from PySide6.QtCore import QObject, Signal, QSize from PySide6.QtGui import * from PySide6.QtWidgets import * -from PySide6.QtCore import QFile, QObject, QThread, Signal, QRunnable, Qt, QThreadPool, QSize, QEvent, QMimeData + # class NumberEdit(QLineEdit): # def __init__(self, parent=None) -> None: diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 45ebd0d8..0b7f1239 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -7,39 +7,34 @@ """A Qt driver for TagStudio.""" -from copy import copy, deepcopy import ctypes -import math -from os import times -import sys import logging -import threading -from time import sleep -from queue import Empty, Queue +import math +import sys import time -from typing import Optional, Union -from PySide6 import QtCore -import PySide6 -from PySide6.QtGui import * -from PySide6.QtWidgets import * -from PySide6.QtCore import QFile, QObject, QThread, Signal, QRunnable, Qt, QThreadPool, QSize, QEvent, QMimeData, QTimer -from PySide6.QtUiTools import QUiLoader -from PIL import Image, ImageOps, ImageChops, UnidentifiedImageError, ImageQt, ImageDraw, ImageFont, ImageEnhance -import PySide6.QtWidgets -import humanfriendly -import pillow_avif -import cv2 from datetime import datetime as dt -from src.core.ts_core import * +from queue import Empty, Queue +from time import sleep +from typing import Optional + +import cv2 +import humanfriendly +from PIL import Image, ImageChops, UnidentifiedImageError, ImageQt, ImageDraw, ImageFont, ImageEnhance +from PySide6 import QtCore +from PySide6.QtCore import QObject, QThread, Signal, QRunnable, Qt, QThreadPool, QSize, QEvent, QTimer +from PySide6.QtGui import * +from PySide6.QtUiTools import QUiLoader +from PySide6.QtWidgets import * +# from typing_extensions import deprecated +from humanfriendly import format_timespan # from src.core.utils.web import * # from src.core.utils.fs import * from src.core.library import * from src.core.palette import ColorType, get_tag_color +from src.core.ts_core import * from src.qt.flowlayout import FlowLayout, FlowWidget from src.qt.main_window import Ui_MainWindow -import src.qt.resources_rc -# from typing_extensions import deprecated -from humanfriendly import format_timespan + # from src.qt.qtacrylic.qtacrylic import WindowEffect # SIGQUIT is not defined on Windows From 952ed8f27db51d48d906d471282b20c579c32b48 Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 19:53:01 -0600 Subject: [PATCH 13/22] Remove Unused Imports --- tagstudio/src/core/library.py | 1 - tagstudio/src/core/ts_core.py | 3 --- tagstudio/src/core/utils/fs.py | 3 --- tagstudio/src/qt/main_window.py | 2 -- tagstudio/src/qt/ts_qt.py | 4 ---- 5 files changed, 13 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index e64b1b26..485e30b6 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -16,7 +16,6 @@ from enum import Enum import ujson -# from typing_extensions import deprecated import tagstudio.src.core.ts_core as ts_core from tagstudio.src.core.utils.fs import * from tagstudio.src.core.utils.str import * diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index da507e23..bb6ad790 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -4,12 +4,9 @@ """The core classes and methods of TagStudio.""" -# from typing import Dict, Optional, TypedDict, List import json import os -# import requests -# from bs4 import BeautifulSoup as bs from src.core.library import * VERSION: str = '9.1.0' # Major.Minor.Patch diff --git a/tagstudio/src/core/utils/fs.py b/tagstudio/src/core/utils/fs.py index 1307b0e8..7c1052a6 100644 --- a/tagstudio/src/core/utils/fs.py +++ b/tagstudio/src/core/utils/fs.py @@ -2,9 +2,6 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio -import os - - def clean_folder_name(folder_name: str) -> str: cleaned_name = folder_name invalid_chars = "<>:\"/\\|?*." diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index b82946c0..8055d930 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -20,8 +20,6 @@ from PySide6.QtWidgets import (QComboBox, QFrame, QGridLayout, QMenuBar, QPushButton, QScrollArea, QSizePolicy, QStatusBar, QWidget, QSplitter, QMenu) from src.qt.pagination import Pagination -# from src.qt.qtacrylic.qtacrylic import WindowEffect -# from qframelesswindow import FramelessMainWindow, StandardTitleBar class Ui_MainWindow(QMainWindow): diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 0b7f1239..96ac7b29 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -25,17 +25,13 @@ from PySide6.QtCore import QObject, QThread, Signal, QRunnable, Qt, QThreadPool, from PySide6.QtGui import * from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import * -# from typing_extensions import deprecated from humanfriendly import format_timespan -# from src.core.utils.web import * -# from src.core.utils.fs import * from src.core.library import * from src.core.palette import ColorType, get_tag_color from src.core.ts_core import * from src.qt.flowlayout import FlowLayout, FlowWidget from src.qt.main_window import Ui_MainWindow -# from src.qt.qtacrylic.qtacrylic import WindowEffect # SIGQUIT is not defined on Windows if sys.platform == "win32": From 0b4ccac5ff2006cf2722547754542324504e8cba Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 21:14:13 -0600 Subject: [PATCH 14/22] Import Humanfriendly format_size when importing format_timespan --- tagstudio/src/qt/ts_qt.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 96ac7b29..67c48449 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -18,7 +18,6 @@ from time import sleep from typing import Optional import cv2 -import humanfriendly from PIL import Image, ImageChops, UnidentifiedImageError, ImageQt, ImageDraw, ImageFont, ImageEnhance from PySide6 import QtCore from PySide6.QtCore import QObject, QThread, Signal, QRunnable, Qt, QThreadPool, QSize, QEvent, QTimer @@ -31,6 +30,7 @@ from src.core.palette import ColorType, get_tag_color from src.core.ts_core import * from src.qt.flowlayout import FlowLayout, FlowWidget from src.qt.main_window import Ui_MainWindow +from humanfriendly import format_timespan, format_size # SIGQUIT is not defined on Windows @@ -2106,12 +2106,12 @@ class PreviewPanel(QWidget): # Stats for specific file types are displayed here. if extension in (IMAGE_TYPES + VIDEO_TYPES): - self.dimensions_label.setText(f"{extension.upper()} • {humanfriendly.format_size(os.stat(filepath).st_size)}\n{image.width} x {image.height} px") + self.dimensions_label.setText(f"{extension.upper()} • {format_size(os.stat(filepath).st_size)}\n{image.width} x {image.height} px") else: self.dimensions_label.setText(f"{extension.upper()}") if not image: - self.dimensions_label.setText(f"{extension.upper()} • {humanfriendly.format_size(os.stat(filepath).st_size)}") + self.dimensions_label.setText(f"{extension.upper()} • {format_size(os.stat(filepath).st_size)}") raise UnidentifiedImageError except (UnidentifiedImageError, FileNotFoundError, cv2.error): From 4e5b7b1c7df1810c8bdfda0bba4ea4f460e5ec85 Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 21:51:22 -0600 Subject: [PATCH 15/22] Fix reference to datetime --- tagstudio/src/qt/ts_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 67c48449..ec304f83 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -4505,7 +4505,7 @@ class QtDriver(QObject): self.completed += 1 # logging.info(f'threshold:{len(self.lib.entries}, completed:{self.completed}') if self.completed == len(self.lib.entries): - filename = os.path.normpath(f'{self.lib.library_dir}/{TS_FOLDER_NAME}/{COLLAGE_FOLDER_NAME}/collage_{datetime.datetime.utcnow().strftime("%F_%T").replace(":", "")}.png') + filename = os.path.normpath(f'{self.lib.library_dir}/{TS_FOLDER_NAME}/{COLLAGE_FOLDER_NAME}/collage_{dt.utcnow().strftime("%F_%T").replace(":", "")}.png') self.collage.save(filename) self.collage = None From 2b5697ea50ecf665c7b0d5862672cbb36efdbc40 Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 21:51:43 -0600 Subject: [PATCH 16/22] Remove wildcard Imports --- tagstudio/src/core/library.py | 8 ++++---- tagstudio/src/core/ts_core.py | 2 +- tagstudio/src/qt/main_window.py | 2 +- tagstudio/src/qt/pagination.py | 4 ++-- tagstudio/src/qt/ts_qt.py | 29 +++++++++++++++++++++-------- tagstudio/tag_studio.py | 7 +++---- tagstudio/tests/core/test_tags.py | 2 +- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index 485e30b6..0ece31d1 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -8,6 +8,7 @@ import datetime import glob import json import logging +import os import sys import time import traceback @@ -16,10 +17,9 @@ from enum import Enum import ujson -import tagstudio.src.core.ts_core as ts_core -from tagstudio.src.core.utils.fs import * -from tagstudio.src.core.utils.str import * -from tagstudio.src.core.utils.web import * +from tagstudio.src.core import ts_core +from tagstudio.src.core.utils.str import strip_punctuation +from tagstudio.src.core.utils.web import strip_web_protocol TYPE = ['file', 'meta', 'alt', 'mask'] # RESULT_TYPE = Enum('Result', ['ENTRY', 'COLLATION', 'TAG_GROUP']) diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index bb6ad790..4115cbb2 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -7,7 +7,7 @@ import json import os -from src.core.library import * +from tagstudio.src.core.library import Entry, Library VERSION: str = '9.1.0' # Major.Minor.Patch VERSION_BRANCH: str = 'Alpha' # 'Alpha', 'Beta', or '' for Full Release diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index 8055d930..daa79d6f 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -19,7 +19,7 @@ from PySide6.QtWidgets import (QComboBox, QFrame, QGridLayout, QHBoxLayout, QVBoxLayout, QLayout, QLineEdit, QMainWindow, QMenuBar, QPushButton, QScrollArea, QSizePolicy, QStatusBar, QWidget, QSplitter, QMenu) -from src.qt.pagination import Pagination +from tagstudio.src.qt.pagination import Pagination class Ui_MainWindow(QMainWindow): diff --git a/tagstudio/src/qt/pagination.py b/tagstudio/src/qt/pagination.py index c190fa14..074bf869 100644 --- a/tagstudio/src/qt/pagination.py +++ b/tagstudio/src/qt/pagination.py @@ -6,8 +6,8 @@ # I never want to see this code again. from PySide6.QtCore import QObject, Signal, QSize -from PySide6.QtGui import * -from PySide6.QtWidgets import * +from PySide6.QtGui import QIntValidator +from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton, QLabel, QLineEdit, QSizePolicy # class NumberEdit(QLineEdit): diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index ec304f83..61c6a5c9 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -10,9 +10,13 @@ import ctypes import logging import math +import os import sys import time +import traceback +from types import FunctionType from datetime import datetime as dt +from pathlib import Path from queue import Empty, Queue from time import sleep from typing import Optional @@ -21,17 +25,26 @@ import cv2 from PIL import Image, ImageChops, UnidentifiedImageError, ImageQt, ImageDraw, ImageFont, ImageEnhance from PySide6 import QtCore from PySide6.QtCore import QObject, QThread, Signal, QRunnable, Qt, QThreadPool, QSize, QEvent, QTimer -from PySide6.QtGui import * +from PySide6.QtGui import (QGuiApplication, QPixmap, QEnterEvent, QMouseEvent, QResizeEvent, QPainter, QColor, QPen, + QAction, QStandardItemModel, QStandardItem, QPainterPath, QFontDatabase, QIcon) from PySide6.QtUiTools import QUiLoader -from PySide6.QtWidgets import * -from humanfriendly import format_timespan -from src.core.library import * -from src.core.palette import ColorType, get_tag_color -from src.core.ts_core import * -from src.qt.flowlayout import FlowLayout, FlowWidget -from src.qt.main_window import Ui_MainWindow +from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QPlainTextEdit, + QLineEdit, QScrollArea, QFrame, QTextEdit, QComboBox, QProgressDialog, QFileDialog, + QListView, QSplitter, QSizePolicy, QMessageBox, QBoxLayout, QCheckBox, QSplashScreen, + QMenu) from humanfriendly import format_timespan, format_size +from tagstudio.src.core.library import Collation, Entry, ItemType, Library, Tag +from tagstudio.src.core.palette import ColorType, get_tag_color +from tagstudio.src.core.ts_core import (TagStudioCore, TAG_COLORS, DATE_FIELDS, TEXT_FIELDS, BOX_FIELDS, ALL_FILE_TYPES, + SHORTCUT_TYPES, PROGRAM_TYPES, ARCHIVE_TYPES, PRESENTATION_TYPES, + SPREADSHEET_TYPES, TEXT_TYPES, AUDIO_TYPES, VIDEO_TYPES, IMAGE_TYPES, + LIBRARY_FILENAME, COLLAGE_FOLDER_NAME, BACKUP_FOLDER_NAME, TS_FOLDER_NAME, + VERSION_BRANCH, VERSION) +from tagstudio.src.core.utils.web import strip_web_protocol +from tagstudio.src.qt.flowlayout import FlowLayout, FlowWidget +from tagstudio.src.qt.main_window import Ui_MainWindow +import tagstudio.src.qt.resources_rc # SIGQUIT is not defined on Windows if sys.platform == "win32": diff --git a/tagstudio/tag_studio.py b/tagstudio/tag_studio.py index 50f48d6d..683529f4 100644 --- a/tagstudio/tag_studio.py +++ b/tagstudio/tag_studio.py @@ -4,12 +4,11 @@ """TagStudio launcher.""" -from src.core.ts_core import TagStudioCore -from src.cli.ts_cli import CliDriver -from src.qt.ts_qt import QtDriver +from tagstudio.src.core.ts_core import TagStudioCore +from tagstudio.src.cli.ts_cli import CliDriver +from tagstudio.src.qt.ts_qt import QtDriver import argparse import traceback -# import ctypes def main(): diff --git a/tagstudio/tests/core/test_tags.py b/tagstudio/tests/core/test_tags.py index 33c8e895..7ff70d0b 100644 --- a/tagstudio/tests/core/test_tags.py +++ b/tagstudio/tests/core/test_tags.py @@ -1,4 +1,4 @@ -from src.core.library import Tag +from tagstudio.src.core.library import Tag class TestTags: From 0b1c097f978dc60f16d9646b62021a5e8e76be16 Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 22:00:40 -0600 Subject: [PATCH 17/22] update tagstudio.py refrences to tag_studio.py --- .vscode/launch.json | 2 +- README.md | 4 ++-- TagStudio.sh | 2 +- start_win.bat | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index f3e42404..8838fbb3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,7 @@ "name": "TagStudio", "type": "python", "request": "launch", - "program": "${workspaceRoot}/tagstudio/tagstudio.py", + "program": "${workspaceRoot}/tagstudio/tag_studio.py", "console": "integratedTerminal", "justMyCode": true, "args": [] diff --git a/README.md b/README.md index 3563733f..dd78737e 100644 --- a/README.md +++ b/README.md @@ -90,14 +90,14 @@ _Learn more about setting up a virtual environment [here](https://docs.python.or To launch TagStudio, launch the `start_win.bat` file. You can modify this .bat file or create a shortcut and add one or more additional arguments if desired. -Alternatively, with the virtual environment loaded, run the python file at `tagstudio\tagstudio.py` from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tagstudio.py`. +Alternatively, with the virtual environment loaded, run the python file at `tagstudio\tag_studio.py` from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tag_studio.py`. > [!CAUTION] > TagStudio on Linux & macOS likely won't function correctly at this time. If you're trying to run this in order to help test, debug, and improve compatibility, then charge on ahead! #### macOS -With the virtual environment loaded, run the python file at "tagstudio/tagstudio.py" from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tagstudio.py`. When launching the program in the future, remember to activate the virtual environment each time before launching *(an easier method is currently being worked on).* +With the virtual environment loaded, run the python file at "tagstudio/tag_studio.py" from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tag_studio.py`. When launching the program in the future, remember to activate the virtual environment each time before launching *(an easier method is currently being worked on).* #### Linux diff --git a/TagStudio.sh b/TagStudio.sh index cff969c3..762f752f 100755 --- a/TagStudio.sh +++ b/TagStudio.sh @@ -2,4 +2,4 @@ python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -python tagstudio/tagstudio.py +python tagstudio/tag_studio.py diff --git a/start_win.bat b/start_win.bat index 51a5ddf8..73dcfb0f 100644 --- a/start_win.bat +++ b/start_win.bat @@ -1,2 +1,2 @@ @echo off -.venv\Scripts\python.exe .\TagStudio\tagstudio.py --ui qt %* \ No newline at end of file +.venv\Scripts\python.exe .\TagStudio\tag_studio.py --ui qt %* \ No newline at end of file From f125e5a50d63af63d4f8f8f9321354d8f850af6b Mon Sep 17 00:00:00 2001 From: Xarvex Date: Wed, 24 Apr 2024 23:37:36 -0500 Subject: [PATCH 18/22] Implement file opening for Linux and MacOS, allow Windows in background Note: this is only tested on Linux --- tagstudio/src/qt/ts_qt.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 45ebd0d8..1695690f 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -41,6 +41,8 @@ import src.qt.resources_rc # from typing_extensions import deprecated from humanfriendly import format_timespan # from src.qt.qtacrylic.qtacrylic import WindowEffect +import shutil +import subprocess # SIGQUIT is not defined on Windows if sys.platform == "win32": @@ -56,13 +58,21 @@ INFO = f'[INFO]' logging.basicConfig(format="%(message)s", level=logging.INFO) -def open_file(path): - try: - os.startfile(path) - except FileNotFoundError: - logging.info('File Not Found! (Imagine this as a popup)') - except: - traceback.print_exc() +def open_file(path: str): + if sys.platform == "win32": + command_name = "start" + elif sys.platform == "darwin": + command_name = "open" + else: + command_name = "xdg-open" + command = shutil.which(command_name) + if command is not None: + try: + subprocess.Popen([command, path], close_fds=True) + except: + traceback.print_exc() + else: + logging.info(f"Could not find {command_name} on system PATH") class NavigationState(): From 8b4b2507fa841af1816493a9380230d9b6b46da5 Mon Sep 17 00:00:00 2001 From: Xarvex Date: Wed, 24 Apr 2024 23:50:26 -0500 Subject: [PATCH 19/22] Account for start being a shell builtin on Windows --- tagstudio/src/qt/ts_qt.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 1695690f..57e056a9 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -59,20 +59,21 @@ logging.basicConfig(format="%(message)s", level=logging.INFO) def open_file(path: str): - if sys.platform == "win32": - command_name = "start" - elif sys.platform == "darwin": - command_name = "open" - else: - command_name = "xdg-open" - command = shutil.which(command_name) - if command is not None: - try: - subprocess.Popen([command, path], close_fds=True) - except: - traceback.print_exc() - else: - logging.info(f"Could not find {command_name} on system PATH") + try: + if sys.platform == "win32": + subprocess.Popen(["start", path], shell=True, close_fds=True) + else: + if sys.platform == "darwin": + command_name = "open" + else: + command_name = "xdg-open" + command = shutil.which(command_name) + if command is not None: + subprocess.Popen([command, path], close_fds=True) + else: + logging.info(f"Could not find {command_name} on system PATH") + except: + traceback.print_exc() class NavigationState(): From 956ffd4663ce98dc4f124fa6287514efbb01b3c8 Mon Sep 17 00:00:00 2001 From: Xarvex Date: Thu, 25 Apr 2024 00:07:14 -0500 Subject: [PATCH 20/22] Properly detach process on Windows --- tagstudio/src/qt/ts_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 57e056a9..253f9d20 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -61,7 +61,7 @@ logging.basicConfig(format="%(message)s", level=logging.INFO) def open_file(path: str): try: if sys.platform == "win32": - subprocess.Popen(["start", path], shell=True, close_fds=True) + subprocess.Popen(["start", path], shell=True, close_fds=True, creationflags=subprocess.DETACHED_PROCESS) else: if sys.platform == "darwin": command_name = "open" From de09da1592202a2d1821b010bcd668fe6f726a5a Mon Sep 17 00:00:00 2001 From: Andrew Arneson Date: Wed, 24 Apr 2024 23:18:16 -0600 Subject: [PATCH 21/22] remove tagstudio prefix for source libraries --- tagstudio/src/core/library.py | 6 +++--- tagstudio/src/core/ts_core.py | 2 +- tagstudio/src/qt/main_window.py | 2 +- tagstudio/src/qt/ts_qt.py | 14 +++++++------- tagstudio/tag_studio.py | 6 +++--- tagstudio/tests/core/test_tags.py | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tagstudio/src/core/library.py b/tagstudio/src/core/library.py index 0ece31d1..97f2e871 100644 --- a/tagstudio/src/core/library.py +++ b/tagstudio/src/core/library.py @@ -17,9 +17,9 @@ from enum import Enum import ujson -from tagstudio.src.core import ts_core -from tagstudio.src.core.utils.str import strip_punctuation -from tagstudio.src.core.utils.web import strip_web_protocol +from src.core import ts_core +from src.core.utils.str import strip_punctuation +from src.core.utils.web import strip_web_protocol TYPE = ['file', 'meta', 'alt', 'mask'] # RESULT_TYPE = Enum('Result', ['ENTRY', 'COLLATION', 'TAG_GROUP']) diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index 4115cbb2..5f50954d 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -7,7 +7,7 @@ import json import os -from tagstudio.src.core.library import Entry, Library +from src.core.library import Entry, Library VERSION: str = '9.1.0' # Major.Minor.Patch VERSION_BRANCH: str = 'Alpha' # 'Alpha', 'Beta', or '' for Full Release diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index daa79d6f..8055d930 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -19,7 +19,7 @@ from PySide6.QtWidgets import (QComboBox, QFrame, QGridLayout, QHBoxLayout, QVBoxLayout, QLayout, QLineEdit, QMainWindow, QMenuBar, QPushButton, QScrollArea, QSizePolicy, QStatusBar, QWidget, QSplitter, QMenu) -from tagstudio.src.qt.pagination import Pagination +from src.qt.pagination import Pagination class Ui_MainWindow(QMainWindow): diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 61c6a5c9..729f7657 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -34,17 +34,17 @@ from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QMenu) from humanfriendly import format_timespan, format_size -from tagstudio.src.core.library import Collation, Entry, ItemType, Library, Tag -from tagstudio.src.core.palette import ColorType, get_tag_color -from tagstudio.src.core.ts_core import (TagStudioCore, TAG_COLORS, DATE_FIELDS, TEXT_FIELDS, BOX_FIELDS, ALL_FILE_TYPES, +from src.core.library import Collation, Entry, ItemType, Library, Tag +from src.core.palette import ColorType, get_tag_color +from src.core.ts_core import (TagStudioCore, TAG_COLORS, DATE_FIELDS, TEXT_FIELDS, BOX_FIELDS, ALL_FILE_TYPES, SHORTCUT_TYPES, PROGRAM_TYPES, ARCHIVE_TYPES, PRESENTATION_TYPES, SPREADSHEET_TYPES, TEXT_TYPES, AUDIO_TYPES, VIDEO_TYPES, IMAGE_TYPES, LIBRARY_FILENAME, COLLAGE_FOLDER_NAME, BACKUP_FOLDER_NAME, TS_FOLDER_NAME, VERSION_BRANCH, VERSION) -from tagstudio.src.core.utils.web import strip_web_protocol -from tagstudio.src.qt.flowlayout import FlowLayout, FlowWidget -from tagstudio.src.qt.main_window import Ui_MainWindow -import tagstudio.src.qt.resources_rc +from src.core.utils.web import strip_web_protocol +from src.qt.flowlayout import FlowLayout, FlowWidget +from src.qt.main_window import Ui_MainWindow +import src.qt.resources_rc # SIGQUIT is not defined on Windows if sys.platform == "win32": diff --git a/tagstudio/tag_studio.py b/tagstudio/tag_studio.py index 683529f4..54039eb7 100644 --- a/tagstudio/tag_studio.py +++ b/tagstudio/tag_studio.py @@ -4,9 +4,9 @@ """TagStudio launcher.""" -from tagstudio.src.core.ts_core import TagStudioCore -from tagstudio.src.cli.ts_cli import CliDriver -from tagstudio.src.qt.ts_qt import QtDriver +from src.core.ts_core import TagStudioCore +from src.cli.ts_cli import CliDriver +from src.qt.ts_qt import QtDriver import argparse import traceback diff --git a/tagstudio/tests/core/test_tags.py b/tagstudio/tests/core/test_tags.py index 7ff70d0b..33c8e895 100644 --- a/tagstudio/tests/core/test_tags.py +++ b/tagstudio/tests/core/test_tags.py @@ -1,4 +1,4 @@ -from tagstudio.src.core.library import Tag +from src.core.library import Tag class TestTags: From 13c2ca1ea55cebb0b16977bf8e2b362710fe424f Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Thu, 25 Apr 2024 01:41:32 -0700 Subject: [PATCH 22/22] Allows shortcut files to show in library Shortcut files (.lnk, .url, .desktop) can now be added to the library (no thumbnail previews currently). --- tagstudio/src/core/ts_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index 5f50954d..0ea35039 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -31,11 +31,11 @@ SPREADSHEET_TYPES: list[str] = ['csv', 'xls', 'xlsx', 'numbers', 'ods'] PRESENTATION_TYPES: list[str] = ['ppt', 'pptx', 'key', 'odp'] ARCHIVE_TYPES: list[str] = ['zip', 'rar', 'tar', 'tar.gz', 'tgz', '7z'] PROGRAM_TYPES: list[str] = ['exe', 'app'] -SHORTCUT_TYPES: list[str] = ['lnk', 'desktop'] +SHORTCUT_TYPES: list[str] = ['lnk', 'desktop', 'url'] ALL_FILE_TYPES: list[str] = IMAGE_TYPES + VIDEO_TYPES + AUDIO_TYPES + \ TEXT_TYPES + SPREADSHEET_TYPES + PRESENTATION_TYPES + \ - ARCHIVE_TYPES + PROGRAM_TYPES + ARCHIVE_TYPES + PROGRAM_TYPES + SHORTCUT_TYPES BOX_FIELDS = ['tag_box', 'text_box'] TEXT_FIELDS = ['text_line', 'text_box']