Put Arduino libs and platforms on top of the Library/Boards Manager (#1541)

This commit is contained in:
Francesco Spissu 2022-10-14 09:07:54 +02:00 committed by GitHub
parent f3ef95cfe2
commit e577de4e8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 17 deletions

View File

@ -111,19 +111,7 @@ export class FilterableListContainer<
const { searchable } = this.props;
searchable
.search(searchOptions)
.then((items) => this.setState({ items: this.sort(items) }));
}
protected sort(items: T[]): T[] {
const { itemLabel, itemDeprecated } = this.props;
return items.sort((left, right) => {
// always put deprecated items at the bottom of the list
if (itemDeprecated(left)) {
return 1;
}
return itemLabel(left).localeCompare(itemLabel(right));
});
.then((items) => this.setState({ items: this.props.sort(items) }));
}
protected async install(
@ -139,7 +127,7 @@ export class FilterableListContainer<
run: ({ progressId }) => install({ item, progressId, version }),
});
const items = await searchable.search(this.state.searchOptions);
this.setState({ items: this.sort(items) });
this.setState({ items: this.props.sort(items) });
}
protected async uninstall(item: T): Promise<void> {
@ -167,7 +155,7 @@ export class FilterableListContainer<
run: ({ progressId }) => uninstall({ item, progressId }),
});
const items = await searchable.search(this.state.searchOptions);
this.setState({ items: this.sort(items) });
this.setState({ items: this.props.sort(items) });
}
}
@ -204,6 +192,7 @@ export namespace FilterableListContainer {
progressId: string;
}) => Promise<void>;
readonly commandService: CommandService;
readonly sort: (items: T[]) => T[];
}
export interface State<T, S extends Searchable.Options> {

View File

@ -51,9 +51,11 @@ export abstract class ListWidget<
*/
protected firstActivate = true;
protected readonly defaultSortComparator: (left: T, right: T) => number;
constructor(protected options: ListWidget.Options<T, S>) {
super();
const { id, label, iconClass } = options;
const { id, label, iconClass, itemDeprecated, itemLabel } = options;
this.id = id;
this.title.label = label;
this.title.caption = label;
@ -63,12 +65,23 @@ export abstract class ListWidget<
this.node.tabIndex = 0; // To be able to set the focus on the widget.
this.scrollOptions = undefined;
this.toDispose.push(this.searchOptionsChangeEmitter);
this.defaultSortComparator = (left, right): number => {
// always put deprecated items at the bottom of the list
if (itemDeprecated(left)) {
return 1;
}
return itemLabel(left).localeCompare(itemLabel(right));
};
}
@postConstruct()
protected init(): void {
this.toDispose.pushAll([
this.notificationCenter.onIndexUpdateDidComplete(() => this.refresh(undefined)),
this.notificationCenter.onIndexUpdateDidComplete(() =>
this.refresh(undefined)
),
this.notificationCenter.onDaemonDidStart(() => this.refresh(undefined)),
this.notificationCenter.onDaemonDidStop(() => this.refresh(undefined)),
]);
@ -128,6 +141,30 @@ export abstract class ListWidget<
return this.options.installable.uninstall({ item, progressId });
}
protected filterableListSort = (items: T[]): T[] => {
const isArduinoTypeComparator = (left: T, right: T) => {
const aIsArduinoType = left.types.includes('Arduino');
const bIsArduinoType = right.types.includes('Arduino');
if (aIsArduinoType && !bIsArduinoType && !left.deprecated) {
return -1;
}
if (!aIsArduinoType && bIsArduinoType && !right.deprecated) {
return 1;
}
return 0;
};
return items.sort((left, right) => {
return (
isArduinoTypeComparator(left, right) ||
this.defaultSortComparator(left, right)
);
});
};
render(): React.ReactNode {
return (
<FilterableListContainer<T, S>
@ -145,6 +182,7 @@ export abstract class ListWidget<
messageService={this.messageService}
commandService={this.commandService}
responseService={this.responseService}
sort={this.filterableListSort}
/>
);
}