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