| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; |
| |
| import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; |
| import type {PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js'; |
| |
| import {getCss} from './viewer_zoom_button.css.js'; |
| import {getHtml} from './viewer_zoom_button.html.js'; |
| |
| export class ViewerZoomButtonElement extends CrLitElement { |
| static get is() { |
| return 'viewer-zoom-button'; |
| } |
| |
| static override get styles() { |
| return getCss(); |
| } |
| |
| override render() { |
| return getHtml.bind(this)(); |
| } |
| |
| static override get properties() { |
| return { |
| /** Index of the icon currently being displayed. */ |
| activeIndex: {type: Number}, |
| |
| disabled: {type: Boolean}, |
| |
| /** |
| * Icons to be displayed on the FAB. Multiple icons should be separated |
| * with spaces, and will be cycled through every time the FAB is clicked. |
| */ |
| icons: {type: String}, |
| |
| /** |
| * Used to show the appropriate drop shadow when buttons are focused with |
| * the keyboard. |
| */ |
| keyboardNavigationActive: { |
| type: Boolean, |
| reflect: true, |
| }, |
| |
| tooltips: {type: String}, |
| |
| /** |
| * Array version of the list of icons. The public property is a string for |
| * convenience so that either a single icon or multiple icons can be |
| * easily specified without a data binding in the parent's HTML template. |
| */ |
| icons_: {type: Array}, |
| |
| tooltips_: {type: Array}, |
| }; |
| } |
| |
| activeIndex: number = 0; |
| disabled: boolean = false; |
| icons: string = ''; |
| keyboardNavigationActive: boolean = false; |
| tooltips: string = ''; |
| private icons_: string[] = ['']; |
| private tooltips_: string[] = []; |
| |
| override willUpdate(changedProperties: PropertyValues<this>) { |
| super.willUpdate(changedProperties); |
| |
| if (changedProperties.has('icons')) { |
| this.icons_ = this.icons.split(' '); |
| } |
| if (changedProperties.has('tooltips')) { |
| this.tooltips_ = this.tooltips.split(','); |
| } |
| } |
| |
| /** |
| * @return Icon name for the currently visible icon. |
| */ |
| protected computeVisibleIcon_(): string { |
| return this.icons_[this.activeIndex]!; |
| } |
| |
| /** |
| * @return Tooltip for the currently visible icon. |
| */ |
| protected computeVisibleTooltip_(): string { |
| return this.tooltips_ === undefined ? '' : this.tooltips_[this.activeIndex]! |
| ; |
| } |
| |
| protected fireClick_() { |
| // We cannot attach an on-click to the entire viewer-zoom-button, as this |
| // will include clicks on the margins. Instead, proxy clicks on the FAB |
| // through. |
| this.fire('fabclick'); |
| this.activeIndex = (this.activeIndex + 1) % this.icons_.length; |
| } |
| } |
| |
| customElements.define(ViewerZoomButtonElement.is, ViewerZoomButtonElement); |