blob: e86ac7d30a1850bbf4ef743ea19563ce81099179 [file] [log] [blame]
// Copyright (c) 2020 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.
// @ts-nocheck
// TODO(crbug.com/1011811): Enable TypeScript compiler checks
import * as Common from '../common/common.js';
import * as SDK from '../sdk/sdk.js';
import * as UI from '../ui/ui.js';
import {createLayoutPane, Element} from './LayoutPane_bridge.js'; // eslint-disable-line no-unused-vars
/**
* @param {!Array<!SDK.DOMModel.DOMNode>} nodes
* @return {!Array<!Element>}
*/
const gridNodesToElements = nodes => {
return nodes.map(node => ({
id: node.id,
name: node.localName(),
domId: node.getAttribute('id'),
domClasses: (node.getAttribute('class') || '').split(/\s+/),
enabled: node.domModel().overlayModel().isHighlightedGridInPersistentOverlay(node.id)
}));
};
/**
* @unrestricted
*/
export class LayoutSidebarPane extends UI.ThrottledWidget.ThrottledWidget {
constructor() {
super(true /* isWebComponent */);
this._layoutPane = createLayoutPane();
this.contentElement.appendChild(this._layoutPane);
this._settings = [
'showGridBorder', 'showGridLines', 'showGridLineNumbers', 'showGridGaps', 'showGridAreas', 'showGridTrackSizes'
];
this._node = self.UI.context.flavor(SDK.DOMModel.DOMNode);
this._boundOnSettingChanged = this.onSettingChanged.bind(this);
this._boundOnOverlayChanged = this.onOverlayChanged.bind(this);
}
async _fetchGridNodes() {
const nodeIds = await this._node.domModel().getNodesByStyle(
[{name: 'display', value: 'grid'}, {name: 'display', value: 'inline-grid'}], true /* pierce */);
const nodes = nodeIds.map(id => this._node.domModel().nodeForId(id)).filter(node => node !== null);
return nodes;
}
_mapSettings() {
return this._settings
.map(settingName => {
const setting = Common.Settings.Settings.instance().moduleSetting(settingName);
const ext = setting.extension();
if (!ext) {
return null;
}
const descriptor = ext.descriptor();
return {
type: descriptor.settingType,
name: descriptor.settingName,
title: descriptor.title,
value: setting.get(),
options: descriptor.options.map(opt => ({
title: opt.text,
value: opt.value,
}))
};
})
.filter(descriptor => descriptor !== null);
}
/**
* @override
* @protected
* @return {!Promise<void>}
*/
async doUpdate() {
this._layoutPane.data = {
gridElements: gridNodesToElements(await this._fetchGridNodes()),
settings: this._mapSettings(),
};
}
/**
* @param {*} event
*/
onSettingChanged(event) {
Common.Settings.Settings.instance().moduleSetting(event.data.setting).set(event.data.value);
}
/**
* @param {*} event
*/
onOverlayChanged(event) {
const node = this._node.domModel().nodeForId(event.data.id);
if (event.data.value) {
node.domModel().overlayModel().highlightGridInPersistentOverlay(event.data.id);
} else {
node.domModel().overlayModel().hideGridInPersistentOverlay(event.data.id);
}
}
/**
* @override
*/
wasShown() {
for (const setting of this._settings) {
Common.Settings.Settings.instance().moduleSetting(setting).addChangeListener(this.update, this);
}
this._layoutPane.addEventListener('setting-changed', this._boundOnSettingChanged);
this._layoutPane.addEventListener('overlay-changed', this._boundOnOverlayChanged);
const overlayModel = this._node.domModel().overlayModel();
overlayModel.addEventListener(SDK.OverlayModel.Events.PersistentGridOverlayCleared, this.update, this);
overlayModel.addEventListener(SDK.OverlayModel.Events.PersistentGridOverlayStateChanged, this.update, this);
this.update();
}
/**
* @override
*/
willHide() {
for (const setting of this._settings) {
Common.Settings.Settings.instance().moduleSetting(setting).removeChangeListener(this.update, this);
}
this._layoutPane.removeEventListener('setting-changed', this._boundOnSettingChanged);
this._layoutPane.removeEventListener('overlay-changed', this._boundOnOverlayChanged);
const overlayModel = this._node.domModel().overlayModel();
overlayModel.removeEventListener(SDK.OverlayModel.Events.PersistentGridOverlayCleared, this.update, this);
overlayModel.removeEventListener(SDK.OverlayModel.Events.PersistentGridOverlayStateChanged, this.update, this);
}
}