From 4bd1dd6e8c2b8f0605f8b12c25c95a71baef06d1 Mon Sep 17 00:00:00 2001
From: rlazarini <remi.lazarini@cea.fr>
Date: Tue, 2 Jul 2024 11:06:58 +0200
Subject: [PATCH] [ivette] fix Eva sidebar

---
 .../src/dome/renderer/controls/gallery.json   |   2 +-
 ivette/src/dome/renderer/controls/icons.tsx   |   6 +-
 ivette/src/dome/renderer/controls/labels.tsx  |   8 +-
 ivette/src/dome/renderer/controls/style.css   |   2 +
 ivette/src/dome/renderer/layout/style.css     | 101 +++++++++++++-----
 .../frama-c/plugins/eva/api/general/index.ts  |  19 ----
 .../frama-c/plugins/eva/components/Form.tsx   |   6 +-
 ivette/src/frama-c/plugins/eva/style.css      |  91 +++++-----------
 src/plugins/eva/api/general_requests.ml       |   8 --
 9 files changed, 118 insertions(+), 125 deletions(-)

diff --git a/ivette/src/dome/renderer/controls/gallery.json b/ivette/src/dome/renderer/controls/gallery.json
index f2da558a323..36bc7aa8000 100644
--- a/ivette/src/dome/renderer/controls/gallery.json
+++ b/ivette/src/dome/renderer/controls/gallery.json
@@ -188,7 +188,7 @@
   "SPINNER": {
     "section": "Signs",
     "viewBox": "0 0 32 32",
-    "path": "M32 16c-0.040-2.089-0.493-4.172-1.331-6.077-0.834-1.906-2.046-3.633-3.533-5.060-1.486-1.428-3.248-2.557-5.156-3.302-1.906-0.748-3.956-1.105-5.981-1.061-2.025 0.040-4.042 0.48-5.885 1.292-1.845 0.809-3.517 1.983-4.898 3.424s-2.474 3.147-3.193 4.994c-0.722 1.846-1.067 3.829-1.023 5.79 0.040 1.961 0.468 3.911 1.254 5.694 0.784 1.784 1.921 3.401 3.316 4.736 1.394 1.336 3.046 2.391 4.832 3.085 1.785 0.697 3.701 1.028 5.598 0.985 1.897-0.040 3.78-0.455 5.502-1.216 1.723-0.759 3.285-1.859 4.574-3.208 1.29-1.348 2.308-2.945 2.977-4.67 0.407-1.046 0.684-2.137 0.829-3.244 0.039 0.002 0.078 0.004 0.118 0.004 1.105 0 2-0.895 2-2 0-0.056-0.003-0.112-0.007-0.167h0.007zM28.822 21.311c-0.733 1.663-1.796 3.169-3.099 4.412s-2.844 2.225-4.508 2.868c-1.663 0.646-3.447 0.952-5.215 0.909-1.769-0.041-3.519-0.429-5.119-1.14-1.602-0.708-3.053-1.734-4.25-2.991s-2.141-2.743-2.76-4.346c-0.621-1.603-0.913-3.319-0.871-5.024 0.041-1.705 0.417-3.388 1.102-4.928 0.683-1.541 1.672-2.937 2.883-4.088s2.642-2.058 4.184-2.652c1.542-0.596 3.192-0.875 4.832-0.833 1.641 0.041 3.257 0.404 4.736 1.064 1.48 0.658 2.82 1.609 3.926 2.774s1.975 2.54 2.543 4.021c0.57 1.481 0.837 3.064 0.794 4.641h0.007c-0.005 0.055-0.007 0.11-0.007 0.167 0 1.032 0.781 1.88 1.784 1.988-0.195 1.088-0.517 2.151-0.962 3.156z"
+    "path": "M16 9.472c-1.030 0-1.865-0.835-1.865-1.865v-5.596c0-1.030 0.835-1.865 1.865-1.865s1.865 0.835 1.865 1.865v5.596c0 1.030-0.835 1.865-1.865 1.865zM16 31.155c-0.644 0-1.166-0.522-1.166-1.166v-5.596c0-0.644 0.522-1.166 1.166-1.166s1.166 0.522 1.166 1.166v5.596c0 0.644-0.522 1.166-1.166 1.166zM11.805 10.48c-0.604 0-1.192-0.314-1.516-0.875l-2.798-4.846c-0.483-0.836-0.196-1.906 0.64-2.389s1.906-0.196 2.389 0.64l2.798 4.846c0.483 0.836 0.196 1.906-0.64 2.389-0.275 0.159-0.576 0.235-0.873 0.235zM22.995 29.164c-0.363 0-0.715-0.188-0.91-0.525l-2.798-4.846c-0.29-0.502-0.118-1.143 0.384-1.433s1.143-0.118 1.433 0.384l2.798 4.846c0.29 0.502 0.118 1.143-0.384 1.433-0.165 0.095-0.346 0.141-0.524 0.141zM8.729 13.436c-0.277 0-0.557-0.070-0.814-0.219l-4.846-2.798c-0.781-0.451-1.048-1.449-0.597-2.229s1.449-1.048 2.229-0.597l4.846 2.798c0.781 0.451 1.048 1.449 0.597 2.229-0.302 0.524-0.851 0.816-1.415 0.816zM28.114 23.927c-0.158 0-0.319-0.040-0.465-0.125l-4.846-2.798c-0.446-0.258-0.599-0.828-0.341-1.274s0.828-0.599 1.274-0.341l4.846 2.798c0.446 0.258 0.599 0.828 0.341 1.274-0.173 0.299-0.486 0.466-0.809 0.466zM7.607 17.515h-5.596c-0.837 0-1.516-0.678-1.516-1.515s0.678-1.515 1.516-1.515h5.596c0.837 0 1.516 0.678 1.516 1.515s-0.678 1.515-1.516 1.515zM29.989 16.933c-0 0 0 0 0 0h-5.596c-0.515-0-0.933-0.418-0.933-0.933s0.418-0.933 0.933-0.933c0 0 0 0 0 0h5.596c0.515 0 0.933 0.418 0.933 0.933s-0.418 0.933-0.933 0.933zM3.886 24.394c-0.483 0-0.954-0.251-1.213-0.7-0.386-0.669-0.157-1.525 0.512-1.911l4.846-2.798c0.669-0.387 1.525-0.157 1.911 0.512s0.157 1.525-0.512 1.911l-4.846 2.798c-0.22 0.127-0.461 0.188-0.698 0.188zM23.27 12.736c-0.322 0-0.636-0.167-0.809-0.466-0.258-0.446-0.105-1.016 0.341-1.274l4.846-2.798c0.446-0.257 1.016-0.105 1.274 0.341s0.105 1.016-0.341 1.274l-4.846 2.798c-0.147 0.085-0.307 0.125-0.465 0.125zM9.004 29.397c-0.218 0-0.438-0.055-0.64-0.172-0.613-0.354-0.823-1.138-0.469-1.752l2.798-4.846c0.354-0.613 1.138-0.823 1.752-0.469s0.823 1.138 0.469 1.752l-2.798 4.846c-0.237 0.411-0.668 0.641-1.112 0.641zM20.196 9.664c-0.158 0-0.319-0.040-0.465-0.125-0.446-0.258-0.599-0.828-0.341-1.274l2.798-4.846c0.258-0.446 0.828-0.599 1.274-0.341s0.599 0.828 0.341 1.274l-2.798 4.846c-0.173 0.299-0.486 0.466-0.809 0.466z"
   },
   "TRASH": {
     "section": "Desktop",
diff --git a/ivette/src/dome/renderer/controls/icons.tsx b/ivette/src/dome/renderer/controls/icons.tsx
index e6c26a8b62e..12e2b96a8a2 100644
--- a/ivette/src/dome/renderer/controls/icons.tsx
+++ b/ivette/src/dome/renderer/controls/icons.tsx
@@ -112,6 +112,8 @@ export interface IconProps extends SVGprops {
   fill?: string;
   /** Icon Kind. */
   kind?: IconKind;
+  /** Icon spinning */
+  spinning?: boolean;
   /** Click callback. */
   onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
   /** Right-Click callback. */
@@ -127,12 +129,14 @@ export function Icon(props: IconProps): JSX.Element {
     id, title, fill, kind='default',
     size, className, offset, style,
     visible = true, display = true,
-    onClick, onContextMenu,
+    spinning, onClick, onContextMenu,
   } = props;
+  const forceSpinning = Boolean(id === "SPINNER" && spinning === undefined);
   const divClass = classes(
     'dome-xIcon', `dome-xIcon-${kind}`,
     !visible && 'dome-control-hidden',
     !display && 'dome-control-erased',
+    (forceSpinning || spinning) && 'dome-xIcon-spinning',
     className
   );
   const divStyle = styles(fill && { fill }, style);
diff --git a/ivette/src/dome/renderer/controls/labels.tsx b/ivette/src/dome/renderer/controls/labels.tsx
index 37f07c8c8e5..3699284c779 100644
--- a/ivette/src/dome/renderer/controls/labels.tsx
+++ b/ivette/src/dome/renderer/controls/labels.tsx
@@ -51,6 +51,8 @@ export interface LabelProps {
   title?: string;
   /** Icon kind. */
   kind?: IconKind,
+  /** Icon spinning */
+  spinning?: boolean;
   /** Additional class. */
   className?: string;
   /** Additional class for icon. */
@@ -98,7 +100,11 @@ const makeLabel = (className: string) =>
         htmlFor={props.htmlFor}
       >
         {props.icon &&
-         <Icon title={props.title} id={props.icon} className={iconClass} />}
+          <Icon title={props.title}
+                id={props.icon}
+                className={iconClass}
+                spinning={props.spinning}
+          />}
         {props.label}
         {props.children}
       </label>
diff --git a/ivette/src/dome/renderer/controls/style.css b/ivette/src/dome/renderer/controls/style.css
index b3c4e6c2e57..2d21b7bcd7c 100644
--- a/ivette/src/dome/renderer/controls/style.css
+++ b/ivette/src/dome/renderer/controls/style.css
@@ -16,6 +16,7 @@
 /* -------------------------------------------------------------------------- */
 /* --- Styling Icons                                                      --- */
 /* -------------------------------------------------------------------------- */
+@keyframes dome-xIcon-spinner { to { rotate: 360deg; } }
 
 .dome-xIcon {
     flex: 0 0 auto ;
@@ -34,6 +35,7 @@
 .dome-xIcon-positive { fill: var(--positive-button-color) ; }
 .dome-xIcon-negative { fill: var(--negative-button-color) ; }
 .dome-xIcon-warning { fill: var(--warning-button-hover) ; }
+.dome-xIcon-spinning svg { animation: dome-xIcon-spinner 1.3s linear infinite; }
 
 .dome-xBadge {
     flex: 0 0 auto ;
diff --git a/ivette/src/dome/renderer/layout/style.css b/ivette/src/dome/renderer/layout/style.css
index 23b0be38db0..ad2e376cc8c 100644
--- a/ivette/src/dome/renderer/layout/style.css
+++ b/ivette/src/dome/renderer/layout/style.css
@@ -303,7 +303,15 @@
 /* Block Container */
 .dome-xForm-sidebar
 {
-    padding: 4px 4px 4px 12px;
+    padding: 4px 12px;
+    display: flex;
+    flex-wrap: nowrap;
+    flex-direction: column;
+
+    .dome-xForm-section {
+        left: auto; /* Cancel dome left placement */
+        &:not(:first-child) { margin-top: 15px ; }
+    }
 
     .dome-xForm-field-block,
     .dome-xForm-field-block .dome-xForm-label-actions,
@@ -312,41 +320,84 @@
         flex-wrap: wrap;
     }
 
-    .dome-xForm-field-block .dome-xForm-label{
-        margin-right: 15px;
-    }
-
-    .dome-xForm-field-block .dome-xForm-field-actions {
-        margin: auto 0;
-    }
-
-    .dome-xForm-field-block,
-    .dome-xForm-field-block > .dome-xForm-field {
+    .dome-xForm-field-block {
         max-width: 100%;
         align-items: center;
         margin: 2px 0;
-    }
-    .dome-xForm-field-block {
         justify-content: space-between;
         margin-top: 4px;
-    }
-    .dome-xForm-section {
-        left: auto; /* Cancel dome left placement */
-    }
-    .dome-xForm-section:not(:first-child) {
-        margin-top: 15px ;
-    }
-    .dome-xForm-field-block {
         position:relative;
         border-radius: 4px;
         background-color: var(--background-block-form);
         padding: 2px 8px 2px 2px;
+
+        .dome-xForm-label{
+          margin-right: 15px;
+          top: 0 !important; /* !important needed because of hard style */
+        }
+
+        .dome-xForm-field-actions { margin: auto 0; }
+
+        > .dome-xForm-field {
+            max-width: 100%;
+            align-items: center;
+            margin: 2px 0;
+        }
+    }
+
+    .dome-xForm-label { font-weight: bold; }
+    .message-emitter-category { margin-bottom: 10px; }
+    .dome-xForm-field { padding: 1px; }
+
+    .dome-xButton {
+      border: solid 1px;
+      border-color: var(--border);
+      color: var(--text-discrete);
+      background-color: transparent;
+      background-image: none;
+    }
+
+    .dome-xButton:hover {
+      cursor: pointer;
+      border-color: var(--text-highlighted);
+      color: var(--text-highlighted);
+      background-color: transparent;
+      background-image: none ;
     }
-    .dome-xForm-label {
-        font-weight: bold;
+
+    .dome-xButton-selected {
+      color: var(--text);
+      background-color: var(--checked-element);
+      background-image: none;
     }
-    .message-emitter-category {
-        margin-bottom: 10px;
+
+    .dome-xButton-selected:hover {
+      border-color: var(--text-highlighted);
+      background-image: none ;
+      background-color: var(--checked-element);
+      opacity: 0.5;
+    }
+
+    .dome-xSelect:hover {
+      background-color: var(--background-interaction);
+    }
+
+    select.dome-XSelect {
+      border: none;
+      min-width: 80px;
+      background-color: var(--background-interaction);
+      background-image: none;
+    }
+
+    input[type=number] {
+      background-color: var(--background-interaction);
+      color: var(--text);
+      width: 80px;
+      max-width: 100%;
+      margin-right: 0;
+      padding: 1px;
+      margin-right: 5px;
+      border: none;
     }
 }
 
diff --git a/ivette/src/frama-c/plugins/eva/api/general/index.ts b/ivette/src/frama-c/plugins/eva/api/general/index.ts
index 3fa6e0e86bc..00ed53b38e6 100644
--- a/ivette/src/frama-c/plugins/eva/api/general/index.ts
+++ b/ivette/src/frama-c/plugins/eva/api/general/index.ts
@@ -42,8 +42,6 @@ import { byDecl } from 'frama-c/kernel/api/ast';
 //@ts-ignore
 import { byMarker } from 'frama-c/kernel/api/ast';
 //@ts-ignore
-import { bySource } from 'frama-c/kernel/api/ast';
-//@ts-ignore
 import { decl } from 'frama-c/kernel/api/ast';
 //@ts-ignore
 import { declDefault } from 'frama-c/kernel/api/ast';
@@ -52,16 +50,10 @@ import { jDecl } from 'frama-c/kernel/api/ast';
 //@ts-ignore
 import { jMarker } from 'frama-c/kernel/api/ast';
 //@ts-ignore
-import { jSource } from 'frama-c/kernel/api/ast';
-//@ts-ignore
 import { marker } from 'frama-c/kernel/api/ast';
 //@ts-ignore
 import { markerDefault } from 'frama-c/kernel/api/ast';
 //@ts-ignore
-import { source } from 'frama-c/kernel/api/ast';
-//@ts-ignore
-import { sourceDefault } from 'frama-c/kernel/api/ast';
-//@ts-ignore
 import { byTag } from 'frama-c/kernel/api/data';
 //@ts-ignore
 import { jTag } from 'frama-c/kernel/api/data';
@@ -768,17 +760,6 @@ export const getStates: Server.GetRequest<
   [ string, string, string ][]
   >= getStates_internal;
 
-const getCurrentLoc_internal: Server.GetRequest<null,source> = {
-  kind: Server.RqKind.GET,
-  name: 'plugins.eva.general.getCurrentLoc',
-  input: Json.jNull,
-  output: jSource,
-  fallback: sourceDefault,
-  signals: [],
-};
-/** Get current location */
-export const getCurrentLoc: Server.GetRequest<null,source>= getCurrentLoc_internal;
-
 /** Signal for state [`eva`](#eva)  */
 export const signalEva: Server.Signal = {
   name: 'plugins.eva.general.signalEva',
diff --git a/ivette/src/frama-c/plugins/eva/components/Form.tsx b/ivette/src/frama-c/plugins/eva/components/Form.tsx
index 88bf5fe38b3..f188f4369a7 100644
--- a/ivette/src/frama-c/plugins/eva/components/Form.tsx
+++ b/ivette/src/frama-c/plugins/eva/components/Form.tsx
@@ -100,9 +100,9 @@ export function RadioFieldList(
 }
 
 
-/** ***************************************************************************
-*
-******************************************************************************/
+/* -------------------------------------------------------------------------- */
+/* ---Eva Form                                                            --- */
+/* -------------------------------------------------------------------------- */
 interface EvaFormOptionsProps {
   fields: EvaDef.EvaFormProps;
 }
diff --git a/ivette/src/frama-c/plugins/eva/style.css b/ivette/src/frama-c/plugins/eva/style.css
index d7602988587..6b5a6dbfa8b 100644
--- a/ivette/src/frama-c/plugins/eva/style.css
+++ b/ivette/src/frama-c/plugins/eva/style.css
@@ -4,7 +4,6 @@
 
 :root {
   --eva-min-width: 90px;
-  --eva-shadow-warning: darkorange;
 }
 
 
@@ -338,29 +337,20 @@ tr:first-of-type > .eva-table-callsite-box {
 /* -------------------------------------------------------------------------- */
 /* --- Sidebar Eva                                                        --- */
 /* -------------------------------------------------------------------------- */
-@keyframes eva-spinner {
-  from {
-      transform: rotate(-90deg);
-  } to {
-      transform: rotate(270deg);
-  }
-}
 
 /* ------------------ */
 /* --- Tools Eva  --- */
 .eva-tools {
-  display: block;
   position: sticky;
   top: 0px;
   z-index: 10;
   background-color: var(--background-profound);
   padding: 5px;
-  border: 5px outset;
-  border-color: rgb(from var(--border-discrete) r g b / .7);
-  margin: 10px;
+  border-bottom: solid 1px var(--border-discrete);
   display: flex;
   flex-wrap: wrap;
   justify-content: space-between;
+  align-items: center;
 
   .eva-tools-actions {
     display: flex;
@@ -374,9 +364,7 @@ tr:first-of-type > .eva-table-callsite-box {
     cursor: pointer;
     color: var(--background-button-hover);
   }
-  .eva-status-icon.eva-computing {
-    transform: rotate(90deg);
-    animation: eva-spinner .9s linear infinite;
+  .eva-status-icon.eva-computing svg {
     fill: var(--eva-alarms-unknown);
   }
   .eva-status-icon.eva-computed { fill: var(--eva-alarms-true); }
@@ -389,11 +377,6 @@ tr:first-of-type > .eva-table-callsite-box {
 /* ------------------ */
 /* --- Form Eva   --- */
 .eva-form {
-  padding: 4px 12px;
-  display: flex;
-  flex-wrap: nowrap;
-  flex-direction: column;
-
   >label.dome-xCheckbox{
     display: flex;
     flex-direction: row-reverse;
@@ -424,13 +407,9 @@ tr:first-of-type > .eva-table-callsite-box {
   }
 
   .dome-xForm-field-actions { min-width: 42px; }
-
-  .dome-xCheckbox { overflow: hidden; }
-
   .dome-xForm-field {
-    padding: 1px;
-
     >input[type=radio] { display: none; }
+
     &:has(> input[type=radio]) {
       min-width: 0px;
       border-radius: 2em 2em;
@@ -442,59 +421,37 @@ tr:first-of-type > .eva-table-callsite-box {
       border-color: var(--border);
       cursor:default;
     }
-  }
-
-  .dome-xButton,
-  .dome-xForm-field:has(> input[type=radio]) {
-    border: solid 1px;
-    border-color: var(--border);
-    color: var(--text-discrete);
-    background-color: transparent;
-    background-image: none;
-  }
 
-  .dome-xButton:hover,
-  .dome-xForm-field:has(> input[type=radio]):hover {
-    cursor: pointer;
-    border-color: var(--text-highlighted);
-    color: var(--text-highlighted);
-    background-color: transparent;
-    background-image: none ;
-  }
+    &:has(> input[type=radio]) {
+      border: solid 1px;
+      border-color: var(--border);
+      color: var(--text-discrete);
+      background-color: transparent;
+      background-image: none;
+    }
 
-  .dome-xButton-selected,
-  .dome-xForm-field:has(> input[type=radio]:checked) {
-    color: var(--text);
-    background-color: var(--checked-element);
-    background-image: none;
-  }
+    &:has(> input[type=radio]):hover {
+      cursor: pointer;
+      border-color: var(--text-highlighted);
+      color: var(--text-highlighted);
+      background-color: transparent;
+      background-image: none ;
+    }
 
-  .dome-xButton-selected:hover {
-    border-color: var(--text-highlighted);
-    background-image: none ;
-    background-color: var(--checked-element);
-    opacity: 0.5;
+    &:has(> input[type=radio]:checked) {
+      color: var(--text);
+      background-color: var(--checked-element);
+      background-image: none;
+    }
   }
 
   .dome-xForm-field-block:has(> .dome-xForm-field .eva-field-modified) {
-    box-shadow: -4px 0px 4px var(--eva-shadow-warning);
+    box-shadow: -4px 0px 4px var(--warning);
   }
 
   .dome-xForm-field-block:has(.dome-xForm-field .hidden-field) {
     display: none;
   }
-
-  input[type=number] {
-    background-color: var(--background-interaction);
-    color: var(--text);
-    text-align: right;
-    width: 80px;
-    max-width: 100%;
-    margin-right: 0;
-    padding: 1px;
-    margin-right: 5px;
-    border: none;
-  }
 }
 
 /* -------------------------------------------------------------------------- */
diff --git a/src/plugins/eva/api/general_requests.ml b/src/plugins/eva/api/general_requests.ml
index 536264d211f..7eff4764e62 100644
--- a/src/plugins/eva/api/general_requests.ml
+++ b/src/plugins/eva/api/general_requests.ml
@@ -872,14 +872,6 @@ let () = Request.register ~package
     ~signals:[computation_signal]
     get_states
 
-let () = Request.register ~package
-    ~kind:`GET ~name:"getCurrentLoc"
-    ~descr:(Md.plain "Get current location")
-    ~input:(module Data.Junit)
-    ~output:(module Kernel_ast.Position)
-    ~signals:[]
-    (fun () -> fst (Current_loc.get ()))
-
 (* -------------------------------------------------------------------------- *)
 (* --- Eva Options                                                        --- *)
 (* -------------------------------------------------------------------------- *)
-- 
GitLab