diff --git a/ivette/src/frama-c/plugins/eva/style.css b/ivette/src/frama-c/plugins/eva/style.css index ad27a112d3243d22936a0b0172fe20a90c433c4c..86685b4e842d53e32432a8f1a4f3aebd98958e15 100644 --- a/ivette/src/frama-c/plugins/eva/style.css +++ b/ivette/src/frama-c/plugins/eva/style.css @@ -106,9 +106,7 @@ .eva-stmt { color: var(--info-text); - text-select: none; font-weight: normal; - margin-left: 0.2em; } /* -------------------------------------------------------------------------- */ @@ -161,10 +159,6 @@ background-color: var(--background-alterning-even); } -.eva-table tr:nth-child(3) { - font-style: italic; -} - .eva-table-alarm { border-bottom: thin solid var(--border); } @@ -195,6 +189,15 @@ background: var(--eva-probes-pinned-focused); } +.eva-header-after-both { + display: flex; + justify-content: center; +} + +.eva-italic { + font-style: italic; +} + /* -------------------------------------------------------------------------- */ /* --- Table Callsite Boxes --- */ /* -------------------------------------------------------------------------- */ diff --git a/ivette/src/frama-c/plugins/eva/valuetable.tsx b/ivette/src/frama-c/plugins/eva/valuetable.tsx index 0d41d734638fe693facc9eefd56d0ce5e066b1df..293a151c1de566304dbc1fea33fd2805cf3209ff 100644 --- a/ivette/src/frama-c/plugins/eva/valuetable.tsx +++ b/ivette/src/frama-c/plugins/eva/valuetable.tsx @@ -381,9 +381,9 @@ function ProbeDescr(props: ProbeDescrProps): JSX.Element[] { } const both = (): JSX.Element => - <div style={{ display: 'flex', justifyContent: 'center' }}> + <div className='eva-header-after-both'> {'After '} - <div style={{ color: 'var(--info-text)' }}>{'(Then|Else)'}</div> + <div className='eva-stmt'>{'(Then|Else)'}</div> </div>; const elements: JSX.Element[] = []; @@ -411,12 +411,13 @@ interface ProbeValuesProps { status: MarkerStatus; state: StateToDisplay; addLoc: (loc: Location) => void; - selectedClass?: string; + isSelected: boolean; + summaryOnly: boolean; + // selectedClass?: string; } function ProbeValues(props: ProbeValuesProps): Request<callstack, JSX.Element> { - const { probe, summary, state, selectedClass = '', addLoc } = props; - const className = classes('eva-table-values', selectedClass); + const { probe, summary, state, addLoc, isSelected, summaryOnly } = props; const summaryStatus = getAlarmStatus(summary.vBefore?.alarms); // Building common parts @@ -439,6 +440,9 @@ function ProbeValues(props: ProbeValuesProps): Request<callstack, JSX.Element> { return async (callstack: callstack): Promise<JSX.Element> => { const evaluation = await probe.evaluate(callstack); const { vBefore, vAfter, vThen, vElse } = evaluation; + const selected = isSelected && callstack !== 'Summary' ? 'eva-focused' : ''; + const font = summaryOnly && callstack === 'Summary' ? 'eva-italic' : ''; + const className = classes('eva-table-values', selected, font); function td(e: Values.evaluation): JSX.Element { const status = getAlarmStatus(e.alarms); const alarmClass = classes('eva-cell-alarms', `eva-alarm-${status}`); @@ -447,15 +451,13 @@ function ProbeValues(props: ProbeValuesProps): Request<callstack, JSX.Element> { const align = e.value.includes('\n') ? 'left' : 'center'; const alignClass = `eva-table-values-${align}`; const width = summaryStatus !== 'none' ? 'eva-table-values-alarms' : ''; + const c = classes(className, alignClass, width); return ( <> - <td - className={classes(className, alignClass, width)} - onContextMenu={onContextMenu(e)} - > + <td className={c} onContextMenu={onContextMenu(e)}> <span >{e.value}</span> </td> - <td className={classes('eva-table-alarm', selectedClass)}> + <td className={classes('eva-table-alarm', selected)}> <Icon className={alarmClass} size={10} title={title} id="WARNING" /> </td> </> @@ -509,8 +511,9 @@ async function FunctionSection(props: FunctionProps): Promise<JSX.Element> { /* Compute relevant callstacks */ const markers = Array.from(props.markers.keys()); const callstacks = byCallstacks ? (await getCS(markers) ?? []) : []; + const summaryOnly = callstacks.length === 1; - interface Data { probe: Probe; summary: Evaluation; status: MarkerStatus }; + interface Data { probe: Probe; summary: Evaluation; status: MarkerStatus } const entries = Array.from(props.markers.entries()); const probes = await Promise.all(entries.map(async ([ target, status ]) => { const probe = await props.getProbe({ target, fct }); @@ -532,15 +535,14 @@ async function FunctionSection(props: FunctionProps): Promise<JSX.Element> { const onClick = (c: callstack): () => void => () => props.selectCallstack(c); function build(d: Data, c: callstack): Promise<JSX.Element> { const isSelected = isSelectedCallstack(c); - const selector = isSelected && c !== 'Summary'; - const selectedClass = selector ? 'eva-focused' : ''; - const valuesProps = { ...d, state, addLoc, selectedClass }; + const valuesProps = { ...d, state, addLoc, isSelected, summaryOnly }; return ProbeValues(valuesProps)(c); } const summary = await Promise.all(probes.map((d) => build(d, 'Summary'))); const summCall = await CallsiteCell({ callstack: 'Summary', getCallsites }); const values = await Promise.all(callstacks.map(async (callstack, n) => { + if (summaryOnly) return <></>; const isSelected = isSelectedCallstack(callstack); const selector = isSelected && callstack !== 'Summary'; const selectedClass = selector ? 'eva-focused' : '';