From e8800cf38718d9f12dc8591178adfbbb5d23e0d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Wed, 5 Jan 2022 10:01:58 +0100
Subject: [PATCH] [dome/qsplitter] in-range dragging

---
 ivette/src/dome/renderer/layout/qsplit.tsx | 12 ++++++++----
 ivette/src/dome/renderer/layout/style.css  |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/ivette/src/dome/renderer/layout/qsplit.tsx b/ivette/src/dome/renderer/layout/qsplit.tsx
index c8e4a9f434a..6577bbdb8e2 100644
--- a/ivette/src/dome/renderer/layout/qsplit.tsx
+++ b/ivette/src/dome/renderer/layout/qsplit.tsx
@@ -166,8 +166,12 @@ const DISPLAY = (
 
 interface QSplitEngineProps extends QSplitProps { size: Size }
 
+const inRange = (P: number, D: number) => Math.max(0, Math.min(P, D));
+
+const getRatio = (P: number, D: number) => inRange(P, D) / D;
+
 const getPosition = (d: Dragging, D: number, R: number) =>
-  d ? getDragPosition(d) : Math.round(D * R);
+  d ? inRange(getDragPosition(d), D) : Math.round(D * R);
 
 function QSplitEngine(props: QSplitEngineProps) {
   const [dragX, setDragX] = React.useState<Dragging>();
@@ -178,10 +182,10 @@ function QSplitEngine(props: QSplitEngineProps) {
   const { A, B, C, D, H = 0.5, V = 0.5, size, setPosition } = props;
   const { width, height } = size;
   const setX = React.useCallback((X: number) => {
-    if (setPosition) setPosition(X / width, V);
+    if (setPosition) setPosition(getRatio(X, width), V);
   }, [setPosition, width, V]);
   const setY = React.useCallback((Y: number) => {
-    if (setPosition) setPosition(H, Y / height);
+    if (setPosition) setPosition(H, getRatio(Y, height));
   }, [setPosition, height, H]);
   const resetX = React.useCallback(() => {
     if (setPosition) setPosition(0.5, V);
@@ -327,7 +331,7 @@ export interface QPaneProps {
 
 export function QPane(props: QPaneProps) {
   const layout = React.useContext(QSplitContext);
-  const QPANE = Utils.classes('dome-xQPane', props.className);
+  const QPANE = Utils.classes('dome-xSplitter-pane', props.className);
   const QSTYLE = Utils.styles(props.style, layout?.get(props.id) ?? NODISPLAY);
   return <div className={QPANE} style={QSTYLE}>{props.children}</div>;
 }
diff --git a/ivette/src/dome/renderer/layout/style.css b/ivette/src/dome/renderer/layout/style.css
index 01fade1463e..aa5b34cf3a8 100644
--- a/ivette/src/dome/renderer/layout/style.css
+++ b/ivette/src/dome/renderer/layout/style.css
@@ -191,7 +191,7 @@
     background: var(--splitter) ;
 }
 
-.dome-xQPane
+.dome-xSplitter-pane
 {
     position: absolute;
     overflow: hidden;
-- 
GitLab