From a99ebe39da216f516524459df85e85edcf97b40d Mon Sep 17 00:00:00 2001 From: JackLee <809262979@qq.com> Date: Wed, 18 Mar 2026 17:26:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=BC=A0=E6=A0=87=E6=97=8B?= =?UTF-8?q?=E8=BD=AC=E6=A8=A1=E5=9E=8B=20=E5=A2=9E=E5=8A=A0=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E5=9B=BE=E6=A0=87=E5=92=8C=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/cpp/NativeEGLOCCT/NativeManager.cpp | 5 +- .../main/ets/pages/CustomStyle/Expandable.ets | 19 ++++ entry/src/main/ets/pages/Index.ets | 28 +++--- .../LayoutInterface/Layout/LeftSideBar.ets | 8 ++ .../pages/LeftSideLayout/LeftSideLayout.ets | 0 entry/src/main/ets/pages/LeftSideTab.ets | 81 ++++++++++++++++++ .../{TitleTabLayout => TitleLayout}/README.md | 0 .../TitleColumnSub.ets | 0 .../TitleTab.ets | 1 - .../TitleTabContent.ets | 5 +- entry/src/main/ets/pages/leftSideTab.ets | 60 ------------- .../resources/base/media/base_expand_off.png | Bin 0 -> 3886 bytes .../resources/base/media/base_expand_on.png | Bin 0 -> 3882 bytes .../base/media/left_side_assembly.bmp | Bin 0 -> 65590 bytes .../base/media/left_side_mate_components.bmp | Bin 0 -> 65590 bytes 15 files changed, 131 insertions(+), 76 deletions(-) create mode 100644 entry/src/main/ets/pages/LayoutInterface/Layout/LeftSideBar.ets create mode 100644 entry/src/main/ets/pages/LeftSideLayout/LeftSideLayout.ets create mode 100644 entry/src/main/ets/pages/LeftSideTab.ets rename entry/src/main/ets/pages/{TitleTabLayout => TitleLayout}/README.md (100%) rename entry/src/main/ets/pages/{TitleTabLayout => TitleLayout}/TitleColumnSub.ets (100%) rename entry/src/main/ets/pages/{TitleTabLayout => TitleLayout}/TitleTab.ets (99%) rename entry/src/main/ets/pages/{TitleTabLayout => TitleLayout}/TitleTabContent.ets (96%) delete mode 100644 entry/src/main/ets/pages/leftSideTab.ets create mode 100644 entry/src/main/resources/base/media/base_expand_off.png create mode 100644 entry/src/main/resources/base/media/base_expand_on.png create mode 100644 entry/src/main/resources/base/media/left_side_assembly.bmp create mode 100644 entry/src/main/resources/base/media/left_side_mate_components.bmp diff --git a/entry/src/main/cpp/NativeEGLOCCT/NativeManager.cpp b/entry/src/main/cpp/NativeEGLOCCT/NativeManager.cpp index c0257ce5..c75c344f 100644 --- a/entry/src/main/cpp/NativeEGLOCCT/NativeManager.cpp +++ b/entry/src/main/cpp/NativeEGLOCCT/NativeManager.cpp @@ -216,6 +216,7 @@ void NativeManager::OnMouseEvent(OH_NativeXComponent *component, void *window) { if(event.button==OH_NATIVEXCOMPONENT_LEFT_BUTTON&&event.action==OH_NATIVEXCOMPONENT_MOUSE_PRESS){ if(NativeManager::isMouseMiddleBtnPressed){ NativeManager::isMouseMiddleBtnPressed=false; + return; } //记录按下时候的X.Y坐标 NativeManager::lastMouseX_=event.x; @@ -226,13 +227,13 @@ void NativeManager::OnMouseEvent(OH_NativeXComponent *component, void *window) { HILOG_WARN(NATIVE_TAG, "AtButton:%{public}d",event.button); HILOG_WARN(NATIVE_TAG, "AtButtonAction:%{public}d",event.action); HILOG_WARN(NATIVE_TAG, "AtisMouseMiddleBtnPressed:%{public}d",NativeManager::isMouseMiddleBtnPressed); - }else if(NativeManager::isMouseMiddleBtnPressed&&event.action==OH_NATIVEXCOMPONENT_MOUSE_MOVE){ + }else if(event.action==OH_NATIVEXCOMPONENT_MOUSE_MOVE&&NativeManager::isMouseMiddleBtnPressed){ // 计算鼠标移动距离 float deltaX = curtX - NativeManager::lastMouseX_; float deltaY = curtY - NativeManager::lastMouseY_; // 将像素移动量映射到旋转角度 // 这里的系数可以根据需要调整灵敏度 - float rotationSpeed = 0.005f; + float rotationSpeed = 0.003f; float angleX = deltaX * rotationSpeed; float angleY = deltaY * rotationSpeed; // 通知渲染线程执行旋转 diff --git a/entry/src/main/ets/pages/CustomStyle/Expandable.ets b/entry/src/main/ets/pages/CustomStyle/Expandable.ets index 87a6efa3..b8f868d8 100644 --- a/entry/src/main/ets/pages/CustomStyle/Expandable.ets +++ b/entry/src/main/ets/pages/CustomStyle/Expandable.ets @@ -24,4 +24,23 @@ export struct Expandable { .alignSelf(ItemAlign.Center) }.width('100%') } +} + +@ComponentV2 +export struct LeftSideTabExpan { + // 控制内容区域显示与隐藏的状态 + @Consumer('isSubExpanded') isSubExpanded: boolean=true; + build(){ + // 标题行 + Row({ space: 0 }) { + // 切换按钮,显示向上或向下箭头 + Button(this.isSubExpanded ? '◀' : '▶') + .type(ButtonType.Normal) + .fontSize(12) + .onClick(() => { + // 点击按钮时,切换 isSubExpanded 状态 + this.isSubExpanded = !this.isSubExpanded; + }) + } + } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index fab1a726..84a026be 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -1,9 +1,9 @@ import { hilog } from '@kit.PerformanceAnalysisKit'; import { edgeColors,display } from '@kit.ArkUI'; -import {TitleTab} from './TitleTabLayout/TitleTab' -import {LeftSideTab} from './leftSideTab' +import {TitleTab} from './TitleLayout/TitleTab' +import {LeftSideTab} from './LeftSideTab' import {ModelViewTab} from './modelViewTab' -import {TitleColumnSub} from './TitleTabLayout/TitleColumnSub' +import {TitleColumnSub} from './TitleLayout/TitleColumnSub' const DOMAIN = 0x0000; @Entry @@ -12,29 +12,35 @@ struct Index { build() { //OpenCAX主界面整体布局,采用多行布局 - Column({space:1}) { + Column({space:0}) { //头部导航功能区 - TitleTab().height('auto').borderWidth('1vp') + TitleTab() + .height('auto') + .borderWidth(2) + .borderRadius(5) //工具栏 Row() { TitleColumnSub(); }.height('4%') .width('100%') - .borderWidth('1vp') + .borderWidth(2) + .borderRadius(5) .align(Alignment.Start) + .margin({ top: -2,left:0,bottom:0,right:0}) Row() { //左侧边导航区 - LeftSideTab().borderWidth('1vp').width('20%'); + LeftSideTab().width("15%"); //中间操作区域 Row() { ModelViewTab() - }.width('80%') + }.width('90%') .height('100%') - .borderWidth('1vp') + .borderWidth(1) .align(Alignment.Center) }.height('80%') - .padding(1) - .padding(1) + .borderWidth(2) + .borderRadius(5) + .margin({ top: -2,left:0,bottom:0,right:0}) Column(){ Text('状态栏').height('100%').width('100%') }.height('5%').borderWidth(1) diff --git a/entry/src/main/ets/pages/LayoutInterface/Layout/LeftSideBar.ets b/entry/src/main/ets/pages/LayoutInterface/Layout/LeftSideBar.ets new file mode 100644 index 00000000..7480a876 --- /dev/null +++ b/entry/src/main/ets/pages/LayoutInterface/Layout/LeftSideBar.ets @@ -0,0 +1,8 @@ +import { TitleButton } from "../Interface/ButtonInterface"; +import { ModelType } from "./ModelType"; + +export let LeftSideBars:Array=[ + {eModel:[ModelType.BASE],eName:"装配导航器",eNamed:"",ePage:'',eIcon:"left_side_assembly",eTips:"正三轴测图",eEvent:""}, + {eModel:[ModelType.BASE],eName:"约束导航器",eNamed:"",ePage:'',eIcon:"left_side_mate_components",eTips:"前视图",eEvent:""}, + {eModel:[ModelType.BASE],eName:"部件导航器",eNamed:"",ePage:'',eIcon:"base_model_cad",eTips:"前视图",eEvent:""}, +] \ No newline at end of file diff --git a/entry/src/main/ets/pages/LeftSideLayout/LeftSideLayout.ets b/entry/src/main/ets/pages/LeftSideLayout/LeftSideLayout.ets new file mode 100644 index 00000000..e69de29b diff --git a/entry/src/main/ets/pages/LeftSideTab.ets b/entry/src/main/ets/pages/LeftSideTab.ets new file mode 100644 index 00000000..e362b55e --- /dev/null +++ b/entry/src/main/ets/pages/LeftSideTab.ets @@ -0,0 +1,81 @@ +import { TitleButton } from './LayoutInterface/Interface/ButtonInterface'; +import {LeftSideBars} from './LayoutInterface/Layout/LeftSideBar' +@ComponentV2 +export struct LeftSideTab { + + private leftSideBarTabs: TabsController = new TabsController(); + @Local leftSideBarFocusIndex: number = 0; + @Local isExpanded:boolean=true; + @Local leftWidth:number=0; + + build() { + Row() { + Column({space:1}){ + Button() + .borderWidth(1) + .borderColor(Color.Grey) + .borderRadius(5) + .backgroundImagePosition({ x: '5%', y: '5%' }) + .backgroundColor(Color.Transparent) + .backgroundImageSize({ + width: '90%', // 图片宽度占满按钮 + height: '90%' // 图片高度占满按钮 + }) + .backgroundImage(this.isExpanded ? $r('app.media.base_expand_on'):$r('app.media.base_expand_off')) + .type(ButtonType.Normal) + .width(50) + .height(50) + .onClick(()=>{ + this.isExpanded = !this.isExpanded; + }).margin({ top: 2,left:1,bottom:0,right:2}) + Scroll() { + Flex({ direction: FlexDirection.Column}) { + ForEach(LeftSideBars, (item: TitleButton, index: number) => { + Column({ space: 0 }) { + Button() + .borderWidth(1) + .borderColor(Color.Grey) + .borderRadius(5) + .backgroundImagePosition({ x: '5%', y: '5%' }) + .backgroundColor(Color.Transparent) + .backgroundImageSize({ + width: '90%', // 图片宽度占满按钮 + height: '90%' // 图片高度占满按钮 + }) + .backgroundImage($r('app.media.'+item.eIcon)) + .fontWeight(index === this.leftSideBarFocusIndex ? FontWeight.Bold : FontWeight.Normal) + .height(50) + .width(50) + .type(ButtonType.Normal) + .onClick(() => { + this.leftSideBarTabs.changeIndex(index); + this.leftSideBarFocusIndex = index; + }) + }.margin({ top: 2,left:0,bottom:0,right:0}) + }) + Blank().height('95%') + } + } + .align(Alignment.Start) + .scrollable(ScrollDirection.Vertical) + .scrollBar(BarState.Off) + .width(50) + .height('100%') + } + Column({space:1}){ + if (this.isExpanded) { + Column() { + Tabs({ barPosition: BarPosition.Start, controller: this.leftSideBarTabs }) { + ForEach(LeftSideBars, (item: TitleButton, index: number) => { + TabContent() { + Text(item.eName) + .fontSize(30) + } + }) + }.barHeight(0) + } + } + } + }.width('auto') + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/TitleTabLayout/README.md b/entry/src/main/ets/pages/TitleLayout/README.md similarity index 100% rename from entry/src/main/ets/pages/TitleTabLayout/README.md rename to entry/src/main/ets/pages/TitleLayout/README.md diff --git a/entry/src/main/ets/pages/TitleTabLayout/TitleColumnSub.ets b/entry/src/main/ets/pages/TitleLayout/TitleColumnSub.ets similarity index 100% rename from entry/src/main/ets/pages/TitleTabLayout/TitleColumnSub.ets rename to entry/src/main/ets/pages/TitleLayout/TitleColumnSub.ets diff --git a/entry/src/main/ets/pages/TitleTabLayout/TitleTab.ets b/entry/src/main/ets/pages/TitleLayout/TitleTab.ets similarity index 99% rename from entry/src/main/ets/pages/TitleTabLayout/TitleTab.ets rename to entry/src/main/ets/pages/TitleLayout/TitleTab.ets index ce3c0ab6..d08b3687 100644 --- a/entry/src/main/ets/pages/TitleTabLayout/TitleTab.ets +++ b/entry/src/main/ets/pages/TitleLayout/TitleTab.ets @@ -77,7 +77,6 @@ export struct TitleTab { TabContent() { TitleTabContent({curtLayout:item}) }.align(Alignment.Start) - .padding(1) .margin({ top: 0,left:0,bottom:0,right:0}) }) }.scrollable(false) diff --git a/entry/src/main/ets/pages/TitleTabLayout/TitleTabContent.ets b/entry/src/main/ets/pages/TitleLayout/TitleTabContent.ets similarity index 96% rename from entry/src/main/ets/pages/TitleTabLayout/TitleTabContent.ets rename to entry/src/main/ets/pages/TitleLayout/TitleTabContent.ets index 2f665594..6c232c7a 100644 --- a/entry/src/main/ets/pages/TitleTabLayout/TitleTabContent.ets +++ b/entry/src/main/ets/pages/TitleLayout/TitleTabContent.ets @@ -15,7 +15,7 @@ export struct TitleTabContent { //迭代生成行容器 ForEach(this.curtLayout?.cmEvents, (row_items: Array|Array>, mIndex: number) => { //行的按钮组容器 - Row(){ + Row({ space: 1 }){ ForEach(row_items, (row_item: TitleButton|Array|Array, index: number) => { if(!Array.isArray(row_item)){//TitleButton //单按钮 @@ -44,6 +44,7 @@ export struct TitleTabContent { //功能组名 GroupTextEventMenu({grpEvent:group_item}) }.borderWidth(1) + .borderRadius(5) .borderColor(Color.Grey) }) }else{ @@ -63,6 +64,6 @@ export struct TitleTabContent { .borderColor(Color.Gray) }) }.margin({ top: 1,left:1,bottom:1,right:1}) - .borderWidth(1) + //.borderWidth(1) } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/leftSideTab.ets b/entry/src/main/ets/pages/leftSideTab.ets deleted file mode 100644 index f95673db..00000000 --- a/entry/src/main/ets/pages/leftSideTab.ets +++ /dev/null @@ -1,60 +0,0 @@ -import { hilog } from '@kit.PerformanceAnalysisKit'; - - -interface LeftSideTabName { - //标签名 - str: string; - //图标名 - ico: string; - //页面名 - page:string; -} - -@Component -export struct LeftSideTab { - @State leftSideBarTabsName:Array=[ - {str:'建模树',ico:'',page:''}, - {str:'组装树',ico:'',page:''}, - ] - private leftSideBarTabs: TabsController = new TabsController(); - @State leftSideBarFocusIndex: number = 0; - build() { - Row() { - Scroll() { - Flex({ direction: FlexDirection.Column }) { - ForEach(this.leftSideBarTabsName, (item: LeftSideTabName, index: number) => { - Column({ space: 5 }) { - Button(item.str) - .fontWeight(index === this.leftSideBarFocusIndex ? FontWeight.Bold : FontWeight.Normal) - .height(50) - .width(50) - .padding(5) - .type(ButtonType.Normal) - } - .padding({ left: 5, right: 5 }) - .margin({ top: 2,left:2,bottom:2,right:2}) - .onClick(() => { - this.leftSideBarTabs.changeIndex(index); - this.leftSideBarFocusIndex = index; - }) - }) - Blank().height('80%') - } - } - .align(Alignment.Start) - .scrollable(ScrollDirection.Vertical) - .scrollBar(BarState.Off) - .width('30%') - - Tabs({ barPosition: BarPosition.Start, controller: this.leftSideBarTabs }) { - ForEach(this.leftSideBarTabsName, (item: LeftSideTabName, index: number) => { - TabContent() { - Text(item.str) - .fontSize(30) - } - }) - }.barHeight(0) - .width('70%') - }.borderWidth('1') - } -} \ No newline at end of file diff --git a/entry/src/main/resources/base/media/base_expand_off.png b/entry/src/main/resources/base/media/base_expand_off.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5bdb98d6e5032c34e9d834e83393560d57ed6d GIT binary patch literal 3886 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/base/media/base_expand_on.png b/entry/src/main/resources/base/media/base_expand_on.png new file mode 100644 index 0000000000000000000000000000000000000000..124bc7a37198ed063688db59331de2a968f4affe GIT binary patch literal 3882 zcmX9>c|4Tu_nzl5!^}hthR|RbWh^fF``R6)Nc zcI94~^LT1i$+Oe`jlO^W?8A>ooFI}tN7}frGadPW&_MJ6D*rWDlWESm^A{q9^BPq?uXU z%UDSD^nd&JPkWllrRBQ7o(xzTo|nKJ8eu z$Ye6DCC-m{C5sSv;jOj5fJ+aC%P%wX&yUrYS2i|o#SMh`>F9C&W+GU>1bBvBK>U`f zs_Fp`%1&o{IHtoBb_+5*IJkBg6FVUG;X6P1`N1Sk@l=R*9t9}|6t}kSnk#?E6PO^Z zx-z%kO&|9Re#MklM419OI`;4U4ZF8YUF-31@!8O(=;3~jQDsf5<53t(EB-~#vz$+- zRXjBpxJi)hR`pDySD;((hI5HT z5@!jFDl!AnR2}SLh!<>4%1AlPlcKGPJ#tB(0haT5*(z7Dw;tTRd$-j|<%+H4t@&hQ z7@T!_+S3prH8|G0Brj@L@~{BGI{pfRSA|6gr#b&cp;enb>;bSYmYu+vu~HxH;&iUP zL91Z^#KA-*`e7X%om}r|A#;MOgCN6?sq5I(wp8mk@oCH!2B+R)5lKlh_llh1)c$sn z^~|2&@i#A<0>4cX-`3;?a}RVtfGq86;|)OvPHAR8;^{0$9*eB(Y)v&1Q&0?)#qHM&kLAccQqZLve0J`)SmsTn ze|jJDdI)&)+ix)WcgubPsa6;ddQi3=6{(SuDsl>cLXDV=8~wUT9522NVZ(EtVxWh4 zz+oJ02T_&JANb|PbEVw3E;NrUlMl9ZdQ*#*3gpg*O2@|4prD`w6(2W>^Z~F?-{$oZ z3(>`WZEoS8ZTKl<4r0SvD^i24UpcaSs(1GkJn@g%qaSWS_YG$LB{h;2P6@CoD#9yi zg+@Vct{O(K6E-rv3S_XoKQh1M?wEGK1sU;R^Pr^8o1=I+tA9Cik@axurMG#@0Ck-@ zO;J=*(%D*_&{>+1Q`S07R!+PS!8$;U9)Esu?nr5A=^f?YveDt7>1pHXz!7Ol$2BIUU0rcD$mZ z!X&EC0-jhXVsP}YExQs+dR4nrqZ)}qxymZ|NuBs64>cO>Snm}f*TsMK0uxrpEaz34 zy1w)t07BHxn`=wz=DklkcsGr0TpCfPd-Ex@vmsG?Q8g@!9rnv)M*iO>br?8JtLLn3 z;=f3{rf&7*hq@n!b|&B>W<6y{qv@Pt<4A5ox{lXWPV+sy#vju%J2%HyGAj@5ED`xu zUJdyc$Wfo#t(r8=l?9lh%uByXZ>$v6Ndi{oM*@5g~alHN=@FJvlTER+bEdo(9lgFCDO;o z=U3?S&+m)P1sTQ2x;84Trr-r%PaMZfE$O-mr2O&YLkXE0rWkKmMHB^~ugm_L5U})c z=B5*3<11Z;hR9tE-o6=9QHes88JzYNRvb)$wkjkG;Px5`@!D%k$u8ov67V>>{X(c1 ztf?&>yt2=IS(rgktWC8;LNfS5J~zwv7vF+($myNJf9fs&Ms`qAQvIPQsoLa( z*q9&(U|F^-_}#DLX%4Rh7)#Oc#06HcE)mIge-bpMz1?Qd7f(?p2E?U3p+Q=xM?;x< zAAl*rlqFgr2=Nl5dp+UlkTjZJe`sNey}2Yydb%He1*Kw=gmmMJ!052j5s97igYrvA z2*VVzj$5LyC3;8wGZ?FZhG5e{M*jcUt1ObZxD|vJAcD2Ij2WuCteS|N{N=oAiJ?HYx)nsrwaKKbZ z_Gjv&c3AsRY>&S@BT?04`FG4)1eFFGbxj60Af6BF>Ow7!<-RO_qW~73G##rgAzNOW zVs>?PO%xRsja1ynVk<;S^fHl{u0J*!tfS_O5?S1ya3`!mfnM|u!BH=e?Uk+}K3+o!#)+xz2j1o;w21}D=x{!PT%D>CY%Z%j4;fgy<`lB;hKMfQh z_;qT#bpPCjq^GB+bi$%nfgn(eJ$_R;LTK{TN~flEklDvLIyIf)y8DvWq%q@dS87al zO3E6Ke!wgCwu!ZM=wqoq*(oK*ao5GDYDj}bA{{3ZnOFKY1HK5M4i+8x>`VTRaKdzL z-ZGyNm)>{fis2SKv2RFtR;S(mmDS>Rww0X|KvL>|X}^kM*w@vLNFXshVj7UI8u{;J zuqTX1I-G1oC^hWJM=}U1{_ZC~0a%tOg;7BOm=fa8qx}`qu$P;mM(4a{c1jww;$AGQ z2e_0Ine*8{r{O~KlG~kMkvWq?L{P zg~LO>6^;&RO90FkUYadN|C|^+@dc}xtIP|6(?%klm3-=43XX+*UG@cq0+{Y0P(a_l z2L^g*9#c+pv-?|EB+MujDi3O(hA(Qo_h#;mK>{sY$nw0gp&-iG;0EC}H(jHQ5Ak%r zGP+T%k@mjlD!m*Hi^*gQ;DD)Bj*6uL?3UghVN8QMcuD@&(C@ zi;E^xo~J=l!=Lz%2c;@Q)$wdQ7ZcxUlBS&ct4$aOC2jw&@UM$0z2&0l9 z<&FP9!)|G^4MzqC2i?b8gRg0#2{7s*$U+Ss!M#N2$!`Uz5SpuNjQsBAz+F+K=K#=u zf%60RZ;qzkiJptDd!xGPU$x@Mo*E}UQBhHc?w+1WOCC2o|oFnUq zQV7^khZ_Xmz5S?i=i06_IW%Q|2v@Y574`o74DvZlL-QIX#bfl}4wnr!n=R87=AVYl zQE-WJ_I)u~=;7ltE5g}YLDu_*Kw+}Oo!v;W34LS>>)_g)+4hb{9=k@%0Q3Hnd==OY zATSfHQNQgJ6%}1Ns~b%&<#h?lBD-gM(KR5I9m-vw=7Obdf&pUxKlqrAfuUq2c8u9E z=bxqE5W0q!by<_ga_#und>;BZ(C1tIH-@ui%Zc`gh}aoqu~?*{(dg*?|9)G&j0`b literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/base/media/left_side_assembly.bmp b/entry/src/main/resources/base/media/left_side_assembly.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9fbfbed0d29237f7aff332048c6960fcdf87c318 GIT binary patch literal 65590 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

oK1{I_S|rw|(4Nifb{F-_yo|F;)XTwLz{1 zhy{!py#022=KjQ`s0mq1!n)|XIq|SP(b(A3Vs&6^gWek8{soH`E%xT= zisgjRI`A|=tWW!MgEWrm_ZO#cBL3%^e;<=MbLM*M^77RHYfT<{Xr*^w*!ubg z%N`4Apf2st4HEZYtg$+%vHZKjG(ar4=%R}Z`@hh^@#FDl(Qua8nP;A58XCmi^_~WH z*VHto{kbw>?`py3gT+=0C$c)oy`Rx-x7}{%<~|A40Q0t&U3R(UKGm@t_Q&e#rl$S5 zGUV=RfZD+FZ;R3ZIe|Gj#R1lTEn9Y9&VA1V8tAUCpPKgP%AC8a0Upy|v>Islb&wke z$O-f3&-cb`o15o2_dK5J>A>M{b(F^X;I$n}&uvaXtL2nHN?|1Cq``Xh$M}2)` z+MgR@Z9Ynueokm=oi=THx9)A1^*Q&v?rvykO#5@ggnLjA#B$4hbC$hgf~SGBKQ~Od Uhv=ZjYM`@62ew8S9y$L10r96ACIA2c literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/base/media/left_side_mate_components.bmp b/entry/src/main/resources/base/media/left_side_mate_components.bmp new file mode 100644 index 0000000000000000000000000000000000000000..283f1358d6d4b53a0fc7b996941db8ca7fae6c25 GIT binary patch literal 65590 zcmeI5XL!_B)_}AB7jW-|PIj~Z0)%b@wgHFiCL!4`A@t%<47fo^D7NVkdX^3WQs{(0 zmR`ox(3_2oF$N5n-c$DH`OeYInYq?T(=5pvV4mmXjLi_{>V0p~m2_{1_nN=)mpACu z9OF%lJX`$bjk@@bUe-UizPJ7t0N!{NqHf)~iE(jpKtbPnr(&jrbm^kj7XUhd z(afTS2Xfv@Kfg>4c*0&U{=~gy%a*_)ci`iXKZaSeX2IIE>tOu&@i1)IFuMl|?EpC- zc~G4;K+gNuUw@U(1?9hg85~e!uTwFfYR}x&-t?huGmwV6^=u-=YNi z10zR{ge_ZshRvIQf=!z?+Z_=3=jG)AMUNgm_`J}bZG8c^1zvlgP;NRLFO>uC*i(5G zjzhKhw{G3qf&mn*T2WMW;FC{2fox8V*rPe z151}Kg0UUA%diLxI z7K;V;?>_+h_U-q|0kOY#$Da6ekOwZ>0dk;<2MXnOhHv|gKRDnEdn%s7aj3!?KVtv6 zUAuO=a6A}_E z7|5NYssq#y({VX=>=+z9dbHXOc+=*K^`5y?o;r1^J*;B`X}%EazM~!B@^W^^p8woT z4pf&tm5IyG8GrSLm3ty`PXuDmAv!Q=(quSs;v~iiIDY)NW)4)h-iz#~O`8T3+1c5) zF(UD|I>6=S%zQn`W^h0Y_Ec6bKWAc(FQBmUuj)X*e*L9++Eb@a!^xAUGC>k}PEL;G0Xe|s88c=8%{?=B&LUe+-`9i#TC!K?U)6zW)273P3m4%0`SWn@ z+&Ntx(4*dq?1?`GbLZ?SbNT0tbU+OJE>|OC^ z2QFQ@1V%cbcfHq(zg`aL$zGX%2O#zw#l^*7qyr*w!Xy;EJl$KsG)B)nJH+v)bd+I<< zuvh2raNx=n;%}S-MzA-UzdHwNioFv5jva|TM+Yb?D+41PVE*3B=kxpyxA&BJoX7n= zxBHZ5&z|kn@6oZ)`=!w z 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