blob: 5158593436e966b9fde286f358be2aeb65e8efcf [file] [log] [blame]
// Copyright 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.
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
import 'chrome://resources/cr_elements/icons.m.js';
import './icons.html.js';
import './pdf-shared.css.js';
import './viewer-pen-options.js';
import './viewer-toolbar-dropdown.js';
import {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
import {assert} from 'chrome://resources/js/assert_ts.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {AnnotationTool} from '../annotation_tool.js';
import {InkController, InkControllerEventType} from '../ink_controller.js';
import {getTemplate} from './viewer-annotations-bar.html.js';
import {ViewerPenOptionsElement} from './viewer-pen-options.js';
import {ViewerToolbarDropdownElement} from './viewer-toolbar-dropdown.js';
export interface ViewerAnnotationsBarElement {
$: {
eraser: HTMLElement,
highlighter: HTMLElement,
pen: HTMLElement,
redo: CrIconButtonElement,
undo: CrIconButtonElement,
};
}
export class ViewerAnnotationsBarElement extends PolymerElement {
static get is() {
return 'viewer-annotations-bar';
}
static get template() {
return getTemplate();
}
static get properties() {
return {
annotationMode: {
type: Boolean,
observer: 'onAnnotationModeChanged_',
},
annotationTool_: Object,
canUndoAnnotation_: {
type: Boolean,
value: false,
},
canRedoAnnotation_: {
type: Boolean,
value: false,
},
};
}
annotationMode: boolean;
private annotationTool_: AnnotationTool|null;
private canUndoAnnotation_: boolean;
private canRedoAnnotation_: boolean;
private inkController_: InkController = InkController.getInstance();
private tracker_: EventTracker = new EventTracker();
constructor() {
super();
this.tracker_.add(
this.inkController_.getEventTarget(),
InkControllerEventType.SET_ANNOTATION_UNDO_STATE,
this.setAnnotationUndoState_.bind(this));
this.tracker_.add(
this.inkController_.getEventTarget(), InkControllerEventType.LOADED,
() => {
if (this.annotationTool_) {
assert(this.inkController_.isActive);
this.inkController_.setAnnotationTool(this.annotationTool_);
}
});
}
private setAnnotationUndoState_(
e: CustomEvent<{canUndo: boolean, canRedo: boolean}>) {
this.canUndoAnnotation_ = e.detail.canUndo;
this.canRedoAnnotation_ = e.detail.canRedo;
}
private onUndoClick_() {
this.inkController_.undo();
}
private onRedoClick_() {
this.inkController_.redo();
}
private onAnnotationModeChanged_() {
if (this.annotationMode) {
// Select pen tool when entering annotation mode.
this.updateAnnotationTool_(this.shadowRoot!.querySelector('#pen')!);
}
}
private annotationToolClicked_(e: Event) {
this.updateAnnotationTool_(e.currentTarget as HTMLElement);
}
private annotationToolOptionChanged_(e: Event) {
const element = (e.currentTarget as HTMLElement).parentElement!;
if (!this.annotationTool_ || element.id !== this.annotationTool_.tool) {
return;
}
this.updateAnnotationTool_(element);
}
private updateAnnotationTool_(element: HTMLElement) {
const tool = element.id;
const options =
element.querySelector<ViewerPenOptionsElement>('viewer-pen-options') ||
{
selectedSize: 1,
selectedColor: null,
};
element.style.setProperty('--pen-tip-fill', options.selectedColor);
element.style.setProperty(
'--pen-tip-border',
options.selectedColor === '#000000' ? 'currentcolor' :
options.selectedColor);
this.annotationTool_ = {
tool: tool,
size: options.selectedSize,
color: options.selectedColor ? options.selectedColor : undefined,
};
this.inkController_.setAnnotationTool(this.annotationTool_);
}
/** @return Whether the annotation tool is using tool `toolName`. */
private isAnnotationTool_(toolName: string): boolean {
return !!this.annotationTool_ && this.annotationTool_.tool === toolName;
}
private getOpenDropdowns_(): NodeListOf<ViewerToolbarDropdownElement> {
return this.shadowRoot!.querySelectorAll(
'viewer-toolbar-dropdown[dropdown-open]');
}
/** @return Whether one of the dropdowns is open. */
hasOpenDropdown(): boolean {
return this.getOpenDropdowns_().length > 0;
}
closeDropdowns() {
this.getOpenDropdowns_().forEach(element => element.toggleDropdown());
}
}
declare global {
interface HTMLElementTagNameMap {
'viewer-annotations-bar': ViewerAnnotationsBarElement;
}
}
customElements.define(
ViewerAnnotationsBarElement.is, ViewerAnnotationsBarElement);