tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

GridItem.js (5244B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 const {
      8  createElement,
      9  createRef,
     10  Fragment,
     11  PureComponent,
     12 } = require("resource://devtools/client/shared/vendor/react.mjs");
     13 const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js");
     14 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs");
     15 const {
     16  getFormatStr,
     17  getStr,
     18 } = require("resource://devtools/client/inspector/layout/utils/l10n.js");
     19 
     20 loader.lazyGetter(this, "Rep", function () {
     21  return ChromeUtils.importESModule(
     22    "resource://devtools/client/shared/components/reps/index.mjs"
     23  ).REPS.Rep;
     24 });
     25 loader.lazyGetter(this, "MODE", function () {
     26  return ChromeUtils.importESModule(
     27    "resource://devtools/client/shared/components/reps/index.mjs"
     28  ).MODE;
     29 });
     30 
     31 loader.lazyRequireGetter(
     32  this,
     33  "translateNodeFrontToGrip",
     34  "resource://devtools/client/inspector/shared/utils.js",
     35  true
     36 );
     37 
     38 const Types = require("resource://devtools/client/inspector/grids/types.js");
     39 
     40 const {
     41  highlightNode,
     42  unhighlightNode,
     43 } = require("resource://devtools/client/inspector/boxmodel/actions/box-model-highlighter.js");
     44 
     45 class GridItem extends PureComponent {
     46  static get propTypes() {
     47    return {
     48      dispatch: PropTypes.func.isRequired,
     49      getSwatchColorPickerTooltip: PropTypes.func.isRequired,
     50      grid: PropTypes.shape(Types.grid).isRequired,
     51      grids: PropTypes.arrayOf(PropTypes.shape(Types.grid)).isRequired,
     52      onSetGridOverlayColor: PropTypes.func.isRequired,
     53      onToggleGridHighlighter: PropTypes.func.isRequired,
     54      setSelectedNode: PropTypes.func.isRequired,
     55    };
     56  }
     57 
     58  constructor(props) {
     59    super(props);
     60 
     61    this.swatchEl = createRef();
     62 
     63    this.onGridCheckboxClick = this.onGridCheckboxClick.bind(this);
     64    this.onGridInspectIconClick = this.onGridInspectIconClick.bind(this);
     65    this.setGridColor = this.setGridColor.bind(this);
     66  }
     67 
     68  componentDidMount() {
     69    const tooltip = this.props.getSwatchColorPickerTooltip();
     70 
     71    let previousColor;
     72    tooltip.addSwatch(this.swatchEl.current, {
     73      onCommit: this.setGridColor,
     74      onPreview: this.setGridColor,
     75      onRevert: () => {
     76        this.props.onSetGridOverlayColor(
     77          this.props.grid.nodeFront,
     78          previousColor
     79        );
     80      },
     81      onShow: () => {
     82        previousColor = this.props.grid.color;
     83      },
     84    });
     85  }
     86 
     87  componentWillUnmount() {
     88    const tooltip = this.props.getSwatchColorPickerTooltip();
     89    tooltip.removeSwatch(this.swatchEl.current);
     90  }
     91 
     92  setGridColor() {
     93    const color = this.swatchEl.current.dataset.color;
     94    this.props.onSetGridOverlayColor(this.props.grid.nodeFront, color);
     95  }
     96 
     97  onGridCheckboxClick() {
     98    const { grid, onToggleGridHighlighter } = this.props;
     99    onToggleGridHighlighter(grid.nodeFront);
    100  }
    101 
    102  onGridInspectIconClick(nodeFront) {
    103    const { setSelectedNode } = this.props;
    104    setSelectedNode(nodeFront, { reason: "layout-panel" });
    105    nodeFront.scrollIntoView().catch(e => console.error(e));
    106  }
    107 
    108  renderSubgrids() {
    109    const { grid, grids } = this.props;
    110 
    111    if (!grid.subgrids.length) {
    112      return null;
    113    }
    114 
    115    const subgrids = grids.filter(g => grid.subgrids.includes(g.id));
    116 
    117    return dom.ul(
    118      {},
    119      subgrids.map(g => {
    120        return createElement(GridItem, {
    121          key: g.id,
    122          dispatch: this.props.dispatch,
    123          getSwatchColorPickerTooltip: this.props.getSwatchColorPickerTooltip,
    124          grid: g,
    125          grids,
    126          onSetGridOverlayColor: this.props.onSetGridOverlayColor,
    127          onToggleGridHighlighter: this.props.onToggleGridHighlighter,
    128          setSelectedNode: this.props.setSelectedNode,
    129        });
    130      })
    131    );
    132  }
    133 
    134  render() {
    135    const { dispatch, grid } = this.props;
    136 
    137    return createElement(
    138      Fragment,
    139      null,
    140      dom.li(
    141        {},
    142        dom.label(
    143          {},
    144          dom.input({
    145            checked: grid.highlighted,
    146            disabled: grid.disabled,
    147            type: "checkbox",
    148            value: grid.id,
    149            onChange: this.onGridCheckboxClick,
    150            title: getStr("layout.toggleGridHighlighter"),
    151          }),
    152          Rep({
    153            defaultRep: Rep.ElementNode,
    154            mode: MODE.TINY,
    155            object: translateNodeFrontToGrip(grid.nodeFront),
    156            onDOMNodeMouseOut: () => dispatch(unhighlightNode()),
    157            onDOMNodeMouseOver: () => dispatch(highlightNode(grid.nodeFront)),
    158            onInspectIconClick: (_, e) => {
    159              // Stoping click propagation to avoid firing onGridCheckboxClick()
    160              e.stopPropagation();
    161              this.onGridInspectIconClick(grid.nodeFront);
    162            },
    163          })
    164        ),
    165        dom.button({
    166          className: "layout-color-swatch",
    167          "data-color": grid.color,
    168          ref: this.swatchEl,
    169          style: {
    170            backgroundColor: grid.color,
    171          },
    172          title: getFormatStr("layout.colorSwatch.tooltip", grid.color),
    173        })
    174      ),
    175      this.renderSubgrids()
    176    );
    177  }
    178 }
    179 
    180 module.exports = GridItem;