From c8a8642124943b4f04f36cb0fc00f32072d5d5f4 Mon Sep 17 00:00:00 2001 From: Kevin Barnard Date: Wed, 29 Jan 2025 15:49:04 -0800 Subject: [PATCH] refactor: use Rye --- .flake8 | 3 - .github/workflows/ci.yml | 101 ++++++++++-------- .gitignore | 7 +- .isort.cfg | 2 - .pre-commit-config.yaml | 19 ++-- .python-version | 1 + pyproject.toml | 52 +++++---- run.spec | 8 +- .../vars_gridview}/__init__.py | 0 .../run.py => src/vars_gridview/__main__.py | 13 ++- .../vars_gridview}/assets/gridview.ui | 8 +- .../vars_gridview}/assets/icons/README.md | 0 .../assets/icons/VARSGridView.icns | Bin .../icons/VARSGridView.iconset/icon_128.png | Bin .../icons/VARSGridView.iconset/icon_16.png | Bin .../icons/VARSGridView.iconset/icon_256.png | Bin .../icons/VARSGridView.iconset/icon_32.png | Bin .../icons/VARSGridView.iconset/icon_512.png | Bin .../assets/icons/folder-open-solid.svg | 0 .../assets/icons/gear-solid.svg | 0 .../assets/icons/magnifying-glass-solid.svg | 0 .../vars_gridview}/assets/style/dark.qss | 0 .../vars_gridview}/lib/__init__.py | 0 .../vars_gridview}/lib/annotation.py | 0 .../vars_gridview}/lib/boxes.py | 0 .../vars_gridview}/lib/cache.py | 0 .../vars_gridview}/lib/constants.py | 0 .../vars_gridview}/lib/embedding.py | 0 .../vars_gridview}/lib/image_mosaic.py | 0 .../vars_gridview}/lib/log.py | 0 .../vars_gridview}/lib/m3/__init__.py | 0 .../vars_gridview}/lib/m3/clients.py | 0 .../vars_gridview}/lib/m3/operations.py | 0 .../vars_gridview}/lib/m3/query.py | 0 .../vars_gridview}/lib/raziel.py | 0 .../vars_gridview}/lib/settings.py | 0 .../vars_gridview}/lib/sort_methods.py | 0 .../vars_gridview}/lib/sql.py | 0 .../vars_gridview}/lib/util.py | 0 .../vars_gridview}/lib/widgets.py | 0 .../vars_gridview}/ui/ConfirmationDialog.py | 0 .../ui/FileSelectionLineEdit.py | 0 src/vars_gridview/ui/JSONTree.py | 47 ++++++++ .../vars_gridview}/ui/LoginDialog.py | 0 .../vars_gridview}/ui/QueryDialog.py | 0 .../vars_gridview}/ui/SortDialog.py | 0 .../vars_gridview/ui}/__init__.py | 0 .../ui/settings/SettingsDialog.py | 0 .../vars_gridview/ui/settings}/__init__.py | 0 .../ui/settings/tabs/AbstractSettingsTab.py | 0 .../ui/settings/tabs/AppearanceTab.py | 0 .../ui/settings/tabs/CacheTab.py | 0 .../ui/settings/tabs/EmbeddingsTab.py | 0 .../vars_gridview}/ui/settings/tabs/M3Tab.py | 0 .../ui/settings/tabs/VideoPlayerTab.py | 0 .../ui/settings/tabs}/__init__.py | 0 vars_gridview/ui/settings/tabs/__init__.py | 0 57 files changed, 157 insertions(+), 104 deletions(-) delete mode 100644 .flake8 delete mode 100644 .isort.cfg create mode 100644 .python-version rename {vars_gridview => src/vars_gridview}/__init__.py (100%) rename vars_gridview/scripts/run.py => src/vars_gridview/__main__.py (98%) rename {vars_gridview => src/vars_gridview}/assets/gridview.ui (97%) rename {vars_gridview => src/vars_gridview}/assets/icons/README.md (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.icns (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.iconset/icon_128.png (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.iconset/icon_16.png (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.iconset/icon_256.png (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.iconset/icon_32.png (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/VARSGridView.iconset/icon_512.png (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/folder-open-solid.svg (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/gear-solid.svg (100%) rename {vars_gridview => src/vars_gridview}/assets/icons/magnifying-glass-solid.svg (100%) rename {vars_gridview => src/vars_gridview}/assets/style/dark.qss (100%) rename {vars_gridview => src/vars_gridview}/lib/__init__.py (100%) rename {vars_gridview => src/vars_gridview}/lib/annotation.py (100%) rename {vars_gridview => src/vars_gridview}/lib/boxes.py (100%) rename {vars_gridview => src/vars_gridview}/lib/cache.py (100%) rename {vars_gridview => src/vars_gridview}/lib/constants.py (100%) rename {vars_gridview => src/vars_gridview}/lib/embedding.py (100%) rename {vars_gridview => src/vars_gridview}/lib/image_mosaic.py (100%) rename {vars_gridview => src/vars_gridview}/lib/log.py (100%) rename {vars_gridview => src/vars_gridview}/lib/m3/__init__.py (100%) rename {vars_gridview => src/vars_gridview}/lib/m3/clients.py (100%) rename {vars_gridview => src/vars_gridview}/lib/m3/operations.py (100%) rename {vars_gridview => src/vars_gridview}/lib/m3/query.py (100%) rename {vars_gridview => src/vars_gridview}/lib/raziel.py (100%) rename {vars_gridview => src/vars_gridview}/lib/settings.py (100%) rename {vars_gridview => src/vars_gridview}/lib/sort_methods.py (100%) rename {vars_gridview => src/vars_gridview}/lib/sql.py (100%) rename {vars_gridview => src/vars_gridview}/lib/util.py (100%) rename {vars_gridview => src/vars_gridview}/lib/widgets.py (100%) rename {vars_gridview => src/vars_gridview}/ui/ConfirmationDialog.py (100%) rename {vars_gridview => src/vars_gridview}/ui/FileSelectionLineEdit.py (100%) create mode 100644 src/vars_gridview/ui/JSONTree.py rename {vars_gridview => src/vars_gridview}/ui/LoginDialog.py (100%) rename {vars_gridview => src/vars_gridview}/ui/QueryDialog.py (100%) rename {vars_gridview => src/vars_gridview}/ui/SortDialog.py (100%) rename {vars_gridview/scripts => src/vars_gridview/ui}/__init__.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/SettingsDialog.py (100%) rename {vars_gridview/ui => src/vars_gridview/ui/settings}/__init__.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/AbstractSettingsTab.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/AppearanceTab.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/CacheTab.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/EmbeddingsTab.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/M3Tab.py (100%) rename {vars_gridview => src/vars_gridview}/ui/settings/tabs/VideoPlayerTab.py (100%) rename {vars_gridview/ui/settings => src/vars_gridview/ui/settings/tabs}/__init__.py (100%) delete mode 100644 vars_gridview/ui/settings/tabs/__init__.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 32b8374..0000000 --- a/.flake8 +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -max-line-length = 88 -extend-ignore = E203, E501, E704 \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ba4bab..46a61e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,38 +7,43 @@ on: branches: [ main ] jobs: - poetry-build: + build: runs-on: ubuntu-latest + steps: - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: "3.11" + uses: actions/checkout@v4 - - name: Cache Poetry + - name: Cache Rye + id: cache-rye uses: actions/cache@v3 with: - path: ~/.cache/pypoetry - key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }} - restore-keys: | - ${{ runner.os }}-poetry- + path: ~/.rye + key: ${{ runner.os }}-rye - - name: Install dependencies + - name: Install Rye (if not cached) + if: steps.cache-rye.outputs.cache-hit != 'true' run: | - pip install poetry - poetry install + curl -sSf https://rye.astral.sh/get | RYE_VERSION="0.38.0" RYE_INSTALL_OPTION="--yes" bash + + - name: Set up Rye in PATH + run: | + echo "$HOME/.rye/bin" >> $GITHUB_PATH - - name: Build package + - name: Build run: | - poetry build + rye build - semantic-release-version: + - name: Store built package + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/ + + release: runs-on: ubuntu-latest - needs: poetry-build - concurrency: semantic-release-version + needs: build + concurrency: release permissions: id-token: write contents: write @@ -47,46 +52,54 @@ jobs: tag: ${{ steps.semantic_release.outputs.tag }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Python semantic release id: semantic_release - uses: python-semantic-release/python-semantic-release@master + uses: python-semantic-release/python-semantic-release@v9.15.1 with: github_token: ${{ secrets.GITHUB_TOKEN }} vcs_release: true - poetry-publish: + publish: runs-on: ubuntu-latest - needs: semantic-release-version - if: ${{ needs.semantic-release-version.outputs.released == 'true' }} - concurrency: poetry-publish + needs: [build, release] + if: needs.release.outputs.released == 'true' + concurrency: publish steps: - name: Checkout - uses: actions/checkout@v3 - with: - ref: ${{ needs.semantic-release-version.outputs.tag }} - - - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/checkout@v4 with: - python-version: "3.11" - - - name: Cache Poetry + ref: ${{ needs.release.outputs.tag }} + + - name: Restore Rye from cache + id: cache-rye uses: actions/cache@v3 with: - path: ~/.cache/pypoetry - key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }} - restore-keys: | - ${{ runner.os }}-poetry- - + path: ~/.rye + key: ${{ runner.os }}-rye + + - name: Install Rye (if not cached) + if: steps.cache-rye.outputs.cache-hit != 'true' + run: | + curl -sSf https://rye.astral.sh/get | RYE_VERSION="0.38.0" RYE_INSTALL_OPTION="--yes" bash + echo "$HOME/.rye/bin" >> $GITHUB_PATH + + - name: Set up Rye in PATH + run: | + echo "$HOME/.rye/bin" >> $GITHUB_PATH + + - name: Download built package + uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + - name: Publish package run: | - pip install poetry - poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }} - poetry publish --build + rye publish --token ${{ secrets.PYPI_TOKEN }} --yes # pyinstaller-build: # runs-on: ${{ matrix.os }} diff --git a/.gitignore b/.gitignore index 1409cd4..df20355 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ *__pycache__/ -vars_gridview/assets/gui.ini -vars_gridview/logs/ +src/vars_gridview/assets/gui.ini +src/vars_gridview/logs/ logs/ build/ dist/ -poetry.lock \ No newline at end of file +requirements.lock +requirements-dev.lock \ No newline at end of file diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index 9483b04..0000000 --- a/.isort.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[tool.isort] -profile = "black" \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7fb7d8d..b03e3dc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,8 @@ repos: - - repo: https://github.com/pycqa/isort - rev: 5.12.0 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.2 hooks: - - id: isort - args: ["--profile", "black"] - - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.10.0 - hooks: - - id: black - - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - args: ["--config", ".flake8"] \ No newline at end of file + # Lint + - id: ruff + # Format + - id: ruff-format \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..fdcfcfd --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5925136..2347eaa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,32 +1,42 @@ -[tool.poetry] +[project] name = "vars-gridview" version = "0.16.0" description = "VARS GridView is a tool for reviewing and correcting VARS localizations in bulk." authors = [ - "Kevin Barnard ", - "Paul Roberts " + { name = "Kevin Barnard", email = "kbarnard@mbari.org" }, + { name = "Paul Roberts", email = "proberts@mbari.org" } +] +dependencies = [ + "pyqt6>=6.4.0", + "requests>=2.27.1", + "pyqtgraph>=0.13.0", + "opencv-python>=4.5.5.62", + "qdarkstyle>=3.0.3", + "beholder-client>=0.1.0", + "sharktopoda-client>=0.4.5", + "platformdirs>=4.0.0", + "dreamsim>=0.1.3", + "iso8601>=2.1.0", ] readme = "README.md" -repository = "https://github.com/mbari-org/vars-gridview" +requires-python = ">= 3.8" keywords = ["VARS", "localization", "annotation"] license = "MIT" -include = ["LICENSE"] -[tool.poetry.dependencies] -python = ">=3.8,<3.13" -pyqt6 = "^6.4.0" -requests = "^2.27.1" -pyqtgraph = "^0.13.0" -opencv-python = "^4.5.5.62" -qdarkstyle = "^3.0.3" -beholder-client = "^0.1.0" -sharktopoda-client = "^0.4.5" -platformdirs = "^4.0.0" -dreamsim = "^0.1.3" -iso8601 = "^2.1.0" +[project.scripts] +vars-gridview = "vars_gridview.__main__:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" -[tool.poetry.scripts] -vars-gridview = "vars_gridview.scripts.run:main" +[tool.rye] +managed = true +dev-dependencies = [ + "pre-commit>=3.5.0", + "python-semantic-release>=9.17.0", + "pyinstaller>=6.11.1", +] [tool.poetry.group.dev.dependencies] black = "^23.1.0" @@ -93,7 +103,3 @@ env = "GH_TOKEN" [tool.semantic_release.publish] dist_glob_patterns = ["dist/*"] upload_to_vcs_release = true - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/run.spec b/run.spec index ac6199e..0d90f53 100644 --- a/run.spec +++ b/run.spec @@ -2,10 +2,10 @@ a = Analysis( - ['vars_gridview/scripts/run.py'], + ['src/vars_gridview/scripts/run.py'], pathex=[], binaries=[], - datas=[('vars_gridview/assets', 'assets')], + datas=[('src/vars_gridview/assets', 'assets')], hiddenimports=[], hookspath=[], hooksconfig={}, @@ -31,7 +31,7 @@ exe = EXE( target_arch=None, codesign_identity='Developer ID Application: Monterey Bay Aquarium Research Institute (9TN7A342V4)', entitlements_file=None, - icon=['vars_gridview/assets/icons/VARSGridView.icns'], + icon=['src/vars_gridview/assets/icons/VARSGridView.icns'], ) coll = COLLECT( exe, @@ -45,6 +45,6 @@ coll = COLLECT( app = BUNDLE( coll, name='VARS GridView.app', - icon='vars_gridview/assets/icons/VARSGridView.icns', + icon='src/vars_gridview/assets/icons/VARSGridView.icns', bundle_identifier='org.mbari.vars.gridview', ) diff --git a/vars_gridview/__init__.py b/src/vars_gridview/__init__.py similarity index 100% rename from vars_gridview/__init__.py rename to src/vars_gridview/__init__.py diff --git a/vars_gridview/scripts/run.py b/src/vars_gridview/__main__.py similarity index 98% rename from vars_gridview/scripts/run.py rename to src/vars_gridview/__main__.py index d5e482b..fcde66c 100644 --- a/vars_gridview/scripts/run.py +++ b/src/vars_gridview/__main__.py @@ -55,6 +55,7 @@ from vars_gridview.lib.util import open_file_browser from vars_gridview.lib.widgets import RectWidget from vars_gridview.ui.ConfirmationDialog import ConfirmationDialog +from vars_gridview.ui.JSONTree import JSONTree from vars_gridview.ui.LoginDialog import LoginDialog from vars_gridview.ui.QueryDialog import QueryDialog from vars_gridview.ui.settings.SettingsDialog import SettingsDialog @@ -86,6 +87,11 @@ def __init__(self, app): # Create the main window self.ui = WindowTemplate() self.ui.setupUi(self) + bb_info_tree: QtWidgets.QWidget = self.ui.boundingBoxInfoTree + bb_info_tree.setLayout(QtWidgets.QVBoxLayout()) + bb_json_tree = JSONTree() + bb_info_tree.layout().addWidget(bb_json_tree) + self.ui.boundingBoxInfoTree = bb_json_tree # Set the window title self.setWindowTitle(f"{constants.APP_NAME} v{__version__}") @@ -728,7 +734,7 @@ def delete(self): self.image_mosaic.delete_selected() self.box_handler.roi_detail.clear() self.box_handler.clear() - self.ui.annotationXML.clear() + self.boundingBoxInfoTree.clear() self.ui.imageInfoList.clear() self.image_mosaic.render_mosaic() @@ -834,10 +840,7 @@ def rect_clicked(self, rect: RectWidget, event: Optional[QtGui.QMouseEvent]): self.box_handler.add_annotation(rect.localization_index, rect) # Add localization data to the panel - self.ui.annotationXML.clear() - self.ui.annotationXML.insertPlainText( - json.dumps(rect.localization.json, indent=2) - ) + self.ui.boundingBoxInfoTree.set_data(rect.localization.json) # Add ancillary data to the image info list self.ui.imageInfoList.clear() diff --git a/vars_gridview/assets/gridview.ui b/src/vars_gridview/assets/gridview.ui similarity index 97% rename from vars_gridview/assets/gridview.ui rename to src/vars_gridview/assets/gridview.ui index adafd91..37f1ab7 100644 --- a/vars_gridview/assets/gridview.ui +++ b/src/vars_gridview/assets/gridview.ui @@ -78,20 +78,15 @@ Qt::Horizontal - + 1 0 - - - true - - MS Shell Dlg 2 12 50 false @@ -107,7 +102,6 @@ - MS Shell Dlg 2 12 50 false diff --git a/vars_gridview/assets/icons/README.md b/src/vars_gridview/assets/icons/README.md similarity index 100% rename from vars_gridview/assets/icons/README.md rename to src/vars_gridview/assets/icons/README.md diff --git a/vars_gridview/assets/icons/VARSGridView.icns b/src/vars_gridview/assets/icons/VARSGridView.icns similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.icns rename to src/vars_gridview/assets/icons/VARSGridView.icns diff --git a/vars_gridview/assets/icons/VARSGridView.iconset/icon_128.png b/src/vars_gridview/assets/icons/VARSGridView.iconset/icon_128.png similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.iconset/icon_128.png rename to src/vars_gridview/assets/icons/VARSGridView.iconset/icon_128.png diff --git a/vars_gridview/assets/icons/VARSGridView.iconset/icon_16.png b/src/vars_gridview/assets/icons/VARSGridView.iconset/icon_16.png similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.iconset/icon_16.png rename to src/vars_gridview/assets/icons/VARSGridView.iconset/icon_16.png diff --git a/vars_gridview/assets/icons/VARSGridView.iconset/icon_256.png b/src/vars_gridview/assets/icons/VARSGridView.iconset/icon_256.png similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.iconset/icon_256.png rename to src/vars_gridview/assets/icons/VARSGridView.iconset/icon_256.png diff --git a/vars_gridview/assets/icons/VARSGridView.iconset/icon_32.png b/src/vars_gridview/assets/icons/VARSGridView.iconset/icon_32.png similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.iconset/icon_32.png rename to src/vars_gridview/assets/icons/VARSGridView.iconset/icon_32.png diff --git a/vars_gridview/assets/icons/VARSGridView.iconset/icon_512.png b/src/vars_gridview/assets/icons/VARSGridView.iconset/icon_512.png similarity index 100% rename from vars_gridview/assets/icons/VARSGridView.iconset/icon_512.png rename to src/vars_gridview/assets/icons/VARSGridView.iconset/icon_512.png diff --git a/vars_gridview/assets/icons/folder-open-solid.svg b/src/vars_gridview/assets/icons/folder-open-solid.svg similarity index 100% rename from vars_gridview/assets/icons/folder-open-solid.svg rename to src/vars_gridview/assets/icons/folder-open-solid.svg diff --git a/vars_gridview/assets/icons/gear-solid.svg b/src/vars_gridview/assets/icons/gear-solid.svg similarity index 100% rename from vars_gridview/assets/icons/gear-solid.svg rename to src/vars_gridview/assets/icons/gear-solid.svg diff --git a/vars_gridview/assets/icons/magnifying-glass-solid.svg b/src/vars_gridview/assets/icons/magnifying-glass-solid.svg similarity index 100% rename from vars_gridview/assets/icons/magnifying-glass-solid.svg rename to src/vars_gridview/assets/icons/magnifying-glass-solid.svg diff --git a/vars_gridview/assets/style/dark.qss b/src/vars_gridview/assets/style/dark.qss similarity index 100% rename from vars_gridview/assets/style/dark.qss rename to src/vars_gridview/assets/style/dark.qss diff --git a/vars_gridview/lib/__init__.py b/src/vars_gridview/lib/__init__.py similarity index 100% rename from vars_gridview/lib/__init__.py rename to src/vars_gridview/lib/__init__.py diff --git a/vars_gridview/lib/annotation.py b/src/vars_gridview/lib/annotation.py similarity index 100% rename from vars_gridview/lib/annotation.py rename to src/vars_gridview/lib/annotation.py diff --git a/vars_gridview/lib/boxes.py b/src/vars_gridview/lib/boxes.py similarity index 100% rename from vars_gridview/lib/boxes.py rename to src/vars_gridview/lib/boxes.py diff --git a/vars_gridview/lib/cache.py b/src/vars_gridview/lib/cache.py similarity index 100% rename from vars_gridview/lib/cache.py rename to src/vars_gridview/lib/cache.py diff --git a/vars_gridview/lib/constants.py b/src/vars_gridview/lib/constants.py similarity index 100% rename from vars_gridview/lib/constants.py rename to src/vars_gridview/lib/constants.py diff --git a/vars_gridview/lib/embedding.py b/src/vars_gridview/lib/embedding.py similarity index 100% rename from vars_gridview/lib/embedding.py rename to src/vars_gridview/lib/embedding.py diff --git a/vars_gridview/lib/image_mosaic.py b/src/vars_gridview/lib/image_mosaic.py similarity index 100% rename from vars_gridview/lib/image_mosaic.py rename to src/vars_gridview/lib/image_mosaic.py diff --git a/vars_gridview/lib/log.py b/src/vars_gridview/lib/log.py similarity index 100% rename from vars_gridview/lib/log.py rename to src/vars_gridview/lib/log.py diff --git a/vars_gridview/lib/m3/__init__.py b/src/vars_gridview/lib/m3/__init__.py similarity index 100% rename from vars_gridview/lib/m3/__init__.py rename to src/vars_gridview/lib/m3/__init__.py diff --git a/vars_gridview/lib/m3/clients.py b/src/vars_gridview/lib/m3/clients.py similarity index 100% rename from vars_gridview/lib/m3/clients.py rename to src/vars_gridview/lib/m3/clients.py diff --git a/vars_gridview/lib/m3/operations.py b/src/vars_gridview/lib/m3/operations.py similarity index 100% rename from vars_gridview/lib/m3/operations.py rename to src/vars_gridview/lib/m3/operations.py diff --git a/vars_gridview/lib/m3/query.py b/src/vars_gridview/lib/m3/query.py similarity index 100% rename from vars_gridview/lib/m3/query.py rename to src/vars_gridview/lib/m3/query.py diff --git a/vars_gridview/lib/raziel.py b/src/vars_gridview/lib/raziel.py similarity index 100% rename from vars_gridview/lib/raziel.py rename to src/vars_gridview/lib/raziel.py diff --git a/vars_gridview/lib/settings.py b/src/vars_gridview/lib/settings.py similarity index 100% rename from vars_gridview/lib/settings.py rename to src/vars_gridview/lib/settings.py diff --git a/vars_gridview/lib/sort_methods.py b/src/vars_gridview/lib/sort_methods.py similarity index 100% rename from vars_gridview/lib/sort_methods.py rename to src/vars_gridview/lib/sort_methods.py diff --git a/vars_gridview/lib/sql.py b/src/vars_gridview/lib/sql.py similarity index 100% rename from vars_gridview/lib/sql.py rename to src/vars_gridview/lib/sql.py diff --git a/vars_gridview/lib/util.py b/src/vars_gridview/lib/util.py similarity index 100% rename from vars_gridview/lib/util.py rename to src/vars_gridview/lib/util.py diff --git a/vars_gridview/lib/widgets.py b/src/vars_gridview/lib/widgets.py similarity index 100% rename from vars_gridview/lib/widgets.py rename to src/vars_gridview/lib/widgets.py diff --git a/vars_gridview/ui/ConfirmationDialog.py b/src/vars_gridview/ui/ConfirmationDialog.py similarity index 100% rename from vars_gridview/ui/ConfirmationDialog.py rename to src/vars_gridview/ui/ConfirmationDialog.py diff --git a/vars_gridview/ui/FileSelectionLineEdit.py b/src/vars_gridview/ui/FileSelectionLineEdit.py similarity index 100% rename from vars_gridview/ui/FileSelectionLineEdit.py rename to src/vars_gridview/ui/FileSelectionLineEdit.py diff --git a/src/vars_gridview/ui/JSONTree.py b/src/vars_gridview/ui/JSONTree.py new file mode 100644 index 0000000..30eb3f7 --- /dev/null +++ b/src/vars_gridview/ui/JSONTree.py @@ -0,0 +1,47 @@ +""" +JSON tree widget. +""" + +from PyQt6.QtWidgets import QTreeWidget, QTreeWidgetItem +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QMenu, QApplication + + +class JSONTree(QTreeWidget): + def __init__(self, json_data=None, parent=None): + super(JSONTree, self).__init__(parent) + self.setHeaderHidden(True) + self.setHeaderLabels(("key", "value")) + self.set_data(json_data) + + def set_data(self, json_data): + self.clear() + if json_data is not None: + self._parse_json(json_data) + self.resizeColumnToContents(0) + + def _parse_json(self, json_el, parent=None): + if parent is None: # Root node + parent = self + + if isinstance(json_el, list): # If a list, remap it to a dict + json_el = dict(enumerate(json_el)) + + for key, val in json_el.items(): + item = QTreeWidgetItem(parent) + item.setText(0, str(key)) + if isinstance(val, dict) or isinstance(val, list): + self._parse_json(val, parent=item) + else: + item.setText(1, str(val)) + + def mousePressEvent(self, e): + # If right-clicked, add a context menu to copy value + if e.button() == Qt.MouseButton.RightButton: + item = self.itemAt(e.pos()) + if item: + self.setCurrentItem(item) + menu = QMenu() + menu.addAction("Copy value", lambda: QApplication.clipboard().setText(item.text(1))) + menu.exec(e.globalPosition().toPoint()) + super(JSONTree, self).mousePressEvent(e) diff --git a/vars_gridview/ui/LoginDialog.py b/src/vars_gridview/ui/LoginDialog.py similarity index 100% rename from vars_gridview/ui/LoginDialog.py rename to src/vars_gridview/ui/LoginDialog.py diff --git a/vars_gridview/ui/QueryDialog.py b/src/vars_gridview/ui/QueryDialog.py similarity index 100% rename from vars_gridview/ui/QueryDialog.py rename to src/vars_gridview/ui/QueryDialog.py diff --git a/vars_gridview/ui/SortDialog.py b/src/vars_gridview/ui/SortDialog.py similarity index 100% rename from vars_gridview/ui/SortDialog.py rename to src/vars_gridview/ui/SortDialog.py diff --git a/vars_gridview/scripts/__init__.py b/src/vars_gridview/ui/__init__.py similarity index 100% rename from vars_gridview/scripts/__init__.py rename to src/vars_gridview/ui/__init__.py diff --git a/vars_gridview/ui/settings/SettingsDialog.py b/src/vars_gridview/ui/settings/SettingsDialog.py similarity index 100% rename from vars_gridview/ui/settings/SettingsDialog.py rename to src/vars_gridview/ui/settings/SettingsDialog.py diff --git a/vars_gridview/ui/__init__.py b/src/vars_gridview/ui/settings/__init__.py similarity index 100% rename from vars_gridview/ui/__init__.py rename to src/vars_gridview/ui/settings/__init__.py diff --git a/vars_gridview/ui/settings/tabs/AbstractSettingsTab.py b/src/vars_gridview/ui/settings/tabs/AbstractSettingsTab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/AbstractSettingsTab.py rename to src/vars_gridview/ui/settings/tabs/AbstractSettingsTab.py diff --git a/vars_gridview/ui/settings/tabs/AppearanceTab.py b/src/vars_gridview/ui/settings/tabs/AppearanceTab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/AppearanceTab.py rename to src/vars_gridview/ui/settings/tabs/AppearanceTab.py diff --git a/vars_gridview/ui/settings/tabs/CacheTab.py b/src/vars_gridview/ui/settings/tabs/CacheTab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/CacheTab.py rename to src/vars_gridview/ui/settings/tabs/CacheTab.py diff --git a/vars_gridview/ui/settings/tabs/EmbeddingsTab.py b/src/vars_gridview/ui/settings/tabs/EmbeddingsTab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/EmbeddingsTab.py rename to src/vars_gridview/ui/settings/tabs/EmbeddingsTab.py diff --git a/vars_gridview/ui/settings/tabs/M3Tab.py b/src/vars_gridview/ui/settings/tabs/M3Tab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/M3Tab.py rename to src/vars_gridview/ui/settings/tabs/M3Tab.py diff --git a/vars_gridview/ui/settings/tabs/VideoPlayerTab.py b/src/vars_gridview/ui/settings/tabs/VideoPlayerTab.py similarity index 100% rename from vars_gridview/ui/settings/tabs/VideoPlayerTab.py rename to src/vars_gridview/ui/settings/tabs/VideoPlayerTab.py diff --git a/vars_gridview/ui/settings/__init__.py b/src/vars_gridview/ui/settings/tabs/__init__.py similarity index 100% rename from vars_gridview/ui/settings/__init__.py rename to src/vars_gridview/ui/settings/tabs/__init__.py diff --git a/vars_gridview/ui/settings/tabs/__init__.py b/vars_gridview/ui/settings/tabs/__init__.py deleted file mode 100644 index e69de29..0000000