[Editor] Add a button to explicitly add an image (bug 1848108)
The main stamp button will be used to just enter in a add/edit image mode: - the user can add a new image in using the new button. - the user can edit an image in resizing, moving it. In image mode, when the user clicks outside on the page but not on an editor, then all the selected editors will be unselected.
This commit is contained in:
parent
d57e3ebbe4
commit
659fbc5020
@ -245,8 +245,8 @@ editor_free_text2.title=Text
|
|||||||
editor_free_text2_label=Text
|
editor_free_text2_label=Text
|
||||||
editor_ink2.title=Draw
|
editor_ink2.title=Draw
|
||||||
editor_ink2_label=Draw
|
editor_ink2_label=Draw
|
||||||
editor_stamp.title=Add an image
|
editor_stamp1.title=Add or edit images
|
||||||
editor_stamp_label=Add an image
|
editor_stamp1_label=Add or edit images
|
||||||
|
|
||||||
free_text2_default_content=Start typing…
|
free_text2_default_content=Start typing…
|
||||||
|
|
||||||
@ -256,6 +256,8 @@ editor_free_text_size=Size
|
|||||||
editor_ink_color=Color
|
editor_ink_color=Color
|
||||||
editor_ink_thickness=Thickness
|
editor_ink_thickness=Thickness
|
||||||
editor_ink_opacity=Opacity
|
editor_ink_opacity=Opacity
|
||||||
|
editor_stamp_add_image_label=Add image
|
||||||
|
editor_stamp_add_image.title=Add image
|
||||||
|
|
||||||
# Editor aria
|
# Editor aria
|
||||||
editor_free_text2_aria_label=Text Editor
|
editor_free_text2_aria_label=Text Editor
|
||||||
|
@ -166,7 +166,10 @@ class AnnotationEditorLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const editor = this.#createAndAddNewEditor({ offsetX: 0, offsetY: 0 });
|
const editor = this.#createAndAddNewEditor(
|
||||||
|
{ offsetX: 0, offsetY: 0 },
|
||||||
|
/* isCentered = */ false
|
||||||
|
);
|
||||||
editor.setInBackground();
|
editor.setInBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,9 +484,10 @@ class AnnotationEditorLayer {
|
|||||||
/**
|
/**
|
||||||
* Create and add a new editor.
|
* Create and add a new editor.
|
||||||
* @param {PointerEvent} event
|
* @param {PointerEvent} event
|
||||||
|
* @param {boolean} isCentered
|
||||||
* @returns {AnnotationEditor}
|
* @returns {AnnotationEditor}
|
||||||
*/
|
*/
|
||||||
#createAndAddNewEditor(event) {
|
#createAndAddNewEditor(event, isCentered) {
|
||||||
const id = this.getNextId();
|
const id = this.getNextId();
|
||||||
const editor = this.#createNewEditor({
|
const editor = this.#createNewEditor({
|
||||||
parent: this,
|
parent: this,
|
||||||
@ -491,6 +495,7 @@ class AnnotationEditorLayer {
|
|||||||
x: event.offsetX,
|
x: event.offsetX,
|
||||||
y: event.offsetY,
|
y: event.offsetY,
|
||||||
uiManager: this.#uiManager,
|
uiManager: this.#uiManager,
|
||||||
|
isCentered,
|
||||||
});
|
});
|
||||||
if (editor) {
|
if (editor) {
|
||||||
this.add(editor);
|
this.add(editor);
|
||||||
@ -499,6 +504,31 @@ class AnnotationEditorLayer {
|
|||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and add a new editor.
|
||||||
|
*/
|
||||||
|
addNewEditor() {
|
||||||
|
const { x, y, width, height } = this.div.getBoundingClientRect();
|
||||||
|
const tlX = Math.max(0, x);
|
||||||
|
const tlY = Math.max(0, y);
|
||||||
|
const brX = Math.min(window.innerWidth, x + width);
|
||||||
|
const brY = Math.min(window.innerHeight, y + height);
|
||||||
|
const centerX = (tlX + brX) / 2 - x;
|
||||||
|
const centerY = (tlY + brY) / 2 - y;
|
||||||
|
const [offsetX, offsetY] =
|
||||||
|
this.viewport.rotation % 180 === 0
|
||||||
|
? [centerX, centerY]
|
||||||
|
: [centerY, centerX];
|
||||||
|
|
||||||
|
this.#createAndAddNewEditor(
|
||||||
|
{
|
||||||
|
offsetX,
|
||||||
|
offsetY,
|
||||||
|
},
|
||||||
|
/* isCentered = */ true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the last selected editor.
|
* Set the last selected editor.
|
||||||
* @param {AnnotationEditor} editor
|
* @param {AnnotationEditor} editor
|
||||||
@ -560,7 +590,12 @@ class AnnotationEditorLayer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#createAndAddNewEditor(event);
|
if (this.#uiManager.getMode() === AnnotationEditorType.STAMP) {
|
||||||
|
this.#uiManager.unselectAll();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#createAndAddNewEditor(event, /* isCentered = */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,6 +48,8 @@ class AnnotationEditor {
|
|||||||
|
|
||||||
#isInEditMode = false;
|
#isInEditMode = false;
|
||||||
|
|
||||||
|
_initialOptions = Object.create(null);
|
||||||
|
|
||||||
_uiManager = null;
|
_uiManager = null;
|
||||||
|
|
||||||
_focusEventsAllowed = true;
|
_focusEventsAllowed = true;
|
||||||
@ -77,6 +79,7 @@ class AnnotationEditor {
|
|||||||
this._uiManager = parameters.uiManager;
|
this._uiManager = parameters.uiManager;
|
||||||
this.annotationElementId = null;
|
this.annotationElementId = null;
|
||||||
this._willKeepAspectRatio = false;
|
this._willKeepAspectRatio = false;
|
||||||
|
this._initialOptions.isCentered = parameters.isCentered;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
rotation,
|
rotation,
|
||||||
@ -154,6 +157,29 @@ class AnnotationEditor {
|
|||||||
this.div?.classList.toggle("draggable", value);
|
this.div?.classList.toggle("draggable", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
center() {
|
||||||
|
const [pageWidth, pageHeight] = this.pageDimensions;
|
||||||
|
switch (this.parentRotation) {
|
||||||
|
case 90:
|
||||||
|
this.x -= (this.height * pageHeight) / (pageWidth * 2);
|
||||||
|
this.y += (this.width * pageWidth) / (pageHeight * 2);
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
this.x += this.width / 2;
|
||||||
|
this.y += this.height / 2;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
this.x += (this.height * pageHeight) / (pageWidth * 2);
|
||||||
|
this.y -= (this.width * pageWidth) / (pageHeight * 2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.x -= this.width / 2;
|
||||||
|
this.y -= this.height / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.fixAndSetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add some commands into the CommandManager (undo/redo stuff).
|
* Add some commands into the CommandManager (undo/redo stuff).
|
||||||
* @param {Object} params
|
* @param {Object} params
|
||||||
|
@ -363,6 +363,10 @@ class FreeTextEditor extends AnnotationEditor {
|
|||||||
}
|
}
|
||||||
this.enableEditMode();
|
this.enableEditMode();
|
||||||
this.editorDiv.focus();
|
this.editorDiv.focus();
|
||||||
|
if (this._initialOptions?.isCentered) {
|
||||||
|
this.center();
|
||||||
|
}
|
||||||
|
this._initialOptions = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
|
@ -290,7 +290,12 @@ class StampEditor extends AnnotationEditor {
|
|||||||
this.width = width / parentWidth;
|
this.width = width / parentWidth;
|
||||||
this.height = height / parentHeight;
|
this.height = height / parentHeight;
|
||||||
this.setDims(width, height);
|
this.setDims(width, height);
|
||||||
this.fixAndSetPosition();
|
if (this._initialOptions?.isCentered) {
|
||||||
|
this.center();
|
||||||
|
} else {
|
||||||
|
this.fixAndSetPosition();
|
||||||
|
}
|
||||||
|
this._initialOptions = null;
|
||||||
if (this.#resizeTimeoutId !== null) {
|
if (this.#resizeTimeoutId !== null) {
|
||||||
clearTimeout(this.#resizeTimeoutId);
|
clearTimeout(this.#resizeTimeoutId);
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
/** @typedef {import("./annotation_editor_layer.js").AnnotationEditorLayer} AnnotationEditorLayer */
|
/** @typedef {import("./annotation_editor_layer.js").AnnotationEditorLayer} AnnotationEditorLayer */
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
AnnotationEditorParamsType,
|
||||||
AnnotationEditorPrefix,
|
AnnotationEditorPrefix,
|
||||||
AnnotationEditorType,
|
AnnotationEditorType,
|
||||||
FeatureTest,
|
FeatureTest,
|
||||||
@ -1144,6 +1145,10 @@ class AnnotationEditorUIManager {
|
|||||||
if (!this.#editorTypes) {
|
if (!this.#editorTypes) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (type === AnnotationEditorParamsType.CREATE) {
|
||||||
|
this.currentLayer.addNewEditor(type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (const editor of this.#selectedEditors) {
|
for (const editor of this.#selectedEditors) {
|
||||||
editor.updateParams(type, value);
|
editor.updateParams(type, value);
|
||||||
|
@ -78,6 +78,7 @@ const AnnotationEditorType = {
|
|||||||
|
|
||||||
const AnnotationEditorParamsType = {
|
const AnnotationEditorParamsType = {
|
||||||
RESIZE: 1,
|
RESIZE: 1,
|
||||||
|
CREATE: 2,
|
||||||
FREETEXT_SIZE: 11,
|
FREETEXT_SIZE: 11,
|
||||||
FREETEXT_COLOR: 12,
|
FREETEXT_COLOR: 12,
|
||||||
FREETEXT_OPACITY: 13,
|
FREETEXT_OPACITY: 13,
|
||||||
|
@ -15,7 +15,9 @@
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
closePages,
|
closePages,
|
||||||
|
dragAndDropAnnotation,
|
||||||
getEditorDimensions,
|
getEditorDimensions,
|
||||||
|
getEditorSelector,
|
||||||
loadAndWait,
|
loadAndWait,
|
||||||
serializeBitmapDimensions,
|
serializeBitmapDimensions,
|
||||||
waitForAnnotationEditorLayer,
|
waitForAnnotationEditorLayer,
|
||||||
@ -43,15 +45,8 @@ describe("Stamp Editor", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await page.click("#editorStamp");
|
await page.click("#editorStamp");
|
||||||
|
await page.click("#editorStampAddImage");
|
||||||
|
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
|
||||||
// With Chrome something is wrong when serializing a DomRect,
|
|
||||||
// hence we extract the values and just return them.
|
|
||||||
const { x, y } = el.getBoundingClientRect();
|
|
||||||
return { x, y };
|
|
||||||
});
|
|
||||||
|
|
||||||
await page.mouse.click(rect.x + 100, rect.y + 100);
|
|
||||||
const input = await page.$("#stampEditorFileInput");
|
const input = await page.$("#stampEditorFileInput");
|
||||||
await input.uploadFile(
|
await input.uploadFile(
|
||||||
`${path.join(__dirname, "../images/firefox_logo.png")}`
|
`${path.join(__dirname, "../images/firefox_logo.png")}`
|
||||||
@ -87,14 +82,7 @@ describe("Stamp Editor", () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
await page.click("#editorStampAddImage");
|
||||||
// With Chrome something is wrong when serializing a DomRect,
|
|
||||||
// hence we extract the values and just return them.
|
|
||||||
const { x, y } = el.getBoundingClientRect();
|
|
||||||
return { x, y };
|
|
||||||
});
|
|
||||||
|
|
||||||
await page.mouse.click(rect.x + 100, rect.y + 100);
|
|
||||||
const input = await page.$("#stampEditorFileInput");
|
const input = await page.$("#stampEditorFileInput");
|
||||||
await input.uploadFile(
|
await input.uploadFile(
|
||||||
`${path.join(__dirname, "../images/firefox_logo.svg")}`
|
`${path.join(__dirname, "../images/firefox_logo.svg")}`
|
||||||
@ -146,6 +134,7 @@ describe("Stamp Editor", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await page.click("#editorStamp");
|
await page.click("#editorStamp");
|
||||||
|
await page.click("#editorStampAddImage");
|
||||||
|
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||||
// With Chrome something is wrong when serializing a DomRect,
|
// With Chrome something is wrong when serializing a DomRect,
|
||||||
@ -154,7 +143,13 @@ describe("Stamp Editor", () => {
|
|||||||
return { x: right, y: bottom };
|
return { x: right, y: bottom };
|
||||||
});
|
});
|
||||||
|
|
||||||
await page.mouse.click(rect.x - 10, rect.y - 10);
|
const editorRect = await page.$eval(getEditorSelector(0), el => {
|
||||||
|
// With Chrome something is wrong when serializing a DomRect,
|
||||||
|
// hence we extract the values and just return them.
|
||||||
|
const { x, y } = el.getBoundingClientRect();
|
||||||
|
return { x, y };
|
||||||
|
});
|
||||||
|
|
||||||
const input = await page.$("#stampEditorFileInput");
|
const input = await page.$("#stampEditorFileInput");
|
||||||
await input.uploadFile(
|
await input.uploadFile(
|
||||||
`${path.join(__dirname, "../images/firefox_logo.png")}`
|
`${path.join(__dirname, "../images/firefox_logo.png")}`
|
||||||
@ -162,6 +157,15 @@ describe("Stamp Editor", () => {
|
|||||||
|
|
||||||
await page.waitForTimeout(300);
|
await page.waitForTimeout(300);
|
||||||
|
|
||||||
|
await dragAndDropAnnotation(
|
||||||
|
page,
|
||||||
|
editorRect.x + 10,
|
||||||
|
editorRect.y + 10,
|
||||||
|
rect.x - 10,
|
||||||
|
rect.y - 10
|
||||||
|
);
|
||||||
|
await page.waitForTimeout(10);
|
||||||
|
|
||||||
const { left } = await getEditorDimensions(page, 0);
|
const { left } = await getEditorDimensions(page, 0);
|
||||||
|
|
||||||
// The image is bigger than the page, so it has been scaled down to
|
// The image is bigger than the page, so it has been scaled down to
|
||||||
@ -204,14 +208,7 @@ describe("Stamp Editor", () => {
|
|||||||
await page.waitForTimeout(10);
|
await page.waitForTimeout(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
await page.click("#editorStampAddImage");
|
||||||
// With Chrome something is wrong when serializing a DomRect,
|
|
||||||
// hence we extract the values and just return them.
|
|
||||||
const { x, y } = el.getBoundingClientRect();
|
|
||||||
return { x, y };
|
|
||||||
});
|
|
||||||
|
|
||||||
await page.mouse.click(rect.x + 10, rect.y + 10);
|
|
||||||
await page.waitForTimeout(10);
|
await page.waitForTimeout(10);
|
||||||
const input = await page.$("#stampEditorFileInput");
|
const input = await page.$("#stampEditorFileInput");
|
||||||
await input.uploadFile(
|
await input.uploadFile(
|
||||||
|
@ -31,6 +31,7 @@ class AnnotationEditorParams {
|
|||||||
editorInkColor,
|
editorInkColor,
|
||||||
editorInkThickness,
|
editorInkThickness,
|
||||||
editorInkOpacity,
|
editorInkOpacity,
|
||||||
|
editorStampAddImage,
|
||||||
}) {
|
}) {
|
||||||
const dispatchEvent = (typeStr, value) => {
|
const dispatchEvent = (typeStr, value) => {
|
||||||
this.eventBus.dispatch("switchannotationeditorparams", {
|
this.eventBus.dispatch("switchannotationeditorparams", {
|
||||||
@ -54,6 +55,9 @@ class AnnotationEditorParams {
|
|||||||
editorInkOpacity.addEventListener("input", function () {
|
editorInkOpacity.addEventListener("input", function () {
|
||||||
dispatchEvent("INK_OPACITY", this.valueAsNumber);
|
dispatchEvent("INK_OPACITY", this.valueAsNumber);
|
||||||
});
|
});
|
||||||
|
editorStampAddImage.addEventListener("click", () => {
|
||||||
|
dispatchEvent("CREATE");
|
||||||
|
});
|
||||||
|
|
||||||
this.eventBus._on("annotationeditorparamschanged", evt => {
|
this.eventBus._on("annotationeditorparamschanged", evt => {
|
||||||
for (const [type, value] of evt.details) {
|
for (const [type, value] of evt.details) {
|
||||||
|
@ -218,6 +218,7 @@ class Toolbar {
|
|||||||
editorInkButton,
|
editorInkButton,
|
||||||
editorInkParamsToolbar,
|
editorInkParamsToolbar,
|
||||||
editorStampButton,
|
editorStampButton,
|
||||||
|
editorStampParamsToolbar,
|
||||||
}) {
|
}) {
|
||||||
const editorModeChanged = ({ mode }) => {
|
const editorModeChanged = ({ mode }) => {
|
||||||
toggleCheckedBtn(
|
toggleCheckedBtn(
|
||||||
@ -230,7 +231,11 @@ class Toolbar {
|
|||||||
mode === AnnotationEditorType.INK,
|
mode === AnnotationEditorType.INK,
|
||||||
editorInkParamsToolbar
|
editorInkParamsToolbar
|
||||||
);
|
);
|
||||||
toggleCheckedBtn(editorStampButton, mode === AnnotationEditorType.STAMP);
|
toggleCheckedBtn(
|
||||||
|
editorStampButton,
|
||||||
|
mode === AnnotationEditorType.STAMP,
|
||||||
|
editorStampParamsToolbar
|
||||||
|
);
|
||||||
|
|
||||||
const isDisable = mode === AnnotationEditorType.DISABLE;
|
const isDisable = mode === AnnotationEditorType.DISABLE;
|
||||||
editorFreeTextButton.disabled = isDisable;
|
editorFreeTextButton.disabled = isDisable;
|
||||||
|
@ -118,6 +118,7 @@
|
|||||||
--secondaryToolbarButton-spreadOdd-icon: url(images/secondaryToolbarButton-spreadOdd.svg);
|
--secondaryToolbarButton-spreadOdd-icon: url(images/secondaryToolbarButton-spreadOdd.svg);
|
||||||
--secondaryToolbarButton-spreadEven-icon: url(images/secondaryToolbarButton-spreadEven.svg);
|
--secondaryToolbarButton-spreadEven-icon: url(images/secondaryToolbarButton-spreadEven.svg);
|
||||||
--secondaryToolbarButton-documentProperties-icon: url(images/secondaryToolbarButton-documentProperties.svg);
|
--secondaryToolbarButton-documentProperties-icon: url(images/secondaryToolbarButton-documentProperties.svg);
|
||||||
|
--editorParams-stampAddImage-icon: url(images/toolbarButton-zoomIn.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
:root:dir(rtl) {
|
:root:dir(rtl) {
|
||||||
@ -576,6 +577,11 @@ body {
|
|||||||
margin-bottom: -4px;
|
margin-bottom: -4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#editorStampParamsToolbar {
|
||||||
|
inset-inline-end: 40px;
|
||||||
|
background-color: var(--toolbar-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
#editorInkParamsToolbar {
|
#editorInkParamsToolbar {
|
||||||
inset-inline-end: 68px;
|
inset-inline-end: 68px;
|
||||||
background-color: var(--toolbar-bg-color);
|
background-color: var(--toolbar-bg-color);
|
||||||
@ -586,6 +592,10 @@ body {
|
|||||||
background-color: var(--toolbar-bg-color);
|
background-color: var(--toolbar-bg-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#editorStampAddImage::before {
|
||||||
|
mask-image: var(--editorParams-stampAddImage-icon);
|
||||||
|
}
|
||||||
|
|
||||||
.doorHanger,
|
.doorHanger,
|
||||||
.doorHangerRight {
|
.doorHangerRight {
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
|
@ -198,6 +198,14 @@ See https://github.com/adobe-type-tools/cmap-resources
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="editorParamsToolbar hidden doorHangerRight" id="editorStampParamsToolbar">
|
||||||
|
<div class="editorParamsToolbarContainer">
|
||||||
|
<button id="editorStampAddImage" class="secondaryToolbarButton" title="Add image" tabindex="105" data-l10n-id="editor_stamp_add_image">
|
||||||
|
<span data-l10n-id="editor_stamp_add_image_label">Add image</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
|
<div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
|
||||||
<div id="secondaryToolbarButtonContainer">
|
<div id="secondaryToolbarButtonContainer">
|
||||||
<!--#if GENERIC-->
|
<!--#if GENERIC-->
|
||||||
@ -343,8 +351,8 @@ See https://github.com/adobe-type-tools/cmap-resources
|
|||||||
<button id="editorInk" class="toolbarButton" disabled="disabled" title="Draw" role="radio" aria-checked="false" aria-controls="editorInkParamsToolbar" tabindex="35" data-l10n-id="editor_ink2">
|
<button id="editorInk" class="toolbarButton" disabled="disabled" title="Draw" role="radio" aria-checked="false" aria-controls="editorInkParamsToolbar" tabindex="35" data-l10n-id="editor_ink2">
|
||||||
<span data-l10n-id="editor_ink2_label">Draw</span>
|
<span data-l10n-id="editor_ink2_label">Draw</span>
|
||||||
</button>
|
</button>
|
||||||
<button id="editorStamp" class="toolbarButton hidden" disabled="disabled" title="Image" role="radio" aria-checked="false" tabindex="36" data-l10n-id="editor_stamp">
|
<button id="editorStamp" class="toolbarButton hidden" disabled="disabled" title="Add or edit images" role="radio" aria-checked="false" tabindex="36" data-l10n-id="editor_stamp1">
|
||||||
<span data-l10n-id="editor_stamp_label">Image</span>
|
<span data-l10n-id="editor_stamp1_label">Add or edit images</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -64,6 +64,9 @@ function getViewerConfiguration() {
|
|||||||
editorInkButton: document.getElementById("editorInk"),
|
editorInkButton: document.getElementById("editorInk"),
|
||||||
editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"),
|
editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"),
|
||||||
editorStampButton: document.getElementById("editorStamp"),
|
editorStampButton: document.getElementById("editorStamp"),
|
||||||
|
editorStampParamsToolbar: document.getElementById(
|
||||||
|
"editorStampParamsToolbar"
|
||||||
|
),
|
||||||
download: document.getElementById("download"),
|
download: document.getElementById("download"),
|
||||||
},
|
},
|
||||||
secondaryToolbar: {
|
secondaryToolbar: {
|
||||||
@ -160,6 +163,7 @@ function getViewerConfiguration() {
|
|||||||
editorInkColor: document.getElementById("editorInkColor"),
|
editorInkColor: document.getElementById("editorInkColor"),
|
||||||
editorInkThickness: document.getElementById("editorInkThickness"),
|
editorInkThickness: document.getElementById("editorInkThickness"),
|
||||||
editorInkOpacity: document.getElementById("editorInkOpacity"),
|
editorInkOpacity: document.getElementById("editorInkOpacity"),
|
||||||
|
editorStampAddImage: document.getElementById("editorStampAddImage"),
|
||||||
},
|
},
|
||||||
printContainer: document.getElementById("printContainer"),
|
printContainer: document.getElementById("printContainer"),
|
||||||
openFileInput:
|
openFileInput:
|
||||||
|
Loading…
Reference in New Issue
Block a user