From 75de69505aa536a5f1306a28b9685c2e1b6cc4b5 Mon Sep 17 00:00:00 2001
From: Pierre Raybaut
Date: Thu, 23 Apr 2026 12:41:20 +0200
Subject: [PATCH 01/27] bump: update version to 1.2.1
---
datalab/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/datalab/__init__.py b/datalab/__init__.py
index b8a132d6..88986cb9 100644
--- a/datalab/__init__.py
+++ b/datalab/__init__.py
@@ -24,7 +24,7 @@
# this module is imported more than once, e.g. when running tests)
pass
-__version__ = "1.2.0"
+__version__ = "1.2.1"
__docurl__ = __homeurl__ = "https://datalab-platform.com/"
__supporturl__ = "https://github.com/DataLab-Platform/DataLab/issues/new/choose"
From 84473d8dd1fd6e7b55eb521ba20a6e4aeac6efac Mon Sep 17 00:00:00 2001
From: Pierre Raybaut
Date: Thu, 23 Apr 2026 12:44:07 +0200
Subject: [PATCH 02/27] fix: Restored the "Linear calibration" (Signal)
Closes #312
---
datalab/gui/actionhandler.py | 1 +
doc/locale/fr/LC_MESSAGES/release_notes/release_1.02.po | 9 +++++++++
doc/release_notes/release_1.02.md | 8 ++++++++
3 files changed, 18 insertions(+)
diff --git a/datalab/gui/actionhandler.py b/datalab/gui/actionhandler.py
index 59f16ef4..c36ea21d 100644
--- a/datalab/gui/actionhandler.py
+++ b/datalab/gui/actionhandler.py
@@ -1320,6 +1320,7 @@ def cra_fit(title, fitdlgfunc, tip: str | None = None):
self.action_for("reverse_x")
self.action_for("replace_x_by_other_y")
self.action_for("xy_mode")
+ self.action_for("calibration", separator=True)
self.action_for("to_cartesian", separator=True)
self.action_for("to_polar")
with self.new_menu(_("Frequency filters"), icon_name="highpass.svg"):
diff --git a/doc/locale/fr/LC_MESSAGES/release_notes/release_1.02.po b/doc/locale/fr/LC_MESSAGES/release_notes/release_1.02.po
index 92df4284..fd80061e 100644
--- a/doc/locale/fr/LC_MESSAGES/release_notes/release_1.02.po
+++ b/doc/locale/fr/LC_MESSAGES/release_notes/release_1.02.po
@@ -15,6 +15,15 @@ msgstr ""
msgid "Version 1.2"
msgstr "Version 1.2"
+msgid "DataLab Version 1.2.1"
+msgstr "DataLab Version 1.2.1"
+
+msgid "**Signal panel menus:**"
+msgstr "**Menus du panneau Signal :**"
+
+msgid "Restored the \"Linear calibration\" entry in the \"Processing > Axis transformation\" menu of the Signal panel - it had been inadvertently dropped during a menu reorganization and was no longer reachable from the menu bar, even though the underlying computation was still available"
+msgstr "Restauration de l'entrée « Étalonnage linéaire » dans le menu « Traitement > Transformation des axes » du panneau Signal - elle avait été supprimée par inadvertance lors d'une réorganisation des menus et n'était plus accessible depuis la barre de menus, alors même que le calcul sous-jacent restait disponible"
+
msgid "DataLab Version 1.2.0 (2026-04-20)"
msgstr "DataLab Version 1.2.0 (20/04/2026)"
diff --git a/doc/release_notes/release_1.02.md b/doc/release_notes/release_1.02.md
index c40aad27..df762651 100644
--- a/doc/release_notes/release_1.02.md
+++ b/doc/release_notes/release_1.02.md
@@ -1,5 +1,13 @@
# Version 1.2 #
+## DataLab Version 1.2.1 ##
+
+### 🛠️ Bug Fixes ###
+
+**Signal panel menus:**
+
+* Restored the "Linear calibration" entry in the "Processing > Axis transformation" menu of the Signal panel - it had been inadvertently dropped during a menu reorganization and was no longer reachable from the menu bar, even though the underlying computation was still available
+
## DataLab Version 1.2.0 (2026-04-20) ##
### ✨ New Features ###
From ce5ba15970eecbfe4e424b89e4a2d6a905d4c20d Mon Sep 17 00:00:00 2001
From: Pierre Raybaut
Date: Mon, 27 Apr 2026 14:02:36 +0200
Subject: [PATCH 03/27] Fix ROI editor not preserving non-linear axis scales of
source plot
Closes #315
---
datalab/gui/panel/base.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/datalab/gui/panel/base.py b/datalab/gui/panel/base.py
index 60c95db7..9fde1651 100644
--- a/datalab/gui/panel/base.py
+++ b/datalab/gui/panel/base.py
@@ -2980,6 +2980,15 @@ def get_roi_editor_output(
source_panel=self,
size=self.get_dialog_size(),
)
+ # Propagate the source plot axis scales (e.g. log) to the ROI editor
+ # so that signals/images displayed with non-linear scales keep the same
+ # representation in the ROI editor dialog (see issue: ROI editor was
+ # always opening with default lin-lin scales).
+ src_plot = self.plothandler.plot
+ roi_editor.get_plot().set_scales(
+ src_plot.get_axis_scale("bottom"),
+ src_plot.get_axis_scale("left"),
+ )
if exec_dialog(roi_editor):
return roi_editor.get_roieditor_results()
return None
From 5e08f9caa1d18aef878c74008e00e2cfe2b9e483 Mon Sep 17 00:00:00 2001
From: Pierre Raybaut
Date: Fri, 15 May 2026 09:59:53 +0200
Subject: [PATCH 04/27] fix(test): locate duplicate/result via group in
geometry_results test
After eba8385c, plot_results creates a "Results" group in the signal
panel, breaking panel-wide index lookups. Use group-local lookups so
the test is robust against extra groups.
---
.../features/common/geometry_results_app_test.py | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/datalab/tests/features/common/geometry_results_app_test.py b/datalab/tests/features/common/geometry_results_app_test.py
index 9bd73d84..dc3cde07 100644
--- a/datalab/tests/features/common/geometry_results_app_test.py
+++ b/datalab/tests/features/common/geometry_results_app_test.py
@@ -116,11 +116,20 @@ def test_geometry_results() -> None:
with Conf.proc.keep_results.temp(keep_results):
# Test merging result shapes (duplicate obj, then compute average):
for panel in (win.signalpanel, win.imagepanel):
- panel.objview.select_objects((2,))
+ src_obj = panel[2]
+ group_id = panel.objmodel.get_object_group_id(src_obj)
+ panel.objview.select_objects([src_obj])
panel.duplicate_object()
- panel.objview.select_objects((2, len(panel)))
+ # The duplicate is the last object of the source object's group
+ duplicate = panel.objmodel[
+ panel.objmodel.get_group_object_ids(group_id)[-1]
+ ]
+ panel.objview.select_objects([src_obj, duplicate])
panel.processor.run_feature("average")
- last_obj = panel[len(panel)]
+ # The average result is the last object of the source group
+ last_obj = panel.objmodel[
+ panel.objmodel.get_group_object_ids(group_id)[-1]
+ ]
if keep_results:
__check_geometry_results_merge(panel[2], last_obj)
if panel is win.imagepanel:
From c1ad38d7cde1ffd66962e3b6b623e0e713781711 Mon Sep 17 00:00:00 2001
From: Pierre Raybaut <1311787+PierreRaybaut@users.noreply.github.com>
Date: Wed, 20 May 2026 09:45:24 +0200
Subject: [PATCH 05/27] feat: update graphics resources and localization files
for improved documentation and UI
---
datalab/data/logo/DataLab-Banner-150.png | Bin 5813 -> 5897 bytes
datalab/data/logo/DataLab-Splash.png | Bin 19432 -> 17888 bytes
datalab/data/logo/DataLab-watermark.png | Bin 19836 -> 17771 bytes
datalab/locale/fr/LC_MESSAGES/datalab.po | 9 -
doc/_static/DataLab-Frontpage.png | Bin 73276 -> 57564 bytes
doc/_static/DataLab-Title.png | Bin 16156 -> 15535 bytes
doc/images/DataLab-Overview.png | Bin 278508 -> 269686 bytes
doc/images/DataLab-Screenshot-Theme.png | Bin 370011 -> 410503 bytes
doc/images/DataLab-banner.png | Bin 16965 -> 17244 bytes
doc/images/shots/windows_installer.png | Bin 79138 -> 78469 bytes
.../LC_MESSAGES/features/validation/status.po | 29 ++-
.../fr/LC_MESSAGES/intro/installation.po | 4 +
doc/locale/fr/LC_MESSAGES/requirements.po | 4 +
doc/requirements.rst | 3 +
requirements.txt | 1 +
resources/DataLab-Reset.ico | Bin 112357 -> 110641 bytes
scripts/build_resources.py | 213 ++++++++++++++++--
17 files changed, 221 insertions(+), 42 deletions(-)
diff --git a/datalab/data/logo/DataLab-Banner-150.png b/datalab/data/logo/DataLab-Banner-150.png
index a8d09ee87e581e4e56a24c4ac0f66e83afaea57d..f47bc7cb62424dfbf3a48b2e488956b719eeea38 100644
GIT binary patch
literal 5897
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
literal 5813
zcmV;m7E0-fP)9l>jyzggfmuWk#
zw(7L%IJH)^xFZ6B8-k#OeGO~E61D`wo`fXt9~MOvh=4OXFW>*}J-_=r=iEHG=iYP9
za|jxZ2GdM4)exV6JtF`-0E8*FJ
zSMJ9Eil@lWG|vcxNp^*L<#m!DzWep|hO2jk4?UrX1Ony+*=RN{@jM&oVg3ey=E*pl
z=GkGwfi*aY(4z?jXZFVB829!oK_U^MQmG%(x!D;(D3)Q>d{@QBr5;~d7_+_y&_2m}
zPxF-XxPe7fsSurZyXMbvNo6xL^6Lo}CVE&G<<>qw$o9bb>y`ht?*w0O_yq=RI(Bc5
z#N}JHNV!#m=x~R@S5|m$v*NOUn%bsJ^EB}|fyKLYvpQ+-@f`Q+h7JJ0ve{0m_cn*@
z(9i3bcA+_4FxUU%dUqesOyb0KlHd!IA%6
z@`g$wTb+94+H8eFaZl^y=pYXX4%&AjrTm3Op>~H1*^Ivdum<4V(Aw?QD(&I0J&U_{=R<52jrkoDMSl%bCQF-oiBi10KScl;!UE4`UN#Lwf+&a
z!n1XBbfyFA{{h+rmR?W){qD}zT)(QJp>a*SM1ppS