diff --git a/ivette/src/frama-c/plugins/dive/graph.tsx b/ivette/src/frama-c/plugins/dive/graph.tsx index d2bb8b1e2c538cc837d454bf0e360e0d0565c097..1b3b7fa1065716e00b6b0122cf16df21b80d992c 100644 --- a/ivette/src/frama-c/plugins/dive/graph.tsx +++ b/ivette/src/frama-c/plugins/dive/graph.tsx @@ -47,7 +47,8 @@ import { Space } from 'dome/frame/toolbars'; import '@fortawesome/fontawesome-free/js/all'; -import { EvaReady } from 'frama-c/plugins/eva/components/AnalysisStatus'; +import { EvaReady, EvaStatus } + from 'frama-c/plugins/eva/components/AnalysisStatus'; import Legend from './legend'; import style from './style.json'; import layouts from './layouts.json'; @@ -745,6 +746,8 @@ export default function GraphComponent(): JSX.Element { onClick={() => graph.current?.clear()} title="Clear the graph" /> + <Space /> + <EvaStatus /> </Ivette.TitleBar> <EvaReady> <> diff --git a/ivette/src/frama-c/plugins/dive/tree.tsx b/ivette/src/frama-c/plugins/dive/tree.tsx index e522cddb910a1d8ccf7d3155c53f6a915312d04b..1761bb0a60a481162121ef3c458ce8dfe50030cc 100644 --- a/ivette/src/frama-c/plugins/dive/tree.tsx +++ b/ivette/src/frama-c/plugins/dive/tree.tsx @@ -25,12 +25,14 @@ import React, { useEffect } from 'react'; import { Icon } from 'dome/controls/icons'; import { classes } from 'dome/misc/utils'; import { IconButton } from 'dome/controls/buttons'; +import { Inset } from 'dome/frame/toolbars'; import * as Ivette from 'ivette'; import * as Server from 'frama-c/server'; import * as States from 'frama-c/states'; -import { EvaReady } from 'frama-c/plugins/eva/components/AnalysisStatus'; +import { EvaReady, EvaStatus } + from 'frama-c/plugins/eva/components/AnalysisStatus'; import * as API from './api'; import type { marker } from 'frama-c/kernel/api/ast'; @@ -233,6 +235,8 @@ export default function TreeComponent(): JSX.Element { onClick={() => setRoot(null)} title="Clear the graph" /> + <Inset /> + <EvaStatus /> </Ivette.TitleBar> <EvaReady> { diff --git a/ivette/src/frama-c/plugins/eva/Coverage.tsx b/ivette/src/frama-c/plugins/eva/Coverage.tsx index 92c6c2050ead5a3f8b68bd9f141317f548be8d98..b8e6a693205730af452b685f10f8ed48599cc822 100644 --- a/ivette/src/frama-c/plugins/eva/Coverage.tsx +++ b/ivette/src/frama-c/plugins/eva/Coverage.tsx @@ -29,6 +29,7 @@ import * as States from 'frama-c/states'; import * as Eva from 'frama-c/plugins/eva/api/general'; import CoverageMeter, { percent } from './CoverageMeter'; +import { EvaStatus } from './components/AnalysisStatus'; type stats = Eva.functionStatsData; @@ -165,7 +166,9 @@ export function CoverageTable(): JSX.Element { export default function CoverageComponent(): JSX.Element { return ( <> - <Ivette.TitleBar /> + <Ivette.TitleBar> + <EvaStatus /> + </Ivette.TitleBar> <CoverageTable /> </> ); diff --git a/ivette/src/frama-c/plugins/eva/DomainStates.tsx b/ivette/src/frama-c/plugins/eva/DomainStates.tsx index bad51ee797ca495998950b8e4c40b0eb6f1546fc..e1451da587d0a8e78022c8720a586c57440d3b9e 100644 --- a/ivette/src/frama-c/plugins/eva/DomainStates.tsx +++ b/ivette/src/frama-c/plugins/eva/DomainStates.tsx @@ -31,6 +31,7 @@ import { HSplit } from 'dome/layout/splitters'; import { Text } from 'frama-c/richtext'; import { Checkbox, SelectMenu } from 'dome/controls/buttons'; import { Label } from 'dome/controls/labels'; +import { EvaStatus } from './components/AnalysisStatus'; const globalSelectedDomain = new GlobalState(""); const globalFilter = new GlobalState(true); @@ -111,7 +112,9 @@ export function EvaStates(): JSX.Element { function EvaStatesComponent(): JSX.Element { return ( <> - <Ivette.TitleBar /> + <Ivette.TitleBar> + <EvaStatus /> + </Ivette.TitleBar> <EvaStates /> </> ); diff --git a/ivette/src/frama-c/plugins/eva/Summary.tsx b/ivette/src/frama-c/plugins/eva/Summary.tsx index 4a29d895d5732352868ffa74302c51d4b79883c3..f31f0335a9f805763f53bb2c79ec13d03d25ce40 100644 --- a/ivette/src/frama-c/plugins/eva/Summary.tsx +++ b/ivette/src/frama-c/plugins/eva/Summary.tsx @@ -28,7 +28,7 @@ import * as Eva from 'frama-c/plugins/eva/api/general'; import CoverageMeter, { percent } from './CoverageMeter'; import './style_summary.css'; -import { EvaReady } from 'frama-c/plugins/eva/components/AnalysisStatus'; +import { EvaReady, EvaStatus } from './components/AnalysisStatus'; function CoverageTable(data: Eva.programStatsType): JSX.Element { const { progFunCoverage: functions, progStmtCoverage: statements } = data; @@ -223,7 +223,9 @@ export function EvaSummary(): JSX.Element { function EvaSummaryComponent(): JSX.Element { return ( <> - <Ivette.TitleBar /> + <Ivette.TitleBar> + <EvaStatus /> + </Ivette.TitleBar> <EvaReady> <EvaSummary /> </EvaReady> diff --git a/ivette/src/frama-c/plugins/eva/components/AnalysisStatus.tsx b/ivette/src/frama-c/plugins/eva/components/AnalysisStatus.tsx index 600c65ca4a1e839e9e897b198861acb339629c65..9d7c1bf0a302194b9ed66841f7e7f1588e949ad8 100644 --- a/ivette/src/frama-c/plugins/eva/components/AnalysisStatus.tsx +++ b/ivette/src/frama-c/plugins/eva/components/AnalysisStatus.tsx @@ -32,8 +32,8 @@ interface EvaReadyProps { } interface EvaStatusProp { - iconSize: number; - showStatus?: Eva.computationStateType[]; + iconSize?: number; // default size for titlebar + showStatus?: Eva.computationStateType[]; // all status shown by default } interface StatusIconProp { @@ -56,7 +56,7 @@ function StatusIcon(props: StatusIconProp):JSX.Element { } export function EvaStatus(props: EvaStatusProp): JSX.Element | null { - const { iconSize, showStatus } = props; + const { iconSize = 12, showStatus } = props; const status = useSyncValue(Eva.computationState); if(!showStatus || status && showStatus?.includes(status)) { diff --git a/ivette/src/frama-c/plugins/eva/components/Tools.tsx b/ivette/src/frama-c/plugins/eva/components/Tools.tsx index f371da2bfa2be9217f96accfd5f70e8912d63250..01d9340ce68f8d7fcae65ae981a394db46d49383 100644 --- a/ivette/src/frama-c/plugins/eva/components/Tools.tsx +++ b/ivette/src/frama-c/plugins/eva/components/Tools.tsx @@ -23,13 +23,11 @@ import React from 'react'; import { IconButton } from 'dome/controls/buttons'; import { Hbox } from 'dome/layout/boxes'; -// import { Icon } from 'dome/controls/icons'; import * as Forms from 'dome/layout/forms'; import * as Server from 'frama-c/server'; import * as States from 'frama-c/states'; import * as Eva from 'frama-c/plugins/eva/api/general'; import { EvaStatus } from 'frama-c/plugins/eva/components/AnalysisStatus'; -// import * as EvaReady from 'frama-c/plugins/eva/EvaReady'; export interface EvaToolsProps { @@ -37,25 +35,6 @@ export interface EvaToolsProps { iconSize: number; } -// function EvaState( -// state: Eva.computationStateType | undefined -// ): JSX.Element { -// let id, title; -// switch(state) { -// case "computed": id="CHECK"; title="Computed"; break; -// case "aborted": id="CROSS"; title="Aborted"; break; -// case "not_computed": id="CROSS"; title="Not computed"; break; -// case "computing": id="SPINNER"; title="Computing"; break; -// default: id="CROSS"; title="Status undefined"; break; -// } -// return <Icon -// id={id} -// title={title} -// className={"eva-status-icon eva-"+state} -// size={18} -// />; -// } - export default function EvaTools( props: EvaToolsProps ): JSX.Element { diff --git a/ivette/src/frama-c/plugins/eva/style.css b/ivette/src/frama-c/plugins/eva/style.css index 5096365be5e416aca544f153afd8d324c13dd525..41fb3879bf8948076ed5433ae54c9352183ae3ab 100644 --- a/ivette/src/frama-c/plugins/eva/style.css +++ b/ivette/src/frama-c/plugins/eva/style.css @@ -500,6 +500,11 @@ tr:first-of-type > .eva-table-callsite-box { max-width: 90%; max-height: 200px; fill: var(--info-text-discrete); + cursor: default; +} + +.labview-titlebar .dome-xIcon.eva-status-icon { + cursor: default; } .eva-status-computing { diff --git a/ivette/src/frama-c/plugins/eva/valuetable.tsx b/ivette/src/frama-c/plugins/eva/valuetable.tsx index bbe4235beadcba3e00d7905176b3ed74361f1749..ce863e2b53899c9dabe72b9b86edd3563c82e695 100644 --- a/ivette/src/frama-c/plugins/eva/valuetable.tsx +++ b/ivette/src/frama-c/plugins/eva/valuetable.tsx @@ -32,10 +32,7 @@ import * as Server from 'frama-c/server'; import * as Ast from 'frama-c/kernel/api/ast'; import * as Eva from 'frama-c/plugins/eva/api/general'; import * as Values from 'frama-c/plugins/eva/api/values'; -import { - EvaReady, - EvaStatus -} from 'frama-c/plugins/eva/components/AnalysisStatus'; +import { EvaReady, EvaStatus } from './components/AnalysisStatus'; import { classes } from 'dome/misc/utils'; import { Icon } from 'dome/controls/icons'; @@ -1141,13 +1138,14 @@ function EvaTable(): JSX.Element { return ( <> <Ivette.TitleBar> - <EvaStatus iconSize={12} showStatus={["computed", "aborted"]}/> <IconButton icon="ITEMS.LIST" title="Show values by callstack by default" selected={showCallstacks} onClick={flipCallstacks} /> + <Inset /> + <EvaStatus /> </Ivette.TitleBar> <EvaReady> <div className="eva-functions-section">