qplotter 1.6.0b3__tar.gz → 1.6.1__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.
Files changed (379) hide show
  1. {qplotter-1.6.0b3 → qplotter-1.6.1}/CHANGELOG.md +96 -4
  2. {qplotter-1.6.0b3 → qplotter-1.6.1}/CONTRIBUTING.md +1 -1
  3. {qplotter-1.6.0b3 → qplotter-1.6.1}/MANIFEST.in +1 -0
  4. {qplotter-1.6.0b3 → qplotter-1.6.1}/PKG-INFO +21 -12
  5. {qplotter-1.6.0b3 → qplotter-1.6.1}/README.md +18 -9
  6. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/architecture.md +10 -2
  7. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/distribution.md +54 -15
  8. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/trusted-live-reader.md +18 -2
  9. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/user-guide.md +40 -13
  10. {qplotter-1.6.0b3 → qplotter-1.6.1}/pyproject.toml +8 -3
  11. qplotter-1.6.1/scripts/revalidate_published_release.py +81 -0
  12. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/validate_compiler_free_install.py +14 -2
  13. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/validate_distribution.py +16 -1
  14. qplotter-1.6.1/scripts/write_build_info.py +32 -0
  15. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/__main__.py +2 -1
  16. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/_auxiliary_paths.py +4 -0
  17. qplotter-1.6.1/src/qplot/_build_info.json +1 -0
  18. qplotter-1.6.1/src/qplot/_metadata.py +75 -0
  19. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/config.py +7 -2
  20. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/config_schema.json +38 -0
  21. qplotter-1.6.1/src/qplot/configuration/fonts.py +3 -0
  22. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/themes/_base.py +18 -5
  23. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/database.py +10 -0
  24. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/readonly.py +5 -0
  25. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_array_preview.py +30 -9
  26. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_derived_rendering.py +28 -20
  27. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_heatmap.py +11 -6
  28. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_live.py +1 -1
  29. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_live_service.py +26 -1
  30. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_plot.py +21 -6
  31. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/testdata.py +83 -12
  32. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/finite_means.py +12 -3
  33. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/general.py +7 -2
  34. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/heatmap_geometry.py +16 -6
  35. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/plot_tools.py +39 -14
  36. qplotter-1.6.1/src/qplot/tools/sample_statistics.py +111 -0
  37. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/worker.py +78 -27
  38. qplotter-1.6.1/src/qplot/windows/_auto_plot.py +201 -0
  39. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_commands.py +14 -14
  40. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_database_actions.py +39 -9
  41. qplotter-1.6.1/src/qplot/windows/_display_precision.py +48 -0
  42. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_dragdrop.py +4 -5
  43. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_help.py +43 -2
  44. qplotter-1.6.1/src/qplot/windows/_mixed_appearance.py +303 -0
  45. qplotter-1.6.1/src/qplot/windows/_mixed_plots.py +461 -0
  46. qplotter-1.6.1/src/qplot/windows/_native_averaging.py +323 -0
  47. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_native_transforms.py +173 -11
  48. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot1d_snap.py +7 -3
  49. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot1d_traces.py +74 -21
  50. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot2d_colorbar.py +5 -4
  51. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot2d_layers.py +144 -50
  52. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plotWin.py +123 -34
  53. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_actions.py +83 -73
  54. qplotter-1.6.1/src/qplot/windows/_plot_annotation.py +186 -0
  55. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_appearance.py +9 -2
  56. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_axis_scaling.py +53 -17
  57. qplotter-1.6.1/src/qplot/windows/_plot_data_viewbox.py +94 -0
  58. qplotter-1.6.1/src/qplot/windows/_plot_drop_axes.py +224 -0
  59. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_feedback.py +8 -6
  60. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_marquee.py +4 -1
  61. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_refresh.py +13 -5
  62. qplotter-1.6.1/src/qplot/windows/_plot_source_promotion.py +178 -0
  63. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_state.py +21 -23
  64. qplotter-1.6.1/src/qplot/windows/_plot_status.py +115 -0
  65. qplotter-1.6.1/src/qplot/windows/_plot_tiling.py +35 -0
  66. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_preferences.py +89 -0
  67. qplotter-1.6.1/src/qplot/windows/_refresh_interval.py +172 -0
  68. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_run_controls.py +8 -49
  69. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_subplots/subplot1d.py +19 -18
  70. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_subplots/subplot2d.py +2 -1
  71. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_trusted_derived_qt.py +4 -0
  72. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_window_controls.py +1 -0
  73. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/main.py +4 -5
  74. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/plot1d.py +5 -3
  75. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/plot2d.py +50 -16
  76. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplotter.egg-info/SOURCES.txt +53 -0
  77. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/_window_lifecycle.py +33 -1
  78. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_derived_rendering.py +1 -2
  79. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live.py +4 -0
  80. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_partial_frames.py +3 -1
  81. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_worker_integration.py +3 -0
  82. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_plot.py +36 -0
  83. qplotter-1.6.1/tests/datahandling/test_trusted_wal_contention.py +214 -0
  84. qplotter-1.6.1/tests/test_bug_hunt_array_bin_ranges.py +31 -0
  85. qplotter-1.6.1/tests/test_bug_hunt_auxiliary_safety.py +81 -0
  86. qplotter-1.6.1/tests/test_bug_hunt_average_view_updates.py +91 -0
  87. qplotter-1.6.1/tests/test_bug_hunt_bounded_mixed_means.py +125 -0
  88. qplotter-1.6.1/tests/test_bug_hunt_config.py +91 -0
  89. qplotter-1.6.1/tests/test_bug_hunt_constant_auto_recovery.py +69 -0
  90. qplotter-1.6.1/tests/test_bug_hunt_database_refresh.py +151 -0
  91. qplotter-1.6.1/tests/test_bug_hunt_derivative_cancellation.py +64 -0
  92. qplotter-1.6.1/tests/test_bug_hunt_duplicate_mean_cancellation.py +90 -0
  93. qplotter-1.6.1/tests/test_bug_hunt_fill_cancellation.py +96 -0
  94. qplotter-1.6.1/tests/test_bug_hunt_float_average_performance.py +130 -0
  95. qplotter-1.6.1/tests/test_bug_hunt_generator_fifo.py +96 -0
  96. qplotter-1.6.1/tests/test_bug_hunt_generator_safety.py +112 -0
  97. qplotter-1.6.1/tests/test_bug_hunt_heatmap_display_ranges.py +213 -0
  98. qplotter-1.6.1/tests/test_bug_hunt_integer_mean_cancellation.py +90 -0
  99. qplotter-1.6.1/tests/test_bug_hunt_line_display_ranges.py +242 -0
  100. qplotter-1.6.1/tests/test_bug_hunt_longdouble_samples.py +151 -0
  101. qplotter-1.6.1/tests/test_bug_hunt_marquee_statistics_performance.py +104 -0
  102. qplotter-1.6.1/tests/test_bug_hunt_measurement_generator.py +45 -0
  103. qplotter-1.6.1/tests/test_bug_hunt_measurement_lines.py +106 -0
  104. qplotter-1.6.1/tests/test_bug_hunt_measurement_previews.py +175 -0
  105. qplotter-1.6.1/tests/test_bug_hunt_mixed_average_performance.py +72 -0
  106. qplotter-1.6.1/tests/test_bug_hunt_native_averaging.py +85 -0
  107. qplotter-1.6.1/tests/test_bug_hunt_object_scan_cancellation.py +98 -0
  108. qplotter-1.6.1/tests/test_bug_hunt_shaped_coordinate_ranges.py +46 -0
  109. qplotter-1.6.1/tests/test_bug_hunt_snapshot_fifo.py +67 -0
  110. qplotter-1.6.1/tests/test_bug_hunt_tiny_heatmap_bins.py +64 -0
  111. qplotter-1.6.1/tests/test_bug_hunt_ui_cuts.py +73 -0
  112. qplotter-1.6.1/tests/test_bug_hunt_ui_display_precision.py +92 -0
  113. qplotter-1.6.1/tests/test_bug_hunt_ui_refresh.py +43 -0
  114. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_ci_artifacts.py +12 -0
  115. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_compiler_free_install.py +16 -1
  116. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_config.py +1 -1
  117. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_distribution_validator.py +24 -3
  118. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_packaging_split.py +1 -1
  119. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_release.py +71 -6
  120. qplotter-1.6.1/tests/test_version_info.py +101 -0
  121. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_array_measurements.py +2 -0
  122. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_boolean_heatmap_missing.py +2 -0
  123. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_operations.py +3 -3
  124. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_preview_dragdrop.py +8 -8
  125. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_appearance_swap_cuts.py +21 -0
  126. qplotter-1.6.1/tests/windows/test_auto_plot.py +203 -0
  127. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_axis_auto_padding_overflow.py +16 -4
  128. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_axis_global_auto_validation.py +4 -3
  129. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_bounded_shutdown.py +3 -1
  130. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_centering_extremes.py +12 -2
  131. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_commands.py +2 -2
  132. qplotter-1.6.1/tests/windows/test_cursor_precision_preference.py +136 -0
  133. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_derivative_scale.py +12 -1
  134. qplotter-1.6.1/tests/windows/test_font_preferences.py +140 -0
  135. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_heatmap_color_range.py +1 -1
  136. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_heatmap_limit_missing_samples.py +43 -0
  137. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_help_menu.py +80 -1
  138. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_independent_cancellation_mean.py +15 -7
  139. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_independent_native_extremes.py +18 -2
  140. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_limit_integer_integration.py +23 -6
  141. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_main_window.py +6 -4
  142. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_marquee_statistics_accuracy.py +13 -0
  143. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_merged_trace_metadata.py +10 -0
  144. qplotter-1.6.1/tests/windows/test_mixed_plot_drops.py +904 -0
  145. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_fft_coordinates.py +8 -8
  146. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_fft_dynamic_range.py +7 -1
  147. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_fft_float_precision.py +22 -7
  148. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_integer_transforms.py +31 -5
  149. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_transform_snapping.py +8 -7
  150. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_numeric_sample_preservation.py +3 -2
  151. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_numerical_stability.py +12 -3
  152. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot1d.py +14 -5
  153. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot1d_snap_precision.py +2 -2
  154. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot2d.py +14 -12
  155. qplotter-1.6.1/tests/windows/test_plot_annotation.py +113 -0
  156. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_dialog_lifecycle.py +31 -4
  157. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_integration.py +10 -11
  158. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_overlay_integration.py +9 -8
  159. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_progress_ui.py +102 -9
  160. qplotter-1.6.1/tests/windows/test_plot_tiling.py +88 -0
  161. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_window.py +4 -3
  162. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_preferences.py +7 -0
  163. qplotter-1.6.1/tests/windows/test_preview_drop_axes.py +395 -0
  164. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_refresh_lifecycle.py +28 -5
  165. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_testdata_gui.py +73 -2
  166. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_plot_launch.py +237 -1
  167. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_variable_array_records.py +19 -3
  168. qplotter-1.6.0b3/src/qplot/_metadata.py +0 -12
  169. qplotter-1.6.0b3/src/qplot/tools/sample_statistics.py +0 -56
  170. qplotter-1.6.0b3/src/qplot/windows/_native_averaging.py +0 -173
  171. qplotter-1.6.0b3/src/qplot/windows/_refresh_interval.py +0 -70
  172. {qplotter-1.6.0b3 → qplotter-1.6.1}/Agents.md +0 -0
  173. {qplotter-1.6.0b3 → qplotter-1.6.1}/LICENSE +0 -0
  174. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/assets/qplot-color-scale-dialog.png +0 -0
  175. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/assets/qplot-heatmap.png +0 -0
  176. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/assets/qplot-line-plot.png +0 -0
  177. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/assets/qplot-main-window.png +0 -0
  178. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/configuration.md +0 -0
  179. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/demo-data.md +0 -0
  180. {qplotter-1.6.0b3 → qplotter-1.6.1}/docs/troubleshooting.md +0 -0
  181. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/README.md +0 -0
  182. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/benchmark_heatmap_aggregation.py +0 -0
  183. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/benchmark_plot_launch.py +0 -0
  184. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/capture_demo_screenshots.py +0 -0
  185. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/liveplot.py +0 -0
  186. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/manual_run.py +0 -0
  187. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/profile_trusted_reads.py +0 -0
  188. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/release.py +0 -0
  189. {qplotter-1.6.0b3 → qplotter-1.6.1}/scripts/time_stress.py +0 -0
  190. {qplotter-1.6.0b3 → qplotter-1.6.1}/setup.cfg +0 -0
  191. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/__init__.py +0 -0
  192. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/_repair.py +0 -0
  193. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/_shutdown_supervisor.py +0 -0
  194. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/_version.py +0 -0
  195. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/_windows_shutdown_job.py +0 -0
  196. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/__init__.py +0 -0
  197. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/scripts.py +0 -0
  198. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/themes/__init__.py +0 -0
  199. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/themes/blank.py +0 -0
  200. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/themes/dark.py +0 -0
  201. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/configuration/themes/light.py +0 -0
  202. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/LoadFromDB.py +0 -0
  203. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/__init__.py +0 -0
  204. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/_trusted_live_helper.py +0 -0
  205. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/_trusted_live_protocol.py +0 -0
  206. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/dimensions.py +0 -0
  207. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/file_identity.py +0 -0
  208. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/parameter_data.py +0 -0
  209. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/plot_progress.py +0 -0
  210. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/qcodes_cache.py +0 -0
  211. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/qcodes_compat.py +0 -0
  212. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/readSQL.py +0 -0
  213. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/source_activity.py +0 -0
  214. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_derived_cache.py +0 -0
  215. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_live_queries.py +0 -0
  216. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_live_supervisor.py +0 -0
  217. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_presentation.py +0 -0
  218. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_snapshot.py +0 -0
  219. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_work_coordinator.py +0 -0
  220. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/datahandling/trusted_work_scheduler.py +0 -0
  221. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/diagnostics.py +0 -0
  222. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_01_10mb.csv +0 -0
  223. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_02_25mb.csv +0 -0
  224. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_03_50mb.csv +0 -0
  225. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_04_100mb.csv +0 -0
  226. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_05_250mb.csv +0 -0
  227. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_06_500mb.csv +0 -0
  228. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_07_1gb.csv +0 -0
  229. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_08_5gb.csv +0 -0
  230. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_09_10gb.csv +0 -0
  231. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/resources/testdata/qplot_test_db_10_30gb.csv +0 -0
  232. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/__init__.py +0 -0
  233. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/tools/operation_registry.py +0 -0
  234. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/__init__.py +0 -0
  235. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_colorbar.py +0 -0
  236. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_config_persistence.py +0 -0
  237. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_dataset_handle.py +0 -0
  238. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_export_paths.py +0 -0
  239. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot2d_colorbar_dialog.py +0 -0
  240. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot2d_sweeps.py +0 -0
  241. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_export.py +0 -0
  242. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_plot_transform_labels.py +0 -0
  243. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_shortcuts.py +0 -0
  244. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_subplots/__init__.py +0 -0
  245. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_svg_export.py +0 -0
  246. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/__init__.py +0 -0
  247. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/_run_formatting.py +0 -0
  248. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/details_tables.py +0 -0
  249. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/dropbox.py +0 -0
  250. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/operations.py +0 -0
  251. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/preview.py +0 -0
  252. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/run_list_items.py +0 -0
  253. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/toolbar.py +0 -0
  254. {qplotter-1.6.0b3 → qplotter-1.6.1}/src/qplot/windows/_widgets/treeWidgets.py +0 -0
  255. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/_artifact_audit.py +0 -0
  256. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/_ci_scheduling.py +0 -0
  257. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/conftest.py +0 -0
  258. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/_wal_lineage_scenarios.py +0 -0
  259. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_array_record_metadata.py +0 -0
  260. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_database_worker_instance_binding.py +0 -0
  261. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_dimensions.py +0 -0
  262. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_inferred_planned_counts.py +0 -0
  263. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_integer_record_cache.py +0 -0
  264. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_live_acquired_point_counts.py +0 -0
  265. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_plot_progress.py +0 -0
  266. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_qcodes_cache.py +0 -0
  267. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_read_sql.py +0 -0
  268. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_read_sql_database_identity.py +0 -0
  269. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_readonly.py +0 -0
  270. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_snapshot_planned_setpoints.py +0 -0
  271. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_stage5c_real_qcodes.py +0 -0
  272. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_array_preview.py +0 -0
  273. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_array_record_metadata.py +0 -0
  274. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_database_information.py +0 -0
  275. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_derived_cache.py +0 -0
  276. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_derived_cache_ownership.py +0 -0
  277. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_derived_live_integration.py +0 -0
  278. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_derived_queries.py +0 -0
  279. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_heatmap.py +0 -0
  280. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_protocol.py +0 -0
  281. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_queries.py +0 -0
  282. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_result_limits.py +0 -0
  283. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_service.py +0 -0
  284. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_stage4_integration.py +0 -0
  285. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_live_supervisor.py +0 -0
  286. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_presentation.py +0 -0
  287. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_read_scope.py +0 -0
  288. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_snapshot.py +0 -0
  289. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_source_identifiers.py +0 -0
  290. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_work_coordinator.py +0 -0
  291. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_trusted_work_scheduler.py +0 -0
  292. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/datahandling/test_wal_lineage_subprocess.py +0 -0
  293. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_auxiliary_database_protection.py +0 -0
  294. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_bounded_heatmap_means.py +0 -0
  295. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_bounded_integer_precision.py +0 -0
  296. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_ci_scheduling.py +0 -0
  297. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_demo_database_safety.py +0 -0
  298. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_derivative_numeric_ranges.py +0 -0
  299. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_diagnostics.py +0 -0
  300. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_heatmap_cancellation_residuals.py +0 -0
  301. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_heatmap_float_means.py +0 -0
  302. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_heatmap_geometry.py +0 -0
  303. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_independent_heatmap_extremes.py +0 -0
  304. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_liveplot_database_safety.py +0 -0
  305. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_native_fft_mixed_coordinates.py +0 -0
  306. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_nonuniform_cancellation.py +0 -0
  307. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_package_import.py +0 -0
  308. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_sample_statistics_accuracy.py +0 -0
  309. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_shutdown_supervisor.py +0 -0
  310. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_testdata.py +0 -0
  311. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_time_stress_database_safety.py +0 -0
  312. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_tools.py +0 -0
  313. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_windows_ci.py +0 -0
  314. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_windows_shutdown_job.py +0 -0
  315. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_array_heatmaps.py +0 -0
  316. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_complex_heatmaps.py +0 -0
  317. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_complex_lines.py +0 -0
  318. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_coordinate_precision.py +0 -0
  319. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_heatmap_limits.py +0 -0
  320. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_nonfinite_sql_heatmaps.py +0 -0
  321. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_shaped_coordinate_validity.py +0 -0
  322. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/test_worker_sidecar_identities.py +0 -0
  323. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_plot_preview_reuse.py +0 -0
  324. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_preview_database_instance.py +0 -0
  325. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_preview_extreme_range.py +0 -0
  326. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_preview_placeholders.py +0 -0
  327. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_run_details.py +0 -0
  328. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_run_list.py +0 -0
  329. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/widgets/test_themes.py +0 -0
  330. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/_trusted_derived_wal_ui.py +0 -0
  331. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_axis_limit_overflow.py +0 -0
  332. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_axis_limit_precision.py +0 -0
  333. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_color_scale_locale.py +0 -0
  334. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_complex_line_data.py +0 -0
  335. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_config_transactions.py +0 -0
  336. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_csv_shared_coordinates.py +0 -0
  337. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_cut_cursor_integration.py +0 -0
  338. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_database_information.py +0 -0
  339. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_database_worker_errors.py +0 -0
  340. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_differentiation_integration.py +0 -0
  341. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_export_paths.py +0 -0
  342. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_filtered_axis_autoscale.py +0 -0
  343. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_free_cursor_axis_assignment.py +0 -0
  344. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_heatmap_appearance.py +0 -0
  345. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_heatmap_layer_integration.py +0 -0
  346. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_live_array_dtypes.py +0 -0
  347. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_average_cancellation.py +0 -0
  348. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_averaging.py +0 -0
  349. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_boolean_derivatives.py +0 -0
  350. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_fft_integer_precision.py +0 -0
  351. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_float_transforms.py +0 -0
  352. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_native_transform_labels.py +0 -0
  353. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_nonuniform_gradient_overflow.py +0 -0
  354. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_offset_precision_regressions.py +0 -0
  355. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_pending_preview_drop.py +0 -0
  356. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_planned_integer_array_extent.py +0 -0
  357. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot2d_layers.py +0 -0
  358. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_actions.py +0 -0
  359. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_csv_precision.py +0 -0
  360. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_plot_sidecar_binding.py +0 -0
  361. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_preferences_lifecycle.py +0 -0
  362. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_preferences_value_preservation.py +0 -0
  363. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_refresh_interval_precision.py +0 -0
  364. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_run_csv_export_race.py +0 -0
  365. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_run_csv_mixed_integer_precision.py +0 -0
  366. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_run_duration_wal.py +0 -0
  367. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_settings_decoder_limits.py +0 -0
  368. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_svg_export_integration.py +0 -0
  369. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_tiny_tick_labels.py +0 -0
  370. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_live_counts.py +0 -0
  371. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_qt.py +0 -0
  372. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_wal_grid_ui.py +0 -0
  373. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_wal_snapshot_ui.py +0 -0
  374. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_wal_tiers_ui.py +0 -0
  375. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_derived_wal_ui.py +0 -0
  376. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_trusted_live_ui.py +0 -0
  377. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_unloaded_database_export.py +0 -0
  378. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_visual_smoke.py +0 -0
  379. {qplotter-1.6.0b3 → qplotter-1.6.1}/tests/windows/test_window_controls.py +0 -0
@@ -2,16 +2,98 @@
2
2
 
3
3
  All notable user-facing changes are recorded here.
4
4
 
5
- Historical releases used GitHub source tags. The prepared split beta uses the
6
- PyPI distributions `qplotter` and `qplotter-native`; publication requires the
7
- release workflow and its validation gates. See `docs/distribution.md`.
5
+ ## 1.6.1
8
6
 
9
- ## Unreleased
7
+ This patch release improves live acquisition viewing and release validation.
8
+
9
+ ### Fixed
10
+
11
+ - Restore Auto-plot in trusted live mode. Newly detected runs open automatically,
12
+ and enabling Auto-plot opens the newest incomplete run. Requests survive
13
+ selection changes and refreshes, retry while run metadata becomes available,
14
+ and cancel when Auto-plot is disabled, the database changes, or qPlot closes.
15
+ - Reduce unnecessary WAL coordination overhead that could cause deferred QCoDeS
16
+ writes to fail with `SQLITE_BUSY` during live viewing. Existing database
17
+ protections remain enforced.
18
+ - Display the main window title as `qPlot - <version>` without a duplicated
19
+ application-name suffix.
20
+ - Correct editable-install validation for source checkouts without generated
21
+ build metadata.
22
+
23
+ ### Maintenance
24
+
25
+ - Release the native-reader fix as `qplotter-native==1.0.1`, installed
26
+ automatically by the application's updated dependency pin.
27
+ - Add a workflow to revalidate published releases against their original
28
+ artifacts, retaining each release's original native dependency pin.
29
+ - Update live-reader, Auto-plot, and release-validation documentation and add
30
+ README badges.
31
+
32
+ ## 1.6.0
33
+
34
+ ### Highlights ###
35
+
36
+ - More improvements in handling large databases and datasets.
37
+ - Multiple heatmaps and traces can share the same plot window.
38
+ - Program now installs as a PyPi distribution for the first time, instead of via GitHub source tags.
39
+ - Numerous small improvements to the UI.
40
+ - Numerous bugs found by Codex Astra have been fixed. In particular, Codex now claims to rigorously enforce the rule that the database will never be modified by `qplot`. After about 30 rounds of automated bug searches, the last two rounds uncovered no bugs.
41
+ - To implement this database safety, the installation contains a small C extension 'qplotter-native' for reading live databases through SQLite.
42
+
43
+ ### Main changes since 1.5.0
44
+
45
+ (Everything in this section is AI-generated)
46
+
47
+ - Read supported local QCoDeS databases live without copying the whole
48
+ database. Main database, WAL, and rollback-journal handles remain physically
49
+ read-only; SQLite may update only the exact colocated SHM coordination file.
50
+ Reader work is bounded and cancellable.
51
+ - Load run metadata, thumbnails, previews, and explicit plots progressively,
52
+ prioritising selected and visible runs. Show clearer plot-loading progress
53
+ and keep cancellation, database switching, and shutdown responsive.
54
+ - Combine line traces and heatmaps in one plot, with axis-aware drag-and-drop,
55
+ shared appearance controls, and source annotations included in exports.
56
+ - Add system printing, configurable heatmap display grid limits, optional saved
57
+ run-table columns, plot tiling, cursor precision, and version/build information
58
+ in Help -> About qPlot and the main window title.
59
+ - Improve QCoDeS variable-shaped array support, missing-data handling, numerical
60
+ precision, native transforms, averaging, autoscaling, and live run refresh.
61
+ Reject drawing ranges that cannot faithfully represent recorded values.
62
+ - Fix CSV alignment and precision, standalone-measurement exports, SVG output,
63
+ and PDF publication. Strengthen protection against auxiliary outputs
64
+ overwriting database files and against blocking special-file inputs.
65
+ - Split the application into `qplotter` and the separately versioned
66
+ `qplotter-native==1.0.0`. Supported installations use prebuilt native wheels
67
+ without a compiler; imports and commands remain `qplot`. Release validation
68
+ covers CPython 3.11-3.14, Windows x64, macOS ARM64/Intel, and headless Linux
69
+ x86_64. Windows and macOS remain the supported desktop platforms.
70
+ - Strengthen application/helper shutdown and settings recovery, and save
71
+ configuration changes transactionally.
72
+
73
+ ### Upgrading
74
+
75
+ - Older or incompatible settings are reset to current defaults. Settings
76
+ migration is not supported.
77
+ - The old `qplot` distribution and `qplotter` share imports and commands and
78
+ must not coexist. Prefer a fresh virtual environment, or follow the removal
79
+ and reinstall instructions in `docs/distribution.md`.
80
+ - This entry is draft release text. Publication still requires the tagged
81
+ release workflow and all validation gates; this PR does not publish packages.
10
82
 
11
83
  ## 1.6.0b3 - Unreleased
12
84
 
13
85
  ### Added
14
86
 
87
+ - Combine line traces and heatmaps in one plot, with axis-aware preview drops
88
+ and a shared Appearance dialog. Removing the original dataset promotes a
89
+ remaining source while retaining the plot's appearance and state.
90
+ - Identify plotted databases, run IDs, and parameters in a shaded annotation
91
+ strip included in exports. A saved Show source annotation preference controls
92
+ visibility and is enabled by default.
93
+ - Add saved plot-tiling and cursor-precision preferences, and limit the graph
94
+ font-size preference to graph text.
95
+ - Add Help -> About qPlot with the running version, source commit and local
96
+ changes, plus commit and PR provenance in CI-built application packages.
15
97
  - Split pure-Python application distribution `qplotter` from native reader
16
98
  distribution `qplotter-native`, retaining the qPlot name, `qplot` imports and
17
99
  commands. Ordinary and editable application installation use prebuilt native
@@ -22,6 +104,9 @@ release workflow and its validation gates. See `docs/distribution.md`.
22
104
 
23
105
  ### Changed
24
106
 
107
+ - Consolidate plot feedback and loading progress in the refresh toolbar, with
108
+ accurate initial point counts and stable cursor readouts.
109
+ - Clarify refresh controls and incompatible-axis confirmations.
25
110
  - Load and refresh explicit plots through the trusted, physically read-only
26
111
  reader without copying the whole database. Small runs can open while a large
27
112
  run is loading, including with a single processing thread.
@@ -33,6 +118,13 @@ release workflow and its validation gates. See `docs/distribution.md`.
33
118
  exact source dimensions are not retained during downsampling. Right-align
34
119
  resolution information while keeping cursor coordinates left-aligned.
35
120
 
121
+ ### Fixed
122
+
123
+ - Preserve coordinate ownership, drawing order, native transforms, and specific
124
+ FFT validation messages when combining or replacing plot sources.
125
+ - Stabilize GUI test waits and release plot windows and background workers
126
+ during teardown.
127
+
36
128
  ## 1.6.0b1 - 2026-09-28
37
129
 
38
130
  ### Added
@@ -52,7 +52,7 @@ Linux is exercised in headless CI; Windows and macOS are supported desktop
52
52
  platforms. See the [platform matrix](docs/distribution.md#supported-platforms).
53
53
 
54
54
  The root distribution `qplotter` is pure Python. Install the compatible
55
- `qplotter-native==1.0.0` platform wheel with the application in editable
55
+ `qplotter-native==1.0.1` platform wheel with the application in editable
56
56
  mode. After the native release is on PyPI, no separate download is needed:
57
57
 
58
58
  ```console
@@ -27,6 +27,7 @@ prune src/qplotter.egg-info
27
27
 
28
28
  global-exclude .DS_Store
29
29
  global-exclude *.py[cod]
30
+ global-exclude *.py[cod].*
30
31
  global-exclude *.dll
31
32
  global-exclude *.dylib
32
33
  global-exclude *.pyd
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qplotter
3
- Version: 1.6.0b3
3
+ Version: 1.6.1
4
4
  Summary: PyQt-based viewer for completed and running QCoDeS database experiments
5
5
  Author-email: Ben Wordsworth <b.wordsworth@lancaster.ac.uk>, Edward Laird <e.a.laird@lancaster.ac.uk>
6
6
  License-Expression: MIT
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://github.com/lairdgrouplancaster/QCoDeS-Plotter.git
8
8
  Project-URL: Source, https://github.com/lairdgrouplancaster/QCoDeS-Plotter
9
9
  Project-URL: Issues, https://github.com/lairdgrouplancaster/QCoDeS-Plotter/issues
10
10
  Keywords: qcodes,pyqt,pyqtgraph,data-visualization,scientific-computing
11
- Classifier: Development Status :: 4 - Beta
11
+ Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: MacOS X
13
13
  Classifier: Environment :: Win32 (MS Windows)
14
14
  Classifier: Intended Audience :: Science/Research
@@ -24,7 +24,7 @@ Classifier: Topic :: Scientific/Engineering :: Visualization
24
24
  Requires-Python: >=3.11
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: qplotter-native==1.0.0
27
+ Requires-Dist: qplotter-native==1.0.1
28
28
  Requires-Dist: apsw==3.53.4.0
29
29
  Requires-Dist: jsonschema>=4.23.0
30
30
  Requires-Dist: numpy>=2.3.1
@@ -46,6 +46,11 @@ Dynamic: license-file
46
46
  # QCoDeS-Plotter
47
47
 
48
48
  [![release](https://img.shields.io/github/v/release/lairdgrouplancaster/QCoDeS-Plotter?label=release)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/releases/latest)
49
+ [![CI](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/actions/workflows/ci.yml)
50
+ [![License](https://img.shields.io/github/license/lairdgrouplancaster/QCoDeS-Plotter)](LICENSE)
51
+ [![Python](https://img.shields.io/badge/Python-3.11–3.14-blue?logo=python)](#requirements)
52
+ [![PyPI](https://img.shields.io/pypi/v/qplotter)](https://pypi.org/project/qplotter/)
53
+
49
54
  [![pre-release](https://img.shields.io/github/v/release/lairdgrouplancaster/QCoDeS-Plotter?include_prereleases&label=pre-release&sort=semver)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/releases)
50
55
 
51
56
  QCoDeS-Plotter, or qPlot, is a PyQt-based data viewer for QCoDeS databases. It
@@ -116,16 +121,20 @@ fields and an unavailable detail state without starting a selected-detail
116
121
  reader or preparing an additional selected-detail snapshot. That claim applies
117
122
  only to row selection: fallback metadata and retained preview paths can still
118
123
  create private snapshots. Plot and CSV actions also acquire action-owned
119
- snapshots. Automatic trusted live
120
- previews and thumbnails are disabled until the Stage 5 scheduler and disk cache
121
- are implemented. See
124
+ snapshots. Trusted live previews and thumbnails load progressively through a bounded
125
+ scheduler and application cache. See
122
126
  [Trusted live QCoDeS reader](docs/trusted-live-reader.md).
123
127
 
124
128
  ## Packages
125
129
 
126
130
  The application distribution is `qplotter`; its Python imports and
127
131
  console commands remain `qplot`, `qplot-cfg`, and `qplot-generate-db`.
128
- The separately built `qplotter-native==1.0.0` supplies the protected
132
+ Use **Help → About qPlot** to see the version in use on every platform.
133
+ Source checkouts also show the commit and
134
+ whether there are local changes. CI-built packages retain their build commit
135
+ and, for pull-request builds, the PR number. Packages installed without build
136
+ provenance still show the release number.
137
+ The separately built `qplotter-native==1.0.1` supplies the protected
129
138
  SQLite reader through `qplot_native`. The application's exact dependency pin
130
139
  installs the compatible native wheel automatically. Both packages pin the same
131
140
  APSW/SQLite runtime, preserving trusted live reading and database protections.
@@ -143,8 +152,8 @@ source builds, and release validation.
143
152
  ## Install
144
153
 
145
154
  Install qPlot inside a supported Python virtual environment. This checkout
146
- prepares the first split PyPI release, application `1.6.0b3` with native `1.0.0`;
147
- the commands targeting these packages work after publication. Until then, use
155
+ prepares the stable application release `1.6.1`, with native `1.0.1`.
156
+ The installation examples below work after publication; until then, use
148
157
  validated local artifacts as described in [Distribution](docs/distribution.md).
149
158
 
150
159
  ### Prelude
@@ -174,9 +183,9 @@ For ordinary installation after a stable PyPI release is available:
174
183
  python -m pip install --only-binary=:all: qplotter
175
184
  ```
176
185
 
177
- For the first split beta, explicitly select the prerelease:
186
+ To select version 1.6.1 explicitly after publication:
178
187
  ```console
179
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
188
+ python -m pip install --only-binary=:all: qplotter==1.6.1
180
189
  ```
181
190
 
182
191
  Both commands install the full runtime dependency set as wheels, with no C
@@ -198,7 +207,7 @@ installing the new packages:
198
207
 
199
208
  ```console
200
209
  python -m pip uninstall -y qplot qcodes-plotter qcodes-plotter-native qplotter qplotter-native
201
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
210
+ python -m pip install --only-binary=:all: qplotter==1.6.1
202
211
  python -m pip check
203
212
  ```
204
213
 
@@ -1,6 +1,11 @@
1
1
  # QCoDeS-Plotter
2
2
 
3
3
  [![release](https://img.shields.io/github/v/release/lairdgrouplancaster/QCoDeS-Plotter?label=release)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/releases/latest)
4
+ [![CI](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/actions/workflows/ci.yml)
5
+ [![License](https://img.shields.io/github/license/lairdgrouplancaster/QCoDeS-Plotter)](LICENSE)
6
+ [![Python](https://img.shields.io/badge/Python-3.11–3.14-blue?logo=python)](#requirements)
7
+ [![PyPI](https://img.shields.io/pypi/v/qplotter)](https://pypi.org/project/qplotter/)
8
+
4
9
  [![pre-release](https://img.shields.io/github/v/release/lairdgrouplancaster/QCoDeS-Plotter?include_prereleases&label=pre-release&sort=semver)](https://github.com/lairdgrouplancaster/QCoDeS-Plotter/releases)
5
10
 
6
11
  QCoDeS-Plotter, or qPlot, is a PyQt-based data viewer for QCoDeS databases. It
@@ -71,16 +76,20 @@ fields and an unavailable detail state without starting a selected-detail
71
76
  reader or preparing an additional selected-detail snapshot. That claim applies
72
77
  only to row selection: fallback metadata and retained preview paths can still
73
78
  create private snapshots. Plot and CSV actions also acquire action-owned
74
- snapshots. Automatic trusted live
75
- previews and thumbnails are disabled until the Stage 5 scheduler and disk cache
76
- are implemented. See
79
+ snapshots. Trusted live previews and thumbnails load progressively through a bounded
80
+ scheduler and application cache. See
77
81
  [Trusted live QCoDeS reader](docs/trusted-live-reader.md).
78
82
 
79
83
  ## Packages
80
84
 
81
85
  The application distribution is `qplotter`; its Python imports and
82
86
  console commands remain `qplot`, `qplot-cfg`, and `qplot-generate-db`.
83
- The separately built `qplotter-native==1.0.0` supplies the protected
87
+ Use **Help → About qPlot** to see the version in use on every platform.
88
+ Source checkouts also show the commit and
89
+ whether there are local changes. CI-built packages retain their build commit
90
+ and, for pull-request builds, the PR number. Packages installed without build
91
+ provenance still show the release number.
92
+ The separately built `qplotter-native==1.0.1` supplies the protected
84
93
  SQLite reader through `qplot_native`. The application's exact dependency pin
85
94
  installs the compatible native wheel automatically. Both packages pin the same
86
95
  APSW/SQLite runtime, preserving trusted live reading and database protections.
@@ -98,8 +107,8 @@ source builds, and release validation.
98
107
  ## Install
99
108
 
100
109
  Install qPlot inside a supported Python virtual environment. This checkout
101
- prepares the first split PyPI release, application `1.6.0b3` with native `1.0.0`;
102
- the commands targeting these packages work after publication. Until then, use
110
+ prepares the stable application release `1.6.1`, with native `1.0.1`.
111
+ The installation examples below work after publication; until then, use
103
112
  validated local artifacts as described in [Distribution](docs/distribution.md).
104
113
 
105
114
  ### Prelude
@@ -129,9 +138,9 @@ For ordinary installation after a stable PyPI release is available:
129
138
  python -m pip install --only-binary=:all: qplotter
130
139
  ```
131
140
 
132
- For the first split beta, explicitly select the prerelease:
141
+ To select version 1.6.1 explicitly after publication:
133
142
  ```console
134
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
143
+ python -m pip install --only-binary=:all: qplotter==1.6.1
135
144
  ```
136
145
 
137
146
  Both commands install the full runtime dependency set as wheels, with no C
@@ -153,7 +162,7 @@ installing the new packages:
153
162
 
154
163
  ```console
155
164
  python -m pip uninstall -y qplot qcodes-plotter qcodes-plotter-native qplotter qplotter-native
156
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
165
+ python -m pip install --only-binary=:all: qplotter==1.6.1
157
166
  python -m pip check
158
167
  ```
159
168
 
@@ -245,8 +245,16 @@ unavailable detail state: ordinary selection starts no selected-detail worker
245
245
  and prepares no additional selected-detail snapshot. A trusted detail failure
246
246
  also does not trigger an automatic fallback copy. This is a property of the
247
247
  selection action, not the whole fallback session: fallback metadata and retained
248
- preview paths can still create private snapshots. Only explicit plot and CSV
249
- actions materialise a DataSet.
248
+ preview paths can still create private snapshots. Fallback plot actions
249
+ (including Auto-plot) and CSV actions can materialise a DataSet.
250
+
251
+ Trusted Auto-plot owns a deduplicated queue independently of selected-detail
252
+ and refresh requests. It submits one bounded plot-metadata request at a time,
253
+ then uses the same asynchronous plot pipeline as manual plotting. Unavailable
254
+ descriptions are operation-local failures that leave the reader session usable.
255
+ Retries use bounded backoff; later run-metadata changes wake exhausted requests.
256
+ Disabling Auto-plot, committing a database switch, closing the database, and
257
+ shutdown cancel the queue. Source identity checks still guard publication.
250
258
 
251
259
  Stage 5A's `trusted_work_scheduler.py` owns the exact derived priority key
252
260
  `(run tier, work kind, stable run index)` without materialising one task per
@@ -29,11 +29,15 @@ virtual environment with:
29
29
  python -m pip install --only-binary=:all: qplotter
30
30
  ```
31
31
 
32
- The first prepared application release is the beta `1.6.0b3`, with exact native
33
- dependency `1.0.0`. Once published, install that prerelease explicitly:
32
+ The current development target is the stable application release `1.6.1`,
33
+ with exact native dependency `1.0.1`. Existing candidate tags do not establish
34
+ that publication succeeded. Preparing a PR does not publish either package.
35
+
36
+ The prepared stable application release is `1.6.1`, with exact native
37
+ dependency `1.0.1`. Once published, install that release explicitly:
34
38
 
35
39
  ```console
36
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
40
+ python -m pip install --only-binary=:all: qplotter==1.6.1
37
41
  ```
38
42
 
39
43
  The earlier `native-and-app/v1.6.0b2` candidate did not pass its complete hosted
@@ -55,7 +59,7 @@ wheel paths from this revision's validated artifacts together. For example,
55
59
  on Windows x64 (replace the application version when appropriate):
56
60
 
57
61
  ```console
58
- python -m pip install --only-binary=:all: dist/qplotter_native-1.0.0-cp311-abi3-win_amd64.whl dist/qplotter-1.6.0b3-py3-none-any.whl
62
+ python -m pip install --only-binary=:all: dist/qplotter_native-1.0.1-cp311-abi3-win_amd64.whl dist/qplotter-1.6.1-py3-none-any.whl
59
63
  ```
60
64
 
61
65
  Use your platform's native filename on macOS/Linux. Never mix artifacts from
@@ -87,7 +91,7 @@ application names before installing the replacement:
87
91
 
88
92
  ```console
89
93
  python -m pip uninstall -y qplot qcodes-plotter qcodes-plotter-native qplotter qplotter-native
90
- python -m pip install --only-binary=:all: qplotter==1.6.0b3
94
+ python -m pip install --only-binary=:all: qplotter==1.6.1
91
95
  python -m pip check
92
96
  python -c "from importlib.metadata import packages_distributions; p = packages_distributions(); assert set(p['qplot']) == {'qplotter'}; assert set(p['qplot_native']) == {'qplotter-native'}"
93
97
  ```
@@ -217,7 +221,7 @@ wheels must build the extension from source.
217
221
 
218
222
  The native wheel contains the `cp311-abi3` extension
219
223
  `qplot_native._trusted_vfs_native` and is platform-specific. The application
220
- wheel is `py3-none-any`. The application requires exactly native version 1.0.0;
224
+ wheel is `py3-none-any`. The application requires exactly native version 1.0.1;
221
225
  both distributions pin APSW 3.53.4.0. Keep these dependencies, the validator's
222
226
  pins, and the Python/native SQLite 3.53.4 and source-ID checks coordinated.
223
227
  The reader also rejects an incompatible native distribution version, SQLite
@@ -395,8 +399,8 @@ application version from `pyproject.toml`:
395
399
 
396
400
  | Tag | Native handling | PyPI uploads |
397
401
  | --- | --- | --- |
398
- | `native-and-app/v1.6.0b3` | Build/validate native `1.0.0` at this revision | Native wheels first, then application wheel/sdist |
399
- | `v1.6.0b4` (example later version) | Fetch/validate the application's exact published native pin | Application wheel/sdist only |
402
+ | `native-and-app/v1.6.1` | Build/validate native `1.0.1` at this revision, if unpublished | Native wheels first, then application wheel/sdist |
403
+ | `v1.6.1` | Fetch/validate the application's exact published native pin | Application wheel/sdist only |
400
404
 
401
405
  The workflow calls the entire CI workflow at the tagged revision. Failure of
402
406
  any build, static check, source-distribution suite, database-protection suite,
@@ -428,9 +432,9 @@ After application publication and byte verification, `public-installations`
428
432
  runs on all four platforms and every advertised CPython version (3.11–3.14).
429
433
  Each entry creates two fresh environments outside the original checkout.
430
434
  The ordinary path runs `python -m pip install --only-binary=:all:
431
- qplotter==1.6.0b3` against the public PyPI index with all runtime dependencies.
435
+ qplotter==1.6.1` against the public PyPI index with all runtime dependencies.
432
436
  The editable path fetches the exact tested commit into a fresh checkout and
433
- installs `.[dev]` with `qplotter-native==1.0.0` resolved from public PyPI.
437
+ installs `.[dev]` with `qplotter-native==1.0.1` resolved from public PyPI.
434
438
  Neither path installs a local release wheel; the validated artifacts are only
435
439
  comparison receipts for the pip report and installed-file hashes. All runtime
436
440
  and development dependencies must resolve to public wheels. Both paths disable
@@ -440,7 +444,10 @@ protections. Editable acceptance additionally observes a Python edit without
440
444
  reinstalling and checks that the native binary's bytes, identity and timestamp
441
445
  remain unchanged. Windows uses the standard-user wrapper for both paths.
442
446
  Publication is irreversible; failures in these post-publication checks must
443
- be reported and fixed in a new release, rather than described as acceptance.
447
+ be reported. Changes to published package contents require a new release.
448
+ A defect confined to the validation tools can instead be corrected and the
449
+ existing release rechecked as described below; the failed original run remains
450
+ part of the release record.
444
451
 
445
452
  ### One-time account configuration
446
453
 
@@ -484,10 +491,13 @@ and [pending-publisher instructions](https://docs.pypi.org/trusted-publishers/cr
484
491
  release version before tagging; never move a published tag. If migrating
485
492
  from token publishing, revoke/remove the old upload tokens/secrets.
486
493
 
487
- ### First release commands
494
+ ### Paired release commands
495
+
496
+ Version 1.6.1 includes native-reader changes, so release native 1.0.1 with
497
+ the paired tag below. Keep the already published native 1.0.0 unchanged.
488
498
 
489
499
  Complete the account setup and merge the reviewed packaging/release changes
490
- to `main`. With application `1.6.0b3` and native `1.0.0`, use the configured
500
+ to `main`. With application `1.6.1` and native `1.0.1`, use the configured
491
501
  Git remote/credentials:
492
502
 
493
503
  ```console
@@ -495,8 +505,8 @@ git fetch origin
495
505
  git switch main
496
506
  git pull --ff-only origin main
497
507
  python scripts/validate_distribution.py --check-clean
498
- git tag -a native-and-app/v1.6.0b3 -m "qPlot 1.6.0b3 with native reader 1.0.0"
499
- git push origin refs/tags/native-and-app/v1.6.0b3
508
+ git tag -a native-and-app/v1.6.1 -m "qPlot 1.6.1 with native reader 1.0.1"
509
+ git push origin refs/tags/native-and-app/v1.6.1
500
510
  ```
501
511
 
502
512
  Use the activated project venv for Python; on macOS set
@@ -537,6 +547,35 @@ the application remains blocked. Once the complete native release is verified,
537
547
  an application-only tag for the still-unpublished application version can also
538
548
  recover a failed paired release after a new validation run.
539
549
 
550
+ ### Recheck an existing published release
551
+
552
+ If post-publication acceptance fails because of a validation-tool defect,
553
+ fix and review the tools, then merge them to `main`. Do not move the release
554
+ tag or rerun a successful publication job. In GitHub Actions, select
555
+ **Revalidate published qPlot release**, then **Run workflow**, using branch
556
+ `main`. Supply the original release tag and publication workflow run ID.
557
+ For the 1.6.0 resource-inventory correction these are `v1.6.0` and
558
+ `38429734516`.
559
+
560
+ This manual workflow uses the corrected tools from `main`, but checks out
561
+ the original release source separately. It checks the native package version
562
+ pinned by that original source while retaining the tools' supported APSW/SQLite
563
+ ABI checks. It downloads the `qplot-release` artifact from the original
564
+ publication run, verifies its tag, commit, run ID,
565
+ and hashes, and checks the published PyPI bytes against those receipts. The
566
+ artifact must still be available; a missing/expired receipt is a failed gate,
567
+ not permission to substitute a new build. The receipts are comparison inputs;
568
+ ordinary and editable dependencies are still installed from public PyPI.
569
+ All four platforms and CPython 3.11-3.14 run both installation paths, including
570
+ GUI startup and the trusted live reader/database-protection smokes. Windows
571
+ runs unprivileged. The workflow has only read permissions and no publishing
572
+ jobs or deployment approvals.
573
+
574
+ Wait for all 16 matrix jobs to pass before reporting corrected acceptance.
575
+ Link both the original publication run and the new validation run in the
576
+ release notes. If any failure requires an application or native package change,
577
+ use a new package version and the normal release workflow.
578
+
540
579
  ### Local and hosted results
541
580
 
542
581
  Local tests and actionlint validate release configuration and failure gates.
@@ -265,8 +265,19 @@ proof handles, actual SQLite handles, source pathnames, rollback-journal absence
265
265
  and active SHM bindings. Only after that succeeds may page reads reuse pathname
266
266
  proofs until operation cleanup. Every page read still validates the retained and
267
267
  actual handle identities and their physically read-only permissions, before and
268
- after delegation. Other callbacks, including SHM mapping/locking, retain their
269
- full existing checks. Newly opened or promoted WAL handles are fully validated.
268
+ after delegation. SHM mapping and newly opened or promoted WAL handles retain
269
+ their full checks. SHM locks and memory barriers use the binding already proved
270
+ by mapping and operation-boundary validation, without filesystem calls inside
271
+ SQLite's WAL critical sections. Unlocks are forwarded even after a latched
272
+ validation error, allowing SQLite to release its coordination locks on cleanup.
273
+
274
+ SQLite reads the two WAL-index header copies around `xShmBarrier`. Filesystem
275
+ checks in that callback widen the race with a commit and can force even a
276
+ read-only connection to acquire `WAL_WRITE_LOCK` to retry the header. Checks
277
+ after acquisition or before release then prolong that lock, causing a QCoDeS
278
+ deferred read-to-write upgrade to fail with `SQLITE_BUSY`. The native callbacks
279
+ retain the platform memory fence and real SHM locking, including legitimate
280
+ WAL-index recovery; they neither suppress locks nor bypass them.
270
281
 
271
282
  Cleanup disables pathname reuse and performs full native validation before any
272
283
  materialised result is published, including error, deadline and cancellation
@@ -279,6 +290,11 @@ transaction. Reads outside the explicit finite scope retain per-read path checks
279
290
  Native audit counters include `read_path_reused`, `read_validation_ns` and
280
291
  `read_io_ns`. The timings separate page-read validation from the delegated OS VFS
281
292
  read, not total SQL or IPC time, and never govern safety checks or deadlines.
293
+ `shm_write_lock_attempts`, `shm_write_lock_acquired`, `shm_write_lock_ns` and
294
+ `shm_write_lock_max_ns` expose transient WAL write-lock contention. The durations
295
+ run from successful acquisition return through successful release return; these
296
+ diagnostics do not control locking. A read-only connection can legitimately
297
+ acquire this lock to coordinate the writable WAL index.
282
298
  `scripts/profile_trusted_reads.py DATABASE RUN_ID` profiles finite 65,536-row
283
299
  intervals through the pinned reader and checks protected-file sizes/timestamps.
284
300
  It does not clear OS caches or modify the selected database. Use the actual plot
@@ -315,6 +315,8 @@ Common actions:
315
315
  * `Options -> Preferences...` edits common theme, plot mouse mode, default
316
316
  load location, preview, refresh, confirmation, and runtime settings. On
317
317
  macOS this appears as `qPlot -> Preferences...`.
318
+ In Appearance, `Cursor significant figures` controls the x, y, and z
319
+ coordinate readouts, including snapped trace values (1–17; default 6).
318
320
  Use `Restore Defaults` in that dialog to reset the shown preferences without
319
321
  leaving the dialog.
320
322
  * `Options -> Reset All Settings...` resets all qPlot settings to their
@@ -327,9 +329,14 @@ Common actions:
327
329
  on macOS and `Ctrl+Q` on Windows and Linux.
328
330
  * The refresh interval controls how often qPlot checks for new runs. Set it to
329
331
  `0.0 s` to disable automatic checks.
330
- * `Auto-plot` retains its existing behavior for snapshot fallback sessions.
331
- Trusted live Stage 4 does not materialise an action-owned plot dataset
332
- automatically; use an explicit plot action instead.
332
+ * `Auto-plot` opens every newly detected run, including runs already complete,
333
+ in both trusted live and snapshot fallback sessions. Enabling it also opens
334
+ the newest incomplete run already listed. Trusted live requests use the
335
+ asynchronous reader and survive selection changes and subsequent refreshes.
336
+ An empty plot waits for its first data. Missing descriptions are retried with
337
+ backoff (eight attempts); after that, a run metadata change wakes the request,
338
+ or you can open it manually. Disabling Auto-plot, changing databases, or
339
+ quitting cancels pending automatic requests.
333
340
 
334
341
  Where a legacy preview is available, its double-click and context-menu actions
335
342
  can still request a plot or export. Trusted live sessions do not generate those
@@ -364,15 +371,34 @@ snapshot and materialises the QCoDeS dataset. Merely loading, selecting, or
364
371
  scrolling a trusted live database does not do this work or copy the database.
365
372
 
366
373
  Plot windows may appear before their data has finished loading. Check the plot
367
- window status bar; unless qPlot stops responding or shows an error, wait for the
374
+ window refresh toolbar; unless qPlot stops responding or shows an error, wait for the
368
375
  load to complete.
369
376
 
370
377
  ## Plot Windows
371
378
 
372
- Each plot window has plot controls, a status bar, optional toolbars, and dock
373
- panels. Toolbars and dock panels can be shown or hidden from `View -> Toolbars`,
379
+ Each plot window has plot controls, optional toolbars, and dock
380
+ panels. Toolbars and dock panels can be shown or hidden from `View -> Panels and toolbars`,
374
381
  by right-clicking a toolbar or panel, or with keyboard shortcuts.
375
382
 
383
+ Above the plot, qPlot identifies the displayed sources, for example
384
+ `Databasename: 9 (Signal); 10-12 (Current); 6-8, 11, 12 (Voltage)`.
385
+ Run IDs are grouped by parameter label, with ranges for three or more
386
+ consecutive IDs. Each database has its own line. Hidden or fully transparent
387
+ traces and heatmaps are omitted. This annotation is included in plot images,
388
+ SVGs, PDFs, and printing.
389
+ The annotation uses a shaded strip with a bold database name. In
390
+ `Preferences -> Appearance`, `Show source annotation` controls its visibility
391
+ in all plots and exports. It is enabled by default. Hiding it also removes
392
+ the space reserved for the strip.
393
+
394
+ The `Refresh and status` toolbar is visible by default, including for completed
395
+ runs. Its right-hand side shows the latest status message until another
396
+ message or loading progress replaces it. During loading it shows a progress
397
+ bar for the current stage, elapsed time, and the stage number. Hover over
398
+ progress for the stage name and detailed counts, or over a shortened status
399
+ message to read it in full. Empty-data and error explanations also appear in
400
+ the plot area.
401
+
376
402
  Common plot controls:
377
403
 
378
404
  * Mouse wheel over the plot: zoom.
@@ -387,8 +413,9 @@ Common plot controls:
387
413
  linear and base-10 logarithmic scaling. Non-positive values are omitted.
388
414
  * Right-drag on the plot, or scroll over an axis, to fast scale an axis.
389
415
  * The bottom toolbar shows cursor coordinates and array indices.
390
- * The left panel controls assigned axes and plot-specific options.
391
- * The right `Operations` panel applies data operations during refresh, after
416
+ * Use `Swap X/Y` in the Appearance dialog to exchange the plotted axes.
417
+ * Cut windows have a `Cut controls` panel for the cut direction and position.
418
+ * The right `Data operations` panel applies data operations during refresh, after
392
419
  data is loaded from the database.
393
420
 
394
421
  ### Line Plots
@@ -455,7 +482,7 @@ Color-scale controls:
455
482
 
456
483
  ### Data Operations
457
484
 
458
- Plot windows can apply operations during refresh from the `Operations` panel.
485
+ Plot windows can apply operations during refresh from the `Data operations` panel.
459
486
  The available operations depend on the plot type.
460
487
 
461
488
  Common operations:
@@ -565,10 +592,10 @@ Plot-window shortcuts:
565
592
  | `Ctrl+C` / `Cmd+C` | Copy the plot image to the clipboard using the selected copy format/resolution |
566
593
  | `Ctrl+E` | Export the plot |
567
594
  | `Ctrl+P` / `Cmd+P` | Print the visible plot area |
568
- | `Ctrl+Alt+R` | Show or hide the refresh toolbar |
569
- | `Ctrl+Alt+C` | Show or hide the coordinate toolbar |
570
- | `Ctrl+Alt+A` | Show or hide the axis control panel |
571
- | `Ctrl+Alt+O` | Show or hide the operations dock |
595
+ | `Ctrl+Alt+R` | Show or hide the refresh and status toolbar |
596
+ | `Ctrl+Alt+C` | Show or hide the coordinates toolbar |
597
+ | `Ctrl+Alt+A` | Show or hide Cut controls in a cut window |
598
+ | `Ctrl+Alt+O` | Show or hide the data operations panel |
572
599
  | `S` | Snap the 1D coordinate readout to the nearest trace point |
573
600
 
574
601
  Heatmap shortcuts:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "qplotter"
7
- version = "1.6.0b3"
7
+ version = "1.6.1"
8
8
  description = "PyQt-based viewer for completed and running QCoDeS database experiments"
9
9
  readme = "README.md"
10
10
  authors = [{name="Ben Wordsworth", email="b.wordsworth@lancaster.ac.uk"},{name="Edward Laird", email="e.a.laird@lancaster.ac.uk"}]
@@ -12,7 +12,7 @@ license = "MIT"
12
12
  requires-python = ">=3.11"
13
13
  keywords = ["qcodes", "pyqt", "pyqtgraph", "data-visualization", "scientific-computing"]
14
14
  classifiers = [
15
- "Development Status :: 4 - Beta",
15
+ "Development Status :: 5 - Production/Stable",
16
16
  "Environment :: MacOS X",
17
17
  "Environment :: Win32 (MS Windows)",
18
18
  "Intended Audience :: Science/Research",
@@ -27,7 +27,7 @@ classifiers = [
27
27
  "Topic :: Scientific/Engineering :: Visualization",
28
28
  ]
29
29
  dependencies = [
30
- "qplotter-native==1.0.0",
30
+ "qplotter-native==1.0.1",
31
31
  "apsw==3.53.4.0",
32
32
  "jsonschema>=4.23.0",
33
33
  "numpy>=2.3.1",
@@ -148,6 +148,10 @@ files = [
148
148
  "src/qplot/windows/_dataset_handle.py",
149
149
  "src/qplot/windows/_dragdrop.py",
150
150
  "src/qplot/windows/_help.py",
151
+ "src/qplot/windows/_mixed_plots.py",
152
+ "src/qplot/windows/_mixed_appearance.py",
153
+ "src/qplot/windows/_plot_source_promotion.py",
154
+ "src/qplot/windows/_plot_data_viewbox.py",
151
155
  "src/qplot/windows/_native_averaging.py",
152
156
  "src/qplot/windows/_native_transforms.py",
153
157
  "src/qplot/windows/_plot1d_snap.py",
@@ -157,6 +161,7 @@ files = [
157
161
  "src/qplot/windows/_plot2d_layers.py",
158
162
  "src/qplot/windows/_plot2d_sweeps.py",
159
163
  "src/qplot/windows/_plot_axis_scaling.py",
164
+ "src/qplot/windows/_plot_drop_axes.py",
160
165
  "src/qplot/windows/_plot_export.py",
161
166
  "src/qplot/windows/_plot_feedback.py",
162
167
  "src/qplot/windows/_plot_marquee.py",