diff --git a/entry/src/main/ets/components/Menubar.ets b/entry/src/main/ets/components/Menubar.ets index 0dd100d..cfca553 100644 --- a/entry/src/main/ets/components/Menubar.ets +++ b/entry/src/main/ets/components/Menubar.ets @@ -1,7 +1,891 @@ -import { UIComponent, analysisXML } from "../utils/XMLHandler"; -import { common } from '@kit.AbilityKit'; -import { util } from '@kit.ArkTS'; -import { BusinessError } from '@kit.BasicServicesKit'; +import { SymbolGlyphModifier } from "@kit.ArkUI"; + +@ComponentV2 + + +struct FileMenu { + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "新建", labelInfo: "Ctrl+N" }); + MenuItem({ content: "打开", labelInfo: "Ctrl+O" }); + MenuItem({ content: "最近文档", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')) }); + MenuItem({ content: "标注PDF" }); + MenuItem({ content: "保存", labelInfo: "Ctrl+S" }); + MenuItem({ content: "另存为", labelInfo: "Shift+Ctrl+S" }); + } + MenuItemGroup() { + MenuItem({ content: "导出为PDF" }); + MenuItem({ content: "导出为...", labelInfo: "Ctrl+E" }); + } + MenuItemGroup() { + MenuItem({ content: "打印", labelInfo: "Ctrl+P" }); + MenuItem({ content: "退出", labelInfo: "Ctrl+Q" }); + } + } + } + + build() { + Text("文件") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct EditMenu { + @Local condition: boolean[] = [true, true]; + + @Builder + buildArrangeMenu() { + Menu() { + MenuItem({ content: "移到最前" }); + MenuItem({ content: "上移一层" }); + MenuItem({ content: "下移一层" }); + MenuItem({ content: "移到最后" }); + } + } + + @Builder + buildToolMenu() { + Menu() { + MenuItemGroup() {} + MenuItemGroup() { + MenuItem({ content: "管理" }); + MenuItem({ content: "设置" }); + } + } + } + + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "撤销", labelInfo: "Ctrl+Z" }); + MenuItem({ content: "重复", labelInfo: "Shift+Ctrl+Z" }); + } + MenuItemGroup() { + MenuItem({ content: "剪切", labelInfo: "Ctrl+X" }); + MenuItem({ content: "拷贝", labelInfo: "Ctrl+C" }); + MenuItem({ content: "粘贴", labelInfo: "Ctrl+V" }); + } + MenuItemGroup() { + MenuItem({ content: "全选", labelInfo: "Ctrl+A" }); + } + MenuItemGroup() { + MenuItem({ content: "查找", labelInfo: "Ctrl+F" }); + } + MenuItemGroup() { + MenuItem({ content: "删除", labelInfo: "Delete" }); + } + MenuItemGroup() { + MenuItem({ content: "排列选择", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildArrangeMenu.bind(this) }); + } + MenuItemGroup() { + MenuItem({ content: "上移选区图层" }); + MenuItem({ content: "下移选区图层" }); + } + MenuItemGroup() { + MenuItem({ content: "旋转吸附" }) + .selected(this.condition[0]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.condition[0] = isSelected; + }); + MenuItem({ content: "网格吸附" }) + .selected(this.condition[1]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.condition[1] = isSelected; + }); + } + MenuItemGroup() { + MenuItem({ content: "首选项" }); + MenuItem({ content: "工具栏", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildToolMenu.bind(this) }); + } + } + } + + build() { + Text("编辑") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct ViewMenu { + @Local menu1: boolean[] = [false, false, false]; + @Local menu2: boolean[] = [true, true, false]; + @Local condition: boolean = true; + @Local layout1: number = 1; + @Local layout2: number = 1; + @Local layout3: number = 1; + @Local row_col: number = 1; + + @Builder + buildLayoutMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "水平" }) + .selected(this.layout1 === 1) + .selectIcon(true) + .onChange(() => { + this.layout1 = 1; + }) + MenuItem({ content: "垂直" }) + .selected(this.layout1 === 2) + .selectIcon(true) + .onChange(() => { + this.layout1 = 2; + }); + } + MenuItemGroup() { + MenuItem({ content: "水平" }) + .selected(this.layout1 === 1) + .selectIcon(true) + .onChange(() => { + this.layout1 = 1; + }) + MenuItem({ content: "垂直" }) + .selected(this.layout1 === 2) + .selectIcon(true) + .onChange(() => { + this.layout1 = 2; + }); + } + MenuItemGroup() { + MenuItem({ content: "从左到右" }) + .selected(this.layout2 === 1) + .selectIcon(true) + .onChange(() => { + this.layout2 = 1; + }) + MenuItem({ content: "从右到左" }) + .selected(this.layout2 === 2) + .selectIcon(true) + .onChange(() => { + this.layout2 = 2; + }); + } + MenuItemGroup() { + MenuItem({ content: "从上到下" }) + .selected(this.layout3 === 1) + .selectIcon(true) + .onChange(() => { + this.layout3 = 1; + }) + MenuItem({ content: "从下到上" }) + .selected(this.layout3 === 2) + .selectIcon(true) + .onChange(() => { + this.layout3 = 2; + }); + } + } + } + + @Builder + buildColMenu() { + Menu() { + MenuItem({ content: "1列" }) + .selected(this.row_col === 1) + .selectIcon(true) + .onChange(() => { + this.row_col = 1; + }); + MenuItem({ content: "2列" }) + .selected(this.row_col === 2) + .selectIcon(true) + .onChange(() => { + this.row_col = 2; + }); + MenuItem({ content: "3列" }) + .selected(this.row_col === 3) + .selectIcon(true) + .onChange(() => { + this.row_col = 3; + }); + MenuItem({ content: "4列" }) + .selected(this.row_col === 4) + .selectIcon(true) + .onChange(() => { + this.row_col = 4; + }); + MenuItem({ content: "5列" }) + .selected(this.row_col === 5) + .selectIcon(true) + .onChange(() => { + this.row_col = 5; + }); + MenuItem({ content: "6列" }) + .selected(this.row_col === 6) + .selectIcon(true) + .onChange(() => { + this.row_col = 6; + }); + MenuItem({ content: "7列" }) + .selected(this.row_col === 7) + .selectIcon(true) + .onChange(() => { + this.row_col = 7; + }); + MenuItem({ content: "8列" }) + .selected(this.row_col === 8) + .selectIcon(true) + .onChange(() => { + this.row_col = 8; + }); + } + } + + @Builder + buildRowMenu() { + Menu() { + MenuItem({ content: "1行" }) + .selected(this.row_col === 9) + .selectIcon(true) + .onChange(() => { + this.row_col = 9; + }); + MenuItem({ content: "2行" }) + .selected(this.row_col === 10) + .selectIcon(true) + .onChange(() => { + this.row_col = 10; + }); + MenuItem({ content: "3行" }) + .selected(this.row_col === 11) + .selectIcon(true) + .onChange(() => { + this.row_col = 11; + }); + MenuItem({ content: "4行" }) + .selected(this.row_col === 12) + .selectIcon(true) + .onChange(() => { + this.row_col = 12; + }); + MenuItem({ content: "5行" }) + .selected(this.row_col === 13) + .selectIcon(true) + .onChange(() => { + this.row_col = 13; + }); + MenuItem({ content: "6行" }) + .selected(this.row_col === 14) + .selectIcon(true) + .onChange(() => { + this.row_col = 14; + }); + MenuItem({ content: "7行" }) + .selected(this.row_col === 15) + .selectIcon(true) + .onChange(() => { + this.row_col = 15; + }); + MenuItem({ content: "8行" }) + .selected(this.row_col === 16) + .selectIcon(true) + .onChange(() => { + this.row_col = 16; + }); + } + } + + @Builder + buildColRowMenu() { + Menu() { + MenuItem({ content: "设置列", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildColMenu.bind(this) }); + MenuItem({ content: "设置行", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildRowMenu.bind(this) }); + } + } + + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "双页模式" }) + .selected(this.menu1[0]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu1[0] = isSelected; + }); + MenuItem({ content: "演讲模式", labelInfo: "F5" }) + .selected(this.menu1[1]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu1[1] = isSelected; + }); + MenuItem({ content: "全屏", labelInfo: "F11" }) + .selected(this.menu1[2]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu1[2] = isSelected; + }); + } + MenuItemGroup() { + MenuItem({ content: "显示工具栏", labelInfo: "F9" }) + .selected(this.menu2[0]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu2[0] = isSelected; + }); + MenuItem({ content: "显示菜单", labelInfo: "F10" }) + .selected(this.menu2[1]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu2[1] = isSelected; + }); + MenuItem({ content: "显示侧边栏", labelInfo: "F12" }) + .selected(this.menu2[2]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.menu2[2] = isSelected; + }); + } + MenuItemGroup() { + MenuItem({ content: "布局", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildLayoutMenu.bind(this) }); + MenuItem({ content: "列/行", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildColRowMenu.bind(this) }); + } + MenuItemGroup() { + MenuItem({ content: "放大", labelInfo: "Ctrl++" }); + MenuItem({ content: "缩小", labelInfo: "Ctrl+-" }); + MenuItem({ content: "正常大小" }); + MenuItem({ content: "缩放至适合大小" }) + .selected(this.condition) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.condition = isSelected; + }); + } + } + } + + build() { + Text("视图") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct NavigationMenu { + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "首页", labelInfo: "Ctrl+Home" }); + MenuItem({ content: "前一页", labelInfo: "Ctrl+Page Up" }); + MenuItem({ content: "转到页面", labelInfo: "Ctrl+G" }); + MenuItem({ content: "下一页", labelInfo: "Ctrl+Page Down" }); + MenuItem({ content: "末页", labelInfo: "Ctrl+End" }); + } + MenuItemGroup() { + MenuItem({ content: "上一个图层", labelInfo: "Shift+Page Down" }); + MenuItem({ content: "下一个图层", labelInfo: "Shift+Page Up" }); + MenuItem({ content: "顶层" }); + } + MenuItemGroup() { + MenuItem({ content: "下一个标注页面", labelInfo: "Shift+Ctrl+Page Down" }); + MenuItem({ content: "上一个标注页面", labelInfo: "Shift+Ctrl+Page Up" }); + } + } + } + + build() { + Text("导航") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct PageMenu { + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "新建前页" }); + MenuItem({ content: "新建后页", labelInfo: "Ctrl+D" }); + MenuItem({ content: "新建尾页" }); + MenuItem({ content: "复制页面" }); + MenuItem({ content: "添加新的PDF页面" }); + MenuItem({ content: "配置页模板" }); + MenuItem({ content: "删除页面", labelInfo: "Shift+Ctrl+Delete" }); + } + MenuItemGroup() { + MenuItem({ content: "在活动图层上方添加一个图层", labelInfo: "Ctrl+L" }); + MenuItem({ content: "在活动图层下方添加一个图层" }); + MenuItem({ content: "删除图层", labelInfo: "Shift+Ctrl+L" }); + MenuItem({ content: "向下合并图层", labelInfo: "Ctrl+M" }); + MenuItem({ content: "重命名图层", labelInfo: "Ctrl+R" }); + } + MenuItemGroup() { + MenuItem({ content: "纸张样式" }); + MenuItem({ content: "纸张颜色" }); + MenuItem({ content: "纸张背景", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')) }); + } + } + } + + build() { + Text("页面") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct ToolMenu { + @Local menu1: number = 1; + @Local draw_type: boolean[] = [false, false, false, false, false, false, false, false]; + @Local set_square: boolean = false; + @Local compass: boolean = false; + @Local is_record: boolean = false; + @Local is_pause: boolean = false; + @Local pen_weight: number = 2; + @Local eraser_weight: number = 3; + @Local highlight_weight: number = 3; + @Local pen_style: number = 1; + @Local pen_fill: boolean = false; + @Local highlight_fill: boolean = false; + + @Builder + buildDrawTypeMenu() { + Menu() { + MenuItem({ content: "形状识别", labelInfo: "Ctrl+1" }) + .selected(this.draw_type[0]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[0] = isSelected; + }); + MenuItem({ content: "绘制矩形", labelInfo: "Ctrl+2" }) + .selected(this.draw_type[1]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[1] = isSelected; + }); + MenuItem({ content: "绘制椭圆", labelInfo: "Ctrl+3" }) + .selected(this.draw_type[2]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[2] = isSelected; + }); + MenuItem({ content: "绘制箭头", labelInfo: "Ctrl+4" }) + .selected(this.draw_type[3]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[3] = isSelected; + }); + MenuItem({ content: "绘制双箭头", labelInfo: "Ctrl+5" }) + .selected(this.draw_type[4]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[4] = isSelected; + }); + MenuItem({ content: "绘制坐标系统", labelInfo: "Ctrl+6" }) + .selected(this.draw_type[5]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[5] = isSelected; + }); + MenuItem({ content: "绘制直线", labelInfo: "Ctrl+7" }) + .selected(this.draw_type[6]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[6] = isSelected; + }); + MenuItem({ content: "绘制样条曲线", labelInfo: "Ctrl+8" }) + .selected(this.draw_type[7]) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.draw_type[7] = isSelected; + }); + } + } + + @Builder + buildPenMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "极细" }) + .selected(this.pen_weight == 1) + .selectIcon(true) + .onChange(() => { + this.pen_weight = 1; + }); + MenuItem({ content: "细" }) + .selected(this.pen_weight == 2) + .selectIcon(true) + .onChange(() => { + this.pen_weight = 2; + }); + MenuItem({ content: "中" }) + .selected(this.pen_weight == 3) + .selectIcon(true) + .onChange(() => { + this.pen_weight = 3; + }); + MenuItem({ content: "粗" }) + .selected(this.pen_weight == 4) + .selectIcon(true) + .onChange(() => { + this.pen_weight = 4; + }); + MenuItem({ content: "极粗" }) + .selected(this.pen_weight == 5) + .selectIcon(true) + .onChange(() => { + this.pen_weight = 5; + }); + } + MenuItemGroup() { + MenuItem({ content: "标准" }) + .selected(this.pen_style == 1) + .selectIcon(true) + .onChange(() => { + this.pen_style = 1; + }); + MenuItem({ content: "横虚线" }) + .selected(this.pen_style == 2) + .selectIcon(true) + .onChange(() => { + this.pen_style = 2; + }); + MenuItem({ content: "点划线" }) + .selected(this.pen_style == 3) + .selectIcon(true) + .onChange(() => { + this.pen_style = 3; + }); + MenuItem({ content: "点虚线" }) + .selected(this.pen_style == 4) + .selectIcon(true) + .onChange(() => { + this.pen_style = 4; + }); + } + MenuItemGroup() { + MenuItem({ content: "填充" }) + .selected(this.pen_fill) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.pen_fill = isSelected; + }); + MenuItem({ content: "填充不透明度" }); + } + } + } + + @Builder + buildEraserMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "极细" }) + .selected(this.eraser_weight == 1) + .selectIcon(true) + .onChange(() => { + this.eraser_weight = 1; + }); + MenuItem({ content: "细" }) + .selected(this.eraser_weight == 2) + .selectIcon(true) + .onChange(() => { + this.eraser_weight = 2; + }); + MenuItem({ content: "中" }) + .selected(this.eraser_weight == 3) + .selectIcon(true) + .onChange(() => { + this.eraser_weight = 3; + }); + MenuItem({ content: "粗" }) + .selected(this.eraser_weight == 4) + .selectIcon(true) + .onChange(() => { + this.eraser_weight = 4; + }); + MenuItem({ content: "极粗" }) + .selected(this.eraser_weight == 5) + .selectIcon(true) + .onChange(() => { + this.eraser_weight = 5; + }); + } + MenuItemGroup() { + MenuItem({ content: "标准" }); + MenuItem({ content: "涂白" }); + MenuItem({ content: "删除笔划" }); + } + } + } + + @Builder + buildHighLightMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "极细" }) + .selected(this.highlight_weight == 1) + .selectIcon(true) + .onChange(() => { + this.highlight_weight = 1; + }); + MenuItem({ content: "细" }) + .selected(this.highlight_weight == 2) + .selectIcon(true) + .onChange(() => { + this.highlight_weight = 2; + }); + MenuItem({ content: "中" }) + .selected(this.highlight_weight == 3) + .selectIcon(true) + .onChange(() => { + this.highlight_weight = 3; + }); + MenuItem({ content: "粗" }) + .selected(this.highlight_weight == 4) + .selectIcon(true) + .onChange(() => { + this.highlight_weight = 4; + }); + MenuItem({ content: "极粗" }) + .selected(this.highlight_weight == 5) + .selectIcon(true) + .onChange(() => { + this.highlight_weight = 5; + }); + } + MenuItemGroup() { + MenuItem({ content: "填充" }) + .selected(this.highlight_fill) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.highlight_fill = isSelected; + }); + MenuItem({ content: "填充不透明度" }); + } + } + } + + @Builder + buildPDFMenu() { + Menu() { + MenuItem({ content: "标记不透明度" }); + } + } + + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "画笔", labelInfo: "Shift+Ctrl+P" }) + .selected(this.menu1 == 1) + .selectIcon(true) + .onChange(() => { + this.menu1 = 1; + }); + MenuItem({ content: "橡皮", labelInfo: "Shift+Ctrl+E" }) + .selected(this.menu1 == 2) + .selectIcon(true) + .onChange(() => { + this.menu1 = 2; + }); + MenuItem({ content: "选择连续文本", labelInfo: "Shift+Ctrl+W" }) + .selected(this.menu1 == 3) + .selectIcon(true) + .onChange(() => { + this.menu1 = 3; + }); + MenuItem({ content: "在矩形中选择文本", labelInfo: "Shift+Ctrl+Y" }) + .selected(this.menu1 == 4) + .selectIcon(true) + .onChange(() => { + this.menu1 = 4; + }); + MenuItem({ content: "荧光笔", labelInfo: "Shift+Ctrl+H" }) + .selected(this.menu1 == 5) + .selectIcon(true) + .onChange(() => { + this.menu1 = 5; + }); + MenuItem({ content: "文本", labelInfo: "Shift+Ctrl+T" }) + .selected(this.menu1 == 6) + .selectIcon(true) + .onChange(() => { + this.menu1 = 6; + }); + MenuItem({ content: "图像", labelInfo: "Shift+Ctrl+I" }) + .selected(this.menu1 == 7) + .selectIcon(true) + .onChange(() => { + this.menu1 = 7; + }); + MenuItem({ content: "默认工具", labelInfo: "Shift+Ctrl+D" }); + } + MenuItemGroup() { + MenuItem({ content: "绘制类型", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildDrawTypeMenu.bind(this) }); + } + MenuItemGroup() { + MenuItem({ content: "选择矩形", labelInfo: "Shift+Ctrl+R" }) + .selected(this.menu1 == 8) + .selectIcon(true) + .onChange(() => { + this.menu1 = 8; + }); + MenuItem({ content: "选择区域", labelInfo: "Shift+Ctrl+G" }) + .selected(this.menu1 == 9) + .selectIcon(true) + .onChange(() => { + this.menu1 = 9; + }); + MenuItem({ content: "选择多层矩形" }) + .selected(this.menu1 == 10) + .selectIcon(true) + .onChange(() => { + this.menu1 = 10; + }); + MenuItem({ content: "选择多层区域" }) + .selected(this.menu1 == 11) + .selectIcon(true) + .onChange(() => { + this.menu1 = 11; + }); + MenuItem({ content: "选择对象", labelInfo: "Shift+Ctrl+O" }) + .selected(this.menu1 == 12) + .selectIcon(true) + .onChange(() => { + this.menu1 = 12; + }); + MenuItem({ content: "垂直间距", labelInfo: "Shift+Ctrl+V" }) + .selected(this.menu1 == 13) + .selectIcon(true) + .onChange(() => { + this.menu1 = 13; + }); + MenuItem({ content: "播放对象" }) + .selected(this.menu1 == 14) + .selectIcon(true) + .onChange(() => { + this.menu1 = 14; + }); + MenuItem({ content: "手形工具", labelInfo: "Shift+Ctrl+A" }) + .selected(this.menu1 == 15) + .selectIcon(true) + .onChange(() => { + this.menu1 = 15; + }); + MenuItem({ content: "三角板" }) + .selected(this.set_square) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.set_square = isSelected; + }); + MenuItem({ content: "圆规" }) + .selected(this.compass) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.compass = isSelected; + }); + } + MenuItemGroup() { + MenuItem({ content: "画笔选项", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildPenMenu.bind(this) }); + MenuItem({ content: "橡皮选项", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildEraserMenu.bind(this) }); + MenuItem({ content: "高亮选项", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildHighLightMenu.bind(this) }); + MenuItem({ content: "选择PDF文件选项", symbolEndIcon: new SymbolGlyphModifier($r('sys.symbol.chevron_right')), builder: this.buildPDFMenu.bind(this) }); + MenuItem({ content: "文本字体" }); + MenuItem({ content: "录制/停止" }) + .selected(this.is_record) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.is_record = isSelected; + }); + MenuItem({ content: "暂停" }) + .selected(this.is_pause) + .selectIcon(true) + .onChange((isSelected: boolean) => { + this.is_pause = isSelected; + }); + MenuItem({ content: "停止" }); + MenuItem({ content: "下一步" }); + MenuItem({ content: "后退" }); + MenuItem({ content: "插入/编辑TeX", labelInfo: "Shift+Ctrl+X" }); + } + } + } + + build() { + Text("工具") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} + + + +@ComponentV2 + + +struct PluginsMenu { + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "插件管理器" }); + } + } + } + + build() { + Text("插件") + .margin('12vp') + .bindMenu(this.buildMenu) + } +} + + + +@ComponentV2 + + +struct HelpMenu { + @Builder + buildMenu() { + Menu() { + MenuItemGroup() { + MenuItem({ content: "帮助" }); + MenuItem({ content: "关于" }); + } + } + } + + build() { + Text("帮助") + .margin('12vp') + .bindMenu(this.buildMenu()); + } +} @@ -9,78 +893,16 @@ import { BusinessError } from '@kit.BasicServicesKit'; export struct Menubar { - private content: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext; - @Local ui_components: UIComponent[] = []; - - aboutToAppear() { - const xml_string = this.getXML(); - this.ui_components = analysisXML(xml_string); - } - - getXML(): string { - try { - let data: Uint8Array = this.content.resourceManager.getRawFileContentSync("mainmenubar.xml"); - let text_decoder: util.TextDecoder = util.TextDecoder.create("utf-8", { ignoreBOM: true }); - let xml_string: string = text_decoder.decodeToString(data, { stream: false }); - return xml_string; - } catch (err) { - let code: number = (err as BusinessError).code; - let message: string = (err as BusinessError).message; - console.log(`[Error](${code}): ${message}`); - return ""; - } - } - - @Builder - buildMenu(items: UIComponent[]) { - Menu() { - ForEach(items, (item: UIComponent) => { - if (item.isSection === true) { - MenuItemGroup() { - ForEach(item.children || [], (sub: UIComponent) => { - this.buildMenuItem(sub); - }, (sub: UIComponent, idx) => idx.toString()) - } - } else { - this.buildMenuItem(item); - } - }, (item: UIComponent, idx) => idx.toString()); - } - } - - @Builder - buildMenuItem(item: UIComponent) { - if (item.children && item.children?.length > 0) { - MenuItem({ content: item.label, labelInfo: item.accel }) { - this.buildSubMenu(item.children || []); - } - } else { - MenuItem({ content: item.label, labelInfo: item.accel }); - } - } - - @Builder - buildSubMenu(items: UIComponent[]) { - Menu() { - ForEach(items, (sub: UIComponent) => { - if (sub.children && sub.children?.length > 0) { - MenuItem({ content: sub.label, labelInfo: sub.accel }) { - this.buildSubMenu(sub.children || []); - } - } else { - MenuItem({ content: sub.label, labelInfo: sub.accel }); - } - }, (sub: UIComponent, idx) => idx.toString()) - } - } - build() { Row() { - ForEach(this.ui_components, (menu: UIComponent) => { - Text(menu.label) - .bindMenu(this.buildMenu(menu.children || [])) - .padding('10vp') - }, (menu: UIComponent, idx) => idx.toString()) + FileMenu(); + EditMenu(); + ViewMenu(); + NavigationMenu(); + PageMenu(); + ToolMenu(); + PluginsMenu(); + HelpMenu(); } } } \ No newline at end of file diff --git a/entry/src/main/ets/utils/XMLHandler.ets b/entry/src/main/ets/utils/XMLHandler.ets deleted file mode 100644 index 73dfa3e..0000000 --- a/entry/src/main/ets/utils/XMLHandler.ets +++ /dev/null @@ -1,120 +0,0 @@ -import { convertxml } from '@kit.ArkTS'; - -interface XMLNode { - _name: string; - _attributes?: Record; - _text?: string; - _cdata?: string; - elements?: XMLNode[]; -} - -export interface UIComponent { - label: string; - action?: string; - accel?: string; - target?: string | number | boolean; - isSection?: boolean; - children?: UIComponent[]; -} - -export function analysisXML(xml_string: string): UIComponent[] { - const conv = new convertxml.ConvertXML(); - const options: convertxml.ConvertOptions = { - trim: true, - declarationKey: "_declaration", - instructionKey: "_instruction", - attributesKey: "_attributes", - textKey: "_text", - cdataKey: "_cdata", - doctypeKey: "_doctype", - commentKey: "_comment", - parentKey: "_parent", - typeKey: "_type", - nameKey: "_name", - elementsKey: "elements" - }; - - const result = conv.fastConvertToJSObject(xml_string, options) as XMLNode; - const interface_obj = result.elements?.[0]; - const menu = interface_obj?.elements?.find( - (elem: XMLNode) => elem._name === "menu" && elem._attributes?.id === "menubar" - ); - if (!menu) { - return []; - } - return getMenuItem(menu.elements || []); -} - -function getMenuItem(elements: XMLNode[]): UIComponent[] { - const items: UIComponent[] = []; - for (const elem of elements) { - if (elem._name === "submenu") { - const label = getAttribute(elem, "label") || ""; - const children = getMenuItem(elem.elements || []); - items.push({ - label: cleanLabel(label), - children: children.length > 0 ? children : undefined - }); - } else if (elem._name === "item") { - const label = getAttribute(elem, "label") || ""; - const action = getAttribute(elem, "action") || ""; - const accel = getAttribute(elem, "accel") || ""; - let target: string | number | boolean | undefined; - const target_attr = elem.elements?.find( - (e: XMLNode) => e._name === "attribute" && e._attributes?.name === "target" - ); - if (target_attr) { - const text_node = target_attr.elements?.[0]; - const raw = text_node?._text || text_node?._cdata || ""; - const type = target_attr._attributes?.type || "s"; - if (raw !== "") { - switch (type) { - case "i": - target = parseInt(raw, 10); - break; - case "b": - target = raw === "true" || raw === "1"; - break; - default: - target = raw; - break; - } - } - } - items.push({ - label: cleanLabel(label), - action: action, - accel: accel, - target: target - }); - } else if (elem._name === "section") { - const section_items = getMenuItem(elem.elements || []); - if (section_items.length > 0) { - items.push({ - label: "", - isSection: true, - children: section_items - }); - } - } - } - return items; -} - -function getAttribute(element: XMLNode, att_name: string): string | undefined { - const att_elem = element.elements?.find( - (elem: XMLNode) => elem._name === "attribute" && elem._attributes?.name === att_name - ); - if (att_elem) { - const text_node = att_elem.elements?.[0]; - if (text_node) { - return text_node._text || text_node._cdata; - } - return undefined; - } - return undefined; -} - -function cleanLabel(label: string): string { - return label.replace(/_/g, ""); -} \ No newline at end of file diff --git a/entry/src/main/resources/rawfile/mainmenubar.xml b/entry/src/main/resources/rawfile/mainmenubar.xml deleted file mode 100644 index 2c4e53d..0000000 --- a/entry/src/main/resources/rawfile/mainmenubar.xml +++ /dev/null @@ -1,874 +0,0 @@ - - - - - _File - -
- - _Export as PDF - win.export-as-pdf - - - Export as... - win.export-as - <Ctrl>e - -
-
- - Print - win.print - <Ctrl>p - - - Quit - app.quit - macos-menubar - -
-
- - _Edit -
- - Undo - win.undo - - - - Redo - win.redo - - -
-
- - Cut - win.cut - - - - Copy - win.copy - - - - Paste - win.paste - - -
-
- - Select All - win.select-all - <Ctrl>a - -
-
- - Find - win.search - <Ctrl>f - -
-
- - Delete - win.delete - Delete - -
-
- - Arrange Selection -
- - Bring to Front - win.arrange-selection-order - 0 - - - Bring Forward - win.arrange-selection-order - 1 - - - Send Backward - win.arrange-selection-order - 2 - - - Send to Back - win.arrange-selection-order - 3 - -
-
-
-
- - Move Selection Layer Up - win.move-selection-layer-up - - - Move Selection Layer Down - win.move-selection-layer-down - -
-
- - Rotation Snapping - win.rotation-snapping - - - Grid Snapping - win.grid-snapping - -
-
- - Preferences - app.preferences - macos-menubar - - - T_oolbars -
- - _Manage - win.manage-toolbar - - - _Customize - win.customize-toolbar - -
-
-
-
- - _View - -
- - Show Toolbars - win.show-toolbar - F9 - - - Show Menubar - win.show-menubar - F10 - - - Show Sidebar - win.show-sidebar - F12 - -
-
- - Layout -
- - _Horizontal - win.set-layout-vertical - false - - - _Vertical - win.set-layout-vertical - true - -
-
- - _Left to Right - win.set-layout-right-to-left - false - - - _Right to Left - win.set-layout-right-to-left - true - -
-
- - _Top to Bottom - win.set-layout-bottom-to-top - false - - - _Bottom to Top - win.set-layout-bottom-to-top - true - -
-
- - _Cols/Rows -
- - Set Columns -
- - - _1 Column - win.set-columns-or-rows - 1 - - - _2 Columns - win.set-columns-or-rows - 2 - - - _3 Columns - win.set-columns-or-rows - 3 - - - _4 Columns - win.set-columns-or-rows - 4 - - - _5 Columns - win.set-columns-or-rows - 5 - - - _6 Columns - win.set-columns-or-rows - 6 - - - _7 Columns - win.set-columns-or-rows - 7 - - - _8 Columns - win.set-columns-or-rows - 8 - -
-
- - Set Rows -
- - - _1 Row - win.set-columns-or-rows - -1 - - - _2 Rows - win.set-columns-or-rows - -2 - - - _3 Rows - win.set-columns-or-rows - -3 - - - _4 Rows - win.set-columns-or-rows - -4 - - - _5 Rows - win.set-columns-or-rows - -5 - - - _6 Rows - win.set-columns-or-rows - -6 - - - _7 Rows - win.set-columns-or-rows - -7 - - - _8 Rows - win.set-columns-or-rows - -8 - -
-
-
-
-
-
- - Zoom In - win.zoom-in - - - - Zoom Out - win.zoom-out - - - - Normal Size - win.zoom-100 - - - Zoom to Fit - win.zoom-fit - -
-
- - _Navigation - -
- - _Previous Layer - win.layer-goto-previous - <Shift>Page_Down - - - _Next Layer - win.layer-goto-next - <Shift>Page_Up - - - _Top Layer - win.layer-goto-top - -
-
- - N_ext Annotated Page - win.goto-next-annotated-page - <Ctrl><Shift>Page_Down - - - P_revious Annotated Page - win.goto-previous-annotated-page - <Ctrl><Shift>Page_Up - -
-
- - _Journal - -
- - Add a _Layer above the active layer - win.layer-new-above-current - <Ctrl>l - - - Add a layer below the active layer - win.layer-new-below-current - - - Delete Layer - win.layer-delete - <Ctrl><Shift>l - - - Merge Layer Down - win.layer-merge-down - <Ctrl>m - - - Rename Layer - win.layer-rename - <Ctrl>r - -
-
- - Paper _Format - win.paper-format - - - Paper _Color - win.paper-background-color - - - Paper B_ackground - -
-
- - _Tools - -
- - Drawing Type - - _Shape Recognizer - win.tool-draw-shape-recognizer - <Ctrl>1 - - - Draw Rectangle - win.tool-draw-rectangle - <Ctrl>2 - - - Draw Ellipse - win.tool-draw-ellipse - <Ctrl>3 - - - Draw Arrow - win.tool-draw-arrow - <Ctrl>4 - - - Draw Double Arrow - win.tool-draw-double-arrow - <Ctrl>5 - - - Draw Coordinate System - win.tool-draw-coordinate-system - <Ctrl>6 - - - Draw _Line - win.tool-draw-line - <Ctrl>7 - - - Draw Spline - win.tool-draw-spline - <Ctrl>8 - - -
-
- - Select Rectangle - win.select-tool - 6 - <Ctrl><Shift>r - - - Select Region - win.select-tool - 7 - <Ctrl><Shift>g - - - Select Multi-Layer Rectangle - win.select-tool - 8 - - - Select Multi-Layer Region - win.select-tool - 9 - - - Select Object - win.select-tool - 10 - <Ctrl><Shift>o - - - _Vertical Space - win.select-tool - 12 - <Ctrl><Shift>v - - - Play Object - win.select-tool - 11 - audio - - - H_and Tool - win.select-tool - 13 - <Ctrl><Shift>a - - - Setsquare - win.setsquare - - - Compass - win.compass - -
-
- - Pen _Options - -
- - standard - win.tool-pen-line-style - plain - - - dashed - win.tool-pen-line-style - dash - - - dash-/ dotted - win.tool-pen-line-style - dashdot - - - dotted - win.tool-pen-line-style - dot - -
-
- - Fi_ll - win.tool-pen-fill - - - Fill opacity - win.tool-pen-fill-opacity - -
-
- - Eraser Optio_ns - -
- - _standard - win.tool-eraser-type - 1 - - - _whiteout - win.tool-eraser-type - 2 - - - _delete strokes - win.tool-eraser-type - 3 - -
-
- - Highlighter Opti_ons - -
- - Fi_ll - win.tool-highlighter-fill - - - Fill opacity - win.tool-highlighter-fill-opacity - -
-
- - Select PDF Text Options -
- - Marker Opacity - win.tool-select-pdf-text-marker-opacity - -
-
- - Text Font... - win.select-font - <Ctrl><Shift>f - - - Record / Stop - win.audio-record - audio - - - Pause - win.audio-pause-playback - audio - - - Stop - win.audio-stop-playback - audio - - - Forward - win.audio-seek-forwards - audio - - - Back - win.audio-seek-backwards - audio - - - Add/Edit TeX - win.tex - <Ctrl><Shift>x - -
-
- - _Help - <Ctrl>h - - -
-