You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
4.9 KiB
214 lines
4.9 KiB
// #ifdef APP-NVUE
|
|
import {
|
|
sleep,
|
|
getImageInfo,
|
|
isBase64,
|
|
networkReg
|
|
} from './utils';
|
|
const dom = weex.requireModule('dom')
|
|
import {
|
|
version
|
|
} from '../../package.json'
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
tempFilePath: [],
|
|
isInitFile: false,
|
|
osName: uni.getSystemInfoSync().osName
|
|
}
|
|
},
|
|
methods: {
|
|
getParentWeith() {
|
|
return new Promise(resolve => {
|
|
dom.getComponentRect(this.$refs.limepainter, (res) => {
|
|
this.parentWidth = Math.ceil(res.size.width)
|
|
this.canvasWidth = this.canvasWidth || this.parentWidth || 300
|
|
this.canvasHeight = res.size.height || this.canvasHeight || 150
|
|
resolve(res.size)
|
|
})
|
|
})
|
|
},
|
|
onPageFinish() {
|
|
this.webview = this.$refs.webview
|
|
this.webview.evalJS(`init(${this.dpr})`)
|
|
},
|
|
onMessage(e) {
|
|
const res = e.detail.data[0] || null;
|
|
if (res.event) {
|
|
if (res.event == 'inited') {
|
|
this.inited = true
|
|
}
|
|
if (res.event == 'fail') {
|
|
this.$emit('fail', res)
|
|
}
|
|
if (res.event == 'layoutChange') {
|
|
const data = typeof res.data == 'string' ? JSON.parse(res.data) : res.data
|
|
this.canvasWidth = Math.ceil(data.width);
|
|
this.canvasHeight = Math.ceil(data.height);
|
|
}
|
|
if (res.event == 'progressChange') {
|
|
this.progress = res.data * 1
|
|
}
|
|
if (res.event == 'file') {
|
|
this.tempFilePath.push(res.data)
|
|
if (this.tempFilePath.length > 7) {
|
|
this.tempFilePath.shift()
|
|
}
|
|
return
|
|
}
|
|
if (res.event == 'success') {
|
|
if (res.data) {
|
|
this.tempFilePath.push(res.data)
|
|
if (this.tempFilePath.length > 8) {
|
|
this.tempFilePath.shift()
|
|
}
|
|
if (this.isCanvasToTempFilePath) {
|
|
this.setFilePath(this.tempFilePath.join(''), {
|
|
isEmit: true
|
|
})
|
|
}
|
|
} else {
|
|
this.$emit('fail', 'canvas no data')
|
|
}
|
|
return
|
|
}
|
|
this.$emit(res.event, JSON.parse(res.data));
|
|
} else if (res.file) {
|
|
this.file = res.data;
|
|
} else {
|
|
console.info(res[0])
|
|
}
|
|
},
|
|
getWebViewInited() {
|
|
if (this.inited) return Promise.resolve(this.inited);
|
|
return new Promise((resolve) => {
|
|
this.$watch(
|
|
'inited',
|
|
async val => {
|
|
if (val) {
|
|
resolve(val)
|
|
}
|
|
}, {
|
|
immediate: true
|
|
}
|
|
);
|
|
})
|
|
},
|
|
getTempFilePath() {
|
|
if (this.tempFilePath.length == 8) return Promise.resolve(this.tempFilePath)
|
|
return new Promise((resolve) => {
|
|
this.$watch(
|
|
'tempFilePath',
|
|
async val => {
|
|
if (val.length == 8) {
|
|
resolve(val.join(''))
|
|
}
|
|
}, {
|
|
deep: true
|
|
}
|
|
);
|
|
})
|
|
},
|
|
getWebViewDone() {
|
|
if (this.progress == 1) return Promise.resolve(this.progress);
|
|
return new Promise((resolve) => {
|
|
this.$watch(
|
|
'progress',
|
|
async val => {
|
|
if (val == 1) {
|
|
this.$emit('done')
|
|
this.done = true
|
|
this.runTask()
|
|
resolve(val)
|
|
}
|
|
}, {
|
|
immediate: true
|
|
}
|
|
);
|
|
})
|
|
},
|
|
async render(args) {
|
|
try {
|
|
await this.getSize(args)
|
|
const {
|
|
width
|
|
} = args.css || args
|
|
if (!width && this.parentWidth) {
|
|
Object.assign(args, {
|
|
width: this.parentWidth
|
|
})
|
|
}
|
|
const newNode = await this.calcImage(args);
|
|
await this.getWebViewInited()
|
|
this.webview.evalJS(`source(${JSON.stringify(newNode)})`)
|
|
await this.getWebViewDone()
|
|
await sleep(this.afterDelay)
|
|
if (this.isCanvasToTempFilePath) {
|
|
const params = {
|
|
fileType: this.fileType,
|
|
quality: this.quality
|
|
}
|
|
this.webview.evalJS(`save(${JSON.stringify(params)})`)
|
|
}
|
|
return Promise.resolve()
|
|
} catch (e) {
|
|
this.$emit('fail', e)
|
|
}
|
|
},
|
|
async calcImage(args) {
|
|
let node = JSON.parse(JSON.stringify(args))
|
|
const urlReg = /url\((.+)\)/
|
|
const {
|
|
backgroundImage
|
|
} = node.css || {}
|
|
const isBG = backgroundImage && urlReg.exec(backgroundImage)[1]
|
|
const url = node.url || node.src || isBG
|
|
if (['text', 'qrcode'].includes(node.type)) {
|
|
return node
|
|
}
|
|
if ((node.type === "image" || isBG) && url && !isBase64(url) && (this.osName == 'ios' || !networkReg
|
|
.test(url))) {
|
|
let {
|
|
path
|
|
} = await getImageInfo(url, true)
|
|
if (isBG) {
|
|
node.css.backgroundImage = `url(${path})`
|
|
} else {
|
|
node.src = path
|
|
}
|
|
} else if (node.views && node.views.length) {
|
|
for (let i = 0; i < node.views.length; i++) {
|
|
node.views[i] = await this.calcImage(node.views[i])
|
|
}
|
|
}
|
|
return node
|
|
},
|
|
async canvasToTempFilePath(args = {}) {
|
|
if (!this.inited) {
|
|
return this.$emit('fail', 'no init')
|
|
}
|
|
this.tempFilePath = []
|
|
if (args.fileType == 'jpg') {
|
|
args.fileType = 'jpeg'
|
|
}
|
|
|
|
this.webview.evalJS(`save(${JSON.stringify(args)})`)
|
|
try {
|
|
let tempFilePath = await this.getTempFilePath()
|
|
|
|
tempFilePath = await this.setFilePath(tempFilePath, args)
|
|
args.success({
|
|
errMsg: "canvasToTempFilePath:ok",
|
|
tempFilePath
|
|
})
|
|
} catch (e) {
|
|
console.log('e', e)
|
|
args.fail({
|
|
error: e
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// #endif
|