From 66fb11290a21e821c6749c9a126408843c8dbb92 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Mon, 11 Sep 2023 16:01:33 +0200
Subject: [PATCH] [dom] icon kinds

---
 ivette/src/dome/renderer/controls/icons.tsx  |  7 ++++++-
 ivette/src/dome/renderer/controls/labels.tsx | 22 +++++++++++++++-----
 ivette/src/dome/renderer/controls/style.css  | 11 +++++-----
 3 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/ivette/src/dome/renderer/controls/icons.tsx b/ivette/src/dome/renderer/controls/icons.tsx
index 024e708ffaf..5759f151e36 100644
--- a/ivette/src/dome/renderer/controls/icons.tsx
+++ b/ivette/src/dome/renderer/controls/icons.tsx
@@ -96,6 +96,8 @@ export function SVG(props: SVGprops): null | JSX.Element {
 // --- Icon Component
 // --------------------------------------------------------------------------
 
+export type IconKind = 'disabled' | 'warning' | 'positive' | 'negative';
+
 /** Icon Component Properties */
 export interface IconProps extends SVGprops {
   /** Additional class name(s). */
@@ -108,6 +110,8 @@ export interface IconProps extends SVGprops {
   style?: React.CSSProperties;
   /** Fill style property. */
   fill?: string;
+  /** Icon Kind. */
+  kind?: IconKind;
   /** Click callback. */
   onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
 }
@@ -118,7 +122,7 @@ export interface IconProps extends SVGprops {
  */
 export function Icon(props: IconProps): JSX.Element {
   const {
-    id, title, onClick, fill,
+    id, title, onClick, fill, kind,
     size, className, offset, style,
     visible = true, display = true,
   } = props;
@@ -126,6 +130,7 @@ export function Icon(props: IconProps): JSX.Element {
     'dome-xIcon',
     !visible && 'dome-control-hidden',
     !display && 'dome-control-erased',
+    kind && ('dome-xIcon-' + kind),
     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 9bf33338966..70e4e75c82b 100644
--- a/ivette/src/dome/renderer/controls/labels.tsx
+++ b/ivette/src/dome/renderer/controls/labels.tsx
@@ -38,6 +38,9 @@ import './style.css';
 // --- Generic Label
 // --------------------------------------------------------------------------
 
+export type IconKind =
+  'default' | 'disabled' | 'warning' | 'positive' | 'negative';
+
 /** Labels support fowarding refs to their inner [<label/>] element. */
 export interface LabelProps {
   /** Text of the label. Prepend to other children elements. */
@@ -46,8 +49,12 @@ export interface LabelProps {
   icon?: string;
   /** Tool-tip description. */
   title?: string;
+  /** Icon kind. */
+  kind?: IconKind,
   /** Additional class. */
   className?: string;
+  /** Additional class for icon. */
+  iconClassName?: string;
   /** Additional style. */
   style?: React.CSSProperties;
   /** If `false`, do not display the label. Default to `true`. */
@@ -64,15 +71,19 @@ export interface LabelProps {
 
 const makeLabel = (className: string) =>
   function Label(
-      props: LabelProps,
-      ref: LegacyRef<HTMLLabelElement> | undefined
-    ): JSX.Element {
-    const { display = true } = props;
+    props: LabelProps,
+    ref: LegacyRef<HTMLLabelElement> | undefined
+  ): JSX.Element {
+    const { display = true, kind = 'default' } = props;
     const allClasses = classes(
       className,
       !display && 'dome-control-erased',
       props.className,
     );
+    const iconClass = classes(
+      'dome-xIcon-' + kind,
+      props.iconClassName,
+    );
     return (
       <label
         ref={ref}
@@ -83,7 +94,8 @@ const makeLabel = (className: string) =>
         onDoubleClick={props.onDoubleClick}
         onContextMenu={props.onContextMenu}
       >
-        {props.icon && <Icon title={props.title} id={props.icon} />}
+        {props.icon &&
+         <Icon title={props.title} id={props.icon} className={iconClass} />}
         {props.label}
         {props.children}
       </label>
diff --git a/ivette/src/dome/renderer/controls/style.css b/ivette/src/dome/renderer/controls/style.css
index 4d04c9be879..a5cd05a7c0e 100644
--- a/ivette/src/dome/renderer/controls/style.css
+++ b/ivette/src/dome/renderer/controls/style.css
@@ -9,11 +9,6 @@
     white-space: nowrap ;
 }
 
-.dome-xLabel .dome-xIcon {
-    margin-right: 4px ;
-    fill: var(--info-text-discrete);
-}
-
 .dome-xLabel.dome-text-descr {
     overflow: auto ;
     white-space: wrap ;
@@ -34,6 +29,12 @@
     position:relative ;
 }
 
+.dome-xIcon-default { fill: var(--var-info-text-discrete) ; }
+.dome-xIcon-positive { fill: var(--positive-button-color) ; }
+.dome-xIcon-negative { fill: var(--negative-button-color) ; }
+.dome-xIcon-warning { fill: var(--warning-button-color) ; }
+.dome-xIcon-disabled { fill: var(--background-intense) ; }
+
 .dome-xBadge {
     flex: 0 0 auto ;
     display: inline ;
-- 
GitLab