diff --git a/src/hooks/useSearch.ts b/src/hooks/useSearch.ts index 994261f9..88ec0dbe 100644 --- a/src/hooks/useSearch.ts +++ b/src/hooks/useSearch.ts @@ -18,6 +18,8 @@ interface SearchTableResult { type SearchResult = SearchTextResult | SearchTableResult +type Modifiers = 'g' | 'gi' + export default () => { const mainStore = useMainStore() const slidesStore = useSlidesStore() @@ -28,10 +30,12 @@ export default () => { const replaceWord = ref('') const searchResults = ref([]) const searchIndex = ref(-1) + + const modifiers = ref('g') const search = () => { const textList: SearchResult[] = [] - const matchRegex = new RegExp(searchWord.value, 'g') + const matchRegex = new RegExp(searchWord.value, modifiers.value) const textRegex = /(<([^>]+)>)/g for (const slide of slides.value) { @@ -116,7 +120,7 @@ export default () => { type TextInfoList = ReturnType const getMatchList = (content: string, keyword: string) => { - const reg = new RegExp(keyword, 'g') + const reg = new RegExp(keyword, modifiers.value) const matchList = [] let match = reg.exec(content) while (match) { @@ -154,7 +158,7 @@ export default () => { const highlightTableText = (nodes: NodeListOf, index: number) => { for (const node of nodes) { - node.innerHTML = node.innerHTML.replace(new RegExp(searchWord.value, 'g'), () => { + node.innerHTML = node.innerHTML.replace(new RegExp(searchWord.value, modifiers.value), () => { return `${searchWord.value}` }) } @@ -393,13 +397,15 @@ export default () => { searchResults.value = [] searchIndex.value = -1 } - - watch(searchWord, () => { + + const reset = () => { searchIndex.value = -1 searchResults.value = [] if (!searchWord.value) clearMarks() - }) + } + + watch(searchWord, reset) watch(slideIndex, () => { nextTick(() => { @@ -417,15 +423,22 @@ export default () => { }) onBeforeUnmount(clearMarks) + + const toggleModifiers = () => { + modifiers.value = modifiers.value === 'g' ? 'gi' : 'g' + reset() + } return { searchWord, replaceWord, searchResults, searchIndex, + modifiers, searchNext, searchPrev, replace, replaceAll, + toggleModifiers, } } \ No newline at end of file diff --git a/src/views/Editor/CanvasTool/index.vue b/src/views/Editor/CanvasTool/index.vue index 574c3fa7..1767f6aa 100644 --- a/src/views/Editor/CanvasTool/index.vue +++ b/src/views/Editor/CanvasTool/index.vue @@ -4,8 +4,8 @@ - - + +
@@ -116,7 +116,7 @@ import Popover from '@/components/Popover.vue' import PopoverMenuItem from '@/components/PopoverMenuItem.vue' const mainStore = useMainStore() -const { creatingElement, creatingCustomShape } = storeToRefs(mainStore) +const { creatingElement, creatingCustomShape, showSelectPanel, showSearchPanel } = storeToRefs(mainStore) const { canUndo, canRedo } = storeToRefs(useSnapshotStore()) const { redo, undo } = useHistorySnapshot() @@ -191,13 +191,13 @@ const drawLine = (line: LinePoolItem) => { } // 打开选择面板 -const openSelectPanel = () => { - mainStore.setSelectPanelState(true) +const toggleSelectPanel = () => { + mainStore.setSelectPanelState(!showSelectPanel.value) } // 打开搜索替换面板 -const openSraechPanel = () => { - mainStore.setSearchPanelState(true) +const toggleSraechPanel = () => { + mainStore.setSearchPanelState(!showSearchPanel.value) } @@ -289,6 +289,7 @@ const openSraechPanel = () => { .handler-item { padding: 0 8px; + &.active, &:not(.disable):hover { background-color: #f1f1f1; } diff --git a/src/views/Editor/SearchPanel.vue b/src/views/Editor/SearchPanel.vue index 200b94de..a297277f 100644 --- a/src/views/Editor/SearchPanel.vue +++ b/src/views/Editor/SearchPanel.vue @@ -1,7 +1,7 @@ @@ -53,10 +59,12 @@ const { replaceWord, searchResults, searchIndex, + modifiers, searchNext, searchPrev, replace, replaceAll, + toggleModifiers, } = useSearch() const type = ref('search') @@ -98,6 +106,15 @@ watch(type, () => { margin-right: 8px; user-select: none; } +.ignore-case { + font-size: 12px; + user-select: none; + cursor: pointer; + + &.active { + color: $themeColor; + } +} .next-btn { width: 22px; height: 100%;