The doorhanger for highlighting has a basic color picker composed of 5 predefined colors to set the default color to use. These colors can be changed thanks to a preference for now but it's something which could be changed in the Firefox settings in the future. Each highlight has in its own toolbar a color picker to just change its color. The different color pickers are so similar (modulo few differences in their styles) that this patch introduces a new class ColorPicker which provides a color picker component which could be reused in future editors. All in all, a large part of this patch is dedicated to color picker itself and its style and the rest is almost a matter of wiring the component.
138 lines
3.5 KiB
JavaScript
138 lines
3.5 KiB
JavaScript
/* Copyright 2023 Mozilla Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { noContextMenu } from "../display_utils.js";
|
|
|
|
class EditorToolbar {
|
|
#toolbar = null;
|
|
|
|
#colorPicker = null;
|
|
|
|
#editor;
|
|
|
|
#buttons = null;
|
|
|
|
constructor(editor) {
|
|
this.#editor = editor;
|
|
}
|
|
|
|
render() {
|
|
const editToolbar = (this.#toolbar = document.createElement("div"));
|
|
editToolbar.className = "editToolbar";
|
|
editToolbar.addEventListener("contextmenu", noContextMenu);
|
|
editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown);
|
|
|
|
const buttons = (this.#buttons = document.createElement("div"));
|
|
buttons.className = "buttons";
|
|
editToolbar.append(buttons);
|
|
|
|
const position = this.#editor.toolbarPosition;
|
|
if (position) {
|
|
const { style } = editToolbar;
|
|
const x =
|
|
this.#editor._uiManager.direction === "ltr"
|
|
? 1 - position[0]
|
|
: position[0];
|
|
style.insetInlineEnd = `${100 * x}%`;
|
|
style.top = `calc(${
|
|
100 * position[1]
|
|
}% + var(--editor-toolbar-vert-offset))`;
|
|
}
|
|
|
|
this.#addDeleteButton();
|
|
|
|
return editToolbar;
|
|
}
|
|
|
|
static #pointerDown(e) {
|
|
e.stopPropagation();
|
|
}
|
|
|
|
#focusIn(e) {
|
|
this.#editor._focusEventsAllowed = false;
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
|
|
#focusOut(e) {
|
|
this.#editor._focusEventsAllowed = true;
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
|
|
#addListenersToElement(element) {
|
|
// If we're clicking on a button with the keyboard or with
|
|
// the mouse, we don't want to trigger any focus events on
|
|
// the editor.
|
|
element.addEventListener("focusin", this.#focusIn.bind(this), {
|
|
capture: true,
|
|
});
|
|
element.addEventListener("focusout", this.#focusOut.bind(this), {
|
|
capture: true,
|
|
});
|
|
element.addEventListener("contextmenu", noContextMenu);
|
|
}
|
|
|
|
hide() {
|
|
this.#toolbar.classList.add("hidden");
|
|
this.#colorPicker?.hideDropdown();
|
|
}
|
|
|
|
show() {
|
|
this.#toolbar.classList.remove("hidden");
|
|
}
|
|
|
|
#addDeleteButton() {
|
|
const button = document.createElement("button");
|
|
button.className = "delete";
|
|
button.tabIndex = 0;
|
|
button.setAttribute(
|
|
"data-l10n-id",
|
|
`pdfjs-editor-remove-${this.#editor.editorType}-button`
|
|
);
|
|
this.#addListenersToElement(button);
|
|
button.addEventListener("click", e => {
|
|
this.#editor._uiManager.delete();
|
|
});
|
|
this.#buttons.append(button);
|
|
}
|
|
|
|
get #divider() {
|
|
const divider = document.createElement("div");
|
|
divider.className = "divider";
|
|
return divider;
|
|
}
|
|
|
|
addAltTextButton(button) {
|
|
this.#addListenersToElement(button);
|
|
this.#buttons.prepend(button, this.#divider);
|
|
}
|
|
|
|
addColorPicker(colorPicker) {
|
|
this.#colorPicker = colorPicker;
|
|
const button = colorPicker.renderButton();
|
|
this.#addListenersToElement(button);
|
|
this.#buttons.prepend(button, this.#divider);
|
|
}
|
|
|
|
remove() {
|
|
this.#toolbar.remove();
|
|
this.#colorPicker?.destroy();
|
|
this.#colorPicker = null;
|
|
}
|
|
}
|
|
|
|
export { EditorToolbar };
|