Procházet zdrojové kódy

fix: 切换高亮无效;点击展开关闭右侧面板bug;选中文本和内容编辑冲突;内容编辑完成后更新text指针;

wzl před 1 rokem
rodič
revize
adea46744f

+ 16 - 10
packages/core/src/TextSelection.ts

@@ -61,13 +61,20 @@ export class TextSelection {
     this.pageViewer = options.pageViewer
 
     this.handleTool = this.handleTool.bind(this)
+    this.handleToolMode = this.handleToolMode.bind(this)
     this.handleMouseDown = this.handleMouseDown.bind(this)
     this.handleMouseMove = this.handleMouseMove.bind(this)
     this.handleMouseUp = this.handleMouseUp.bind(this)
 
+    this.toolMode = options.toolMode
     this.tool = options.tool
     this.color = options.color
     this.eventBus._on('toolChanged', this.handleTool)
+    this.eventBus._on('toolModeChanged', this.handleToolMode)
+  }
+
+  handleToolMode(mode: string) {
+    this.toolMode = mode
   }
 
   handleTool ({
@@ -93,22 +100,20 @@ export class TextSelection {
     return this._tool
   }
 
-  set tool (toolType) {
-    if (toolType === this._tool) return
-    if (!markupType.includes(toolType)) {
+  set tool (toolType: string) {
+    if ((toolType === this._tool && toolType !== '')) return
+    this._tool = toolType
+    if (!markupType.includes(toolType) || this.toolMode === 'editor') {
       document.removeEventListener('mousedown', this.handleMouseDown)
       document.removeEventListener('touchstart', this.handleMouseDown)
       document.removeEventListener('mousemove', this.handleMouseMove)
       document.removeEventListener('touchmove', this.handleMouseMove)
       return
     }
-    if (!(markupType.includes(toolType) && markupType.includes(this.tool))) {
-      document.addEventListener('mousedown', this.handleMouseDown)
-      document.addEventListener('touchstart', this.handleMouseDown)
-      document.addEventListener('mousemove', this.handleMouseMove)
-      document.addEventListener('touchmove', this.handleMouseMove)
-    }
-    this._tool = toolType
+    document.addEventListener('mousedown', this.handleMouseDown)
+    document.addEventListener('touchstart', this.handleMouseDown)
+    document.addEventListener('mousemove', this.handleMouseMove)
+    document.addEventListener('touchmove', this.handleMouseMove)
   }
 
   testPoint(event: MouseEvent) {
@@ -152,6 +157,7 @@ export class TextSelection {
       this.endPoint = point
     } else {
       this.container?.classList.remove('text')
+      return
     }
     if (!this.selecting) return
 

+ 4 - 8
packages/core/src/editor/content_container.js

@@ -13,15 +13,14 @@ export class ContentContainer {
     this.scale = options.scale
 
     this._cancelled = false
-    this.toolMode = this.pageViewer.toolMode || ''
     this.destroyed = false
+    this.rendered = false
     this.frameEditorList = []
     this.tool = this.pageViewer.tool || ''
     this.color = this.pageViewer.color || ''
     this._selectedFrameIndex = -1
 
     this.onHandleTool = this.handleTool.bind(this)
-    this.onHandleToolMode = this.handleToolMode.bind(this)
   }
 
   async init() {
@@ -49,7 +48,6 @@ export class ContentContainer {
     await this.init()
     
     this.eventBus._on('toolChanged', this.onHandleTool)
-    this.eventBus._on('toolModeChanged', this.onHandleToolMode)
 
     await this.messageHandler.sendWithPromise('BeginEdit', {
       editPagePtr: this.editPagePtr,
@@ -86,6 +84,7 @@ export class ContentContainer {
     }
 
     this.destroyed = false
+    this.rendered = true
   }
 
   show () {
@@ -107,6 +106,8 @@ export class ContentContainer {
   }
 
   destroy () {
+    if (this.destroyed || !this.rendered) return
+
     this.contentContainer?.remove()
     this.contentContainer = null
 
@@ -118,11 +119,6 @@ export class ContentContainer {
     this.destroyed = true
 
     this.eventBus._off('toolChanged', this.onHandleTool)
-    this.eventBus._off('toolModeChanged', this.onHandleToolMode)
-  }
-
-  handleToolMode (mode) {
-    this.toolMode = mode
   }
 
   handleTool({

+ 3 - 2
packages/core/src/editor/text_editor.js

@@ -486,9 +486,10 @@ export class TextEditor {
 
       } else if (!this.mouseMoved && flag) {
         this.state = 2
-        this.eventBus.dispatch('textPropertyChange', {isOpen: true})
         if (isMobileDevice) {
-          document.getElementById('propertyPanelButton').click()
+          this.eventBus.dispatch('changeIsEditorPanelDisabled')
+        } else {
+          this.eventBus.dispatch('textPropertyChange', {isOpen: true})
         }
       }
     }

+ 36 - 0
packages/core/src/index.js

@@ -1743,12 +1743,17 @@ class ComPDFKitViewer {
   }
 
   async setToolMode(mode) {
+    const oldMode = this.toolMode;
     this.toolMode = mode;
     // if (mode === 'editor' && !this.fontFileInited) {
     //   await this.initFontFile()
     // }
     this.eventBus.dispatch("toolModeChanged", mode);
 
+    if (oldMode === 'editor' && this.toolMode !== 'editor') {
+      await this.updateTextPtr();
+    }
+
     for (let page in this.annotations) {
       for (let i = 0; i < this.annotations[page].length; i++) {
         const annot = this.annotations[page][i]
@@ -1772,6 +1777,37 @@ class ComPDFKitViewer {
     }
   }
 
+  async updateTextPtr() {
+    await this.messageHandler.sendWithPromise('ClearPage', {
+      doc: this.doc
+    })
+
+    for (let pageIndex = 0; pageIndex < this.pagesCount; pageIndex++) {
+      await this.messageHandler.sendWithPromise('ClearText', {
+        textPtr: this.pagesPtr[pageIndex].textPtr
+      })
+
+      const pageSize = await this.messageHandler.sendWithPromise("GetPageSize", {
+        doc: this.doc,
+        pageIndex
+      })
+
+      const textPtr = await this.messageHandler.sendWithPromise('InitText', {
+        pagePtr: pageSize.pagePtr
+      })
+
+      this.pagesPtr[pageIndex].textPtr = textPtr
+      this.pagesPtr[pageIndex].pagePtr = pageSize.pagePtr
+    }
+
+    this.pdfViewer.pagesPtr = this.pagesPtr
+    this.pdfViewer._pages.forEach(page => {
+      page.pagesPtr = this.pagesPtr
+    });
+
+    this.pdfViewer.refresh()
+  }
+
   setPropertyPanel(props) {
     this.eventBus.dispatch("propertyPanelChanged", props);
   }

+ 1 - 0
packages/core/src/pdf_page_view.js

@@ -1072,6 +1072,7 @@ class PDFPageView {
             pagePtr: this.pagesPtr[this.pageIndex],
             messageHandler: this.messageHandler,
             tool: this.tool,
+            toolMode: this.toolMode,
             color: this.color,
             pageViewer: this
           })

+ 0 - 1
packages/core/src/pdf_viewer.js

@@ -650,7 +650,6 @@ class PDFViewer {
             pageIndex: pageNum - 1,
             scale,
             messageHandler: this.messageHandler,
-            pagesPtr: this.pagesPtr,
             annotationStore: this.annotationStore,
             annotations: annotations && annotations[pageNum - 1] || null,
             annotationsAll: annotations,

+ 10 - 0
packages/core/src/worker/compdfkit_worker.js

@@ -497,6 +497,16 @@ class CPDFWorker {
       return textPtr
     })
 
+    messageHandler.on('ClearText', (data) => {
+      const { textPtr } = data
+      Module._ClearText(textPtr)
+    })
+
+    messageHandler.on('ClearPage', (data) => {
+      const { pagePtr } = data
+      Module._ClearPage(pagePtr)
+    })
+
     messageHandler.on('Search', (data) => {
       const { pagesPtr, value } = data
       const text = stringToNewUTF8(value)

+ 5 - 0
packages/webview/src/components/ToggleRightPanelButton/index.vue

@@ -50,4 +50,9 @@
       core.toggleSidebar()
     }, 1);
   }
+
+  const changeDisabled = () => {
+    isEditorPanelDisabled.value = false
+  }
+  core.addEvent('changeIsEditorPanelDisabled', changeDisabled)
 </script>