gratinglab 0.2.4__tar.gz → 0.2.5__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.
- {gratinglab-0.2.4/src/gratinglab.egg-info → gratinglab-0.2.5}/PKG-INFO +1 -1
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/__init__.py +1 -1
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/theming.py +10 -1
- gratinglab-0.2.5/src/gratinglab/metrology/gui/qt/layout.py +95 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5/src/gratinglab.egg-info}/PKG-INFO +1 -1
- gratinglab-0.2.4/src/gratinglab/metrology/gui/qt/layout.py +0 -46
- {gratinglab-0.2.4 → gratinglab-0.2.5}/LICENSE +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/README.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/pyproject.toml +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/setup.cfg +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/checks.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/compare.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/convergence.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/geometry.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/app.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/cmethod_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/diagram.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/diagram3d.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/docs.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/efficiency_plot.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/icon.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/integral_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/launcher.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/mathtext.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/orders.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/provenance.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/cmethod_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/integral_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/launcher.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/main_window.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/rcwa_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/setup_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/sizing.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/qt/worker.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/rcwa_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/richtext.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/scalar_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/state.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/gui/theme.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/illumination.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/io/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/io/boundary.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/io/efficiency_table.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/io/ggp.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/materials/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/materials/data/SOURCES.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/materials/fresnel.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/materials/optical.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/materials/refractiveindex.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/measured.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/analyzer.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/boundary/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/boundary/average.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/boundary/swaths.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/cli.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/config.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/analysis.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/image_flatten.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/orientation.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/processing.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/region_mask.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/scars.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/core/tip.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/data/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/data/aggregation.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/icon.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/app.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/boundary_view.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/swath_dialog.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/gui/state.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/io/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/io/file_io.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/io/ibw.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/io/metrics.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/io/spm.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/settings.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/stats/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/stats/analysis.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/stats/icc.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/visualization/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/visualization/profiles.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/visualization/statistics.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/facet-fitting.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/file-formats.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/flattening.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/groove-orientation.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/overview.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/reading-outputs.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/row-groups.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/scars-and-masking.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/metrology/workflows.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/problem.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/profiles.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/resolution.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/result.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/_conditioning.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/_execution.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/base.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/cmethod/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/cmethod/_core.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/cmethod/_series.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_boundary.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_core.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_finite.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_greens.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_kernels.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/rcwa/__init__.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/rcwa/_core.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/rcwa/_stack.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab/solvers/scalar.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab.egg-info/SOURCES.txt +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab.egg-info/dependency_links.txt +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab.egg-info/entry_points.txt +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab.egg-info/requires.txt +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/src/gratinglab.egg-info/top_level.txt +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_changelog.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_checks.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_cmethod.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_compare.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_conditioning.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_convergence.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_cross_method.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_efficiency_table.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_fresnel.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_geometry.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_ggp.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_cmethod_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_cmethod_tab.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_diagram.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_diagram3d.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_docs.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_integral_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_launcher.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_mathtext.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_orders.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_provenance.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_qt.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_rcwa_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_richtext.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_scalar_options.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_state.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_gui_theme.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_illumination.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_core.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_corpus.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_finite.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_graded.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_greens.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_kernels.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_operators.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_integral_solver.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_io_boundary.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_materials.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_measured.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_perturbation.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_profiles.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_rayleigh_anomaly.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_rcwa.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_rcwa_benchmarks.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_refractiveindex.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_resolution.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_result.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_scalar.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_solver_conformance.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_solver_execution.py +0 -0
- {gratinglab-0.2.4 → gratinglab-0.2.5}/tests/test_solver_progress.py +0 -0
|
@@ -22,7 +22,7 @@ from .measured import MeasuredEfficiency, MeasurementProvenance
|
|
|
22
22
|
from .resolution import ResolvingPower, resolving_power
|
|
23
23
|
from .result import EfficiencyScan, OrderEfficiency, Provenance
|
|
24
24
|
|
|
25
|
-
__version__ = "0.2.
|
|
25
|
+
__version__ = "0.2.5"
|
|
26
26
|
|
|
27
27
|
__all__ = [
|
|
28
28
|
"Illumination",
|
|
@@ -36,6 +36,7 @@ __all__ = [
|
|
|
36
36
|
"current",
|
|
37
37
|
"install",
|
|
38
38
|
"manager",
|
|
39
|
+
"settings",
|
|
39
40
|
"subscribe",
|
|
40
41
|
"swatch",
|
|
41
42
|
]
|
|
@@ -47,13 +48,21 @@ _KEY = "appearance/theme"
|
|
|
47
48
|
_PROPERTY = "_gratinglab_theme_manager"
|
|
48
49
|
|
|
49
50
|
|
|
50
|
-
def
|
|
51
|
+
def settings() -> QSettings:
|
|
52
|
+
"""The application's settings store, or the INI file ``GRATINGLAB_SETTINGS`` names.
|
|
53
|
+
|
|
54
|
+
Shared by everything the windows remember (the theme, the AFM column
|
|
55
|
+
width), so the test suite's redirect covers all of it at once.
|
|
56
|
+
"""
|
|
51
57
|
path = os.environ.get(SETTINGS_ENV)
|
|
52
58
|
if path:
|
|
53
59
|
return QSettings(path, QSettings.Format.IniFormat)
|
|
54
60
|
return QSettings("gratinglab", "gratinglab")
|
|
55
61
|
|
|
56
62
|
|
|
63
|
+
_settings = settings
|
|
64
|
+
|
|
65
|
+
|
|
57
66
|
def palette(theme: Theme) -> QPalette:
|
|
58
67
|
"""A ``QPalette`` for ``theme``, with disabled text dimmed to its muted colour."""
|
|
59
68
|
role = QPalette.ColorRole
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The controls-and-plot layout every AFM tab shares.
|
|
3
|
+
|
|
4
|
+
Each tab was a fixed 272 px column of controls in a 292 px scroll area beside
|
|
5
|
+
its plot, so long labels were crammed and nothing could be widened. A splitter
|
|
6
|
+
replaces that: the column starts wide enough for its contents, cannot be
|
|
7
|
+
dragged narrower than its widest control needs, and gives the plot every pixel
|
|
8
|
+
the window gains.
|
|
9
|
+
|
|
10
|
+
The width is one setting, not one per tab. Dragging the column in any tab
|
|
11
|
+
moves it in the others, so switching tabs never makes the plot jump, and the
|
|
12
|
+
width is saved as it is dragged, so the window opens at it next time. It is
|
|
13
|
+
kept in the same store as the theme (``theming.settings``), which the test
|
|
14
|
+
suite redirects to a scratch file.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import weakref
|
|
19
|
+
|
|
20
|
+
from . import * # noqa: F401,F403 - sets QT_API before matplotlib's shim loads
|
|
21
|
+
|
|
22
|
+
from PySide6.QtCore import Qt
|
|
23
|
+
from PySide6.QtWidgets import QFrame, QScrollArea, QSplitter, QWidget
|
|
24
|
+
|
|
25
|
+
from gratinglab.gui.qt.theming import settings
|
|
26
|
+
|
|
27
|
+
__all__ = ["controls_beside", "MIN_CONTROLS_WIDTH", "START_CONTROLS_WIDTH",
|
|
28
|
+
"WIDTH_KEY"]
|
|
29
|
+
|
|
30
|
+
#: Narrower than this and the group boxes' labels start to wrap mid-word.
|
|
31
|
+
MIN_CONTROLS_WIDTH = 260
|
|
32
|
+
#: Where the column starts, unless its contents ask for more.
|
|
33
|
+
START_CONTROLS_WIDTH = 320
|
|
34
|
+
#: Where the chosen width is remembered.
|
|
35
|
+
WIDTH_KEY = "afm/controls_width"
|
|
36
|
+
|
|
37
|
+
# Every live splitter, so a drag in one tab can move the others. Weak, so a
|
|
38
|
+
# closed window's splitters drop out on their own.
|
|
39
|
+
_SPLITTERS: "weakref.WeakSet[QSplitter]" = weakref.WeakSet()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _saved_width() -> int | None:
|
|
43
|
+
value = settings().value(WIDTH_KEY)
|
|
44
|
+
try:
|
|
45
|
+
return int(value) if value is not None else None
|
|
46
|
+
except (TypeError, ValueError):
|
|
47
|
+
return None # a hand-edited or corrupt value: fall back to the default
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _follow(source: QSplitter) -> None:
|
|
51
|
+
"""Remember ``source``'s column width and give it to every other tab."""
|
|
52
|
+
width = source.sizes()[0]
|
|
53
|
+
store = settings()
|
|
54
|
+
store.setValue(WIDTH_KEY, width)
|
|
55
|
+
store.sync()
|
|
56
|
+
for other in list(_SPLITTERS):
|
|
57
|
+
if other is source:
|
|
58
|
+
continue
|
|
59
|
+
try:
|
|
60
|
+
total = sum(other.sizes())
|
|
61
|
+
other.blockSignals(True)
|
|
62
|
+
other.setSizes([width, max(1, total - width)])
|
|
63
|
+
other.blockSignals(False)
|
|
64
|
+
except RuntimeError:
|
|
65
|
+
# Its window was closed and Qt has deleted it, while the Python
|
|
66
|
+
# wrapper waits for collection.
|
|
67
|
+
_SPLITTERS.discard(other)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def controls_beside(controls: QWidget, plot: QWidget) -> QSplitter:
|
|
71
|
+
"""A splitter holding the scrolling ``controls`` column and the ``plot``."""
|
|
72
|
+
scroll = QScrollArea()
|
|
73
|
+
scroll.setWidget(controls)
|
|
74
|
+
scroll.setWidgetResizable(True)
|
|
75
|
+
scroll.setFrameShape(QFrame.NoFrame)
|
|
76
|
+
# Width is the splitter's to decide; only the height should ever scroll.
|
|
77
|
+
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
78
|
+
|
|
79
|
+
gutter = scroll.verticalScrollBar().sizeHint().width()
|
|
80
|
+
floor = max(MIN_CONTROLS_WIDTH, controls.minimumSizeHint().width() + gutter)
|
|
81
|
+
scroll.setMinimumWidth(floor)
|
|
82
|
+
|
|
83
|
+
splitter = QSplitter(Qt.Horizontal)
|
|
84
|
+
splitter.setChildrenCollapsible(False)
|
|
85
|
+
splitter.addWidget(scroll)
|
|
86
|
+
splitter.addWidget(plot)
|
|
87
|
+
splitter.setStretchFactor(0, 0)
|
|
88
|
+
splitter.setStretchFactor(1, 1)
|
|
89
|
+
# A remembered width wins, but never below what this tab's controls need.
|
|
90
|
+
start = max(_saved_width() or START_CONTROLS_WIDTH, floor)
|
|
91
|
+
splitter.setSizes([start, max(1, 4 * start)])
|
|
92
|
+
|
|
93
|
+
_SPLITTERS.add(splitter)
|
|
94
|
+
splitter.splitterMoved.connect(lambda *_: _follow(splitter))
|
|
95
|
+
return splitter
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The controls-and-plot layout every AFM tab shares.
|
|
3
|
-
|
|
4
|
-
Each tab was a fixed 272 px column of controls in a 292 px scroll area beside
|
|
5
|
-
its plot, so long labels were crammed and nothing could be widened. A splitter
|
|
6
|
-
replaces that: the column starts wide enough for its contents, cannot be
|
|
7
|
-
dragged narrower than its widest control needs, and gives the plot every pixel
|
|
8
|
-
the window gains.
|
|
9
|
-
"""
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
from . import * # noqa: F401,F403 - sets QT_API before matplotlib's shim loads
|
|
13
|
-
|
|
14
|
-
from PySide6.QtCore import Qt
|
|
15
|
-
from PySide6.QtWidgets import QFrame, QScrollArea, QSplitter, QWidget
|
|
16
|
-
|
|
17
|
-
__all__ = ["controls_beside", "MIN_CONTROLS_WIDTH", "START_CONTROLS_WIDTH"]
|
|
18
|
-
|
|
19
|
-
#: Narrower than this and the group boxes' labels start to wrap mid-word.
|
|
20
|
-
MIN_CONTROLS_WIDTH = 260
|
|
21
|
-
#: Where the column starts, unless its contents ask for more.
|
|
22
|
-
START_CONTROLS_WIDTH = 320
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def controls_beside(controls: QWidget, plot: QWidget) -> QSplitter:
|
|
26
|
-
"""A splitter holding the scrolling ``controls`` column and the ``plot``."""
|
|
27
|
-
scroll = QScrollArea()
|
|
28
|
-
scroll.setWidget(controls)
|
|
29
|
-
scroll.setWidgetResizable(True)
|
|
30
|
-
scroll.setFrameShape(QFrame.NoFrame)
|
|
31
|
-
# Width is the splitter's to decide; only the height should ever scroll.
|
|
32
|
-
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
33
|
-
|
|
34
|
-
gutter = scroll.verticalScrollBar().sizeHint().width()
|
|
35
|
-
floor = max(MIN_CONTROLS_WIDTH, controls.minimumSizeHint().width() + gutter)
|
|
36
|
-
scroll.setMinimumWidth(floor)
|
|
37
|
-
|
|
38
|
-
splitter = QSplitter(Qt.Horizontal)
|
|
39
|
-
splitter.setChildrenCollapsible(False)
|
|
40
|
-
splitter.addWidget(scroll)
|
|
41
|
-
splitter.addWidget(plot)
|
|
42
|
-
splitter.setStretchFactor(0, 0)
|
|
43
|
-
splitter.setStretchFactor(1, 1)
|
|
44
|
-
start = max(START_CONTROLS_WIDTH, floor)
|
|
45
|
-
splitter.setSizes([start, max(1, 4 * start)])
|
|
46
|
-
return splitter
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|