Skip to content

Commit

Permalink
UI: Make recipe view load when a scan is ongoing
Browse files Browse the repository at this point in the history
Previously, the view would always display the previous scan result. This
could be misleading when a new scan was started, especially through a
buildConfiguration change. The bottom left status bar was loading, but
the recipe panel was missing an indication.
  • Loading branch information
deribaucourt committed Jan 6, 2025
1 parent f9a2f83 commit f9e857b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 17 deletions.
36 changes: 22 additions & 14 deletions client/src/ui/BitbakeRecipesView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@

import * as vscode from 'vscode'
import { BitbakeWorkspace } from './BitbakeWorkspace'
import { type ElementInfo, type BitbakeScanResult, scanContainsData, scanContainsRecipes } from '../lib/src/types/BitbakeScanResult'
import { type ElementInfo, type BitbakeScanResult, scanContainsRecipes } from '../lib/src/types/BitbakeScanResult'
import path from 'path'
import { BitBakeProjectScanner } from '../driver/BitBakeProjectScanner'
import { bitbakeESDKMode } from '../driver/BitbakeESDK'

export class BitbakeRecipesView {
private readonly bitbakeTreeProvider: BitbakeTreeDataProvider
Expand Down Expand Up @@ -72,23 +71,38 @@ class BitbakeTreeDataProvider implements vscode.TreeDataProvider<BitbakeRecipeTr
private readonly _onDidChangeTreeData: vscode.EventEmitter<BitbakeRecipeTreeItem | undefined> = new vscode.EventEmitter<BitbakeRecipeTreeItem | undefined>()
readonly onDidChangeTreeData: vscode.Event<BitbakeRecipeTreeItem | undefined> = this._onDidChangeTreeData.event
private readonly bitbakeProjectScanner: BitBakeProjectScanner
private bitbakeScanResults: BitbakeScanResult | undefined
private bitbakeScanResults: BitbakeScanResult
private scanCompletePromise: Promise<void> | undefined
private resolveScanCompletePromise: (() => void) | undefined

constructor (bitbakeWorkspace: BitbakeWorkspace, bitbakeProjectScanner: BitBakeProjectScanner) {
this.bitbakeWorkspace = bitbakeWorkspace
this.bitbakeProjectScanner = bitbakeProjectScanner
this.bitbakeScanResults = bitbakeProjectScanner.activeScanResult

bitbakeWorkspace.onChange.on(BitbakeWorkspace.EventType.RECIPE_ADDED, () => {
this._onDidChangeTreeData.fire(undefined)
})
bitbakeWorkspace.onChange.on(BitbakeWorkspace.EventType.RECIPE_DROPPED, () => {
this._onDidChangeTreeData.fire(undefined)
})
bitbakeProjectScanner.onChange.on(BitBakeProjectScanner.EventType.START_SCAN, () => {
if (this.scanCompletePromise === undefined) {
this.scanCompletePromise = new Promise<void>((resolve) => {
this.resolveScanCompletePromise = resolve
})
}
this._onDidChangeTreeData.fire(undefined)
})
bitbakeProjectScanner.onChange.on(BitBakeProjectScanner.EventType.SCAN_COMPLETE, (scanResults: BitbakeScanResult) => {
// In case a parsing error was just introduced, we keep the previous results to keep navigation functional
if (this.bitbakeScanResults === undefined || !scanContainsRecipes(this.bitbakeScanResults) || scanContainsRecipes(scanResults)) {
this.bitbakeScanResults = scanResults
}
if (this.resolveScanCompletePromise) {
this.resolveScanCompletePromise()
this.resolveScanCompletePromise = undefined
}
this._onDidChangeTreeData.fire(undefined)
})
}
Expand All @@ -98,22 +112,16 @@ class BitbakeTreeDataProvider implements vscode.TreeDataProvider<BitbakeRecipeTr
}

async getChildren (element?: BitbakeRecipeTreeItem | undefined): Promise<BitbakeRecipeTreeItem[]> {
if (this.scanCompletePromise !== undefined) {
await this.scanCompletePromise
this.scanCompletePromise = undefined
}
if (element === undefined) {
const items = this.getBitbakeRecipes()
items.push(this.getAddRecipeItem())
return items
}
if (bitbakeESDKMode) {
return []
}

while (this.bitbakeScanResults === undefined) {
await new Promise(resolve => {
this.bitbakeProjectScanner.onChange.once(BitBakeProjectScanner.EventType.SCAN_COMPLETE, () => {
resolve(undefined)
})
})
}
const fileItems: BitbakeRecipeTreeItem[] = []
this.bitbakeScanResults._recipes.forEach((recipe: ElementInfo) => {
if (recipe.name === element.label) {
Expand All @@ -135,7 +143,7 @@ class BitbakeTreeDataProvider implements vscode.TreeDataProvider<BitbakeRecipeTr
}
}
})
if (fileItems.length === 0 && scanContainsData(this.bitbakeScanResults)) {
if (fileItems.length === 0) {
const errorItem = new BitbakeRecipeTreeItem('Recipe not found', vscode.TreeItemCollapsibleState.None)
errorItem.contextValue = undefined
errorItem.iconPath = new vscode.ThemeIcon('warning')
Expand Down
3 changes: 0 additions & 3 deletions client/src/ui/DevtoolWorkspacesView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ class DevtoolTreeDataProvider implements vscode.TreeDataProvider<DevtoolWorkspac

async getChildren (element?: DevtoolWorkspaceTreeItem | undefined): Promise<DevtoolWorkspaceTreeItem[]> {
if (element === undefined) {
while (this.bitbakeScanResults === undefined) {
await new Promise(resolve => setTimeout(resolve, 300))
}
const items = this.getDevtoolWorkspaces()
items.push(this.getAddWorkspaceItem())
return items
Expand Down

0 comments on commit f9e857b

Please sign in to comment.