From 95705f2ee08c87b257b4c081d1e6ab13b9256248 Mon Sep 17 00:00:00 2001 From: rlazarini <remi.lazarini@cea.fr> Date: Wed, 22 Jan 2025 09:47:22 +0100 Subject: [PATCH] [Ivette] doc callgraph, correction --- .../src/dome/renderer/controls/displays.tsx | 2 +- .../plugins/callgraph/components/titlebar.tsx | 155 +++++++++++++++--- .../plugins/callgraph/components/toolbar.tsx | 110 +------------ 3 files changed, 138 insertions(+), 129 deletions(-) diff --git a/ivette/src/dome/renderer/controls/displays.tsx b/ivette/src/dome/renderer/controls/displays.tsx index 6967f5298ae..7e10cc7e444 100644 --- a/ivette/src/dome/renderer/controls/displays.tsx +++ b/ivette/src/dome/renderer/controls/displays.tsx @@ -68,7 +68,7 @@ export const LEDStatusList = [ export type LEDstatus = typeof LEDStatusList[number] | undefined; -export function jLEDstatus(js : string) : LEDstatus | undefined { +export function jLEDstatus(js : string) : LEDstatus { return LEDStatusList.find(elt => elt === js); } diff --git a/ivette/src/frama-c/plugins/callgraph/components/titlebar.tsx b/ivette/src/frama-c/plugins/callgraph/components/titlebar.tsx index f20498b8b74..6e6c40f6281 100644 --- a/ivette/src/frama-c/plugins/callgraph/components/titlebar.tsx +++ b/ivette/src/frama-c/plugins/callgraph/components/titlebar.tsx @@ -26,30 +26,20 @@ import * as Ivette from 'ivette'; import * as Dome from 'dome'; import { IconButton } from 'dome/controls/buttons'; -import { Button, Inset } from 'dome/frame/toolbars'; +import { Button, ButtonGroup, Inset } from 'dome/frame/toolbars'; import { HelpIcon } from 'dome/help'; +import * as Themes from 'dome/themes'; +import { ledTag, iconTag, Pattern } from 'dome/text/markdown'; import docCallgraph from '../callgraph.md?raw'; -import { DocShowNodesButton } from './toolbar'; -import { ledTag, iconTag } from 'dome/text/markdown'; - -export const TSButtonTag = { - pattern: /\[button-displaymode\]/g, - replace: (key: number, match?: RegExpExecArray) => { - return match ? <span key={key}>{DocShowNodesButton()}</span> : null; - } -}; - -export const selectBtnTag = { - pattern: /\[button-select\]/g, - replace: (key: number, match?: RegExpExecArray) => { - return match ? <Button key={key} label="Select" title={`Nodes selection`}/> - : null; - } -}; +import { ModeDisplay } from '../definitions'; +import { + IThreeStateButton, ThreeStateButton, TThreesButtonState +} from './threeStateButton'; /* -------------------------------------------------------------------------- */ /* --- Callgraph titlebar component --- */ /* -------------------------------------------------------------------------- */ + interface CallgraphTitleBarProps { /** Context menu to filtering nodes */ contextMenuItems: Dome.PopupMenuItem[], @@ -88,9 +78,136 @@ export function CallgraphTitleBar(props: CallgraphTitleBarProps): JSX.Element { <HelpIcon label='Callgraph' scrollTo={'callgraph'} - patterns={[iconTag, ledTag, selectBtnTag, TSButtonTag]} + patterns={[iconTag, ledTag, selectButtonTag, TSButtonTag]} >{ docCallgraph }</HelpIcon> <Inset /> </Ivette.TitleBar> ); } + +/* -------------------------------------------------------------------------- */ +/* --- Callgraph documentation --- */ +/* -------------------------------------------------------------------------- */ + +/** Pattern used for callraph documentation */ +const TSButtonTag: Pattern = { + pattern: /\[button-displaymode\]/g, + replace: (key: number, match?: RegExpExecArray) => { + return match ? <span key={key}>{DocShowNodesButton()}</span> : null; + } +}; + +/** Pattern used for callraph documentation */ +const selectButtonTag: Pattern = { + pattern: /\[button-select\]/g, + replace: (key: number, match?: RegExpExecArray) => { + return match ? <Button key={key} label="Select" title={`Nodes selection`}/> + : null; + } +}; + +interface ShowNodesButtonProps { + displayModeState: [ModeDisplay, (newValue: ModeDisplay) => void], + selectedParentsState: TThreesButtonState, + selectedChildrenState: TThreesButtonState, +} + +function ShowNodesButton(props: ShowNodesButtonProps): JSX.Element { + const { + displayModeState, selectedParentsState, selectedChildrenState + } = props; + const [ displayMode, setDisplayMode] = displayModeState; + + return ( + <ButtonGroup> + <Button + label='all' + title='show all nodes' + selected={displayMode === 'all'} + onClick={() => setDisplayMode("all")} + /> + <Button + label='linked' + title='only show nodes linked to the selected ones' + selected={displayMode === 'linked'} + onClick={() => setDisplayMode("linked")} + /> + <Button + label='selected' + title='only show selected nodes, their parents and their childrens' + selected={displayMode === 'selected'} + onClick={() => setDisplayMode("selected")} + /> + { displayMode === "selected" ? ( + <> + <ThreeStateButton + label={"Parents"} + title={"Choose how many parents you want to see."} + buttonState={selectedParentsState} + /> + <ThreeStateButton + label={"Children"} + title={"Choose how many children you want to see."} + buttonState={selectedChildrenState} + /> + </> + ) : <></> + } + </ButtonGroup> + ); +} + +export function DocShowNodesButton(): JSX.Element { + const displayModeState = React.useState<ModeDisplay>("all"); + const selectedParentsState = React.useState<IThreeStateButton>( + { active: false, max: false, value: 1 }); + const selectedChildrenState = React.useState<IThreeStateButton>( + { active: true, max: true, value: 1 }); + const [ displayMode, ] = displayModeState; + const [ parent, ] = selectedParentsState; + const [ children, ] = selectedChildrenState; + + const style = Themes.useStyle(); + const infosStyle = { color: style.getPropertyValue('--text-highlighted') }; + + function getDocSelected( + parent: IThreeStateButton, + children: IThreeStateButton + ):JSX.Element { + function getDocTSB(name: string, tsb: IThreeStateButton):string { + return !tsb.active ? '' : + tsb.max ? ` all ${name}` : + tsb.value > 0 ? + (tsb.value+' level'+(tsb.value > 1 ? 's':'')+` of ${name}`): + ""; + } + const p = getDocTSB('parents', parent); + const c = getDocTSB('children', children); + + return ( + <div style={infosStyle}> + Selected nodes displayed { (p || c) && " with " } + { p }{ p && c && " and " }{ c } + { !p && !c && " only " }. + </div> + ); + } + + const docAll = <div style={infosStyle}>All nodes displayed.</div>; + const docLinked = <div style={infosStyle}>Hide unlinked nodes.</div>; + const docSelected = getDocSelected(parent, children); + + return ( + <> + <ShowNodesButton + displayModeState={displayModeState} + selectedParentsState={selectedParentsState} + selectedChildrenState={selectedChildrenState} + /> + { displayMode === 'all' ? docAll : + displayMode === 'linked' ? docLinked : + docSelected + } + </> + ); +} diff --git a/ivette/src/frama-c/plugins/callgraph/components/toolbar.tsx b/ivette/src/frama-c/plugins/callgraph/components/toolbar.tsx index 9f495ab78da..59ea6ae387e 100644 --- a/ivette/src/frama-c/plugins/callgraph/components/toolbar.tsx +++ b/ivette/src/frama-c/plugins/callgraph/components/toolbar.tsx @@ -27,124 +27,16 @@ import * as Dome from 'dome'; import { State } from 'dome/data/states'; import { Spinner } from 'dome/controls/buttons'; import { ToolBar, ButtonGroup, Button, Filler } from 'dome/frame/toolbars'; -import * as Themes from 'dome/themes'; import { ModeDisplay, SelectedNodesData } from "frama-c/plugins/callgraph/definitions"; -import { - IThreeStateButton, ThreeStateButton, TThreesButtonState -} from "./threeStateButton"; +import { IThreeStateButton, ThreeStateButton } from "./threeStateButton"; /* -------------------------------------------------------------------------- */ /* --- Callgraph Toolsbar component --- */ /* -------------------------------------------------------------------------- */ -interface ShowNodesButtonProps { - displayModeState: [ModeDisplay, (newValue: ModeDisplay) => void], - selectedParentsState: TThreesButtonState, - selectedChildrenState: TThreesButtonState, -} - -function ShowNodesButton(props: ShowNodesButtonProps): JSX.Element { - const { - displayModeState, selectedParentsState, selectedChildrenState - } = props; - const [ displayMode, setDisplayMode] = displayModeState; - - return ( - <ButtonGroup> - <Button - label='all' - title='show all nodes' - selected={displayMode === 'all'} - onClick={() => setDisplayMode("all")} - /> - <Button - label='linked' - title='only show nodes linked to the selected ones' - selected={displayMode === 'linked'} - onClick={() => setDisplayMode("linked")} - /> - <Button - label='selected' - title='only show selected nodes, their parents and their childrens' - selected={displayMode === 'selected'} - onClick={() => setDisplayMode("selected")} - /> - { displayMode === "selected" ? ( - <> - <ThreeStateButton - label={"Parents"} - title={"Choose how many parents you want to see."} - buttonState={selectedParentsState} - /> - <ThreeStateButton - label={"Children"} - title={"Choose how many children you want to see."} - buttonState={selectedChildrenState} - /> - </> - ) : <></> - } - </ButtonGroup> - ); -} - -export function DocShowNodesButton(): JSX.Element { - const displayModeState = React.useState<ModeDisplay>("all"); - const selectedParentsState = React.useState<IThreeStateButton>( - { active: false, max: false, value: 1 }); - const selectedChildrenState = React.useState<IThreeStateButton>( - { active: true, max: true, value: 1 }); - const [ displayMode, ] = displayModeState; - const [ parent, ] = selectedParentsState; - const [ children, ] = selectedChildrenState; - - const style = Themes.useStyle(); - const infosStyle = { color: style.getPropertyValue('--text-highlighted') }; - - function getDocSelected( - parent: IThreeStateButton, - children: IThreeStateButton - ):JSX.Element { - function getDocTSB(name: string, tsb: IThreeStateButton):string { - return !tsb.active ? '' : - tsb.max ? ` all ${name}` : - tsb.value > 0 ? - (tsb.value+' level'+(tsb.value > 1 ? 's':'')+` of ${name}`): - ""; - } - const p = getDocTSB('parents', parent); - const c = getDocTSB('children', children); - - return ( - <div style={infosStyle}> - Selected nodes displayed { (p || c) && " with " } - { p }{ p && c && " and " }{ c } - { !p && !c && " only " }. - </div> - ); - } - - const docAll = <div style={infosStyle}>All nodes displayed.</div>; - const docLinked = <div style={infosStyle}>Hide unlinked nodes.</div>; - const docSelected = getDocSelected(parent, children); - - return ( - <> - <ShowNodesButton - displayModeState={displayModeState} - selectedParentsState={selectedParentsState} - selectedChildrenState={selectedChildrenState} - /> - { displayMode === 'all' ? docAll : - displayMode === 'linked' ? docLinked : - docSelected - } - </> - ); -} interface CallgraphToolsBarProps { /* eslint-disable max-len */ -- GitLab