p3lib 1.1.115__py2.py3-none-any.whl → 1.1.117__py2.py3-none-any.whl
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.
- p3lib/helper.py +68 -0
- p3lib/ngt.py +82 -0
- {p3lib-1.1.115.dist-info → p3lib-1.1.117.dist-info}/METADATA +1 -1
- {p3lib-1.1.115.dist-info → p3lib-1.1.117.dist-info}/RECORD +6 -6
- {p3lib-1.1.115.dist-info → p3lib-1.1.117.dist-info}/LICENSE +0 -0
- {p3lib-1.1.115.dist-info → p3lib-1.1.117.dist-info}/WHEEL +0 -0
p3lib/helper.py
CHANGED
@@ -9,6 +9,7 @@ import platform
|
|
9
9
|
import json
|
10
10
|
import traceback
|
11
11
|
import socket
|
12
|
+
import inspect
|
12
13
|
|
13
14
|
def initArgs(parser, lastCmdLineArg=None, checkHostArg=True):
|
14
15
|
"""This method is responsible for
|
@@ -446,3 +447,70 @@ def getProgramVersion():
|
|
446
447
|
raise Exception(f"Failed to extract program version from '{line}' line of {poetryConfigFile} file.")
|
447
448
|
return programVersion
|
448
449
|
|
450
|
+
def get_assets_folders():
|
451
|
+
"""@return A list of all the assets folders found."""
|
452
|
+
searchFolders = []
|
453
|
+
assetsFolders = []
|
454
|
+
calling_file = None
|
455
|
+
# Get the full path to the python file that called this get_assets_folders() function.
|
456
|
+
frame = inspect.stack()[1]
|
457
|
+
module = inspect.getmodule(frame[0])
|
458
|
+
if module and hasattr(module, '__file__'):
|
459
|
+
calling_file = os.path.abspath(module.__file__)
|
460
|
+
|
461
|
+
if calling_file:
|
462
|
+
startup_path = os.path.dirname(calling_file)
|
463
|
+
searchFolders.append( os.path.join(startup_path, 'assets') )
|
464
|
+
pp1 = os.path.join(startup_path, '..')
|
465
|
+
searchFolders.append( os.path.join(pp1, 'assets') )
|
466
|
+
pp2 = os.path.join(pp1, '..')
|
467
|
+
searchFolders.append( os.path.join(pp2, 'assets') )
|
468
|
+
# Try all the site packages folders we know about.
|
469
|
+
for path in sys.path:
|
470
|
+
if 'site-packages' in path:
|
471
|
+
site_packages_path = path
|
472
|
+
searchFolders.append( os.path.join(site_packages_path, 'assets') )
|
473
|
+
|
474
|
+
for folder in searchFolders:
|
475
|
+
absPath = os.path.abspath(folder)
|
476
|
+
if os.path.isdir(absPath):
|
477
|
+
assetsFolders.append(absPath)
|
478
|
+
|
479
|
+
return assetsFolders
|
480
|
+
|
481
|
+
|
482
|
+
def get_assets_folder(raise_error=True):
|
483
|
+
"""@brief Get the assests folder.
|
484
|
+
@param raise_error If True then raise an error if the assets folder is not found.
|
485
|
+
@return The abs assets folder path string."""
|
486
|
+
searchFolders = []
|
487
|
+
assetsFolder = None
|
488
|
+
calling_file = None
|
489
|
+
# Get the full path to the python file that called this get_assets_folder() function.
|
490
|
+
frame = inspect.stack()[1]
|
491
|
+
module = inspect.getmodule(frame[0])
|
492
|
+
if module and hasattr(module, '__file__'):
|
493
|
+
calling_file = os.path.abspath(module.__file__)
|
494
|
+
|
495
|
+
if calling_file:
|
496
|
+
startup_path = os.path.dirname(calling_file)
|
497
|
+
searchFolders.append( os.path.join(startup_path, 'assets') )
|
498
|
+
pp1 = os.path.join(startup_path, '..')
|
499
|
+
searchFolders.append( os.path.join(pp1, 'assets') )
|
500
|
+
pp2 = os.path.join(pp1, '..')
|
501
|
+
searchFolders.append( os.path.join(pp2, 'assets') )
|
502
|
+
# Try all the site packages folders we know about.
|
503
|
+
for path in sys.path:
|
504
|
+
if 'site-packages' in path:
|
505
|
+
site_packages_path = path
|
506
|
+
searchFolders.append( os.path.join(site_packages_path, 'assets') )
|
507
|
+
|
508
|
+
for folder in searchFolders:
|
509
|
+
absPath = os.path.abspath(folder)
|
510
|
+
if os.path.isdir(absPath):
|
511
|
+
assetsFolder = absPath
|
512
|
+
|
513
|
+
if raise_error and assetsFolder is None:
|
514
|
+
raise Exception('Failed to find assets folder.')
|
515
|
+
|
516
|
+
return assetsFolder
|
p3lib/ngt.py
CHANGED
@@ -12,6 +12,7 @@ import platform
|
|
12
12
|
from time import sleep
|
13
13
|
from queue import Queue
|
14
14
|
from time import time, strftime, localtime
|
15
|
+
from pathlib import Path
|
15
16
|
|
16
17
|
from p3lib.helper import getProgramVersion
|
17
18
|
|
@@ -836,3 +837,84 @@ class YesNoDialog(object):
|
|
836
837
|
def close(self):
|
837
838
|
"""@brief Close the boolean dialog."""
|
838
839
|
self._dialog.close()
|
840
|
+
|
841
|
+
class local_file_picker(ui.dialog):
|
842
|
+
"""@brief Allows the user to select local files and folders.
|
843
|
+
This is is a slight change on https://github.com/zauberzeug/nicegui/blob/main/examples/local_file_picker/local_file_picker.py"""
|
844
|
+
|
845
|
+
def __init__(self,
|
846
|
+
directory: str,
|
847
|
+
*,
|
848
|
+
upper_limit: str = None,
|
849
|
+
multiple: bool = False,
|
850
|
+
show_hidden_files: bool = False) -> None:
|
851
|
+
"""Local File Picker
|
852
|
+
|
853
|
+
This is a simple file picker that allows you to select a file from the local filesystem where NiceGUI is running.
|
854
|
+
|
855
|
+
:param directory: The directory to start in.
|
856
|
+
:param upper_limit: The directory to stop at (None: no limit, default: same as the starting directory).
|
857
|
+
:param multiple: Whether to allow multiple files to be selected.
|
858
|
+
:param show_hidden_files: Whether to show hidden files.
|
859
|
+
"""
|
860
|
+
super().__init__()
|
861
|
+
|
862
|
+
self.path = Path(directory).expanduser()
|
863
|
+
if upper_limit is None:
|
864
|
+
self.upper_limit = None
|
865
|
+
else:
|
866
|
+
self.upper_limit = Path(directory if upper_limit == ... else upper_limit).expanduser()
|
867
|
+
self.show_hidden_files = show_hidden_files
|
868
|
+
|
869
|
+
with self, ui.card():
|
870
|
+
self.add_drives_toggle()
|
871
|
+
self.grid = ui.aggrid({
|
872
|
+
'columnDefs': [{'field': 'name', 'headerName': 'File'}],
|
873
|
+
'rowSelection': 'multiple' if multiple else 'single',
|
874
|
+
}, html_columns=[0]).classes('w-96').classes('h-96').on('cellDoubleClicked', self.handle_double_click)
|
875
|
+
with ui.row().classes('w-full justify-end'):
|
876
|
+
self._select_folder_checkbox = ui.switch('Select Folder')
|
877
|
+
#self._select_folder_checkbox = ui.checkbox('Folder')
|
878
|
+
self._select_folder_checkbox.tooltip("Select this if you wish to select a folder.")
|
879
|
+
ui.button('Cancel', on_click=self.close).props('outline')
|
880
|
+
|
881
|
+
self.update_grid()
|
882
|
+
|
883
|
+
def add_drives_toggle(self):
|
884
|
+
if platform.system() == 'Windows':
|
885
|
+
import win32api
|
886
|
+
drives = win32api.GetLogicalDriveStrings().split('\000')[:-1]
|
887
|
+
self.drives_toggle = ui.toggle(drives, value=drives[0], on_change=self.update_drive)
|
888
|
+
|
889
|
+
def update_drive(self):
|
890
|
+
self.path = Path(self.drives_toggle.value).expanduser()
|
891
|
+
self.update_grid()
|
892
|
+
|
893
|
+
def update_grid(self) -> None:
|
894
|
+
paths = list(self.path.glob('*'))
|
895
|
+
if not self.show_hidden_files:
|
896
|
+
paths = [p for p in paths if not p.name.startswith('.')]
|
897
|
+
paths.sort(key=lambda p: p.name.lower())
|
898
|
+
paths.sort(key=lambda p: not p.is_dir())
|
899
|
+
|
900
|
+
self.grid.options['rowData'] = [
|
901
|
+
{
|
902
|
+
'name': f'📁 <strong>{p.name}</strong>' if p.is_dir() else p.name,
|
903
|
+
'path': str(p),
|
904
|
+
}
|
905
|
+
for p in paths
|
906
|
+
]
|
907
|
+
if (self.upper_limit is None and self.path != self.path.parent) or \
|
908
|
+
(self.upper_limit is not None and self.path != self.upper_limit):
|
909
|
+
self.grid.options['rowData'].insert(0, {
|
910
|
+
'name': '📁 <strong>..</strong>',
|
911
|
+
'path': str(self.path.parent),
|
912
|
+
})
|
913
|
+
self.grid.update()
|
914
|
+
|
915
|
+
def handle_double_click(self, e) -> None:
|
916
|
+
self.path = Path(e.args['data']['path'])
|
917
|
+
if self.path.is_dir() and not self._select_folder_checkbox.value:
|
918
|
+
self.update_grid()
|
919
|
+
else:
|
920
|
+
self.submit([str(self.path)])
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: p3lib
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.117
|
4
4
|
Summary: A group of python modules for networking, plotting data, config storage, automating boot scripts, ssh access and user input output.
|
5
5
|
Home-page: https://github.com/pjaos/p3lib
|
6
6
|
License: MIT
|
@@ -7,18 +7,18 @@ p3lib/conduit.py,sha256=jPkjdtyCx2I6SFqcEo8y2g7rgnZ-jNY7oCuYIETzT5Q,6046
|
|
7
7
|
p3lib/database_if.py,sha256=XKu1w3zftGbj4Rh54wrWJnoCtqHkhCzJUPN2S70XIKg,11915
|
8
8
|
p3lib/file_io.py,sha256=A7_GKYPlmjRjq6U1YuWhmB0OhLhNm6cWQfQX8qfgYTk,5041
|
9
9
|
p3lib/gnome_desktop_app.py,sha256=zl9SKRBV8ipVg2faCs_gbAr8c42J1N_pntbFGG2BMiE,6694
|
10
|
-
p3lib/helper.py,sha256=
|
10
|
+
p3lib/helper.py,sha256=QfMe1T1SjJgbssp5Q0XPYZWzv2Pgd4YA5OdzJrtQXYI,17608
|
11
11
|
p3lib/json_networking.py,sha256=6u4s1SmypjTYPnSxHP712OgQ3ZJaxOqIkgHQ1J7Qews,9738
|
12
12
|
p3lib/login.html,sha256=DADTJGuvWQ-LTO4X6SaFdqK7JMW03DAa3lRieGD0d6g,2748
|
13
13
|
p3lib/mqtt_rpc.py,sha256=6LmFA1kR4HSJs9eWbOJORRHNY01L_lHWjvtE2fmY8P8,10511
|
14
14
|
p3lib/netif.py,sha256=3QV5OGdHhELIf4MBj6mx5MNCtVeZ7JXoNEkeu4KzCaE,9796
|
15
15
|
p3lib/netplotly.py,sha256=PMDx-w1jtRVW6Od5u_kuKbBxNpTS_Y88mMF60puMxLM,9363
|
16
|
-
p3lib/ngt.py,sha256=
|
16
|
+
p3lib/ngt.py,sha256=uvoqzzmhggC7CGgMYwm6Ax8u0VWKoaIJYIfwbQ49aFk,42419
|
17
17
|
p3lib/pconfig.py,sha256=wGC6UJAIBksRjwKTfaw3Y6vAMkgey0QC2nhkCtqj1MQ,37738
|
18
18
|
p3lib/ssh.py,sha256=OyoAQ_h1L2RfkjTAChDrvLFfl4Fe_gBNdX5rvK-wKiw,42125
|
19
19
|
p3lib/table_plot.py,sha256=RPncwVlGUkkx5Fw0dHQedXo0TSPlTi__VrJBDzaMsuI,32116
|
20
20
|
p3lib/uio.py,sha256=Aaxc99XiE3d2f9vLjaN-bZsckoNxay5t0ujdK6PXGrw,23265
|
21
|
-
p3lib-1.1.
|
22
|
-
p3lib-1.1.
|
23
|
-
p3lib-1.1.
|
24
|
-
p3lib-1.1.
|
21
|
+
p3lib-1.1.117.dist-info/LICENSE,sha256=igqTy5u0kVWM1n-NUZMvAlinY6lVjAXKoag0okkS8V8,1067
|
22
|
+
p3lib-1.1.117.dist-info/METADATA,sha256=0B8heHrhVVYJ_SrV47bVskPzw5b80FFbOeiQcVJ_PLk,1319
|
23
|
+
p3lib-1.1.117.dist-info/WHEEL,sha256=IrRNNNJ-uuL1ggO5qMvT1GGhQVdQU54d6ZpYqEZfEWo,92
|
24
|
+
p3lib-1.1.117.dist-info/RECORD,,
|
File without changes
|
File without changes
|