datalab-platform 0.0.1.dev0__py3-none-any.whl → 1.0.1__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.
- datalab/__init__.py +35 -2
- datalab/adapters_metadata/__init__.py +31 -0
- datalab/adapters_metadata/base_adapter.py +316 -0
- datalab/adapters_metadata/common.py +422 -0
- datalab/adapters_metadata/geometry_adapter.py +98 -0
- datalab/adapters_metadata/table_adapter.py +84 -0
- datalab/adapters_plotpy/__init__.py +54 -0
- datalab/adapters_plotpy/annotations.py +124 -0
- datalab/adapters_plotpy/base.py +110 -0
- datalab/adapters_plotpy/converters.py +86 -0
- datalab/adapters_plotpy/factories.py +80 -0
- datalab/adapters_plotpy/objects/__init__.py +0 -0
- datalab/adapters_plotpy/objects/base.py +197 -0
- datalab/adapters_plotpy/objects/image.py +157 -0
- datalab/adapters_plotpy/objects/scalar.py +565 -0
- datalab/adapters_plotpy/objects/signal.py +264 -0
- datalab/adapters_plotpy/roi/__init__.py +0 -0
- datalab/adapters_plotpy/roi/base.py +146 -0
- datalab/adapters_plotpy/roi/factory.py +93 -0
- datalab/adapters_plotpy/roi/image.py +207 -0
- datalab/adapters_plotpy/roi/signal.py +72 -0
- datalab/app.py +98 -0
- datalab/config.py +817 -0
- datalab/control/__init__.py +0 -0
- datalab/control/baseproxy.py +776 -0
- datalab/control/proxy.py +343 -0
- datalab/control/remote.py +1005 -0
- datalab/data/doc/DataLab_en.pdf +0 -0
- datalab/data/doc/DataLab_fr.pdf +0 -0
- datalab/data/icons/analysis/delete_results.svg +109 -0
- datalab/data/icons/analysis/fw1e2.svg +156 -0
- datalab/data/icons/analysis/fwhm.svg +156 -0
- datalab/data/icons/analysis/histogram.svg +49 -0
- datalab/data/icons/analysis/peak_detect.svg +160 -0
- datalab/data/icons/analysis/plot_results.svg +151 -0
- datalab/data/icons/analysis/show_results.svg +83 -0
- datalab/data/icons/analysis/stats.svg +49 -0
- datalab/data/icons/analysis.svg +120 -0
- datalab/data/icons/apply.svg +3 -0
- datalab/data/icons/check_all.svg +15 -0
- datalab/data/icons/collapse.svg +44 -0
- datalab/data/icons/collapse_selection.svg +63 -0
- datalab/data/icons/console.svg +101 -0
- datalab/data/icons/create/1d-normal.svg +8 -0
- datalab/data/icons/create/1d-poisson.svg +9 -0
- datalab/data/icons/create/1d-uniform.svg +8 -0
- datalab/data/icons/create/1d-zero.svg +57 -0
- datalab/data/icons/create/2d-gaussian.svg +56 -0
- datalab/data/icons/create/2d-normal.svg +38 -0
- datalab/data/icons/create/2d-poisson.svg +38 -0
- datalab/data/icons/create/2d-ramp.svg +90 -0
- datalab/data/icons/create/2d-sinc.svg +62 -0
- datalab/data/icons/create/2d-uniform.svg +38 -0
- datalab/data/icons/create/2d-zero.svg +13 -0
- datalab/data/icons/create/checkerboard.svg +39 -0
- datalab/data/icons/create/cosine.svg +12 -0
- datalab/data/icons/create/exponential.svg +55 -0
- datalab/data/icons/create/gaussian.svg +12 -0
- datalab/data/icons/create/grating.svg +29 -0
- datalab/data/icons/create/linear_chirp.svg +7 -0
- datalab/data/icons/create/logistic.svg +7 -0
- datalab/data/icons/create/lorentzian.svg +12 -0
- datalab/data/icons/create/planck.svg +12 -0
- datalab/data/icons/create/polynomial.svg +7 -0
- datalab/data/icons/create/pulse.svg +12 -0
- datalab/data/icons/create/ring.svg +18 -0
- datalab/data/icons/create/sawtooth.svg +7 -0
- datalab/data/icons/create/siemens.svg +35 -0
- datalab/data/icons/create/sinc.svg +12 -0
- datalab/data/icons/create/sine.svg +7 -0
- datalab/data/icons/create/square.svg +7 -0
- datalab/data/icons/create/square_pulse.svg +7 -0
- datalab/data/icons/create/step.svg +7 -0
- datalab/data/icons/create/step_pulse.svg +12 -0
- datalab/data/icons/create/triangle.svg +7 -0
- datalab/data/icons/create/voigt.svg +12 -0
- datalab/data/icons/edit/annotations.svg +72 -0
- datalab/data/icons/edit/annotations_copy.svg +114 -0
- datalab/data/icons/edit/annotations_delete.svg +83 -0
- datalab/data/icons/edit/annotations_edit.svg +98 -0
- datalab/data/icons/edit/annotations_export.svg +85 -0
- datalab/data/icons/edit/annotations_import.svg +85 -0
- datalab/data/icons/edit/annotations_paste.svg +100 -0
- datalab/data/icons/edit/copy_titles.svg +109 -0
- datalab/data/icons/edit/delete.svg +84 -0
- datalab/data/icons/edit/delete_all.svg +214 -0
- datalab/data/icons/edit/duplicate.svg +64 -0
- datalab/data/icons/edit/goto_source.svg +60 -0
- datalab/data/icons/edit/metadata.svg +60 -0
- datalab/data/icons/edit/metadata_add.svg +80 -0
- datalab/data/icons/edit/metadata_copy.svg +96 -0
- datalab/data/icons/edit/metadata_delete.svg +62 -0
- datalab/data/icons/edit/metadata_export.svg +68 -0
- datalab/data/icons/edit/metadata_import.svg +68 -0
- datalab/data/icons/edit/metadata_paste.svg +79 -0
- datalab/data/icons/edit/move_down.svg +55 -0
- datalab/data/icons/edit/move_up.svg +54 -0
- datalab/data/icons/edit/new_group.svg +76 -0
- datalab/data/icons/edit/recompute.svg +60 -0
- datalab/data/icons/edit/rename.svg +49 -0
- datalab/data/icons/edit.svg +16 -0
- datalab/data/icons/expand.svg +44 -0
- datalab/data/icons/expand_selection.svg +63 -0
- datalab/data/icons/fit/cdf_fit.svg +56 -0
- datalab/data/icons/fit/exponential_fit.svg +55 -0
- datalab/data/icons/fit/gaussian_fit.svg +62 -0
- datalab/data/icons/fit/interactive_fit.svg +101 -0
- datalab/data/icons/fit/linear_fit.svg +57 -0
- datalab/data/icons/fit/lorentzian_fit.svg +209 -0
- datalab/data/icons/fit/multigaussian_fit.svg +85 -0
- datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
- datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
- datalab/data/icons/fit/planckian_fit.svg +62 -0
- datalab/data/icons/fit/polynomial_fit.svg +59 -0
- datalab/data/icons/fit/sigmoid_fit.svg +56 -0
- datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
- datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
- datalab/data/icons/fit/voigt_fit.svg +57 -0
- datalab/data/icons/group.svg +56 -0
- datalab/data/icons/h5/h5array.svg +59 -0
- datalab/data/icons/h5/h5attrs.svg +75 -0
- datalab/data/icons/h5/h5browser.svg +133 -0
- datalab/data/icons/h5/h5file.svg +69 -0
- datalab/data/icons/h5/h5group.svg +49 -0
- datalab/data/icons/h5/h5scalar.svg +1 -0
- datalab/data/icons/help_pdf.svg +46 -0
- datalab/data/icons/history.svg +7 -0
- datalab/data/icons/image.svg +135 -0
- datalab/data/icons/io/fileopen_directory.svg +60 -0
- datalab/data/icons/io/fileopen_h5.svg +84 -0
- datalab/data/icons/io/fileopen_ima.svg +187 -0
- datalab/data/icons/io/fileopen_py.svg +123 -0
- datalab/data/icons/io/fileopen_sig.svg +138 -0
- datalab/data/icons/io/filesave_h5.svg +97 -0
- datalab/data/icons/io/filesave_ima.svg +200 -0
- datalab/data/icons/io/filesave_py.svg +136 -0
- datalab/data/icons/io/filesave_sig.svg +151 -0
- datalab/data/icons/io/import_text.svg +144 -0
- datalab/data/icons/io/save_to_directory.svg +134 -0
- datalab/data/icons/io.svg +84 -0
- datalab/data/icons/libre-camera-flash-off.svg +1 -0
- datalab/data/icons/libre-camera-flash-on.svg +1 -0
- datalab/data/icons/libre-gui-about.svg +1 -0
- datalab/data/icons/libre-gui-action-delete.svg +1 -0
- datalab/data/icons/libre-gui-add.svg +1 -0
- datalab/data/icons/libre-gui-arrow-down.svg +1 -0
- datalab/data/icons/libre-gui-arrow-left.svg +1 -0
- datalab/data/icons/libre-gui-arrow-right.svg +1 -0
- datalab/data/icons/libre-gui-arrow-up.svg +1 -0
- datalab/data/icons/libre-gui-close.svg +40 -0
- datalab/data/icons/libre-gui-cogs.svg +1 -0
- datalab/data/icons/libre-gui-globe.svg +1 -0
- datalab/data/icons/libre-gui-help.svg +1 -0
- datalab/data/icons/libre-gui-link.svg +1 -0
- datalab/data/icons/libre-gui-menu.svg +1 -0
- datalab/data/icons/libre-gui-pencil.svg +1 -0
- datalab/data/icons/libre-gui-plugin.svg +1 -0
- datalab/data/icons/libre-gui-questions.svg +1 -0
- datalab/data/icons/libre-gui-settings.svg +1 -0
- datalab/data/icons/libre-gui-unlink.svg +1 -0
- datalab/data/icons/libre-tech-ram.svg +1 -0
- datalab/data/icons/libre-toolbox.svg +1 -0
- datalab/data/icons/logs.svg +1 -0
- datalab/data/icons/markers.svg +74 -0
- datalab/data/icons/menu.svg +13 -0
- datalab/data/icons/new_ima.svg +148 -0
- datalab/data/icons/new_sig.svg +123 -0
- datalab/data/icons/operations/abs.svg +116 -0
- datalab/data/icons/operations/arithmetic.svg +123 -0
- datalab/data/icons/operations/average.svg +124 -0
- datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
- datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
- datalab/data/icons/operations/constant.svg +116 -0
- datalab/data/icons/operations/constant_add.svg +109 -0
- datalab/data/icons/operations/constant_divide.svg +109 -0
- datalab/data/icons/operations/constant_multiply.svg +109 -0
- datalab/data/icons/operations/constant_subtract.svg +109 -0
- datalab/data/icons/operations/convert_dtype.svg +117 -0
- datalab/data/icons/operations/convolution.svg +46 -0
- datalab/data/icons/operations/deconvolution.svg +57 -0
- datalab/data/icons/operations/derivative.svg +127 -0
- datalab/data/icons/operations/difference.svg +52 -0
- datalab/data/icons/operations/division.svg +139 -0
- datalab/data/icons/operations/exp.svg +116 -0
- datalab/data/icons/operations/flip_horizontally.svg +69 -0
- datalab/data/icons/operations/flip_vertically.svg +74 -0
- datalab/data/icons/operations/im.svg +124 -0
- datalab/data/icons/operations/integral.svg +50 -0
- datalab/data/icons/operations/inverse.svg +143 -0
- datalab/data/icons/operations/log10.svg +109 -0
- datalab/data/icons/operations/phase.svg +116 -0
- datalab/data/icons/operations/power.svg +118 -0
- datalab/data/icons/operations/product.svg +124 -0
- datalab/data/icons/operations/profile.svg +379 -0
- datalab/data/icons/operations/profile_average.svg +399 -0
- datalab/data/icons/operations/profile_radial.svg +261 -0
- datalab/data/icons/operations/profile_segment.svg +262 -0
- datalab/data/icons/operations/quadratic_difference.svg +84 -0
- datalab/data/icons/operations/re.svg +124 -0
- datalab/data/icons/operations/rotate_left.svg +72 -0
- datalab/data/icons/operations/rotate_right.svg +72 -0
- datalab/data/icons/operations/signals_to_image.svg +314 -0
- datalab/data/icons/operations/sqrt.svg +110 -0
- datalab/data/icons/operations/std.svg +124 -0
- datalab/data/icons/operations/sum.svg +102 -0
- datalab/data/icons/play_demo.svg +9 -0
- datalab/data/icons/processing/axis_transform.svg +62 -0
- datalab/data/icons/processing/bandpass.svg +79 -0
- datalab/data/icons/processing/bandstop.svg +71 -0
- datalab/data/icons/processing/binning.svg +126 -0
- datalab/data/icons/processing/clip.svg +119 -0
- datalab/data/icons/processing/detrending.svg +173 -0
- datalab/data/icons/processing/distribute_on_grid.svg +769 -0
- datalab/data/icons/processing/edge_detection.svg +46 -0
- datalab/data/icons/processing/erase.svg +1 -0
- datalab/data/icons/processing/exposure.svg +143 -0
- datalab/data/icons/processing/fourier.svg +104 -0
- datalab/data/icons/processing/highpass.svg +59 -0
- datalab/data/icons/processing/interpolation.svg +71 -0
- datalab/data/icons/processing/level_adjustment.svg +70 -0
- datalab/data/icons/processing/lowpass.svg +60 -0
- datalab/data/icons/processing/morphology.svg +49 -0
- datalab/data/icons/processing/noise_addition.svg +114 -0
- datalab/data/icons/processing/noise_reduction.svg +38 -0
- datalab/data/icons/processing/normalize.svg +84 -0
- datalab/data/icons/processing/offset_correction.svg +131 -0
- datalab/data/icons/processing/resampling1d.svg +101 -0
- datalab/data/icons/processing/resampling2d.svg +240 -0
- datalab/data/icons/processing/reset_positions.svg +185 -0
- datalab/data/icons/processing/resize.svg +9 -0
- datalab/data/icons/processing/reverse_signal_x.svg +171 -0
- datalab/data/icons/processing/stability.svg +11 -0
- datalab/data/icons/processing/swap_x_y.svg +65 -0
- datalab/data/icons/processing/thresholding.svg +63 -0
- datalab/data/icons/processing/windowing.svg +45 -0
- datalab/data/icons/properties.svg +26 -0
- datalab/data/icons/reset.svg +9 -0
- datalab/data/icons/restore.svg +40 -0
- datalab/data/icons/roi/roi.svg +76 -0
- datalab/data/icons/roi/roi_coordinate.svg +78 -0
- datalab/data/icons/roi/roi_copy.svg +112 -0
- datalab/data/icons/roi/roi_delete.svg +81 -0
- datalab/data/icons/roi/roi_export.svg +87 -0
- datalab/data/icons/roi/roi_graphical.svg +78 -0
- datalab/data/icons/roi/roi_grid.svg +67 -0
- datalab/data/icons/roi/roi_ima.svg +188 -0
- datalab/data/icons/roi/roi_import.svg +87 -0
- datalab/data/icons/roi/roi_new.svg +81 -0
- datalab/data/icons/roi/roi_new_circle.svg +95 -0
- datalab/data/icons/roi/roi_new_polygon.svg +110 -0
- datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
- datalab/data/icons/roi/roi_paste.svg +98 -0
- datalab/data/icons/roi/roi_sig.svg +124 -0
- datalab/data/icons/shapes.svg +134 -0
- datalab/data/icons/signal.svg +103 -0
- datalab/data/icons/table.svg +85 -0
- datalab/data/icons/table_unavailable.svg +102 -0
- datalab/data/icons/to_signal.svg +124 -0
- datalab/data/icons/tour/next.svg +44 -0
- datalab/data/icons/tour/previous.svg +44 -0
- datalab/data/icons/tour/rewind.svg +51 -0
- datalab/data/icons/tour/stop.svg +47 -0
- datalab/data/icons/tour/tour.svg +16 -0
- datalab/data/icons/uncheck_all.svg +78 -0
- datalab/data/icons/view/curve_antialiasing.svg +50 -0
- datalab/data/icons/view/new_window.svg +98 -0
- datalab/data/icons/view/refresh-auto.svg +57 -0
- datalab/data/icons/view/refresh-manual.svg +51 -0
- datalab/data/icons/view/reset_curve_styles.svg +96 -0
- datalab/data/icons/view/show_first.svg +55 -0
- datalab/data/icons/view/show_titles.svg +46 -0
- datalab/data/icons/visualization.svg +51 -0
- datalab/data/logo/DataLab-Banner-150.png +0 -0
- datalab/data/logo/DataLab-Banner-200.png +0 -0
- datalab/data/logo/DataLab-Banner2-100.png +0 -0
- datalab/data/logo/DataLab-Splash.png +0 -0
- datalab/data/logo/DataLab-watermark.png +0 -0
- datalab/data/logo/DataLab.svg +83 -0
- datalab/data/tests/reordering_test.h5 +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
- datalab/env.py +542 -0
- datalab/gui/__init__.py +89 -0
- datalab/gui/actionhandler.py +1701 -0
- datalab/gui/docks.py +473 -0
- datalab/gui/h5io.py +150 -0
- datalab/gui/macroeditor.py +310 -0
- datalab/gui/main.py +2081 -0
- datalab/gui/newobject.py +217 -0
- datalab/gui/objectview.py +766 -0
- datalab/gui/panel/__init__.py +48 -0
- datalab/gui/panel/base.py +3254 -0
- datalab/gui/panel/image.py +157 -0
- datalab/gui/panel/macro.py +607 -0
- datalab/gui/panel/signal.py +164 -0
- datalab/gui/plothandler.py +800 -0
- datalab/gui/processor/__init__.py +84 -0
- datalab/gui/processor/base.py +2456 -0
- datalab/gui/processor/catcher.py +75 -0
- datalab/gui/processor/image.py +1214 -0
- datalab/gui/processor/signal.py +755 -0
- datalab/gui/profiledialog.py +333 -0
- datalab/gui/roieditor.py +633 -0
- datalab/gui/roigrideditor.py +208 -0
- datalab/gui/settings.py +612 -0
- datalab/gui/tour.py +908 -0
- datalab/h5/__init__.py +12 -0
- datalab/h5/common.py +314 -0
- datalab/h5/generic.py +580 -0
- datalab/h5/native.py +39 -0
- datalab/h5/utils.py +95 -0
- datalab/objectmodel.py +640 -0
- datalab/plugins/_readme_.txt +9 -0
- datalab/plugins/datalab_imageformats.py +175 -0
- datalab/plugins/datalab_testdata.py +190 -0
- datalab/plugins.py +355 -0
- datalab/tests/__init__.py +199 -0
- datalab/tests/backbone/__init__.py +1 -0
- datalab/tests/backbone/config_unit_test.py +170 -0
- datalab/tests/backbone/config_versioning_unit_test.py +34 -0
- datalab/tests/backbone/dictlistserial_app_test.py +38 -0
- datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
- datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
- datalab/tests/backbone/execenv_unit.py +262 -0
- datalab/tests/backbone/loadtest_gdi.py +147 -0
- datalab/tests/backbone/long_callback.py +96 -0
- datalab/tests/backbone/main_app_test.py +137 -0
- datalab/tests/backbone/memory_leak.py +43 -0
- datalab/tests/backbone/procisolation1_unit.py +128 -0
- datalab/tests/backbone/procisolation2_unit.py +171 -0
- datalab/tests/backbone/procisolation_unit_test.py +22 -0
- datalab/tests/backbone/profiling_app.py +27 -0
- datalab/tests/backbone/strings_unit_test.py +65 -0
- datalab/tests/backbone/title_formatting_unit_test.py +82 -0
- datalab/tests/conftest.py +131 -0
- datalab/tests/features/__init__.py +1 -0
- datalab/tests/features/applauncher/__init__.py +1 -0
- datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
- datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
- datalab/tests/features/common/__init__.py +1 -0
- datalab/tests/features/common/add_metadata_app_test.py +134 -0
- datalab/tests/features/common/add_metadata_unit_test.py +267 -0
- datalab/tests/features/common/annotations_management_unit_test.py +152 -0
- datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
- datalab/tests/features/common/createobject_unit_test.py +50 -0
- datalab/tests/features/common/geometry_results_app_test.py +135 -0
- datalab/tests/features/common/interactive_processing_test.py +1109 -0
- datalab/tests/features/common/io_app_test.py +75 -0
- datalab/tests/features/common/large_results_app_test.py +187 -0
- datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
- datalab/tests/features/common/metadata_app_test.py +139 -0
- datalab/tests/features/common/metadata_io_unit_test.py +60 -0
- datalab/tests/features/common/misc_app_test.py +236 -0
- datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
- datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
- datalab/tests/features/common/operation_modes_app_test.py +392 -0
- datalab/tests/features/common/plot_results_app_test.py +278 -0
- datalab/tests/features/common/reorder_app_test.py +75 -0
- datalab/tests/features/common/result_deletion_unit_test.py +96 -0
- datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
- datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
- datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
- datalab/tests/features/common/roieditor_unit_test.py +102 -0
- datalab/tests/features/common/save_to_dir_app_test.py +163 -0
- datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
- datalab/tests/features/common/stat_app_test.py +40 -0
- datalab/tests/features/common/stats_tools_unit_test.py +77 -0
- datalab/tests/features/common/table_results_app_test.py +52 -0
- datalab/tests/features/common/textimport_unit_test.py +131 -0
- datalab/tests/features/common/uuid_preservation_test.py +281 -0
- datalab/tests/features/common/worker_unit_test.py +402 -0
- datalab/tests/features/control/__init__.py +1 -0
- datalab/tests/features/control/connect_dialog.py +28 -0
- datalab/tests/features/control/embedded1_unit_test.py +304 -0
- datalab/tests/features/control/embedded2_unit_test.py +52 -0
- datalab/tests/features/control/remoteclient_app_test.py +219 -0
- datalab/tests/features/control/remoteclient_unit.py +75 -0
- datalab/tests/features/control/simpleclient_unit_test.py +321 -0
- datalab/tests/features/hdf5/__init__.py +1 -0
- datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
- datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
- datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
- datalab/tests/features/hdf5/h5import_app_test.py +25 -0
- datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
- datalab/tests/features/image/__init__.py +1 -0
- datalab/tests/features/image/annotations_app_test.py +28 -0
- datalab/tests/features/image/annotations_unit_test.py +80 -0
- datalab/tests/features/image/average_app_test.py +46 -0
- datalab/tests/features/image/background_dialog_test.py +70 -0
- datalab/tests/features/image/blobs_app_test.py +50 -0
- datalab/tests/features/image/contour_app_test.py +42 -0
- datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
- datalab/tests/features/image/denoise_app_test.py +31 -0
- datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
- datalab/tests/features/image/edges_app_test.py +31 -0
- datalab/tests/features/image/erase_app_test.py +21 -0
- datalab/tests/features/image/fft2d_app_test.py +27 -0
- datalab/tests/features/image/flatfield_app_test.py +40 -0
- datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
- datalab/tests/features/image/imagetools_app_test.py +51 -0
- datalab/tests/features/image/imagetools_unit_test.py +27 -0
- datalab/tests/features/image/load_app_test.py +73 -0
- datalab/tests/features/image/morph_app_test.py +32 -0
- datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
- datalab/tests/features/image/peak2d_app_test.py +53 -0
- datalab/tests/features/image/profile_app_test.py +73 -0
- datalab/tests/features/image/profile_dialog_test.py +56 -0
- datalab/tests/features/image/roi_app_test.py +98 -0
- datalab/tests/features/image/roi_circ_app_test.py +62 -0
- datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
- datalab/tests/features/image/roigrid_unit_test.py +60 -0
- datalab/tests/features/image/side_by_side_app_test.py +52 -0
- datalab/tests/features/macro/__init__.py +1 -0
- datalab/tests/features/macro/macro_app_test.py +28 -0
- datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
- datalab/tests/features/signal/__init__.py +1 -0
- datalab/tests/features/signal/baseline_dialog_test.py +53 -0
- datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
- datalab/tests/features/signal/fft1d_app_test.py +26 -0
- datalab/tests/features/signal/filter_app_test.py +44 -0
- datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
- datalab/tests/features/signal/interpolation_app_test.py +110 -0
- datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
- datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
- datalab/tests/features/signal/pulse_features_app_test.py +118 -0
- datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
- datalab/tests/features/signal/roi_app_test.py +78 -0
- datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
- datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
- datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
- datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
- datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
- datalab/tests/features/tour_unit_test.py +22 -0
- datalab/tests/features/utilities/__init__.py +1 -0
- datalab/tests/features/utilities/installconf_unit_test.py +21 -0
- datalab/tests/features/utilities/logview_app_test.py +21 -0
- datalab/tests/features/utilities/logview_error.py +24 -0
- datalab/tests/features/utilities/logview_unit_test.py +21 -0
- datalab/tests/features/utilities/memstatus_app_test.py +42 -0
- datalab/tests/features/utilities/settings_unit_test.py +88 -0
- datalab/tests/scenarios/__init__.py +1 -0
- datalab/tests/scenarios/beautiful_app.py +121 -0
- datalab/tests/scenarios/common.py +463 -0
- datalab/tests/scenarios/demo.py +212 -0
- datalab/tests/scenarios/example_app_test.py +47 -0
- datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
- datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
- datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
- datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
- datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
- datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
- datalab/utils/__init__.py +1 -0
- datalab/utils/conf.py +304 -0
- datalab/utils/dephash.py +105 -0
- datalab/utils/qthelpers.py +633 -0
- datalab/utils/strings.py +34 -0
- datalab/utils/tests.py +0 -0
- datalab/widgets/__init__.py +1 -0
- datalab/widgets/connection.py +138 -0
- datalab/widgets/filedialog.py +91 -0
- datalab/widgets/fileviewer.py +84 -0
- datalab/widgets/fitdialog.py +788 -0
- datalab/widgets/h5browser.py +1048 -0
- datalab/widgets/imagebackground.py +111 -0
- datalab/widgets/instconfviewer.py +175 -0
- datalab/widgets/logviewer.py +80 -0
- datalab/widgets/signalbaseline.py +90 -0
- datalab/widgets/signalcursor.py +208 -0
- datalab/widgets/signaldeltax.py +151 -0
- datalab/widgets/signalpeak.py +199 -0
- datalab/widgets/status.py +249 -0
- datalab/widgets/textimport.py +786 -0
- datalab/widgets/warningerror.py +223 -0
- datalab/widgets/wizard.py +286 -0
- datalab_platform-1.0.1.dist-info/METADATA +121 -0
- datalab_platform-1.0.1.dist-info/RECORD +494 -0
- datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
- datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/WHEEL +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/entry_points.txt +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Module providing a connection dialog box for the DataLab proxy client
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import time
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
|
|
12
|
+
from guidata.configtools import get_icon, get_image_file_path
|
|
13
|
+
from guidata.qthelpers import (
|
|
14
|
+
get_std_icon,
|
|
15
|
+
qt_app_context,
|
|
16
|
+
win32_fix_title_bar_background,
|
|
17
|
+
)
|
|
18
|
+
from qtpy import QtCore as QC
|
|
19
|
+
from qtpy import QtGui as QG
|
|
20
|
+
from qtpy import QtWidgets as QW
|
|
21
|
+
|
|
22
|
+
from datalab.config import _
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ConnectionThread(QC.QThread):
|
|
26
|
+
"""DataLab Connection thread"""
|
|
27
|
+
|
|
28
|
+
SIG_CONNECTION_OK = QC.Signal()
|
|
29
|
+
SIG_CONNECTION_KO = QC.Signal(str)
|
|
30
|
+
|
|
31
|
+
def __init__(self, connect_callback: Callable, parent: QC.QObject = None) -> None:
|
|
32
|
+
super().__init__(parent)
|
|
33
|
+
self.connect_callback = connect_callback
|
|
34
|
+
|
|
35
|
+
def run(self) -> None:
|
|
36
|
+
"""Run thread"""
|
|
37
|
+
try:
|
|
38
|
+
self.connect_callback()
|
|
39
|
+
self.SIG_CONNECTION_OK.emit()
|
|
40
|
+
except ConnectionRefusedError as exc:
|
|
41
|
+
self.SIG_CONNECTION_KO.emit(str(exc))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ConnectionDialog(QW.QDialog):
|
|
45
|
+
"""DataLab Connection dialog
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
connect_callback: Callback function to connect to DataLab server
|
|
49
|
+
parent: Parent widget. Defaults to None.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, connect_callback: Callable, parent: QW.QWidget = None) -> None:
|
|
53
|
+
super().__init__(parent)
|
|
54
|
+
win32_fix_title_bar_background(self)
|
|
55
|
+
self.setWindowTitle(_("Connection to DataLab"))
|
|
56
|
+
self.setWindowIcon(get_icon("DataLab.svg"))
|
|
57
|
+
self.resize(300, 50)
|
|
58
|
+
self.__error_message = ""
|
|
59
|
+
self.host_label = QW.QLabel()
|
|
60
|
+
pixmap = QG.QPixmap(get_image_file_path("DataLab-Banner-200.png"))
|
|
61
|
+
self.host_label.setPixmap(pixmap)
|
|
62
|
+
self.host_label.setAlignment(QC.Qt.AlignCenter)
|
|
63
|
+
self.progress_bar = QW.QProgressBar()
|
|
64
|
+
self.progress_bar.setRange(0, 0)
|
|
65
|
+
status = QW.QWidget()
|
|
66
|
+
status_layout = QW.QHBoxLayout()
|
|
67
|
+
status.setLayout(status_layout)
|
|
68
|
+
self.status_label = QW.QLabel("Waiting for connection...")
|
|
69
|
+
self.status_icon = QW.QLabel()
|
|
70
|
+
status_layout.addWidget(self.status_icon)
|
|
71
|
+
status_layout.addWidget(self.status_label)
|
|
72
|
+
status_layout.setContentsMargins(0, 0, 0, 0)
|
|
73
|
+
status_layout.addStretch()
|
|
74
|
+
layout = QW.QVBoxLayout()
|
|
75
|
+
layout.addWidget(self.host_label)
|
|
76
|
+
layout.addWidget(self.progress_bar)
|
|
77
|
+
layout.addWidget(status)
|
|
78
|
+
self.setLayout(layout)
|
|
79
|
+
self.thread = ConnectionThread(connect_callback)
|
|
80
|
+
self.thread.SIG_CONNECTION_OK.connect(self.__on_connection_successful)
|
|
81
|
+
self.thread.SIG_CONNECTION_KO.connect(self.__on_connection_failed)
|
|
82
|
+
button_box = QW.QDialogButtonBox(QW.QDialogButtonBox.Cancel)
|
|
83
|
+
button_box.rejected.connect(self.reject)
|
|
84
|
+
layout.addWidget(button_box)
|
|
85
|
+
|
|
86
|
+
def __set_status_icon(self, name: str) -> None:
|
|
87
|
+
"""Set status icon with standard Qt icon name"""
|
|
88
|
+
self.status_icon.setPixmap(QG.QPixmap(get_std_icon(name).pixmap(24)))
|
|
89
|
+
|
|
90
|
+
def __connect_to_server(self) -> None:
|
|
91
|
+
"""Connect to server"""
|
|
92
|
+
self.progress_bar.setRange(0, 0)
|
|
93
|
+
self.__set_status_icon("BrowserReload")
|
|
94
|
+
self.status_label.setText("Connecting to server...")
|
|
95
|
+
self.thread.start()
|
|
96
|
+
|
|
97
|
+
def __on_connection_successful(self) -> None:
|
|
98
|
+
"""Connection successful"""
|
|
99
|
+
self.progress_bar.setRange(0, 1)
|
|
100
|
+
self.progress_bar.setValue(1)
|
|
101
|
+
self.__set_status_icon("DialogApplyButton")
|
|
102
|
+
self.status_label.setText("Connection successful!")
|
|
103
|
+
QC.QTimer.singleShot(1000, self.accept)
|
|
104
|
+
|
|
105
|
+
def __on_connection_failed(self, error_message: str) -> None:
|
|
106
|
+
"""Connection failed"""
|
|
107
|
+
self.__error_message = error_message
|
|
108
|
+
self.progress_bar.setRange(0, 1)
|
|
109
|
+
self.progress_bar.setValue(1)
|
|
110
|
+
self.__set_status_icon("MessageBoxCritical")
|
|
111
|
+
self.status_label.setText(f"Connection failed: {error_message}")
|
|
112
|
+
QC.QTimer.singleShot(2000, self.reject)
|
|
113
|
+
|
|
114
|
+
def get_error_message(self) -> str:
|
|
115
|
+
"""Get error message if connection failed"""
|
|
116
|
+
return self.__error_message
|
|
117
|
+
|
|
118
|
+
def exec(self) -> int:
|
|
119
|
+
"""Execute dialog"""
|
|
120
|
+
self.__connect_to_server()
|
|
121
|
+
return super().exec()
|
|
122
|
+
|
|
123
|
+
def reject(self) -> None:
|
|
124
|
+
"""Reject dialog"""
|
|
125
|
+
super().reject()
|
|
126
|
+
self.__error_message = "Cancelled by user"
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
|
|
131
|
+
def fake_connect():
|
|
132
|
+
"""Fake connection"""
|
|
133
|
+
time.sleep(5)
|
|
134
|
+
# raise ConnectionRefusedError("Connection refused")
|
|
135
|
+
|
|
136
|
+
with qt_app_context():
|
|
137
|
+
dlg = ConnectionDialog(fake_connect)
|
|
138
|
+
dlg.exec()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Module providing a file dialog widget based on Qt's QFileDialog.getOpenFileNames
|
|
5
|
+
but supporting multiple file preselection (Qt original dialog only supports single file
|
|
6
|
+
selection).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import os.path as osp
|
|
13
|
+
|
|
14
|
+
from guidata.qthelpers import qt_app_context
|
|
15
|
+
from qtpy.QtCore import QItemSelectionModel
|
|
16
|
+
from qtpy.QtWidgets import QAbstractItemView, QFileDialog, QListView, QWidget
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_open_file_names(
|
|
20
|
+
parent: QWidget | None = None,
|
|
21
|
+
caption: str = "",
|
|
22
|
+
basedir: str | list[str] = "",
|
|
23
|
+
filters: str = "",
|
|
24
|
+
selectedfilter: str = "",
|
|
25
|
+
options: QFileDialog.Options = None,
|
|
26
|
+
) -> tuple[list[str], str]:
|
|
27
|
+
"""Wrapper around QtGui.QFileDialog.getOpenFileNames static method
|
|
28
|
+
Returns a tuple (filenames, selectedfilter) -- when dialog box is canceled,
|
|
29
|
+
returns a tuple (empty list, empty string)
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
parent: Parent widget for the dialog.
|
|
33
|
+
caption: Dialog title.
|
|
34
|
+
basedir: Initial directory to open the dialog in, or preselected files
|
|
35
|
+
(single string or list of strings).
|
|
36
|
+
filters: File filters for the dialog.
|
|
37
|
+
selectedfilter: Default filter to be selected.
|
|
38
|
+
options: Additional options for the dialog.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A tuple containing a list of selected filenames and the selected filter.
|
|
42
|
+
"""
|
|
43
|
+
if isinstance(basedir, str):
|
|
44
|
+
if osp.isfile(basedir):
|
|
45
|
+
sel_files = [basedir]
|
|
46
|
+
basedir = osp.dirname(basedir)
|
|
47
|
+
else:
|
|
48
|
+
sel_files = []
|
|
49
|
+
else:
|
|
50
|
+
assert isinstance(basedir, list)
|
|
51
|
+
sel_files = basedir
|
|
52
|
+
basedir = osp.dirname(sel_files[0]) if sel_files else ""
|
|
53
|
+
dlg = QFileDialog(
|
|
54
|
+
parent, caption, basedir, filters, options=QFileDialog.DontUseNativeDialog
|
|
55
|
+
)
|
|
56
|
+
if options is not None:
|
|
57
|
+
dlg.setOptions(options | QFileDialog.DontUseNativeDialog)
|
|
58
|
+
file_view = dlg.findChild(QListView, "listView")
|
|
59
|
+
sel_model = file_view.selectionModel()
|
|
60
|
+
for fname in sel_files:
|
|
61
|
+
idx = sel_model.model().index(fname)
|
|
62
|
+
sel_model.select(idx, QItemSelectionModel.Select | QItemSelectionModel.Rows)
|
|
63
|
+
file_view.setSelectionMode(QAbstractItemView.ExtendedSelection)
|
|
64
|
+
file_view.setSelectionBehavior(QAbstractItemView.SelectRows)
|
|
65
|
+
if dlg.exec():
|
|
66
|
+
filenames = dlg.selectedFiles()
|
|
67
|
+
selectedfilter = dlg.selectedNameFilter()
|
|
68
|
+
else:
|
|
69
|
+
filenames = []
|
|
70
|
+
selectedfilter = ""
|
|
71
|
+
return filenames, selectedfilter
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_get_open_file_names():
|
|
75
|
+
"""Test get_open_file_names function"""
|
|
76
|
+
datalab_widgets_path = osp.dirname(__file__)
|
|
77
|
+
sel_files = [
|
|
78
|
+
osp.join(datalab_widgets_path, fname)
|
|
79
|
+
for fname in os.listdir(datalab_widgets_path)[:2]
|
|
80
|
+
]
|
|
81
|
+
with qt_app_context():
|
|
82
|
+
filenames, selectedfilter = get_open_file_names(
|
|
83
|
+
filters="Python files (*.py);;All files (*)",
|
|
84
|
+
caption="Select Python files",
|
|
85
|
+
basedir=sel_files,
|
|
86
|
+
)
|
|
87
|
+
print(filenames, selectedfilter)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
test_get_open_file_names()
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Module providing a file viewer widget
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from guidata.widgets.codeeditor import CodeEditor
|
|
12
|
+
from qtpy import QtWidgets as QW
|
|
13
|
+
|
|
14
|
+
from datalab.config import _
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def read_text_file(path: str) -> str:
|
|
18
|
+
"""Read text file using multiple encodings
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
path (str): path to file
|
|
22
|
+
|
|
23
|
+
Raises:
|
|
24
|
+
UnicodeDecodeError: if unable to read file using any of the encodings
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
str: file contents
|
|
28
|
+
"""
|
|
29
|
+
encodings = ["utf-8", "latin1", "cp1252", "utf-16", "utf-32", "ascii"]
|
|
30
|
+
for encoding in encodings:
|
|
31
|
+
try:
|
|
32
|
+
with open(path, "r", encoding=encoding) as fdesc:
|
|
33
|
+
return fdesc.read()
|
|
34
|
+
except UnicodeDecodeError:
|
|
35
|
+
pass
|
|
36
|
+
raise UnicodeDecodeError(
|
|
37
|
+
f"Unable to read file using the following encodings: {encodings}"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_title_contents(path: str) -> tuple[str, str]:
|
|
42
|
+
"""Get title and contents for log filename
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
path (str): path to file
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
tuple[str, str]: title and contents
|
|
49
|
+
"""
|
|
50
|
+
contents = read_text_file(path)
|
|
51
|
+
pathobj = Path(path)
|
|
52
|
+
uri_path = pathobj.absolute().as_uri()
|
|
53
|
+
prefix = _("Contents of file")
|
|
54
|
+
text = f'{prefix} <a href="{uri_path}">{path}</a>:'
|
|
55
|
+
return text, contents
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class FileViewerWidget(QW.QWidget):
|
|
59
|
+
"""File viewer widget
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
parent (QW.QWidget | None): parent widget. Defaults to None.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
def __init__(self, language: str | None = None, parent: QW.QWidget = None) -> None:
|
|
66
|
+
super().__init__(parent)
|
|
67
|
+
self.editor = CodeEditor(language=language)
|
|
68
|
+
self.editor.setReadOnly(True)
|
|
69
|
+
layout = QW.QVBoxLayout()
|
|
70
|
+
self.label = QW.QLabel("")
|
|
71
|
+
layout.addWidget(self.label)
|
|
72
|
+
layout.addWidget(self.editor)
|
|
73
|
+
self.setLayout(layout)
|
|
74
|
+
|
|
75
|
+
def set_data(self, text: str, contents: str) -> None:
|
|
76
|
+
"""Set log data
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
text (str): text to display
|
|
80
|
+
contents (str): contents to display
|
|
81
|
+
"""
|
|
82
|
+
self.label.setText(text)
|
|
83
|
+
self.label.setOpenExternalLinks(True)
|
|
84
|
+
self.editor.setPlainText(contents)
|