From dcfbdb77dfd1e8f4f5a9f636ff5534d74af3592e Mon Sep 17 00:00:00 2001 From: vsv Date: Thu, 13 Mar 2014 14:09:12 +0400 Subject: [PATCH] Updated GUI according to GUI specification V3. --- CMakeLists.txt | 2 +- src/GeomModule/GeomModule.cpp | 31 ++++++-- src/GeomModule/GeomModule_icons.qrc | 15 +++- src/GeomModule/icons/axis.png | Bin 0 -> 408 bytes src/GeomModule/icons/box.png | Bin 931 -> 0 bytes src/GeomModule/icons/common.png | Bin 0 -> 910 bytes src/GeomModule/icons/cut.png | Bin 0 -> 854 bytes src/GeomModule/icons/cylinder.png | Bin 968 -> 0 bytes src/GeomModule/icons/disk.png | Bin 744 -> 0 bytes src/GeomModule/icons/duplicate.png | Bin 0 -> 943 bytes src/GeomModule/icons/extrusion.png | Bin 0 -> 877 bytes src/GeomModule/icons/fusion.png | Bin 0 -> 885 bytes src/GeomModule/icons/import.png | Bin 0 -> 598 bytes src/GeomModule/icons/plane.png | Bin 0 -> 625 bytes src/GeomModule/icons/point.png | Bin 0 -> 363 bytes src/GeomModule/icons/remove.png | Bin 0 -> 29565 bytes src/GeomModule/icons/revol.png | Bin 0 -> 1075 bytes src/GeomModule/icons/torus.png | Bin 1149 -> 0 bytes src/XGUI/XGUI_Command.cpp | 28 ++++++- src/XGUI/XGUI_Command.h | 18 ++++- src/XGUI/XGUI_Interfaces.h | 37 +++++++-- src/XGUI/XGUI_MainMenu.cpp | 12 +-- src/XGUI/XGUI_MainMenu.h | 8 +- src/XGUI/XGUI_MainWindow.cpp | 6 +- src/XGUI/XGUI_MenuGroupPanel.cpp | 22 +++++- src/XGUI/XGUI_MenuGroupPanel.h | 15 +++- src/XGUI/XGUI_Workbench.cpp | 12 +-- src/XGUI/XGUI_Workbench.h | 8 +- src/XGUI/XGUI_Workshop.cpp | 115 +++++++--------------------- src/XGUI/XGUI_Workshop.h | 32 +------- src/XGUI/XGUI_msg_en.ts | 8 ++ src/XGUI/XGUI_pictures.qrc | 4 +- src/XGUI/pictures/copy.png | Bin 867 -> 0 bytes src/XGUI/pictures/cut.png | Bin 927 -> 0 bytes src/XGUI/pictures/paste.png | Bin 902 -> 0 bytes src/XGUI/pictures/rebuild.png | Bin 0 -> 896 bytes 36 files changed, 187 insertions(+), 186 deletions(-) create mode 100644 src/GeomModule/icons/axis.png delete mode 100644 src/GeomModule/icons/box.png create mode 100644 src/GeomModule/icons/common.png create mode 100644 src/GeomModule/icons/cut.png delete mode 100644 src/GeomModule/icons/cylinder.png delete mode 100644 src/GeomModule/icons/disk.png create mode 100644 src/GeomModule/icons/duplicate.png create mode 100644 src/GeomModule/icons/extrusion.png create mode 100644 src/GeomModule/icons/fusion.png create mode 100644 src/GeomModule/icons/import.png create mode 100644 src/GeomModule/icons/plane.png create mode 100644 src/GeomModule/icons/point.png create mode 100644 src/GeomModule/icons/remove.png create mode 100644 src/GeomModule/icons/revol.png delete mode 100644 src/GeomModule/icons/torus.png delete mode 100644 src/XGUI/pictures/copy.png delete mode 100644 src/XGUI/pictures/cut.png delete mode 100644 src/XGUI/pictures/paste.png create mode 100644 src/XGUI/pictures/rebuild.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ffaeb0c8..d58767ec6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,4 +10,4 @@ INCLUDE(FindQt5) #ADD_SUBDIRECTORY (src/ModelAPI) #ADD_SUBDIRECTORY (src/Model) ADD_SUBDIRECTORY (src/XGUI) -#ADD_SUBDIRECTORY (src/GeomModule) +ADD_SUBDIRECTORY (src/GeomModule) diff --git a/src/GeomModule/GeomModule.cpp b/src/GeomModule/GeomModule.cpp index 37ec7e5b2..5bac10336 100644 --- a/src/GeomModule/GeomModule.cpp +++ b/src/GeomModule/GeomModule.cpp @@ -25,12 +25,27 @@ GeomModule::~GeomModule() void GeomModule::createFeatures() { - int aPageId = myWorkshop->addWorkbench("Primitives"); - int aGroupId = myWorkshop->addGroup(aPageId); - int aCommand = myWorkshop->addFeature(aPageId, aGroupId, "Box", "Create Box", QIcon(":icons/box.png"), QKeySequence()); - aCommand = myWorkshop->addFeature(aPageId, aGroupId, "Cylinder", "Create Cylinder", QIcon(":icons/cylinder.png"), QKeySequence()); - aCommand = myWorkshop->addFeature(aPageId, aGroupId, "Disk", "Create Disk", QIcon(":icons/disk.png"), QKeySequence()); - aCommand = myWorkshop->addFeature(aPageId, aGroupId, "Torus", "Create Torus", QIcon(":icons/torus.png"), QKeySequence()); - - aPageId = myWorkshop->addWorkbench("Operations"); + IWorkbench* aPage = myWorkshop->addWorkbench("Primitives"); + IMenuGroup* aGroup = aPage->addGroup(); + + IFeatureMenu* aCommand = aGroup->addFeature("new_part", "Part", "Creates a new part", QIcon(":pictures/part_ico.png")); + aCommand = aGroup->addFeature("new_point", "Point", "Create a new point", QIcon(":icons/point.png")); + aCommand = aGroup->addFeature("new_axis", "Axis", "Create a new axis", QIcon(":icons/axis.png"), QKeySequence()); + aCommand = aGroup->addFeature("new_plane", "Plane", "Create a new plane", QIcon(":icons/plane.png"), QKeySequence()); + + //aGroup = aPage->addGroup(); + aCommand = aGroup->addFeature("duplicate", "Duplicate", "Duplicate selected object", QIcon(":icons/duplicate.png")); + aCommand = aGroup->addFeature("remove", "Remove", "Remove selected object", QIcon(":icons/remove.png")); + + aPage = myWorkshop->addWorkbench("Features"); + aGroup = aPage->addGroup(); + + aCommand = aGroup->addFeature("extrusion", "Extrusion", "Make extrusion", QIcon(":icons/extrusion.png")); + aCommand = aGroup->addFeature("cut", "Cut", "Make cut", QIcon(":icons/cut.png")); + aCommand = aGroup->addFeature("fusion", "Fusion", "Make fusion", QIcon(":icons/fusion.png")); + aCommand = aGroup->addFeature("revolution", "Revolution", "Make revolution", QIcon(":icons/revol.png")); + aCommand = aGroup->addFeature("common", "Common", "Make common", QIcon(":icons/common.png")); + + //aGroup = aPage->addGroup(); + aCommand = aGroup->addFeature("import", "Import", "Make import", QIcon(":icons/import.png")); } \ No newline at end of file diff --git a/src/GeomModule/GeomModule_icons.qrc b/src/GeomModule/GeomModule_icons.qrc index 3f6a8a361..571e1cd6f 100644 --- a/src/GeomModule/GeomModule_icons.qrc +++ b/src/GeomModule/GeomModule_icons.qrc @@ -1,8 +1,15 @@ - icons/box.png - icons/cylinder.png - icons/disk.png - icons/torus.png + icons/point.png + icons/plane.png + icons/axis.png + icons/duplicate.png + icons/remove.png + icons/extrusion.png + icons/cut.png + icons/fusion.png + icons/revol.png + icons/common.png + icons/import.png diff --git a/src/GeomModule/icons/axis.png b/src/GeomModule/icons/axis.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5bfffd87ca0369d07c9559318ebeb05057b39e GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6zM9{GlYxANWRD*ARs=V?9$nLqqq^PUb*WFFaiwLoEE)PB!E_ zWFWxO%<3!U;N{=z;_mNzUR@y7?%?LLdUs}SW}Liv)1?Xu(Z0FPzFRk`zaZk(;<#Q_&)yT=ti0XCQ#jM}&uEF$9vQ?z_0nd(hJH-_5 z9?=`k!WZ@`+bzu8#>noVdH=FF+vOHFx07NUo(2azTQ9JQwe8dnpWJVzp$knO?_=G- z7ApBUI6`N#QEt@Pc7v9L^_Q2V-b!(rTKLFZj&*v^$rca&O>e9kPinT>_=^{?zqG0h v;=0+kR-<%#vX`Q>r`6AUDTgXM?lSLx6uyRQ2Iq93pBX$|{an^LB{Ts5A3~1_ literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/box.png b/src/GeomModule/icons/box.png deleted file mode 100644 index 3047d921234a9c96d98dd0aedbc595d060d76aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=%xP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<8A(JzRCwBA{Qv(y12q9a0IJ3v1ppX?p%HpikMAH3 zIw>U%g%0_UA@9&c00M{!*|5aK#Q&=9xeUL4 z|AlD!3Dg9{Uw|6F{e&3s^~Y}@|2Mc5J69>cFc z|G){Ri~!e{eAT2fJ=tTL6P;_Hu^b-@m|&Pyu2dfB*s;=WA|L4yia2SFBi2vow7Y6g36=1{u{QQa%WB>sK zHt^@qpA7n8P2lkQ33TDd5APU$GjcKf0DAp5kPmhpG%@@Es@dJ<#qj3`(6C?MfChd; zF%Tetzy^X`_XFy^AHN{s^qUdrkv~_b-Nje}17D2oOMU z7ybfj{`DK^LLdf3${*%`7=|%0{D)#7`5%~!{{01GWB?FAOt5ePMaHkc|G-`XC5?ao zF%1K;|3ky_KhUNB{{F^rAwU3u4Fm-`*bpcNvH$m}hJgS9gzz%Z ztG|KX26_1>FdP{f{=mZvY#=D701f=}^E)JRetZT-%6G7#$N(UKzy^Yn!PlR^!4U&a z)Zf1`{QdkM>@A3S|G;4e^5WlL5Cgt_cn)?YdKdx(5ZFLan)~t{Xgg5x_m3|am|55v zAi0|n;yOqyfKoLmnxU5b2g))s+}S@5#5({p5FmiS27)sAZ(zFm_Wn80Fjj`&-#&u9 z0**yU;DNmljs&O|{{p>>WEd#Bya3Sv0mK5a>_5ZTw@(zIoRRvNjv}m002ovPDHLk FV1i0inA-pV diff --git a/src/GeomModule/icons/common.png b/src/GeomModule/icons/common.png new file mode 100644 index 0000000000000000000000000000000000000000..7deab358a033d23669225bdb6e5904430dac6479 GIT binary patch literal 910 zcmV;919AL`P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XS000XS0e@s)kpKVy8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00Q1gL_t(IPo0$6QWHTGhPn4KypMqF5EgM?Qv$LH$SPD)kP?u95_V*@*^FRB zODS~}OD(05J;)Hz%akwBJV8Ig_@7Q<5Ivg0MEz}1vB~{I zG|&FjfoR0OeP&12Pk$Fc+Faj7?c}zsWLv(HVUN7gzb*p85QS(0byjqy->qpm>b@3%#Pu4wS29Q8B6J35SS5V8j*=xnm0Y+-PQiL*O>$cDPMBPQ#Sb?la{&9ft~! k0$L9iV(oiT|3?)24QsrogQz|CX#fBK07*qoM6N<$g1`ieC;$Ke literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/cut.png b/src/GeomModule/icons/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..0d43adb8b108677805625f8f296cf4a69d4ce26c GIT binary patch literal 854 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 LNkvXXu0mjf&;*7s literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/import.png b/src/GeomModule/icons/import.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6ba81ecfa2cb7fbe0712972387a54a9ea82c66 GIT binary patch literal 598 zcmV-c0;&CpP)N2b zPDNB8b~7$DE-^7j^FlWO00EjwL_t(IPoWmxfr#yunib| z0ZkXI5-(_*B8nFf6a*D)Vj);4h6FJwL=8csh^4PE{{LoovsX;az_;hj%+9|v=d8eD zKw*3gO<-^sTphv|zz=AH6HqbZGiHoV1w_nv!Hlsc=Mn@_b7gS^P{1e#EQmQoO7sB( z%#WFSYS;;`Z5BBSDQM-L)PeO;!gr(I4!wdoU<+DtFEAbxJEr66&>ES3(8x=s0MC|i zOuoZBv1)rAz?_%DuUZHF*QJnx5#z%P%<9nSY7lyx?#MiBI)oh>op_nsmU4QFTYt_M z=!e9H=dY;-8O{|N?!+^kKQ8a%lx_2Ym=d>WC(*;E=s_c#{YMBrh?eW!^}4kjEEvzr8AVe# zpD>af8zZk?LHtGZ@;Pf911@jeCkPv5q90NazG%&B(j(>)9E6D#Db3=y@rn_b(=V`* kATc8s6dZ=Y;Qvwi1w`vVev38$@c;k-07*qoM6N<$f@kCKQ2+n{ literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/plane.png b/src/GeomModule/icons/plane.png new file mode 100644 index 0000000000000000000000000000000000000000..3075a34aab64f7d69b4e5bd89b900a554cfa436f GIT binary patch literal 625 zcmV-%0*?KOP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-=Sf6CRCwBA{Qv(y12q9a05LI882|(j)eQs)Afl0w zkPuN}0}wz&yYTPdzaUB+h`I5p0|+3Z4gB}-ABZvlVhMce00M|814Tte!QN$NX5Im$ zc<`wO2q2;ieEs@04;vdB$lDcA7vl6bKmZZzWgadrE(WM!68KyR5J1El_yua<3n>1A zOCdl25o_RA9v&WK1Ha-@2oOL-$1*1;CsFDE0*Dctps%m*e^9yu;orZ1gXy0?e=_{~ z^$VPQKw=>N_wV1~7{mtwfB<4aH_Xw|@xPLH6~mvuK#f5B2aNwS9G;rUV3InA;V;m@ zKY#u+{QUEm;n(j!4FCQBE&21C;ppTjkYxq{0fb_pv9a-gW&cKok6(W={QM2n@CRt< zABe%vo;_oD`{@V6|9^iO{{8(8Ht6r~pJ4W>+36s|CIF2H0SF+tmsM0${+p)E0viG{ z><1A4{qq}aJJ^tae;EG%{exuSZ!mpsaWTlS1JIbi01!Zou$*9?wFGDwG|Ybe0NM`3 zKv(?#3o`H@5JL?EVqgG+`4?B!F#yX`xM4uN10aAHfjQv+pFe-F#u%Z(7u_%r4G=(# z&};x00000 LNkvXXu0mjf+3oyP literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/point.png b/src/GeomModule/icons/point.png new file mode 100644 index 0000000000000000000000000000000000000000..de84d9652ed8697df71d5ab5fae610b2f8a826d0 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l6(v z^mSxl*w|O|J8&|PuaN8!7T7N^x;AO4Md$oE`hGnfAN*&3OrPEGIM;4V;%@u>w;ohkN|dkN>g=-Qvbm>P z!}H&b3=?~Q7qKTgEIA-@W9Nl!d+sU!uKQ4MOg&wbg=@i2&%>Mc9OpWH`coatE72zo zOEx^p=9N7gWc%snu~&i7^Ile+J~l%jB7c%jd7fq2wmU9Q79X-(usllls<;Dh$g9>4 zll>;!uCAz>y?&Qo$_gjzFI$}a6{ogteLCxYb+2Ju(I|0s?}2D#{8vH~E8quDf?` zQr2_)hnwuS*Bh1hcW;j1yEc(G_oVL1MqUI2Ol<#Lgrk%>`8So%yx$sn>$=%_`+e}V zCD8a_?dj%XYvb^NP0_*A*3Zq;$%{?HkWKi-iOJN3j|qOjKwuVjDRiBPdbfoem*M_N;((Q+WUj;!_th;fYmm2L zQJ8SL@V*ycYekwL%63GN{07Uvk2S%?j^!3K!~_z=d~!S=*8Ur~pL`@AEgZvhy>rSG zz(Y0mN#J9~!47cEB|9ZRioiquAoz*e+|(!gKo2zX2~^27?#X6xK%2@U2(=l}6wgz& z1S8MsMwSufrrbvZ4`0DOXawLN#9e|el(6%l!h(aI{sQU@b_7%!e;1Z;4(K}vm2&Bd&t~VSd0o0gF!;??G~hD$U%lPkBnMc-nrCkn zZroHTyEwg3M6C|tZpyd+)!_f0@)U~{5)iQGxH!Gnz2Tpkk>8R;`i{4sPnxdL^I5Mz zmYrv?kt`9d63#B{WDVaEv!J8O*i~{-9Ib|JnJ<$8(E9=kTP6Sal=~frtx}C{Y&k^~ z+v}5_cBmP_1eaEhL9MT!o0RqW5kRxFHi-^(Wr^GH7tCKc&-m^iIui{XDPU!}EQ22* zHjKJpE31;`^D-X~tWn~}Osp28+057VjZ1im+K$@rxq(0z(aNyP$!y~yg2nHQcKn3L%%NpHQm7~M zx#NASGfL-qgI1-i=kw<1`|XT@_i0@u1`5}{yZ_G2=-Qd25;Hsad`TJ~R~aSRA@Bx% z#9mxnO48Ijx9w9L(RZ|X)>9RAA6;`+`wEtQmeTh#`nC&w5t^#VtP6H4(f-e|*2g)< zs98U%a^mpviSE$SwNtY&%2~P%>J|pMhVXoo+l{)WfVyqUPzENNQ;v6lJ^e%+(Te>Z;_KXj09eKUH z&IE$DFZQiCFHqd+eP?Vg*2wCD$+^4aVICX16@967nnieqU*{d8(&r|vH4^5ygE?1=Y*0$ZNz=^F3F8GSKHtg>?Y zQGTY4>Wsr8PRmYg6KoLn4GAVaxM#)ViL`qqt?! z&o3RQoC)Ljzf}{zZ20(BfOJ&8=Mlsp50a_BAkBJ_3{M@=RzUw&{C3MYW?5`xqD~6A=lY-ZwvQkw4MiZ zrZ|ttf+gc;%+Pb7FH^BJBiYY4>zJ74a7^!jBm6#3_k|*7_UZ$Zz4=0jvV&UeNBfs9 zqe-+L)5+{k?-i5#YUoe9>H4Z<-m9`FP)D8-^XGsVvtClw&NbK7M@~YNIYWdb)zFtQ z>QsThQdP*fXiqTuUguCKJU3`Csv_25`C~Sx<&$`a-#ET*sU998(#duX86_y$w9DJo zS<96^(#NAT-CH(q)M&}d-ZPS3=vWS_7K@y42N+WEu|&^DJk2vBn^(RLwos50NKe(| z>pk%xlOK7!Zk51tvm5QDRW>{%vi?+gyEt>uSV&Za;qJTU+djP_$olG$hon7b4?cX_ zB{P(da^n8T{Pos+(rsTFyGlP$GZoj>%HdMA| zm6~9SVHGW_d}Q*wyZCm;&5dBsW2xGw(5Fq##7!M0_e_bIVp5n$2?t`bHUxK=YE0v` z<3XQAk&UTY$z|>SiAL;f>)sIz*cMKdp1WPZpA?T=E+R?p%eQn-$!BRlUbQ4=Z~NWO z?o(9Nf2c|FEts+(y)VrO@cNL3O)yt&3N{EClLJR%pI;NSd<#F|yq}(gq@)&R3vYG5 zpz6TiE|}2nANcK_ylE%YYSg)RM@ZK$lrk1$a&1xOic;5=kpG}o6(jjG-|**}WxBXf z$;YR%Z*e9K{JQ~G8d|B_Y4)UeYLFkhtE+tcnQ(dW0(lW}%mp?g1 z>ZyfIG&i5N*VgFU%%rp^;hBLssJOOpItO)11F+;8$6?o48n(szp6c6pr@^3wJVgOZXC}B3(qS6p3_Q50XB`(he^V*jvu`Dug>1C9Y`6 zWQx}*Gfdx4DJel1&0~CEOom9KE)IPU%zn(RG6`_WuXmojEe?(vm`Lgqs{)^Q5O7L^Nl$9;b1V}=Qb{xE!$KhnguRDSc3QVBY1A(->T$trI!7See&!Mud}a)yLXKIUOkNDg}%UtFWjU; zWEA964oQ^E?^tIp)Rd%Bt|P79h;5tM0q@5su7f>k@+V^cl^aS100%w z7BnW9+-Q&}4I-g?Y6(=H(=$(}GQ&4hcV4bezRH8m4XoRfzgqmnxOgk#N>0V2b?Liq zih$kHCSrnhp(6(M_rdd8F}tXcHHCn`qZwMXK`uFwTAbwnw)HmklLp!4^%x_W0=UPA=c0sNq` zXU_SJ-g>8RV7DG0;=MXgBRVP{Anj@vwOYen;xxx7t`wW2n_!aW5yahJNj?y}<{;#D z=4E%m!f9qlzmD&&?MYsJ1I?EM zl|?aDw*?0A&F}ney(fdm0;0UC`l@1Q<&ABX={jaV&W-blG5i(o1IHJ@m@M3yWQ0u3 zWsMJF^&@fzwD)Cosz+RZZo(w{A&ix;V)fr8%t;l^aw_~KWpRA}sDIom9xQHL__*>n zOXc&T%UAJp9l@m|;9fTe*j5-5>oh&=E3iU5J?ZiAPnO~5*2qexVNQ)7q3S;jH@D*M z(?!kMCRB-QvI}Vz1?K*Woz|pUF06{YH?{CFSUct30G;ST+=5~3LK91^PsO5_F<8>5 z#xdr9!9+c-RJp-%A3oyLlp{0i$*96nlF!Zhd(S8(;|qAeu zjbc6D(4<}ToVsfd7rp)lX<7a5y9)$g8kjLuG^N@Gr82j)La;8Ry_%|Q6X$Pg%p${_ z_BCjlm|i|F46CWsF6!DDiSj8kV@t>RUd5MZ3bkU@a*GIxa6`_C_ZGEuK-sbj&-SX+!<=ZM!DbL;_p~c(u8Kk*-eAMveL=t23g* z%%-}rEk?sofd(a+8WQtVpjBMehUntLBjx9NDaC=0_6n>%=lNKq2kDJjW;g(slHyfS zcYE?wu{2rE+uoVyFOXwo7!k6CjFv$S4iI9gvV0*_S`;k#Bs0NYTjWl(#&yVBw^Z$O zs}vj1SXWE#v0tD;?cAyyE|BaJPeiyQIQL+`wD=Eq8J&*K_}Wn898j%|VVBt*OTsWl zF45rDS2xSpjAt4H&@z_pRJH?cSRcs-Cht$n_`sBm8I>MPMwUQyky9TgrwWQ)vg{$D zV6&h%f)dg-#%J0120Q&%^&Nd{{S8f*)WIy>4>4c*|6ZhLJ%}fMXFZ*u1iW*S^ZH(B zj+5Vtkqjx@8NEwE+h(UxgYQoJOxC!A!A!}eVm_J#p5%M=d1k?JVdiV(X|mI;;bGHS z%F0`#Q@rH%DFUf=4Q!=al)JK0fNAdXPUuyB6*|*&-QHli6d@CO8#y2i2#V;Ferj^o zr%hy>^W7cA9;f)IyiZSsQWqwj#RUypZ7boMEw-d#DH)R~-2RqvrZ=kVX*#RN=an|^ zU*a(RscB0OYK$ko?$`0WK+6@IVLJzZ5?#8rd1LRJx|N19@s3#rC>uAme3iINaaj*? zT(6w5)y3-?0IT4WiUUHjU-yRIk7sxrV~m6nsn${n_e>{i1=SQ1Y>?uQqY5uO-wbcp zLtnWG(O-E)JP@D9rUlb>KhUf^n4~3w5{oBs}J5&FWx1Cx3MoEX&t(F zn-Jro@(>Cvtw^1&i1+A(Uu5Aizeru5Q+$;qig(Apac4KX==gzBIg?U`@0%GG@6j;} z5$PaNX$U+xV%}(5qGiI5i6j-1UFZ~!3#4BJ)3?~|O7~6xRKt%59rvG^Zv-2!Sw{iZ z4ZVCv7c2yU=h?MRV;%Cjm2LYpKnR7I$c4ekgi%%HKXiv8b+7Xq+Rj`ji=ZUZwb^-Y zgwhb+V@KZ(HF(=-n%_T2&A@Ht|FqSkXkWRhQGzi2QzO~3vnwnauW?gcXtsj|Zkvsc ziArY-dN^C(6en&7Z(b8#MIT5j53RZ(1445Dhpcr6E^K}&roTFSgT%Z2tjcaTyU;>@ zn2zHs&-)ZQU9xaJ}A@EzyadcCVE%pf*dZd?r1Kf9c7XSC(noTvmYicn-4GkwHY0^0l8|<{TZqW zU%lJeP$!!@m2QWx5J%;uijU9}1i7hi90?xX70%dSH-N`U(Ps@J6l=8)S1#Yyj#s-_ z)R_Z==|Z&AClA4Wbd`T5%$kl<^BqMfu$CT5PMFs9-HJ{lFYnPwQ6+r-IdQ^Erh<3F z8(L-U8htK^IayUGAEDv8(OCkmat(Y+TZ7jbNw56)N!!3G-8<)cNCY&OBXEi&au8LN@SrP!90nGQ z(i73o4A0}z}EdeI)gM23M0KOi`{RvDUe&~ zz+C{gWU%AusLk>KoI1;`1zrtoko~K|-S~u9<<#aS1Ovk`VlZ&iP9Z$~x;%Pk)z-uG z;$7$1Oee{mm-^7d!iO;%(ks)61FQ1=>wqv&w!6MMAGb^bq|1-4*X;4QB|wlmUZM3G zq~Zj9z$)7fr8Po<-61g?aw+CXmyH!bThSAs{IXf4*6iaILRUpimSi8gIl!lC>ulDK zml8VzyVO<}kx!R|Vm+EtMg1v&f(V4DEVb$$x>v+(u10$&Ysj>o->5kQ#qOlFmD#ys z$YI@r*unG*#kH%+O+{{G5ZWexkHtsUyqu`fplP07p5g%X4-s!AF%aT)Zd^+^cYQbWZLFh(gw zu=~0cBpT$=76A%AF5%vZv0gs!)yDi@=Cspss~JU;4+j+;hJxYqaSbi}ib2lIQ?;0T z8>}N-Ax{^2(QLeKI*Y>>TT)X1&Ef(JH57E9TChQ9w^jh4lEn-9R$=Gk6v$fTuLg^! zGASI6l5A|^-$Q!^%HqPe)H{KCj01yrgn6C;v;}OPk>U1++cMGL*Ihnzri_s}&sXt7 zky1va`8Lnmq0z8x!Io3B>ZM?z0rLsxQOJ?>+gAon4$h;V| zc3kj%_RLcv!$wQ^#G3Dp5cYRHlaysj{q{kKIhlwvgot=E_N+Dttc#_7fJeARrMae?Nq z^uBa%$QxxB$9rjeW03AVD97|`Q_EW^w-Yo_8-3WOc%Um+ezRAc5Yn#( zvM2YvJmhsKvmHmNp&5OE z>_7j^ES5(r);HufP$|{=bnu*FFE%V~loYyVXrGU2ozX4b1}0`5;EAq;*+Bu2_{uhB zvIV~L8V>K0Wh*&5ljPsODD^H`n&%6Bs6NF=)-xw_tih9&l0Pmor|`uNa(P6NT1{al z6*<=XzX+X_`KS!+KyU=IGq&r3%?5btp|DH+oSbVSPt!1txPv1{pS2OP+WT)_m2fRhHif%iKwm*tVM7gnqe=A%I14RY{=|;tbN6k#5@z zMdZd{wA{k%57w2DpTJ{dmkK4DR-yQ=%ebe%9+Zz{6h&JO=V#DgqEVA^L7hkhSd6Mk zEMXd-KccKu{Ixr|vqb-Lr6I}x_HJ8gJ@)&KN{xe^@uVsk7MD zkcYgXIc_p?>S&?MVc|6u`JGjbA|IVrFVR{caxOiiJ|bh92p+Sl>o6JNb@mQUKSn=O zBI` z;%jZK8Zoy`Z~kr%7Pfov>u}v9R7ADi!l;twCxRExg5U-E!LynT+YR;;^Ec&3d;B6J zY9Y&aSjKRoG1*_89^p`i5`3e7>VTloDI$h^KVP&#?au0{_oM#%*qp{b@l&_eBMxUQ zv+cV+G|s*4Z`3i9Aad-+{9Kt^aJL&@!tT(-V8v+LQ}$we8gbr#cMe@+H1~Ypt`u^c zTM8X_+MAE|#&w28(1dLT`RA4z)WVo0xawdLHE@La>madUiBF}wto1)?*;rbIw%O5w zi{jH0!T7f@$2qw@Yy4Gw*>s+DVDgwiSa9(3c%QOrO*{>2gBQiC-$+-OA&u;FUxdQs z_wOW?>T4s9%t7wze%C=T*6FMWTdiPO>bE39()O$$P7y5mA|E|1f)A~|K*yq_kj?v| z5b3{e{q0_S#@{859$u6RmWlVbv&i**z~2^>fFl6E5Q3TmzBt8amFl^j_PT!Nx$i8{ zD=CFdR55gwW_+4j%jNW#>@kcaZ8di$H(Z_2mT{bf^mOMv0nwFTLK$|*E^!$XEq6UzWFF5wE4xJbtD|Z zW&8HAnGVJ^ zK%=>%mKU9Z{q7smZ_+95tIo_%WJXh{X){`i*me3w)odGF*N%7w)c>*jsxyzM{ha z_=>^fbF<9Ft!uJ0z(QQtmGhl?bl_o!`O=)zQlJZU;DW=g1E$L>WtPBxf4n9zA+w~+ zx9O`D$YlQH@%i#A??taLSXoCsM^I4XAXGgqi6-ZCs5toyXUz50U zPG#)c9tf=T;0nbCaAom6XHs)}R}Y$j=xe5Xf7=5Nayi^4H*0mj|J_!6gne#LEL~wt z=(GUsJDU4tR_+_`*y=Iz#Zjbeso}>G--J(&sQ-X7gsvs;*9znxm?mKU@}*eOpM-W( z9_jW?))B7_i`Pe7-|5EBaF?ztneU1$JT|eIJP&L(*2_{^@sc*0c+|>k>;_Q<<)p6u zJU0reItZT2KaeV@ht2w|x_rdQQ;UB)vqYDPh*zCThM3B)pSSo^qpJQa8ACx36iZ+5 z%g0WrF>;LG-yZIPNyOXA1&~3#?PVT$42CPw0;#_f0^us%w?YujF zZ=}zJN85K3zrP`la1%Vuff9&%y4+m}@-Kv(7_CW6Vr;eSn~q7kgTZJD52|+hxN>d9 zM4gM=e$z_W1!lOIaQyL_{I7nTv`u*BZRpEXrZJuJ*b@^MeZh-f z{RuP4OE?xhJr&}w&g9@3*v@wH`fcWQqTzYMeU{r@IaDaYK++mE&QT!oU{r!B^4-p} zJ5kfy#BCF>;mphh!g~&4 z877aO217Rc^w|#eZSx0MGr@vNo1DebI?_bcF|GIL_{P5TGqO}9_7(D1KJ4rc>A#ot zM%LRI@cgNz{TIe$^}$Tq?aVtPClcE1A0KLFlgaywnJ?3fCpH~Ru#nSoj>P}@slcll z-WykBF+mpnmXr$NaM!UE<)^tzeUyMPdAn=8p*~H(Mk?*@viBZsZ6P_^)f@U4`Bk&N z+_ofnCvxd?cwFjZGFM85umk^33zAO$rq^YEO0Eh?Pd-l19BE-LL-un^|6#}V@Wt16 z^HHE9c3{)nULp-!)BU=HWARTD9>Xt_J<8}QKmLBt{$aqZF*2nvDOPP1OF*nFx)I=7 z=n|$_BOu!QNTGYnAb^fRO{l)$4YIu>%@jY6Frn>JTC-56V z{R~_c;(oh;Qfh$w@U!e~J0^|rQ~&&`Pi({IG8TD4-uu?a55=|Yr>mLiuHU?} zq%1i&7B}qmPlB;#tEZO26Uih7B7oUXHk=1$l0>I^2O18*-5(Jy7@$q^x9SRfeAKSdQY35Z0B)*Y%|40VkY(*lp8!tm(`4)Co{@N zj7(`yJc^F1<}Y%mc^R%_Z9hT?VOufmdUA)~^WHZh!A*u25c0H)Tb|Tb``{*83qPM& zPveQZs^11dUcm`VDqHpy=p7RCJJ9W*s z=k8oPej?5DJd%H@ZXP*((tNn^oR}i)2QXrJ(lqXFJa;3Pr>yvMc*w>nLkp#5yzV{n zc2VYq$cU+Dx`T?1$*eCYgXuQ!Ry9bytm6a>NPHxASs%z=Jo_HGaE7EO*3m{tH0tCn~KHTak%M5-p|5I{W!}qH*2j$Q{Ji zz{S3za-s&Q7s;}O;IEk{_G;rkOZOu0Im9(7@zkMkilL=oUy{eAJk(=&3Pw3pQ4Yppn zZiG8EW%{kQ+gO@dWns`!Im^Q~8V>`qw0jWD1!W}*YgP+{hIF1{bUrSJQWuiV)9yVJ zm$^Q9W4#U~t|V9P)pjvo#S(48O1JHYOOtAnjBK6MxADv2bb(1`TMfi)3Qx{wI!GzG zJfB(|!R|Jt)a{%{(z%io_9&~R+_Hu?snVy1OvOqL5x{;HuLsJN6gd5Qq}`{g`<5MO z>|)21|EVEUs4-n!ia2ilH$B{AY>h@VJ>$2?eT~=F@sielF4xprgg9C0TQvckS4X2T zwIF=vGP;py$MV)uS4tntt7?2g6c%)~j|HiTXR~_W_%VncF0EwPlEq}|x>w~gy78ur!upXk$g7vtuKpWBVz*fT%JgbNf$g_J1IDZr5({U5} za}%ax7C(Cb(~AdRg3d*QZ+D$+Y7bfT=-->UyV^DXrJPe^#16XhXyS7al2ckbC&|b0 zxBc}OIiD`kz!|}&Xm#rcitkBFCKHGp&-9C|gRJ@t`@ zX`6f@oRD!oM|M8NB}=O&PvgE=uUE!ay~!5aJu)K(xMrWJUAINO7Z4rDqNhpWr*r7? zrUH|2h3tIzV{b(s6$RE1tQPOD{esV|@X6vfks?3AX6O{X#5u z0I>#=zbJapVQu3ZS10MX=GKPzSvM|Fm6E}|Ah}S?{M@W6?g;M;LS5`Zpl;9(Eaq%` z7=-$MMOP0#<9RMPw*45Eq=_}HS{$!lbVH{2=9xGcTg+B}7*`$3!wE_uK{yN&B6g{T z=WkA>NR$+|0>Iwm257P%IA^*Gr?F>%M(V{|+l*K6EeqkZYw+&YxX{)cP(4MGS3NDl zXscgzO|C;KT#jJKT2=_YFo>_fX(9cNDRu+4%t7V+Y>>qUKJ19$AT*F*7oC>x(=*|v zfnzN(MDO(^iy8^C_lKXvIo-9RO#%^1<^g2-Bb$m8(UUjTyqlURItfdw}G>?(d zDi0;fWycH>z?V@|;j+jU7%nuppZ&jM>Hqd|KQu+@H>4DQ?k0F_bhd(GG2M4+5xcDN z|1!LL=twfY160mCNx$l7O-G#PVaDfA6N1A7@)15Ay#noN7<@SH{E;c{qV~gh&yRQw zPORVFQV-ph(;j=?cp{1eFlL4%(tx=Y$C@T!2Ritc1P`H$B^hUptQ*=(uZEzZVys>O zo{*?9zGgN?=MFe5_kw&LXvoG6_a%mD!|Etgu7Hiqixh}A`B{(7j^GPf=0i}Qi=Ufe zRd^yF`}VaC7eIVSkXh`6Kk0IEa9>jCE8zce7uTVKP)on2seM@vO)au@y zi>M{imcEw9zPP`so#O{vTDe167dp6H2(ky~3pY^%n7j@t0q|q}t`4{BXIv&{ldvH& zN(0v0YG2Yig+e0RN`1CZ{dd#@SAVdu=;3-^Q2cYgvo?X}U}WSvfu^!oAL*?-SsOx5 zYc)Dz$lGZ_J(wOK5IDV$S(_u>z2E-@w%m2W|Hk~_+{pq67&-d}Rs`f0)t0m2(^eq9 zFM@;T<0lyBL9+d&%AN229xVZ3Uhu|E!G3$z`J_{od;Q+njoib-3)^L^wL zc$o3oad7Bbv&A#Pabmu)3y{0%$Kk=|fU(~{Nm z@^>T4V9}LU(?gT?&4A$5gK0prs0U%KnSEr#;J>suC|^DzB%*BDb>+$MRjOcf8_DmW~mZwMyd z(e>|1?J7{8=6w*(^Z`T#aPCEz%WtMZANo2~R?N4vSFPO)hAlerhzDOMA|qlBAz5N< zX#V4LQeoqav<7u^Hae>D=Hza>fu7o)p=1O$hw?3Ry7$ewMFL08#;cceJ>ZCY9ZuqActPiBYeo}Gtk&Wca>6yF9RfSc{!)HSo}@GcJ&3Qq zlMU$&^iF)(WbO;y66OH`qzzpDdR~g=VVK>vtgl#W3veodZ~&?!Ga*Uq2odOyhz)Ay zobP{v{%YGCD1a-&v|{rx({wX^Pba~XhsB_ad(A6C7@E2Bt?pALAOwFH#5_VGZy=6=wG>rOq@AIe1eIPEawII~Ft=v@i&@ z9XKXOXDg+Fl7xi!`j;xf;~wDBEC(MKJGzV%xlV!3S=>rUMb+rRS#DKm{s;KKIrcl- z#HX$^hxbJMTG!X3qURXCGgo;PF!mKj#@r5A{gebs2zlI4xSh*jh=lna_BA9e`i=mg z+rOb@CkTZTd{_d~cq!$C-$O7R0IfZh?cA4nI6M;C5StUhj)gAlRN@zQZu|q&3yMzo z*rlf)xa+{*gr1e1+PiL~l7D+WfAC#L9#xjQjvARrGaZ(??MM;wfL>8H@moSl`RB!B zFx)|7jMY$Zj_%Z9=?bd#75Gp6HuSPUZR=Q)b@vD}_pNiVDFq})DOKRwEwV=oBeO8U zTRaCHxOo4zc7gZE%WZiS<8^U$aq2185Bl%Q)Bs>qGOphfCc&;x@PFiF5wI1Rvo^7Q zkTi0$zx=`rgV@C_|7W`jTJs-{%`)u+twyh)_uZNOVGV#6keD_)cD!glbnQBDr++db z>$7#I*^kxSF2BG7^<8FPLxb%gBp&MzSi<87dLT%zd zl*2M%XGe1p%Y#rC8s!+VE4WLSA>IVPqKf;9O$;6L64<0#Bnrr##3#CZe!0+~wS0I? z8~la^UulEMKSNv#!mbxcGI8BjqPV5O&Vc~j%Js3{f0q3J%EW(3#use@z3(1ngi_vS z#XX-J6MCg&x>3-%wX8ODvibn(sb+}JtoITIZB%nZOU_^|@u~;##z!p@sqwK~avRBp zuQt-#?vH6#ptZ3KRz+)z9vAU>XMX-s6qEPhs_ zP3(cwUE2a%e&PO{W0WYeKr-W;8K7n!|F)$#G)nSpyjuIXy2_{uqS!2vegJw%sR`H) zm6noKmB~0>g5nDK;obzNExpMBny*(G`}csYIC)$=sp&de6T4wJq_&^o#ly8{u7(Gi zhHk)wLvq9pLuP6_8`qC{npu`z&9qw4o~z8}j3bCz$B5AIr;SHJtnNF_8%SYEzmH<6 zOtXR$0!#&g{Jw`$XkKhTzUaJ0BWTqig9V#_RyAq{8zU-*_Upe}K5LA6&I^PJ}`pO#Hck5v-h% z*H>yfz*hR=T4FflN9Z1YCHQM&4R24<>Q_yiB&cX@r7I*Y=*{1JcJDjjy-bMzQR3!o zrB{OCV5bu}R=0vx|1bw5I16j_QI&Pur%=Lnp2)<^wyJaCi)zl*E6$`Sw-n53#FiZ^ z?DDeCfa;kCw*&J8!MyYBCPDF8Q05lTlNI?3jVdFE$B)qUU6WR(poD;!wxX)D(EtWg zYvO^x*PW%S7p)gbtJ2d)e#c+Rt3UQjW>ioI4tfO|bf%(}t8&lb=lT&J{6+8t-#($( z);gaR5fI#m{8xcZ4*Rbf`hPF|OMzwLq4>%iN$tUQzc)(a0m+5}(}4Njz8s_#sPbxj z9A^l2bOg3KJfONe@i{*uqucVuV~RVU|DCM?FsRFeZP<7LD0o8(@e8)$RZ>AEqwxwzn_PN{Tb+y8N_!t;^0^Vw1S4 zD~n5QlyBOP6v!bInP>L?tYYi78AH2y$#50$uq{Z=-4RwEcmQYJc7pme*SQ6;WK#wZ z|H6R-Y%k-{1pp8Z5wy!cg}pxAM6~;dxBL_&SCDFF*%MK~<#V1zwl&k)mYXZnK`sOK zzd5iAYAG>a1Y+XGf8qO~|LEMIM`TiHFAdwtGj@&CaS@{ec3Fflx|KpZf9Y;cKXfAN zN7QkwiK&Yt?17&;fkFLLwFV+k(L*BFg0`eD}hCpzr5!wn2NZ)P_ zzX!@|3md`hyZzMF_k%M9>W54UYG8)x zbWMG@T^SVn<3Wt+b6 zO7Ne*4C!0S|6{$~TVgnF;}I5QrH9*Jpe>m5$V~WCHdeLUwBd66r2KC~Iq><|uQOIX z)4)cI39?S<_4b@BwRtJ8r_U)SsQy4*e|r{#BZcXe0C@2Fa+Oml=iy^KC>COvf8y8R zTq2{rim9-_w5>oE2hhc4u4!L@!?L;cjvi|I%x!)8x$MIt@~+xH=TFXuaJ`4`AEnh! z88`vQoS%T3iYLjMQwnATK8QLH`Xg=qdteP=v<{?&Vu(yLC|eYZ7+ zR6lUAt{q(!dbxYLAQi-0Ft^83+c+joPge&YQ6$`cR9h!4<$n)-FhAIj*x(V2)Y2Uz z52!iNL#6zKUU+rPmS~7a-&TanuPPOm1XKcM#mgS6;;PL5vo^_kJ0g*}pM2PyGWGa= zsZo0^G2>t?^GTu~U0IBFs`wChU{;2HK@=e34c3ZIzd6no)MXZ$UZhGJk{WicS#hFm z>kDBeO)w+*3I5yIas>ujD}zzP`7rt;hxR-~bkI@8#mMU)BKdn4Dxh|(JTa}QY1%`$D2`f`f3}VO6i_;!KB?+uzo(E zWQ{Y<_=U+kGyVH(WFHmZ*2}2(m%0KD&1<}EHZp}2yp}q|?+%TN*ubO*%cX#CBnNcz z;s!2`gOvfCclM6A6Lv-^ZUc^ifYcYHTKW4i4g?Cyt!-ID~W_U== zzuvv-i2oSRFBiUE;2peo&70vMiYs4s#ed9SFCQxawiu5Z1Iidd5 z6U1-8Wz`%$P|zu786vkOlRb`?jT=h}(JUC~Uz5z#d#8&rfh?8_({G-|X&tWHj9P2x z<5@X9ctR$1sC5MUdqB}CZ`DD5z}0b3n>O+fUjmq*CSa~dU?MTcFk>p{_5o#Y!LDu$mwrxeQ=S&r+A3{+R%@r z{oONJ*>wM`{Gy(BGn!ncdkD|Y8zQ)==O^)IOvm10eCT*p!$Ye9KGG4GaANz}EMi;Sn`r2Xu>$|?qW11EQ zfAM*>@wC4#J3Uv8)IT09x=F`BK>jWm6RHK)NV@BrrzzEk%4L~Y+_Z1f)N0g4Fw+;% ziu`*oYy)+{b{CJeo01zlOg34LJ0SC2q`tNwEmImNa|wdE)P$czzA}Ud##VtX;F={8 zQ^NRl8U`)6dr3T)*y>S-D@W*~laPvz`~7aafoUR-PbV|)xu|WD@0M@+>ir$VnVGjb z)M>U*u5LFOFu%TPWv@f{#~-AY@7+q;afA+e_g=!8$UVs8YNbeuI>+D2PTUK8Hun|k zf#i|5KAklptbf~gV`zC~)m04z=qO?N3weDgxGB|4Dbe;7@1`Gel`KCupD(QGGzY`M zryh&4E>yAs!D{Dc*S>w_wwS0TQ*5T^Ky=Ft?`LkoQGd%V=B10xApVWdZWrxL%eu@qkTi?o{Npjm=ONs+@b(O|w8MMO0>9_b zF+Ws9V^)gPotZl=rTzUtNM%EcE>5d(lf-KTzUr8;vfpz2%s9>@)M6NHvo}}OSbSQ; zo0mIxdeJ=MXSRSB|6e9ww|+Z#Y&O2^#IkUx66=%L!E0NpZdOipJT~{~n9%LDc>?VB zk+iImPGKz|mtfBq4z7MQCoO|`bP@2WkXA?!0Yv@MNM1z0Gxto9WowAu-Txf4(}&Ti3&cXT5ORS3}A zrtGRR|Aor86vY?iyT`VWY(GLfH6KN|)dQr8nP!Kpu!Hjb_v@RF{1ygDKvkH6;R89q zw3_euw$$qe+c-k?dG557kh4nFVPU-tY~n}hHeP3ah^HItLW58F(J zJmzh`#*A+>1gp1wz1d~t>6?uI%@K}$Vm%-7j1xafGb(khW_Q*yvy9nFOz@Y z??;;eHbKN=BqWV;Gatm|`^)FVk3+vYxx$qpWzu*3jJw9OrsWU5sY*2dSh%b`Qdiob zDP{=o6l*cAHaVVpUMcZLkYuGh&mOt^c6|05YX(=0jLuMo|V`IY5oI#}+;`MsXu^;J@R9MpE`%J@A~;lY=eD`?i^4E=&+{${O4yGPaaJBQ`5d7U^f+bWSuaD%Y65{Z*3=ZzJ{?oyJwXi4G z$T#ljc2arf7j!urj$(NbF~_)46QPd2jg&2SG1%Qd8xZ!fD87oTz)Q@7)3^5u9NqE( zt&5B`PN3Cc1=KYZT3vVra%l_4V*N;FKxnRP0gpY;e6sa`-Wq1ik!wI$Tv@g&Xfr6N7xzr;)4J z_UmxHtgW)+W9_ULF`U z*g+8Rt3#u8`4qOWKsefuNC$8ACph5VR*)3iVcE9K%Splw*Fug0@$D!iI4B;)E_jF|@l` z+Gfyq26?RdFh*gtZdLqtpxJmyV8N6ZYaTXfa0wzZ(P!ohdz5taYk9@rZz}&{MQSla zZZRPGhUk% zD!zSw?uAF8P+p{2QdGqo>)Y+~bvEgmcC6hf+h;_gwhmS6qe(vnC^mQ}HzcI$RUB>LppS=PlCTy& zYA0`5@loSVk%FGNBgmpZkro@-K(#ajGe~uQ*63R!mNRSTp>sZy9|iAojTn_%-*?=6 z?tViK5`TDjcoH8O;{OBDug)IwI)|-oY9seb36rnSJS^Upkz|etkxOxy%5SORhcR96 z;tCvg@Nnsne0A09-*Cf2&i?m9?+_x`_p9vS3+PW~AinBEm6df4>3pA!#dZtJbu1e_ zcMbSDn(4L&L%M!Etp0Fy0MEH-4;FtMM~jrp#sc~iFZ9x%4NI3FQzd+_#3Trwx?I)g zYk~xKH&x>67ye%}Ul|lv6s(B_cPBUm3+~R~5_}>!grLFQebC@;!8O6%o!~G*2X}WL zY?#e^wY9HmtG4RZ*8bR2x9aqdTV3b$z1@Af`g|YM@v zENX?5?kmb%>)F8Exgs{6c@pIwe`mRn_0$dwgNiM5sj=JZ4Bt{D=olB#lnweYK~>Vb z&P(|6iq6yR9E)DT`jpLLQ2X174Qd65qSTa;IaL)iz4oUA3mx}6kyZ!^fTQT>A~ky z*{w{ArZM<>tae(82-*N}&GC*O^Q&&Y4BSv+%hM{A;O1T64d6?g&V_{M0lE9hg&*P( zC}+FzUG1TPw5~4k*BS7~K!zLEyXQ4{17BW+*(TKqO3$({4=ip?L?6FDx?{P}^m z!-~9l7bbRKI^?wd?VwT6H|K#L${L>v3behVw`Z{*%Uv3Q7xCrYaE$~QEU@`2ZA`U) zi=Wn2SXHYzfWVfX`?8$+(~eV3=Rj@6&%y`S)57Fn=z*g59nZ4#Mzk6w5#S~_wGG;& zYW=-STC)4L=YKlne|n{nx;VlA^N}dNOB<0MXR{<8_wygK$jAQ*LM37U6-xf^rGG(a zVe32SD{;6snlk~KGd`I!{(lH{oxxZwrS$M07ze>}*_zKM>UL8flisQPZx8LXGu1)& zh30|ic#|izr(F~3XasSk8g|Vp9R{D0!#JRGUGAjg^%BOzJlKKV5pEatW~u%SrXE$3 z&yr1n^TIu^vF9euC%#`qPxAJBa{Ql%mU`NaXJO;6-4`Zs$bomjG5~T4_qSN_Ifq=V zG{c@Ipa(s$o|-2b2($t!T|Mvl{8M2*j~Zh8zn1m{{SOY9|K50z24Fr`wgQ*mTOuI5 zC;Kn+&RzaffcW22@_&BopLzY+TTfXR?vs=`2%`oW5|!VPQv9146LsGaQbfhZ#KgpM zWCm(K|2)slJ$jsj&qeCH9!Y)ng<#ZjU374L+CT6Y%0*aiNaP%XD1MD78bER~`t!yX zVIwSH;N~0kW-ul`VlyV?-`sb7o@>cVb)kJ%lYXu*S8|RBso85X?DNk2&E0mIB*dFu zInrCKM?9CNZ8huwCL-q3lUU>$;ow$R!?t`HB)*yvv{3huF+bL<#NR zAZHA`X<`ian)LcGCr-JG}i-H#FKVSX{12(QAK{HU45XZt(>!04f5PRHQ zY7}?P{D+HjQ76NPS(pSjB_21R^QEO#V^EARH(9+u`;8M@GYK8Z{oqeds(Bhdr(PDk z2zOQIuSngElO`>j%lo~w^W3eO&q6N()Di&*VOWhc!onYqDT9Z%G}h*2wIN#zXE!Hh zKqKkMh2T1SB+=D;=@#8BGUt$uU zz90zBuApu;Qrt3yB(Z_9eghSlly%H_)UA+*q&gnhxZS>6CtGIR&0|cr>V`{=jZu{o zjw_7+x!z$TNt=_v<2Vw!cNO@v)f>1VnC-Lq?GjL2_<{Cv^WKnBf=_s5+mpLF>E#(O;4r>+7D93X|6y|P|J4}%AP`22k9P_ka}t0YPTr$;PC1&0k_fOsFXFd^F<9_r7zVA8#0R(jf|f5< z*;!xxR5&DdTT}fv6>o60ZH)dpG8t%@PQwr*g<#~mgnB)b5?f@y0r=&5j@Af4in(Mj zJVL@-!BwqNQ; z@~(MPfOS930g3E`DA)-^E7e2B|;M{y|Ns=K4OZ;8iQ2FEgN(*sJiE`Kjsp;&C6i3r` zVQ#j~(1mRTk8GZS6YJgfyB=zU_K4y9#FhIACzt@X!#Ksb^VbyJq2x!5Cl7Gb{UP}h zm)D)LL(Frmqf6e0?jW#WiqeQaOwi+ZN^TEC0|KdHYVy<57LPTaR|KWMBv) z2Zr#_Fly6A2ki9tz!hguDq*LP|DpL}eO1VyblNJlJRKXT7P}bxyZn)$3P9GviXF@B zxyB_d#~2{%iymTBGm8n?PX9cogH(?#oH@fAXk!}?Vv%B|)Y0QYIzIeJ`*%lvk&BX0 z@^)OcarOKJ{g3pT&f0LDIwA5i&t6ah^3L? zWe5ip8nY>@kdBdA!j>A+&g{J?XX*zlI;pAx*$hMwYUn4js*cfZrlbBf$XKsGgN|) zUhQ6QuURy3OvB9w3zhiWm}0{_87tTThn?VeZxCH+sWvc>P5wc?>d*A3hGl__oVE6ic#I z8=5_s>O(DMQMXrMp=yY{j$HCA0KSBwSD!hGvb({F;>Q7wvaf$FE&k7toSyGeMcPOG+5B(uuEL zj9Al1C7x$YGjYg_P`W5~LUzL9&<~>_gnxF=78*&04ty!io~>=&<55se6n^j50wXu7 z@y&S=7F0AmnrrTO^3h%-$@ih(3K>Sja3@g?k~)Xql)5`*)i2-QeOfB&aOBrwi+pG_ z*fgFO+F4k>+4)MxnPtvQxbyArz#<8WwIIA)9P5DYR>3~{guzXQ>Ub2?H`6g-8nyCqaG4gK5;uS zhbUKcS8#M*#rMwknVjOuI4ak%#0bJT0OWO=ZOv0wJr|rMbBke2@Tel{7#Yr9CdSOu zbO}7o<U?=l98(-0>!(<@&}rfw2zw7CSYe z4fWs~T36T9-g7nZgv3Y{H&N3jC6LWe&CP_jHiTU!is_lS}|MVl$4y3FXWh`CsdX!uyT3BG79me4%Df&&*M%#dbKuj{_?jXNN;EuI3@PyZS}{0!&Xk-eziT%4Yeku1-BIOwd?%N)n{^Fg`26tj$? zWbCgDbhK{c)3phH817W@<6T(%&QB!6>i1aYfp5wC2brj30Y^hMC^Ac}ce3K`GFRTo z>{YC~{gw0bsl{2GhHPsJAm7)YwXq~a+&O8vKkaMF$crWymCsnspX!`lZZhfVUsM|g}e zl@#v?CTLdKxRm3KPhb6daAy$RS&&`yaRNKNgVWl$!SP**!P_R!f`^#_Y3w6r6?r5oUwI17H$!HfBY=Kzh$J67o7h-NJ7+#h_ zuM6R8Z-7=fd8vc!hCzO{p_KuNZ$U*wlGWRy9laG~4`7}S3uSl&rmvz!tv&C>I%143 z7Sft$HyW}Ud|o_(TDY9~UE;y3*OS@u!@ysjJgnfjT!*#$sGBopf~RHoKhlD(a)-on z^L6$=uV_V-$w507mRA>TLvGkfQxaMq^x?O0wbG#Yi-gCKRrn!wK?kWoj;ddEJmXhf zGJi7DJX->w#x^{kB|SjpGkw49wGLuXuv$#EKIBe514TnMwXft2bfVz%4k~uhPw*fV zwkF<~Wi>%~p%!4uYP46gPA_ZYamYGtc|CkbTh!BbYuIulyZ6RFNyc3n3M?qjCqSJ- zLYTKYfo7b)Ri{12DwhzBz}Adz5gR!hGl1F)xu1F5$E^*E^T+KsNshdndr}{jdB!-< z96r~;AD-gVQHqQCom5|^)C-H7OF-onzBgP5Zdla}1;{rJZdq>uM4KnE=HIVszfH&q zHQY$njwxU?P~_88(aht9aRil6PFHJ=VAlV<<7u;g^@te%S79WH(@3^o+^K(IDj~Xu zW{>@jba^R5=-urX$WbQ8p%!u3U7ABxJ&g?-^=dzpp}G|t=iVH$CMSOecfvlwb#+_m70EhR-jjaYm74|6vz!AB0 z-~y67UyTdb^%s(p#n%y9=|D(O+#oAAJm*id_Z6Tw5`}MdR6$lh2sj)OFA@oUm~{>H z3|TeC{w<#ewJygCiM@^Sxew`RF4};Jz*9G=v`$it(tUEsE^pd-n<>3YwgbozUYb6L zFq(BU1%tbZs$0wyea&yuDc3fTsoT38siBe5o_~0vv|Y7ocG?KDOh_hzr|1Ca{NA#B zg9*NV-S9Vp4P~tn{^L?!zRs+sJ@qToA*Ka@H$icKU$v8&uFEFu`YP`QZbOQ}Azt=6 zDv>$An4fD}=TX?FCp2|Mw5pl&c)W@Svxir>M88?ODJ`=%2yM zLXyG$k^2!%#IH{y2VrCN9pUj3^f$2v__?hbo=dmQrh}^w&4v0walKwqhCnxuEW{aO z{SRkrriQGDV>BcBnOX{I@h9+eI^G{y>qT!0tm8JJIj7#JJkXB_32O8s-nf(6$Xa+4 zx%g*{KhJW+fk7QRu$+`;J0W)+f3g<%oh(FYZm`9Vy9a-y{N-np=EwBW$# z@y^+|+>B8;UbSn}tKvg^z<>7q9gTRmO|h`0DGWXkMo%j&B#zt9J|4BZa!*_3AH6iMv1Kuoc@nBC|2-Y>iBQ z%yOtU19o}cruZ84y6SrH7FUW2MiH1)zOCd@JtDvBBmY6rJfA7NER~D!$*DjvBD!^{ zvDoe{f62!ehQ*v?wezk>-Gt+?gPaP3EkXPHf(Kme_8x5nNd|ZS`@|t9aK?MD*l+jq zQSIkD={t!r91TL6EI#|z|{dZn=^VTYn3GAi3N=_?`QymKT`AUQQeN+BaP@H znBt`4ple}bxB}K9E1=elf(|$LQ!@Tu@h8lwM9pGe8E%*89+d9PH<*+|1YqEM!QOu< zZT$56DzgnEiXIK0So=GDbXLHvh#G!nO+)1h64^;a^RF%;{e-0)_uKljU5ZJ4*Q8vHGj%BsN2QM(_iX$;xU)Ogn^G*QMnt0)cD!JWLG zZjUrO`B>J{Xh>z1)BKkfgtS7h8h&X>WX*lQqE*Db&;L>0(jtqv8K8m;j_4Dyo=TeD zanMdxt5vmFq%p+5@hRP7Qdtj|IksJ$AR_?o+R^j7KZ$HE2YVB3oB)VSa&`V3b+LhD zzRAtp9o=a@(!2Qdgqju>3x2GdbXZ6)YKSCY>?f9h3GjQzuL?2zCdr=x!j7kJH$Za1 zA=)T=J8EFDIL<1_9 z+c~7&YMbsy2IfQ5R(ze%8!1v>Xrs6n-;b*?#1fmEcw^IE1m@Xt2%KXnO{Br5zsXB+ z^ntk?Z3!7*^5Wrs!f6IvBveiE3vy>v#hQPVnUt zHsq4wDG#}F$)W{u=vErB1iLpd`19N3JLM4+5m{1O>*Irp4}Ecr`o)}IpS}b;mSw7s zo6?E8kQ0!-Lm)bzZzo39=j^n;v9-RY#iRwuCBJLIcs5SEavO|?_K2FZCW?@1t%Vsa zH)j<=JPim75k2k5kHF$hG3Kdr4(X8aTgNHYio;m*M{MP{rR$-r@=rBkHUIYH@S-w7 zr+%^XV#12>7~F|VaryRV68ZV1Ae#`OGWY%6gx(}?L@QmLHgG@2mX^a|eBoJFxvL6w zEb0Hl>Y|m+B{+l}T4$|itCx$C( z$VxOBHey>rND-rz(0i{EQQFJu&W++9N0PyR%HoRtqPo<`-(6q5;<1lw_?_xa>b+#f3BhbA(_N5xr+GwwBgLcaU$9UrcM@j!&evK zhxd_!bfS)~rRvMx=@@saD4f$P?mvp%Nk#Wp(PYiNgq0({WOgqsGMAd*mDl9Z%Uu`Q zA(C6E;nKl*1fuE!Tf9F)kxKmiUY(a3)@}b@o+2(iO?<0%6+^UaXW{<)64HxHz0=ts zP5)}d)COAhVT4EyekgVw{>q;os6%JrBN3~mqI8WXmmE_4%u_CXC~!9X+=GQYzfSWk z*oq`*)s*T5H;X&_)T4B}`uv&VmazsnM=2*a1aLF=8m77pe^C1xGZZXRc6V}QZsq!E z8-S-S)2@yb*w_o)Zx2*$pn3 zKbbmoEyh^5aOGa?5~vm69sWbK_gT+k;$6%pzQF{-WTdG^IW?Q{BuHev@{qI0_b^+@EBtBSK;I{Bh7 z(P^Q93tNn!0VkGsjfx55J<{|uzC5{PUqT5=^>ltM_B&csas2wh@;h3YrM(CG^}q$j zJGH%hNCINan*8^F0zam`UBf5RYmeUuOwyO7{%bwxm*!R9qI@HbBebID^IeD5F4R+- zs1KWfYRf;w+Zm6{b+hWUf&Obn18smeV1(MocZG3!??Jc2Rjvx_Y1V- zAnoLM5qnT?v^L?(U+K{-hV_I?KK#@azCNIrcsObK-c;ve#w3E71@nU~k3&gRVU2vN z*J1o~AXbVYw{r68#Hc*>mOJv4GoF5$;c|=;`(A33E>_^Fe#s{(9~J`PN9~AUXM*g| zwz%%L(U>zNM%8T~*EP3XatGR%g;lFzZOBMv`QFja4Xq*8HvZ|?))s*I>IxaJcSFja zyZVaIP?Lzhu93*VgRxWCZ%^$LQibjV9A@;3n20J~QcD*iU>0(p>i6fXgTL?am5NEH zh-NS6)_&&1uM8vpO(my^skyY~X9@1D?te&WNk$#^?W7_`tjnUI5f@(wP|UwqJ?9tx zYnw%!HsLOT?sVT|J{Grk7|AYI9!QZ@jGl=d3*5p>gsS_r4aFby2vf2-Aj|}z|Jp~n zpQE!=K*m*~ru3e)>xvK~oJfSL#IBzuInvh2o=V6V#>HeA3dNgW9>Nq$H=SuW!3CpX z+EE7EO}rAe<>zY}15)eo^p8w_Cm~aRQ!iW*Ke-RtS@hi{ean*ZmuWrOKO@bZY<%V2 zfl>1G%J|Zbsy-%7|1~F7Q;~GZ#UQ{d)B;-FJP+TPsC{b%HWVG< z{K-ARw*ypcC#2-E(bp~*R75HE@1r{|9AJ5VXGXF$PLcb<>L%^KNJy!#;TM!Tu`*UWY{8sQ*l=R8!u;pQM9NV~ z!wyBHGRya!JV%Mt$SXw%tGJq4$O%uwf~+o~`Wu-_tLG8Qx%oOe5q za2vhbRpIoRZU^xv2f%C_gH}t8*Ni`DL`&*hQhaLeO^w}qa)fmqv9%w}jp>l?@Fg)X z2JGXil4%gWc=#ajfcPvfrHu?bxY}$tJ8U}huI_4;1oi?WQ?RpF>Mt{ujK?CgM!zQQ zFPBv^*>?|Xfap2spH@^U>bcV0em-hqAn{SBWF8kAUsG~uMFhK_aox%5M!f}%3hFu# zQ)TrP+#_X+ulqO8RWRvl0=feDm><^`sm@!`6kTj=3JJ&ysl!Afv$4Eo#)fvu-q-2i zV-OTH5Jd(3n!#5|m?6l3q9luQx0Shvd}F%{)^D&Q7dydr-Ri_`qZ6q|7wql*aF-<& z0RP??{4+S=?@fk^M1pP38E$_wPUKSYj&b2fh*y?D^dVaPf-7!Nm6AMJ>lSJ64r@39 zdsI4uLQz|Tvcp2Sj7j#Ep<*qT{$tk?1=Gv~WpvWu3}78D@U;o0veGjLLSy2)BwRp6 zMc9VVaJ$A+p?8LQRV|%t>7P;3JPJSfqorU|V?VO&A$FlXLPH(dgK{ym?xN9MW8gV) zo8zo>G}&nIqiPlnzienSQI4GtI(5=c>=@_zA}^@pvHF zkdx{7FeT~PIyC9j8`Ssk=Vr_h!%UT%3}d`ZPid}WIpH-tmT=mK*^B}E{V*%X#&qB+ zyv6%WAbk5ItV>=AsTInkX^gWB46)rt)7<_X~D{5v<&{)}U<(7n(A zs@H$B?C1tZEnvS5BBrmfwp>2o;xjs3YXd|ur~dSm*#bs3b}J4HcAqqN6MVL)3aLP2 zg5{Wl$L)|P8@@jTM=!rRzox6ZG9L(K>SlYAaxzcRkm{Xvhw-zPRAnlOCRX~IL4qe1 zDu@5&gZ(w}qQa^pDv$Ncryz%5hV&_P#ItWr)NO1iT@oNj_vGqTgoVi^Z!-z?%TK4n zL+F7&w1SuSc1@8naYIiR6zoJ&>`eUDD1Fs6?%(;2!=Rt(Ju_7SYMnHQTE5frW?-gG zCSobm(lrIUYn-DTv@X^2%C85enoA`^7e5eVv{q27gya|?0yWK}#|Vs-j>ZO|p*xVZ;NHIQ)CBz5ox>TL z5DAG&wk62Xr^6M0)K8tfH$!Xd5_{{l;u-2!JeliRmCgjSum)Py?kzqc?yv5f_lO=e zzD%V49v|??tk+;f>wLXxN0>H2NkD{#e^yF<5tmJlBk;mHb`$50wQe$r+A4d^e z!Yk)~`W@mB@M-tGhzk5-z3KvJDiNn@^9zLGSe}@fH8g8EIw5}w(lZ66>97__(GJ6< ztK4>U1tPy*swtH&6S~>{j2nopE@a8k{^PoH z9Dya9te7ASHCOKM!j-_ocL{l@14{ix0po+$OZwji9AzKDgKj*7-l@CoM>xY!TEq(xNXC_3>2a|;PR(w@XwU3behVgpOmrJrE4nyW;lQO zl|!ELaQAK^3Gr74UDNiHHP~ z9}NPLh{hb2HD7uMM!)^$A*jF)UuG?(H*_Z(0C ztiCC3n=9rtxe!=Si@Qw~YqIdT_pPBEg$p9)?`(&1f!1A#nqd?RO>KdjY= zn0l3*b8Nd`xSiwSz`QFThPQWY2c!+DN7H}?pE31PfsIim0^36D^zkYF(gE%fHnnDM zIdXGPn|E4VfAm;kUT{cUe0~?irwJfT$TOs)tGHU!?MR6nL)q0*6V2~~8y);3hzC8e zmb4nb&rGBoSahsZS7=3>&9iw=gpE}CDgE=w+lTAWt`3yw9M38SZh?mNh4_D^YWKNZ zxAs?qH@=z;$tdk+BMvo2smRUjslF?|RR^8x^HW$F1oXlDslgJ}>%(8pLQcKCjyUM$ zF!wXR)pO+^quW_7K=%3`Sa3sU`V8qHc~juCof9i}4*aRkmewp!PHxiM4gQsq$M&l; zjoPzqUDj+f98lcsw&R^Tf&68n>lj6$X$#{EBag2cPTxrHB~z2TypEhKB2kHckj&Af zzEB6pV*J6g7YvJ4pDCiQY4N}_Xu5anhw?X6>rdbK9$zKiL5JR(^>*%~JJ>=SQcR$b zgw)H5ztA2=UwL*}e2Gl@?ctY?+?`f%lc4 zVG-Nam~0;4nB=_ITvbDlKtEisWvt95)$Q1HGLpzuJ=lq!IM*zx?A<{j-1xDPQyr-b zbL(HqycO{-GHae9$lNG%CJOaiWkg>WWO(HJn}`)**JRI_4*MK6J%-zH3bS~bDxUfh zJ~i@SiTDjJbWY>|IkIXkrIE#tX#7H`4^?qW(So4!E?x#nG5>BWNGjZiKnFK0vbq9 z0L^QZfd6tBdG48YVeOQ7&C9i&lZ^glBU6&@oIa_zTeUVIl&B60rN+&@@y@)kNMH*fv#2pFrZ-59Wfnq;-g2 zw;U{ahQDJFnq_6Q81V9%tz%__YW-0~_cLyCA_K3CpdwA6ivTKw(D!9)^+aYj{m9NH z&$IQ@<b}E>l)8VXn^_<#nL7ZDD=l8E=Fn93q;sKt zVggTrQHcs<#p117A-@NAkNBw5zMDDxL!K=rgO3+7-9!=fr76C&!eelcGaN*PS_O0(a;&Fu~zZEpf5o!7rOl^$s zDQ0}q$$*f$=G#X8+nlk1gq$86?zZXwi^E~aTSrmV13kV!R5yiCAPwXv@f<75j*@>^ z-7gaPT{50iyb--Y7ekQBPLkWp?)WCoGc|1wO6|~KbV`RwvB~~%Www*UcRm-PhWl^I z_7{YL=MHuW37o|V^y2DXM>?9k?e&Ahxd;mlr$=K=_$z7W(qo*a2bMFinXZV)QyEc_ z|9LHVL(&lzFaGj1z%~g8M)s830H4*Txc8UtP}mmOC}a@%Jx4i%f5puaqlBn_;Q(W8 zg5Uph)K@RttyO>R1h2l&ZAV0?Ke^RcUe=KZ`?rE6bFhl%Yn@=-WBZZ^KN8Ssri{Iw zWJ$;4p=9gJs$Lakv(lFa3D;99ncZ`GvPPtzewS|NCZJ`;AHbicRh{3Aav^PX1!*m; zcv8YU2WDlI3~#e^`oYn`i`$})JGfxJk2DSGdoqTH$$ExAH@qc>%P*B|pxqNk!*}zA z{p#n^Z?|LI=0ci7J&@%CyI(-KK2z-VOB1rVgYAYbd6h4n1M`(((4`Zh@fF)lA+^`m zvC?JWhKUQzA;-?|vkbTfUxEO$ux;G0w4OesRlJ?BPbAZXch&01bv^cRNG>k|-m^=G zC3XBoHY#ABqq(h`B7Z!?1kP-kxjS#;bj7W+G#5MOX^QZuN!OWGtBg&^Kf3b#+Ks64 zHDl!3eesc`2zPG*7*JZFOmeo(blpkGCkQ!p$G^_ zmn!lypS*rrB%9bWx)X=zneg#vs?}#QQ_eQl3ar^gE9!pvLfqv-;7)M59VX1BeEC85 z9*Z@^M0#2^Yz@m1MaHG>y<1geB(Sdeyq&W^-E-E%EL(tovL|zN!h9$?3wVkZfqZZ& z)k!77fGwv;sN<-Pq>ztr*h|ri)DEBLtEEU&J+F&+%vRa-`2t!0p~$#&Mr$g4 z-8dz~RF&U+qpkf98AG~!is&zXo@K7Szn-#EG;P5F0Xr_uw^!7qH)48{GG8DWlIaSG zOv}x~y^_C`6!TJ#rE+PV%wA=;?}2xfjaK^g({&H8MUc8K{Bh)AtXhAkPJB=FA1D}l z2{9O-RK9xCd#2IKBkCYYJ)A?)95pR-)%JkAe9po6+9-4=p%KQ(H(e`3}0{ zp0rsJ2s%jNnJ#$H9Ia^P1`<+ zqK57P!FQmlSf2N|xV=TrtYv z1D70t9J{(Tf_4AEz8`~fcVNynmdzitLaNyW)K182*Q`HgD90zcJvDa-EUT~pxi~9N z^{pB+Ue7BOnzN~m+j+tyLqP*lHHKMRCwb=$_q9u?uQZv1hdF=d4KObmoSY@9)Y*ZJ zbfFneom*Nzz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ>_Z7qnc55i}oqW+%=3j=%Wq_;PQ_W%M2 z!?ug*>Hqa-&g20yCD1TP>q{zv}({K;UkV}}G({3}R5Kmaiz8+Iu(6K0qS z5F0=ZdePC|J_Tyf9T0scH1r5K2!I#}Y@q7E03d+SUC0eJ3~Z~jv-6R^z;OEsbjgn& zKN!A$|ITpZ#tmc(4WO=D1M(cm0Du5uK{F7fn8)4SeFw-O-Oy%+-+%uzNW9(4aEIHD z;rE|^44)^)d;uB$_U+pcq#*bLGXNlfFkI;A>G?%FxB;yB_uqdEzkdH^_yuAE@t=SH z8U6yr{s1l6-RTcfNxNWWO#b_Dg(Q)Jj1`=zZewX zZf3YI?8Csw#LV#J)qMtj8BK{*5qtt5uOzrQp5`}+r+Qy7_97?@eu7?@bt84gd3V6ZP*!|>_(Z3bR(Wrjl&!r+Di z1Q64FZEc3{qM{7HKYe2O_2C1`TIA+ zxg}*FMF%!++5}d8a&DFbi2nHWIwXJp|Htt0@l_!G7iORhKmalQ0lMrP(3|go_&qTE zJ^~H=3`)pXFRpHYS$+W^ zfItQ+198X#Gqa9wfBrE126`p`{CQ-G4T$$a6@86~iu!Wt^5q#&x%c?g t0|XEwT1kUm?!mH@IFbur;!_V0U;uI^$AfJ)aHIeL002ovPDHLkV1l+~*;N1l literal 0 HcmV?d00001 diff --git a/src/GeomModule/icons/torus.png b/src/GeomModule/icons/torus.png deleted file mode 100644 index af76fc00c1367863c65397f9d8108c04caac744b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmV-@1cLjCP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<^GQTORCwBA{Qv(y12q9a05Rf{C@(Mn|L4yihF`ya zf$`6uKN-G%|IYCB>sN*?TejfT2M|CkxD1lEievcs`!B-}ApZU5AH$!&{}}%M`_J$T z$Told`u~p~KNv1vyog~iKmef#6crWyS9C~b`1<27!{_h67(Rdd&G7x#UxqKA-Z8Lo z2{14MRWma&f(`x)v|w+46vMM;&v<}ZzrxG_2q3tDd3kyNm7LOm2K`}p`{@V6s}DaI z-hBEF^zKiFAD`bcaPW#Su(7c+aIv#7u(B|L^?+Qxv)zy3+qZ9ULjeK^Y+!nN`hPX| z9H7hoFueKrgW<`WFAQ(qzGwLPFqR-j9n8GZu| z1O?09c2AHoU_$`{2pon$8yLO-UH0zt4~FOOzcajj_mScIhZhW|7vy0Cx<@5APV>e*6w}-Difsz*s#tJrShn0J?!p zOiT_QH9Hu-eSQNBj^7M_etrdtu`ryNl?IYl0SF+bckkXYyngeB;m3bYhCj?aKyL{m z8}ekJNe(~-EkJw(h+n{Tn46nlQ1q#0`1}Xt-R}&)zkg=<`tAwb+W-N? z^6J$qhHw8k8NR%F&hQVE9DtaUU!1|Sb|=GyISDnQqM{7^{QL}@oSa}C>Vb{Gi2Kg) z{>5X4@9&=h!}=w||3ANB21)<~5Ga=QL0+*hUIz>dW(H7VV`gCk#w0TXFDEMl4-hl` z`NF`-Bf#(nn5aK}|IP3M7;zt8KV|s#_7TI6kFOYR?wSS*q6+{4!~zW`hQGkT{R7O` zOhCi_|NF=Aosk2ah(THXA22O`{rdx)$lrhY33k=@_fNrw{rdU=<~oo$F8~4v8*E@Wh40vgQDz|6|dz{JeT@blXT1~v{}V2pkP8t|Us$EVi}KY@w;H&Fb+ z@l`O_fg*1WKmfsViZT#~0C9&=R0q&i|Db99KbZdY{UZYlD+j}$U*8%202BG|Z=ZmM ze_?oZYCUpl07c#!fB=FS$PG=H9za|J643G~273Ju!@s}4!U1R?$fck}49Yo=POgP{ z6J{7FN$mj900D$tI3ODeqJ8ibdk2uh4Q?1H>j4B1a`E*QDhLl?P%?n#QFH*4zXSE^ z1z6z#5J1=pN^Yn@Do~e7U{Uh|YRDZZ8(w??1P~)0Z*ddh!msEO009O7)dj%qN9-@j P00000NkvXXu0mjfJuwB1 diff --git a/src/XGUI/XGUI_Command.cpp b/src/XGUI/XGUI_Command.cpp index 4c4249c6f..3ba1689a3 100644 --- a/src/XGUI/XGUI_Command.cpp +++ b/src/XGUI/XGUI_Command.cpp @@ -2,13 +2,13 @@ #include -XGUI_Command::XGUI_Command(QObject * parent) : - QWidgetAction(parent) +XGUI_Command::XGUI_Command(const QString& theId, QObject * parent) : + QWidgetAction(parent), myId(theId) { } -XGUI_Command::XGUI_Command(const QIcon& icon, const QString& text, QObject* parent): - QWidgetAction(parent) +XGUI_Command::XGUI_Command(const QString& theId, const QIcon& icon, const QString& text, QObject* parent): + QWidgetAction(parent), myId(theId) { setIcon(icon); setText(text); @@ -39,4 +39,24 @@ QWidget* XGUI_Command::createWidget(QWidget* theParent) return aBtn; } return QWidgetAction::createWidget(theParent); +} + +bool XGUI_Command::enabled() const +{ + return isEnabled(); +} + +void XGUI_Command::enable() +{ + setEnabled(true); +} + +void XGUI_Command::disable() +{ + setEnabled(false); +} + +void XGUI_Command::connectTo(const QObject* theResiver, const char* theSlot) +{ + connect(this, SIGNAL(triggered()), theResiver, theSlot); } \ No newline at end of file diff --git a/src/XGUI/XGUI_Command.h b/src/XGUI/XGUI_Command.h index 8f1caf154..e3759a4aa 100644 --- a/src/XGUI/XGUI_Command.h +++ b/src/XGUI/XGUI_Command.h @@ -1,22 +1,34 @@ #ifndef XGUI_Command_H #define XGUI_Command_H +#include "XGUI_Interfaces.h" + #include #define MIN_BUTTON_HEIGHT 18 #define MIN_BUTTON_WIDTH 40 -class XGUI_Command : public QWidgetAction +class XGUI_Command : public QWidgetAction, public IFeatureMenu { Q_OBJECT public: - XGUI_Command(QObject * parent); - XGUI_Command(const QIcon& icon, const QString& text, QObject* parent); + XGUI_Command(const QString& theId, QObject * parent); + XGUI_Command(const QString& theId, const QIcon& icon, const QString& text, QObject* parent); ~XGUI_Command(); + virtual bool enabled() const; + virtual void enable(); + virtual void disable(); + virtual QString getId() const { return myId; } + + virtual void connectTo(const QObject* theResiver, const char* theSlot); + protected: virtual QWidget* createWidget(QWidget* theParent); + +private: + QString myId; }; #endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Interfaces.h b/src/XGUI/XGUI_Interfaces.h index 12725017c..d54bba43b 100644 --- a/src/XGUI/XGUI_Interfaces.h +++ b/src/XGUI/XGUI_Interfaces.h @@ -6,17 +6,40 @@ #include #include -class IWorkshop + +class IFeatureMenu +{ +public: + virtual bool enabled() const = 0; + virtual void enable() = 0; + virtual void disable() = 0; + virtual QString getId() const = 0; + virtual void connectTo(const QObject* theResiver, const char* theSlot) = 0; +}; + + +class IMenuGroup +{ +public: + virtual IFeatureMenu* addFeature(const QString& theId, + const QString& theTitle, + const QString& theTip, + const QIcon& theIcon, + const QKeySequence& theKeys = QKeySequence()) = 0; +}; + + +class IWorkbench { public: - virtual int addWorkbench(const QString& theName) = 0; + virtual IMenuGroup* addGroup() = 0; +}; - virtual int addGroup(int thePageId) = 0; - virtual int addFeature(int thePageId, int theGroupId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, - const QKeySequence& theKeys = QKeySequence()) = 0; +class IWorkshop +{ +public: + virtual IWorkbench* addWorkbench(const QString& theName) = 0; }; diff --git a/src/XGUI/XGUI_MainMenu.cpp b/src/XGUI/XGUI_MainMenu.cpp index 0be7579aa..0a4903bce 100644 --- a/src/XGUI/XGUI_MainMenu.cpp +++ b/src/XGUI/XGUI_MainMenu.cpp @@ -18,7 +18,7 @@ XGUI_MainMenu::~XGUI_MainMenu(void) { } -int XGUI_MainMenu::addWorkbench(QString theTitle) +IWorkbench* XGUI_MainMenu::addWorkbench(QString theTitle) { QDockWidget* aDoc = new QDockWidget(myDesktop); aDoc->setFeatures(QDockWidget::DockWidgetVerticalTitleBar); @@ -37,19 +37,13 @@ int XGUI_MainMenu::addWorkbench(QString theTitle) myMenuTabs.append(aDoc); - return myMenuTabs.length() - 1; + return aPage; } -int XGUI_MainMenu::addGroup(int thePageId) +IMenuGroup* XGUI_MainMenu::addGroup(int thePageId) { XGUI_Workbench* aPage = dynamic_cast(myMenuTabs[thePageId]->widget()); return aPage->addGroup(); } -void XGUI_MainMenu::addCommand(int thePageId, int theGroupId, XGUI_Command* theCommand) -{ - XGUI_Workbench* aPage = dynamic_cast(myMenuTabs[thePageId]->widget()); - aPage->addCommand(theGroupId, theCommand); -} - diff --git a/src/XGUI/XGUI_MainMenu.h b/src/XGUI/XGUI_MainMenu.h index 3521be3c0..ef4dc0511 100644 --- a/src/XGUI/XGUI_MainMenu.h +++ b/src/XGUI/XGUI_MainMenu.h @@ -1,6 +1,8 @@ #ifndef XGUI_MainMenu_H #define XGUI_MainMenu_H +#include "XGUI_Interfaces.h" + #include #include @@ -19,11 +21,9 @@ public: XGUI_MainMenu(XGUI_MainWindow *parent); virtual ~XGUI_MainMenu(); - int addWorkbench(QString theTitle); - - int addGroup(int thePageId); + IWorkbench* addWorkbench(QString theTitle); - void addCommand(int thePageId, int theGroupId, XGUI_Command* theCommand); + IMenuGroup* addGroup(int thePageId); private: XGUI_MainWindow* myDesktop; diff --git a/src/XGUI/XGUI_MainWindow.cpp b/src/XGUI/XGUI_MainWindow.cpp index 729f1869b..f5c82a4bc 100644 --- a/src/XGUI/XGUI_MainWindow.cpp +++ b/src/XGUI/XGUI_MainWindow.cpp @@ -17,6 +17,7 @@ #include #include #include +#include XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : QMainWindow(parent), myObjectBrowser(0) @@ -36,12 +37,12 @@ XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : aDoc = new QDockWidget(this); aDoc->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar); - aDoc->setMinimumHeight(20); + aDoc->setMinimumHeight(0); aDoc->setWindowTitle("Console"); QTextEdit* aTextEdt = new QTextEdit(aDoc); aTextEdt->setText(">>>"); - aTextEdt->setMinimumHeight(20); aDoc->setWidget(aTextEdt); + aTextEdt->setMinimumHeight(0); addDockWidget(Qt::BottomDockWidgetArea, aDoc); QMdiArea* aMdiArea = new QMdiArea(this); @@ -57,7 +58,6 @@ XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : QWidget* XGUI_MainWindow::getSubWindow() { QMdiSubWindow* aSub = new QMdiSubWindow(this); - aSub->setGeometry(0,0, 600, 400); QLabel* aLbl = new QLabel(aSub); aLbl->setFrameStyle(QFrame::Sunken); aLbl->setFrameShape(QFrame::Panel); diff --git a/src/XGUI/XGUI_MenuGroupPanel.cpp b/src/XGUI/XGUI_MenuGroupPanel.cpp index b88960f7b..0753625d5 100644 --- a/src/XGUI/XGUI_MenuGroupPanel.cpp +++ b/src/XGUI/XGUI_MenuGroupPanel.cpp @@ -20,7 +20,8 @@ XGUI_MenuGroupPanel::XGUI_MenuGroupPanel(QWidget *parent) : void XGUI_MenuGroupPanel::addCommand(XGUI_Command* theAction) { - addWidget(theAction->requestWidget(this)); + myActions[theAction] = theAction->requestWidget(this); + addWidget(myActions[theAction]); } void XGUI_MenuGroupPanel::placeWidget(QWidget* theWgt) @@ -36,14 +37,13 @@ void XGUI_MenuGroupPanel::placeWidget(QWidget* theWgt) void XGUI_MenuGroupPanel::addWidget(QWidget* theWgt) { placeWidget(theWgt); - myWidgets.append(theWgt); } void XGUI_MenuGroupPanel::resizeEvent(QResizeEvent* theEvent) { QWidget::resizeEvent(theEvent); - if (myWidgets.size() == 0) + if (myActions.size() == 0) return; int aH = theEvent->size().height(); @@ -52,10 +52,24 @@ void XGUI_MenuGroupPanel::resizeEvent(QResizeEvent* theEvent) return; myMaxRow = aMaxRow; - QListIterator aIt(myWidgets); + QListIterator aIt(myActions.values()); myNewRow = 0; myNewCol = 0; while (aIt.hasNext()) { placeWidget(aIt.next()); } } + +IFeatureMenu* XGUI_MenuGroupPanel::addFeature(const QString& theId, const QString& theTitle, + const QString& theTip, + const QIcon& theIcon, + const QKeySequence& theKeys) +{ + XGUI_Command* aCommand = new XGUI_Command(theId, theIcon, theTitle, this); + aCommand->setToolTip(theTip); + if (!theKeys.isEmpty()) + aCommand->setShortcut(theKeys); + + addCommand(aCommand); + return aCommand; +} diff --git a/src/XGUI/XGUI_MenuGroupPanel.h b/src/XGUI/XGUI_MenuGroupPanel.h index 7fe95cff5..cda62888c 100644 --- a/src/XGUI/XGUI_MenuGroupPanel.h +++ b/src/XGUI/XGUI_MenuGroupPanel.h @@ -2,19 +2,25 @@ #ifndef XGUI_MenuGroupPanel_H #define XGUI_MenuGroupPanel_H +#include "XGUI_Interfaces.h" + #include -#include +#include class QGridLayout; class XGUI_Command; -class XGUI_MenuGroupPanel : public QWidget +class XGUI_MenuGroupPanel : public QWidget, public IMenuGroup { Q_OBJECT public: explicit XGUI_MenuGroupPanel(QWidget *parent = 0); - void addCommand(XGUI_Command* theAction); + virtual IFeatureMenu* addFeature(const QString& theId, + const QString& theTitle, + const QString& theTip, + const QIcon& theIcon, + const QKeySequence& theKeys = QKeySequence()); protected: virtual void resizeEvent(QResizeEvent *theEvent); @@ -22,8 +28,9 @@ protected: private: void addWidget(QWidget* theWgt); void placeWidget(QWidget* theWgt); + void addCommand(XGUI_Command* theAction); - QList myWidgets; + QMap myActions; QGridLayout* myLayout; int myNewRow; int myNewCol; diff --git a/src/XGUI/XGUI_Workbench.cpp b/src/XGUI/XGUI_Workbench.cpp index 3cecc44b9..f73c693fc 100644 --- a/src/XGUI/XGUI_Workbench.cpp +++ b/src/XGUI/XGUI_Workbench.cpp @@ -43,7 +43,6 @@ XGUI_Workbench::XGUI_Workbench(QWidget *theParent) : myLeftButton = new QPushButton("<", this); myLeftButton->setMaximumWidth(14); - //myLeftButton->setEnabled(false); myLeftButton->setVisible(false); connect(myLeftButton,SIGNAL(clicked()), this, SLOT(onLeftScroll())); aMainLayout->addWidget(myLeftButton); @@ -70,7 +69,7 @@ XGUI_Workbench::XGUI_Workbench(QWidget *theParent) : } -int XGUI_Workbench::addGroup() +IMenuGroup* XGUI_Workbench::addGroup() { if (!myLayout->isEmpty()) { int aNb = myLayout->count(); @@ -82,7 +81,7 @@ int XGUI_Workbench::addGroup() addSeparator(); myLayout->addStretch(); myGroups.append(aGroup); - return myGroups.size() - 1; + return aGroup; } void XGUI_Workbench::addSeparator() @@ -93,13 +92,6 @@ void XGUI_Workbench::addSeparator() myLayout->addWidget(aLine); } -void XGUI_Workbench::addCommand(int theGroupId, XGUI_Command* theCommand) -{ - XGUI_MenuGroupPanel* aGroup = myGroups.at(theGroupId); - aGroup->addCommand(theCommand); -} - - void XGUI_Workbench::resizeEvent(QResizeEvent* theEvent) { QWidget::resizeEvent(theEvent); diff --git a/src/XGUI/XGUI_Workbench.h b/src/XGUI/XGUI_Workbench.h index d7916351a..506845adb 100644 --- a/src/XGUI/XGUI_Workbench.h +++ b/src/XGUI/XGUI_Workbench.h @@ -2,6 +2,8 @@ #ifndef XGUI_Workbench_H #define XGUI_Workbench_H +#include "XGUI_Interfaces.h" + #include #include #include @@ -13,15 +15,13 @@ class CommandsArea; class XGUI_Command; -class XGUI_Workbench : public QWidget +class XGUI_Workbench : public QWidget, public IWorkbench { Q_OBJECT public: XGUI_Workbench(QWidget* theParent); - int addGroup(); - - void addCommand(int theGroupId, XGUI_Command* theCommand); + virtual IMenuGroup* addGroup(); private slots: void onLeftScroll(); diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 810e0344b..191e960a0 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -37,110 +37,57 @@ void XGUI_Workshop::startApplication() //****************************************************** void XGUI_Workshop::initMenu() { - int aPageId = addWorkbench(tr("HOME_MENU_TITLE")); + IWorkbench* aPage = addWorkbench(tr("HOME_MENU_TITLE")); // File commands group - int aGroupId = addGroup(aPageId); + IMenuGroup* aGroup = aPage->addGroup(); - XGUI_Command* aCommand; + IFeatureMenu* aCommand; - //aCommand = createMenuCommand(aPageId, aGroupId, NEW_CMD, tr("NEW_MENU"), tr("NEW_MENU_TIP"), - // QIcon(":pictures/new.png"), QKeySequence::New); - //connect(aCommand, SIGNAL(triggered()), this, SLOT(onNew())); + aCommand = aGroup->addFeature("NEW_CMD", tr("NEW_MENU"), tr("NEW_MENU_TIP"), + QIcon(":pictures/new.png"), QKeySequence::New); + aCommand->connectTo(this, SLOT(onNew())); - //aCommand = createMenuCommand(aPageId, aGroupId, OPEN_CMD, tr("OPEN_MENU"), tr("OPEN_MENU_TIP"), - // QIcon(":pictures/open.png"), QKeySequence::Open); - //connect(aCommand, SIGNAL(triggered()), this, SLOT(onOpen())); + aCommand = aGroup->addFeature("OPEN_CMD", tr("OPEN_MENU"), tr("OPEN_MENU_TIP"), + QIcon(":pictures/open.png"), QKeySequence::Open); + aCommand->connectTo(this, SLOT(onOpen())); - aCommand = createMenuCommand(aPageId, aGroupId, SAVE_CMD, tr("SAVE_MENU"), tr("SAVE_MENU_TIP"), - QIcon(":pictures/save.png"), QKeySequence::Save); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onSave())); - aCommand->setEnabled(false); + aCommand = aGroup->addFeature("SAVE_CMD", tr("SAVE_MENU"), tr("SAVE_MENU_TIP"), + QIcon(":pictures/save.png"), QKeySequence::Save); + aCommand->connectTo(this, SLOT(onSave())); + aCommand->disable(); - aCommand = createMenuCommand(aPageId, aGroupId, SAVEAS_CMD, tr("SAVEAS_MENU"), tr("SAVEAS_MENU_TIP"), - QIcon(":pictures/save.png")); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onSaveAs())); - aCommand->setEnabled(false); + aCommand = aGroup->addFeature("SAVEAS_CMD", tr("SAVEAS_MENU"), tr("SAVEAS_MENU_TIP"), + QIcon(":pictures/save.png")); + aCommand->connectTo(this, SLOT(onSaveAs())); + aCommand->disable(); // Edit commands group - //aGroupId = addGroup(aPageId); + //aGroup = aPage->addGroup(); - aCommand = createMenuCommand(aPageId, aGroupId, UNDO_CMD, tr("UNDO_MENU"), tr("UNDO_MENU_TIP"), - QIcon(":pictures/undo.png"), QKeySequence::Undo); + aCommand = aGroup->addFeature("UNDO_CMD", tr("UNDO_MENU"), tr("UNDO_MENU_TIP"), + QIcon(":pictures/undo.png"), QKeySequence::Undo); - aCommand = createMenuCommand(aPageId, aGroupId, REDO_CMD, tr("REDO_MENU"), tr("REDO_MENU_TIP"), + aCommand = aGroup->addFeature("REDO_CMD", tr("REDO_MENU"), tr("REDO_MENU_TIP"), QIcon(":pictures/redo.png"), QKeySequence::Redo); - //aCommand = createMenuCommand(aPageId, aGroupId, CUT_CMD, tr("CUT_MENU"), tr("CUT_MENU_TIP"), - // QIcon(":pictures/cut.png"), QKeySequence::Cut); + aCommand = aGroup->addFeature("REBUILD_CMD", tr("REBUILD_MENU"), tr("REBUILD_MENU_TIP"), + QIcon(":pictures/rebuild.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, COPY_CMD, tr("COPY_MENU"), tr("COPY_MENU_TIP"), - // QIcon(":pictures/copy.png"), QKeySequence::Copy); - - //aCommand = createMenuCommand(aPageId, aGroupId, PASTE_CMD, tr("PASTE_MENU"), tr("PASTE_MENU_TIP"), - // QIcon(":pictures/paste.png"), QKeySequence::Paste); - - aCommand = createMenuCommand(aPageId, aGroupId, EXIT_CMD, tr("EXIT_MENU"), tr("EXIT_MENU_TIP"), - QIcon(":pictures/close.png"), QKeySequence::Close); - connect(aCommand, SIGNAL(triggered()), this, SLOT(onExit())); - - // Tests - //aPageId = addWorkbench("Primitives"); - //aGroupId = addGroup(aPageId); - // - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Box", "Create Box", QIcon(":pictures/box.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Cylinder", "Create Cylinder", QIcon(":pictures/cylinder.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Disk", "Create Disk", QIcon(":pictures/disk.png")); - //aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Torus", "Create Torus", QIcon(":pictures/torus.png")); - - //aPageId = addWorkbench("Operations"); + aCommand = aGroup->addFeature("EXIT_CMD", tr("EXIT_MENU"), tr("EXIT_MENU_TIP"), + QIcon(":pictures/close.png"), QKeySequence::Close); + aCommand->connectTo(this, SLOT(onExit())); } //****************************************************** -XGUI_Command* XGUI_Workshop::createMenuCommand(int thePageId, int theGroupId, XCommandId theCmdId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, const QKeySequence& theKeys) -{ - XGUI_Command* aCommand = new XGUI_Command(theIcon, theTitle, this); - aCommand->setToolTip(theTip); - if (!theKeys.isEmpty()) - aCommand->setShortcut(theKeys); - addCommand(theCmdId, thePageId, theGroupId, aCommand); - return aCommand; -} - -//****************************************************** -int XGUI_Workshop::addWorkbench(const QString& theName) +IWorkbench* XGUI_Workshop::addWorkbench(const QString& theName) { XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); return aMenuBar->addWorkbench(theName); } -//****************************************************** -int XGUI_Workshop::addGroup(int thePageId) -{ - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - return aMenuBar->addGroup(thePageId); -} - -//****************************************************** -void XGUI_Workshop::addCommand(XCommandId theCommandId, int thePageId, int theGroupId, XGUI_Command* theCommand) -{ - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - aMenuBar->addCommand(thePageId, theGroupId, theCommand); - myCommands[theCommandId] = theCommand; -} - -//****************************************************** -XGUI_Command* XGUI_Workshop::command(XCommandId theId) const -{ - if (myCommands.contains(theId)) - return myCommands[theId]; - return 0; -} - //****************************************************** void XGUI_Workshop::onExit() { @@ -242,11 +189,3 @@ bool XGUI_Workshop::activateModule() return true; } -//****************************************************** -int XGUI_Workshop::addFeature(int thePageId, int theGroupId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, - const QKeySequence& theKeys) -{ - return (int) createMenuCommand(thePageId, theGroupId, LAST_CMD, theTitle, theTip, theIcon, theKeys); -} diff --git a/src/XGUI/XGUI_Workshop.h b/src/XGUI/XGUI_Workshop.h index cfeb70092..c941f42d0 100644 --- a/src/XGUI/XGUI_Workshop.h +++ b/src/XGUI/XGUI_Workshop.h @@ -13,40 +13,19 @@ class XGUI_MainWindow; class XGUI_Command; class XGUI_Module; -class XGUI_Workshop: public QObject, IWorkshop +class XGUI_Workshop: public QObject, public IWorkshop { Q_OBJECT public: - enum XCommandId { - NEW_CMD, - OPEN_CMD, - SAVE_CMD, - SAVEAS_CMD, - EXIT_CMD, - UNDO_CMD, - REDO_CMD, - COPY_CMD, - CUT_CMD, - PASTE_CMD, - LAST_CMD - }; XGUI_Workshop(); virtual ~XGUI_Workshop(); void startApplication(); - XGUI_Command* command(XCommandId theId) const; - XGUI_MainWindow* mainWindow() const { return myMainWindow; } - virtual int addWorkbench(const QString& theName); - virtual int addGroup(int thePageId); - virtual int addFeature(int thePageId, int theGroupId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon, - const QKeySequence& theKeys = QKeySequence()); - + virtual IWorkbench* addWorkbench(const QString& theName); public slots: void onNew(); @@ -61,13 +40,6 @@ private: IModule* loadModule(const QString& theModule); bool activateModule(); - void addCommand(XCommandId theCommandId, int thePageId, int theGroupId, XGUI_Command* theCommand); - XGUI_Command* createMenuCommand(int thePageId, int theGroupId, XCommandId theCmdId, - const QString& theTitle, const QString& theTip, - const QIcon& theIcon = QIcon(), const QKeySequence& theKeys = QKeySequence()); - - QMap myCommands; - XGUI_MainWindow* myMainWindow; }; diff --git a/src/XGUI/XGUI_msg_en.ts b/src/XGUI/XGUI_msg_en.ts index 94a8cc9a9..4f72790d6 100644 --- a/src/XGUI/XGUI_msg_en.ts +++ b/src/XGUI/XGUI_msg_en.ts @@ -90,6 +90,14 @@ PASTE_MENU_TIP Paste copied object + + REBUILD_MENU + Rebuild + + + REBUILD_MENU_TIP + Rebuild data objects + XGUI_MainWindow diff --git a/src/XGUI/XGUI_pictures.qrc b/src/XGUI/XGUI_pictures.qrc index ee262ff3f..ddcb76b47 100644 --- a/src/XGUI/XGUI_pictures.qrc +++ b/src/XGUI/XGUI_pictures.qrc @@ -4,11 +4,9 @@ pictures/open.png pictures/save.png pictures/close.png - pictures/copy.png - pictures/cut.png - pictures/paste.png pictures/redo.png pictures/undo.png + pictures/rebuild.png pictures/ViewPort.png diff --git a/src/XGUI/pictures/copy.png b/src/XGUI/pictures/copy.png deleted file mode 100644 index 0c90599dac440f5c46eed8618346d3677b837ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmV-p1DyPcP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00Of~L_t(IPkqwsOH*+e2XNBdt)!ky|4=z1YQ0BgXl#?P+}C}-Ij@( z7t*tg!dtFpX{O;)=Qf>}U2tB`w8a#aHJxXZj-m@}LkFXw7?`R1_B$tIn$-gz&Vlnh z-*e87CybOxEEdaSV`B&Y&=DDVNJ5_P<(mFiQBtXNA{YdI`?0=>rR8rMvga>mA|fIZ zNzeXYt$(km!Xj#N%rOhKewe4x4MNeVL`hlsMs)PiPvPO=Riy785l0;1hPIcu;336) z@vUHL&W|a#A59t~RBA2e=GR#|p>$@bCiJtz`Yk{K>Uz)zDB=N3?m&g{UG zYCTVqSAlL54Ug9c_h%1p-s{KrwRH?ytbvm;F>i%J;c+r6Kp;572S~Chrp4sIqbfa$U+R&bTLG<}hJ*EC zWYU9C!Z8zo+2%p}0E-dlB9hWF=gBc#;{(#NC}zO9g3e(-@9C>9s5@!Ms#}mx$&fGI zN!e~jswCS>W|R1UUN?>-AGL515){bgba#l z?A;mA&_+XLa^g+v$Sww}8+X#S1>DV{80+*3j5a^7w6+WN8X6_?7UUGlcBxaDaXTdx zaDbqQ9>Pit5iaVPVpVPN;a#r>3Zh{f-Dm*uNudC484eSd3GPr*2zhCZ+FwiFR92(q zm2X`+Dw7?zQbPgUO70`LkYfb5VR08OT^Wi`&hcDN$Xejs*uvf4OwL+3aq9Fq=}RE^ t;zGDD*|UZFt&2n%ss002ovPDHLkV1hUEdmjJ* diff --git a/src/XGUI/pictures/cut.png b/src/XGUI/pictures/cut.png deleted file mode 100644 index 5f022d0962334b7f11e25317dc33a1a23f506e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 927 zcmV;Q17Q4#P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00QqxL_t(IPh-FUTs)i%QgU((5;8IjtZZCRQ4)Zj9m=YZq+~$ zVTc5=z}$H?LuTE3hS1c7oNkZ2rGlno+D81OSW`5$KuOS{g<&9jOvzvTmiqQ+dH zxFirWgH;d!T5NFzccsfaKT3NB-BYga`NkkAw*n}x55(*s1-!g`%=S($Vp#HwR)40YO3G#I*E~ISUppU$b-9BmbDV zC171h0OU+%CTWERj@-tVh8s`)*9eKd02B+;GqVWonlN$h@zZCY?mK<GT)$!C|AmVe|6jId?eFN^{QHcoY?Fa%3V}EVh^;{yV1S2# zjYF5g)+>uEB4f2*b<4Bq^A`NAZD{004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00P!YL_t(IPkobJNRwd{$HlvXg6g#>ze}CE&Fw|kbZl;OZ1Zc=a4Kbrmd=m- zn4y(fXhNi^D>NFB3L1uPtqb#OWy?%A%`^%#8G2Dc*^O69DB{0&la``&;0Mon9?p+* z4m>XZ2!g?27@15ae0_XpsoZ<>dY7oYUP%;}6szME@#-jPl$yiks6`^tqrTogOixWi zcV7pRBu4^+0v+!{u~6;l>8YklgB*gJw{94lo2zl@ayp7jQxL`p!{ERmOamsUR4VB8 zdeq;p2N_BtBQq9-#Ysp=Jc(oO`$nj8ZEiCLHhu5tx~^!8~knGB^JnE5BA@Fd7gT6aZIOSMd%( zZVn5|ct6nTK1fbIjf|{(w01l}{|gJorslD-2K-!FhVEe-m?5l+9Re=b3!!2K(kk1L zU1x$M?J8t33Ak3>fWeVZc+fox-Qy9M$LGM~i+Y`cJT)6)i9hJk1&|iDfR|bcX-NlS zsx63AY0%dB48w01U>JOluD*Aeoc#fTP%`8cWM(kn;ZFl2LI9F|6vzEM;6~#^P(Fmf z*fP*qd}yxJqVc}o!RyHdM2e+<1^Kyb$mD)VI}_~aMkpq6*q;mX>^+>26u>WJyWr)- z0{EgW0{i?0d7FE%qe_+_IX#!^LI^rP2{lbmp*Mep;ng<>W1pA76HDzWg9)#MQ{a_z|h@k{}{V*r{8K@YB5^yht@4;^M}RF5&jd>un4}9!

2Mg&!S c;1E&s8)|&@x&ZE>2LJ#707*qoM6N<$f-4w-O8@`> diff --git a/src/XGUI/pictures/rebuild.png b/src/XGUI/pictures/rebuild.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4bb27ee7c75a45ca56b6c7013516ebeeb98094 GIT binary patch literal 896 zcmV-`1AqL9P)Ci!4TiXx4oDU6ClP! z875x12$6t^5EC<)iwVP$n2f}^WTKF6?^_=s2I!8z;S*a>l zPwU#2>h_x2U<(2g3#s_@tvj(~;p`tPv*P~%uin+%@$!ZbJ70~yRv)SNxC{e?pj0X{ zH$9gh`eEeK@TK4SGxoQW4*^2Hp0>RQI?r!u-@K+=s$knTj#B|ZRaJCDM>iBkuaC~3 z`t)+w-SnBO4*-_d)wt`Ot+9=pH`ZnDWpOGMq=W;#+Ytf=PF@8eQ4|G#z{~G9#%_Q2 zMXWt*pSz_2v^*I)6kHvwyE*YE@Ah@FD(K_q*iC9{d}*R+c5+ge#lWjTIwh^p$U z)sJoneFW^$ylPj=(>vDe`X@d`zF^~aX+-M7^zI2WJ(mC}d3$#o0EJ?KnVA_(mqDP; z-04-j)@!P}^6b4#(#+>Flx&Beu1)Y*YXhgxUE$36VF0>c@1XC^9So05u&}UzuBnvl zqM>@q&uL}Njw~)N;xl#s0TCh;CiS?tT4~ z9UEM-Nppn4;$i}qrr|gaj#EKONwHWYUnn4iKoJrtC3e}NSS*oDrpOm_*p(`&sD?G= z@mRP`7msi0=CiK`X>6#ax93H4RiG-cue+1x#zz=9afKINc@M`ag9M?wx(SJ-DN+Z@f8HmSg`!A=Y7}khA5n6%1M!ODzu+=0EX&QE zM2fNTI7g2S5)KEb2?sfP>@s8Hac(D)csy=Q)1;zSeV>~>{+EzaVm@)Oq0UOhf+qD6 z@Oph%mY0tY?MDc~`~6?Cyu3^{n?_a~QaNXSE+1|yj31eLFlEoC51xtm3Kt^PzO|uH zkU$`SZnzKvoN}3TI!$tEiTJ|Z*{O{6#`5Ul7=UvB6uBFRe~mlAXuP1Fa&$8j2m}ZP z`~-b|{60U9W@IOG;`F2wj@~an^v3%#cOGf3_UYUF9=!z+>AW3JWbEsOiw7rHX8#4i Wa${nGd(##G0000