Merge pull request #67 from Hufe921/feature/image-display
Feature/image display
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { IElement } from '../..'
|
import { IElement, ImageDisplay } from '../..'
|
||||||
import { EditorMode, PageMode } from '../../dataset/enum/Editor'
|
import { EditorMode, PageMode } from '../../dataset/enum/Editor'
|
||||||
import { RowFlex } from '../../dataset/enum/Row'
|
import { RowFlex } from '../../dataset/enum/Row'
|
||||||
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
||||||
@@ -59,6 +59,7 @@ export class Command {
|
|||||||
private static print: CommandAdapt['print']
|
private static print: CommandAdapt['print']
|
||||||
private static replaceImageElement: CommandAdapt['replaceImageElement']
|
private static replaceImageElement: CommandAdapt['replaceImageElement']
|
||||||
private static saveAsImageElement: CommandAdapt['saveAsImageElement']
|
private static saveAsImageElement: CommandAdapt['saveAsImageElement']
|
||||||
|
private static changeImageDisplay: CommandAdapt['changeImageDisplay']
|
||||||
private static getImage: CommandAdapt['getImage']
|
private static getImage: CommandAdapt['getImage']
|
||||||
private static getValue: CommandAdapt['getValue']
|
private static getValue: CommandAdapt['getValue']
|
||||||
private static getWordCount: CommandAdapt['getWordCount']
|
private static getWordCount: CommandAdapt['getWordCount']
|
||||||
@@ -122,6 +123,7 @@ export class Command {
|
|||||||
Command.print = adapt.print.bind(adapt)
|
Command.print = adapt.print.bind(adapt)
|
||||||
Command.replaceImageElement = adapt.replaceImageElement.bind(adapt)
|
Command.replaceImageElement = adapt.replaceImageElement.bind(adapt)
|
||||||
Command.saveAsImageElement = adapt.saveAsImageElement.bind(adapt)
|
Command.saveAsImageElement = adapt.saveAsImageElement.bind(adapt)
|
||||||
|
Command.changeImageDisplay = adapt.changeImageDisplay.bind(adapt)
|
||||||
Command.getImage = adapt.getImage.bind(adapt)
|
Command.getImage = adapt.getImage.bind(adapt)
|
||||||
Command.getValue = adapt.getValue.bind(adapt)
|
Command.getValue = adapt.getValue.bind(adapt)
|
||||||
Command.getWordCount = adapt.getWordCount.bind(adapt)
|
Command.getWordCount = adapt.getWordCount.bind(adapt)
|
||||||
@@ -342,6 +344,10 @@ export class Command {
|
|||||||
return Command.saveAsImageElement()
|
return Command.saveAsImageElement()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public executeChangeImageDisplay(element: IElement, display: ImageDisplay) {
|
||||||
|
return Command.changeImageDisplay(element, display)
|
||||||
|
}
|
||||||
|
|
||||||
public getImage(): string[] {
|
public getImage(): string[] {
|
||||||
return Command.getImage()
|
return Command.getImage()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { WRAP, ZERO } from '../../dataset/constant/Common'
|
import { WRAP, ZERO } from '../../dataset/constant/Common'
|
||||||
import { EDITOR_ELEMENT_STYLE_ATTR } from '../../dataset/constant/Element'
|
import { EDITOR_ELEMENT_STYLE_ATTR } from '../../dataset/constant/Element'
|
||||||
import { defaultWatermarkOption } from '../../dataset/constant/Watermark'
|
import { defaultWatermarkOption } from '../../dataset/constant/Watermark'
|
||||||
import { ControlComponent } from '../../dataset/enum/Control'
|
import { ControlComponent, ImageDisplay } from '../../dataset/enum/Control'
|
||||||
import { EditorContext, EditorMode, PageMode } from '../../dataset/enum/Editor'
|
import { EditorContext, EditorMode, PageMode } from '../../dataset/enum/Editor'
|
||||||
import { ElementType } from '../../dataset/enum/Element'
|
import { ElementType } from '../../dataset/enum/Element'
|
||||||
import { ElementStyleKey } from '../../dataset/enum/ElementStyle'
|
import { ElementStyleKey } from '../../dataset/enum/ElementStyle'
|
||||||
@@ -1355,6 +1355,15 @@ export class CommandAdapt {
|
|||||||
downloadFile(element.value, `${element.id!}.png`)
|
downloadFile(element.value, `${element.id!}.png`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public changeImageDisplay(element: IElement, display: ImageDisplay) {
|
||||||
|
if (element.imgDisplay === display) return
|
||||||
|
element.imgDisplay = display
|
||||||
|
this.draw.getPreviewer().clearResizer()
|
||||||
|
this.draw.render({
|
||||||
|
isSetCursor: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
public getImage(): string[] {
|
public getImage(): string[] {
|
||||||
return this.draw.getDataURL()
|
return this.draw.getDataURL()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
import { ImageDisplay } from '../../../dataset/enum/Control'
|
||||||
import { ElementType } from '../../../dataset/enum/Element'
|
import { ElementType } from '../../../dataset/enum/Element'
|
||||||
import { IRegisterContextMenu } from '../../../interface/contextmenu/ContextMenu'
|
import { IContextMenuContext, IRegisterContextMenu } from '../../../interface/contextmenu/ContextMenu'
|
||||||
import { Command } from '../../command/Command'
|
import { Command } from '../../command/Command'
|
||||||
|
|
||||||
export const imageMenus: IRegisterContextMenu[] = [
|
export const imageMenus: IRegisterContextMenu[] = [
|
||||||
@@ -36,5 +37,28 @@ export const imageMenus: IRegisterContextMenu[] = [
|
|||||||
callback: (command: Command) => {
|
callback: (command: Command) => {
|
||||||
command.executeSaveAsImageElement()
|
command.executeSaveAsImageElement()
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文字环绕',
|
||||||
|
when: (payload) => {
|
||||||
|
return !payload.editorHasSelection && payload.startElement?.type === ElementType.IMAGE
|
||||||
|
},
|
||||||
|
childMenus: [
|
||||||
|
{
|
||||||
|
name: '嵌入型',
|
||||||
|
when: () => true,
|
||||||
|
callback: (command: Command, context: IContextMenuContext) => {
|
||||||
|
command.executeChangeImageDisplay(context.startElement!, ImageDisplay.BLOCK)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '上下型环绕',
|
||||||
|
when: () => true,
|
||||||
|
callback: (command: Command, context: IContextMenuContext) => {
|
||||||
|
command.executeChangeImageDisplay(context.startElement!, ImageDisplay.INLINE)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -40,7 +40,7 @@ import { Control } from './control/Control'
|
|||||||
import { zipElementList } from '../../utils/element'
|
import { zipElementList } from '../../utils/element'
|
||||||
import { CheckboxParticle } from './particle/CheckboxParticle'
|
import { CheckboxParticle } from './particle/CheckboxParticle'
|
||||||
import { DeepRequired } from '../../interface/Common'
|
import { DeepRequired } from '../../interface/Common'
|
||||||
import { ControlComponent } from '../../dataset/enum/Control'
|
import { ControlComponent, ImageDisplay } from '../../dataset/enum/Control'
|
||||||
import { formatElementList } from '../../utils/element'
|
import { formatElementList } from '../../utils/element'
|
||||||
import { WorkerManager } from '../worker/WorkerManager'
|
import { WorkerManager } from '../worker/WorkerManager'
|
||||||
import { Previewer } from './particle/previewer/Previewer'
|
import { Previewer } from './particle/previewer/Previewer'
|
||||||
@@ -571,9 +571,10 @@ export class Draw {
|
|||||||
const elementWidth = element.width! * scale
|
const elementWidth = element.width! * scale
|
||||||
const elementHeight = element.height! * scale
|
const elementHeight = element.height! * scale
|
||||||
// 图片超出尺寸后自适应
|
// 图片超出尺寸后自适应
|
||||||
if (curRow.width + elementWidth > innerWidth) {
|
const curRowWidth = element.imgDisplay === ImageDisplay.INLINE ? 0 : curRow.width
|
||||||
|
if (curRowWidth + elementWidth > innerWidth) {
|
||||||
// 计算剩余大小
|
// 计算剩余大小
|
||||||
const surplusWidth = innerWidth - curRow.width
|
const surplusWidth = innerWidth - curRowWidth
|
||||||
element.width = surplusWidth
|
element.width = surplusWidth
|
||||||
element.height = elementHeight * surplusWidth / elementWidth
|
element.height = elementHeight * surplusWidth / elementWidth
|
||||||
metrics.width = element.width
|
metrics.width = element.width
|
||||||
@@ -733,7 +734,9 @@ export class Draw {
|
|||||||
// 超过限定宽度
|
// 超过限定宽度
|
||||||
const preElement = elementList[i - 1]
|
const preElement = elementList[i - 1]
|
||||||
if (
|
if (
|
||||||
(preElement && preElement.type === ElementType.TABLE)
|
preElement?.type === ElementType.TABLE
|
||||||
|
|| preElement?.imgDisplay === ImageDisplay.INLINE
|
||||||
|
|| element.imgDisplay === ImageDisplay.INLINE
|
||||||
|| curRow.width + metrics.width > innerWidth
|
|| curRow.width + metrics.width > innerWidth
|
||||||
|| (i !== 0 && element.value === ZERO)
|
|| (i !== 0 && element.value === ZERO)
|
||||||
) {
|
) {
|
||||||
@@ -793,9 +796,11 @@ export class Draw {
|
|||||||
for (let j = 0; j < curRow.elementList.length; j++) {
|
for (let j = 0; j < curRow.elementList.length; j++) {
|
||||||
const element = curRow.elementList[j]
|
const element = curRow.elementList[j]
|
||||||
const metrics = element.metrics
|
const metrics = element.metrics
|
||||||
const offsetY = element.type === ElementType.IMAGE || element.type === ElementType.LATEX
|
const offsetY =
|
||||||
? curRow.ascent - metrics.height
|
(element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE)
|
||||||
: curRow.ascent
|
|| element.type === ElementType.LATEX
|
||||||
|
? curRow.ascent - metrics.height
|
||||||
|
: curRow.ascent
|
||||||
const positionItem: IElementPosition = {
|
const positionItem: IElementPosition = {
|
||||||
pageNo,
|
pageNo,
|
||||||
index,
|
index,
|
||||||
|
|||||||
@@ -293,7 +293,7 @@ export class Previewer {
|
|||||||
public drawResizer(element: IElement, position: IElementPosition, options: IPreviewerDrawOption = {}) {
|
public drawResizer(element: IElement, position: IElementPosition, options: IPreviewerDrawOption = {}) {
|
||||||
this.previewerDrawOption = options
|
this.previewerDrawOption = options
|
||||||
const { scale } = this.options
|
const { scale } = this.options
|
||||||
const { coordinate: { leftTop: [left, top] } } = position
|
const { coordinate: { leftTop: [left, top] }, ascent } = position
|
||||||
const elementWidth = element.width! * scale
|
const elementWidth = element.width! * scale
|
||||||
const elementHeight = element.height! * scale
|
const elementHeight = element.height! * scale
|
||||||
const height = this.draw.getHeight()
|
const height = this.draw.getHeight()
|
||||||
@@ -302,7 +302,7 @@ export class Previewer {
|
|||||||
const preY = this.draw.getPageNo() * (height + pageGap)
|
const preY = this.draw.getPageNo() * (height + pageGap)
|
||||||
// 边框
|
// 边框
|
||||||
this.resizerSelection.style.left = `${left}px`
|
this.resizerSelection.style.left = `${left}px`
|
||||||
this.resizerSelection.style.top = `${top + preY}px`
|
this.resizerSelection.style.top = `${top + preY + ascent}px`
|
||||||
this.resizerSelection.style.width = `${elementWidth}px`
|
this.resizerSelection.style.width = `${elementWidth}px`
|
||||||
this.resizerSelection.style.height = `${elementHeight}px`
|
this.resizerSelection.style.height = `${elementHeight}px`
|
||||||
// handle
|
// handle
|
||||||
|
|||||||
@@ -10,4 +10,9 @@ export enum ControlComponent {
|
|||||||
PLACEHOLDER = 'placeholder',
|
PLACEHOLDER = 'placeholder',
|
||||||
VALUE = 'value',
|
VALUE = 'value',
|
||||||
CHECKBOX = 'checkbox'
|
CHECKBOX = 'checkbox'
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ImageDisplay {
|
||||||
|
INLINE = 'inline',
|
||||||
|
BLOCK = 'block'
|
||||||
}
|
}
|
||||||
+3
-2
@@ -17,7 +17,7 @@ import { IHeader } from './interface/Header'
|
|||||||
import { IWatermark } from './interface/Watermark'
|
import { IWatermark } from './interface/Watermark'
|
||||||
import { defaultHeaderOption } from './dataset/constant/Header'
|
import { defaultHeaderOption } from './dataset/constant/Header'
|
||||||
import { defaultWatermarkOption } from './dataset/constant/Watermark'
|
import { defaultWatermarkOption } from './dataset/constant/Watermark'
|
||||||
import { ControlType } from './dataset/enum/Control'
|
import { ControlType, ImageDisplay } from './dataset/enum/Control'
|
||||||
import { defaultControlOption } from './dataset/constant/Control'
|
import { defaultControlOption } from './dataset/constant/Control'
|
||||||
import { IControlOption } from './interface/Control'
|
import { IControlOption } from './interface/Control'
|
||||||
import { ICheckboxOption } from './interface/Checkbox'
|
import { ICheckboxOption } from './interface/Checkbox'
|
||||||
@@ -115,7 +115,8 @@ export {
|
|||||||
ControlType,
|
ControlType,
|
||||||
EditorComponent,
|
EditorComponent,
|
||||||
EDITOR_COMPONENT,
|
EDITOR_COMPONENT,
|
||||||
PageMode
|
PageMode,
|
||||||
|
ImageDisplay
|
||||||
}
|
}
|
||||||
|
|
||||||
// 对外类型
|
// 对外类型
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ControlComponent } from '../dataset/enum/Control'
|
import { ControlComponent, ImageDisplay } from '../dataset/enum/Control'
|
||||||
import { ElementType } from '../dataset/enum/Element'
|
import { ElementType } from '../dataset/enum/Element'
|
||||||
import { RowFlex } from '../dataset/enum/Row'
|
import { RowFlex } from '../dataset/enum/Row'
|
||||||
import { ICheckbox } from './Checkbox'
|
import { ICheckbox } from './Checkbox'
|
||||||
@@ -74,6 +74,10 @@ export interface IDateElement {
|
|||||||
dateId?: string;
|
dateId?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IImageElement {
|
||||||
|
imgDisplay?: ImageDisplay
|
||||||
|
}
|
||||||
|
|
||||||
export type IElement = IElementBasic
|
export type IElement = IElementBasic
|
||||||
& IElementStyle
|
& IElementStyle
|
||||||
& ITable
|
& ITable
|
||||||
@@ -84,6 +88,7 @@ export type IElement = IElementBasic
|
|||||||
& ICheckboxElement
|
& ICheckboxElement
|
||||||
& ILaTexElement
|
& ILaTexElement
|
||||||
& IDateElement
|
& IDateElement
|
||||||
|
& IImageElement
|
||||||
|
|
||||||
export interface IElementMetrics {
|
export interface IElementMetrics {
|
||||||
width: number;
|
width: number;
|
||||||
|
|||||||
Reference in New Issue
Block a user