chrome-devtools-frontend
Version:
Chrome DevTools UI
96 lines (79 loc) • 2.62 kB
text/typescript
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as IconButton from '../../../components/icon_button/icon_button.js';
import * as UI from '../../legacy.js';
import {getRegisteredProviders, Provider, registerProvider} from './FilteredListWidget.js';
import {QuickOpenImpl} from './QuickOpen.js';
let helpQuickOpenInstance: HelpQuickOpen;
export class HelpQuickOpen extends Provider {
private providers: {
prefix: string,
iconName: string,
title: string,
}[];
private constructor() {
super();
this.providers = [];
getRegisteredProviders().forEach(this.addProvider.bind(this));
}
static instance(opts: {
forceNew: boolean|null,
} = {forceNew: null}): HelpQuickOpen {
const {forceNew} = opts;
if (!helpQuickOpenInstance || forceNew) {
helpQuickOpenInstance = new HelpQuickOpen();
}
return helpQuickOpenInstance;
}
private addProvider(extension: {
prefix: string,
iconName: string,
titlePrefix: () => string,
titleSuggestion?: () => string,
}): void {
if (extension.titleSuggestion) {
this.providers.push({
prefix: extension.prefix || '',
iconName: extension.iconName,
title: extension.titlePrefix() + ' ' + extension.titleSuggestion(),
});
}
}
itemCount(): number {
return this.providers.length;
}
itemKeyAt(itemIndex: number): string {
return this.providers[itemIndex].prefix;
}
itemScoreAt(itemIndex: number, _query: string): number {
return -this.providers[itemIndex].prefix.length;
}
renderItem(itemIndex: number, _query: string, titleElement: Element, _subtitleElement: Element): void {
const provider = this.providers[itemIndex];
const iconElement = new IconButton.Icon.Icon();
iconElement.data = {
iconName: provider.iconName,
color: 'var(--color-text-primary)',
width: '18px',
height: '18px',
};
titleElement.parentElement?.parentElement?.insertBefore(iconElement, titleElement.parentElement);
UI.UIUtils.createTextChild(titleElement, provider.title);
}
selectItem(itemIndex: number|null, _promptValue: string): void {
if (itemIndex !== null) {
QuickOpenImpl.show(this.providers[itemIndex].prefix);
}
}
renderAsTwoRows(): boolean {
return false;
}
}
registerProvider({
prefix: '?',
iconName: 'ic_command_help',
provider: () => Promise.resolve(HelpQuickOpen.instance()),
titlePrefix: () => 'Help',
titleSuggestion: undefined,
});