1-增加文件事件解耦,包含打开,另存为,新建,导入,导出,同时创建对应页面

2-增加样式功能实现
This commit is contained in:
JackLee 2026-04-07 22:20:27 +08:00
parent ad7b56395d
commit a64bcda4ab
20 changed files with 247 additions and 55 deletions

View File

@ -2,7 +2,7 @@ import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.Ab
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window, display, AppStorageV2 } from '@kit.ArkUI';
import { IBestInit } from "@ibestservices/ibest-ui-v2"
import {ExtractFonts,HilogSadboxFontDirFile} from "../pages/ExtractFonts/ExtractFonts"
import {ExtractDir,HilogSadboxFontDirFile} from "../pages/ExtractDir/ExtractDir"
import {MainWindowStageInfo,InitGlobalDisplayWindowInfo,mwInfo}from '../pages/DispWinInfo/DispWinInfo'
const DOMAIN = 0x0000;
@ -24,13 +24,11 @@ export default class EntryAbility extends UIAbility {
async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {
//InitFont->Copy Res/resfile/font to sandbox
if(!await ExtractFonts(this.context)){
return;
}else{
HilogSadboxFontDirFile(this.context);
await InitGlobalDisplayWindowInfo(windowStage);
if(ExtractDir(this.context,'fonts')&&ExtractDir(this.context,'example')){
HilogSadboxFontDirFile(this.context,'fonts');
HilogSadboxFontDirFile(this.context,'example');
}
InitGlobalDisplayWindowInfo(windowStage);
//Get Main Window
windowStage.getMainWindow((err, data) => {
if (err.code) {
@ -51,12 +49,12 @@ export default class EntryAbility extends UIAbility {
});
// windowSizeChangeListener to Change mainWindowWidth&&mainWindowHeight in AppStorage
this.mainWindow.on('windowSizeChange', (ListenerData) => {
this.mainWindow.on('windowSizeChange', (ChangeData) => {
// if Size Change save to AppStorage
mwInfo.width = ListenerData.width;
mwInfo.height = ListenerData.height;
console.info('Succeeded in enabling the listener for window size changes. Data:' + ListenerData.width,
ListenerData.height);
mwInfo.width = ChangeData.width;
mwInfo.height = ChangeData.height;
console.info('Succeeded in enabling the listener for window size changes. Data:' + ChangeData.width,
ChangeData.height);
});
});

View File

@ -0,0 +1,5 @@
export enum TextType {
SYTLE_DEFAULT,
SYTLE_DARK,
SYTLE_LIGHT
}

View File

@ -48,8 +48,8 @@ export async function InitGlobalDisplayWindowInfo(windowStage: window.WindowStag
mainWindowInfo.width = mainDisplayInfo.width-100;
mainWindowInfo.height = mainDisplayInfo.height-200;
mainWindowStage.winStage = windowStage;
console.error(`Display Width:%{public}d, Height: %{public}d`,mainDisplayInfo.width,mainDisplayInfo.height);
console.error(`MainWindow Width:%{public}d, Height: %{public}d`,mainWindowInfo.width,mainWindowInfo.height);
console.error(`Display Size:`,mainDisplayInfo.width,mainDisplayInfo.height);
console.error(`MainWindow Size:`,mainWindowInfo.width,mainWindowInfo.height);
}
//全局保存主窗口信息,屏幕信息.窗口管理器信息
export let mwInfo: MainWindowInfo = AppStorageV2.connect<MainWindowInfo>(MainWindowInfo, () => new MainWindowInfo())!;

View File

@ -80,7 +80,7 @@ export function CurrentXCompIndex(id:number):XCompInfo{
export function ExecuteCommand(event:TitleButton){
//事件处理
if(event?.eEvent=='Execute_LoadModel'){
//NativeOpenCAX.loadModel(undefined,undefined);
NativeOpenCAX.loadModel("/data/storage/el2/base/haps/entry/files/example/2027.stp");
}
if(event?.eEvent=='Create_New'){
CreateXCompNode("");
@ -89,16 +89,32 @@ export function ExecuteCommand(event:TitleButton){
//窗体打开
if(event?.eEvent=='Execute_CreateSubWindow'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.3,mwInfo.height*0.9);
//CreateAndShowSubWindow(winInfo);
CreateAndShowSubWindow(winInfo);
}else if(event?.eEvent=='Execute_ExitSubWindow'){
CloseSubWindow();
} else if(event?.eEvent=='Execute_CreateSubWindow_Options'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
}else if(event?.eEvent=='Execute_ExitSubWindow_Options'){
} else if(event?.eEvent=='Execute_NewFileWindow'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
}else if(event?.eEvent=='Execute_SaveAsFileWindow'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
}else if(event?.eEvent=='Execute_ImportFileWindow'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
}else if(event?.eEvent=='Execute_ExportFileWindow'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
} else if(event?.eEvent=='Open_NewModel'){
const winInfo:WinInfo=new WinInfo(event.eName,event.ePage,mwInfo.width*0.6,mwInfo.height*0.9);
CreateAndShowSubWindow(winInfo);
} else if(event?.eEvent=='Execute_ExitSubWindow_Options'){
CloseSubWindow();
}
//视图切换
if(event?.eEvent=='CMD_VIEW_FRONT'){
NativeOpenCAX.switchView("CMD_VIEW_FRONT");

View File

@ -0,0 +1,18 @@
import { TitleButton } from "../../LayoutInterface/Interface/ButtonInterface";
export interface FileBase{
//子模块TabBar头
exName:string;
exIcon:string;
exOtions:Array<Array<string>|string|number|TitleButton>
}
export interface FileInter {
//设置左侧边名字
sName:string
//设置左侧边加载布局页面
sPage:string
//设置Icon图标
sIcon:string
//设置子栏
sOptions:Array<FileBase>
}

View File

@ -0,0 +1,41 @@
import { FileInter } from "./FileInter";
import { ModelType } from "../../LayoutInterface/Layout/ModelType";
export let FileStr:Array<FileInter>=[
{
sName:'文件',
sPage:'',
sIcon:'string',
sOptions:[
{exName:'新建文件',exIcon:'',exOtions:
[
{eModel:[ModelType.BASE],eName:"目录:",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"单位:",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"文件名:",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"新建",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
]
},
{exName:'另存为文件',exIcon:'',exOtions:
[
{eModel:[ModelType.BASE],eName:"导入用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"导出用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"恢复默认用户布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
]
},
{exName:'导入模型',exIcon:'',exOtions:
[
{eModel:[ModelType.BASE],eName:"导入用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"导出用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"恢复默认用户布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
]
},
{exName:'导出模型',exIcon:'',exOtions:
[
{eModel:[ModelType.BASE],eName:"导入用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"导出用户界面布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
{eModel:[ModelType.BASE],eName:"恢复默认用户布局",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:""},
]
}
]
}
]

View File

@ -0,0 +1,23 @@
@Entry
@ComponentV2
export struct SWExportFile {
build() {
Column({ space: 5 }) {
Row(){
Text('保存目录:').width('10%')
TextInput().width('80%')
Button('选择目录').width('10%')
}.height('5%')
Row(){
Text('文件名:')
TextInput()
}.height('5%')
Blank().height('85%')
Row(){
Button('新建')
}.alignItems(VerticalAlign.Center)
}.margin({ top:0, left: 5, bottom: 0, right: 5 })
}
}

View File

@ -0,0 +1,23 @@
@Entry
@ComponentV2
export struct SWImportFile {
build() {
Column({ space: 5 }) {
Row(){
Text('保存目录:').width('10%')
TextInput().width('80%')
Button('选择目录').width('10%')
}.height('5%')
Row(){
Text('文件名:')
TextInput()
}.height('5%')
Blank().height('85%')
Row(){
Button('新建')
}.alignItems(VerticalAlign.Center)
}.margin({ top:0, left: 5, bottom: 0, right: 5 })
}
}

View File

@ -0,0 +1,24 @@
@Entry
@ComponentV2
export struct SWNewFile {
build() {
Column({ space: 5 }) {
Row(){
Text('保存目录:').width('10%')
TextInput().width('80%')
Button('选择目录').width('10%')
}.height('5%')
Row(){
Text('文件名:')
TextInput()
}.height('5%')
Blank().height('85%')
Row(){
Button('新建')
}.alignItems(VerticalAlign.Center)
}.margin({ top:0, left: 5, bottom: 0, right: 5 })
}
}

View File

@ -0,0 +1,19 @@
@Entry
@ComponentV2
export struct SWOpenFile {
build() {
Column({ space: 5 }) {
Row(){
Text('文件路径:').width('10%')
TextInput().width('80%')
Button('选择文件').width('10%')
}.height('5%')
Blank().height('80%')
Row(){
Button('打开')
}.alignItems(VerticalAlign.Center)
}.margin({ top:0, left: 5, bottom: 0, right: 5 })
}
}

View File

@ -0,0 +1,24 @@
@Entry
@ComponentV2
export struct SWSaveAsFile {
build() {
Column({ space: 5 }) {
Row(){
Text('保存目录:').width('10%')
TextInput().width('80%')
Button('选择目录').width('10%')
}.height('5%')
Row(){
Text('文件名:')
TextInput()
}.height('5%')
Blank().height('85%')
Row(){
Button('新建')
}.alignItems(VerticalAlign.Center)
}.margin({ top:0, left: 5, bottom: 0, right: 5 })
}
}

View File

@ -1,18 +1,9 @@
import fs from '@ohos.file.fs';
let Fonts: Array<string> = [
"HarmonyOS_Sans_Black.tff",
"HarmonyOS_Sans_Bold.tff",
"HarmonyOS_Sans_Light.tff",
"HarmonyOS_Sans_Medium.tff",
"HarmonyOS_Sans_Regular.tff",
"HarmonyOS_Sans_Semibold.tff",
"HarmonyOS_Sans_Thin.tff",
]
//列出资源管理器指定目录下的所有问题件
export function HilogSadboxFontDirFile(ctx: Context){
export function HilogSadboxFontDirFile(ctx: Context,dirName:string){
// 获取资源管理器
const rm = ctx?.filesDir+'/fonts/';
const rm = ctx?.filesDir+'/'+dirName+'/';
fs.listFile(rm).then((filenames: Array<string>) => {
console.info('沙箱文件信息'); // 打印成功日志
console.info('目录路径:'+rm); // 打印成功日志
@ -26,16 +17,16 @@ export function HilogSadboxFontDirFile(ctx: Context){
console.error('list file failed with error message: ' + err.message + ', error code: ' + err.code);
});
}
export async function CheckExistDir(dir:string):Promise<boolean>{
export function CheckExistDir(dir:string):boolean{
if (!dir || typeof dir !== 'string') {
console.error('Invalid directory path provided.');
return false;
}
try {
// 使用 fs.stat 获取路径的状态信息
const stat = await fs.stat(dir);
// 检查路径是否存在且是一个目录
if (stat && stat.isDirectory()) {
fs.accessSync(dir);
const stat = fs.statSync(dir);
if (stat.isDirectory()) {
console.info(`Directory exists: ${dir}`);
return true;
} else {
@ -56,16 +47,16 @@ export async function CheckExistDir(dir:string):Promise<boolean>{
}
//复制字体到沙盒指定目录
//SandBoxFontDir:"/data/storage/el2/base/haps/entry/files/fonts"
export async function ExtractFonts(ctx: Context):Promise<boolean>{
export function ExtractDir(ctx: Context,dirName:string):boolean{
//err->true表示复制成功
//err->表示复制失败
try {
//初始化源Fonts目录和沙箱Fonts目录路径
let srcPath = ctx?.resourceDir+ '/fonts/';
let destPath = ctx?.filesDir + '/fonts/';
let srcPath = ctx?.resourceDir+ '/'+dirName+'/';
let destPath = ctx?.filesDir + '/'+dirName+'/';
//检测目录是否存在
let srcDirState:boolean=await CheckExistDir(srcPath);
let destDirState:boolean=await CheckExistDir(destPath);
let srcDirState:boolean=CheckExistDir(srcPath);
let destDirState:boolean=CheckExistDir(destPath);
//源字体目录不存在则返回.->直接无法系统
if(!srcDirState){
return false;
@ -74,8 +65,6 @@ export async function ExtractFonts(ctx: Context):Promise<boolean>{
if(!destDirState){
fs.mkdir(destPath);
console.info('Created sandbox directory successfully:', destPath);
}else{
return true;
}
fs.copyDir(srcPath, destPath);
console.info('Fonts copied to sandbox successfully.');

View File

@ -17,23 +17,30 @@ export let MatrixModel:TitleModel= {
export let DevModel:TitleModel= {
cmName:"开发模式",cmPage:"",cmTips:"",cmEvents:[
[[{grpName:'工具矩阵',grpBtn:[
{eModel:[ModelType.BASE],eName:"新建实例",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"Create_New"},
{eModel:[ModelType.BASE],eName:"加载模型",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"Execute_LoadModel"},
{eModel:[ModelType.BASE],eName:"正等轴测图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_ISO"},
{eModel:[ModelType.BASE],eName:"正二等轴测图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_DIM"},
{eModel:[ModelType.BASE],eName:"前视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_FRONT"},
{eModel:[ModelType.BASE],eName:"后视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_REAR"},
{eModel:[ModelType.BASE],eName:"左视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_LEFT_SIDE"},
{eModel:[ModelType.BASE],eName:"右视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_RIGHT_SIDE"},
{eModel:[ModelType.BASE],eName:"俯视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_TOP"},
{eModel:[ModelType.BASE],eName:"仰视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_BOTTOM"},
{eModel:[ModelType.BASE],eName:"新建建模实例",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"Create_New"},
[
{eModel:[ModelType.BASE],eName:"创建子窗体",eNamed:"",ePage:'pages/EventSubWindow/SWExtrude',eIcon:"base_new_file",eTips:"",eEvent:"Execute_CreateSubWindow"},
{eModel:[ModelType.BASE],eName:"关闭子窗体",eNamed:"",ePage:'pages/EventSubWindow/SWExtrude',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ExitSubWindow"},
{eModel:[ModelType.BASE],eName:"加载模型",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"Execute_LoadModel"},
{eModel:[ModelType.BASE],eName:"选择加载模型",eNamed:"",ePage:'pages/EventSubWin/File/SWOpenFile',eIcon:"base_new_file",eTips:"",eEvent:"Open_NewModel"},
],
[
{eModel:[ModelType.BASE],eName:"首选项",eNamed:"",ePage:'pages/EventSubWindow/Options',eIcon:"base_new_file",eTips:"",eEvent:"Execute_CreateSubWindow_Options"},
{eModel:[ModelType.BASE],eName:"关闭",eNamed:"",ePage:'pages/EventSubWindow/Options',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ExitSubWindow_Options"},
{eModel:[ModelType.BASE],eName:"正等轴测图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_ISO"},
{eModel:[ModelType.BASE],eName:"正二等轴测图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_DIM"},
{eModel:[ModelType.BASE],eName:"前视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_FRONT"},
{eModel:[ModelType.BASE],eName:"后视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_REAR"},
{eModel:[ModelType.BASE],eName:"左视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_LEFT_SIDE"},
{eModel:[ModelType.BASE],eName:"右视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_RIGHT_SIDE"},
{eModel:[ModelType.BASE],eName:"俯视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_TOP"},
{eModel:[ModelType.BASE],eName:"仰视图",eNamed:"",ePage:'',eIcon:"base_new_file",eTips:"",eEvent:"CMD_VIEW_BOTTOM"},
],
[
{eModel:[ModelType.BASE],eName:"创建文件",eNamed:"",ePage:'pages/EventSubWin/File/SWNewFile',eIcon:"base_new_file",eTips:"",eEvent:"Execute_NewFileWindow"},
{eModel:[ModelType.BASE],eName:"另存为",eNamed:"",ePage:'pages/EventSubWin/File/SWSaveAsFile',eIcon:"base_new_file",eTips:"",eEvent:"Execute_SaveAsFileWindow"},
{eModel:[ModelType.BASE],eName:"导入文件",eNamed:"",ePage:'pages/EventSubWin/File/SWImportFile',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ImportFileWindow"},
{eModel:[ModelType.BASE],eName:"导出文件",eNamed:"",ePage:'pages/EventSubWin/File/SWExportFile',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ExportFileWindow"},
{eModel:[ModelType.BASE],eName:"创建子窗体",eNamed:"",ePage:'pages/EventSubWin/SWExtrude',eIcon:"base_new_file",eTips:"",eEvent:"Execute_CreateSubWindow"},
{eModel:[ModelType.BASE],eName:"关闭子窗体",eNamed:"",ePage:'pages/EventSubWin/SWExtrude',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ExitSubWindow"},
{eModel:[ModelType.BASE],eName:"首选项",eNamed:"",ePage:'pages/EventSubWin/Options',eIcon:"base_new_file",eTips:"",eEvent:"Execute_CreateSubWindow_Options"},
{eModel:[ModelType.BASE],eName:"关闭",eNamed:"",ePage:'pages/EventSubWin/Options',eIcon:"base_new_file",eTips:"",eEvent:"Execute_ExitSubWindow_Options"},
]
],grpMenu:GroupActionMenu}] as Array<TitleGroup>
]]

View File

@ -53,7 +53,7 @@ export struct TitleColumnSub {
}
this.viewDialog.open();
}).width(mwInfo.width*0.01)
.height(mwInfo.height*0.01)
.height(mwInfo.width*0.01)
.backgroundColor(Color.Transparent)
.backgroundImage($r('app.media.' + SwitchView[0].eIcon))
.backgroundImageSize({

View File

@ -3,6 +3,11 @@
"pages/Index",
"pages/EventSubWin/SWLine",
"pages/EventSubWin/SWExtrude",
"pages/EventSubWin/Options"
"pages/EventSubWin/Options",
"pages/EventSubWin/File/SWNewFile",
"pages/EventSubWin/File/SWSaveAsFile",
"pages/EventSubWin/File/SWImportFile",
"pages/EventSubWin/File/SWExportFile",
"pages/EventSubWin/File/SWOpenFile"
]
}