Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(plugin): support filterFrag array and use for someip methods #187

Merged
merged 1 commit into from
Jan 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -970,7 +970,7 @@
"ws": "^8.13.0"
},
"optionalDependencies": {
"node-adlt": "0.49.0"
"node-adlt": "0.50.0"
},
"commitlint": {
"extends": [
Expand Down
114 changes: 74 additions & 40 deletions src/adltPlugin.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copyright(c) Matthias Behr, 2022
// copyright(c) Matthias Behr, 2022-2024

import * as vscode from 'vscode'
import * as util from './util'
Expand All @@ -9,6 +9,15 @@ import { DltFilter, DltFilterType } from './dltFilter'

// let treeNode = { , label: `SOME/IP Decoder`, uri: this.uri, parent: this.pluginTreeNode, children: [], tooltip: undefined, iconPath: new vscode.ThemeIcon('group-by-ref-type') }; // or symbol-interface?

// one dimensional settings plus optional reportOptions object
type FilterFrag = {
[key: string]: any
} /*& {
reportOptions?: {
[key: string]: any
}
}*/

export class AdltPluginChildNode implements TreeViewNode {
readonly id: string // unique id
label: string
Expand All @@ -22,7 +31,7 @@ export class AdltPluginChildNode implements TreeViewNode {
cmdCtx: any | undefined

// filter support: (zoomIn/Out/setPosF)
_filterFragment: any | undefined
_filterFragments: FilterFrag[]
_doc: AdltDocument | undefined

constructor(
Expand All @@ -41,15 +50,30 @@ export class AdltPluginChildNode implements TreeViewNode {
this._tooltip = childObj.tooltip !== undefined && typeof childObj.tooltip === 'string' ? childObj.tooltip : undefined // or as MarkDownString?
this.cmdCtx = childObj.cmdCtx

this._filterFragments = []
if ('filterFrag' in childObj && childObj['filterFrag'] !== null) {
const doc_name = this.getAdltDocumentAndPluginName()
// check that _doc is avail
if (doc_name !== undefined) {
const [doc, name] = doc_name
this._doc = doc
this._filterFragment = { ...childObj['filterFrag'] }
// check that no key is null / delete all null keys
Object.keys(this._filterFragment).forEach((key) => !(this._filterFragment[key] === null) || delete this._filterFragment[key])
let filterFragParam = childObj['filterFrag']
if (Array.isArray(filterFragParam)) {
// array of filterFrag objects
for (const filterFrag of filterFragParam) {
const nonNullFilterFrag = { ...filterFrag }
// check that no key is null / delete all null keys
Object.keys(nonNullFilterFrag).forEach((key) => !(nonNullFilterFrag[key] === null) || delete nonNullFilterFrag[key])
this._filterFragments.push(nonNullFilterFrag)
}
} else if (typeof filterFragParam === 'object') {
const nonNullFilterFrag = { ...childObj['filterFrag'] }
// check that no key is null / delete all null keys
Object.keys(nonNullFilterFrag).forEach((key) => !(nonNullFilterFrag[key] === null) || delete nonNullFilterFrag[key])
this._filterFragments.push(nonNullFilterFrag)
} else {
console.warn(`adlt plugin child node ignoring invalid filterFrag '${JSON.stringify(filterFragParam)}'!`)
}
}
}

Expand All @@ -70,7 +94,7 @@ export class AdltPluginChildNode implements TreeViewNode {
}

get contextValue() {
if (this._filterFragment) {
if (this._filterFragments.length > 0) {
// similar to DynFilterNode:
// we determine whether this filter fragments are visible or not
// it's visible if
Expand All @@ -89,26 +113,25 @@ export class AdltPluginChildNode implements TreeViewNode {
}
let isCurrentlyVisible = (posFiltersActive || anyPosFilterActive === 0) && negFiltersActive === 0
let canSetPosF = isCurrentlyVisible && anyPosFilterActive === 0
let hasReportOptions = this._filterFragments.findIndex((f) => 'reportOptions' in f) >= 0
return (
`${'reportOptions' in this._filterFragment ? 'filterReport ' : ''}${isCurrentlyVisible ? 'canZoomOut' : 'canZoomIn'}${
canSetPosF ? ' canSetPosF ' : ' '
}` + this._contextValue
`${hasReportOptions ? 'filterReport ' : ''}${isCurrentlyVisible ? 'canZoomOut' : 'canZoomIn'}${canSetPosF ? ' canSetPosF ' : ' '}` +
this._contextValue
)
} else {
return this._contextValue
}
}

get tooltip(): string | undefined {
if (this._filterFragment) {
if (this._filterFragments.length > 0) {
const activeFilters = this.getSimilarFilters(true)
if (activeFilters.length) {
return `${this._tooltip ? this._tooltip + '\n' : ''}Active filters:\n${activeFilters.map((f) => f.name).join(',\n')}`
} else {
return `${this._tooltip ? this._tooltip + '\n' : ''}Would set filter:\n${JSON.stringify({
...this._filterFragment,
reportOptions: undefined,
})}`
return `${this._tooltip ? this._tooltip + '\n' : ''}Would set filter:\n${this._filterFragments
.map((f) => JSON.stringify({ ...f, reportOptions: undefined }))
.join('\n')}`
}
} else {
return this._tooltip
Expand All @@ -121,19 +144,16 @@ export class AdltPluginChildNode implements TreeViewNode {
* todo: add proper interface here (and not cast simply to FilterNode on registerCommand('...openReport'...))
*/
get filter(): DltFilter[] {
if ('reportOptions' in this._filterFragment) {
return [new DltFilter({ type: 3, ...this._filterFragment }, false)]
} else {
return []
}
let reportFilters = this._filterFragments.filter((f) => 'reportOptions' in f)
return reportFilters.map((r) => new DltFilter({ type: 3, ...r }, false))
}

applyCommand(cmd: string): void {
console.log(`adlt plugin child node got command '${cmd}'`)
// context canSetPosF -> cmd setPosFilter
// context canZoomOut (make msgs non visible) -> cmd zoomOut
// context canZoomIn (make msgs visible) -> cmd zoomIn
if (this._filterFragment && ['setPosFilter', 'zoomOut', 'zoomIn'].find((e) => e === cmd) !== undefined) {
if (this._filterFragments.length > 0 && ['setPosFilter', 'zoomOut', 'zoomIn'].find((e) => e === cmd) !== undefined) {
const filtersActive = this.getSimilarFilters(true, true)
const nonRestFiltersActive = this.getSimilarFilters(false, true)
switch (cmd) {
Expand All @@ -150,15 +170,17 @@ export class AdltPluginChildNode implements TreeViewNode {
// do we have any one that is currently disabled? if so, enable it
const disPosF = nonRestFiltersActive.filter((f) => !f.enabled && f.type === DltFilterType.POSITIVE)
if (disPosF.length > 0) {
console.log(` enabled 1 pos`)
disPosF[0].enabled = true
console.log(` enabled ${disPosF.length} pos filters`)
disPosF.forEach((f) => (f.enabled = true))
} else {
// else do add a new one
const filterFrag = { type: DltFilterType.POSITIVE, ...this._filterFragment }
Object.keys(filterFrag).forEach((key) => !(filterFrag[key] === null) || delete filterFrag[key])
console.log(` adding new pos ${JSON.stringify(filterFrag)}`)
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
// else do add a new one(s)
this._filterFragments.forEach((f) => {
const filterFrag: any = { type: DltFilterType.POSITIVE, ...f }
Object.keys(filterFrag).forEach((key) => !(filterFrag[key as keyof typeof filterFrag] === null) || delete filterFrag[key])
console.log(` adding new pos ${JSON.stringify(filterFrag)}`)
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
})
}
}

Expand All @@ -179,22 +201,26 @@ export class AdltPluginChildNode implements TreeViewNode {
// do we have any one that is currently disabled? if so, enable it
const disNegF = nonRestFiltersActive.filter((f) => !f.enabled && f.type === DltFilterType.NEGATIVE)
if (disNegF.length > 0) {
console.log(`enabled 1 neg`)
disNegF[0].enabled = true
console.log(`enabled ${disNegF.length} neg`)
disNegF.forEach((f) => (f.enabled = true))
} else {
// add new neg one will all but null keys:
const filterFrag = { type: DltFilterType.NEGATIVE, ...this._filterFragment }
Object.keys(filterFrag).forEach((key) => !(filterFrag[key] === null) || delete filterFrag[key])
console.log(` adding new neg ${JSON.stringify(filterFrag)}`)
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
this._filterFragments.forEach((f) => {
// add new neg one will all but null keys:
const filterFrag: any = { type: DltFilterType.NEGATIVE, ...f }
Object.keys(filterFrag).forEach((key) => !(filterFrag[key] === null) || delete filterFrag[key])
console.log(` adding new neg ${JSON.stringify(filterFrag)}`)
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
})
}
}
break
case 'setPosFilter':
const filterFrag = { type: DltFilterType.POSITIVE, ...this._filterFragment }
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
this._filterFragments.forEach((f) => {
const filterFrag = { type: DltFilterType.POSITIVE, ...f }
const newFilter = new DltFilter(filterFrag, true)
this._doc!.onFilterAdd(newFilter, false)
})
break
}
} else if (this.cmdCtx !== undefined && cmd in this.cmdCtx) {
Expand Down Expand Up @@ -250,7 +276,15 @@ export class AdltPluginChildNode implements TreeViewNode {
if (!this._doc) {
return []
}
return DltFilter.getSimilarFilters(lessRestrictive, includeDisabled, this._filterFragment, this._doc.allFilters)
const toRet: DltFilter[] = []
for (const filterFrag of this._filterFragments) {
for (const simFilter of DltFilter.getSimilarFilters(lessRestrictive, includeDisabled, filterFrag, this._doc.allFilters)) {
if (!toRet.includes(simFilter)) {
toRet.push(simFilter)
}
}
}
return toRet
}

getAdltDocumentAndPluginName(): [AdltDocument, string] | undefined {
Expand Down