Merge pull request #67 from Hufe921/feature/image-display

Feature/image display
pr675
Hufe 4 years ago committed by GitHub
commit 75225e7180
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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

@ -11,3 +11,8 @@ export enum ControlComponent {
VALUE = 'value', VALUE = 'value',
CHECKBOX = 'checkbox' CHECKBOX = 'checkbox'
} }
export enum ImageDisplay {
INLINE = 'inline',
BLOCK = 'block'
}

@ -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;

Loading…
Cancel
Save