From 4bbdd85ae1b64e642371b37c6a12829ec957d79d Mon Sep 17 00:00:00 2001 From: PANDA Project Date: Fri, 7 Aug 2026 15:07:52 +0200 Subject: [PATCH] Add configurable default shift and confirmation dialog --- .gitignore | 1 + Installer.cs | 8 +- PANDA-Portable.exe | Bin 105984 -> 112128 bytes PANDA-Setup.exe | Bin 266240 -> 272384 bytes Program.cs | 300 ++++++++++++++++++++++++++++++++++++++++++++- README.md | 6 + Tests.cs | 12 ++ Uninstaller.cs | 4 +- 8 files changed, 320 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index db6674d..b125627 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ PANDA-Uninstall.Payload.exe panda-preview.png panda-import-assistent.png panda-setup.png +panda-settings.png # Lokale Exporte und temporäre Tests export.csv diff --git a/Installer.cs b/Installer.cs index 1aa050d..1d6b96a 100644 --- a/Installer.cs +++ b/Installer.cs @@ -11,8 +11,8 @@ using Microsoft.Win32; [assembly: AssemblyDescription("Installer für PANDA")] [assembly: AssemblyProduct("PANDA")] [assembly: AssemblyCompany("PANDA")] -[assembly: AssemblyVersion("1.3.0.0")] -[assembly: AssemblyFileVersion("1.3.0.0")] +[assembly: AssemblyVersion("1.4.0.0")] +[assembly: AssemblyFileVersion("1.4.0.0")] namespace PandaSetup { @@ -143,7 +143,7 @@ namespace PandaSetup }); heading.Controls.Add(new Label { - Text = "Version 1.3.0 • Installation für den aktuellen Windows-Benutzer", + Text = "Version 1.4.0 • Installation für den aktuellen Windows-Benutzer", ForeColor = Blue, AutoSize = true, Location = new Point(2, 73) @@ -329,7 +329,7 @@ namespace PandaSetup using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall\PANDA")) { key.SetValue("DisplayName", "PANDA"); - key.SetValue("DisplayVersion", "1.3.0"); + key.SetValue("DisplayVersion", "1.4.0"); key.SetValue("DisplayIcon", applicationPath); key.SetValue("Publisher", "PANDA"); key.SetValue("InstallLocation", target); diff --git a/PANDA-Portable.exe b/PANDA-Portable.exe index d4bc2fd60ccda61178078031b8ff14c68cf08cd6..ac4e5d577e27e82f3635e9f241e23e4ce6dc523e 100644 GIT binary patch delta 25243 zcmcJ237izg^?&s--96`S&+N|Z$qaY12e2F>2*`4%poq%tJ-`C1%Qo~ZQCzWi!3%>C z(oykBltiPs)U1gy(L@qWg60=v)TlA?6Jw0zP;(mdi}?S(s-Br%4uAj8|MU5;nb%dX zUcGwt>Q&XNSKXxVajox9+OF$|?S5tRCCvYOgUM1# zypYrzQ9loK4!^s-8>D7wulH?fwDgE~KpK{N14Q(98h$bhu}9W1_OGRk5hMIGPuelw zJ4;rj_r0a^IH|?EMjk57^1dwhrs`1~Gwce+B331UVUO}AD;K)*XF6+U-Anw^w>xtf z+gNYKP(1asKozP`DW#iw!&Z$k)zmXvb^c7Lrdr5QVaN=Xc_MA1E*?od3Mqh;W`<1d zDlj5+HKEf0HY!I`8skP{)X4fI}8<0b0LWY1031m~D1+7{QC}@(- z@b)Sbs${lDYW|S~p-Cr~N%>c#nD-0iW6Ab@p`Iw&1L4q>lH?9tt0~gtR)}w*4_XsT zjSsOCP$$HgSy%v6L{qm?xvX8u$xcEeigs8#-TS`Y;QdO^jvq_4X8|42(#l<$-Hv2> zoGdpvUx4Cd4xKL|Y0pN9^966DF;*JqEitZ@zBurj@mbluFxz0ANo5a!%J~+6wFucJ z$WcFDV$FEQA&-S&(yX&k(vlSEvyrx-RV{KLdO#Uy!_6i`J=cxZHk!rnC&(5&VMJi^b+iX2;*zS4A+2;eq zbtALFzMz;*sbS{@R20V7GR#zyA?revww$PCvbAQ&x(FHTVgPQ6%|pY^pUdMfPeLXB@}VWY`HKDB_!z$r&yl9#keT(V=b8*?9{P~gIZ%l#es+y?~yr&JQ* z)E8#Ea(yKn)*4kVtR-eKw2$;UN>l5ywH`^?S&q)wos_JzE}=)Qbtyg4R+o5ephs@J zjK&tg#0sb!vAPK<_fng-O=)L4_zZ&v+Y1|!w>J^easaIYz{pl@lxy`+b~BYIH1TO9 z_)OeM(~u1AQz)Y)r{2B{DJ(hm<@{M|Z{bg9rwYGh;Ri^KRpsJ$kzwavgM+dWV?GHjOI0!M><)a`p81pq4tFu2tor=W`uC}nRHX~eP--H5z6|Kb0xN~W# zm3VMK;y$~$&n}+MaP5n^pDFAjCAqr+1twc7P@gSfu+AxbsVT2@mPfU)#QK$L?3+tz zVT*#6rCXtiRE1gL+*(wWSy5x}0oJVWCx1oSzK!Ptv!)`TE3+b9 zxE%yGpDGpHL%IX`+|RN9vfL|J@N#b#muLG$)l#dK8PRH`-)g1bYNgyu z>%W++l|lr*rc?%7t%Td9+0<&~GJ`c3^+pA>5aMv+o5MHzI%$B=&u@ovHShQJgs}+4tiqTMq!Xq-6Q9HXO|rzJjdv zRe(_#LTdy`fX2x6y%+lt^zLuC*lB!2!^Xll+=#z9M6zjY2lxf1C{`n`AD3?#@GVQT zX;*MIeIok*eIMpK*=6XH=|%@_#Iy(exj5+MJz&sA9Fu#=UXR!U2JOQ!zJ~_)VOsX< z)#B!YWuFWdETDh0wC>krM+Y|I_;EMl;#!EMu-0D+Yy71!u%aZgi6Qu3KV{n-)Q%@R9U0e&FJoa`w2rV{3S|Y!qx#6!+Vp?`L9Fq;){( zy29TdEByVj;;8Mm_NeU^OQPIMliB(j`eS#}m;+N9K-a`F`E`yhE|b|x`x_il+J0$8 zab7Hr9!|o@XZ$Tsq{$Z(_yBK#5W@O}hqci(ryc~k{SbiR@>SJmS=?y(vQ@MYVoV4j zrbr7>MLIi+i(A~WiL^#AI@UI7nx@}Rle=(hA|?{tFE#^9mT3m}0<*NAl0obY8ic<; z9_7XbwnuBWH^Us|((WNUH6gY!ZQ*RB`96}rjmXYilw^2`zrh@_p$Io1X(oO7lfDa@ z^xgVo!1R;ZST=&6?{Sig@0!VUy3zL%_`aIt`zo0^Nq<_Sk?*|PX^n^cZ zLGtmWHTM_63bJzvx@!%A9%!G%T5FZ;;$g0+>r3T0$)J49pmH$gyKza2eqQ%=C->4O zS2Pn!yJ`EI#F!Uk?155xkiimVS&v2HN6N&9Y4z6%-vY+|Hh>utM8cQz#S*B}^x<2t z8?^3BCf`Cenn_Zm|; zkPPw~Q*=BljXMr_0WYw8Dv1rU{xW{B*I33E>0N%hK?6kt8ss&~z2tp3U%{aBHA>`* zDx$K$d=!Pkn-l4PpC%CgvPqk(Kv?b$8Zz?pe8i)a|4u0n6Kfu1V#1}YGOGfPY?bfG zR{2V;@?FZRvdx%P0fREDN@CMSS49V1E-QJm$8=<&Aa2;+%n*B-!56900p76tz_sLHoezny zo|}9qqPl3N*ax9{(GMYUfW2;&h8Jh}y1K#@BrZQsknCl*UTad|$=!;O4E+fYv1oSW zKMwAMkM7#NCt+Wu}SJ;eTADV=)@EOUP#@K-oGzH%Qgm8b0|O6lwf`}?Jg{R1R( z|DuZjCh!q}7?~#r)A**gZ!q@Aarhw>yL@p-+dnGPK82*{OMopQk7ipYeR^`#!)HrPKcVbb<~q}`&fo(U8@TS{l_pOw;S`@c$Qtc;i{2=LWom`=hlVKFpe@#NA7 zuYm^uEd_ITYb{3->;! zy@(WwXyf6uTE>0}s8J~T6`rlXIgm&yhtn}cw?*Vtw$Lq2wuS>9Xp1VXS=m_uadi7- z&|9wnINwJ;ovpN9B~D^_P}26Vy-?j0*Fo3o5iI=xMuk@4^^l$0uYuH0ehEqYH|6~6 zls^EFjx;X}&^T|P8Lb@E4Rlbmu}wzo{{}$&yaD2>+4s>rOxtfzCbJ@fC1LPzO}N{~ z(3oT=(6~0+Z-P43JlwE_aHFg|F1x=VVq-u?{rCEqTxOB#T4;5sqo?5t1&Ym<;bH0RH zO>(vc$?u3{7|Ew7S;4H6i1L|WH>ekxHbgh5XGayROmqEWl~tLGc|?DHc-|GUc(i>~ z?4yBj$J&~pk08?~>I2 zYmlUX`V{*Q#zYC(!dkkW&9}fr2$+HG!#wcUK)% z&>>1tbGpxAhW~7%Ct0CnFa}%l10UsJLevj@l%nFeXGr2#890Mu`j+}^MqSwKm5_!` z2-hDw@bR6a(MO##%1m-W>Z30p5Z~}!H$*WYhwFy{W6^SS`T@Fq>x57y!W3kk;`ALa zZmWBO0r67oVo>}e9uw>ksBmT*MRp0fmkd&{L-6)$+7-;i;HXC;F2W|l6%y&NaErKS zIQU8eK?J`)71^)|g&^3vg@msVXTV_mqeATV$ex#7!nctC3lT4vb4(U`U2#xo1$QoW!N{h$j%AQA)_7DCNet}V zWAPBB^+i6kDLB^z*bu^J!#9k>+Pq`4p;EV@$cMI(@*OC|A%xF|Z!w3pQ;yAtN*jx8 zXuERmEs4|1x3BWDBXdMClr|EllG0cbWibwceVnp&Je*jHE)c4CC$$YaOVNGH3&pl5 ztXN*&j*cpdFr8V6D1%DZz&C+|iS_q7dKz`XsKt>%xIMw1^xX%{o5b zEp9$ma8&>!!XIOs;lhTC!I&@?UUt?;;B8$2khaERjEa%HV)1=c{2hP{FD}hW?A@+f zI%D(0soYC@_~1h)q@iZTUhnI_gd_4|#HSxrsX%}*xYH(6U_fq-^J@qqOdff9o1r{v zf}(hVNz^q6AzlNv;(8souUrr+32aGb#E(S4N#$PZ*YJdciKqj}WB!%D5h?~9Fu}-; zBe%zm0Db&8gCQae@v!2IkFt%bg;_05SEY9Z5O>;0$V~v@5Ct1(%cfWZt<`+5_1_f; zV?&IVdlQZ#hC%(&MOV0IL;m&u7I6?RgC63%gMo&+n!1|uN_=FT0e4j)b`ki~pCVRJ z1yRY{AcDe|FYX5_0iQ!DM=_Ma%#}}$B8lVj%V-G7z+r)wbpEm#4qWy>&|qe4==JZR z7^iY7)9AG_O}uyGBjC-8mw*HXy_E)?(n=oOAw2N%FW0$oorqBil=IV#a|@8xKZ%mB zwA>7_16)n*XIF^8#R7#5YC+d&*W%0^;=qwE28AfmNs{_AacaSLP2*bH{*{cISW zYh}EM^yJT2gs^a6u^dJ4e%F~;O>_*3lgd5h>QIZ0ctE*;V|+U`{N_9OyVbOY7!gPB6KZyVM#rwK8yZ~o{K4Zv%(mZ=bBZK zs%TZLDqc7Pb;$!%wvrM|Ro+TWO_l4!cQQpr80%w@#4i;AFh3(AV18y$2&@>ydc0iI z&F~nQPp!7%$loky7uXWIEi~&f<*pGwy(^d*Ujc^ywz7^=Lg#SdT3uQmwj^F zt=QBL_z=)4V+Wfebn%E#yu_z9@8LwFp|mq!HhN||TMY|{3#!HgzRv|AWU zh6nRXmGp88BIM_n_;EfzS7RGxx~p2C>Q=Mruy!h$cNisogyMKRf~?wdre6_rU?LH@ zQK0QunF$IeQ9+#Wi85Ymjicx^Dyje$$I(hWno9CgB(jt-%k}iugsC3Z7E;9rL4#ZL zWVzIEMe&)%Ch@ix-h(W13iC$i7aNU-MWa|x>c{JhVwcz-O{FJ>B`uPa(yER3obmQt z(y*$L(Cjpzj|?ZnRt8zC2B2hL^?{&qp%x`E)vm+C(CvEf*_JG~k3s`5aZwOXN>(GX zcnrZKvl5AHFmLCOI}i!CXkq^iP=5&<3cOgsh9R}N9Wu8xYR4?RmkOJubV_xziBu@5 z4M8i^BRr@NW@u&2c`Gb(ID}LtuC`j0OtVyP4JR@^+gPqK0+?)$1TFPn)I#7FMVS?; zNHSuLL{hUy0pc2wyE-`)`){Q++WTYc7>d8ZzZHvkjYx>al6SziP;UaQ={cJ2V$Cis z+2C95a$IDJT}1HjuoTk_{%)&1h6_O}yxoLkN^Pz}tIZONMta~$OYyK_f9!pJ>`0f| z5n|XapriogWU`a5pssieML20j>kwx;wnjmlSs`}X1;Fr~wz=ULrFRxf1N(5m`=j@u zz1ic^tFqi@DD~KGg&^_f?l1`)>DfR=`H4MmnWORD?1;XKuEuclLtP#2y*@6d@kYja z%J?zVbF+Y#f-wi3pF>g`FLNXLZ%VdNGGkAmN7|l9580lC2l+8)VZLbgWaJ81l(nc{ zc5#4YvQBTtYg@-avj-x2i>CWwVNqu*oK^(wPIN&dPCbqMWF8Nv1p$9?VsAL(?2h9| z9!3b4IQ7Z^fjfh6t++D?<4%B=qh)acAtJotdgm@)zX4k^C%^`*T8LI_d&3m0J3&K^gU&lxkuNzL>0V$m!6@#uB;HH%rV@j8_J^0Rni$QH2pQOYE*AgHU zw-R#igi_TY-oGIzwZ<=(PR`@ac!=PgJh6U4sW--vw-Uvkp^-sl-p+}``Hbf)OIWO; zC%}-ySiC}beV-ODdkR2c0TN{C^1>3}egq2*Z}gW~fM*=EcE7~fFm4vqSgX_|lhNSg5c@=Qg{~)B zFrv=i0Mc2vbU(ol9{g?EmSu{d_2XqzQLW~%WK9E?sH{5`m26{OHkX6*%dBZAj2R7M zhxt?IBoqb=J-EQ7u}I?%5j$z~2JEHNDe1yF<^xW4h(&n@kY$G)h?#`=2!;H0nUj&T zW&uz<{wnm3KF`qQDITr01KoN9Zu5-8X&k1Cw|Oo< z4v95~UJpoz#e#u1+{LAl8Lkn^DB^3KOVP!>X1GpCkJq^j%^}AVxO$~X*5KSKP{BJT zS_%d)CgOeiCNYk;vn#5^IMOFD*J3T6q=^eAO^scMb}~M|ecD5x!*N zLKQcl8K>HWc(^>ZW~0kO9HZ80<=8rXuTk%`@pJ=Gz*F=|8l4V~9^!Yw$cCNW9K(A6 zW2=WypTU@;7iM7&n8RFQXsXQ(Wa7MZw7Df6Yc@6Aunf8roCg|wBojkafR8a>d+4w? z;Wv6_1$K(wp;&Fi#xC~yeOgn1XJ(@1TmE5GiicY=@P1AK)3ALiV7U>h#pe(|PVzn8 zXdaE1Irx^j4f7U0*mHwAZF0&1=j^dAH?;SN1d#c*}@#MOT9i zuw`O8r8n2%OELR2YC;)$^E{8U!2j+%W zo)tQu4}rBrvn?>v#icLVzpvfFtL21;gNtZs4VrKZ&0IvHoI@Dx<4j$?w1n7O82wQ} zK@0erhCGI@B&rIJVJ{`Q$Ka?bBu@tgoQE^;kb7yjw{X;rv}XLwLg1ZP3NK>vyK@-% z2-J#dx^n`a9A}?NEP|DBGsHQa15V94Zrb7LN9;wMtmK$rsbK|pClTB=ar5I_9Uo!6 zc{5gul0OwMG`4~PKH&;DPDXRnAOi{^ZW^-10_4q}I$1i~yL{?MmmD846nt-im^8_q zSrFcLU|u2FIsrt{;Q7y^Sa=-|^`4>=l5B_D;7OxguSQYRs5RdU1 zrY(WruxZ+uvAlcaF}L7QQOaQbR~7plpzXx~NH3xEQtzkJnp~Q_3cui1T3Q1WFFh{n z=jg7)UWOX!HmH&4ix(kSn*6$QFKnWe9vw&%y}cZ@5#3YS>99GJnsNaNIEq>Kq^;zJ z;iF8I9^6Ot%^G8ed;CV4xtL#R=LYn9uZi#0z9bSg&LbjG>-<=kGyFewVCjGf8( zIf`u>Uc-5%oP3j#u0X$ALfeSF9K|CZcK%bO2s>J}&o1mF%gJG-qs{I z)TQ(1qU>(uS46z@%u#K3APXmge|L&79y<>|7!=Fmi3iy&gRL?cDt&LuQr?D{!|^fH z4TyGro$X;7`z3o6FeVXf!}rb_n~rn>{r*6Tu+j1!P|oM@n;gEt;h#Cw6e?ZJ;l(PY z+d>380X6p5&<%jy`uV!XuHkSmhu?Gg<3$et%wdxeF*LS-!^;d3?goQcJc~3$1Wd3$ z7$nfYfKRaD;Sb<&G;w$`ha1An!U@)ow8pLrQ>{lhd^1d(QxU|~*~kcWZ$iW!EhX7S zk;OpW5V--L+kPp6ab~~dME}i+{uCj7#H0TPO>LCeoy+0NQDXNtPydO-VKFK_KSmAQ zj`SbdeF(s4?1wRG>^TlUFmce!$_>I>Or= zJ^+|tBkF0G#&I~0!UJ43HCn6f6Vby8>sZOQT(x!!}~Zq2ncg) zB$d_zM%cK)L^adwZ%-vTr_OmjGt!^!evz@H;O0eFY}@+VM!k<)xf{xxWx;_yxR0Mh@K z-vo>+Z)5eUQ~p3Nf5p^49Kq;hm6{JWe40wtmU7ss)=5LzWh#lXU8M$Y;_x>0ZKUtx z@SA`V+Xv1Pdq#a3@MU#~WU_ZN9ayaH(1t-*KZ-6;Qm%Ab%vLnED6isV zv_X)P?_4L`SCx)kGe8XRaMy+zuDZ_2*S zo8Qgu4ZkZ@v7KdfYPa}6)iE=-3bK$@+ z*3WK|_akQgn+cqYF-Ccp4PkHbT)#0>`5SWX`=SsE{t%nmcMy#i6)l!yT{A>(rE(ZK zx~HPD4N6EF#&-F+s}u{T(MhvJnWsdh;q0Myk-Gfz74eA7xT#l5_%l z$j_zG_!RcjvqjnP&@^cZ>sl&ui$m?wR93lMdLl;Z4*{-~x z4CC9K+3dtsBA4d5oohrcr)>b`TgajPe%7o-rMc|<4l3NvP66pW_Ut@CI*?u&n#W%7 zb5A38D*L0Kdl|X;Og%+V(!iX~Vt$SWW+AKcb2KoE*muq%%H8bI%mw<{?7Nh6(fp{I zOZ3I;o4yiHLT)KLkH6+n%x5`DjgI%QS-L0m|%RK&*cvvri>QZWAy56fdTGcZuD|)1L!Wux=6NUXBsz zuX0Qo%03NYis^^K;`V76OTm z5tP|f&?{^XuO)Q6(B+vW90o=C|D6_kU2MYsi|Q)MejB5;@E#5y;P7D%ALDQzhx-AS zNY4XW*w+ajWVaYsNC(*i##PcG_FH2+cu3NxvFE*K?3N^ng^4B3epq8cS^Ou+=Jiz@K>av(w6We(io{q`mWR_d0=6(J2<0z!au}63`7lAaTw;X z9rY~ia36v7e5oO#%4Y);kylDHA}P6w;~PLZT+U0EM8*K)c1PyQhuHY=%cv&Omqiu; zvn#Sljjld9o1lu2Znr%S?QK=vBF1ZCX56P1_&2EWG zr*q6)j=2pq(5rM&G$o(m3$fmfHY$gh9X&}I!+N40vInG(qYHtlh%E=Ki(LS?E3#VI zkIEK1#4d^T0n-!P$M#EZ>>A+R*iI$Pi0OVw;IEDC19IO;Ew89#vHq4D1-OSshMbEyxpadD;|VpHQ9;M{l=@QipR z;IeoMdO9PXRy(Eh;`OQ|cgBYSUJ@CmhUN3(mfFs?#^bw2arPvhU=`9l00 z;Hfk736lRu8A-Z7{vpyoil3{R?04}z;D_-jY$BW>SeqatvJ&gnF|s6etCDn5qDMW* z<|cNrHu?NSuR2w}DzOc0EvWlO;`6{qD(+R? zJWyX%SIW0W22e1);=Af5q@Pqbak0+!g_~co9;M4GAPU6zG=6I;egYQLD}JtS0sV{W zRQ8#Q*Fm$Vf>=LQ@us?ibM8m!JHWqN@gDFWR{RtCph0P8dgWoY-DN2}OgUQ_3bnIl zq;Hd#RK~Eatg4JkoxJ%@)?1khJuKf-Sr?)nERi0TpQ;=h+9$tUxnA8T|GshwG!!yN zhfJ0RT*+(YebGmoyQNp<$IX2#&wgumh7QRzI}Xa-5j*s%>^3An6_S)`$te1CO7dwI zR%m)i(q+jjLkFep$+hfkb`wg^W=krs360^U^V#>4J42H6JYbvhUeZI8AA_b%sZ2$s zc22XB%}m`Mny;Lfx(AeNQeO_`nVnj%<{8oF*%wm(032{RY9FfQ*~_UVfT61Ygz^fF zbY3B~=M@_1JR4m_H1l}rxmASUM3C*NlC@6d{wk_Fz-gZ0@GTBmHPwo9IHTIowm`TK zF^_gdDzufXx7w}Nb|}}zXwjhgy@uO-zjAA2n6`$`@7>Bx)nwtw?^)D zwLDv%CR<$#xRMpp--kdnLMz#A>8G^kc{(qBE&ZZ)C11ZxZVg-b=x$*jr2ndIK|em! z4l3cy$J!xfNQSIoe5PF|p%>_RR;Y0RZ>hOl-@)#y*~fOU0l>$U?ue_qoyvilYxP>S zJF*i*@6>p@ss5{m`WLEw8a<2Fl47&9G$`lQ-Ugc8wRh`zg{DxRJzPub{ax*sfv>Ln zhW;TR`#fu|`+}8e?z$i8XZz{L>z>giSNcgEv3Q|wC(Pj;6vL0J zdsDBKjC!)zO2AsaRnWe0i@Fk(*Q@>P#QJyiyn1^5yZR=Msg*9^lxsQMM0M5P`hS5N z^;lA_u2+mL>VMViMlIidI{7k;e?9Kk^;O0WwW6WUc#NxBQfe9&7>DEsBa5(aJrPli zJj*pKk@hQuk)*K=7P|*cTI>OJaRU}?^#TspH$7dYxlp8{GB%HZ7oMWf6&C*z$dY%oBWhb%m zk+Jxg_g6^QbIe3G9GE$5Dqs|tdk_iOEX|P!uI8|h!!HtarJO=CEJj4PJ}Gi#hD$@NN#DNR zxnKE#@>Ati6_2>0gW2v#$xYD@Ec+)V$ zr-Zx0z2OJL8vH^Xew4w(pns6=MYTMTErqc``_Yh{7No{6EIN#y*hfIhgR&$kDhP2!+6e3MEDn7!I>V47YLY z1m#E4bhsOz)1Jj|zw`_3HT-tSR@jqggkO_p;0(Z~FSOTe?&_Gy&T2n%ZhPxlw$qdM z?mA~`P5Z`;i#vLHcxbwqIK_5047_yCd}+?yj@YoFWorTzO0+A32^mG*qrqp zt1q36@0C`IR`NZac6SL$?F^EI5XX>b_U6v6HD~0v*qeLU>cXeENb5WD-l`>EAE;kC zLh=?aJIN>%CF@_-7|oaa@7=X*Qf$%2j_#7^zgYHY4QJ^$#f4hfQ7Gisb$HhI`L4|!g@Ny{I9najcFM#F6X#By+&X^lDRWvU z&6{^Z>(t37PHderX>R)|v&T=FJ7sR0H}Qg3y?q-jmrFj!-mnS{uv0p_I@r9+I}1Gp zc1}lrO?y|@8NA_BJ9_4JIvuNfY-h`v`3)Vclq;v^cdxbC9H%4S(@`#6?sWEal-MkB zIyWrt$vZua!@}~;i5SZH-D^57U$mAj-n^>7?=Be80c<%d?-V-NLK^Rdo!xA&P1N3a(fkb?yE<2Q_IPvFHF*!^>%2Et4e>fwEv=ekci9f- zM zFPjT%w%4)gGgn`9(cI3$#;*L9IbHcep>4I-w{D0xurA|mSU=Q@tWS7vt*epRypPt+ zH>R+~s~x+m%lq$jjo#4J_f35E z=AItAn~^T(_jGJ%E2SpT9Q;%V2C98k!E4`Odxtjc^=|B*UDe!*m~er0upa!^$xxXU zyqmgfyyv>7xzV#&J3Euj1!T2H5MfOta$J5X!%;dHEY@Nx+RVDZXfa!llC?;&k#m?0 zy0yqVYy+Y@L}w$7nO>%^w2uJvW9W2L|;#|Y(kD`v0$eDMUJ;L2|2CqXk)_^lT7lU^mWNQE&z{`MjczZc? z^FK)E*cE8^Qlv=bJ<(aTUV(msqf~w zTpAi6YHztOLk=XQ^fkb(0uZzo4nGuI;?-l&(`TALpW@q(jy z?7^G{DoKIzY%!*vWWzaF6-}*fs0H2ksUKT>X@JXER`2lPCGj23 z_KMPYN}2V31Jqm)Pi9T@WCzsBW^SNN$uTx@EZmz2i{nKwb}EX4=0Uc1q_NYf{gd~eL?_+ROxesKtqX0(Gjk$xctu(q)+0@< zPiE4<>sQ!n<;^oDWd9R?`^=lS_x$>Q^p~Ia&UbG*&rtBMN5jiY)*xP%tf@}oFr?;K zV?r@l!g%Q9i(K=i$TUSW8x<`%6u*&Bg@K}WV?9G z0}oUOBV33p3B!Pvf%_O+#}bt5?<*>_Dc zN1!Izz#rZ}`fl}h^}i@tUdJ{|8t;8(+e#O{d&2DdbBIZeiG-@7lfWeVK1zgfY)LdG zl706ox|9fUU1`$?NG2evEGH@r`1pq5XXHvqQP#^ksS5gQ_Q%D;B<+xnWGN9NRIU<`rD_>UvTh`j#*nzY=I?CGt0!+S)Bzxmo1y61jW0ybp-X11IR!g9Rwda7;l^OcaI=>%o6x zG+ic{MGIf&GCf?&AKwzV$1t3U#s-es=WV#UX6({r|MQ82+5eK+|7t>46UqMljSbai z-(xhI(9P>mGDb*LKj;lyJwf`N_x9D3r9)oBHI^&zf99lrp;2jU7_V0iQW`07vd|yb zEaWU|6T(kzY>4P82~R)h%{KCw@ClVZDcAyi42uU<~CD2s>Op_iMg$ja$w0H+lGqANbwj`sfUu=U<)@V zw~eI4B=9!-ZsaYrg>$E4dTyHxL?jnNYAOtsR)vNb=16i|o7uO++}2LS{nbgP0W}{A zhIVhn6yLV6L60Uub7OK_E9!c?uC1F^siSw_l4VGq?AxF0yRBN+2~o@w3jd2iW!uii zET+-o!d&3}{n}w2Dg5JdTz|zOHMixXd^E-4fO$%51eUfGtqX~UF?yuDbifRj8iE4t zB@%&(jSV2jEYy`m!drgbtT~Vm|ASuiBcZ)luq!f`@MtL z?UE*W&h=vxFFt|A%Kv-!3GW-%*J*q>d<&O6U5;yFX!w`Z~sRNJgd`^-k r4ea<#77y=%o2E#UwjaFd(StWhxmfriie=z$=A-7F(tFbG@%sM(r%hU_ delta 19339 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

-UG=K! z)vN3Ez{>q)E4P$wxUpg0)}`NJ{^t-=c!-A>`%Gah&INa2N@Xk!G_7`?^DOVCT%vV4 z&+^8SI0Q3DC9Sf#-qvVb8KZUn@>zaiXvrriPDMUbyxLez>D)4yf)SKn|FW8r5M@2P0tU6YmOQgt(D8*c1= z!lvJdGJezFyU!aHJuk53KE@_^o1*Q(53h$Xjqi9^GkXtR|Q^Nm1&vZHz5a1k7Fq)Ir%`w$1CP?9Y374^>{zui7=N z>Q=?=rnE<4rM|nOt`G=gDyr&DV}y@Vo2uUiw4O z>5mEgCoi#t_C>Yx(<}45Ao1GHA!7(fpi?Fj9u~MjOC+1P5rLjdC`JUzQwhbmXi8=p zP_!7{(3I>7>fm(ZRA$cen)}3E1aMGEmmwI__rs-auo}$3UQkimsa?)Y!m|&cV0XsK zn%i1HJKrW|1_2VxTmaCkQSY6(kf@7<0PfM1WF~QVUQQMcln6a}hEKxw#O>f_AXVnFq`cCY|qyXQgw6c-AIrqx5Z?57Jp6 zct!rP5mwGZaFg)ShOuo9X)OZi{f+EYchvvviPh&8vz5$Z7}K3BU>o8!7z^1UzpbH= z;gGbAf+7~S!`UZtgADv1a@;l)jhh`-+9^JrB`Dz9;iR(^h#gKO+O7oRU=n~5broAK zu}iY0+z%hSL}{l86*lY=-$Y5Owoj3b5@ADku7*J)k#LsbDLoyrBYx{AMk=JMBPr?X zNah-91Vx=4sf~2Q-y)|+5{X1@STfp$3KpT|K;TMt!C3F#-OJrY>A2L`(h^fR z!}6VBS{2Sp2qah5Qf8Ma?KD|49n=Y$tHj9!Lr&iXSHA?lH_7HsI-Sr zKKpF0t&&bU*Fh_X(~wKN$hKt2#`?lzdJWB?HBfi12arwmt%&+yMl4FXcyP%uab!Cs zF54>c+A*TNIZLFPl9ptsn6e*!sMxmcchpYFNWt?8w8XZHC!n2ZyMfx+&SE5rX|^Wf zf+pm;ao*y7z1`f1XNqSQ)QC^v(`6!pPhqQM!wOrJ$i(0Tf6(%h;gBSSBq?KCHs96~ zsiIJi+ELkl*N*xfh*roBM2kW_S{tqn;_Jt@SYe`xL`|Y7)}yh29mq%f8O8DZ4g6fU z-G3KHItrY)-;z&m+h44&WG_N@GjaGKrrSE!)^7Q@xKTK2d0uYV2IRF}_RA3vSFQf487~Oixoo)?uX$IyZxF2c%X? zOg;EPjI*f44?LwEdxBQ9z)41~Z6wUiIoKldOSXvR2Z0|gb|7({KU*^8XiqMP#15B~ z61g3%@|^NdJuHZA!S(HwEX;|AtUXCbBh=S!kzU%6V8S_LunVQB(3sN zTaF>^NItz0sB>$cMnKhd2`F*IiN)=B_UDS5Ta@D|$3qc2?z=E98)3%_A!5gi;>V5` zHQSEIEZY)IO}~H>Li$w#e*+NbH|I98ELSbt@}pML)BHwPbXf3SQ!i)4f02T zu&IhMGEcNYnOdVM``@7ZV?aJPBicjobK z&Zaz`ehW6!e<$z(fE?7j^5TSZcOI|p>3oj}SDrxc0iOPZ3Vuf5i+t(L`4SH4_>uMf zuG}w=!Wv(pN@B zTBZuMZ8I|uqKv;hVNPkzLqzWc@O4Ea9tK^~P!&}(yMRHISJjiw&%o*p(Ia>^zJ4$g zRgWctj8!?6V7#tml8g<}l?+`g4mO3<##$wN37TU#KZiWC8zB1(=tON<=1~y6b1UH< z&l)n!or7*x;l}te;s-s&`GrE-c?_CG7aQjn1^RKI&JzHMV8g^Bo$R})MPJtlgPDFp zJ?~}R!P*jZo&-SkqJm3+>&~Tg1Wh=i1E#c7H6rrr`V;@sukdF}0ZI<=Ei}R=8!tb zo+r(r|8_)ar{I(JBL00l(lrkeDUo>$vnZ!weQj<6*L=S_rQPHKywtyNmdZO?J|8gv z^_Lb7Ja*}qlM|&~uA%X9-olXyB`qHOPH(};q+&>(eDGI^$3OHI_3M+rt(wK&$F(6h zw1p5v?hDbL7NMCvK$&w2jWR4UZ`ZfD1#3$-o0Xm zJ8?3-QB0y3!Qm&eA*EG0JG6#oH=#Xp#Z=mf;hPcb>oI-AiOrC-I^oKzOFJ#g**$qX zf-ahJieTh2J*1o)1HyB+WNcSNR>~W0XcsMwU6U==*Cb)A{OrthnYEICf+hB9 zn76H5s=)G7PRk9p$j#mYn8@_RAmtKIIr(FdWPb;c6yp56p)D(aM?@x!CNS+>T`x_z z;!?G8hx7fP=aITdM__H0t9w3wWk-uw_h<|jX#38-hlcp4Zn2#g)?=w4*JO#Okl(rz zmCGD+P+VH2q-Z&|gSa@m%b@1(jks|zoJZs(Ic&-ZGXr!9is?dvL%0nrzA( zd5NWF$D3@CmKjG)nGRs(HX>w6T8Q~=n*UaSF3YrCQ603HifzV{J+iPHgbKZ}Lh=r7 z$ez^aPLVi)f8&K&w%Z5@(}jDo8#F3Ym8rr~Nq7A9Xq3#N;MhPn<%{7N`l!+;s=S1& zg*{0v+HTdtC0y-lTm5R%1N|>#J?ON9Whhv$*H7|~Ml!N80}-C}*DCEeCuz>>_AI%{z7M)#7VqfX~)W^iNlyfwu1U)Hy8ZzYzK+0jjN7|F58v4)OtAxNn2*E!7nFm_C-)$IHR z2%|CL+S)OF43%61K3;KtTo9X$5t26Ns>Cb6PYO~?R5~(OX^AB(#o$#9Fc@W`aH_D? zB_SkFf>EB(oKI0WW=74-XFzo4KY*GmxmMK5d=5JE1;B}-x$PJPVa+*?hiN#BvtV%s z0qIx&fLVd-9I%fx3Qs>Xi(8erVW$Si})~F^McvZ%v))=)lg(4O> zwP|W;-ZQe8=1`lGGh@MMFcSo-J0U>44H9R9w1#wHChV;~tFMcr3eNs=y-!I*E~}z* zP6>()>|y+F0Ffbk3nbRT$<5!)}8N6tzvdC59?W8WvjAh2WA)(SvXHMZa;n z*b2YYd)fIglK!*tufj*5bM_8_|8B!KJLpanEZ zXwpg1BjHrgLvbqcNcIoBF&R@#cd9_OArGd948^JTMMEG`4EoiOz9Nlo9Sj=%bi+>; z$}%hJz*jPj4bYL-h8l78EU^+&LA)2=W+k&*(UNTzGJR=p;lzYY6I;j&r@dPyCfprD zT8%xMDr(0Ltx>8}-)0r({;I*w9;PnQF;I>%Zh_aq`L#3U0cZ&ck|OJKa6(wgE()?m zW>LcTWza5h)(-PcdSfPy=X1O@le(uw8c;2y0o7WW2K0V8socd4 zH5UMniT2U?!%rBCp}GWIKVd9HMRXx-o+uQ3ob-uK1c$Fho3i~wT@uMSx8>~`c>R$k z-(k?Su4(0bU6|Tmqmnm+%rn&|63_AgUaw@}8vJC=sYSafEj<#WnpMMvv~=(K1nwtkh+}%g9JH|xC>$ti7EW@y zgCpH>n4ISHAo@+9*g<;&&-4Q5)#&QIuf=AMfxz)LQ-XS90Sj-@$z`~R2P!jRNE;|9D*(T^oC?Q?HZ#MMzw>=+Uw2}9=RZ6lc#34Gf~$=>An71>&JXPa%f zm1<&uA)3$-$eu2lRccPJIy*tKzC6oMFso_hrGxP*z>D@;?1ZHw(7#GF-q!4$Yfv=MXFhBAxmb=Y!30VwzruqFm6;hCX=zEcSwHuouKM`dI-L#-pgT zH+q`f;0l{aEZA_F9V~1k;)f-LO*Mk?Br3P7(l0*x4NAm}hDsfxMykRnv<;&+lSc6? zE;xWXhEX(l-e0GkIk;PK%;JsK47hV-k%RO?_!%Pd5a8Y=)62sYTfR5bUdQx=D^?1z zCeVx;c!ylLvr{niMGJXRo(h|}cxCw(2Di4j8Eq%QHnz2wsi?ohl>ikxTy{R81E7J; zt_csNy$;ckanGhsC4Fij1lc9f6fXb~l+qEEas$DwBMTz^y&sMDH{9JYUF6mi%p@gy0P5MHk)jpnV9%J2*P~$B zdeL_IjL`Alj~-+Py@zH@!&VrW*|$HfLt>Kj!|6CrV13h6X9W4@WB}msOVAnVT`;qr z4k=*lK|!@&W6``yoK)*ml)QFMMTtZc+(`Pl)HF6%zpTuTN;@)-n#0B9ABED$=V)vK zLJpy4D{Vk@=Ag1ABylpMfiIKTpG&22Rhb@u|?}d zqOeZr&YL(p7k574WWbQem8968#MX4eBgVi7{6&?5OzWku0dA_sLs3JS9*<_i?m{oYZ-ePPYn~V$J8a+c?;*XVZCCn;*_%& zJ5-P9Q`w!(;4!)TO*$W)W5cW3#aV7*_ zC*a8fdID}yiN9OG85-g10d;mJfKLU<+o0pnq6(14q@*=Gm}IkE4QMC4|QWYyi~R1tnx| zmVk=@gKUkE-XY*K0{%%rJwjzm0avpWPB1}svEXbJ@Ye#q2&l7a zJ}0QNKS!wpMn%FIe1UxB0`~?EOD_|^1oTUP870~^wcvPfFFcmPuUP#fHy(ZxM z0;(0{uAvpwlu;F=xwzt-iXgikc!X_(G{|-e{yzl#Ou$iD{>(}SIg3Cq}ALG@Fqh` zz-&LvdV?a(x3O{r1f{dR_&t`+o<)XBXV1fu&i)9iHvXZ*!@Q2&!Ea`DY!}}I_^5zS zxZ?4wfPduoK=4n#74Q=Q6Ux27`zzZ4o0T0{MJ6db0nb)UhBRmtcRMb>UqsnqQP zZdVTje_DMT@FkV(zaii|s=EWkhboz78kx4Vo6+7o%P+zdyFbt!{oN6?)EFNa>aXhT z)A+gIr}gb@a+>_Ik!^xwIeWQ|sOwYjvJ95E&job{dyn-4wWSBi?qL66gP6t!^pq6i z#K6x2pGjbDxdOVMJBa^K-sz~w6i z<*^lfF@Bu%fvA2XTW@aXarPT*M^yc4te@p@c&+W1v-JoP}JNbN&q&6u}gL-tZq;@F3!{IhPL{d*eGtGW8 zR8qfJ4uBdnTvCT2t7FqfVD%@XM!q2OH*{SFf>hEAbfv|z?7e?h6 zHnI&PrBUi{Bg@d12hD_b1k@p)>Z2WH1K60;q-?N8BmA3hN$O0E^TBNHS&~|&nS3Y< zdQOtU*9B!xmQ;5&!B1v`ed=$Jox+x%D`g*QRs0n8 zDs8v0Vg%BBB-?-^f@o+U!$z{<=SixEpw`WlRAZnKnr{ip?O?+L2iPcfK?@02v#C%W z%}(=sZ^fThN3)4ORRyY<&GxBAP~+IOK1I$yja~0k_V@2CCc zv-An@;ET#R>;X|w$|kdYl45H4)9PfV2{YHTRCy^s zmmTqCjpZ3O4c*~vR)FAKK!q(R!Z8z>%B~Gy{5e}K#5W1?T>{?}M;Dllfuh z8Kd|S_PjBUe+vEtZnM{nDV+1a8>I6-bU6RSm;tDmGq}Zt4zD!Nhi2Nmgjaww8`44M zLSDybnOF0^{6Fkk-o#g!8SE@;01vb8n%DC%)$8I%cT~M4U^5D5u=2kH(`Rzs`X!$N z&eObw_px5UT2B0GXddLPe46zZI5Vx|Xl|u>GfGLk)e0y_*fmyA39}BXOo_8KRuwci zSqY^l`;pZE4)J@kUDg1_U4{w{unxcrlzvchl)*x2BPa1l!5J?&o1g>7@-u@k@U#6! zoQoeNA7L%Q&y>FGqTpV(ogWE?)g$cFU;$;^pir?YK7w5r`Ysk8GI6GWQv_@guvI`?K+bOt?S+%? z4|yu*kA-O9o(tWjz6Lv6zD%#Ve3sz7@q%Go_bk&1@*}?a)8So7p*~b2MrqvM-!p3Sy_SvUH&~g>8V+PGu|LQ$lqLd$Dw> zwomz>bU9#o*=p@IB~w<#4=dj)TZ<~sDO<0#vN>gUfPZz_UGQaR**zMD0I-Ga0jGtL z>q$%2u{d8z*<feo?0gPFUB4B6?EP7Isl=e4ter;xq&S zTUiyG9BAe1V>1F5h`Do_u-wYG#8!ZRZ|oN6cUX4^TG$S<3E;?D)4ZcVJyUsAUv$OjK51}H7;kpvCFz61?lAbBfvPDyUkEtO)vg`JndO7f>V*CcMbsYi6nCr(K{js&t4T%P*1&iUdLnOKpU19P`R+QEL9 z`mO>|JUHdoy)duhTwCy`wh?P6anANV819D!@9eSH)3S zo1Ab#DE%uw*PAuBf*BQJZJ#IBIL_Bqlo(UArz&Dbs~C&M-FeA6cKH zX9p^(M3hW27OTYP{7^-P%|pc*wpa^P?gcCru(I+1`27KwX%i}!8;iB`DqnE1Z4hCr zD=Kd_UQ!>Ak298t@m?YVbGZng>)5)=2IV?-N9FU-IX(WlzE(Rkc)(aLLUoCVhE3}I zl{5H8ZExilus|#PODYZMODYX$okELSEB|d})ZFAZ?k{MTyI6Y7g!d3|mVhe-JR~4f zNZKsm7M1Y50v-|&`BZSy0yYb{MHe~(9ukllLPx+chD*dHf>FsGPv z%)3n;#}mdDs;}eFRf_W!$2Co5oA~$n0iIT7E6bEk%J-F*$0~MUZXg@@Q{X}4G2r^=Uju1kA)A;ww+sFyo+N$yW{b+OPV#ch=Ph zyoP0$@49!{WUc4$)0#(&9Y11t%|nI^ZX7gd+_3S(2M%i<`aZ`LNgf3F?L2YBzVt@1|Q)SnOa7Tna6H+c`OjeGB{jqLi_O#@V8tmDj|-MVns zUvG|ZZR%X-D(~;NG<(z6r);Wy>g@TmXTf1-F1&2^)!w4@PTA?RmyDm61=Gnco7B2s zws-W}zTRKfZ}Z#@r2qU3cI1BOZx0vrF+O%Vx7#Z0@d+ zcU-RoLz7uEo5aSm=1x~rye9DZRLb=9?{cE zbVx)2C)yMtj-oLhQMC-zpg#iNQ;oC=orq%L*%YyB>>6R931xY-QK3h5v`@2qo(3Z* z4@+h^&B~)CygYiQVw#3fjy86tOVx6FSpcMIk{x@6nr5cw-rrObHneDUbmf|83c!2j z{!R@d#k+9(%RKE3{Bee7yz_tD;u=h~YfRJBsr1St!U&qA@JN_g(Ut$g^u^^0*wF|s zEqF-&QECJ#_|$)X5r8*3IE2v-3yooRM~O*9MYN+vSnud%q%}0uudJgll)McOT;NU- z7CWX(tqUd9DyezGEM0x09ZRJ|JnW8Tl3Fp;D35m3MTZdRMF4-B@JBoVhJY*h{=?TW z4GaVcb=Od+fUK`W)VD^!wUTvn0Hat_Em*hf<@U-wJOU4y)k=UVkw~PB1<;yk$Gwq= z-Lc*7*by8=O#TwiKj*F`)GJ-swK;pyfVOuQ(yDlq`o)F9t)r31;PnKYN~^X3}WJo zh^#gkjbq1anjYpg$rc?2eBl^{IS( zK@XS|k5v>HJi00%A6A(Wh_14t9n--gq#yNp<;_&XD%ZBqis&kM@8)1S0IY(72H{&B z#ugi0W!o#)+N*kz^2&cjnGRNC1Ss?|p;k3j8=+_;i0G;klvPYphe-T2X*P+mT)7Xg zB_h?;)nx{HzE)At(df#3(UpTXl^X_eat!b`;V+_Djx$ZIRYNebXpBXZo4u4(!z|2Gpfp`!ClV2{AZhQ|gJaG@W%PHgVv0&p0ac?J(8tI}>{Zh(X~^c0zUa`Z ziIF^wVuT~eVBsFG%0HoIdKVi9df4SN&ZzkJjSR*>so>vj(yLNDAWH*<7twuI}8kyK@gNo7NWm*9a){ z@1eW4?)(q$-1J-iU1i?Z-MydX7Z_aKz4}GoYLzXFHw+lFVey!4$L{F+;17Ba+Wq0H zycwoQ{H{+1;^+$HU$jp4xrSzmx?QS35%= zEA#p0-B*9CJXC_BeFN%j1JCtgwMi+v=B+z6m)+TG{N1Zp_xfns6D_;0s&~%L3UzWy-B=gfz4=c(%)N(pK16Q%HFtZdxIdDf{G5S*&HG-_Ic9i2 z6=~0$l(A3nyO(=$w8?$83|H9?$X)*DjMG&1E?(#4J_BZ|>^i)i%zYlcQDx2d<|z7) zxcX}hzbDOqR(412MGd&Re`hwKj{1^E(@8Z<9&JpirQhVyhjuQq%2Y9)i-u!7|A+rC DT lines) + { + var settings = new AppSettings(); + foreach (string line in lines) + { + if (string.IsNullOrWhiteSpace(line) || line.TrimStart().StartsWith("#")) + continue; + int separator = line.IndexOf('='); + if (separator <= 0) + continue; + string key = line.Substring(0, separator).Trim(); + string value = line.Substring(separator + 1).Trim(); + if (string.Equals(key, "DefaultShift", StringComparison.OrdinalIgnoreCase)) + { + int parsed; + if (int.TryParse(value, out parsed)) + settings.DefaultShift = Math.Max(1, Math.Min(25, parsed)); + } + else if (string.Equals(key, "ConfirmBeforeShift", StringComparison.OrdinalIgnoreCase)) + { + bool parsed; + if (bool.TryParse(value, out parsed)) + settings.ConfirmBeforeShift = parsed; + } + } + return settings; + } + + internal string[] Serialize() + { + return new[] + { + "DefaultShift=" + DefaultShift, + "ConfirmBeforeShift=" + ConfirmBeforeShift + }; + } + } + + internal sealed class SettingsForm : Form + { + private readonly Color Navy = Color.FromArgb(24, 38, 58); + private readonly Color Blue = Color.FromArgb(41, 112, 255); + private readonly Color Background = Color.FromArgb(244, 247, 251); + private readonly Color Muted = Color.FromArgb(94, 108, 128); + private readonly NumericUpDown defaultShiftNumeric = new NumericUpDown(); + private readonly CheckBox confirmationCheckBox = new CheckBox(); + + public int DefaultShift { get { return (int)defaultShiftNumeric.Value; } } + public bool ConfirmBeforeShift { get { return confirmationCheckBox.Checked; } } + + public SettingsForm(AppSettings settings) + { + Text = "PANDA – Einstellungen"; + StartPosition = FormStartPosition.CenterParent; + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + ClientSize = new Size(560, 330); + BackColor = Background; + Font = new Font("Segoe UI", 9F); + Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath) ?? SystemIcons.Application; + BuildLayout(settings); + } + + private void BuildLayout(AppSettings settings) + { + var root = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 1, + RowCount = 3, + Padding = new Padding(24, 20, 24, 18), + BackColor = Background + }; + root.RowStyles.Add(new RowStyle(SizeType.Absolute, 78)); + root.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + root.RowStyles.Add(new RowStyle(SizeType.Absolute, 58)); + Controls.Add(root); + + var heading = new Panel { Dock = DockStyle.Fill }; + heading.Controls.Add(new Label + { + Text = "Einstellungen", + Font = new Font("Segoe UI Semibold", 18F), + ForeColor = Navy, + AutoSize = true, + Location = new Point(0, 0) + }); + heading.Controls.Add(new Label + { + Text = "Lege die Standardwerte für zukünftige Umwandlungen fest.", + ForeColor = Muted, + AutoSize = true, + Location = new Point(2, 40) + }); + root.Controls.Add(heading, 0, 0); + + var card = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + RowCount = 4, + BackColor = Color.White, + Padding = new Padding(18, 14, 18, 14), + Margin = new Padding(0, 0, 0, 12) + }; + card.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + card.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 90)); + card.RowStyles.Add(new RowStyle(SizeType.Absolute, 28)); + card.RowStyles.Add(new RowStyle(SizeType.Absolute, 38)); + card.RowStyles.Add(new RowStyle(SizeType.Absolute, 16)); + card.RowStyles.Add(new RowStyle(SizeType.Absolute, 42)); + var shiftLabel = new Label + { + Text = "Standard-Zählwert", + Font = new Font("Segoe UI Semibold", 10F), + ForeColor = Navy, + AutoSize = true, + Anchor = AnchorStyles.Left + }; + card.Controls.Add(shiftLabel, 0, 0); + card.SetColumnSpan(shiftLabel, 2); + card.Controls.Add(new Label + { + Text = "Dieser Wert wird beim Programmstart und nach dem Speichern voreingestellt.", + ForeColor = Muted, + AutoSize = true, + Anchor = AnchorStyles.Left + }, 0, 1); + defaultShiftNumeric.Minimum = 1; + defaultShiftNumeric.Maximum = 25; + defaultShiftNumeric.Value = Math.Max(1, Math.Min(25, settings.DefaultShift)); + defaultShiftNumeric.TextAlign = HorizontalAlignment.Center; + defaultShiftNumeric.Dock = DockStyle.Fill; + defaultShiftNumeric.Margin = new Padding(8, 5, 0, 5); + card.Controls.Add(defaultShiftNumeric, 1, 1); + confirmationCheckBox.Text = "Vor jeder Umwandlung eine Bestätigung mit dem gewählten Zählwert anzeigen"; + confirmationCheckBox.Checked = settings.ConfirmBeforeShift; + confirmationCheckBox.AutoSize = true; + confirmationCheckBox.ForeColor = Navy; + confirmationCheckBox.Anchor = AnchorStyles.Left; + card.SetColumnSpan(confirmationCheckBox, 2); + card.Controls.Add(confirmationCheckBox, 0, 3); + root.Controls.Add(card, 0, 1); + + var footer = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 4, + RowCount = 1, + Padding = new Padding(0, 10, 0, 0) + }; + footer.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + footer.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 130)); + footer.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 10)); + footer.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 130)); + footer.RowStyles.Add(new RowStyle(SizeType.Absolute, 36)); + var cancelButton = new Button + { + Text = "Abbrechen", + DialogResult = DialogResult.Cancel, + Dock = DockStyle.Fill, + FlatStyle = FlatStyle.Flat, + BackColor = Color.White, + ForeColor = Navy, + Margin = new Padding(0) + }; + cancelButton.FlatAppearance.BorderColor = Color.FromArgb(206, 216, 230); + var saveButton = new Button + { + Text = "Speichern", + DialogResult = DialogResult.OK, + Dock = DockStyle.Fill, + FlatStyle = FlatStyle.Flat, + BackColor = Blue, + ForeColor = Color.White, + Margin = new Padding(0) + }; + saveButton.FlatAppearance.BorderSize = 0; + footer.Controls.Add(cancelButton, 1, 0); + footer.Controls.Add(saveButton, 3, 0); + root.Controls.Add(footer, 0, 2); + AcceptButton = saveButton; + CancelButton = cancelButton; + } + } + internal sealed class ImportWizardForm : Form { private readonly string csvPath; @@ -683,9 +920,11 @@ namespace Panda private readonly Label fileLabel = new Label(); private readonly Button exportButton = new Button(); private readonly Button resetButton = new Button(); + private readonly Button settingsButton = new Button(); private CsvDocument document; private string importedPath; + private AppSettings appSettings = AppSettings.Load(); public MainForm() { @@ -742,7 +981,7 @@ namespace Panda var toolbar = new TableLayoutPanel { Dock = DockStyle.Fill, - ColumnCount = 8, + ColumnCount = 9, RowCount = 2, Padding = new Padding(12, 10, 12, 8), BackColor = Color.White, @@ -755,6 +994,7 @@ namespace Panda toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 135)); toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 108)); toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 122)); + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 116)); toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); toolbar.RowStyles.Add(new RowStyle(SizeType.Absolute, 34)); toolbar.RowStyles.Add(new RowStyle(SizeType.Absolute, 28)); @@ -773,7 +1013,7 @@ namespace Panda stepNumeric.Minimum = 1; stepNumeric.Maximum = 25; - stepNumeric.Value = 1; + stepNumeric.Value = Math.Max(1, Math.Min(25, appSettings.DefaultShift)); stepNumeric.Dock = DockStyle.Fill; stepNumeric.TextAlign = HorizontalAlignment.Center; stepNumeric.Margin = new Padding(7, 3, 7, 3); @@ -797,6 +1037,11 @@ namespace Panda exportButton.Click += delegate { ExportCsv(); }; toolbar.Controls.Add(exportButton, 6, 0); + settingsButton.Text = "Einstellungen"; + StyleSecondaryButton(settingsButton); + settingsButton.Click += delegate { OpenSettings(); }; + toolbar.Controls.Add(settingsButton, 7, 0); + fileLabel.Text = "Noch keine CSV geladen"; fileLabel.ForeColor = Muted; fileLabel.AutoEllipsis = true; @@ -813,7 +1058,7 @@ namespace Panda Dock = DockStyle.Fill, TextAlign = ContentAlignment.MiddleRight }; - toolbar.SetColumnSpan(hint, 4); + toolbar.SetColumnSpan(hint, 5); toolbar.Controls.Add(hint, 4, 1); var grids = new TableLayoutPanel @@ -894,6 +1139,29 @@ namespace Panda button.FlatAppearance.BorderColor = Color.FromArgb(206, 216, 230); } + private void OpenSettings() + { + using (var dialog = new SettingsForm(appSettings)) + { + if (dialog.ShowDialog(this) != DialogResult.OK) + return; + + appSettings.DefaultShift = dialog.DefaultShift; + appSettings.ConfirmBeforeShift = dialog.ConfirmBeforeShift; + try + { + appSettings.Save(); + stepNumeric.Value = appSettings.DefaultShift; + statusLabel.Text = "Einstellungen gespeichert. Standard-Zählwert: " + appSettings.DefaultShift + "."; + statusLabel.ForeColor = Color.FromArgb(29, 132, 88); + } + catch (Exception exception) + { + MessageBox.Show(this, "Die Einstellungen konnten nicht gespeichert werden.\r\n\r\n" + exception.Message, "Speichern fehlgeschlagen", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + private void ConfigureGrid(DataGridView grid, bool selectable) { grid.Dock = DockStyle.Fill; @@ -1104,6 +1372,18 @@ namespace Panda return; } + if (appSettings.ConfirmBeforeShift) + { + string message = BuildConfirmationMessage(amount, cells.Count, scopeComboBox.SelectedIndex == 2); + DialogResult confirmation = MessageBox.Show(this, message, "Umwandlung bestätigen", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); + if (confirmation != DialogResult.Yes) + { + statusLabel.Text = "Umwandlung abgebrochen."; + statusLabel.ForeColor = Muted; + return; + } + } + int changed = 0; foreach (var coordinate in cells) { @@ -1119,6 +1399,16 @@ namespace Panda statusLabel.ForeColor = Color.FromArgb(29, 132, 88); } + internal static string BuildConfirmationMessage(int amount, int cellCount, bool allValues) + { + string subject = allValues ? "Alle Werte" : "Die ausgewählten Werte"; + string direction = amount > 0 ? "hochgezählt" : "runtergezählt"; + return subject + " werden um " + Math.Abs(amount) + " " + direction + ".\r\n\r\n" + + "Gewählter Zählwert: " + Math.Abs(amount) + "\r\n" + + "Betroffene Zellen: " + cellCount + "\r\n\r\n" + + "Möchtest du die Umwandlung durchführen?"; + } + private List> GetTargetCells() { var result = new List>(); diff --git a/README.md b/README.md index dac98d4..481a23e 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,12 @@ Alternativ `PANDA-Portable.exe` doppelt anklicken. Diese Einzeldatei benötigt k 6. Schrittweite festlegen und **Hochzählen (+)** oder **Runterzählen (-)** verwenden. 7. Das Ergebnis rechts kontrollieren und mit **CSV exportieren** speichern. +## Einstellungen + +Über **Einstellungen** lässt sich der Standard-Zählwert von 1 bis 25 festlegen. Dieser Wert wird benutzerbezogen gespeichert und beim nächsten Programmstart wiederhergestellt. + +Standardmäßig zeigt PANDA vor jeder Umwandlung eine Bestätigung mit Richtung, gewähltem Zählwert und Anzahl der betroffenen Zellen. Diese Abfrage kann im Einstellungsfenster deaktiviert werden. + Auswahlmarkierungen werden ausschließlich in der linken Originaltabelle dargestellt. Die Buchstaben `A-Z` und `a-z` werden zyklisch verschoben. Beispiel: `Z + 1 = A` und `a - 1 = z`. Zahlen, Leerzeichen, Satzzeichen und Umlaute bleiben unverändert. diff --git a/Tests.cs b/Tests.cs index 12d615a..8a01754 100644 --- a/Tests.cs +++ b/Tests.cs @@ -32,6 +32,18 @@ namespace Panda AssertEqual("C", filtered.Headers[0], "selected column order"); AssertEqual("a2", filtered.Rows[1][1], "selected column values"); + var settings = AppSettings.Parse(new[] { "DefaultShift=6", "ConfirmBeforeShift=False" }); + AssertEqual(6, settings.DefaultShift, "settings default shift"); + AssertEqual(false, settings.ConfirmBeforeShift, "settings confirmation flag"); + var boundedSettings = AppSettings.Parse(new[] { "DefaultShift=99" }); + AssertEqual(25, boundedSettings.DefaultShift, "settings upper bound"); + AssertEqual("DefaultShift=6", settings.Serialize()[0], "settings serialization"); + string confirmationUp = MainForm.BuildConfirmationMessage(6, 12, false); + AssertEqual(true, confirmationUp.Contains("Die ausgewählten Werte werden um 6 hochgezählt."), "confirmation count up text"); + AssertEqual(true, confirmationUp.Contains("Betroffene Zellen: 12"), "confirmation affected cells"); + string confirmationDown = MainForm.BuildConfirmationMessage(-4, 20, true); + AssertEqual(true, confirmationDown.Contains("Alle Werte werden um 4 runtergezählt."), "confirmation count down text"); + string tempPath = Path.Combine(Path.GetTempPath(), "csv-buchstaben-test-" + Guid.NewGuid().ToString("N") + ".csv"); try { diff --git a/Uninstaller.cs b/Uninstaller.cs index 4b2536a..0576ff9 100644 --- a/Uninstaller.cs +++ b/Uninstaller.cs @@ -10,8 +10,8 @@ using Microsoft.Win32; [assembly: AssemblyDescription("Deinstallationsprogramm für PANDA")] [assembly: AssemblyProduct("PANDA")] [assembly: AssemblyCompany("PANDA")] -[assembly: AssemblyVersion("1.3.0.0")] -[assembly: AssemblyFileVersion("1.3.0.0")] +[assembly: AssemblyVersion("1.4.0.0")] +[assembly: AssemblyFileVersion("1.4.0.0")] namespace PandaUninstall {