ibridgesgui 2.0.0__tar.gz → 2.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ibridgesgui-2.1.0/.github/workflows/tests.yml +94 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.gitignore +4 -3
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/PKG-INFO +9 -5
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/README.md +4 -3
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/_quarto.yml +2 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/build_tools/build_script.py +7 -1
- ibridgesgui-2.1.0/coverage.svg +1 -0
- ibridgesgui-2.1.0/docs/faq.qmd +36 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/getting-started.qmd +5 -5
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/info.qmd +6 -6
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/userdoc.qmd +1 -1
- ibridgesgui-2.1.0/ibridgesgui/__main__.py +50 -0
- ibridgesgui-2.1.0/ibridgesgui/_version.py +24 -0
- ibridgesgui-2.1.0/ibridgesgui/browsertab/__init__.py +1 -0
- ibridgesgui-2.1.0/ibridgesgui/browsertab/browser.py +105 -0
- ibridgesgui-2.1.0/ibridgesgui/browsertab/browser_controller.py +365 -0
- ibridgesgui-2.1.0/ibridgesgui/browsertab/browser_model.py +119 -0
- ibridgesgui-2.1.0/ibridgesgui/browsertab/irods_browser_service.py +192 -0
- ibridgesgui-2.1.0/ibridgesgui/config.py +384 -0
- ibridgesgui-2.1.0/ibridgesgui/gui_utils.py +193 -0
- ibridgesgui-2.1.0/ibridgesgui/info.py +86 -0
- ibridgesgui-2.1.0/ibridgesgui/irods_tree_model.py +139 -0
- ibridgesgui-2.1.0/ibridgesgui/login.py +226 -0
- ibridgesgui-2.1.0/ibridgesgui/logviewer.py +58 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/__init__.py +13 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/config_manager.py +91 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/main_window.py +126 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/plugin_manager.py +63 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/session_manager.py +74 -0
- ibridgesgui-2.1.0/ibridgesgui/mainmenu/tab_manager.py +102 -0
- ibridgesgui-2.1.0/ibridgesgui/md_schemas/ibridges_metadata_schema.json +54 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/__init__.py +17 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/base.py +60 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/check_config.py +190 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/create_collection.py +47 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/create_directory.py +45 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/download_data.py +167 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/rename_item.py +49 -0
- ibridgesgui-2.1.0/ibridgesgui/popup_widgets/upload_data.py +271 -0
- ibridgesgui-2.1.0/ibridgesgui/searchtab/__init__.py +1 -0
- ibridgesgui-2.1.0/ibridgesgui/searchtab/search.py +109 -0
- ibridgesgui-2.1.0/ibridgesgui/searchtab/search_controller.py +320 -0
- ibridgesgui-2.1.0/ibridgesgui/searchtab/search_model.py +74 -0
- ibridgesgui-2.1.0/ibridgesgui/synctab/__init__.py +1 -0
- ibridgesgui-2.1.0/ibridgesgui/synctab/sync.py +71 -0
- ibridgesgui-2.1.0/ibridgesgui/synctab/sync_controller.py +343 -0
- ibridgesgui-2.1.0/ibridgesgui/synctab/sync_model.py +29 -0
- ibridgesgui-2.1.0/ibridgesgui/threads.py +276 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabInfo.py +7 -3
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabInfo.ui +5 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSearch.py +108 -66
- ibridgesgui-2.1.0/ibridgesgui/ui_files/tabSearch.ui +486 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/uploadData.py +80 -58
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/uploadData.ui +97 -65
- ibridgesgui-2.1.0/ibridgesgui/welcome.py +54 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/PKG-INFO +9 -5
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/SOURCES.txt +64 -5
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/requires.txt +4 -1
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/pyproject.toml +23 -2
- ibridgesgui-2.1.0/tests/browser/conftest.py +102 -0
- ibridgesgui-2.1.0/tests/browser/test_browser_controller.py +473 -0
- ibridgesgui-2.1.0/tests/browser/test_browser_model.py +87 -0
- ibridgesgui-2.1.0/tests/browser/test_irods_browser_service.py +281 -0
- ibridgesgui-2.1.0/tests/conftest.py +49 -0
- ibridgesgui-2.1.0/tests/gui/test_info_tab.py +127 -0
- ibridgesgui-2.1.0/tests/gui/test_login.py +303 -0
- ibridgesgui-2.1.0/tests/gui/test_main.py +49 -0
- ibridgesgui-2.1.0/tests/main_window/conftest.py +136 -0
- ibridgesgui-2.1.0/tests/main_window/test_config_manager.py +57 -0
- ibridgesgui-2.1.0/tests/main_window/test_main_window.py +151 -0
- ibridgesgui-2.1.0/tests/main_window/test_session_manager.py +223 -0
- ibridgesgui-2.1.0/tests/main_window/test_tab_manager.py +195 -0
- ibridgesgui-2.1.0/tests/popup/conftest.py +142 -0
- ibridgesgui-2.1.0/tests/popup/test_check_config.py +148 -0
- ibridgesgui-2.1.0/tests/popup/test_download_data.py +221 -0
- ibridgesgui-2.1.0/tests/popup/test_simple_dialogs.py +72 -0
- ibridgesgui-2.1.0/tests/popup/test_transfer_dialog_base.py +49 -0
- ibridgesgui-2.1.0/tests/popup/test_upload_data.py +279 -0
- ibridgesgui-2.1.0/tests/search/conftest.py +152 -0
- ibridgesgui-2.1.0/tests/search/test_search_controller.py +416 -0
- ibridgesgui-2.1.0/tests/search/test_search_model.py +174 -0
- ibridgesgui-2.1.0/tests/sync/conftest.py +77 -0
- ibridgesgui-2.1.0/tests/sync/test_sync_controller.py +355 -0
- ibridgesgui-2.1.0/tests/sync/test_sync_model.py +47 -0
- ibridgesgui-2.1.0/tests/threads/conftest.py +85 -0
- ibridgesgui-2.1.0/tests/threads/test_search_thread.py +103 -0
- ibridgesgui-2.1.0/tests/threads/test_sync_thread.py +97 -0
- ibridgesgui-2.1.0/tests/threads/test_transfer_thread.py +153 -0
- ibridgesgui-2.1.0/tests/unit/test_config.py +409 -0
- ibridgesgui-2.1.0/tests/unit/test_gui_utils.py +217 -0
- ibridgesgui-2.1.0/tests/unit/test_irods_tree_model.py +175 -0
- ibridgesgui-2.0.0/ibridgesgui/__main__.py +0 -318
- ibridgesgui-2.0.0/ibridgesgui/_version.py +0 -34
- ibridgesgui-2.0.0/ibridgesgui/browser.py +0 -552
- ibridgesgui-2.0.0/ibridgesgui/config.py +0 -425
- ibridgesgui-2.0.0/ibridgesgui/gui_utils.py +0 -207
- ibridgesgui-2.0.0/ibridgesgui/info.py +0 -53
- ibridgesgui-2.0.0/ibridgesgui/irods_tree_model.py +0 -160
- ibridgesgui-2.0.0/ibridgesgui/login.py +0 -174
- ibridgesgui-2.0.0/ibridgesgui/logviewer.py +0 -47
- ibridgesgui-2.0.0/ibridgesgui/popup_widgets.py +0 -599
- ibridgesgui-2.0.0/ibridgesgui/search.py +0 -347
- ibridgesgui-2.0.0/ibridgesgui/sync.py +0 -300
- ibridgesgui-2.0.0/ibridgesgui/threads.py +0 -252
- ibridgesgui-2.0.0/ibridgesgui/ui_files/tabSearch.ui +0 -468
- ibridgesgui-2.0.0/ibridgesgui/welcome.py +0 -46
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.flake8 +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/dependabot.yml +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/linter.yml +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/nuitka_release.yml +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/publish.yml +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/.github/workflows/pypi_release.yml +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/LICENSE +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/build_tools/ui_to_py.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/developers.qmd +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/add_check_config.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/add_new_config.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/browser.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/login.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/metadata.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/permissions.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/replicas.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/search.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/start_ibridges.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/docs/screenshots/sync.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/__init__.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-left.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-right.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/arrow-up.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/christmas-logo.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/home.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/iBridges.ico +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/loading_circle.gif +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/logo.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/nosync.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/refresh.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/icons/syncing.png +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/MainMenu.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/MainMenu.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/__init__.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/configCheck.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/configCheck.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/createCollection.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/createCollection.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/downloadData.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/downloadData.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/irodsLogin.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/irodsLogin.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/renameItem.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/renameItem.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabBrowser.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabBrowser.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabLogging.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabLogging.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSync.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/tabSync.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/transferData.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/transferData.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/welcome.py +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui/ui_files/welcome.ui +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/dependency_links.txt +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/ibridgesgui.egg-info/top_level.txt +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/index.qmd +0 -0
- {ibridgesgui-2.0.0 → ibridgesgui-2.1.0}/setup.cfg +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: true
|
|
15
|
+
matrix:
|
|
16
|
+
os: [ubuntu-latest]
|
|
17
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
18
|
+
include:
|
|
19
|
+
- os: macos-latest
|
|
20
|
+
python-version: "3.13"
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up Python
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python-version }}
|
|
30
|
+
|
|
31
|
+
# -----------------------------
|
|
32
|
+
# Linux-only Qt dependencies
|
|
33
|
+
# -----------------------------
|
|
34
|
+
- name: Install Qt system dependencies (Linux)
|
|
35
|
+
if: runner.os == 'Linux'
|
|
36
|
+
run: |
|
|
37
|
+
sudo apt-get update
|
|
38
|
+
sudo apt-get install -y \
|
|
39
|
+
libegl1 \
|
|
40
|
+
libgl1-mesa-dev \
|
|
41
|
+
libxkbcommon-x11-0 \
|
|
42
|
+
libxcb-icccm4 \
|
|
43
|
+
libxcb-image0 \
|
|
44
|
+
libxcb-keysyms1 \
|
|
45
|
+
libxcb-randr0 \
|
|
46
|
+
libxcb-render-util0 \
|
|
47
|
+
libxcb-xinerama0 \
|
|
48
|
+
libxcb-xfixes0 \
|
|
49
|
+
xvfb
|
|
50
|
+
|
|
51
|
+
# -----------------------------
|
|
52
|
+
# Install Python dependencies
|
|
53
|
+
# -----------------------------
|
|
54
|
+
- name: Install dependencies
|
|
55
|
+
run: |
|
|
56
|
+
python -m pip install --upgrade pip
|
|
57
|
+
python -m pip install .[test]
|
|
58
|
+
python -m pip install pytest pytest-cov
|
|
59
|
+
|
|
60
|
+
# -----------------------------
|
|
61
|
+
# Set Qt to offscreen mode
|
|
62
|
+
# -----------------------------
|
|
63
|
+
- name: Configure Qt for headless mode
|
|
64
|
+
run: |
|
|
65
|
+
echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
|
|
66
|
+
- name: Configure Qt for headless mode (macOS)
|
|
67
|
+
if: runner.os == 'macOS'
|
|
68
|
+
run: |
|
|
69
|
+
echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV
|
|
70
|
+
echo "QT_MAC_WANTS_LAYER=1" >> $GITHUB_ENV
|
|
71
|
+
|
|
72
|
+
# -----------------------------
|
|
73
|
+
# Run tests
|
|
74
|
+
# -----------------------------
|
|
75
|
+
- name: Run tests and coverage
|
|
76
|
+
run: |
|
|
77
|
+
python -m pytest --cov=ibridgesgui --cov-report=xml --cov-report=term-missing --cov-fail-under=70 tests
|
|
78
|
+
|
|
79
|
+
- name: Install badge generator
|
|
80
|
+
run: pip install genbadge[coverage]
|
|
81
|
+
- name: Generate coverage badge
|
|
82
|
+
run: genbadge coverage -i coverage.xml -o coverage.svg
|
|
83
|
+
|
|
84
|
+
- name: Commit coverage badge
|
|
85
|
+
if: github.event_name == 'push' &&
|
|
86
|
+
matrix.python-version == '3.13' &&
|
|
87
|
+
matrix.os == 'ubuntu-latest'
|
|
88
|
+
run: |
|
|
89
|
+
git config user.name "github-actions"
|
|
90
|
+
git config user.email "github-actions@github.com"
|
|
91
|
+
git add coverage.svg
|
|
92
|
+
git commit -m "Update coverage badge" || echo "No changes to commit"
|
|
93
|
+
git push
|
|
94
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ibridgesgui
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.0
|
|
4
4
|
Summary: Graphical user interface for accessing data and metadata on iRODS servers.
|
|
5
5
|
Author-email: Christine Staiger <c.staiger@uu.nl>
|
|
6
6
|
License: GNU LESSER GENERAL PUBLIC LICENSE
|
|
@@ -521,15 +521,18 @@ Requires-Python: >=3.9
|
|
|
521
521
|
Description-Content-Type: text/markdown
|
|
522
522
|
License-File: LICENSE
|
|
523
523
|
Requires-Dist: PySide6>=6.8.1
|
|
524
|
-
Requires-Dist: ibridges<2.
|
|
524
|
+
Requires-Dist: ibridges<2.2,>=2.1.0
|
|
525
525
|
Requires-Dist: setproctitle==1.3.7
|
|
526
526
|
Requires-Dist: importlib-resources; python_version <= "3.10"
|
|
527
|
+
Requires-Dist: jsonschema
|
|
527
528
|
Provides-Extra: test
|
|
528
529
|
Requires-Dist: pylint; extra == "test"
|
|
529
530
|
Requires-Dist: pytest; extra == "test"
|
|
530
531
|
Requires-Dist: pytest-cov; extra == "test"
|
|
531
532
|
Requires-Dist: ruff; extra == "test"
|
|
532
533
|
Requires-Dist: mypy; extra == "test"
|
|
534
|
+
Requires-Dist: pytest-qt; extra == "test"
|
|
535
|
+
Requires-Dist: PySide6-Essentials; extra == "test"
|
|
533
536
|
Provides-Extra: deploy
|
|
534
537
|
Requires-Dist: Nuitka; extra == "deploy"
|
|
535
538
|
Requires-Dist: imageio; extra == "deploy"
|
|
@@ -550,6 +553,7 @@ Dynamic: license-file
|
|
|
550
553
|
|
|
551
554
|
[](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml)
|
|
552
555
|
[](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml)
|
|
556
|
+

|
|
553
557
|
[](https://doi.org/10.5281/zenodo.17139123)
|
|
554
558
|
|
|
555
559
|
|
|
@@ -615,8 +619,8 @@ Please note, that this feature is still in experimental state.
|
|
|
615
619
|
|
|
616
620
|
### Prebuilt executables
|
|
617
621
|
Go to the [Releases page](https://github.com/iBridges-for-iRODS/iBridges-GUI/releases). In the latest releases you will find three zip-files, these contain the prebuilt application.
|
|
618
|
-
Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe,
|
|
619
|
-
For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.
|
|
622
|
+
Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, bin]`
|
|
623
|
+
For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.bin`.
|
|
620
624
|
|
|
621
625
|
|
|
622
626
|
### Building Executables
|
|
@@ -648,7 +652,7 @@ options:
|
|
|
648
652
|
This will create a virtual environment `venv` in your iBridges folder. Next to that you will find a new folder `build` and `ibridgesgui_dist`. The executable can be found and started like this for Mac and Linux:
|
|
649
653
|
|
|
650
654
|
```
|
|
651
|
-
./
|
|
655
|
+
./ibridgesgui_dist/ibridgesgui/ibridges_gui.bin
|
|
652
656
|
```
|
|
653
657
|
|
|
654
658
|
For Windows simply click on the file `output/ibridgesgui/ibridges_gui.exe`.
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
[](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/linter.yml)
|
|
13
13
|
[](https://github.com/iBridges-for-iRods/iBridges-GUI/actions/workflows/publish.yml)
|
|
14
|
+

|
|
14
15
|
[](https://doi.org/10.5281/zenodo.17139123)
|
|
15
16
|
|
|
16
17
|
|
|
@@ -76,8 +77,8 @@ Please note, that this feature is still in experimental state.
|
|
|
76
77
|
|
|
77
78
|
### Prebuilt executables
|
|
78
79
|
Go to the [Releases page](https://github.com/iBridges-for-iRODS/iBridges-GUI/releases). In the latest releases you will find three zip-files, these contain the prebuilt application.
|
|
79
|
-
Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe,
|
|
80
|
-
For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.
|
|
80
|
+
Download the respective zip-file for your system and unpack it. In the unpacked folder there is a file `ibridges_gui.[exe, bin]`
|
|
81
|
+
For Windows simply click on the exe-file, for Mac and Linux open the file with a shell `bash ./ibridges_gui.bin`.
|
|
81
82
|
|
|
82
83
|
|
|
83
84
|
### Building Executables
|
|
@@ -109,7 +110,7 @@ options:
|
|
|
109
110
|
This will create a virtual environment `venv` in your iBridges folder. Next to that you will find a new folder `build` and `ibridgesgui_dist`. The executable can be found and started like this for Mac and Linux:
|
|
110
111
|
|
|
111
112
|
```
|
|
112
|
-
./
|
|
113
|
+
./ibridgesgui_dist/ibridgesgui/ibridges_gui.bin
|
|
113
114
|
```
|
|
114
115
|
|
|
115
116
|
For Windows simply click on the file `output/ibridgesgui/ibridges_gui.exe`.
|
|
@@ -59,10 +59,14 @@ def create_exe(args):
|
|
|
59
59
|
{args.code_folder.joinpath('__main__.py')} --quiet"
|
|
60
60
|
uipy.run_cmd(cmd)
|
|
61
61
|
|
|
62
|
-
# Step 4, move the icons folder to the distribution folder
|
|
62
|
+
# Step 4, move the icons and mdschema folder to the distribution folder
|
|
63
|
+
print(f"Moving {args.icons_folder} --> {args.icons_folder.parent.parent.joinpath('__main__.dist', args.icons_folder)}")
|
|
63
64
|
replace_folder(args.icons_folder,
|
|
64
65
|
args.icons_folder.parent.parent.joinpath('__main__.dist',
|
|
65
66
|
args.icons_folder.name))
|
|
67
|
+
replace_folder(args.mdschema_folder,
|
|
68
|
+
args.mdschema_folder.parent.parent.joinpath('__main__.dist',
|
|
69
|
+
args.mdschema_folder.name))
|
|
66
70
|
|
|
67
71
|
# Step 5, rename the distribution folder and file
|
|
68
72
|
shipping_folder = Path('ibridgesgui_dist')
|
|
@@ -86,6 +90,8 @@ if __name__ == "__main__":
|
|
|
86
90
|
parser.add_argument('--ui_folder', default=default_code_folder.joinpath('ui_files'),
|
|
87
91
|
type=Path, required=False,
|
|
88
92
|
help='Full path to the directory with ui files')
|
|
93
|
+
parser.add_argument('--mdschema_folder', default=default_code_folder.joinpath('md_schemas'), type=Path,
|
|
94
|
+
help='Full path to the directory with the valid metadata schemas.')
|
|
89
95
|
parser.add_argument('--icons_folder', default=default_code_folder.joinpath('icons'),
|
|
90
96
|
type=Path, required=False,
|
|
91
97
|
help='Full path to the directory with the icons')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 85.90%"><title>coverage: 85.90%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#97ca00"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">85.90%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">85.90%</text></g></svg>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Frequently Asked Questions
|
|
2
|
+
|
|
3
|
+
If you cannot find your question here, please also take a look at our [API and CLI FAQ](https://ibridges.readthedocs.io/en/latest/faq.html).
|
|
4
|
+
|
|
5
|
+
## I found a bug or have a feature request, where do I go?
|
|
6
|
+
|
|
7
|
+
Our development is done on [GitHub](https://github.com/iBridges-for-iRODS/iBridges-GUI).
|
|
8
|
+
|
|
9
|
+
Look under the *Issues* section whether the bug or feature request has already been reported. If not, we heartily welcome creating a new issue. We try to get back to you as soon as possible, at least within a few days.
|
|
10
|
+
|
|
11
|
+
## Help, I’m getting a “NetworkError” while trying to transfer (large) files
|
|
12
|
+
|
|
13
|
+
This error is most likely to happen if you try to transfer a large file. The default timeout for iBridges is 25000 seconds, which translates to roughly 7 hours. This should not cause issues during the actual transfer. However, if the calculation of the checksum takes more than 7 hours (if the iRODS server is busy for example, or the file is many terabytes), then you will get a network error. The checksum itself should still be created.
|
|
14
|
+
|
|
15
|
+
You can increase the timeout in your `irods_environment.json` file by adding a new entry with `"connection_timeout": <time in seconds>,`.
|
|
16
|
+
|
|
17
|
+
Note, that the **maximum number equals 292 years**, i.e. `"connection_timeout": 9208512000,`.
|
|
18
|
+
|
|
19
|
+
## My metadata with keys starting with `org_` do not show up in the iBridges metadata.
|
|
20
|
+
|
|
21
|
+
By default, iBridges does not show metadata that contain a key starting with the prefix *org_*. This is due to data security reasons on Yoda systems.
|
|
22
|
+
|
|
23
|
+
You can omit that only by using the [iBridges API](https://ibridges.readthedocs.io/en/latest/faq.html#my-metadata-with-keys-starting-with-org-do-not-show-up-in-the-ibridges-metadata).
|
|
24
|
+
|
|
25
|
+
## How can I download files that follow a certain pattern but do not lie in the same collection?
|
|
26
|
+
|
|
27
|
+
You can use the *Search* for this. With the search mask you can filter for specific data no matter where they are located. In the results table you can select those files you would like to download.
|
|
28
|
+
|
|
29
|
+
## How do I find all the data I have access to?
|
|
30
|
+
|
|
31
|
+
When data is shared in iRODS it is not always easy to know where the shared data lies as they are not visible from your "home" collection or project collection.
|
|
32
|
+
|
|
33
|
+
However, shared data objects always need to lie in a collection that you can access, it's an iRODS feature.
|
|
34
|
+
|
|
35
|
+
So again the *Search* can help you out here. Direct the search to `/yourZone/home`, select `Obj/Coll name: %` and select `Collections` (unselect `Data Objects`).
|
|
36
|
+
The result will show you all collections you have access to.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# Getting started with iBridges
|
|
1
|
+
# Getting started with iBridges GUI
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
## Install iBridges
|
|
4
|
+
## Install iBridges GUI
|
|
5
5
|
|
|
6
6
|
```
|
|
7
7
|
pip install ibridgesgui
|
|
@@ -9,9 +9,9 @@ pip install ibridgesgui
|
|
|
9
9
|
|
|
10
10
|
## Start the program
|
|
11
11
|
|
|
12
|
-
Please start **iBridges
|
|
12
|
+
Please start **iBridges GUI** by typing `ibridges gui` on your terminal and hit enter.
|
|
13
13
|
|
|
14
|
-
## Configuring iBridges
|
|
14
|
+
## Configuring iBridges GUI
|
|
15
15
|
|
|
16
16
|
To connect to the server you need a configuration file, a so-called `irods_environment.json`.
|
|
17
17
|
You can create one for yourself using templates, editing default settings we provide for you or simply create such a file.
|
|
@@ -74,7 +74,7 @@ usage: build_script.py [-h] [--debug_exe] [--rem_venv]
|
|
|
74
74
|
[--code_folder CODE_FOLDER] [--ui_folder UI_FOLDER]
|
|
75
75
|
[--icons_folder ICONS_FOLDER] [--venv VENV]
|
|
76
76
|
|
|
77
|
-
iBridges-
|
|
77
|
+
iBridges-GUI exe creator.
|
|
78
78
|
|
|
79
79
|
options:
|
|
80
80
|
-h, --help show this help message and exit
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "What is iBridges
|
|
2
|
+
title: "What is iBridges GUI"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
[iBridges-
|
|
5
|
+
[iBridges-GUI](https://github.com/iBridges-for-iRODS/iBridges-GUI) is a graphical user interface to the python package [iBridges](https://github.com/UtrechtUniversity/iBridges), it provides users of *Windows, Linux and Mac* with a *graphical user interface* to interact with **iRODS** servers.
|
|
6
6
|
The tool is agnostic to any rules/policies in the server. The out-of-the-box iBridges supports three main functions: browsing through iRODS collections, upload/download and synchronisation of data, manipulate iRODS metadata and search through data collections.
|
|
7
7
|
|
|
8
8
|
## Current features
|
|
@@ -29,17 +29,17 @@ We test our code on iRODS servers with versions
|
|
|
29
29
|
|
|
30
30
|
```
|
|
31
31
|
pip install ibridges
|
|
32
|
-
pip install git+https://github.com/
|
|
32
|
+
pip install git+https://github.com/iBridges-for-iRODS/iBridges-GUI.git@main
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
### Development version
|
|
36
36
|
|
|
37
37
|
```
|
|
38
38
|
pip install ibridges
|
|
39
|
-
pip install git+https://github.com/
|
|
39
|
+
pip install git+https://github.com/iBridges-for-iRODS/iBridges-GUI.git@develop
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
Start the application by calling `ibridges
|
|
42
|
+
Start the application by calling `ibridges gui` on your commandline.
|
|
43
43
|
|
|
44
44
|
## Authors
|
|
45
45
|
**Christine Staiger (Maintainer) [ORCID](https://orcid.org/0000-0002-6754-7647)**
|
|
@@ -60,7 +60,7 @@ Start the application by calling `ibridges-gui` on your commandline.
|
|
|
60
60
|
*University of Groningen, Center for Information Technology*, 2022
|
|
61
61
|
|
|
62
62
|
## Contributing
|
|
63
|
-
Our development is done on GitHub](https://github.com/
|
|
63
|
+
Our development is done on GitHub](https://github.com/iBridges-for-iRODS/iBridges-GUI). We are welcoming contributions by pull requests. You can also ask for new features/ideas in our issue tracker.
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
|
|
@@ -30,7 +30,7 @@ When you successfully logged into iRODS the first view you will see is the **Bro
|
|
|
30
30
|
|
|
31
31
|
### Navigation
|
|
32
32
|
|
|
33
|
-
- The navigation shows an **editable field**, which contains your current iRODS path. When you just started iBridges
|
|
33
|
+
- The navigation shows an **editable field**, which contains your current iRODS path. When you just started iBridges GUI it will point to your `irods_home` setting in the configuration file.
|
|
34
34
|
You can **navigate to another part of the iRODS collection tree** by editing this field and hitting `<Enter>`.
|
|
35
35
|
|
|
36
36
|
- The **three buttons** next to the editable navigation field are `Refresh` (circle arrows) to refresh the list below the navigation section , Navigate `one level up` (up arrow) and navigate to your `home` collection (little house).
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""main app."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
import setproctitle
|
|
8
|
+
from PySide6.QtWidgets import QApplication, QStackedWidget
|
|
9
|
+
|
|
10
|
+
from ibridgesgui import config as config_module
|
|
11
|
+
from ibridgesgui.mainmenu import ConfigManager
|
|
12
|
+
from ibridgesgui.mainmenu.main_window import MainWindow
|
|
13
|
+
|
|
14
|
+
THIS_APPLICATION = "ibridges-gui"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def main(session=None) -> None:
|
|
18
|
+
"""Start app."""
|
|
19
|
+
setproctitle.setproctitle(THIS_APPLICATION)
|
|
20
|
+
|
|
21
|
+
# Load GUI config
|
|
22
|
+
cfg = ConfigManager()
|
|
23
|
+
|
|
24
|
+
# Logging level from config
|
|
25
|
+
level = cfg.get_log_level() or "debug"
|
|
26
|
+
|
|
27
|
+
# IMPORTANT: call init_logger from the MODULE, not the ConfigManager
|
|
28
|
+
logger = config_module.init_logger(THIS_APPLICATION, level)
|
|
29
|
+
logger.info("Starting application")
|
|
30
|
+
|
|
31
|
+
# Ensure ~/.irods exists
|
|
32
|
+
config_module.ensure_irods_location()
|
|
33
|
+
|
|
34
|
+
# Set working directory
|
|
35
|
+
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
|
36
|
+
|
|
37
|
+
# Qt app
|
|
38
|
+
app = QApplication(sys.argv)
|
|
39
|
+
container = QStackedWidget()
|
|
40
|
+
|
|
41
|
+
# Main window
|
|
42
|
+
window = MainWindow(THIS_APPLICATION, session, cfg)
|
|
43
|
+
container.addWidget(window)
|
|
44
|
+
container.show()
|
|
45
|
+
|
|
46
|
+
app.exec()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == "__main__":
|
|
50
|
+
main()
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# file generated by vcs-versioning
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"__version__",
|
|
7
|
+
"__version_tuple__",
|
|
8
|
+
"version",
|
|
9
|
+
"version_tuple",
|
|
10
|
+
"__commit_id__",
|
|
11
|
+
"commit_id",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
version: str
|
|
15
|
+
__version__: str
|
|
16
|
+
__version_tuple__: tuple[int | str, ...]
|
|
17
|
+
version_tuple: tuple[int | str, ...]
|
|
18
|
+
commit_id: str | None
|
|
19
|
+
__commit_id__: str | None
|
|
20
|
+
|
|
21
|
+
__version__ = version = '2.1.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 1, 0)
|
|
23
|
+
|
|
24
|
+
__commit_id__ = commit_id = 'g97bdf8817'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Browser tab."""
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Browser widget."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import PySide6.QtWidgets
|
|
6
|
+
|
|
7
|
+
from ibridgesgui.browsertab.browser_controller import BrowserController
|
|
8
|
+
from ibridgesgui.gui_utils import UI_FILE_DIR, get_irods_item, load_ui, populate_table
|
|
9
|
+
from ibridgesgui.ui_files.tabBrowser import Ui_tabBrowser
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Browser(PySide6.QtWidgets.QWidget, Ui_tabBrowser):
|
|
13
|
+
"""Browser view for iRODS session (UI only, logic in BrowserController)."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, session, app_name: str):
|
|
16
|
+
"""Init."""
|
|
17
|
+
super().__init__()
|
|
18
|
+
|
|
19
|
+
if getattr(sys, "frozen", False) or ("__compiled__" in globals()):
|
|
20
|
+
super().setupUi(self)
|
|
21
|
+
else:
|
|
22
|
+
load_ui(UI_FILE_DIR / "tabBrowser.ui", self)
|
|
23
|
+
|
|
24
|
+
self.controller = BrowserController(self, session, app_name)
|
|
25
|
+
self.controller.init_browser()
|
|
26
|
+
|
|
27
|
+
# --- Rendering helpers moved from controller ---
|
|
28
|
+
|
|
29
|
+
def render_metadata(self, data, irods_path):
|
|
30
|
+
"""Render metadata table."""
|
|
31
|
+
self.meta_key_field.clear()
|
|
32
|
+
self.meta_value_field.clear()
|
|
33
|
+
self.meta_units_field.clear()
|
|
34
|
+
self.no_meta_label.clear()
|
|
35
|
+
|
|
36
|
+
populate_table(self.meta_table, len(data), data)
|
|
37
|
+
current_tab = self.info_tabs.currentWidget().objectName()
|
|
38
|
+
if current_tab == "metadata" and len(data) == 0:
|
|
39
|
+
self.no_meta_label.setText(f"Metadata for {irods_path} is empty.")
|
|
40
|
+
self.meta_table.resizeColumnsToContents()
|
|
41
|
+
|
|
42
|
+
def render_acls(self, clean, irods_path):
|
|
43
|
+
"""Render ACL table."""
|
|
44
|
+
self.acl_table.setRowCount(0)
|
|
45
|
+
self.acl_user_field.clear()
|
|
46
|
+
self.acl_zone_field.clear()
|
|
47
|
+
self.acl_box.clear()
|
|
48
|
+
self.recursive_box.setEnabled(irods_path.collection_exists())
|
|
49
|
+
|
|
50
|
+
obj_acl = ["read", "write", "own", "delete"]
|
|
51
|
+
coll_acl = obj_acl + [
|
|
52
|
+
"Newly added items to collection will inherit permissions",
|
|
53
|
+
"Remove inheritance.",
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
for item in coll_acl if irods_path.collection_exists() else obj_acl:
|
|
57
|
+
self.acl_box.addItem(item)
|
|
58
|
+
self.acl_box.setEnabled(True)
|
|
59
|
+
|
|
60
|
+
populate_table(self.acl_table, len(clean), clean)
|
|
61
|
+
self.acl_table.resizeColumnsToContents()
|
|
62
|
+
|
|
63
|
+
obj = get_irods_item(irods_path)
|
|
64
|
+
self.owner_label.setText(obj.owner_name)
|
|
65
|
+
|
|
66
|
+
def render_replicas(self, rows):
|
|
67
|
+
"""Render replicas table."""
|
|
68
|
+
self.replica_table.setRowCount(0)
|
|
69
|
+
if rows:
|
|
70
|
+
populate_table(self.replica_table, len(rows), rows)
|
|
71
|
+
self.replica_table.resizeColumnsToContents()
|
|
72
|
+
|
|
73
|
+
def clear_info_tabs(self):
|
|
74
|
+
"""Creal all info tabs."""
|
|
75
|
+
self.acl_table.setRowCount(0)
|
|
76
|
+
self.meta_table.setRowCount(0)
|
|
77
|
+
self.replica_table.setRowCount(0)
|
|
78
|
+
self.preview_browser.clear()
|
|
79
|
+
self.no_meta_label.clear()
|
|
80
|
+
|
|
81
|
+
def on_tab_changed(self):
|
|
82
|
+
"""Clear the metadata label when switching tabs."""
|
|
83
|
+
self.no_meta_label.clear()
|
|
84
|
+
|
|
85
|
+
def load_metadata_item(self, index):
|
|
86
|
+
"""Load selected metadata row into edit fields."""
|
|
87
|
+
row = index.row()
|
|
88
|
+
key = self.meta_table.item(row, 0).text()
|
|
89
|
+
val = self.meta_table.item(row, 1).text()
|
|
90
|
+
units = self.meta_table.item(row, 2).text() if self.meta_table.item(row, 2) else ""
|
|
91
|
+
self.meta_key_field.setText(key)
|
|
92
|
+
self.meta_value_field.setText(val)
|
|
93
|
+
self.meta_units_field.setText(units)
|
|
94
|
+
|
|
95
|
+
def load_permission(self, index):
|
|
96
|
+
"""Load selected ACL row into edit fields."""
|
|
97
|
+
row = index.row()
|
|
98
|
+
user = self.acl_table.item(row, 0).text()
|
|
99
|
+
zone = self.acl_table.item(row, 1).text()
|
|
100
|
+
acc = self.acl_table.item(row, 2).text()
|
|
101
|
+
|
|
102
|
+
self.acl_user_field.setText(user)
|
|
103
|
+
self.acl_zone_field.setText(zone)
|
|
104
|
+
self.acl_box.setCurrentText(acc)
|
|
105
|
+
self.recursive_box.setCurrentText("False")
|