chrome-devtools-frontend
Version:
Chrome DevTools UI
127 lines (98 loc) • 3 kB
text/typescript
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as Platform from '../../core/platform/platform.js';
import type {TabbedPane} from './TabbedPane.js';
import type {ToolbarItem, ToolbarMenuButton} from './Toolbar.js';
import {ViewManager} from './ViewManager.js';
import {VBox, type Widget, type WidgetOptions} from './Widget.js';
export interface View {
viewId(): string;
title(): Platform.UIString.LocalizedString;
isCloseable(): boolean;
isPreviewFeature(): boolean;
iconName(): string|undefined;
isTransient(): boolean;
toolbarItems(): Promise<ToolbarItem[]>;
widget(): Promise<Widget>;
disposeView(): void|Promise<void>;
}
/**
* Settings to control the behavior of `SimpleView` subclasses.
*/
export interface SimpleViewOptions extends WidgetOptions {
/**
* User visible title for the view.
*/
title: Platform.UIString.LocalizedString;
/**
* Internal ID used to refer to the view.
*
* Note that this is also used to construct VE contexts in some places.
*
* Must be in extended kebab case.
*/
viewId: Lowercase<string>;
}
export class SimpleView extends VBox implements View {
readonly #title: Platform.UIString.LocalizedString;
readonly #viewId: Lowercase<string>;
/**
* Constructs a new `SimpleView` with the given `options`.
*
* @param options the settings for the resulting view.
* @throws TypeError - if `options.viewId` is not in extended kebab case.
*/
constructor(options: SimpleViewOptions) {
super(options);
this.#title = options.title;
this.#viewId = options.viewId;
if (!Platform.StringUtilities.isExtendedKebabCase(this.#viewId)) {
throw new TypeError(`Invalid view ID '${this.#viewId}'`);
}
}
viewId(): string {
return this.#viewId;
}
title(): Platform.UIString.LocalizedString {
return this.#title;
}
isCloseable(): boolean {
return false;
}
isTransient(): boolean {
return false;
}
toolbarItems(): Promise<ToolbarItem[]> {
return Promise.resolve([]);
}
widget(): Promise<Widget> {
return Promise.resolve(this);
}
revealView(): Promise<void> {
return ViewManager.instance().revealView(this);
}
disposeView(): void {
}
isPreviewFeature(): boolean {
return false;
}
iconName(): string|undefined {
return undefined;
}
}
export interface ViewLocation {
appendApplicableItems(locationName: string): void;
appendView(view: View, insertBefore?: View|null): void;
showView(view: View, insertBefore?: View|null, userGesture?: boolean): Promise<void>;
removeView(view: View): void;
isViewVisible(view: View): boolean;
widget(): Widget;
}
export interface TabbedViewLocation extends ViewLocation {
tabbedPane(): TabbedPane;
enableMoreTabsButton(): ToolbarMenuButton;
}
export interface ViewLocationResolver {
resolveLocation(location: string): ViewLocation|null;
}