From 27b4edef6d67901a407293c89249d0eb38fcc2d1 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 20 Nov 2025 15:45:48 +0300 Subject: [PATCH 01/31] =?UTF-8?q?=D0=94=D0=BE=D1=83=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=BB=D0=B5=D0=BA=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BF=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/css/styleSheetMain.css | 19 +++++++-- .../InstructorsAndTraineesWidget_ru_RU.qm | Bin 22140 -> 22221 bytes .../InstructorsAndTraineesWidget_ru_RU.ts | 40 +++++++++--------- restoreDB/DBLMS_EMPTY.backup | Bin 0 -> 24581 bytes 4 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 restoreDB/DBLMS_EMPTY.backup diff --git a/InstructorsAndTrainees/resources/css/styleSheetMain.css b/InstructorsAndTrainees/resources/css/styleSheetMain.css index 72f9ae6..2434ab2 100644 --- a/InstructorsAndTrainees/resources/css/styleSheetMain.css +++ b/InstructorsAndTrainees/resources/css/styleSheetMain.css @@ -83,11 +83,12 @@ QToolButton { QToolButton#btnSend, QToolButton#btnDelete, QToolButton#btnCheck, QToolButton#btnOnlyActive, QToolButton#btnSave, QToolButton#btnUpdateStyle, QToolButton#btnSetVersion, -QToolButton#btnAssignTask, QToolButton#btnCheckDB, QToolButton#btnRepare { - width: 80px; +QToolButton#btnAssignTask, QToolButton#btnCheckDB, QToolButton#btnRepare, QToolButton#btnDocsUpdating, +QToolButton#btnAssign { + width: 100px; height: 55px; } -QToolButton#btnCheckDB { +QToolButton#btnCheckDB, QToolButton#btnUpdateDocs { width: 100px; height: 55px; } @@ -194,6 +195,18 @@ QTreeWidget::item:selected { } +QTreeWidget::indicator:checked { + width: 24px; + height: 24px; + image: url(:/resources/icons/chekYes.png); +} +QTreeWidget::indicator:!checked { + width: 24px; + height: 24px; + image: url(:/resources/icons/chekNo.png); +} + + QHeaderView::section { /* background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm index 77a8299e06deb21c7d30bdbd7f815f151602a479..e706762e40778e2c53bfc315e03c69b0d7776fe0 100644 GIT binary patch delta 993 zcmXYvZETZO6vzMf>2169*;|!aR7jt(vFcbuAuCJ|Y@((HSf#SrpB2D$h+V(&J+OU1EGQo5WyM>d0t25b-`0Er zG^d5t;$btwYjLx8M8e_;{=(nAbecSM{EYG-5WUUk>PfQ=lHN|qP8UDBzn9+IDfz^& zV%}1#w5<_~mS>d~2tRkT1<}Jj>_@SW_p-cLSn74+vO%<=4JVA|1O15`9RtGh}e?~I;f z58aK>ZF|+3b2Kt#1<9rgb@pfjwdb_@MdBl%rc7N5g8ud)_1<_Hjb4}dz~*-5OO6+I z01aQ3oHgi{*adOh_N3jmL@f-)MYBCn`)c`-buZIIjZ3ynmVfs3eqi-W$QXESMYAfGkIG(9(H z8%k>pY2AnWQq#??-K?x2v)J;AhGnT+K~Km) zB0-xhlCr3zkPU+f`VhDj8kk1e1Ekl7u%NycQKWQWJ`BHm=H5GV&YYRJ$NnW)_ae5l zC)ct#4Cprk>s@3mP;nGUq1cr#4bAVVv&GH=mAOFVBoO`x1jeP2J3!4d`tS;{`zigL zkZw2xw9~xtue5RsI7RPWHPVm|yuSlj{a704>zNJ|c7ea^0!k*Of#1^bur%^g8tsF= z;5HB(6I)rasbm)Vbq=7^AbOdTF)_h%mfb)~;wR-Zg@UvhT5>hmM{+5U-Hlo^>DeYuDAueElPsoCDOsbe zb$SeNuNU`}95zpkD7MT-#h#?HoRiAuycd8kOUx)X77{tkdZW+(VXqSaWQmfr~VT5*%a*?YKF->TCXKGVw;}<_2 znO+R&169t{A2)AM1EbPPooRtv1ssFYGMmY3{{yUhZ>s%DmqPWK8m>|0LA&X2cotY* zVH*AQ2`J~nZdlDOiaJA1X`{K5PgA45n$OJyfvS9S|NSRGdQ$2cHs9%6L(Qo%zmALm zdFkd)ZqUsfG0z@Jr?x2Kp}~@wmv%K-4Xk;SHWZ^(LYkO1Y!d#IVrxmpg(b)7Y^_rN zs*G13&HxLJWqeD_rCfWPsN|Oq`cgK!*3~`qr|11G^_oWngV_&Q+4%hbAoc54 diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts index 0c6ac7e..e30577c 100644 --- a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts +++ b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts @@ -9,27 +9,27 @@ Форма - + ... - + Update Обновить - + Assign Назначить - + Аvailable Доступные - + Delete Удалить @@ -44,45 +44,45 @@ требуется обновление - - + + DM code DM код - - + + ID ID - - + + Procedure AMM Процедура AMM - - + + Canplay Режимы - - - + + + Status Статус - + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + Assign this task? Назначить эту задачу? @@ -933,8 +933,8 @@ Delete it anyway? - Select subprocedures allowed to run in Auto mode: - Выберите подпроцедуры, разрешенные к запуску в режиме Авто: + Select the sub-procedures that are allowed to be run by the trainee in automatic mode: + Выберите подпроцедуры, разрешенные для запуска обучаемым в автоматическом режиме: diff --git a/restoreDB/DBLMS_EMPTY.backup b/restoreDB/DBLMS_EMPTY.backup new file mode 100644 index 0000000000000000000000000000000000000000..e3bb8b2a54c7360dc7eb7370675a22dd1edcd1a2 GIT binary patch literal 24581 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 Date: Thu, 20 Nov 2025 16:00:10 +0300 Subject: [PATCH 02/31] refact --- .../css => FILES/CSS}/styleSheetMain.css | 0 .../DB_BACKUP}/DBLMS_EMPTY.backup | Bin FILES/config_GUI/settings.xml | 4 ++++ FILES/config_Tray/settings.xml | 4 ++++ TrayServerLMS/resources/IcoServerRRJ_2.ico | Bin 2891 -> 0 bytes TrayServerLMS/resources/IcoServerRRJ_old.ico | Bin 67646 -> 0 bytes 6 files changed, 8 insertions(+) rename {InstructorsAndTrainees/resources/css => FILES/CSS}/styleSheetMain.css (100%) rename {restoreDB => FILES/DB_BACKUP}/DBLMS_EMPTY.backup (100%) create mode 100644 FILES/config_GUI/settings.xml create mode 100644 FILES/config_Tray/settings.xml delete mode 100644 TrayServerLMS/resources/IcoServerRRJ_2.ico delete mode 100644 TrayServerLMS/resources/IcoServerRRJ_old.ico diff --git a/InstructorsAndTrainees/resources/css/styleSheetMain.css b/FILES/CSS/styleSheetMain.css similarity index 100% rename from InstructorsAndTrainees/resources/css/styleSheetMain.css rename to FILES/CSS/styleSheetMain.css diff --git a/restoreDB/DBLMS_EMPTY.backup b/FILES/DB_BACKUP/DBLMS_EMPTY.backup similarity index 100% rename from restoreDB/DBLMS_EMPTY.backup rename to FILES/DB_BACKUP/DBLMS_EMPTY.backup diff --git a/FILES/config_GUI/settings.xml b/FILES/config_GUI/settings.xml new file mode 100644 index 0000000..0b063a7 --- /dev/null +++ b/FILES/config_GUI/settings.xml @@ -0,0 +1,4 @@ + + + + diff --git a/FILES/config_Tray/settings.xml b/FILES/config_Tray/settings.xml new file mode 100644 index 0000000..186721e --- /dev/null +++ b/FILES/config_Tray/settings.xml @@ -0,0 +1,4 @@ + + + + diff --git a/TrayServerLMS/resources/IcoServerRRJ_2.ico b/TrayServerLMS/resources/IcoServerRRJ_2.ico deleted file mode 100644 index 9b1892f5f83462fddc678f3fb1df6cd0beef2704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2891 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 diff --git a/TrayServerLMS/resources/IcoServerRRJ_old.ico b/TrayServerLMS/resources/IcoServerRRJ_old.ico deleted file mode 100644 index 82dd2e8948f0d059944804b0f4b5cd3497cb6879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 zcmeHQ2YgjU_P!zLA7mv7b#?7jr9((w3XlW{EhI?q9TWr?1QZ1Y6%|B5QEXI&6&1_s ziXtmw1F=vHVq5H9hey3Ru$&FpF@GS8j=I~;I0;Bdg!O91~8fIBG2 zB6aTd;frul%N)uei5;#Ovch zRYByhl9vS7kc<6K={{xC#GYjp&^Qq5_FHwt@{6+wGJ0?M>X z9@{CyI^T_cqny=usQ0sfweZjIckS4h!TC^0atD!*WJ+&9IBch^7%`4E_!NE$eR%LCLzZF1gi}ZQ*l? zAif`b(JC3BA0|&M-e~-N=@a=#()U+4c9l1pL{=bQjf9Kn2eN-reR=vw;;zrr)w2!Cwbb=2yjm5FFTt(`)3$<|fdrIcl|1%EY3g1?`B~&^T!XT~ zZJS?f#N1l=eL!^eGDf?W*Wz!Oa+(lP?q#c9W*vOjk#$eEo^64WZFKbCLu_MfmI($K zphS?w)(lHGOCI~8uuOHYM%Yp4{q@nnJ?6HsAXl}*w*gW3CcYmO4I2PEa9wPTup?GI z%{ut3W45-m!8>f@WsiTawoyjUvTYD!( z8NJ&^yU9ZxitK40)n*skO^ONv6$b^kioE5@y4U?5@oNQH5Ky{R@;Eoj;Qgqop+7!y zU-#fI-+80h^znBGFL-8BvBIS358fTTY~j3OGp5{841a6ARVVegbE_ZZSwQJ5qpF6b z)Vc0Tqh-X+SF+7k+k=!WP#%(_iY)GISf3Qiyqk*QnE0z}^=~X03^MB9P_kM58?O>j zhE?)7FH+Cey}m?ZJ$$3y4J8ZRzVe&=cAe`>H21H5B_;gkzY%+hge?Q1EZqjB0V4LA z7vuqXVV);P7D*Wx+^KDAWtU$z-E6uMv9>piJN|-CH%3k$u|An=d{o|9b9mdHwnP&=a!Y*+($Y&lBzb4nbQwLUtwh)Un>3BAAaUVkq;p~&>6;wG_Nq2p{3fBJ~tNg2>HfxgMSrzhl>GJt*h#U#`zBd>bRnfjo-{@fEX zqF*bCt_A!ffPaHB(xpY+4B(%R_L9=9wvz|s1$jc=z#oVyYVaGtmu=Ji-c%g3-RG@R zwEhEs>aoK8V(Rh5{5EBG(agy*vR`XY{LxOg{(j;yeaDV--I@v zwQ$#M_h0{~KP>Y>^I&6N<*|pqr?0{H_j=#+dG_VJ#`i9S^mq8J-0Z&>{ntDoPskhM zU##frzw1V{ufX^d_qp(|7QzRg^W^yKegZI@JJr0l0ON-_Q^w_x4?F(EjJ`T?pN((L z!Mg>eg)<&=%iCPYp0EBt5B$lSB94Dlf$=9^3!ZySHvIgf?EUkE{IKR5H@?J>a`EQu z>9S?_4*C7WG5K=E$1)eV@}3=c9&79;-#1X&B~+25#y3e)lbccIkJ{p$){SnIft_QO z-m7}#;{Q4L7YzSbF(#b#_*nU3`4TxMBKuCCl%ps={`c!Ld-DDA8paH>p15Du{`kGR zzyHh`Ie7k@yglzZWhcDJ0Of$#bBvC)LupdKOo0e7VdAP$QpVlY8S?_LOOQiH|FidC z?9(jURv`UX_&+gLRxJBKjsy1tXV1vd%uHGG&H~{7fE$0>1j+}o=QD53c~($)d$6SE_=k))1%>S_8re8X{0Ydw zLXegrezzdR`D(t$?>P9o)!u!OFa3YUoc|*}o@8Q)@gH%w_^qCqWjp)PR^z&AaLdn8}aZO8uSf~d|409ybEk{};o3|f62~Qr zUw%qP4M=kQf2$Ah7k|e8kbhji)njYVQjPKLV}FlvxxPQoKEC&O#{Nx?-7l2v^_}|^ z<{_~T;EeyX9Dw}bpIiJF$JU(Rn}snV`K;&M^t=z}ggEER`)WSMk`woRFLQza!rCq4 z^{7vk~%e$|= zD1V&%Q?32(K70@|@U&?M&}VSIf9d;+LPgZ@sTw(j$u_LOa9iXk} z`ak0UHvaOH98OPH@gIlNQsupcFS*x?>@q-kqMdFPd%YT?HH-YaG>fR1Z)%En5?$Ab ztL9ZQdZ6jMGKR>(zmV~#?Z>*`f8Lzy*6)3%PO83u{s8-5;{VyQ_mx~Q2H@BIdu1W| zbL9tk^!uj%Pm)2M8%gACB_#&BPd$##C#iQ3?v0y`U0I>*2*^i$Nmq@Y3GRlcjkXF@8=i()M3jGurKiR{j`0j z9pHV&0{Hg*%(wu`0LN;JuwGkW!h8kiDTuq)efpG*>xJq3AA0|fgTEj8Pg_ntQkT6E z*Yt_C$!|P^xdQidoHwv+z1REpZ(8p$Uaz2WzxqAamw%74^a|uJIj)k5CF9&5bH7;o zza0CY3;taH9oj8Xt^d=1Qu@d;5D2)_=0AD=9g-Yh$!+&l-XG=$LVlR;t;3a_gDGRqf-f6aZgmpa8_E`a);g}urTreXj(HLvB(_B;4{;7=J~>_q#f zw_?wHS;fz$4J)V^8t$XMlqmuAq`qsLZ|*4wla#oszOZ-j_kurVfN_$Y5^G5!?56gg z=tBhxvCfH6*GevWPwXB1ec-QUfaAh$t?H}X8H}F_6zbNh0s1mijxC%u-kzo7|M`>w zm*N#=fc7Aeh;=q`H`|bl3^@4v#NV73%Hn0Vag(PWT~g=ysI!B=7yLE<%oxCM>CqbT zfB{0RYqwV6h-LIkULE{B@F(_+pJY7XsD3H(*r)+A_5L9NMURgjCX#CwE(UIF#lI1@&dGsxgNfWPe0JX-@>0d!v6k=dk3jC0IuoiHN8M8S#KTx z!T12qS){~Q5#;{#CI=4w7XH1GA`$=JMCH%mx@;g}Zm+8yf6iHRKDb$AMM2(IZ(|e( zf8bBur{8>c&(_DgUR=9WZ~I zf40c9S!N7~w*MaaU%jmZIQUKSqH>LVz>0s89WzWp8harXYi#GYf2-t8Kycn;d_Rj!6o3omzBoM50(ef&u1<%=8$?5`9GZfUs*BW@Ok{&|Cy`)Q>TIJnswjG zo}-85n^h~6Z6>zVW#xChG*vcj{aJP&K9DW{7w;2$#td)!ZI}GI?|1p|t@%opJnewS zf2f0h7JwIcbfNgaIvx2RVUPcdeO)U5-?_6Y|KA61%vJk-%>0jI<=bz+Quhy~o>w^{ z7eO8vo5}a7@4xKWto8>S$;ePLkj*~0ZH0&ZM=WPvwx9Ri_WuFL{(Fkc1>+CBC;nf2 z_L17(!~Cy@($Z9{zs~>3a@~d>b(G8#V9hb-#Gm^EvgefZ{!I4#g8Un_H_rGk zy9FpL{m+I!^gIXt>+`^WxBvKSyI|&;(>djGFHJwh!9P3tg|q*27WVWg`=606drur! zcAk5^nD<%l|6I3Wjk-?zu>Z{IZ1$gc()T+E-RC{-A7(yrjk8_9d5!V>wCT*}#(Z=$ zC$aQJqt$b>Fy^4VaPNY*-+yuJe*x`3{CDPg{^;F>%73GcXaBGF0BZm5>o1on|L+KL zLvxQXe^a6Z=Qy*@^#DJ{{L^o4c?-n0thMP;={g z3&eafm%w7|OXnU2XZ&wkf(y0(8Xx}t!-`M;BR_B7j2sVdsr{XL3{Rb<9DMW5=dy9@ zCV79+>@43;jSpd$F&&vC<608{^o|@b9}x>QazRb zb$IVYNB=DuC`|n6V`^9MFdMOm2XA;0WoR($F_yp14;^ zxD4*nSosR{|9iBpuj~Qs0_O&~|J&*R3)cVJ@%^igDFd7bW z&wlM<<^CZZWzy)r^7y?209-vi9`!{*2l<$=3Ccks9A1LGsw zHm(G}xfJ~FQ005mufEiYm@{`2e?!cUJ&(C=%>B$x{HJgGZ`Td-DXH--YTrEhNB{X! zC%rG-#GZEFwEg@|u{Mov@@DrP{m;sMqIuyi*-y5Muc~lwg0U0xY6KLa&Xk1|w1NA8 z?egt$?AU*s{kQXmcA#gQ2$ctbzoo%E3cBR+rAE4LESbB2b?=*!Bj1~+EI9c4z@K|& z@SE}GzHi6^yDlC4z2HyY zb#K`~IwjPUj`4v>ofB$F_ZG|pl4~E};O_b@j%x5OaoL8pHY^pA9rc-_I@hCl6Pw-)u~)p;{j{MHGq)06%TAUc8AgHx#Q zjuS`Zt8E+Pr8(23C+0TozOC)p!QaB4eSPPqwPY6dPMik+7^A~DogZj@+*G3o4?=w2V!_B1A#`2J3Vyn zocz51H~Ad+f4%ib`Fzt4G6ZWI+~exu6FT?tyw=U*v(&1Eg#795%qg-@?B$@PBmNFtx9vDB=H=h5v(N?{M(< zk^h_euke51t~~Mo<0SloQzmJhbC;*-Gnljw&$zGq=trolf1Ey9D5U?Er~aGxZx#oC z-|Ij5!T)&X8N~3Okz*(|&vkj=+-Y@>_m8HZ#u&o43@Dt=o|EILBFD~W%CXb}5Z=@8 z>pD32+X6rRjQ{f&|3l|b%i{SbogKdrzE3yv}iXY{*er`89qg zEED&=*Z~ux^RoT;UYWn)1$kl36nSawRC#gjlldaPGjq*kS+;X2e7;oSceVeg`~NKc zztge*1+@RP>D1|^@Bb;c-*8YmRXHe~s~wWnt50G-fQkDF+@Ck?xFlbDP&!sRC2nY0~-IQR*#on?>Ck~OIpgn4-*SOEz~>xKWr{v|GrX=!XEr_`cLKmJNReW z0nB&gy8k;b{U`n>f$wWGj!V1i56Zyk!%7a8ymJEcLucgo|qOd3aCbdVIAL<}Omm){$%2BfO&jWH0{)D#wYW$D!pJV^? z-v5`E{?oUj3>;27Ex!TtAE4L!fVtha^Zrrz13UJflC>L7!UmtlUO(UdAHR9zT$=1S z{)cQlyj3#WtH&R>9=11>2Do8dsg{=)cr4h zSu0;{SubCrT)oTDe}C~;`5oXxu^$aI+I`}vtlP6)zSwMHZ^wW9y@Q?cpAY@l>%OCg zbdm3OZBe#!^^Q#vNJM*2ytUr*Sm6&@ShZuLj2hBat!+E&KRNq<(lJm&fp?kL&sbKUQ|-?qxT%ignM0CL2DIO{*AFR0cdHEQjJmT8Y>SEm%o+P(9|LhrMBkV`axu^OlR!Ub zo2<5Z_5X2?yii0LV4MWw0r*>xgE}{rft?a$P=JuCE9%U;vkfZd!#nnD@8xFyZ$g`M zjQ=(Ex}=XpIpCg9#s%^BfC7sm%-{Y&8$A3yx13vTwc}6T6m|W-7HvG~(RNRsWIu;2 z^bSO_*)*%Y+1q8_*Z7ksa;JrTD#|oa zx^?c2M}d6}K8)H2s7mGIvaM`0+s?M_0+A<*N4?rb1v=b0>Tk7;?bG9cS~%VYV*6De z$bC}Gk5!}y{vX#i?PPB=j(31+gG}C-ePj;)1^R^^ts>d?n*7LnH&$n)?W^W=fjty1O93&dmQtcb&JensCJBH=e* zEe&tEIs?RVWAnt4K{5497}s5;;v#}9UYOXojrGdAqH+;Bui9zJ0LBEa;>ee9Wo(_R z4dlpr!^*FkW|e;BUA>f_jj9$Zk(EOvvPwugOIMZ9CAF@(!bpm$awY6Qaq57@3)n+f zQGq$ncJxYi89h@Xjh4~Z0r&F7fg$mqXki)f_$M?hCynctmB>oKp7>V|Ni*>enSyJE zt8!@ZxVjaMzHQ7tF;9jS(FfvUiGMkbe^(3tbgK+Z{Rj4}zta6I{7wC@8amKb1^8D9 zDIQn5Oc6!Z|7IaKD)BD{Vp#`zlS$nPWQwZ~?5l@LL>Bhc|4gO-)j}g&RYMI>aLjFC z{xhlwKiQ;S*`TJ8<&DJX3dI}MF0;9D9pw9}TQ-CCGoT3dj;RsGzTR&4iG2pK$MtPZ z>X*H;QJpdd4! z_p6Egp4&M-y*lfDr~!Yvgi*r!eyZhNm*`_&IQ0x4U2l}EW1b(>?CoNnZ`9{C%=6Xy z+-iX5`FefdYLIhoF~s4A5+Fw&9C=V2aP;ASq7R<-+VkAg-h1{3r*1Okx0uymq*~|2 z`^PcDX&HGvXt9jl=KYw5Xk1}7>=cmm3R(17N|H}Ud D7@41b From 5bb981659387318f43164508188fdc8ac9a54361 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 21 Nov 2025 14:05:02 +0300 Subject: [PATCH 03/31] =?UTF-8?q?=D0=9F=D0=9F=20=D0=BE=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20(=D0=BD=D0=B0=D0=B7=D0=BD-=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FILES/CSS/styleSheetMain.css | 11 +-- InstructorsAndTrainees/CMakeLists.txt | 4 ++ .../messanger/messangerwidget.ui | 6 +- .../messanger/tabdialogmessenger.cpp | 2 + .../tasks/ammtaskswidget.cpp | 19 +++-- .../tasks/fimtaskswidget.cpp | 2 +- InstructorsAndTrainees/tasks/listsubproc.cpp | 8 +-- .../tasks/subprocitemwidget.cpp | 40 +++++++++++ .../tasks/subprocitemwidget.h | 25 +++++++ .../tasks/subprocitemwidget.ui | 54 +++++++++++++++ .../tasks/tasktreepreparation.cpp | 36 ++++++---- .../tasks/tasktreepreparation.h | 4 +- .../InstructorsAndTraineesWidget_ru_RU.qm | Bin 22221 -> 22546 bytes .../InstructorsAndTraineesWidget_ru_RU.ts | 65 +++++++++++------- 14 files changed, 214 insertions(+), 62 deletions(-) create mode 100644 InstructorsAndTrainees/tasks/subprocitemwidget.cpp create mode 100644 InstructorsAndTrainees/tasks/subprocitemwidget.h create mode 100644 InstructorsAndTrainees/tasks/subprocitemwidget.ui diff --git a/FILES/CSS/styleSheetMain.css b/FILES/CSS/styleSheetMain.css index 2434ab2..675a54f 100644 --- a/FILES/CSS/styleSheetMain.css +++ b/FILES/CSS/styleSheetMain.css @@ -160,16 +160,17 @@ QTreeWidget::item { } /*Бранчи*/ QTreeWidget::branch:has-siblings:!adjoins-item { - border-image: url(:/resources/icons/vline.png) 0; - + border-image: url(:/resources/icons/vline.png) 0; } QTreeWidget::branch:has-siblings:adjoins-item { - border-image: url(:/resources/icons/branch-more.png) 0; - + border-image: url(:/resources/icons/branch-more.png) 0; } QTreeWidget::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/resources/icons/branch-end.png) 0; } +QTreeWidget#treeWidget_AMMforTrainee::branch:!has-children:!has-siblings:adjoins-item { + border-image: none; +} QTreeWidget::branch:closed:has-children:!has-siblings, QTreeWidget::branch:closed:has-children:has-siblings { border-image: none; @@ -294,7 +295,7 @@ QTabBar QToolButton { /* the scroll buttons are tool buttons */ QListWidget::item { /*padding: -5px;*/ } -QListWidget { +QListWidget#oneDialogMessenger { /*background: #ddeeff;*/ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index cf5c377..b1f98d9 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -128,6 +128,10 @@ add_library(InstructorsAndTrainees SHARED tasks/listsubproc.h tasks/listsubproc.ui + tasks/subprocitemwidget.cpp + tasks/subprocitemwidget.h + tasks/subprocitemwidget.ui + widgets/newversionwidget.cpp widgets/newversionwidget.h widgets/newversionwidget.ui diff --git a/InstructorsAndTrainees/messanger/messangerwidget.ui b/InstructorsAndTrainees/messanger/messangerwidget.ui index 04b4c7d..4c8a2a0 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.ui +++ b/InstructorsAndTrainees/messanger/messangerwidget.ui @@ -85,7 +85,7 @@ - :/resources/icons/circleGray.png + :/resources/icons/circleGray.png @@ -128,7 +128,7 @@ Send - + :/resources/icons/sendMsg.png:/resources/icons/sendMsg.png @@ -149,7 +149,7 @@ - + diff --git a/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp b/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp index b62f52b..2c1db93 100644 --- a/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp +++ b/InstructorsAndTrainees/messanger/tabdialogmessenger.cpp @@ -8,6 +8,8 @@ OneDialogMessenger::OneDialogMessenger(User userLocalGUI, User userRemote, QWidget *parent): QListWidget(parent) { + this->setObjectName("oneDialogMessenger"); + this->userLocalGUI = userLocalGUI; this->userRemote = userRemote; diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 9a842b1..f4c4d9d 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -25,11 +25,13 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre flOnlyActive(false), lastCurrentID(0) { - ui->setupUi(this); + ui->setupUi(this); qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); treeWidget = new QTreeWidget(); + if(type == TypeListTreeAMMFIM::listForTrainee) + treeWidget->setObjectName("treeWidget_AMMforTrainee"); ui->horizontalLayout_Tree->addWidget(treeWidget); //connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidgetItemClicked); @@ -39,8 +41,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre preparationTreeWidget(); threadPreparation = new QThread(); - taskTreePreparation = new TaskAMMFIMTreePreparation(type); - taskTreePreparation->moveToThread(threadPreparation); + taskTreePreparation = new TaskAMMFIMTreePreparation(type, treeWidget); + //taskTreePreparation->moveToThread(threadPreparation); threadPreparation->start(); threadPreparation->setPriority(QThread::HighestPriority); connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems); @@ -281,11 +283,14 @@ void AMMtasksWidget::loadTasksAMM(bool flRequestFirst) void AMMtasksWidget::slot_AMMlistItemsReady(QList listItems) { - //Обновление дерева - treeWidget->clear(); + if(type != TypeListTreeAMMFIM::listForTrainee) + { + //Обновление дерева + treeWidget->clear(); - for(QTreeWidgetItem * item : listItems) - treeWidget->addTopLevelItem(item); + for(QTreeWidgetItem * item : listItems) + treeWidget->addTopLevelItem(item); + } /* QTreeWidgetItem * item = treeWidget->topLevelItem(0); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 2afa32d..0b8e37a 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -38,7 +38,7 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre preparationTreeWidget(); threadPreparation = new QThread(); - taskTreePreparation = new TaskAMMFIMTreePreparation(type); + taskTreePreparation = new TaskAMMFIMTreePreparation(type, treeWidget); taskTreePreparation->moveToThread(threadPreparation); threadPreparation->start(); threadPreparation->setPriority(QThread::HighestPriority); diff --git a/InstructorsAndTrainees/tasks/listsubproc.cpp b/InstructorsAndTrainees/tasks/listsubproc.cpp index f1e047a..e26be0d 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.cpp +++ b/InstructorsAndTrainees/tasks/listsubproc.cpp @@ -152,8 +152,8 @@ void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) { QList list = connectorToServer->getListSubProcForDMCode(dmCode); - if(!list.count()) - on_btnAssign_clicked(); + /*if(!list.count()) + on_btnAssign_clicked();*/ for(SubProc subProc : list) { @@ -177,12 +177,12 @@ void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked); - item->setFlags(item->flags() ^ Qt::ItemIsEnabled); + //item->setFlags(item->flags() ^ Qt::ItemIsEnabled); #ifdef PROJECT_TYPE_DEBUG treeWidget->addTopLevelItem(item); #else - + item->setFlags(item->flags() ^ Qt::ItemIsEnabled); #endif } } diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp new file mode 100644 index 0000000..9e191b1 --- /dev/null +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp @@ -0,0 +1,40 @@ +#include "subprocitemwidget.h" +#include "ui_subprocitemwidget.h" + +SubProcItemWidget::SubProcItemWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::SubProcItemWidget) +{ + ui->setupUi(this); +} + +SubProcItemWidget::~SubProcItemWidget() +{ + delete ui; +} + +void SubProcItemWidget::setListSubProc(const QList &list) +{ + int totalHeight = 0; + + for (SubProc subProc : list) + {/*Подпроцедуры*/ + ui->listWidget->addItem(QString("* %1\n [%2]").arg(subProc.getTitle(), subProc.getDmCode())); + + //Делаем item невыделяемым + QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1); + item->setFlags(item->flags() ^ Qt::ItemIsSelectable); + } + + //Определяем минимальную высоту списка + for(int row = 0; row < ui->listWidget->count(); ++row) + { + totalHeight += ui->listWidget->sizeHintForRow(row); // Высота каждой строки + totalHeight += 10; + } + + // Добавляем отступы фрейма (рамки) + totalHeight += ui->listWidget->frameWidth() * 2; + + ui->listWidget->setMaximumHeight(totalHeight); +} diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.h b/InstructorsAndTrainees/tasks/subprocitemwidget.h new file mode 100644 index 0000000..bec2fe5 --- /dev/null +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.h @@ -0,0 +1,25 @@ +#ifndef SUBPROCITEMWIDGET_H +#define SUBPROCITEMWIDGET_H + +#include +#include "module.h" + +namespace Ui { +class SubProcItemWidget; +} + +class SubProcItemWidget : public QWidget +{ + Q_OBJECT + +public: + explicit SubProcItemWidget(QWidget *parent = nullptr); + ~SubProcItemWidget(); + + void setListSubProc(const QList& list); + +private: + Ui::SubProcItemWidget *ui; +}; + +#endif // SUBPROCITEMWIDGET_H diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.ui b/InstructorsAndTrainees/tasks/subprocitemwidget.ui new file mode 100644 index 0000000..6dd1583 --- /dev/null +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.ui @@ -0,0 +1,54 @@ + + + SubProcItemWidget + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + Form + + + + + + + + Subprocedures allowed to be run by the trainee in automatic mode: + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Sunken + + + + + + + + + + diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index e6cb82d..b6943bd 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -1,12 +1,16 @@ #include #include #include "tasktreepreparation.h" +#include "subprocitemwidget.h" + +#include -TaskAMMFIMTreePreparation::TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QObject *parent) : +TaskAMMFIMTreePreparation::TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QTreeWidget* treeWidget, QObject *parent) : QObject(parent), flagStop(false), - type(type) + type(type), + treeWidget(treeWidget) { qDebug() << "TaskAMMFIMTreePreparation init thread ID " << QThread::currentThreadId(); } @@ -477,6 +481,9 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListclear(); + mtxAccess.lock(); this->listTasksAMM = listTasks; @@ -491,6 +498,9 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListaddTopLevelItem(item); + item->setIcon(0, QIcon(":/resources/icons/procedure.png")); item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text); @@ -520,26 +530,22 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetToolTip(0, text); + if(type == TypeListTreeAMMFIM::listForTrainee) { - for (int j = 0; j < task.listSubProc.count(); j++) - {/*Подпроцедуры*/ - SubProc subProc = task.listSubProc.at(j); - + //Подпроцедуры + if(task.listSubProc.count()) + { QTreeWidgetItem* itemSubProc = new QTreeWidgetItem(); + itemSubProc->setFlags(itemSubProc->flags() ^ Qt::ItemIsSelectable); - itemSubProc->setText(ColumnsTreeAMM::clmnAMM_PMorDM, subProc.getTitle()); - - itemSubProc->setIcon(ColumnsTreeAMM::clmnAMM_PMorDM, QIcon(":/resources/icons/link.png")); - itemSubProc->setToolTip(ColumnsTreeAMM::clmnAMM_PMorDM, subProc.getTitle()); - - itemSubProc->setText(ColumnsTreeAMM::clmnAMM_code, subProc.getDmCode()); - - itemSubProc->setText(ColumnsTreeAMM::clmnAMM_canplay, subProc.getModeListStr()); + SubProcItemWidget* itemWidget = new SubProcItemWidget(); + itemWidget->setListSubProc(task.listSubProc); + //itemWidget->setAutoFillBackground(true); item->addChild(itemSubProc); + treeWidget->setItemWidget(itemSubProc, 0, itemWidget); } - } listItemsAll.append(item); diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index dd2ec0c..81f3309 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -36,7 +36,7 @@ class TaskAMMFIMTreePreparation : public QObject { Q_OBJECT public: - explicit TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QObject *parent = nullptr); + explicit TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QTreeWidget* treeWidget, QObject *parent = nullptr); ~TaskAMMFIMTreePreparation(); public: @@ -83,6 +83,8 @@ private: QMutex mtxAccess; int countItems = 0; + + QTreeWidget* treeWidget; }; #endif // TASKTREEPREPARATION_H diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm index e706762e40778e2c53bfc315e03c69b0d7776fe0..eaf4dafc2ecd00f686fced9a99386ea7ccd8910d 100644 GIT binary patch delta 539 zcmX@RmT}Ss#t9;f6DEr4N%`z!U|@}AU~oOjz`*X$z+j;Pp*?0zjMekJaU?>5KbNqtP9`Ote^+0)x5D4vYc;eMGDYp;? zmTSEX3_h+9+CL0J2PjPTWt_(3r#AU1qaTw`^<-0~JSD#f#zZEd5kkip>r_-27(}=k zm%n3TU=Z(OJbva01B36($w!&gqSc4hWs^7ffLmH8f%hwS81mM|vIRg=%M=qdR>=ICgVVqoyps&$K>^X@?2IoEx)~-uNN%x<7%z zlsK7}t&GWQ-Q-p_H7;Lo?tkTc3=G~KleeQRx9ay|sOc@k_v;m7b zkThlS0AgDfJD`{mP|hBx#u~`?pX{I|&TPZtJUPnIn$HnvcmdGx)RfYq)Z)oI94&+} L?c4m;_W=h0G`yBk delta 367 zcmbQVf${8G#t9;f4HHH6q`W&B7+9kj7+g;>FtGbGFj#0nX!q2Kv3g#<=NTBh?lLeq z$UZaw}!TEa80-($NAhcTumxQGP z1B2-*2<=qCWuyC(fx%N}vMgH}lV|1RscdRoK4RSe%K3m{5Удалить - + actual актуально - + update required требуется обновление - - + + DM code DM код - - + + ID ID - - + + Procedure AMM Процедура AMM - - + + Canplay Режимы - - + + Status Статус - + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + Assign this task? Назначить эту задачу? @@ -1199,33 +1199,46 @@ Delete it anyway? Хорошо + + SubProcItemWidget + + + Form + Форма + + + + Subprocedures allowed to be run by the trainee in automatic mode: + Подпроцедуры, которые разрешено выполнять обучаемому в автоматическом режиме: + + TaskAMMFIMTreePreparation - - - + + + completed выполнена - - - + + + failed неверно - - - + + + checkup на проверке - - - + + + new новая From 394eee5a16cd8d74daabb7804655a0dc629173cf Mon Sep 17 00:00:00 2001 From: krivoshein Date: Sat, 22 Nov 2025 22:08:03 +0300 Subject: [PATCH 04/31] =?UTF-8?q?=D0=9E=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=8F=D1=87=D0=B5=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 101 +++++++++++------- InstructorsAndTrainees/tasks/ammtaskswidget.h | 8 ++ .../tasks/customdelegate.cpp | 41 +++++++ InstructorsAndTrainees/tasks/customdelegate.h | 31 ++++++ .../tasks/dialoglistsubproc.cpp | 4 +- .../tasks/dialoglistsubproc.h | 2 +- InstructorsAndTrainees/tasks/listsubproc.cpp | 96 ++++++----------- InstructorsAndTrainees/tasks/listsubproc.h | 9 +- .../tasks/subprocitemwidget.cpp | 2 +- .../tasks/subprocitemwidget.ui | 2 +- .../tasks/tasktreepreparation.cpp | 12 ++- 11 files changed, 190 insertions(+), 118 deletions(-) create mode 100644 InstructorsAndTrainees/tasks/customdelegate.cpp create mode 100644 InstructorsAndTrainees/tasks/customdelegate.h diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f4c4d9d..e2137ae 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -50,6 +50,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady); connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation); + connect(this->connectorToServer, &ConnectorToServer::signal_UpdateSubProcForDMCode, this, &AMMtasksWidget::slot_UpdateSubProcForDMCode); + waitAnimationWidget = new WaitAnimationWidget; QMovie *movie = new QMovie(":/resources/icons/762.gif"); waitAnimationWidget->setParent(this); @@ -68,12 +70,6 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre if(type == TypeListTreeAMMFIM::listCommon) { - //ui->horizontalLayout_3->addWidget(ui->btnAssignTask); - //ui->horizontalLayout_3->addWidget(ui->btnOnlyActive); - //ui->horizontalLayout_3->addWidget(ui->btnCheck); - //ui->horizontalLayout_3->addWidget(ui->btnDelete); - //ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft); - ui->btnDelete->setVisible(false); ui->btnCheck->setVisible(false); } @@ -85,12 +81,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre ui->label_DocsActualed->setVisible(false); ui->label_Actual->setVisible(false); ui->btnDocsUpdating->setVisible(false); - - //ui->verticalLayout->setAlignment(Qt::AlignmentFlag::AlignBottom); - //ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft); } - - //ui->btnCheck->setVisible(false); } AMMtasksWidget::~AMMtasksWidget() @@ -306,6 +297,58 @@ void AMMtasksWidget::slot_AMMlistItemsReady(QList listItems) ui->btnOnlyActive->setEnabled(true); } +void AMMtasksWidget::slot_UpdateSubProcForDMCode(QString dmCode) +{ + if(lastSelectedTask.ammProcedure.dmCode == dmCode) + {//Его ждем + QList list = connectorToServer->getListSubProcForDMCode(dmCode); + lastSelectedTask.listSubProc = list; + + waitAnimationWidget->hideWithStop(); + + if(lastSelectedTask.listSubProc.count()) + { + dlgListSubProc = new DialogListSubProc(this); + dlgListSubProc->setTask(&lastSelectedTask); + + switch( dlgListSubProc->exec() ) + { + case QDialog::Accepted: + { + //Здесь нужно забрать список отмеченных подпроцедур + lastSelectedTask.listSubProc.clear(); + dlgListSubProc->getListCheckedSubProc(&lastSelectedTask.listSubProc); + + if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &lastSelectedTask); + } + break; + } + case QDialog::Rejected: + break; + default: + break; + } + + if(dlgListSubProc) + { + delete dlgListSubProc; + dlgListSubProc = nullptr; + } + } + else + { + lastSelectedTask.listSubProc.clear(); + + if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &lastSelectedTask); + } + } + } +} + void AMMtasksWidget::preparationTreeWidget() { treeWidget->setColumnCount(clmnAMM_count); @@ -409,46 +452,24 @@ void AMMtasksWidget::assignTaskAMMtoTrainee() if(taskNew.getID()) { - //QList listSubProc; - if(selectSubProcForAssignTaskAMM(taskNew, &taskNew.listSubProc)) - { - if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) - { - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &taskNew); - } - } + {} } } bool AMMtasksWidget::selectSubProcForAssignTaskAMM(TaskAmmFim taskNew, QList* listSubProc) { - bool result = false; + lastSelectedTask = taskNew; - dlgListSubProc = new DialogListSubProc(connectorToServer, this); - dlgListSubProc->setTask(&taskNew); + waitAnimationWidget->showWithPlay(); - switch( dlgListSubProc->exec() ) + if(! connectorToServer->sendQueryListSubProc(lastSelectedTask.ammProcedure.dmCode)) { - case QDialog::Accepted: - { - //Здесь нужно забрать список отмеченных подпроцедур - result = dlgListSubProc->getListCheckedSubProc(listSubProc); - break; - } - case QDialog::Rejected: - break; - default: - break; + waitAnimationWidget->hideWithStop(); + return false; } - if(dlgListSubProc) - { - delete dlgListSubProc; - dlgListSubProc = nullptr; - } - - return result; + return true; } void AMMtasksWidget::setCurrentTask(int id) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index be4bb2f..fec33b6 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -79,6 +79,8 @@ Q_SIGNALS: public Q_SLOTS: void slot_AMMlistItemsReady(QList listItems); +public slots: + void slot_UpdateSubProcForDMCode(QString dmCode); private: Ui::AMMtasksWidget *ui; @@ -100,6 +102,12 @@ private: bool flOnlyActive; //AMM int lastCurrentID; + + TaskAmmFim lastSelectedTask; + + CustomDelegate* delegate; + + QStyle* style; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/customdelegate.cpp b/InstructorsAndTrainees/tasks/customdelegate.cpp new file mode 100644 index 0000000..0d48db3 --- /dev/null +++ b/InstructorsAndTrainees/tasks/customdelegate.cpp @@ -0,0 +1,41 @@ +#include "customdelegate.h" + +CustomDelegate::CustomDelegate(QObject *parent): + QItemDelegate(parent) +{ + +} + +void CustomDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + bool mergeCell = index.data(UserRole_MergeCell).toBool(); + + if (mergeCell && index.column() == 0) + { + QModelIndex nextColumnIndex = index.siblingAtColumn(index.column() + 1); + if (!nextColumnIndex.isValid()) + { + QItemDelegate::paint(painter, option, index); + return; + } + + QRect mergedRect(option.rect.x(), + option.rect.y(), + option.rect.width() * 2, + option.rect.height()); + + painter->save(); + painter->setClipRect(mergedRect); + drawBackground(painter, option, index); + drawDisplay(painter, option, mergedRect, index.data(Qt::DisplayRole).toString()); + + painter->restore(); + } else { + QItemDelegate::paint(painter, option, index); + } +} + +QSize CustomDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + return QItemDelegate::sizeHint(option, index); +} diff --git a/InstructorsAndTrainees/tasks/customdelegate.h b/InstructorsAndTrainees/tasks/customdelegate.h new file mode 100644 index 0000000..7c63e13 --- /dev/null +++ b/InstructorsAndTrainees/tasks/customdelegate.h @@ -0,0 +1,31 @@ +#ifndef CUSTOMDELEGATE_H +#define CUSTOMDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include + +enum UserRoles { + UserRole_MergeCell = Qt::UserRole + 1 // Пользовательская роль для хранения признака объединения +}; + +class CustomDelegate : public QItemDelegate +{ +public: + //using QStyledItemDelegate::QStyledItemDelegate; + + CustomDelegate(QObject *parent = nullptr); + + void paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + QSize sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const override; +}; + +#endif // CUSTOMDELEGATE_H diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp index 4c9ec42..d9ee0ec 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp @@ -1,7 +1,7 @@ #include #include "dialoglistsubproc.h" -DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : +DialogListSubProc::DialogListSubProc(QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowMaximizeButtonHint @@ -9,7 +9,7 @@ DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidg | Qt::WindowCloseButtonHint), listSubProcCtrl(nullptr) { - listSubProcCtrl = new ListSubProc(connectorToServer, this); + listSubProcCtrl = new ListSubProc(this); connect(listSubProcCtrl, &ListSubProc::signal_Accepted, this, &DialogListSubProc::slot_Accepted); QHBoxLayout *layout = new QHBoxLayout(this); diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.h b/InstructorsAndTrainees/tasks/dialoglistsubproc.h index 4951108..57e0941 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.h +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.h @@ -11,7 +11,7 @@ class DialogListSubProc : public QDialog { Q_OBJECT public: - DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + DialogListSubProc(QWidget *parent = nullptr); ~DialogListSubProc(); void closeEvent(QCloseEvent *event) override; diff --git a/InstructorsAndTrainees/tasks/listsubproc.cpp b/InstructorsAndTrainees/tasks/listsubproc.cpp index e26be0d..e627391 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.cpp +++ b/InstructorsAndTrainees/tasks/listsubproc.cpp @@ -2,11 +2,9 @@ #include "listsubproc.h" #include "ui_listsubproc.h" -ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : +ListSubProc::ListSubProc(QWidget *parent) : QWidget(parent), ui(new Ui::ListSubProc), - connectorToServer(connectorToServer), - waitAnimationWidget(nullptr), treeWidget(nullptr) { ui->setupUi(this); @@ -17,19 +15,10 @@ ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) ui->horizontalLayout_Tree->addWidget(treeWidget); preparationTreeWidget(); - - waitAnimationWidget = new WaitAnimationWidget; - QMovie *movie = new QMovie(":/resources/icons/762.gif"); - waitAnimationWidget->setParent(this); - waitAnimationWidget->initialize(movie,this); - - connect(this->connectorToServer, &ConnectorToServer::signal_UpdateSubProcForDMCode, this, &ListSubProc::slot_UpdateSubProcForDMCode); } ListSubProc::~ListSubProc() { - waitAnimationWidget->hideWithStop(); - delete waitAnimationWidget; delete treeWidget; delete ui; } @@ -42,9 +31,6 @@ void ListSubProc::closeEvent(QCloseEvent *event) void ListSubProc::resizeEvent(QResizeEvent *event) { setWidthColumnsTree(); - - QSize size = event->size(); - waitAnimationWidget->resize(size); } void ListSubProc::changeEvent(QEvent *event) @@ -65,10 +51,39 @@ void ListSubProc::setTask(TaskAmmFim *task) ui->lbl_Title->setText(task->ammProcedure.title); ui->lbl_DMCode->setText(task->ammProcedure.dmCode); - waitAnimationWidget->showWithPlay(); + QList list = task->listSubProc; - if(! connectorToServer->sendQueryListSubProc(this->task.ammProcedure.dmCode)) - waitAnimationWidget->hideWithStop(); + for(SubProc subProc : list) + { + QTreeWidgetItem* item = new QTreeWidgetItem(treeWidget); + //item->setIcon(0, QIcon(":/resources/icons/link.png")); + item->setText(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle()); + item->setText(ColumnsTreeSubProc::clmnSP_code, subProc.getDmCode()); + item->setText(ColumnsTreeSubProc::clmnSP_canplay, subProc.getModeListStr()); + item->setToolTip(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle()); + + ModeList modeList = subProc.getModeList(); + if(modeList.autoM && (modeList.demo || modeList.train || modeList.exam)) + { + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Checked); + + treeWidget->addTopLevelItem(item); + } + else + { + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked); + + //item->setFlags(item->flags() ^ Qt::ItemIsEnabled); + +#ifdef PROJECT_TYPE_DEBUG + treeWidget->addTopLevelItem(item); +#else + item->setFlags(item->flags() ^ Qt::ItemIsEnabled); +#endif + } + } } bool ListSubProc::getListCheckedSubProc(QList* listSubProc) @@ -146,51 +161,6 @@ int ListSubProc::calculateWidth_0Column() return width0Column; } -void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) -{ - if(this->task.ammProcedure.dmCode == dmCode) - { - QList list = connectorToServer->getListSubProcForDMCode(dmCode); - - /*if(!list.count()) - on_btnAssign_clicked();*/ - - for(SubProc subProc : list) - { - QTreeWidgetItem* item = new QTreeWidgetItem(treeWidget); - //item->setIcon(0, QIcon(":/resources/icons/link.png")); - item->setText(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle()); - item->setText(ColumnsTreeSubProc::clmnSP_code, subProc.getDmCode()); - item->setText(ColumnsTreeSubProc::clmnSP_canplay, subProc.getModeListStr()); - item->setToolTip(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle()); - - ModeList modeList = subProc.getModeList(); - if(modeList.autoM && (modeList.demo || modeList.train || modeList.exam)) - { - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Checked); - - treeWidget->addTopLevelItem(item); - } - else - { - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked); - - //item->setFlags(item->flags() ^ Qt::ItemIsEnabled); - -#ifdef PROJECT_TYPE_DEBUG - treeWidget->addTopLevelItem(item); -#else - item->setFlags(item->flags() ^ Qt::ItemIsEnabled); -#endif - } - } - - waitAnimationWidget->hideWithStop(); - } -} - void ListSubProc::on_btnAssign_clicked() { emit signal_Accepted(); diff --git a/InstructorsAndTrainees/tasks/listsubproc.h b/InstructorsAndTrainees/tasks/listsubproc.h index e78b684..0b43e5e 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.h +++ b/InstructorsAndTrainees/tasks/listsubproc.h @@ -22,7 +22,7 @@ class ListSubProc : public QWidget Q_OBJECT public: - explicit ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + explicit ListSubProc(QWidget *parent = nullptr); ~ListSubProc(); void closeEvent(QCloseEvent *event) override; @@ -38,9 +38,6 @@ private: void setWidthColumnsTree(); int calculateWidth_0Column(); -public slots: - void slot_UpdateSubProcForDMCode(QString dmCode); - private slots: void on_btnAssign_clicked(); @@ -50,12 +47,8 @@ signals: private: Ui::ListSubProc *ui; - ConnectorToServer* connectorToServer; - TaskAmmFim task; - WaitAnimationWidget *waitAnimationWidget; - QTreeWidget* treeWidget; QList listWidthColumn; }; diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp index 9e191b1..4569bc2 100644 --- a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp @@ -19,7 +19,7 @@ void SubProcItemWidget::setListSubProc(const QList &list) for (SubProc subProc : list) {/*Подпроцедуры*/ - ui->listWidget->addItem(QString("* %1\n [%2]").arg(subProc.getTitle(), subProc.getDmCode())); + ui->listWidget->addItem(QString("- %1 [%2]").arg(subProc.getTitle(), subProc.getDmCode())); //Делаем item невыделяемым QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1); diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.ui b/InstructorsAndTrainees/tasks/subprocitemwidget.ui index 6dd1583..827d0fb 100644 --- a/InstructorsAndTrainees/tasks/subprocitemwidget.ui +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 700 300 diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index b6943bd..cc6040b 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -497,10 +497,14 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetData(0, UserRole_MergeCell, false); treeWidget->addTopLevelItem(item); + //treeWidget->setFirstItemColumnSpanned(item, true); + item->setIcon(0, QIcon(":/resources/icons/procedure.png")); item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text); @@ -543,9 +547,13 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetListSubProc(task.listSubProc); //itemWidget->setAutoFillBackground(true); + //itemSubProc->setData(0, UserRole_MergeCell, true); + item->addChild(itemSubProc); treeWidget->setItemWidget(itemSubProc, 0, itemWidget); - } + + itemSubProc->setFirstColumnSpanned(true); + } } listItemsAll.append(item); From 72d107308c9b664f929702898aa2a2fdb5377709 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Sat, 22 Nov 2025 23:40:24 +0300 Subject: [PATCH 05/31] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 24 +++++++---- InstructorsAndTrainees/tasks/ammtaskswidget.h | 4 -- .../tasks/customdelegate.cpp | 41 ------------------- InstructorsAndTrainees/tasks/customdelegate.h | 31 -------------- .../tasks/tasktreepreparation.cpp | 9 +--- 5 files changed, 17 insertions(+), 92 deletions(-) delete mode 100644 InstructorsAndTrainees/tasks/customdelegate.cpp delete mode 100644 InstructorsAndTrainees/tasks/customdelegate.h diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index e2137ae..f66b0d9 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -34,17 +34,20 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre treeWidget->setObjectName("treeWidget_AMMforTrainee"); ui->horizontalLayout_Tree->addWidget(treeWidget); - //connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidgetItemClicked); connect(treeWidget, &QTreeWidget::itemClicked, this, &AMMtasksWidget::on_treeWidgetItemClicked); connect(treeWidget, &QTreeWidget::itemDoubleClicked, this, &AMMtasksWidget::on_treeWidgetDoubleClicked); preparationTreeWidget(); - threadPreparation = new QThread(); taskTreePreparation = new TaskAMMFIMTreePreparation(type, treeWidget); - //taskTreePreparation->moveToThread(threadPreparation); - threadPreparation->start(); - threadPreparation->setPriority(QThread::HighestPriority); + if(type == TypeListTreeAMMFIM::listCommon) + { + threadPreparation = new QThread(); + taskTreePreparation->moveToThread(threadPreparation); + threadPreparation->start(); + threadPreparation->setPriority(QThread::HighestPriority); + } + connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems); connect(this, &AMMtasksWidget::signal_prepareAMMListItemsForTrainee, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee); connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady); @@ -89,10 +92,14 @@ AMMtasksWidget::~AMMtasksWidget() waitAnimationWidget->hideWithStop(); emit signal_stopParserPreparation(); - threadPreparation->quit(); - threadPreparation->wait(); - delete threadPreparation; + if(type == TypeListTreeAMMFIM::listCommon) + { + threadPreparation->quit(); + threadPreparation->wait(); + + delete threadPreparation; + } delete taskTreePreparation; delete waitAnimationWidget; @@ -266,7 +273,6 @@ void AMMtasksWidget::loadTasksAMM(bool flRequestFirst) QByteArray arrayAMM; - //if(flRequestFirst) arrayAMM = connectorToServer->getListTaskAmmArray(); emit signal_prepareAMMListItems(arrayAMM, flOnlyActive, flRequestFirst); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index fec33b6..dcc6566 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -104,10 +104,6 @@ private: int lastCurrentID; TaskAmmFim lastSelectedTask; - - CustomDelegate* delegate; - - QStyle* style; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/customdelegate.cpp b/InstructorsAndTrainees/tasks/customdelegate.cpp deleted file mode 100644 index 0d48db3..0000000 --- a/InstructorsAndTrainees/tasks/customdelegate.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "customdelegate.h" - -CustomDelegate::CustomDelegate(QObject *parent): - QItemDelegate(parent) -{ - -} - -void CustomDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - bool mergeCell = index.data(UserRole_MergeCell).toBool(); - - if (mergeCell && index.column() == 0) - { - QModelIndex nextColumnIndex = index.siblingAtColumn(index.column() + 1); - if (!nextColumnIndex.isValid()) - { - QItemDelegate::paint(painter, option, index); - return; - } - - QRect mergedRect(option.rect.x(), - option.rect.y(), - option.rect.width() * 2, - option.rect.height()); - - painter->save(); - painter->setClipRect(mergedRect); - drawBackground(painter, option, index); - drawDisplay(painter, option, mergedRect, index.data(Qt::DisplayRole).toString()); - - painter->restore(); - } else { - QItemDelegate::paint(painter, option, index); - } -} - -QSize CustomDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - return QItemDelegate::sizeHint(option, index); -} diff --git a/InstructorsAndTrainees/tasks/customdelegate.h b/InstructorsAndTrainees/tasks/customdelegate.h deleted file mode 100644 index 7c63e13..0000000 --- a/InstructorsAndTrainees/tasks/customdelegate.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef CUSTOMDELEGATE_H -#define CUSTOMDELEGATE_H - -#include -#include -#include -#include -#include -#include -#include - -enum UserRoles { - UserRole_MergeCell = Qt::UserRole + 1 // Пользовательская роль для хранения признака объединения -}; - -class CustomDelegate : public QItemDelegate -{ -public: - //using QStyledItemDelegate::QStyledItemDelegate; - - CustomDelegate(QObject *parent = nullptr); - - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override; - - QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const override; -}; - -#endif // CUSTOMDELEGATE_H diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index cc6040b..1d68253 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -499,12 +499,8 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetData(0, UserRole_MergeCell, false); - treeWidget->addTopLevelItem(item); - //treeWidget->setFirstItemColumnSpanned(item, true); - item->setIcon(0, QIcon(":/resources/icons/procedure.png")); item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text); @@ -545,13 +541,12 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetListSubProc(task.listSubProc); - //itemWidget->setAutoFillBackground(true); - - //itemSubProc->setData(0, UserRole_MergeCell, true); + itemWidget->setAutoFillBackground(true); item->addChild(itemSubProc); treeWidget->setItemWidget(itemSubProc, 0, itemWidget); + //Объединение всех ячеек itemSubProc->setFirstColumnSpanned(true); } } From b6c0f6aa572bdb8b2e5fa65c03a06c66dd71cc28 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Sun, 23 Nov 2025 00:11:47 +0300 Subject: [PATCH 06/31] =?UTF-8?q?=D0=9A=D1=80=D1=83=D1=82=D0=B8=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=B5=20=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/Андрей/Board.md | 14 ++++---------- DOCS/Андрей/Без названия.canvas | 2 +- InstructorsAndTrainees/CMakeLists.txt | 1 + .../widgets/waitanimationwidget.h | 3 ++- ServerLMS/CMakeLists.txt | 1 + ServerLMS/serverlmswidget.cpp | 19 +++++++++++++++++++ ServerLMS/serverlmswidget.h | 8 +++++++- TrayServerLMS/CMakeLists.txt | 1 + 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/DOCS/Андрей/Board.md b/DOCS/Андрей/Board.md index cc6fd77..1bff4ac 100644 --- a/DOCS/Андрей/Board.md +++ b/DOCS/Андрей/Board.md @@ -11,6 +11,8 @@ kanban-plugin: board ## Completed +- [ ] Переобновление docs.xml в пределах версии (если инструктор изменяет процедуры) +- [ ] Реализовать механизм отображения и выбора подпроцедур для АММ. - [ ] Создание БД из кода (если нет или слетела) - [ ] Сервер при сворачивании превращается в трей - [ ] Пароли хранить и пересылать в виде Хеша @@ -50,7 +52,6 @@ kanban-plugin: board ## Server -- [ ] Кнопки Восстановить и Проверить&Восстановить расширить - [ ] Логин суперпользователя PostgreSQL предлагать по умолчанию postgres - [ ] Отходить от идентификации по Логину в пользу ID юзера везде, где это возможно. (Так как сейчас может вызвать проблемы при смене логина юзера!!!) @@ -73,21 +74,14 @@ kanban-plugin: board ## GUI общие - [ ] Текстовый поиск в задачах -- [ ] Сделать кнопку перезапроса общих списков АММ и FIM +- [ ] Сделать кнопку перезапроса общих списков FIM (по аналогии с АММ) - [ ] Сделать несколько попыток подключения к серверу -## Сервер+GUI - -- [ ] Расширить диалог Авторизации -- [ ] Реализовать механизм отображения и выбора подпроцедур для АММ. -- [ ] Переобновление docs.xml в пределах версии (если инструктор изменяет процедуры) - - %% kanban:settings ``` -{"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false]} +{"kanban-plugin":"board","list-collapse":[false,false,false,false,false]} ``` %% \ No newline at end of file diff --git a/DOCS/Андрей/Без названия.canvas b/DOCS/Андрей/Без названия.canvas index 74862a0..6cb7d12 100644 --- a/DOCS/Андрей/Без названия.canvas +++ b/DOCS/Андрей/Без названия.canvas @@ -1,6 +1,6 @@ { "nodes":[ - {"id":"3e71087c4a5247a0","x":-1134,"y":-740,"width":1494,"height":808,"type":"file","file":"DBschem.png"} + {"id":"3e71087c4a5247a0","type":"file","file":"DBschem.png","x":-1134,"y":-740,"width":1494,"height":808} ], "edges":[] } \ No newline at end of file diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index b1f98d9..f5a00aa 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -159,6 +159,7 @@ target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_ target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/messanger) target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/settings) target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/specialmessagebox) +target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/widgets) target_compile_definitions(InstructorsAndTrainees PRIVATE INSTRUCTORSANDTRAINEES_LIBRARY) diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.h b/InstructorsAndTrainees/widgets/waitanimationwidget.h index 827ee99..e826745 100644 --- a/InstructorsAndTrainees/widgets/waitanimationwidget.h +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.h @@ -3,12 +3,13 @@ #include #include +#include "instructorsAndTrainees_global.h" namespace Ui { class WaitAnimationWidget; } -class WaitAnimationWidget : public QWidget +class INSTRUCTORSANDTRAINEES_EXPORT WaitAnimationWidget : public QWidget { Q_OBJECT diff --git a/ServerLMS/CMakeLists.txt b/ServerLMS/CMakeLists.txt index 26ce472..bc2d524 100644 --- a/ServerLMS/CMakeLists.txt +++ b/ServerLMS/CMakeLists.txt @@ -86,6 +86,7 @@ target_link_libraries(ServerLMS PRIVATE libDataBaseLMS.dll) target_include_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees) target_include_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/authorization) target_include_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/tasks) +target_include_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) if(PROJECT_TYPE_DEBUG) target_link_directories(ServerLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees) else() diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index c10cf35..ef4bbf3 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -16,6 +16,7 @@ const QString ServerLMSWidget::languageRUS = "ru_RU"; ServerLMSWidget::ServerLMSWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ServerLMSWidget), + waitAnimationWidget(nullptr), server(nullptr), updateThread(nullptr), loggerThread(nullptr), @@ -42,6 +43,13 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : updateMyStyleSheet(); setLanguageInterfase(); + + waitAnimationWidget = new WaitAnimationWidget; + QMovie *movie = new QMovie(":/resources/icons/762.gif"); + waitAnimationWidget->setParent(this); + waitAnimationWidget->initialize(movie,this); + + waitAnimationWidget->showWithPlay(); } ServerLMSWidget::~ServerLMSWidget() @@ -72,6 +80,9 @@ ServerLMSWidget::~ServerLMSWidget() delete providerDBLMS; } + waitAnimationWidget->hideWithStop(); + delete waitAnimationWidget; + delete ui; } @@ -86,6 +97,12 @@ void ServerLMSWidget::changeEvent(QEvent *event) } } +void ServerLMSWidget::resizeEvent(QResizeEvent *event) +{ + QSize size = event->size(); + waitAnimationWidget->resize(size); +} + void ServerLMSWidget::slot_UpdateListClients() { //Очищаем список @@ -131,6 +148,8 @@ void ServerLMSWidget::start() if(hasError() == 100) return; tryConnectionToDB(); + + waitAnimationWidget->hideWithStop(); } void ServerLMSWidget::slot_BlockAutorization(bool block) diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index 4c81cd7..b1eec18 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -28,6 +28,10 @@ #include "providerdblms.h" #include "docsupdater.h" +#include "waitanimationwidget.h" + + + namespace Ui { class ServerLMSWidget; @@ -64,6 +68,8 @@ protected: // В нём будет производиться проверка события смены перевода приложения void changeEvent(QEvent * event) override; + void resizeEvent(QResizeEvent *event) override; + signals: //сигнал смены языка void signal_LanguageChanged(QString language); @@ -139,7 +145,7 @@ private: Ui::ServerLMSWidget *ui; private: - //WaitAnimationWidget *waitAnimationWidget; + WaitAnimationWidget *waitAnimationWidget; MultiThreadServer *server; QThread *updateThread; diff --git a/TrayServerLMS/CMakeLists.txt b/TrayServerLMS/CMakeLists.txt index 04881da..ba9ead2 100644 --- a/TrayServerLMS/CMakeLists.txt +++ b/TrayServerLMS/CMakeLists.txt @@ -37,3 +37,4 @@ target_link_libraries(TrayServerLMS PRIVATE libServerLMS.dll) target_include_directories(TrayServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees) target_include_directories(TrayServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/tasks) +target_include_directories(TrayServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) From 770a705281dec6fc129533a19c525a2456d54901 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 10:30:20 +0300 Subject: [PATCH 07/31] =?UTF-8?q?Server.=20=D0=9D=D0=B0=D1=87=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9A=D1=80=D1=83=D1=82=D0=B8=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/MainScheme.md | 585 ++++++++++++------------- ServerLMS/Systems/updatecontroller.cpp | 2 + ServerLMS/Systems/updatecontroller.h | 2 + ServerLMS/serverlmswidget.cpp | 45 +- ServerLMS/serverlmswidget.h | 6 +- 5 files changed, 328 insertions(+), 312 deletions(-) diff --git a/DOCS/MainScheme.md b/DOCS/MainScheme.md index e2ec2ff..02be336 100644 --- a/DOCS/MainScheme.md +++ b/DOCS/MainScheme.md @@ -95,6 +95,7 @@ LoggerThread: UpdateThread: *updateController *assetsManager +*docsUpdater ^ZvWgIkFz @@ -317,588 +318,582 @@ SEND DOCS ^iM67vAqM %% ## Drawing ```compressed-json -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= +qe72Dvod98eayYiSvj0zYz17/twgExDTQL/tp8MfaTAAGAErF8ew97yaQd5DvsmE5w9t7sAS6CQmzADeAmbClWAd+nv7d620ueDfhjAHgdLoAtvGAjCAwQDfhb9ATYpETHo+gFFv/sb30WIH0AmyWPvGrxkCvqAPQO98qdZt/nsXvUGOC6VhKh1AfcTEQLQQAA== ``` %% \ No newline at end of file diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index eaf0521..068253b 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -38,6 +38,8 @@ void UpdateController::initialize(CommonClientHandler *commonClientHandler,DataP mutex = new QMutex; qDebug() << "UpdateController init thread ID " << QThread::currentThreadId(); + + emit sigInitializeFinished(); } void UpdateController::changeAssetVersion(QString versionName) diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 54c24d7..6231cc6 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -69,6 +69,8 @@ signals: void sigErrorRequired(int code); void sigUpdateDocs(); + void sigInitializeFinished(); + private: QList clientDataList; QList serverDataList; diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index ef4bbf3..9f6f471 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -142,16 +142,36 @@ void ServerLMSWidget::slot_UpdateDocs() QApplication::restoreOverrideCursor(); } -void ServerLMSWidget::start() +void ServerLMSWidget::slot_startInitialization_step1() { - startInitialization(); + Logger::instance().log("Update docs.xml..."); + slot_UpdateDocs(); + Logger::instance().log("Update docs.xml completed!"); + + ui->btnStopServer->setEnabled(false); + ui->btnStartServer->setEnabled(true); + + flStartInitialization = true; + + updateStateServer(); + + QApplication::restoreOverrideCursor(); + if(hasError() == 100) return; + + Logger::instance().log("Try connection to DB..."); tryConnectionToDB(); waitAnimationWidget->hideWithStop(); } +void ServerLMSWidget::start() +{ + startInitialization_step0(); + +} + void ServerLMSWidget::slot_BlockAutorization(bool block) { if(block) @@ -301,7 +321,7 @@ QString ServerLMSWidget::loadStyleSheet() } } -void ServerLMSWidget::startInitialization() +void ServerLMSWidget::startInitialization_step0() { QApplication::setOverrideCursor(Qt::WaitCursor); @@ -322,7 +342,8 @@ void ServerLMSWidget::startInitialization() updateController = new UpdateController; updateController->moveToThread(updateThread); - docsUpdater = new DocsUpdater(updateController, this); + docsUpdater = new DocsUpdater(updateController/*, this*/); + docsUpdater->moveToThread(updateThread); processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater); @@ -344,24 +365,16 @@ void ServerLMSWidget::startInitialization() Logger::instance().setLoggingType(LoggingType::WIDGET); Logger::instance().setLogToFile(true); - connect(this,&ServerLMSWidget::sigUpdateController,updateController,&UpdateController::initialize,Qt::DirectConnection); + connect(this,&ServerLMSWidget::sigUpdateControllerInitialize,updateController,&UpdateController::initialize/*,Qt::DirectConnection*/); + connect(updateController,&UpdateController::sigInitializeFinished, this,&ServerLMSWidget::slot_startInitialization_step1/*,Qt::DirectConnection*/); connect(this,&ServerLMSWidget::sigCalculateFullHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection); connect(updateController,&UpdateController::sigErrorRequired,this,&ServerLMSWidget::setError); connect(updateController,&UpdateController::sigUpdateDocs,this,&ServerLMSWidget::slot_UpdateDocs,Qt::AutoConnection); connect(&Logger::instance(),&Logger::sigLogToWidget,this, &ServerLMSWidget::slot_AddMessageToLog,Qt::QueuedConnection); - emit sigUpdateController(commonClientHandler,dataParser,assetsManager); + emit sigUpdateControllerInitialize(commonClientHandler,dataParser,assetsManager); - slot_UpdateDocs(); - ui->btnStopServer->setEnabled(false); - ui->btnStartServer->setEnabled(true); - - flStartInitialization = true; - - updateStateServer(); - - QApplication::restoreOverrideCursor(); } void ServerLMSWidget::tryConnectionToDB() @@ -387,6 +400,8 @@ void ServerLMSWidget::tryConnectionToDB() dbSettings.dbHostName, QString::number(dbSettings.dbPort)); + Logger::instance().log("Connection to DB completed!"); + emit signal_Tray_ShowMessage(tr("Database connection OK!") + "\n" + strDBsettings); on_btnStartServer_clicked(); diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index b1eec18..85c82bd 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -82,7 +82,7 @@ signals: void sigRecognize(); void sigCalculateFullHash(); - void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); + void sigUpdateControllerInitialize(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); QTcpSocket* sigGetSocket(); void signal_DocsChanged(); @@ -97,6 +97,8 @@ public slots: void slot_UpdateDocs(); + void slot_startInitialization_step1(); + public: QString getLanguage() { @@ -135,7 +137,7 @@ private: void updateMyStyleSheet(); QString loadStyleSheet(); - void startInitialization(); + void startInitialization_step0(); void tryConnectionToDB(); From 4f6958ef818ace0ed2fa8cdaf279b70f1683b46d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 12:38:19 +0300 Subject: [PATCH 08/31] Update style css --- FILES/CSS/styleSheetMain.css | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/FILES/CSS/styleSheetMain.css b/FILES/CSS/styleSheetMain.css index 675a54f..cf692c5 100644 --- a/FILES/CSS/styleSheetMain.css +++ b/FILES/CSS/styleSheetMain.css @@ -168,9 +168,7 @@ QTreeWidget::branch:has-siblings:adjoins-item { QTreeWidget::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/resources/icons/branch-end.png) 0; } -QTreeWidget#treeWidget_AMMforTrainee::branch:!has-children:!has-siblings:adjoins-item { - border-image: none; -} + QTreeWidget::branch:closed:has-children:!has-siblings, QTreeWidget::branch:closed:has-children:has-siblings { border-image: none; From 1842c9381ff2b5a6b88b661adb4ad59539a1de18 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 12:38:44 +0300 Subject: [PATCH 09/31] Schem update --- DOCS/MainScheme.md | 406 +++++++++++++++++++++++---------------------- 1 file changed, 204 insertions(+), 202 deletions(-) diff --git a/DOCS/MainScheme.md b/DOCS/MainScheme.md index 02be336..4c520b3 100644 --- a/DOCS/MainScheme.md +++ b/DOCS/MainScheme.md @@ -492,408 +492,410 @@ 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 ``` %% \ No newline at end of file From 76a5f08481ce5a9fba3df5f9eb3288491d42f463 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 15:28:35 +0300 Subject: [PATCH 10/31] =?UTF-8?q?=D0=A1=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20su?= =?UTF-8?q?bProc=20=D0=BD=D0=B5=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/subprocitemwidget.cpp | 13 ++++- .../InstructorsAndTraineesWidget_ru_RU.ts | 51 ++++++++++--------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp index 4569bc2..385ef2d 100644 --- a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp @@ -6,6 +6,17 @@ SubProcItemWidget::SubProcItemWidget(QWidget *parent) : ui(new Ui::SubProcItemWidget) { ui->setupUi(this); + + ui->listWidget->setObjectName("subProcItemListWidget"); + + this->setFocusPolicy(Qt::NoFocus); + ui->listWidget->setFocusPolicy(Qt::NoFocus); + ui->label->setFocusPolicy(Qt::NoFocus); + + int totalHeight = 0; + totalHeight += ui->label->sizeHint().height(); + totalHeight += 4; + ui->label->setMaximumHeight(totalHeight); } SubProcItemWidget::~SubProcItemWidget() @@ -30,7 +41,7 @@ void SubProcItemWidget::setListSubProc(const QList &list) for(int row = 0; row < ui->listWidget->count(); ++row) { totalHeight += ui->listWidget->sizeHintForRow(row); // Высота каждой строки - totalHeight += 10; + totalHeight += 4; } // Добавляем отступы фрейма (рамки) diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts index 2ee04c6..9288c56 100644 --- a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts +++ b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts @@ -34,55 +34,56 @@ Удалить - + actual актуально - + update required требуется обновление - - + + DM code DM код - - + + ID ID - - + + Procedure AMM Процедура AMM - - + + Canplay Режимы - - + + Status Статус - + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + + Assign this task? Назначить эту задачу? @@ -927,7 +928,7 @@ Delete it anyway? - + DM code DM код @@ -942,12 +943,12 @@ Delete it anyway? Назначить - + Subprocedure Подпроцедура - + Canplay Режимы @@ -1216,29 +1217,29 @@ Delete it anyway? TaskAMMFIMTreePreparation - - + + completed выполнена - - + + failed неверно - - + + checkup на проверке - - + + new новая From 4bdfb8163a1b7cdaaa2c78a6044e8832fc92ff8d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 16:27:13 +0300 Subject: [PATCH 11/31] =?UTF-8?q?GUI.=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=2010=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BE=D0=BA=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=20=D0=BA=20=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/connectortoserver.cpp | 2 +- .../instructorsandtraineeswidget.cpp | 86 +++++++++++++++++-- .../instructorsandtraineeswidget.h | 6 ++ 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index f798dd3..a9f2001 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -88,7 +88,7 @@ void ConnectorToServer::initialize() emit sigInitializeClient(recognizeSystem,sendSystem,connectionThread); - SetConnectToServer(); + //SetConnectToServer(); } void ConnectorToServer::bindConnection() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 3111686..97d917c 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -14,6 +14,7 @@ const QString InstructorsAndTraineesWidget::languageRUS = "ru_RU"; InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : QWidget(parent), + waitAnimationWidget(nullptr), connectorToServer(nullptr), viewerTrainees(nullptr), viewerInstructors(nullptr), @@ -26,6 +27,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : idInstructorLoggedInLocal("0"), language(languageENG), flSettingsServerIsChanged(false), + flTryConnectToServer(false), + cntTryConnectToServer(0), ui(new Ui::InstructorsAndTraineesWidget) { ui->setupUi(this); @@ -86,6 +89,13 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ui->btnEditorTrainees->setEnabled(false); ui->btnEditorInstructors->setEnabled(false); ui->btnPersonalCard->setEnabled(false); + + waitAnimationWidget = new WaitAnimationWidget; + QMovie *movie = new QMovie(":/resources/icons/762.gif"); + waitAnimationWidget->setParent(this); + waitAnimationWidget->initialize(movie,this); + + ui->btnConnectionToServer->click(); } InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget() @@ -100,6 +110,10 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget() delete viewerInstructors; delete viewerTrainees; delete connectorToServer; + + waitAnimationWidget->hideWithStop(); + delete waitAnimationWidget; + delete ui; } @@ -120,6 +134,12 @@ void InstructorsAndTraineesWidget::changeEvent(QEvent *event) } } +void InstructorsAndTraineesWidget::resizeEvent(QResizeEvent *event) +{ + QSize size = event->size(); + waitAnimationWidget->resize(size); +} + void InstructorsAndTraineesWidget::updateMyStyleSheet() { QString styleSheet = loadStyleSheet(); @@ -238,11 +258,18 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png"))); updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal); + + flTryConnectToServer = false; + cntTryConnectToServer = 0; + waitAnimationWidget->hideWithStop(); + updateLabelServer(); + + ui->btnAuthorizationInstructor->click(); } else {//Сервер отключен - ui->btnConnectionToServer->setEnabled(true); + //ui->btnConnectionToServer->setEnabled(true); ui->btnAuthorizationInstructor->setEnabled(false); ui->btnAuthorizationInstructor->setChecked(false); ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png"))); @@ -263,12 +290,41 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) nameInstructorLoggedInLocal = ""; updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal); - updateLabelServer(); + + + if(flTryConnectToServer) + { + if(cntTryConnectToServer < 10) + { + QThread::sleep(1); + cntTryConnectToServer++; + connectorToServer->SetConnectToServer(); + } + else + { + flTryConnectToServer = false; + cntTryConnectToServer = 0; + ui->btnConnectionToServer->setEnabled(true); + waitAnimationWidget->hideWithStop(); + } + } + else + { + flTryConnectToServer = false; + cntTryConnectToServer = 0; + ui->btnConnectionToServer->setEnabled(true); + } if(!flSettingsServerIsChanged) - SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("The server is not available!")).exec(); + { + if(!flTryConnectToServer) + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("The server is not available!")).exec(); + } else flSettingsServerIsChanged = false; + + + updateLabelServer(); } } @@ -364,6 +420,15 @@ bool InstructorsAndTraineesWidget::authorizationIsCompleted() void InstructorsAndTraineesWidget::on_btnConnectionToServer_clicked() { + waitAnimationWidget->showWithPlay(); + + ui->btnConnectionToServer->setEnabled(false); + + flTryConnectToServer = true; + cntTryConnectToServer = 1; + + updateLabelServer(); + connectorToServer->SetConnectToServer(); } @@ -426,13 +491,20 @@ void InstructorsAndTraineesWidget::updateLabelServer() if(!connectorToServer) return; - if(connectorToServer->getIsConnected()) + if(flTryConnectToServer) { - ServerSettings serverSettings = connectorToServer->getServerSettings(); - ui->lblServer->setText(tr("connected") + " " + serverSettings.Address + " : " +serverSettings.Port); + ui->lblServer->setText(tr("Connection attempt") + QString(" %1 ").arg(cntTryConnectToServer) + "..."); } else - ui->lblServer->setText(tr("not connected")); + { + if(connectorToServer->getIsConnected()) + { + ServerSettings serverSettings = connectorToServer->getServerSettings(); + ui->lblServer->setText(tr("connected") + " " + serverSettings.Address + " : " +serverSettings.Port); + } + else + ui->lblServer->setText(tr("not connected")); + } } void InstructorsAndTraineesWidget::setLanguageInterfase() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 6241f1a..6932e2c 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -34,6 +34,7 @@ public: private: void changeEvent(QEvent * event) override; + void resizeEvent(QResizeEvent *event) override; private: void updateMyStyleSheet(); @@ -85,6 +86,8 @@ private: void setLanguageInterfase(); private: + WaitAnimationWidget *waitAnimationWidget; + ConnectorToServer* connectorToServer; ViewerTrainees* viewerTrainees; @@ -104,6 +107,9 @@ private: bool flSettingsServerIsChanged; + bool flTryConnectToServer; + int cntTryConnectToServer; + Ui::InstructorsAndTraineesWidget *ui; }; From f2d7557f19ea42a35840eb80e44b90443c8ff082 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 24 Nov 2025 18:19:28 +0300 Subject: [PATCH 12/31] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/connectortoserver.cpp | 1 + .../instructorsandtraineeswidget.cpp | 14 ++++++++++---- .../instructorsandtraineeswidget.h | 2 ++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index a9f2001..805108b 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -44,6 +44,7 @@ bool ConnectorToServer::getIsConnected() void ConnectorToServer::SetConnectToServer() { + qDebug() << "connectorToServer::SetConnectToServer() thread ID " << QThread::currentThreadId(); serverSettings = *dataParser->getServerSettings(); emit sigSetConnect(dataParser->getServerSettings(),connectionThread); } diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 97d917c..5cc152a 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "instructorsandtraineeswidget.h" #include "ui_instructorsandtraineeswidget.h" #include "dialogauthorization.h" @@ -46,7 +47,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : setLanguageInterfase(); - connectorToServer = new ConnectorToServer(this); + connectorToServer = new ConnectorToServer(/*this*/nullptr); connect(connectorToServer, &ConnectorToServer::sigLoginResult, this, &InstructorsAndTraineesWidget::slot_checkLoginResult); connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult); connect(connectorToServer,&ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); @@ -296,9 +297,8 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) { if(cntTryConnectToServer < 10) { - QThread::sleep(1); cntTryConnectToServer++; - connectorToServer->SetConnectToServer(); + QTimer::singleShot(1000, this, SLOT(slot_ConnectToServer())); } else { @@ -366,6 +366,12 @@ void InstructorsAndTraineesWidget::slot_AnswerDocsChanged() viewerTrainees->getAmmTasksWidgetCommon()->setDocsActualed(false); } +void InstructorsAndTraineesWidget::slot_ConnectToServer() +{ + updateLabelServer(); + connectorToServer->SetConnectToServer(); +} + bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent) { DialogAuthorization dlg(parent); @@ -429,7 +435,7 @@ void InstructorsAndTraineesWidget::on_btnConnectionToServer_clicked() updateLabelServer(); - connectorToServer->SetConnectToServer(); + QTimer::singleShot(1000, this, SLOT(slot_ConnectToServer())); } void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 6932e2c..4328ee4 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -58,6 +58,8 @@ public Q_SLOTS: void slot_AnswerDocsChanged(); + void slot_ConnectToServer(); + Q_SIGNALS: //сигнал смены языка void signal_LanguageChanged(QString language); From 9a4a082ffc6acc10157ca90879bda612a812362e Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 25 Nov 2025 11:07:35 +0300 Subject: [PATCH 13/31] =?UTF-8?q?GUI.=20fix.=20=D0=9E=D0=B1=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FILES/CSS/styleSheetMain.css | 4 ++++ InstructorsAndTrainees/messanger/messangercontroller.cpp | 2 ++ ServerLMS/Systems/logger.cpp | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/FILES/CSS/styleSheetMain.css b/FILES/CSS/styleSheetMain.css index cf692c5..5b6a2a9 100644 --- a/FILES/CSS/styleSheetMain.css +++ b/FILES/CSS/styleSheetMain.css @@ -300,6 +300,10 @@ QListWidget#oneDialogMessenger { stop: 0 #A0CECE, stop: 1 #FFFFFF); } +QListWidget#subProcItemListWidget::item:hover { + background: #ffffff; +} + QTextEdit { padding: -20px; font-size: 12pt; diff --git a/InstructorsAndTrainees/messanger/messangercontroller.cpp b/InstructorsAndTrainees/messanger/messangercontroller.cpp index b79531c..be33a7a 100644 --- a/InstructorsAndTrainees/messanger/messangercontroller.cpp +++ b/InstructorsAndTrainees/messanger/messangercontroller.cpp @@ -68,6 +68,8 @@ void MessangerController::deleteAllWidgets() for(MessangerWidget* widget : listWidgets) delete widget; listWidgets.clear(); + + mapAlldialogsWithClients.clear(); } void MessangerController::setUserLocalGUI_ID(int id) diff --git a/ServerLMS/Systems/logger.cpp b/ServerLMS/Systems/logger.cpp index e40d65a..fa687ac 100644 --- a/ServerLMS/Systems/logger.cpp +++ b/ServerLMS/Systems/logger.cpp @@ -55,6 +55,11 @@ void Logger::handleLog(QString msg, LogLevel logLevel) { QString level; +#ifndef PROJECT_TYPE_DEBUG + if(logLevel == DEBUG) + return; +#endif + switch (logLevel) { case INFO: level = "INFO"; break; From e24c57c395b5815f3cb886c75809d81b0eacd5bd Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 25 Nov 2025 12:46:58 +0300 Subject: [PATCH 14/31] refact0 --- .../instructors/dialogeditinstructor.cpp | 1 + .../instructors/dialogeditinstructor.ui | 14 +++---- .../tasks/fimtaskswidget.cpp | 37 +++++++++++++++++++ InstructorsAndTrainees/tasks/fimtaskswidget.h | 1 + .../tasks/tasktreepreparation.cpp | 2 + .../trainees/dialogeditgroup.cpp | 3 ++ .../trainees/dialogedittrainee.cpp | 1 + .../trainees/dialogedittrainee.ui | 12 +++--- 8 files changed, 58 insertions(+), 13 deletions(-) diff --git a/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp b/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp index 9cd40e7..daee514 100644 --- a/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp +++ b/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp @@ -21,6 +21,7 @@ DialogEditInstructor::DialogEditInstructor(bool adminMode, QWidget *parent) : ui->btnViewPassword->setObjectName("btnViewPassword"); ui->btnChangePassword->setObjectName("btnChangePassword"); + ui->editName->setValidator(new QRegExpValidator(QRegExp("[A-Za-zА-Яа-я0-9 _\\d]+"), this)); ui->editLogin->setValidator(new QRegExpValidator(QRegExp("[A-Za-z\\d]+"), this)); ui->editPassword->setEnabled(false); diff --git a/InstructorsAndTrainees/instructors/dialogeditinstructor.ui b/InstructorsAndTrainees/instructors/dialogeditinstructor.ui index b0aaa59..d5e4235 100644 --- a/InstructorsAndTrainees/instructors/dialogeditinstructor.ui +++ b/InstructorsAndTrainees/instructors/dialogeditinstructor.ui @@ -87,7 +87,7 @@ ... - + :/resources/icons/eye.png:/resources/icons/eye.png @@ -104,7 +104,7 @@ ... - + :/resources/icons/exchange.png:/resources/icons/exchange.png @@ -141,7 +141,7 @@ Administrator - + :/resources/icons/admin.png :/resources/icons/admin.png:/resources/icons/admin.png @@ -168,7 +168,7 @@ Archived - + :/resources/icons/archive.png :/resources/icons/archive.png:/resources/icons/archive.png @@ -192,10 +192,10 @@ - Logged + Online - + :/resources/icons/circleGreen.png :/resources/icons/circleGreen.png:/resources/icons/circleGreen.png @@ -241,7 +241,7 @@ - + diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 0b8e37a..c87c9e2 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -195,10 +195,14 @@ void FIMtasksWidget::on_treeWidgetItemClicked(QTreeWidgetItem *item, int column) } else { + setCurrentParentTask(item); + + /* ui->btnAssignTask->setEnabled(false); ui->btnDelete->setEnabled(false); ui->btnCheck->setEnabled(false); + */ } } @@ -462,4 +466,37 @@ void FIMtasksWidget::setCurrentTask(int id) } } +void FIMtasksWidget::setCurrentParentTask(QTreeWidgetItem *item) +{ + if(item == nullptr) + return; + + int id = 0; + + QTreeWidgetItem *treeItemParent = item->parent(); + if(treeItemParent == nullptr) + {//задача + id = item->text(ColumnsTreeFIM::clmnFIM_ID).toInt(); + } + else + { + QTreeWidgetItem *treeItemParent1 = treeItemParent->parent(); + if(treeItemParent1 == nullptr) + {//задача + id = treeItemParent->text(ColumnsTreeFIM::clmnFIM_ID).toInt(); + } + else + { + QTreeWidgetItem *treeItemParent2 = treeItemParent1->parent(); + if(treeItemParent2 == nullptr) + {//задача + id = treeItemParent1->text(ColumnsTreeFIM::clmnFIM_ID).toInt(); + } + } + } + + if(id) + setCurrentTask(id); +} + diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 979fb7b..70ab675 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -59,6 +59,7 @@ private: void updateTaskItem(QTreeWidgetItem *itemTask); void setCurrentTask(int id); + void setCurrentParentTask(QTreeWidgetItem *item); Q_SIGNALS: void signal_prepareFIMListItems(QByteArray array); diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index 1d68253..94edffe 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -611,6 +611,7 @@ void TaskAMMFIMTreePreparation::slot_prepareFIMListItems(QByteArray array) Malfunction malfunction = task.malfunctionList.at(j); QTreeWidgetItem* itemMalfunction = new QTreeWidgetItem(); + itemMalfunction->setFlags(itemMalfunction->flags() ^ Qt::ItemIsSelectable); itemMalfunction->setText(ColumnsTreeFIM::clmnFIM_Title, malfunction.description); if(type == TypeListTreeAMMFIM::listCommon) @@ -629,6 +630,7 @@ void TaskAMMFIMTreePreparation::slot_prepareFIMListItems(QByteArray array) MalfunctionSign sign = malfunction.malfunctionSigns.at(k); QTreeWidgetItem* itemSign = new QTreeWidgetItem(); + itemSign->setFlags(itemSign->flags() ^ Qt::ItemIsSelectable); itemSign->setText(ColumnsTreeFIM::clmnFIM_Title, sign.description); //itemSign->setFlags(itemSign->flags() | Qt::ItemIsUserCheckable); diff --git a/InstructorsAndTrainees/trainees/dialogeditgroup.cpp b/InstructorsAndTrainees/trainees/dialogeditgroup.cpp index 761fa90..51776e3 100644 --- a/InstructorsAndTrainees/trainees/dialogeditgroup.cpp +++ b/InstructorsAndTrainees/trainees/dialogeditgroup.cpp @@ -1,6 +1,7 @@ #include "dialogeditgroup.h" #include "computersLocations.h" #include +#include DialogEditGroup::DialogEditGroup(QWidget *parent) : QDialog(parent), @@ -10,6 +11,8 @@ DialogEditGroup::DialogEditGroup(QWidget *parent) : ui->setupUi(this); verify(); + ui->editName->setValidator(new QRegExpValidator(QRegExp("[A-Za-zА-Яа-я0-9 _\\d]+"), this)); + ui->editName->setProperty("mandatoryField", true); } diff --git a/InstructorsAndTrainees/trainees/dialogedittrainee.cpp b/InstructorsAndTrainees/trainees/dialogedittrainee.cpp index 82f9fc3..357a73f 100644 --- a/InstructorsAndTrainees/trainees/dialogedittrainee.cpp +++ b/InstructorsAndTrainees/trainees/dialogedittrainee.cpp @@ -21,6 +21,7 @@ DialogEditTrainee::DialogEditTrainee(bool adminMode, QWidget *parent) : ui->btnViewPassword->setObjectName("btnViewPassword"); ui->btnChangePassword->setObjectName("btnChangePassword"); + ui->editName->setValidator(new QRegExpValidator(QRegExp("[A-Za-zА-Яа-я0-9 _\\d]+"), this)); ui->editLogin->setValidator(new QRegExpValidator(QRegExp("[A-Za-z\\d]+"), this)); ui->editPassword->setEnabled(false); diff --git a/InstructorsAndTrainees/trainees/dialogedittrainee.ui b/InstructorsAndTrainees/trainees/dialogedittrainee.ui index b308078..cef0695 100644 --- a/InstructorsAndTrainees/trainees/dialogedittrainee.ui +++ b/InstructorsAndTrainees/trainees/dialogedittrainee.ui @@ -101,7 +101,7 @@ ... - + :/resources/icons/eye.png:/resources/icons/eye.png @@ -112,7 +112,7 @@ ... - + :/resources/icons/exchange.png:/resources/icons/exchange.png @@ -149,7 +149,7 @@ Archived - + :/resources/icons/archive.png :/resources/icons/archive.png:/resources/icons/archive.png @@ -173,10 +173,10 @@ - Logged + Online - + :/resources/icons/circleGreen.png :/resources/icons/circleGreen.png:/resources/icons/circleGreen.png @@ -222,7 +222,7 @@ - + From c627bc73d945199d7fedd47949e693bc7d394922 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 25 Nov 2025 15:54:25 +0300 Subject: [PATCH 15/31] =?UTF-8?q?Server.=20=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D0=BA=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/Андрей/Board.md | 7 +- ServerLMS/Systems/assetsmanager.cpp | 2 + ServerLMS/Systems/assetsmanager.h | 1 + ServerLMS/serverlmswidget.cpp | 9 +- ServerLMS/serverlmswidget.h | 2 + ServerLMS/serverlmswidget.ui | 145 ++++++++++++++-------- ServerLMS/settings/dialogsettingstray.cpp | 2 - 7 files changed, 109 insertions(+), 59 deletions(-) diff --git a/DOCS/Андрей/Board.md b/DOCS/Андрей/Board.md index 1bff4ac..51098d2 100644 --- a/DOCS/Андрей/Board.md +++ b/DOCS/Андрей/Board.md @@ -6,11 +6,14 @@ kanban-plugin: board ## backlog +- [ ] GUI: Сделать кнопку перезапроса общих списков FIM (по аналогии с АММ) - [ ] /RUS/Scens/tasksFIM.xml возможно изменится структура ## Completed +- [ ] Логин суперпользователя PostgreSQL предлагать по умолчанию postgres +- [ ] Сделать несколько попыток подключения к серверу - [ ] Переобновление docs.xml в пределах версии (если инструктор изменяет процедуры) - [ ] Реализовать механизм отображения и выбора подпроцедур для АММ. - [ ] Создание БД из кода (если нет или слетела) @@ -52,12 +55,10 @@ kanban-plugin: board ## Server -- [ ] Логин суперпользователя PostgreSQL предлагать по умолчанию postgres - [ ] Отходить от идентификации по Логину в пользу ID юзера везде, где это возможно. (Так как сейчас может вызвать проблемы при смене логина юзера!!!) - [ ] Зарефакторить databaselms_PostgreSQL.cpp (возможно, нужно использовать транзакции при восстановлении БД!) -- [ ] При долгой работе загибается главное окно (предположительно из-за лога) - [ ] Отображать текущую версию data в статус баре - [ ] Сделать крутилку на начальную загрузку Сервера - [ ] Не блочится Сервер при смене версии @@ -74,8 +75,6 @@ kanban-plugin: board ## GUI общие - [ ] Текстовый поиск в задачах -- [ ] Сделать кнопку перезапроса общих списков FIM (по аналогии с АММ) -- [ ] Сделать несколько попыток подключения к серверу diff --git a/ServerLMS/Systems/assetsmanager.cpp b/ServerLMS/Systems/assetsmanager.cpp index ef7ade2..92ad36e 100644 --- a/ServerLMS/Systems/assetsmanager.cpp +++ b/ServerLMS/Systems/assetsmanager.cpp @@ -110,6 +110,8 @@ QString AssetsManager::setVersion(QString versionName) currentVersionData = version; saveVersionToFile(currentVersionData); + emit signal_setVersion(versionName); + return version->getAbsolutPath(); } } diff --git a/ServerLMS/Systems/assetsmanager.h b/ServerLMS/Systems/assetsmanager.h index dec309c..51838be 100644 --- a/ServerLMS/Systems/assetsmanager.h +++ b/ServerLMS/Systems/assetsmanager.h @@ -33,6 +33,7 @@ public: signals: void sigSaveVersion(StreamingVersionData *versionData); + void signal_setVersion(QString versionStr); private: UpdateController *updateController; diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 9f6f471..1c80c67 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -166,6 +166,11 @@ void ServerLMSWidget::slot_startInitialization_step1() waitAnimationWidget->hideWithStop(); } +void ServerLMSWidget::slot_setVersion(QString versionStr) +{ + ui->lblVersionText->setText(versionStr); +} + void ServerLMSWidget::start() { startInitialization_step0(); @@ -372,9 +377,9 @@ void ServerLMSWidget::startInitialization_step0() connect(updateController,&UpdateController::sigUpdateDocs,this,&ServerLMSWidget::slot_UpdateDocs,Qt::AutoConnection); connect(&Logger::instance(),&Logger::sigLogToWidget,this, &ServerLMSWidget::slot_AddMessageToLog,Qt::QueuedConnection); + connect(assetsManager,&AssetsManager::signal_setVersion, this, &ServerLMSWidget::slot_setVersion); + emit sigUpdateControllerInitialize(commonClientHandler,dataParser,assetsManager); - - } void ServerLMSWidget::tryConnectionToDB() diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index 85c82bd..a3bb5eb 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -99,6 +99,8 @@ public slots: void slot_startInitialization_step1(); + void slot_setVersion(QString versionStr); + public: QString getLanguage() { diff --git a/ServerLMS/serverlmswidget.ui b/ServerLMS/serverlmswidget.ui index 7dcbd6d..273043d 100644 --- a/ServerLMS/serverlmswidget.ui +++ b/ServerLMS/serverlmswidget.ui @@ -248,7 +248,7 @@ - 100 + 150 16777215 @@ -298,65 +298,108 @@ + + + 100 + 0 + + ... + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + - - - Qt::Horizontal + + + Version of materials: - - - 40 - 20 - - - + - - - - - Authorization - - - - - - - - 0 - 0 - - - - - 32 - 32 - - - - - 32 - 32 - - - - - - - :/resources/icons/lock.png - - - true - - - - + + + + 0 + 0 + + + + ... + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Authorization + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + + + + :/resources/icons/lock.png + + + true + + diff --git a/ServerLMS/settings/dialogsettingstray.cpp b/ServerLMS/settings/dialogsettingstray.cpp index 93c636f..19fd21f 100644 --- a/ServerLMS/settings/dialogsettingstray.cpp +++ b/ServerLMS/settings/dialogsettingstray.cpp @@ -297,10 +297,8 @@ void DialogSettingsTray::on_btnCheckDB_clicked() dlg.setWindowTitle(tr("Superuser PostgreSQL authorization")); dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint); dlg.setStyleSheet(this->styleSheet()); -#ifdef PROJECT_TYPE_DEBUG dlg.setLogin("postgres"); dlg.setPassword(""); -#endif switch( dlg.exec() ) { From 173c369cc549e43ec24d506f04d42c5893fe64f5 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 25 Nov 2025 17:51:12 +0300 Subject: [PATCH 16/31] NewVersionWidget -> Dialog --- .../instructorsandtraineeswidget.cpp | 2 +- .../widgets/newversionwidget.cpp | 27 +- .../widgets/newversionwidget.h | 11 +- .../widgets/newversionwidget.ui | 436 +++++++++--------- .../widgets/versionselectwidget.cpp | 15 +- .../widgets/versionselectwidget.ui | 4 +- 6 files changed, 243 insertions(+), 252 deletions(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 5cc152a..285a61b 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -47,7 +47,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : setLanguageInterfase(); - connectorToServer = new ConnectorToServer(/*this*/nullptr); + connectorToServer = new ConnectorToServer(this); connect(connectorToServer, &ConnectorToServer::sigLoginResult, this, &InstructorsAndTraineesWidget::slot_checkLoginResult); connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult); connect(connectorToServer,&ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); diff --git a/InstructorsAndTrainees/widgets/newversionwidget.cpp b/InstructorsAndTrainees/widgets/newversionwidget.cpp index 1431ed4..dd5e132 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.cpp +++ b/InstructorsAndTrainees/widgets/newversionwidget.cpp @@ -2,12 +2,21 @@ #include "ui_newversionwidget.h" NewVersionWidget::NewVersionWidget(QWidget *parent) : - QWidget(parent), - ui(new Ui::NewVersionWidget) + QDialog(parent), + ui(new Ui::NewVersionWidget), + versionSelectWidget(nullptr), + validator(nullptr) { ui->setupUi(this); - setWindowFlags(Qt::SubWindow); - setAttribute(Qt::WA_ShowModal,true); + + setMinimumSize(200, 100); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowTitle(tr("New version")); +} + +NewVersionWidget::~NewVersionWidget() +{ + delete ui; } void NewVersionWidget::initialize(VersionSelectWidget *versionSelectWidget, QString prevName) @@ -18,24 +27,18 @@ void NewVersionWidget::initialize(VersionSelectWidget *versionSelectWidget, QStr ui->lineEdit->setValidator(validator); } - void NewVersionWidget::on_createButton_clicked() { if(ui->lineEdit->text() != "") { versionSelectWidget->sendCopyEmit(ui->lineEdit->text()); - hide(); + close(); } } void NewVersionWidget::on_cancelButton_clicked() { - hide(); -} - -NewVersionWidget::~NewVersionWidget() -{ - delete ui; + close(); } void NewVersionWidget::on_lineEdit_inputRejected() diff --git a/InstructorsAndTrainees/widgets/newversionwidget.h b/InstructorsAndTrainees/widgets/newversionwidget.h index e1696fb..ef78f47 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.h +++ b/InstructorsAndTrainees/widgets/newversionwidget.h @@ -11,15 +11,18 @@ class NewVersionWidget; } class VersionSelectWidget; -class NewVersionWidget : public QWidget + +class NewVersionWidget : public QDialog { Q_OBJECT public: - explicit NewVersionWidget(QWidget *parent = nullptr); - void initialize(VersionSelectWidget *versionSelectWidget,QString prevName); + explicit NewVersionWidget(QWidget *parent = nullptr); ~NewVersionWidget(); +public: + void initialize(VersionSelectWidget *versionSelectWidget, QString prevName); + private slots: void on_createButton_clicked(); void on_cancelButton_clicked(); @@ -31,6 +34,6 @@ private: QRegExpValidator *validator; }; -#endif // NEWVERSIONWIDGET_Hvoid on_lineEdit_inputRejected(); +#endif // NEWVERSIONWIDGET_H diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/newversionwidget.ui index 3957da2..8d5b17f 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.ui +++ b/InstructorsAndTrainees/widgets/newversionwidget.ui @@ -20,7 +20,7 @@ Create copy... - + :/resources/icons/lms.png:/resources/icons/lms.png @@ -31,229 +31,225 @@ - - - true - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - 0 - 0 - - - - Basic version: - - - - - - - - 150 - 30 - - - - TextLabel - - - - - - - - - 6 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - 99 - 40 - - - - - 0 - 0 - - - - New name version: - - - - - - - - 150 - 30 - - - - - 150 - 30 - - - - - 60 - 30 - - - - 1000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 6 - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Create - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Cancel - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 40 - 20 - - - - - - - - + + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + 0 + + + + Basic version: + + + + + + + + 150 + 30 + + + + TextLabel + + + + + + + + + 6 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 99 + 40 + + + + + 0 + 0 + + + + New name version: + + + + + + + + 150 + 30 + + + + + 150 + 30 + + + + + 60 + 30 + + + + 1000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Create + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Cancel + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + - + diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index c36974d..cf33a5a 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -83,21 +83,10 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() return; } - NewVersionWidget *newVersionWidget = new NewVersionWidget(); + NewVersionWidget *newVersionWidget = new NewVersionWidget(this); newVersionWidget->initialize(this,selectedVersion->getViewName()); - - /* - QDialog* dialog = new QDialog(this); - QHBoxLayout *layout = new QHBoxLayout(dialog); - layout->addWidget(newVersionWidget); - dialog->setWindowTitle(tr("Editor of instructors")); - dialog->setMinimumSize(200, 100); - dialog->setStyleSheet(this->styleSheet()); - dialog->exec(); + newVersionWidget->exec(); delete newVersionWidget; - */ - - newVersionWidget->show(); } void VersionSelectWidget::sendCopyEmit(QString newName) diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.ui b/InstructorsAndTrainees/widgets/versionselectwidget.ui index b657e75..93ab51c 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.ui +++ b/InstructorsAndTrainees/widgets/versionselectwidget.ui @@ -20,7 +20,7 @@ Form - + :/resources/icons/lms.png:/resources/icons/lms.png @@ -204,7 +204,7 @@ - + From f6e96e002c509b12583b4b365a73350009fcf8e1 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 25 Nov 2025 18:32:46 +0300 Subject: [PATCH 17/31] refact --- GUIdataBaseLMS/CMakeLists.txt | 1 + InstructorsAndTrainees/CMakeLists.txt | 6 ++--- .../authorization/dialogauthorization.cpp | 6 +++++ .../authorization/dialogauthorization.h | 2 ++ .../instructors/dialogeditinstructor.cpp | 6 +++++ .../instructors/dialogeditinstructor.h | 2 ++ .../trainees/dialogedittrainee.cpp | 6 +++++ .../trainees/dialogedittrainee.h | 2 ++ ...versionwidget.cpp => dialognewversion.cpp} | 27 ++++++++++--------- ...{newversionwidget.h => dialognewversion.h} | 19 ++++++------- ...ewversionwidget.ui => dialognewversion.ui} | 4 +-- .../widgets/versionselectwidget.cpp | 8 +++--- .../widgets/versionselectwidget.h | 4 +-- 13 files changed, 60 insertions(+), 33 deletions(-) rename InstructorsAndTrainees/widgets/{newversionwidget.cpp => dialognewversion.cpp} (54%) rename InstructorsAndTrainees/widgets/{newversionwidget.h => dialognewversion.h} (59%) rename InstructorsAndTrainees/widgets/{newversionwidget.ui => dialognewversion.ui} (98%) diff --git a/GUIdataBaseLMS/CMakeLists.txt b/GUIdataBaseLMS/CMakeLists.txt index fcebf83..d10d57b 100644 --- a/GUIdataBaseLMS/CMakeLists.txt +++ b/GUIdataBaseLMS/CMakeLists.txt @@ -23,6 +23,7 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/connectorToServer) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/connectorToServer/Core) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/messanger) +target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) if(PROJECT_TYPE_DEBUG) target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees) else() diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index f5a00aa..2d57e00 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -132,9 +132,9 @@ add_library(InstructorsAndTrainees SHARED tasks/subprocitemwidget.h tasks/subprocitemwidget.ui - widgets/newversionwidget.cpp - widgets/newversionwidget.h - widgets/newversionwidget.ui + widgets/dialognewversion.cpp + widgets/dialognewversion.h + widgets/dialognewversion.ui widgets/versionselectwidget.cpp widgets/versionselectwidget.h widgets/versionselectwidget.ui diff --git a/InstructorsAndTrainees/authorization/dialogauthorization.cpp b/InstructorsAndTrainees/authorization/dialogauthorization.cpp index 746c1d3..9760c7b 100644 --- a/InstructorsAndTrainees/authorization/dialogauthorization.cpp +++ b/InstructorsAndTrainees/authorization/dialogauthorization.cpp @@ -1,4 +1,5 @@ #include +#include #include "dialogauthorization.h" #include "ui_dialogauthorization.h" @@ -57,3 +58,8 @@ void DialogAuthorization::on_btnViewPassword_released() { ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password); } + +void DialogAuthorization::on_editLogin_inputRejected() +{ + QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); +} diff --git a/InstructorsAndTrainees/authorization/dialogauthorization.h b/InstructorsAndTrainees/authorization/dialogauthorization.h index a45b3ae..89814af 100644 --- a/InstructorsAndTrainees/authorization/dialogauthorization.h +++ b/InstructorsAndTrainees/authorization/dialogauthorization.h @@ -29,6 +29,8 @@ private slots: void on_btnViewPassword_pressed(); void on_btnViewPassword_released(); + void on_editLogin_inputRejected(); + private: Ui::DialogAuthorization *ui; }; diff --git a/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp b/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp index daee514..b9c0651 100644 --- a/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp +++ b/InstructorsAndTrainees/instructors/dialogeditinstructor.cpp @@ -3,6 +3,7 @@ #include "hashtools.h" #include #include +#include DialogEditInstructor::DialogEditInstructor(bool adminMode, QWidget *parent) : QDialog(parent), @@ -144,3 +145,8 @@ void DialogEditInstructor::on_btnChangePassword_clicked() ui->editPassword->setFocus(); } + +void DialogEditInstructor::on_editLogin_inputRejected() +{ + QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); +} diff --git a/InstructorsAndTrainees/instructors/dialogeditinstructor.h b/InstructorsAndTrainees/instructors/dialogeditinstructor.h index db75012..567191b 100644 --- a/InstructorsAndTrainees/instructors/dialogeditinstructor.h +++ b/InstructorsAndTrainees/instructors/dialogeditinstructor.h @@ -35,6 +35,8 @@ private slots: void on_btnChangePassword_clicked(); + void on_editLogin_inputRejected(); + private: void verify(); diff --git a/InstructorsAndTrainees/trainees/dialogedittrainee.cpp b/InstructorsAndTrainees/trainees/dialogedittrainee.cpp index 357a73f..4ff1e43 100644 --- a/InstructorsAndTrainees/trainees/dialogedittrainee.cpp +++ b/InstructorsAndTrainees/trainees/dialogedittrainee.cpp @@ -3,6 +3,7 @@ #include "hashtools.h" #include #include +#include DialogEditTrainee::DialogEditTrainee(bool adminMode, QWidget *parent) : QDialog(parent), @@ -137,3 +138,8 @@ void DialogEditTrainee::on_btnChangePassword_clicked() ui->editPassword->setFocus(); } + +void DialogEditTrainee::on_editLogin_inputRejected() +{ + QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); +} diff --git a/InstructorsAndTrainees/trainees/dialogedittrainee.h b/InstructorsAndTrainees/trainees/dialogedittrainee.h index b21def1..68b7bdf 100644 --- a/InstructorsAndTrainees/trainees/dialogedittrainee.h +++ b/InstructorsAndTrainees/trainees/dialogedittrainee.h @@ -34,6 +34,8 @@ private slots: void on_btnChangePassword_clicked(); + void on_editLogin_inputRejected(); + private: void verify(); diff --git a/InstructorsAndTrainees/widgets/newversionwidget.cpp b/InstructorsAndTrainees/widgets/dialognewversion.cpp similarity index 54% rename from InstructorsAndTrainees/widgets/newversionwidget.cpp rename to InstructorsAndTrainees/widgets/dialognewversion.cpp index dd5e132..fa2fe5a 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.cpp +++ b/InstructorsAndTrainees/widgets/dialognewversion.cpp @@ -1,33 +1,34 @@ -#include "newversionwidget.h" -#include "ui_newversionwidget.h" +#include "dialognewversion.h" +#include "ui_dialognewversion.h" -NewVersionWidget::NewVersionWidget(QWidget *parent) : +DialogNewVersion::DialogNewVersion(QWidget *parent) : QDialog(parent), - ui(new Ui::NewVersionWidget), + ui(new Ui::DialogNewVersion), versionSelectWidget(nullptr), validator(nullptr) { ui->setupUi(this); + validator = new QRegExpValidator(QRegExp("^[A-Za-z0-9]{20}$")); + ui->lineEdit->setValidator(validator); + setMinimumSize(200, 100); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("New version")); } -NewVersionWidget::~NewVersionWidget() +DialogNewVersion::~DialogNewVersion() { delete ui; } -void NewVersionWidget::initialize(VersionSelectWidget *versionSelectWidget, QString prevName) +void DialogNewVersion::initialize(VersionSelectWidget *versionSelectWidget, QString prevName) { this->versionSelectWidget = versionSelectWidget; - ui->prevVerValue->setText(prevName); - validator = new QRegExpValidator(QRegExp("^[A-Za-z0-9]{20}$")); - ui->lineEdit->setValidator(validator); + ui->prevVerValue->setText(prevName); } -void NewVersionWidget::on_createButton_clicked() +void DialogNewVersion::on_createButton_clicked() { if(ui->lineEdit->text() != "") { @@ -36,12 +37,12 @@ void NewVersionWidget::on_createButton_clicked() } } -void NewVersionWidget::on_cancelButton_clicked() +void DialogNewVersion::on_cancelButton_clicked() { close(); } -void NewVersionWidget::on_lineEdit_inputRejected() +void DialogNewVersion::on_lineEdit_inputRejected() { - QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); + QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); } diff --git a/InstructorsAndTrainees/widgets/newversionwidget.h b/InstructorsAndTrainees/widgets/dialognewversion.h similarity index 59% rename from InstructorsAndTrainees/widgets/newversionwidget.h rename to InstructorsAndTrainees/widgets/dialognewversion.h index ef78f47..d2261a3 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.h +++ b/InstructorsAndTrainees/widgets/dialognewversion.h @@ -1,24 +1,25 @@ -#ifndef NEWVERSIONWIDGET_H -#define NEWVERSIONWIDGET_H +#ifndef DIALOGNEWVERSION_H +#define DIALOGNEWVERSION_H -#include #include #include #include +#include "versionselectwidget.h" + namespace Ui { -class NewVersionWidget; +class DialogNewVersion; } class VersionSelectWidget; -class NewVersionWidget : public QDialog +class DialogNewVersion : public QDialog { Q_OBJECT public: - explicit NewVersionWidget(QWidget *parent = nullptr); - ~NewVersionWidget(); + explicit DialogNewVersion(QWidget *parent = nullptr); + ~DialogNewVersion(); public: void initialize(VersionSelectWidget *versionSelectWidget, QString prevName); @@ -29,11 +30,11 @@ private slots: void on_lineEdit_inputRejected(); private: - Ui::NewVersionWidget *ui; + Ui::DialogNewVersion *ui; VersionSelectWidget *versionSelectWidget; QRegExpValidator *validator; }; -#endif // NEWVERSIONWIDGET_H +#endif // DIALOGNEWVERSION_H diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/dialognewversion.ui similarity index 98% rename from InstructorsAndTrainees/widgets/newversionwidget.ui rename to InstructorsAndTrainees/widgets/dialognewversion.ui index 8d5b17f..0a972c8 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.ui +++ b/InstructorsAndTrainees/widgets/dialognewversion.ui @@ -1,7 +1,7 @@ - NewVersionWidget - + DialogNewVersion + 0 diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index cf33a5a..a02b13e 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -83,10 +83,10 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() return; } - NewVersionWidget *newVersionWidget = new NewVersionWidget(this); - newVersionWidget->initialize(this,selectedVersion->getViewName()); - newVersionWidget->exec(); - delete newVersionWidget; + DialogNewVersion *dlgNewVersion = new DialogNewVersion(this); + dlgNewVersion->initialize(this,selectedVersion->getViewName()); + dlgNewVersion->exec(); + delete dlgNewVersion; } void VersionSelectWidget::sendCopyEmit(QString newName) diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/widgets/versionselectwidget.h index 4d61106..9742edc 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.h +++ b/InstructorsAndTrainees/widgets/versionselectwidget.h @@ -8,8 +8,8 @@ #include #include #include -#include -#include +#include +#include #include "recognizesystem.h" From 44b6299e59b8fef581c6f110791fd736bc00f038 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 26 Nov 2025 11:19:11 +0300 Subject: [PATCH 18/31] notifyController -> specialWB --- DOCS/Андрей/Board.md | 5 ++--- GUIdataBaseLMS/CMakeLists.txt | 1 + InstructorsAndTrainees/CMakeLists.txt | 4 ++-- .../Core/notifycontroller.cpp | 12 ----------- .../connectorToServer/Core/notifycontroller.h | 18 ----------------- .../connectorToServer/Core/recognizesystem.h | 2 +- .../connectorToServer/connectortoserver.cpp | 2 +- .../specialmessagebox/notifycontroller.cpp | 19 ++++++++++++++++++ .../specialmessagebox/notifycontroller.h | 20 +++++++++++++++++++ .../widgets/dialognewversion.h | 1 + .../widgets/versionselectwidget.cpp | 8 ++++---- .../widgets/versionselectwidget.h | 4 ++-- 12 files changed, 53 insertions(+), 43 deletions(-) delete mode 100644 InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp delete mode 100644 InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h create mode 100644 InstructorsAndTrainees/specialmessagebox/notifycontroller.cpp create mode 100644 InstructorsAndTrainees/specialmessagebox/notifycontroller.h diff --git a/DOCS/Андрей/Board.md b/DOCS/Андрей/Board.md index 51098d2..dbf485e 100644 --- a/DOCS/Андрей/Board.md +++ b/DOCS/Андрей/Board.md @@ -12,6 +12,7 @@ kanban-plugin: board ## Completed +- [ ] Сделать крутилку на начальную загрузку Сервера - [ ] Логин суперпользователя PostgreSQL предлагать по умолчанию postgres - [ ] Сделать несколько попыток подключения к серверу - [ ] Переобновление docs.xml в пределах версии (если инструктор изменяет процедуры) @@ -59,9 +60,6 @@ kanban-plugin: board (Так как сейчас может вызвать проблемы при смене логина юзера!!!) - [ ] Зарефакторить databaselms_PostgreSQL.cpp (возможно, нужно использовать транзакции при восстановлении БД!) -- [ ] Отображать текущую версию data в статус баре -- [ ] Сделать крутилку на начальную загрузку Сервера -- [ ] Не блочится Сервер при смене версии ## GUI Messenger @@ -74,6 +72,7 @@ kanban-plugin: board ## GUI общие +- [ ] Отображать текущую версию data в статус баре - [ ] Текстовый поиск в задачах diff --git a/GUIdataBaseLMS/CMakeLists.txt b/GUIdataBaseLMS/CMakeLists.txt index d10d57b..04430c9 100644 --- a/GUIdataBaseLMS/CMakeLists.txt +++ b/GUIdataBaseLMS/CMakeLists.txt @@ -24,6 +24,7 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/connectorToServer/Core) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/messanger) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) +target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/specialmessagebox) if(PROJECT_TYPE_DEBUG) target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees) else() diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index 2d57e00..a8a8775 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -21,6 +21,8 @@ add_library(InstructorsAndTrainees SHARED specialmessagebox/specialmessagebox.cpp specialmessagebox/specialmessagebox.h specialmessagebox/specialmessagebox.ui + specialmessagebox/notifycontroller.cpp + specialmessagebox/notifycontroller.h authorization/dialogauthorization.cpp authorization/dialogauthorization.h @@ -80,8 +82,6 @@ add_library(InstructorsAndTrainees SHARED connectorToServer/Core/tools.cpp connectorToServer/Core/tools.h connectorToServer/Core/FileData.h - connectorToServer/Core/notifycontroller.cpp - connectorToServer/Core/notifycontroller.h connectorToServer/Core/versioncontainer.cpp connectorToServer/Core/versioncontainer.h connectorToServer/Datas.h diff --git a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp deleted file mode 100644 index 152e1cb..0000000 --- a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "notifycontroller.h" -#include "specialmessagebox.h" - -NotifyController::NotifyController(QObject *parent) : QObject(parent) -{ - -} - -void NotifyController::showWarning(QString text) -{ - SpecialMessageBox(nullptr, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); -} diff --git a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h deleted file mode 100644 index 1b08ef9..0000000 --- a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef NOTIFYCONTROLLER_H -#define NOTIFYCONTROLLER_H - -#include -#include - -class NotifyController : public QObject -{ - Q_OBJECT -public: - explicit NotifyController(QObject *parent = nullptr); - - void showWarning(QString text); -signals: - -}; - -#endif // NOTIFYCONTROLLER_H diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index 5989cef..60f232c 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -55,7 +55,7 @@ signals: void sigAnswerQueryTasksXML_AMM(QByteArray array); void sigShowServerDataList(QList *versions); void sigSetVersion(StreamingVersionData* serverVersion); - void sigNotify(QString text); + void sigNotify(QString text, QWidget *parentWidget = nullptr); void sigAnimationActivated(bool flag); void sigHashReady(); void sigAnswerQuerySubProc(QList listSubProc, QString parentTask_dmCode); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 805108b..775e287 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -144,7 +144,7 @@ void ConnectorToServer::createObjects() recognizeSystem = new RecognizeSystem; recognizeSystem->moveToThread(connectionThread); - notifyController = new NotifyController; + notifyController = new NotifyController(parentWidget); versionContainer = new VersionContainer; versionSelectWidget = new VersionSelectWidget(parentWidget); versionSelectWidget->initialize(sendSystem,versionContainer,notifyController, recognizeSystem); diff --git a/InstructorsAndTrainees/specialmessagebox/notifycontroller.cpp b/InstructorsAndTrainees/specialmessagebox/notifycontroller.cpp new file mode 100644 index 0000000..659ae1c --- /dev/null +++ b/InstructorsAndTrainees/specialmessagebox/notifycontroller.cpp @@ -0,0 +1,19 @@ +#include + +#include "notifycontroller.h" +#include "specialmessagebox.h" + +NotifyController::NotifyController(QWidget *parentWidget, QObject *parent) : + QObject(parent), + parentWidget(parentWidget) +{ + +} + +void NotifyController::showWarning(QString text, QWidget *parentWidget) +{ + if(parentWidget) + SpecialMessageBox(parentWidget, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); + else + SpecialMessageBox(this->parentWidget, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); +} diff --git a/InstructorsAndTrainees/specialmessagebox/notifycontroller.h b/InstructorsAndTrainees/specialmessagebox/notifycontroller.h new file mode 100644 index 0000000..638e30b --- /dev/null +++ b/InstructorsAndTrainees/specialmessagebox/notifycontroller.h @@ -0,0 +1,20 @@ +#ifndef NOTIFYCONTROLLER_H +#define NOTIFYCONTROLLER_H + +#include +#include + +class NotifyController : public QObject +{ + Q_OBJECT +public: + explicit NotifyController(QWidget *parentWidget = nullptr, QObject *parent = nullptr); + + void showWarning(QString text, QWidget *parentWidget = nullptr); + +private: + QWidget *parentWidget; + +}; + +#endif // NOTIFYCONTROLLER_H diff --git a/InstructorsAndTrainees/widgets/dialognewversion.h b/InstructorsAndTrainees/widgets/dialognewversion.h index d2261a3..14938c4 100644 --- a/InstructorsAndTrainees/widgets/dialognewversion.h +++ b/InstructorsAndTrainees/widgets/dialognewversion.h @@ -1,6 +1,7 @@ #ifndef DIALOGNEWVERSION_H #define DIALOGNEWVERSION_H +#include #include #include #include diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index a02b13e..7491497 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -79,7 +79,7 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected")); + emit sigSendNotify(tr("Version not selected"), this); return; } @@ -95,7 +95,7 @@ void VersionSelectWidget::sendCopyEmit(QString newName) if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected")); + emit sigSendNotify(tr("Version not selected"), this); return; } @@ -107,7 +107,7 @@ void VersionSelectWidget::on_DeleteVersionButton_clicked() { if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected")); + emit sigSendNotify(tr("Version not selected"), this); return; } @@ -118,7 +118,7 @@ void VersionSelectWidget::on_switchServerVersionButton_clicked() { if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected")); + emit sigSendNotify(tr("Version not selected"), this); return; } diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/widgets/versionselectwidget.h index 9742edc..cee6e9a 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.h +++ b/InstructorsAndTrainees/widgets/versionselectwidget.h @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include @@ -44,7 +44,7 @@ signals: void sigSendDeleteVersion(StreamingVersionData *streaming); void sigSendSwitchVersion(StreamingVersionData *selectVersion); void sigSendCopyVersion(QString versionPair); - void sigSendNotify(QString message); + void sigSendNotify(QString message, QWidget *parentWidget = nullptr); private: From 1c151d4aff454c387904de13304b92e84fce9ebd Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 26 Nov 2025 17:28:22 +0300 Subject: [PATCH 19/31] VersionSelectWidget refact --- InstructorsAndTrainees/commonview.h | 1 + .../connectorToServer/Core/sendsystem.cpp | 7 + .../connectorToServer/Core/sendsystem.h | 7 +- .../connectorToServer/Core/tools.h | 1 + .../connectorToServer/connectortoserver.cpp | 51 ++++-- .../connectorToServer/connectortoserver.h | 25 ++- .../settings/dialogsettings.cpp | 13 ++ InstructorsAndTrainees/tasks/ammtaskswidget.h | 1 + InstructorsAndTrainees/tasks/fimtaskswidget.h | 1 + .../widgets/versionselectwidget.cpp | 157 ++++++++++-------- .../widgets/versionselectwidget.h | 50 +++--- .../widgets/versionselectwidget.ui | 2 +- ServerLMS/Data/PacketType.h | 2 + ServerLMS/Systems/recognizesystem.cpp | 5 + 14 files changed, 221 insertions(+), 102 deletions(-) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index edcc235..5c2a269 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -6,6 +6,7 @@ #include #include "instructorsAndTrainees_global.h" #include "connectortoserver.h" +#include "waitanimationwidget.h" //Родительский класс представления БД Инструкторов/Обучаемых (самого верхнего уровня) diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp index e0ae822..ff5ea24 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp @@ -158,6 +158,13 @@ void SendSystem::sendCopyVersion(QString versionName) stream << versionName; } +void SendSystem::sendGetVersion() +{ + QDataStream stream(socket); + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + stream << PacketType::GET_VERSION; +} + void SendSystem::sendPacketType(PacketType packetType) { QDataStream stream(socket); diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h index 4ecb9f3..37875fe 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h @@ -21,11 +21,14 @@ public: void sendQTConnect(); void sendXMLAnswer(QByteArray array); ~SendSystem(); - void sendFinish(); + void sendFinish(); + +public slots: + void sendPacketType(PacketType packetType); void sendChangeVersion(StreamingVersionData *streamingVersion); void sendDeleteVersion(StreamingVersionData *streamingVersion); void sendCopyVersion(QString versionName); - void sendPacketType(PacketType packetType); + void sendGetVersion(); signals: void sigSend(); QByteArray sigGetXmlAnswer(QString); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index c8b5904..622badb 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -62,6 +62,7 @@ enum PacketType{ TYPE_XMLANSWER_QUERY_LIST_SUB_PROC_AMM = 133, + GET_VERSION = 149, HASH_READY = 150, CHANGE_DATA_VERSION = 151, COPY_VERSION = 152, diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 775e287..00c962e 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -9,10 +9,9 @@ ConnectorToServer::ConnectorToServer(QWidget* parentWidget, QObject *parent) : dataParser(nullptr), sendSystem(nullptr), recognizeSystem(nullptr), - versionSelectWidget(nullptr), - versionContainer(nullptr), notifyController(nullptr), - fl_GetedOfflineMessages(false) + fl_GetedOfflineMessages(false), + nameInstructorLoggedInLocal("") { initialize(); } @@ -20,9 +19,7 @@ ConnectorToServer::ConnectorToServer(QWidget* parentWidget, QObject *parent) : ConnectorToServer::~ConnectorToServer() { delete client; - delete versionSelectWidget; delete notifyController; - delete versionContainer; delete recognizeSystem; delete sendSystem; delete dataParser; @@ -57,7 +54,13 @@ void ConnectorToServer::StopConnectToServer() void ConnectorToServer::setLoginName(QString name) { - versionSelectWidget->setAuthor(name); + //versionSelectWidget->setAuthor(name); + nameInstructorLoggedInLocal = name; +} + +QString ConnectorToServer::getLoginName() +{ + return nameInstructorLoggedInLocal; } void ConnectorToServer::slot_sendMessage(ClientMessage clientMessage) @@ -67,7 +70,8 @@ void ConnectorToServer::slot_sendMessage(ClientMessage clientMessage) void ConnectorToServer::slot_showServerList(QList *serverList) { - versionSelectWidget->fillView(serverList); + //versionSelectWidget->fillView(serverList); + emit signal_showServerList(serverList); } void ConnectorToServer::slot_HashReady() @@ -81,6 +85,26 @@ void ConnectorToServer::slot_Auth(ServerAuthorization *serverAuth) emit sigLoginResult(serverAuth); } +void ConnectorToServer::slot_SendDeleteVersion(StreamingVersionData *streaming) +{ + emit signal_SendDeleteVersion(streaming); +} + +void ConnectorToServer::slot_SendSwitchVersion(StreamingVersionData *selectVersion) +{ + emit signal_SendSwitchVersion(selectVersion); +} + +void ConnectorToServer::slot_SendCopyVersion(QString versionPair) +{ + emit signal_SendCopyVersion(versionPair); +} + +void ConnectorToServer::slot_getVersion() +{ + emit signal_SendGetVersion(); +} + void ConnectorToServer::initialize() { createObjects(); @@ -104,7 +128,6 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult); connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage,Qt::AutoConnection); connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::slot_showServerList); - connect (recognizeSystem,&RecognizeSystem::sigSetVersion,versionContainer,&VersionContainer::setServerVersionData); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListInstructors,this,&ConnectorToServer::slot_AnswerQueryToDB_ListInstructors); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListGroups,this,&ConnectorToServer::slot_AnswerQueryToDB_ListGroups); @@ -127,6 +150,15 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigHashReady,this,&ConnectorToServer::slot_HashReady); connect(recognizeSystem,&RecognizeSystem::signal_AnswerDocsChanged,this,&ConnectorToServer::slot_AnswerDocsChanged); + + connect(recognizeSystem, &RecognizeSystem::sigSetVersion, this, &ConnectorToServer::signal_SetVersion); + connect(recognizeSystem, &RecognizeSystem::sigAnimationActivated, this, &ConnectorToServer::signal_AnimationActivated); + + connect(this, &ConnectorToServer::signal_SendCopyVersion, sendSystem, &SendSystem::sendCopyVersion); + connect(this, &ConnectorToServer::signal_SendDeleteVersion, sendSystem, &SendSystem::sendDeleteVersion); + connect(this, &ConnectorToServer::signal_SendSwitchVersion, sendSystem, &SendSystem::sendChangeVersion); + + connect(this, &ConnectorToServer::signal_SendGetVersion, sendSystem, &SendSystem::sendGetVersion); } void ConnectorToServer::createObjects() @@ -145,9 +177,6 @@ void ConnectorToServer::createObjects() recognizeSystem->moveToThread(connectionThread); notifyController = new NotifyController(parentWidget); - versionContainer = new VersionContainer; - versionSelectWidget = new VersionSelectWidget(parentWidget); - versionSelectWidget->initialize(sendSystem,versionContainer,notifyController, recognizeSystem); connectionThread->start(); connectionThread->setPriority(QThread::HighestPriority); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 8c12202..7b16c0c 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -4,7 +4,6 @@ #include #include #include -#include #include "Core\tcpclient.h" #include "Core\dataparser.h" #include "Core\sendsystem.h" @@ -14,8 +13,9 @@ #include "group.h" #include "computer.h" #include "classroom.h" -#include "streamingversiondata.h" #include "Datas.h" +#include "notifycontroller.h" +#include "streamingversiondata.h" class ConnectorToServer : public QObject { @@ -36,6 +36,7 @@ public: void StopConnectToServer(); void setLoginName(QString name); + QString getLoginName(); public: //Send @@ -107,6 +108,12 @@ public slots: void slot_HashReady(); void slot_Auth(ServerAuthorization * serverAuth); + void slot_SendDeleteVersion(StreamingVersionData *streaming); + void slot_SendSwitchVersion(StreamingVersionData *selectVersion); + void slot_SendCopyVersion(QString versionPair); + + void slot_getVersion(); + signals: void sigSetConnect(ServerSettings* serverSettings,QThread *thread); void sigStopConnect(); @@ -136,6 +143,16 @@ signals: void signal_AnswerDocsChanged(); + void signal_SetVersion(StreamingVersionData* serverVersion); + void signal_AnimationActivated(bool flag); + + void signal_SendDeleteVersion(StreamingVersionData *streaming); + void signal_SendSwitchVersion(StreamingVersionData *selectVersion); + void signal_SendCopyVersion(QString versionPair); + + void signal_showServerList(QList *serverList); + void signal_SendGetVersion(); + private: void initialize(); void bindConnection(); @@ -148,8 +165,6 @@ private: DataParser *dataParser; SendSystem *sendSystem; RecognizeSystem *recognizeSystem; - VersionSelectWidget *versionSelectWidget; - VersionContainer *versionContainer; NotifyController *notifyController; //Списочная модель БД СУО @@ -170,6 +185,8 @@ private: ServerAuthorization serverAuth; bool fl_GetedOfflineMessages; + + QString nameInstructorLoggedInLocal; }; #endif // CONNECTORTOSERVER_H diff --git a/InstructorsAndTrainees/settings/dialogsettings.cpp b/InstructorsAndTrainees/settings/dialogsettings.cpp index 9b9ec4a..e4c972e 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.cpp +++ b/InstructorsAndTrainees/settings/dialogsettings.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "versionselectwidget.h" DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instructorIsLogged, QWidget *parent) : QDialog(parent), @@ -197,9 +198,21 @@ void DialogSettings::on_btnSave_clicked() void DialogSettings::on_btnSetVersion_clicked() { + /* if(connectorToServer) if(connectorToServer->getIsConnected()) connectorToServer->sendShowVersionSelect(); + */ + + if(connectorToServer) + if(connectorToServer->getIsConnected()) + { + VersionSelectWidget *versionSelectWidget = new VersionSelectWidget(connectorToServer, this); + versionSelectWidget->setAuthor(connectorToServer->getLoginName()); + versionSelectWidget->initialize(); + versionSelectWidget->exec(); + delete versionSelectWidget; + } } void DialogSettings::on_cmbLanguage_currentIndexChanged(int index) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index dcc6566..900a4e9 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -9,6 +9,7 @@ #include "tasktreepreparation.h" #include "dialogchekertask.h" #include "dialoglistsubproc.h" +#include "waitanimationwidget.h" namespace Ui { class AMMtasksWidget; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 70ab675..34450a3 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -7,6 +7,7 @@ #include "connectortoserver.h" #include "tasktreepreparation.h" #include "dialogchekertask.h" +#include "waitanimationwidget.h" namespace Ui { class FIMtasksWidget; diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index 7491497..dcd9087 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -1,59 +1,87 @@ -#include "versionselectwidget.h" -#include "ui_versionselectwidget.h" -#include "ui_versionselectwidget.h" - -#include #include -VersionSelectWidget::VersionSelectWidget(QWidget *parent) : - QWidget(parent), +#include "versionselectwidget.h" +#include "specialmessagebox.h" +#include "ui_versionselectwidget.h" + + +VersionSelectWidget::VersionSelectWidget(ConnectorToServer* connectorToServer, QWidget *parent) : + QDialog(parent), ui(new Ui::VersionSelectWidget), + connectorToServer(connectorToServer), + versionContainer(nullptr), + serverDataList(nullptr), selectedVersion(nullptr), waitAnimationWidget(nullptr), - recognizeSystem(nullptr) + authorName(""), + flGetVersion(false) { - ui->setupUi(this); - setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); - setAttribute(Qt::WA_ShowModal,true); -} + ui->setupUi(this); -void VersionSelectWidget::initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController, RecognizeSystem *recognizeSystem) -{ - this->recognizeSystem = recognizeSystem; + setMinimumSize(500, 300); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowTitle(tr("Version control")); + + versionContainer = new VersionContainer; waitAnimationWidget = new WaitAnimationWidget; QMovie *movie = new QMovie(":/resources/icons/762.gif"); waitAnimationWidget->setParent(this); waitAnimationWidget->initialize(movie,this); +} - connect(this,&VersionSelectWidget::sigSendSwitchVersion,sendSystem,&SendSystem::sendChangeVersion,Qt::AutoConnection); - connect(this,&VersionSelectWidget::sigSendCopyVersion,sendSystem,&SendSystem::sendCopyVersion,Qt::AutoConnection); - connect(this,&VersionSelectWidget::sigSendDeleteVersion,sendSystem,&SendSystem::sendDeleteVersion,Qt::AutoConnection); - connect(this,&VersionSelectWidget::sigSendNotify,notifyController,&NotifyController::showWarning,Qt::AutoConnection); +VersionSelectWidget::~VersionSelectWidget() +{ + waitAnimationWidget->hideWithStop(); - connect(recognizeSystem,&RecognizeSystem::sigAnimationActivated,this,&VersionSelectWidget::slot_activateLoadAnimation,Qt::AutoConnection); + delete versionContainer; - this->versionContainer = versionContainer; - hide(); - setWindowTitle(tr("Version control")); + delete waitAnimationWidget; + + delete ui; +} + +void VersionSelectWidget::initialize() +{ + connect (connectorToServer, &ConnectorToServer::signal_SetVersion, this, &VersionSelectWidget::slot_SetVersion); + connect(connectorToServer, &ConnectorToServer::signal_AnimationActivated, this, &VersionSelectWidget::slot_activateLoadAnimation); + + connect(connectorToServer, &ConnectorToServer::signal_showServerList, this, &VersionSelectWidget::slot_showServerList); + + connect(this, &VersionSelectWidget::sigSendSwitchVersion, connectorToServer, &ConnectorToServer::slot_SendSwitchVersion); + connect(this, &VersionSelectWidget::sigSendCopyVersion, connectorToServer, &ConnectorToServer::slot_SendCopyVersion); + connect(this, &VersionSelectWidget::sigSendDeleteVersion, connectorToServer, &ConnectorToServer::slot_SendDeleteVersion); + + connect(this, &VersionSelectWidget::signal_getVersion, connectorToServer, &ConnectorToServer::slot_getVersion); + + emit signal_getVersion(); + //connectorToServer->sendShowVersionSelect(); } void VersionSelectWidget::fillView(QList *serverData) { - show(); ui->verListView->clear(); serverDataList = serverData; ui->verValue->setText(versionContainer->getServerVersionData()->getViewName()); - foreach(StreamingVersionData *data,*serverData) + for(StreamingVersionData *data : *serverData) { ui->verListView->addItem(data->getViewName()); } + + ui->verListView->setCurrentRow(0); + ui->verListView->itemClicked(ui->verListView->item(0)); +} + +QString VersionSelectWidget::changableText(bool flag) +{ + if(flag) return tr("Yes"); + else return tr("No"); } void VersionSelectWidget::on_verListView_itemClicked(QListWidgetItem *item) { - foreach(StreamingVersionData *data,*serverDataList) + for(StreamingVersionData *data : *serverDataList) { if(data->getViewName() == item->text()) { @@ -67,47 +95,42 @@ void VersionSelectWidget::on_verListView_itemClicked(QListWidgetItem *item) } } -QString VersionSelectWidget::changableText(bool flag) -{ - if(flag) return tr("Yes"); - else return tr("No"); -} - - -void VersionSelectWidget::on_createDuplicateButton_clicked() -{ - - if (selectedVersion == nullptr) - { - emit sigSendNotify(tr("Version not selected"), this); - return; - } - - DialogNewVersion *dlgNewVersion = new DialogNewVersion(this); - dlgNewVersion->initialize(this,selectedVersion->getViewName()); - dlgNewVersion->exec(); - delete dlgNewVersion; -} - void VersionSelectWidget::sendCopyEmit(QString newName) { QString result = selectedVersion->getViewName() + ";" + newName + ";" + authorName; if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected"), this); + QString text = tr("Version not selected"); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); return; } - //versionContainer->setLocalVersionData(selectedVersion); + versionContainer->setLocalVersionData(selectedVersion); emit sigSendCopyVersion(result); } -void VersionSelectWidget::on_DeleteVersionButton_clicked() +void VersionSelectWidget::on_createDuplicateButton_clicked() { if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected"), this); + QString text = tr("Version not selected"); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); + return; + } + + DialogNewVersion *dlgNewVersion = new DialogNewVersion(this); + dlgNewVersion->initialize(this, selectedVersion->getViewName()); + dlgNewVersion->exec(); + delete dlgNewVersion; +} + +void VersionSelectWidget::on_deleteVersionButton_clicked() +{ + if (selectedVersion == nullptr) + { + QString text = tr("Version not selected"); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); return; } @@ -118,7 +141,8 @@ void VersionSelectWidget::on_switchServerVersionButton_clicked() { if (selectedVersion == nullptr) { - emit sigSendNotify(tr("Version not selected"), this); + QString text = tr("Version not selected"); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, text).exec(); return; } @@ -139,6 +163,21 @@ void VersionSelectWidget::slot_activateLoadAnimation(bool flag) } } +void VersionSelectWidget::slot_showServerList(QList *serverList) +{ + fillView(serverList); +} + +void VersionSelectWidget::slot_SetVersion(StreamingVersionData *serverVersion) +{ + versionContainer->setServerVersionData(serverVersion); + + if(!flGetVersion) + connectorToServer->sendShowVersionSelect(); + + flGetVersion = true; +} + void VersionSelectWidget::setAuthor(QString name) { authorName = name; @@ -149,15 +188,3 @@ void VersionSelectWidget::resizeEvent(QResizeEvent *event) QSize size = event->size(); waitAnimationWidget->resize(size); } - -VersionSelectWidget::~VersionSelectWidget() -{ - waitAnimationWidget->hideWithStop(); - - delete waitAnimationWidget; - - delete ui; -} - - - diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/widgets/versionselectwidget.h index cee6e9a..21a4e52 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.h +++ b/InstructorsAndTrainees/widgets/versionselectwidget.h @@ -3,30 +3,28 @@ #include #include +#include -#include -#include -#include -#include -#include -#include - -#include "recognizesystem.h" +#include "versioncontainer.h" +#include "streamingversiondata.h" +#include "dialognewversion.h" +#include "waitanimationwidget.h" +#include "connectortoserver.h" +#include "versioncontainer.h" namespace Ui { class VersionSelectWidget; } -class VersionSelectWidget : public QWidget +class VersionSelectWidget : public QDialog { Q_OBJECT public: - explicit VersionSelectWidget(QWidget *parent = nullptr); + explicit VersionSelectWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~VersionSelectWidget(); - void initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController, RecognizeSystem *recognizeSystem); - void fillView(QList *serverData); + void initialize(); void sendCopyEmit(QString newName); void setAuthor(QString name); @@ -35,30 +33,44 @@ public: private slots: void on_createDuplicateButton_clicked(); - void on_DeleteVersionButton_clicked(); + void on_deleteVersionButton_clicked(); void on_switchServerVersionButton_clicked(); + void on_verListView_itemClicked(QListWidgetItem *item); + +private slots: void slot_activateLoadAnimation(bool flag); + void slot_showServerList(QList *serverList); + void slot_SetVersion(StreamingVersionData* serverVersion); signals: void sigSendDeleteVersion(StreamingVersionData *streaming); void sigSendSwitchVersion(StreamingVersionData *selectVersion); void sigSendCopyVersion(QString versionPair); - void sigSendNotify(QString message, QWidget *parentWidget = nullptr); + + void signal_getVersion(); + +private: + QString changableText(bool flag); + void fillView(QList *serverData); private: Ui::VersionSelectWidget *ui; - SendSystem *sendSystem; - QList *serverDataList; + + ConnectorToServer* connectorToServer; + VersionContainer *versionContainer; - NotifyController *notifyController; + + QList *serverDataList; + StreamingVersionData *selectedVersion; + WaitAnimationWidget *waitAnimationWidget; - RecognizeSystem *recognizeSystem; QString authorName; - QString changableText(bool flag); + + bool flGetVersion; }; #endif // VERSIONSELECTWIDGET_H diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.ui b/InstructorsAndTrainees/widgets/versionselectwidget.ui index 93ab51c..669c0c5 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.ui +++ b/InstructorsAndTrainees/widgets/versionselectwidget.ui @@ -156,7 +156,7 @@ - + 0 diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 42c0241..2b0445c 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -45,6 +45,7 @@ enum PacketType TYPE_XMLANSWER_QUERY_LIST_SUB_PROC_AMM = 133, //ответы по обновлениям + GET_VERSION = 149, HASH_READY = 150, CHANGE_DATA_VERSION = 151, COPY_VERSION = 152, @@ -91,6 +92,7 @@ inline QString enumToString(PacketType value) { case PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM: return "TYPE_XMLANSWER_QUERY_TASKS_XML_AMM"; case PacketType::TYPE_XMLANSWER_DOCS_CHANGED: return "TYPE_XMLANSWER_DOCS_CHANGED"; case PacketType::TYPE_XMLANSWER_QUERY_LIST_SUB_PROC_AMM: return "TYPE_XMLANSWER_QUERY_LIST_SUB_PROC_AMM"; + case PacketType::GET_VERSION: return "GET_VERSION"; case PacketType::HASH_READY: return "HASH_READY"; case PacketType::CHANGE_DATA_VERSION: return "CHANGE_DATA_VERSION"; case PacketType::COPY_VERSION: return "COPY_VERSION"; diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 09762bb..1b65e5f 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -372,6 +372,11 @@ void RecognizeSystem::recognize() continue; } + if(packetType == PacketType::GET_VERSION) + { + clientHandler->sendVersion(); + } + if(packetType == PacketType::CHANGE_DATA_VERSION) { stream.startTransaction(); From 23d432170d5a4c564619fddfa608a3c974bb6bb8 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 26 Nov 2025 17:47:56 +0300 Subject: [PATCH 20/31] refact0 --- .../settings/dialogsettings.cpp | 6 ------ .../widgets/dialognewversion.cpp | 14 ++++++++------ .../widgets/dialognewversion.h | 10 ++++------ .../widgets/versionselectwidget.cpp | 18 ++++++++++++++++-- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/InstructorsAndTrainees/settings/dialogsettings.cpp b/InstructorsAndTrainees/settings/dialogsettings.cpp index e4c972e..69ffae6 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.cpp +++ b/InstructorsAndTrainees/settings/dialogsettings.cpp @@ -198,12 +198,6 @@ void DialogSettings::on_btnSave_clicked() void DialogSettings::on_btnSetVersion_clicked() { - /* - if(connectorToServer) - if(connectorToServer->getIsConnected()) - connectorToServer->sendShowVersionSelect(); - */ - if(connectorToServer) if(connectorToServer->getIsConnected()) { diff --git a/InstructorsAndTrainees/widgets/dialognewversion.cpp b/InstructorsAndTrainees/widgets/dialognewversion.cpp index fa2fe5a..8841ab4 100644 --- a/InstructorsAndTrainees/widgets/dialognewversion.cpp +++ b/InstructorsAndTrainees/widgets/dialognewversion.cpp @@ -4,7 +4,6 @@ DialogNewVersion::DialogNewVersion(QWidget *parent) : QDialog(parent), ui(new Ui::DialogNewVersion), - versionSelectWidget(nullptr), validator(nullptr) { ui->setupUi(this); @@ -22,18 +21,21 @@ DialogNewVersion::~DialogNewVersion() delete ui; } -void DialogNewVersion::initialize(VersionSelectWidget *versionSelectWidget, QString prevName) +void DialogNewVersion::initialize(QString prevName) { - this->versionSelectWidget = versionSelectWidget; - ui->prevVerValue->setText(prevName); + ui->prevVerValue->setText(prevName); +} + +QString DialogNewVersion::getNewName() +{ + return ui->lineEdit->text(); } void DialogNewVersion::on_createButton_clicked() { if(ui->lineEdit->text() != "") { - versionSelectWidget->sendCopyEmit(ui->lineEdit->text()); - close(); + accept(); } } diff --git a/InstructorsAndTrainees/widgets/dialognewversion.h b/InstructorsAndTrainees/widgets/dialognewversion.h index 14938c4..ebd5f79 100644 --- a/InstructorsAndTrainees/widgets/dialognewversion.h +++ b/InstructorsAndTrainees/widgets/dialognewversion.h @@ -5,15 +5,12 @@ #include #include #include - -#include "versionselectwidget.h" +#include namespace Ui { class DialogNewVersion; } -class VersionSelectWidget; - class DialogNewVersion : public QDialog { Q_OBJECT @@ -23,16 +20,17 @@ public: ~DialogNewVersion(); public: - void initialize(VersionSelectWidget *versionSelectWidget, QString prevName); + void initialize(QString prevName); + QString getNewName(); private slots: void on_createButton_clicked(); void on_cancelButton_clicked(); + void on_lineEdit_inputRejected(); private: Ui::DialogNewVersion *ui; - VersionSelectWidget *versionSelectWidget; QRegExpValidator *validator; }; diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index dcd9087..0517b11 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -120,8 +120,22 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() } DialogNewVersion *dlgNewVersion = new DialogNewVersion(this); - dlgNewVersion->initialize(this, selectedVersion->getViewName()); - dlgNewVersion->exec(); + dlgNewVersion->initialize(selectedVersion->getViewName()); + + switch(dlgNewVersion->exec()) + { + case QDialog::Accepted: + { + QString newName = dlgNewVersion->getNewName(); + sendCopyEmit(newName); + break; + } + case QDialog::Rejected: + break; + default: + break; + } + delete dlgNewVersion; } From f75ff9660f79fd816670e6b37281ec83a73429a7 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 26 Nov 2025 18:09:41 +0300 Subject: [PATCH 21/31] refact1 --- InstructorsAndTrainees/CMakeLists.txt | 12 ++-- .../dialognewversion.cpp | 0 .../{widgets => settings}/dialognewversion.h | 0 .../{widgets => settings}/dialognewversion.ui | 0 .../settings/dialogsettings.cpp | 7 +- .../dialogversioncontrol.cpp} | 67 +++++++++---------- .../dialogversioncontrol.h} | 22 +++--- .../dialogversioncontrol.ui} | 4 +- 8 files changed, 54 insertions(+), 58 deletions(-) rename InstructorsAndTrainees/{widgets => settings}/dialognewversion.cpp (100%) rename InstructorsAndTrainees/{widgets => settings}/dialognewversion.h (100%) rename InstructorsAndTrainees/{widgets => settings}/dialognewversion.ui (100%) rename InstructorsAndTrainees/{widgets/versionselectwidget.cpp => settings/dialogversioncontrol.cpp} (66%) rename InstructorsAndTrainees/{widgets/versionselectwidget.h => settings/dialogversioncontrol.h} (80%) rename InstructorsAndTrainees/{widgets/versionselectwidget.ui => settings/dialogversioncontrol.ui} (98%) diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index a8a8775..d6cc70a 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -17,6 +17,12 @@ add_library(InstructorsAndTrainees SHARED settings/dialogsettings.cpp settings/dialogsettings.h settings/dialogsettings.ui + settings/dialognewversion.cpp + settings/dialognewversion.h + settings/dialognewversion.ui + settings/dialogversioncontrol.cpp + settings/dialogversioncontrol.h + settings/dialogversioncontrol.ui specialmessagebox/specialmessagebox.cpp specialmessagebox/specialmessagebox.h @@ -132,12 +138,6 @@ add_library(InstructorsAndTrainees SHARED tasks/subprocitemwidget.h tasks/subprocitemwidget.ui - widgets/dialognewversion.cpp - widgets/dialognewversion.h - widgets/dialognewversion.ui - widgets/versionselectwidget.cpp - widgets/versionselectwidget.h - widgets/versionselectwidget.ui widgets/waitanimationwidget.cpp widgets/waitanimationwidget.h widgets/waitanimationwidget.ui diff --git a/InstructorsAndTrainees/widgets/dialognewversion.cpp b/InstructorsAndTrainees/settings/dialognewversion.cpp similarity index 100% rename from InstructorsAndTrainees/widgets/dialognewversion.cpp rename to InstructorsAndTrainees/settings/dialognewversion.cpp diff --git a/InstructorsAndTrainees/widgets/dialognewversion.h b/InstructorsAndTrainees/settings/dialognewversion.h similarity index 100% rename from InstructorsAndTrainees/widgets/dialognewversion.h rename to InstructorsAndTrainees/settings/dialognewversion.h diff --git a/InstructorsAndTrainees/widgets/dialognewversion.ui b/InstructorsAndTrainees/settings/dialognewversion.ui similarity index 100% rename from InstructorsAndTrainees/widgets/dialognewversion.ui rename to InstructorsAndTrainees/settings/dialognewversion.ui diff --git a/InstructorsAndTrainees/settings/dialogsettings.cpp b/InstructorsAndTrainees/settings/dialogsettings.cpp index 69ffae6..2f0c5b7 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.cpp +++ b/InstructorsAndTrainees/settings/dialogsettings.cpp @@ -4,7 +4,7 @@ #include #include #include -#include "versionselectwidget.h" +#include "dialogversioncontrol.h" DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instructorIsLogged, QWidget *parent) : QDialog(parent), @@ -201,9 +201,8 @@ void DialogSettings::on_btnSetVersion_clicked() if(connectorToServer) if(connectorToServer->getIsConnected()) { - VersionSelectWidget *versionSelectWidget = new VersionSelectWidget(connectorToServer, this); - versionSelectWidget->setAuthor(connectorToServer->getLoginName()); - versionSelectWidget->initialize(); + DialogVersionControl *versionSelectWidget = new DialogVersionControl(connectorToServer, this); + versionSelectWidget->initialize(connectorToServer->getLoginName()); versionSelectWidget->exec(); delete versionSelectWidget; } diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp similarity index 66% rename from InstructorsAndTrainees/widgets/versionselectwidget.cpp rename to InstructorsAndTrainees/settings/dialogversioncontrol.cpp index 0517b11..50fb293 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp @@ -1,17 +1,17 @@ #include -#include "versionselectwidget.h" +#include "dialogversioncontrol.h" #include "specialmessagebox.h" -#include "ui_versionselectwidget.h" +#include "ui_dialogversioncontrol.h" -VersionSelectWidget::VersionSelectWidget(ConnectorToServer* connectorToServer, QWidget *parent) : +DialogVersionControl::DialogVersionControl(ConnectorToServer* connectorToServer, QWidget *parent) : QDialog(parent), - ui(new Ui::VersionSelectWidget), - connectorToServer(connectorToServer), - versionContainer(nullptr), + ui(new Ui::DialogVersionControl), + connectorToServer(connectorToServer), serverDataList(nullptr), selectedVersion(nullptr), + versionContainer(nullptr), waitAnimationWidget(nullptr), authorName(""), flGetVersion(false) @@ -30,7 +30,7 @@ VersionSelectWidget::VersionSelectWidget(ConnectorToServer* connectorToServer, Q waitAnimationWidget->initialize(movie,this); } -VersionSelectWidget::~VersionSelectWidget() +DialogVersionControl::~DialogVersionControl() { waitAnimationWidget->hideWithStop(); @@ -41,24 +41,25 @@ VersionSelectWidget::~VersionSelectWidget() delete ui; } -void VersionSelectWidget::initialize() +void DialogVersionControl::initialize(QString authorName) { - connect (connectorToServer, &ConnectorToServer::signal_SetVersion, this, &VersionSelectWidget::slot_SetVersion); - connect(connectorToServer, &ConnectorToServer::signal_AnimationActivated, this, &VersionSelectWidget::slot_activateLoadAnimation); + this->authorName = authorName; - connect(connectorToServer, &ConnectorToServer::signal_showServerList, this, &VersionSelectWidget::slot_showServerList); + connect (connectorToServer, &ConnectorToServer::signal_SetVersion, this, &DialogVersionControl::slot_SetVersion); + connect(connectorToServer, &ConnectorToServer::signal_AnimationActivated, this, &DialogVersionControl::slot_activateLoadAnimation); - connect(this, &VersionSelectWidget::sigSendSwitchVersion, connectorToServer, &ConnectorToServer::slot_SendSwitchVersion); - connect(this, &VersionSelectWidget::sigSendCopyVersion, connectorToServer, &ConnectorToServer::slot_SendCopyVersion); - connect(this, &VersionSelectWidget::sigSendDeleteVersion, connectorToServer, &ConnectorToServer::slot_SendDeleteVersion); + connect(connectorToServer, &ConnectorToServer::signal_showServerList, this, &DialogVersionControl::slot_showServerList); - connect(this, &VersionSelectWidget::signal_getVersion, connectorToServer, &ConnectorToServer::slot_getVersion); + connect(this, &DialogVersionControl::sigSendSwitchVersion, connectorToServer, &ConnectorToServer::slot_SendSwitchVersion); + connect(this, &DialogVersionControl::sigSendCopyVersion, connectorToServer, &ConnectorToServer::slot_SendCopyVersion); + connect(this, &DialogVersionControl::sigSendDeleteVersion, connectorToServer, &ConnectorToServer::slot_SendDeleteVersion); + + connect(this, &DialogVersionControl::signal_getVersion, connectorToServer, &ConnectorToServer::slot_getVersion); emit signal_getVersion(); - //connectorToServer->sendShowVersionSelect(); } -void VersionSelectWidget::fillView(QList *serverData) +void DialogVersionControl::fillView(QList *serverData) { ui->verListView->clear(); serverDataList = serverData; @@ -69,17 +70,20 @@ void VersionSelectWidget::fillView(QList *serverData) ui->verListView->addItem(data->getViewName()); } - ui->verListView->setCurrentRow(0); - ui->verListView->itemClicked(ui->verListView->item(0)); + if(ui->verListView->count()) + { + ui->verListView->setCurrentRow(0); + ui->verListView->itemClicked(ui->verListView->item(0)); + } } -QString VersionSelectWidget::changableText(bool flag) +QString DialogVersionControl::changableText(bool flag) { if(flag) return tr("Yes"); else return tr("No"); } -void VersionSelectWidget::on_verListView_itemClicked(QListWidgetItem *item) +void DialogVersionControl::on_verListView_itemClicked(QListWidgetItem *item) { for(StreamingVersionData *data : *serverDataList) { @@ -95,7 +99,7 @@ void VersionSelectWidget::on_verListView_itemClicked(QListWidgetItem *item) } } -void VersionSelectWidget::sendCopyEmit(QString newName) +void DialogVersionControl::sendCopyEmit(QString newName) { QString result = selectedVersion->getViewName() + ";" + newName + ";" + authorName; @@ -110,7 +114,7 @@ void VersionSelectWidget::sendCopyEmit(QString newName) emit sigSendCopyVersion(result); } -void VersionSelectWidget::on_createDuplicateButton_clicked() +void DialogVersionControl::on_createDuplicateButton_clicked() { if (selectedVersion == nullptr) { @@ -139,7 +143,7 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() delete dlgNewVersion; } -void VersionSelectWidget::on_deleteVersionButton_clicked() +void DialogVersionControl::on_deleteVersionButton_clicked() { if (selectedVersion == nullptr) { @@ -151,7 +155,7 @@ void VersionSelectWidget::on_deleteVersionButton_clicked() emit sigSendDeleteVersion(selectedVersion); } -void VersionSelectWidget::on_switchServerVersionButton_clicked() +void DialogVersionControl::on_switchServerVersionButton_clicked() { if (selectedVersion == nullptr) { @@ -165,7 +169,7 @@ void VersionSelectWidget::on_switchServerVersionButton_clicked() emit sigSendSwitchVersion(selectedVersion); } -void VersionSelectWidget::slot_activateLoadAnimation(bool flag) +void DialogVersionControl::slot_activateLoadAnimation(bool flag) { if (flag) { @@ -177,12 +181,12 @@ void VersionSelectWidget::slot_activateLoadAnimation(bool flag) } } -void VersionSelectWidget::slot_showServerList(QList *serverList) +void DialogVersionControl::slot_showServerList(QList *serverList) { fillView(serverList); } -void VersionSelectWidget::slot_SetVersion(StreamingVersionData *serverVersion) +void DialogVersionControl::slot_SetVersion(StreamingVersionData *serverVersion) { versionContainer->setServerVersionData(serverVersion); @@ -192,12 +196,7 @@ void VersionSelectWidget::slot_SetVersion(StreamingVersionData *serverVersion) flGetVersion = true; } -void VersionSelectWidget::setAuthor(QString name) -{ - authorName = name; -} - -void VersionSelectWidget::resizeEvent(QResizeEvent *event) +void DialogVersionControl::resizeEvent(QResizeEvent *event) { QSize size = event->size(); waitAnimationWidget->resize(size); diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/settings/dialogversioncontrol.h similarity index 80% rename from InstructorsAndTrainees/widgets/versionselectwidget.h rename to InstructorsAndTrainees/settings/dialogversioncontrol.h index 21a4e52..e82e9e6 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.h +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.h @@ -10,23 +10,20 @@ #include "dialognewversion.h" #include "waitanimationwidget.h" #include "connectortoserver.h" -#include "versioncontainer.h" namespace Ui { -class VersionSelectWidget; +class DialogVersionControl; } -class VersionSelectWidget : public QDialog +class DialogVersionControl : public QDialog { Q_OBJECT public: - explicit VersionSelectWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); - ~VersionSelectWidget(); + explicit DialogVersionControl(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + ~DialogVersionControl(); - void initialize(); - void sendCopyEmit(QString newName); - void setAuthor(QString name); + void initialize(QString authorName); public: void resizeEvent(QResizeEvent *event) override; @@ -53,19 +50,20 @@ signals: private: QString changableText(bool flag); void fillView(QList *serverData); + void sendCopyEmit(QString newName); private: - Ui::VersionSelectWidget *ui; + Ui::DialogVersionControl *ui; - ConnectorToServer* connectorToServer; - - VersionContainer *versionContainer; + ConnectorToServer* connectorToServer; QList *serverDataList; StreamingVersionData *selectedVersion; + VersionContainer *versionContainer; + WaitAnimationWidget *waitAnimationWidget; QString authorName; diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.ui b/InstructorsAndTrainees/settings/dialogversioncontrol.ui similarity index 98% rename from InstructorsAndTrainees/widgets/versionselectwidget.ui rename to InstructorsAndTrainees/settings/dialogversioncontrol.ui index 669c0c5..9426f52 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.ui +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.ui @@ -1,7 +1,7 @@ - VersionSelectWidget - + DialogVersionControl + 0 From 3e50bfe2e26e5d5feadd83cd95bb173701bc851a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 10:43:12 +0300 Subject: [PATCH 22/31] =?UTF-8?q?=D0=A1=D1=85=D0=BB=D0=BE=D0=BF=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=B2=D1=8B=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUIdataBaseLMS/CMakeLists.txt | 1 + .../instructorsandtraineeswidget.cpp | 31 ++++++++++++++----- .../instructorsandtraineeswidget.h | 2 ++ .../settings/dialogsettings.cpp | 29 ++++++++++++++--- .../settings/dialogsettings.h | 5 +++ .../settings/dialogversioncontrol.cpp | 16 ++++++++-- .../settings/dialogversioncontrol.h | 2 ++ 7 files changed, 72 insertions(+), 14 deletions(-) diff --git a/GUIdataBaseLMS/CMakeLists.txt b/GUIdataBaseLMS/CMakeLists.txt index 04430c9..76da07e 100644 --- a/GUIdataBaseLMS/CMakeLists.txt +++ b/GUIdataBaseLMS/CMakeLists.txt @@ -25,6 +25,7 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/messanger) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/specialmessagebox) +target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/settings) if(PROJECT_TYPE_DEBUG) target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees) else() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 285a61b..c47337d 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -22,6 +22,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : messangerWidget(nullptr), messangerController(nullptr), dlgTasksCommon(nullptr), + dlgSettings(nullptr), adminMode(false), loginInstructorLoggedInLocal(QStringLiteral("")), nameInstructorLoggedInLocal(QStringLiteral("")), @@ -107,6 +108,9 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget() if(dlgTasksCommon) dlgTasksCommon->close(); + if(dlgSettings) + dlgSettings->close(); + delete messangerController; delete viewerInstructors; delete viewerTrainees; @@ -285,6 +289,9 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) viewerTrainees->deactivate(); viewerInstructors->deactivate(); + if(dlgSettings) + dlgSettings->deactivate(); + messangerController->deleteAllWidgets(); loginInstructorLoggedInLocal = ""; @@ -466,6 +473,9 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() viewerTrainees->deactivate(); viewerInstructors->deactivate(); + if(dlgSettings) + dlgSettings->deactivate(); + messangerController->deleteAllWidgets(); } else @@ -536,20 +546,19 @@ void InstructorsAndTraineesWidget::setLanguageInterfase() void InstructorsAndTraineesWidget::on_btnSettings_clicked() { - DialogSettings dlg(connectorToServer, (loginInstructorLoggedInLocal != ""), this); - dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint); + dlgSettings = new DialogSettings(connectorToServer, (loginInstructorLoggedInLocal != ""), this); + dlgSettings->setWindowFlags(dlgSettings->windowFlags() & ~Qt::WindowContextHelpButtonHint); - connect(&dlg, &DialogSettings::signal_LanguageChanged, this, &InstructorsAndTraineesWidget::slot_LanguageChanged); - connect(&dlg, &DialogSettings::signal_UpdateStyleSheet, this, &InstructorsAndTraineesWidget::slot_UpdateStyleSheet); + connect(dlgSettings, &DialogSettings::signal_LanguageChanged, this, &InstructorsAndTraineesWidget::slot_LanguageChanged); + connect(dlgSettings, &DialogSettings::signal_UpdateStyleSheet, this, &InstructorsAndTraineesWidget::slot_UpdateStyleSheet); - - switch( dlg.exec() ) + switch( dlgSettings->exec() ) { case QDialog::Accepted: { - language = dlg.getSettings().Language; + language = dlgSettings->getSettings().Language; - if(dlg.settingsServerIsChanged()) + if(dlgSettings->settingsServerIsChanged()) { SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Server settings have been changed. Please reconnect to the server.")).exec(); @@ -568,6 +577,12 @@ void InstructorsAndTraineesWidget::on_btnSettings_clicked() default: break; } + + if(dlgSettings) + { + delete dlgSettings; + dlgSettings = nullptr; + } } void InstructorsAndTraineesWidget::on_btnEditorTrainees_clicked() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 4328ee4..2b9b19d 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -11,6 +11,7 @@ #include "connectortoserver.h" #include "metatypes.h" #include "dialogtaskscommon.h" +#include "dialogsettings.h" namespace Ui { @@ -98,6 +99,7 @@ private: MessangerController* messangerController; DialogTasksCommon* dlgTasksCommon; + DialogSettings* dlgSettings; bool adminMode; QString loginInstructorLoggedInLocal; diff --git a/InstructorsAndTrainees/settings/dialogsettings.cpp b/InstructorsAndTrainees/settings/dialogsettings.cpp index 2f0c5b7..28fe4f1 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.cpp +++ b/InstructorsAndTrainees/settings/dialogsettings.cpp @@ -11,6 +11,7 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru ui(new Ui::DialogSettings), settings(nullptr), connectorToServer(nullptr), + dlgVersionControl(nullptr), flSettingsServerChanged(false) { ui->setupUi(this); @@ -76,10 +77,25 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru DialogSettings::~DialogSettings() { + if(dlgVersionControl) + dlgVersionControl->close(); + delete ui; delete settings; } +void DialogSettings::deactivate() +{ + ui->btnSetVersion->setEnabled(false); + + if(dlgVersionControl) + { + dlgVersionControl->close(); + delete dlgVersionControl; + dlgVersionControl = nullptr; + } +} + ServerSettings DialogSettings::getSettings() { return *settings; @@ -201,10 +217,15 @@ void DialogSettings::on_btnSetVersion_clicked() if(connectorToServer) if(connectorToServer->getIsConnected()) { - DialogVersionControl *versionSelectWidget = new DialogVersionControl(connectorToServer, this); - versionSelectWidget->initialize(connectorToServer->getLoginName()); - versionSelectWidget->exec(); - delete versionSelectWidget; + dlgVersionControl = new DialogVersionControl(connectorToServer, this); + dlgVersionControl->initialize(connectorToServer->getLoginName()); + dlgVersionControl->exec(); + + if(dlgVersionControl) + { + delete dlgVersionControl; + dlgVersionControl = nullptr; + } } } diff --git a/InstructorsAndTrainees/settings/dialogsettings.h b/InstructorsAndTrainees/settings/dialogsettings.h index b77839c..78669d1 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.h +++ b/InstructorsAndTrainees/settings/dialogsettings.h @@ -6,6 +6,7 @@ #include #include "Datas.h" #include "connectortoserver.h" +#include "dialogversioncontrol.h" namespace Ui { class DialogSettings; @@ -19,6 +20,8 @@ public: explicit DialogSettings(ConnectorToServer* connectorToServer, bool instructorIsLogged, QWidget *parent = nullptr); ~DialogSettings(); + void deactivate(); + ServerSettings getSettings(); bool settingsServerIsChanged(){ return flSettingsServerChanged;} @@ -53,6 +56,8 @@ private: ServerSettings *settings; ConnectorToServer* connectorToServer; + DialogVersionControl *dlgVersionControl; + bool flSettingsServerChanged; }; diff --git a/InstructorsAndTrainees/settings/dialogversioncontrol.cpp b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp index 50fb293..03064ed 100644 --- a/InstructorsAndTrainees/settings/dialogversioncontrol.cpp +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp @@ -13,6 +13,7 @@ DialogVersionControl::DialogVersionControl(ConnectorToServer* connectorToServer, selectedVersion(nullptr), versionContainer(nullptr), waitAnimationWidget(nullptr), + dlgNewVersion(nullptr), authorName(""), flGetVersion(false) { @@ -32,6 +33,13 @@ DialogVersionControl::DialogVersionControl(ConnectorToServer* connectorToServer, DialogVersionControl::~DialogVersionControl() { + if(dlgNewVersion) + { + dlgNewVersion->close(); + delete dlgNewVersion; + dlgNewVersion = nullptr; + } + waitAnimationWidget->hideWithStop(); delete versionContainer; @@ -123,7 +131,7 @@ void DialogVersionControl::on_createDuplicateButton_clicked() return; } - DialogNewVersion *dlgNewVersion = new DialogNewVersion(this); + dlgNewVersion = new DialogNewVersion(this); dlgNewVersion->initialize(selectedVersion->getViewName()); switch(dlgNewVersion->exec()) @@ -140,7 +148,11 @@ void DialogVersionControl::on_createDuplicateButton_clicked() break; } - delete dlgNewVersion; + if(dlgNewVersion) + { + delete dlgNewVersion; + dlgNewVersion = nullptr; + } } void DialogVersionControl::on_deleteVersionButton_clicked() diff --git a/InstructorsAndTrainees/settings/dialogversioncontrol.h b/InstructorsAndTrainees/settings/dialogversioncontrol.h index e82e9e6..146f1fb 100644 --- a/InstructorsAndTrainees/settings/dialogversioncontrol.h +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.h @@ -66,6 +66,8 @@ private: WaitAnimationWidget *waitAnimationWidget; + DialogNewVersion *dlgNewVersion; + QString authorName; bool flGetVersion; From 711963c9bebc5182005ec2e522fdae69216f453b Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 11:24:06 +0300 Subject: [PATCH 23/31] refact0 --- .../settings/dialogsettings.cpp | 9 + .../settings/dialogsettings.h | 2 +- .../settings/dialogversioncontrol.ui | 2 +- .../InstructorsAndTraineesWidget_ru_RU.qm | Bin 22546 -> 23118 bytes .../InstructorsAndTraineesWidget_ru_RU.ts | 337 ++++++++++-------- 5 files changed, 192 insertions(+), 158 deletions(-) diff --git a/InstructorsAndTrainees/settings/dialogsettings.cpp b/InstructorsAndTrainees/settings/dialogsettings.cpp index 28fe4f1..30ca444 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.cpp +++ b/InstructorsAndTrainees/settings/dialogsettings.cpp @@ -78,7 +78,11 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru DialogSettings::~DialogSettings() { if(dlgVersionControl) + { dlgVersionControl->close(); + delete dlgVersionControl; + dlgVersionControl = nullptr; + } delete ui; delete settings; @@ -101,6 +105,11 @@ ServerSettings DialogSettings::getSettings() return *settings; } +bool DialogSettings::settingsServerIsChanged() +{ + return flSettingsServerChanged; +} + void DialogSettings::changeEvent(QEvent *event) { // В случае получения события изменения языка приложения diff --git a/InstructorsAndTrainees/settings/dialogsettings.h b/InstructorsAndTrainees/settings/dialogsettings.h index 78669d1..0712cab 100644 --- a/InstructorsAndTrainees/settings/dialogsettings.h +++ b/InstructorsAndTrainees/settings/dialogsettings.h @@ -24,7 +24,7 @@ public: ServerSettings getSettings(); - bool settingsServerIsChanged(){ return flSettingsServerChanged;} + bool settingsServerIsChanged(); static bool loadSettings(ServerSettings *settings); diff --git a/InstructorsAndTrainees/settings/dialogversioncontrol.ui b/InstructorsAndTrainees/settings/dialogversioncontrol.ui index 9426f52..b4a113a 100644 --- a/InstructorsAndTrainees/settings/dialogversioncontrol.ui +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.ui @@ -193,7 +193,7 @@ - Change server version + Change version diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm index eaf4dafc2ecd00f686fced9a99386ea7ccd8910d..1490a1caf5f0e0d76bc07e3ee0136b8dea195f01 100644 GIT binary patch delta 2836 zcmZ{kdr;KZ70183+JAAQcbuJDq=$2%xI%AM5C5WN=q=02^G^2O%ozIj!NurGPabkda(Z=f_zTwr6>e zb2~6o4fxV!c@gxLa~1~!`8NP_J7=*TD7{7p_XAH|2BLJF)<&S7GfZ5 z78$|Xw*j+nahhwu&NJW%A5LdtAlOI0r6^W%%JiHOn>f=tIWr?T4W~Jc4o;Js)7;Bx z{gAVG9cRfbNRp2N^V=Xv9|MBTkjzh|Kx!xGgmQoj)DfJTcQ}3D<22pmoc{?V4KL9J zjgaiS0;mf(eZJ-N`A$=z3dzDF z!1OC5Cj_W~?;=z_EiDcp+NFc5qT{-Uq zLCf&z&o2T=2SiCZ6mGUgq!&{`i)uubJ$XKeDa&Ok#O7oKO31{I!cBA*#G=zI4 zsjXvx>b|6)hdiD)D5**|0m_G*nh{Rl2a>k7OVnw%C7nAcux#^NNW zM#Sk`F7F&BCsjI5;qOkq@HxZjcSio&vQ8k-E+08|i=w$L|9+epU z2uxe8Tz!xx$oy|*L;e`>Gl%l(=nysTM=HO5dN|UV%I_vU9HI-V;4SSm!W&en&qvW{ zqLMFC2UUxs-T?|$s~Qr?k;EgaCPtC_$8(x2oR)K{=123$@TaQwZfZ!4fz#NbI{pf! z+&on^V7&t9(p5tl6nLalHTEn`LikxBvyd`3vr#De(=mGNODE_=Vwq6!;;Ur%d!enT zh#sYF;weSoa*0s zYxk3Zm{LyNR__lQBWZt+_utkK63t_Rxnt}eeQSE)91LNQKlK&-1NsK?bDTs@(?7Zfz1Bf7s0-Y#+# z8nb+iYb$GNt8G=!mQ~elTwCjK?K37!77iGvO%@8K+{wbHOqq-R|4xw?RV$c9upE}c zl9?UR#8ftq>Dg>%my;4w`c&jabOU!oM*ov9KWVC+EQ~fr_)eCJ%8YJz=t?iw{-P;? z0oL(Hvp)YsM4xIQRaANE+ygujul#l?}X!U9FSI(JQ_qq^#+u08gc>)qlM52lnQ z86Gs{B{~n9eI*tTn$ePY51N?^PI}OMXO8ipi7QRYdu%)tX^>LcQkmhuMH1U;$7}Q0 z1Fn}#J-Iwmn(4v3VPU=pO~=A851RhDfsxEn>!|YRirXjhc8ETXMN!YqWd+Q@GFdY9 you2+v*(~b2Y-0BR^q(I!hNEg#JxxJ$Wqp0s`e*9he@_2};9iucSGuKTg7`mWl_e$s delta 2655 zcma)+dr(yO7017K_wL@iyO-TX-UusYSx{hQMOWSntD*}myNoCrj9SDMY$JA1(Q3<$ zl}^cO5@n6XM=%emidG%TgvM708L@Pfj0sIJ4`QzTt zz32RX=lMIofj7Cfv)u0RlHCAofa7-nKL~IEM(qMd>p4K>1&R+bx-S!#(SJW6kUV=T zqwCWb`9OFAtR71d2#DPOlYMbd@$909L+7#vU`4e*rI<_5nF{y)bdbL8;@g0SEPhst8p*nn^_$+AvD5zDgIR6tWL#wjZy#koB zMcFXl0mN=q_MZPSkmy$4_h$jhF<#wW4dk~63X~>!!64sshvG~-&-;%I(L^LOrf+7< zmid=UF4FR^_~XCtAUCOery>lPbC*ArPXAmQqqUT=%*~(Kv4rwl$T;sl|MrI4fOM3< ztfc|T_=f+3;!Ub&2;aZY2^lumlMfWf@i+T_LnHQ*%D!(5&^=PwZ_+}8z-TfA{MRj3)KTU33=DKN!9)e7Yz%GakBE>+S*LLGL3>`p6I zXGRSJp%2vy23E;rNUz?qX$6hwb@kQ@zn~4N>Z661fyg?>AEm3GL@f3(y5a@t|^0f0|lymMtJ`^C8kLc z4fka#jq)8adJP3o(kbTGjR7gEM9;ZVIvQ@#JH20(tzz31YLVA3wp}HL%@mJ_v&i8IM!n2vd|K?3hbaS{RqPz6RL^MW zW(;+Tr=RYmp1&nN=%7H=pNkL2iBZPve`rEpprbeAlE&E64#cg~*uU5gWPYnD2|Gv^ z-dCFXVFz7uRhovs(l+xSHNS48+Y|3FW_N4k?k_3x_;s4z>KEv6)N5|cPNPwb(TqrD zGW1(U&n3;s>#x%7=wV#&oHjZqfrhb@an2TPzV#6~tkEv}yctL+(5`ufW}~QC+f+IR zq!w%YMu&j8i*=K3(3N2QL^tU(x)QjHvM&1BcACyxI{Wr16j=>p`Z?WGQ{JTww{=bF z6o`4Nu9c_EL%SLC-e#PWrSm^7BFCq7?PuvQ>U$XTjJjh7spN$nx(~~*07-h?P!5?d zFVl@}rYR_Em2%xwxvBDEsp9<(I!tMdW~;Q~#n#loHBi0@$10sSM;te95G#gXkZMmEYqJI_!+gtXjmw;Q7du{ZHY7;qJ=SU7i0cr zMu%*;@#zjqWSim6DI-;6@>-yxsx2n6>kFYu>gowUqDYD4qj(#i$2<6$d^TT1%%uMU zktzfA_~Tw*SLa(Da7OJ6_@i%Ge$e`WC#I##AG?F=T5Wnw*|jF+R!rAvXQdR-#uXYp zzRgv>#tm!NH!NAZy3V&T@KjvdMB(1JX%mIlPDs1hyVVc*A7>3hakyYc&|3KQ4G22*fKs>-au)kIS{68Hk%MsFu?r_yCUdE5U} zx`?^;H4SyXgblvNCSPL$J>y9Wv^|*JK%_Y{cqGfsIl&bt&DP+GyXF%8|N00x9MglZ zZB07y|7)Aerv_j9OG`#@#k-cc;EJy;CBYRH$+^K5N0Li}E4+&*2Uko_F$GtwG|lVU IzVtfxZxA@<&Hw-a diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts index 9288c56..95175e0 100644 --- a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts +++ b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts @@ -275,6 +275,11 @@ The status will be set: Log in Войти + + + Only Latin letters and numbers + Только латинские буквы и цифры + DialogCardTrainee @@ -350,14 +355,19 @@ The status will be set: - Logged - Залогирован + Online + В сети Save Сохранить + + + Only Latin letters and numbers + Только латинские буквы и цифры + DialogEditTrainee @@ -394,14 +404,19 @@ The status will be set: - Logged - Залогирован + Online + В сети Save Сохранить + + + Only Latin letters and numbers + Только латинские буквы и цифры + DialogListSubProc @@ -424,6 +439,49 @@ The status will be set: Сохранить + + DialogNewVersion + + + Create copy... + Создать копию... + + + + Basic version: + Базовая версия: + + + + TextLabel + + + + + New name version: + Имя копии: + + + + Create + Создать + + + + Cancel + Отменить + + + + New version + Новая версия + + + + Only Latin letters and numbers + Только латинские буквы и цифры + + DialogRedactorInstructors @@ -506,6 +564,97 @@ The status will be set: Просмотршик списка процедур + + DialogVersionControl + + + Form + Форма + + + + Available versions on the server: + Доступные версии на сервере: + + + + Info: + Информация: + + + + Double click on the version to see information... + Двойной клик на версии для просмотра информации... + + + + Current server version: + Текущая версия: + + + + none + нет + + + + Create copy + Создать копию + + + + Delete + Удалить + + + + Change version + Изменить версию + + + + Version control + Управление версиями + + + + Yes + Да + + + + No + Нет + + + + Version name: + Имя версии: + + + + Created: + Создан: + + + + Changeable: + Изменен: + + + + Author: + Автор: + + + + + + + Version not selected + Версия не выбрана + + EditorInstructors @@ -744,32 +893,32 @@ The changes will not be accepted. Удалить - - + + ID ID - - + + Status Статус - - + + Procedure FIM Процедура FIM - + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + Assign this task? Назначить эту задачу? @@ -844,57 +993,62 @@ Delete it anyway? - + none нет - + The file could not be opened Файл не может быть открыт - + Instructor authorization. Авторизация инструктора. - + Instructor deauthorization Деавторизация инструктора - + Error! Ошибка! - + The server is not available! Сервер недоступен! - + + Connection attempt + Попытка соединения + + + connected подключен - + not connected не подключен - + Server settings have been changed. Please reconnect to the server. Настройки сервера изменены. Выполните переподключение к серверу. - + Instructor authorization Авторизация инструктора - + Invalid login or password! Неправильный логин или пароль! @@ -1005,44 +1159,6 @@ Delete it anyway? --:-- - - NewVersionWidget - - - Create copy... - Создать копию... - - - - Basic version: - Базовая версия: - - - - TextLabel - - - - - New name version: - Имя копии: - - - - Create - Создать - - - - Cancel - Отменить - - - - Only Latin letters and numbers - Только латинские буквы и цифры - - PersonalCardTrainee @@ -1218,28 +1334,28 @@ Delete it anyway? - + completed выполнена - + failed неверно - + checkup на проверке - + new новая @@ -1257,97 +1373,6 @@ Delete it anyway? нет - - VersionSelectWidget - - - Form - Форма - - - - Available versions on the server: - Доступные версии на сервере: - - - - Create copy - Создать копию - - - - Delete - Удалить - - - - Change server version - Изменить версию на сервере - - - - Info: - Информация: - - - - Double click on the version to see information... - Двойной клик на версии для просмотра информации... - - - - Current server version: - Текущая версия: - - - - none - нет - - - - Version control - Управление версиями - - - - Version name: - Имя версии: - - - - Created: - Создан: - - - - Changeable: - Изменен: - - - - Author: - Автор: - - - - Yes - Да - - - - No - Нет - - - - - - - Version not selected - Версия не выбрана - - ViewerInstructors From f0e04954ed013eef53897c2e3b2990bdbfbeba27 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 11:45:14 +0300 Subject: [PATCH 24/31] refact1 --- InstructorsAndTrainees/settings/dialogversioncontrol.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/InstructorsAndTrainees/settings/dialogversioncontrol.cpp b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp index 03064ed..c881502 100644 --- a/InstructorsAndTrainees/settings/dialogversioncontrol.cpp +++ b/InstructorsAndTrainees/settings/dialogversioncontrol.cpp @@ -176,8 +176,8 @@ void DialogVersionControl::on_switchServerVersionButton_clicked() return; } - versionContainer->setServerVersionData(selectedVersion); - ui->verValue->setText(selectedVersion->getViewName()); + //versionContainer->setServerVersionData(selectedVersion); + //ui->verValue->setText(selectedVersion->getViewName()); emit sigSendSwitchVersion(selectedVersion); } @@ -201,6 +201,7 @@ void DialogVersionControl::slot_showServerList(QList *se void DialogVersionControl::slot_SetVersion(StreamingVersionData *serverVersion) { versionContainer->setServerVersionData(serverVersion); + ui->verValue->setText(versionContainer->getServerVersionData()->getViewName()); if(!flGetVersion) connectorToServer->sendShowVersionSelect(); From b0f02e742a8cd0650a6adc6a9b6d95297bd2deb0 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 13:25:30 +0300 Subject: [PATCH 25/31] =?UTF-8?q?=D0=9E=D1=82=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20BUSSY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/connectortoserver.cpp | 8 ++++++ .../connectorToServer/connectortoserver.h | 2 ++ .../instructorsandtraineeswidget.cpp | 28 ++++++++++++++++++- .../instructorsandtraineeswidget.h | 5 ++++ ServerLMS/Systems/processingsystem.cpp | 3 ++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 00c962e..d82e95b 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -85,6 +85,11 @@ void ConnectorToServer::slot_Auth(ServerAuthorization *serverAuth) emit sigLoginResult(serverAuth); } +void ConnectorToServer::slot_ServerBlocked() +{ + emit sigServerBlocked(); +} + void ConnectorToServer::slot_SendDeleteVersion(StreamingVersionData *streaming) { emit signal_SendDeleteVersion(streaming); @@ -126,6 +131,9 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAuth,this,&ConnectorToServer::slot_Auth); connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult); + + connect(recognizeSystem,&RecognizeSystem::sigServerBlocked,this,&ConnectorToServer::slot_ServerBlocked); + connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage,Qt::AutoConnection); connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::slot_showServerList); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 7b16c0c..d4663bb 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -107,6 +107,7 @@ public slots: void slot_showServerList(QList *serverList); void slot_HashReady(); void slot_Auth(ServerAuthorization * serverAuth); + void slot_ServerBlocked(); void slot_SendDeleteVersion(StreamingVersionData *streaming); void slot_SendSwitchVersion(StreamingVersionData *selectVersion); @@ -123,6 +124,7 @@ signals: void sigLoginResult(ServerAuthorization * serverAuth); void sigDeLoginResult(ServerDeAuthorization * serverDeAuth); + void sigServerBlocked(); void signal_UpdateDB(bool treeInstructor, bool treeTrainee); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index c47337d..aff4a6e 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -31,6 +31,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : flSettingsServerIsChanged(false), flTryConnectToServer(false), cntTryConnectToServer(0), + flTryLogin(false), ui(new Ui::InstructorsAndTraineesWidget) { ui->setupUi(this); @@ -51,6 +52,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connectorToServer = new ConnectorToServer(this); connect(connectorToServer, &ConnectorToServer::sigLoginResult, this, &InstructorsAndTraineesWidget::slot_checkLoginResult); connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult); + connect(connectorToServer, &ConnectorToServer::sigServerBlocked, this, &InstructorsAndTraineesWidget::slot_ServerBlocked); connect(connectorToServer,&ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); messangerController = new MessangerController(connectorToServer, this); @@ -219,12 +221,18 @@ void InstructorsAndTraineesWidget::slot_checkLoginResult(ServerAuthorization *se viewerTrainees->activate(); viewerInstructors->activate(); + + waitAnimationWidget->hideWithStop(); } else { + waitAnimationWidget->hideWithStop(); + ui->btnAuthorizationInstructor->setChecked(false); SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Instructor authorization.") + "\n" + tr("Invalid login or password!")).exec(); } + + flTryLogin = false; } void InstructorsAndTraineesWidget::slot_checkDeLoginResult(ServerDeAuthorization *serverDeAuth) @@ -253,6 +261,18 @@ void InstructorsAndTraineesWidget::slot_checkDeLoginResult(ServerDeAuthorization } } +void InstructorsAndTraineesWidget::slot_ServerBlocked() +{ + if(flTryLogin) + { + flTryLogin = false; + waitAnimationWidget->hideWithStop(); + + ui->btnAuthorizationInstructor->setChecked(false); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Attention!") + "\n" + tr("Server blocked!")).exec(); + } +} + void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) { if(state) @@ -332,7 +352,9 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) updateLabelServer(); - } + + flTryLogin = false; + } } void InstructorsAndTraineesWidget::slot_traineeSelected(int id_trainee) @@ -402,6 +424,10 @@ bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent // Вычисление MD5 хэша password = HashTools::hashingMD5string(password); + waitAnimationWidget->showWithPlay(); + + flTryLogin = true; + connectorToServer->sendAuthorizationInstructorLocal(login, password); return true; diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 2b9b19d..7f2dc8d 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -51,6 +51,9 @@ public Q_SLOTS: void slot_checkLoginResult(ServerAuthorization * serverAuth); //Слот обработки результата деавторизации void slot_checkDeLoginResult(ServerDeAuthorization * serverDeAuth); + + void slot_ServerBlocked(); + //Слот обработки результата подключения к серверу void slot_ConnectedToServer(bool state); @@ -114,6 +117,8 @@ private: bool flTryConnectToServer; int cntTryConnectToServer; + bool flTryLogin; + Ui::InstructorsAndTraineesWidget *ui; }; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 0f06f91..61d5997 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -93,6 +93,9 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien client->sendXmlAnswer(arrayAnswer); client->sendVersion(); + //client->sendPacketType(PacketType::BUSY); + //client->sendPacketType(PacketType::FREE); + QString str = QString(arrayAnswer); //logger->addTextToLogger("To Client: " + str); //Извещаем об изменениях в авторизации From 4def07ff689cb835870eb8df72b04a261e6d42f6 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 14:46:18 +0300 Subject: [PATCH 26/31] =?UTF-8?q?GUI.=20=D0=97=D0=B0=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=B5=20=D1=81=20=D0=A1=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUIdataBaseLMS/CMakeLists.txt | 1 + .../instructorsandtraineeswidget.cpp | 48 +++++++++++++++---- .../instructorsandtraineeswidget.h | 2 + 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/GUIdataBaseLMS/CMakeLists.txt b/GUIdataBaseLMS/CMakeLists.txt index 76da07e..b37ea64 100644 --- a/GUIdataBaseLMS/CMakeLists.txt +++ b/GUIdataBaseLMS/CMakeLists.txt @@ -26,6 +26,7 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/widgets) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/specialmessagebox) target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/settings) +target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/authorization) if(PROJECT_TYPE_DEBUG) target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees) else() diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index aff4a6e..0465a35 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -23,6 +23,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : messangerController(nullptr), dlgTasksCommon(nullptr), dlgSettings(nullptr), + dlgAuthorization(nullptr), adminMode(false), loginInstructorLoggedInLocal(QStringLiteral("")), nameInstructorLoggedInLocal(QStringLiteral("")), @@ -108,10 +109,25 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget() deAuthorizationInstructor(loginInstructorLoggedInLocal); if(dlgTasksCommon) + { dlgTasksCommon->close(); + delete dlgTasksCommon; + dlgTasksCommon = nullptr; + } if(dlgSettings) + { dlgSettings->close(); + delete dlgSettings; + dlgSettings = nullptr; + } + + if(dlgAuthorization) + { + dlgAuthorization->close(); + delete dlgAuthorization; + dlgAuthorization = nullptr; + } delete messangerController; delete viewerInstructors; @@ -312,6 +328,13 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) if(dlgSettings) dlgSettings->deactivate(); + if(dlgAuthorization) + { + dlgAuthorization->close(); + delete dlgAuthorization; + dlgAuthorization = nullptr; + } + messangerController->deleteAllWidgets(); loginInstructorLoggedInLocal = ""; @@ -403,23 +426,24 @@ void InstructorsAndTraineesWidget::slot_ConnectToServer() bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent) { - DialogAuthorization dlg(parent); - dlg.setWindowTitle(tr("Instructor authorization")); - dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint); - dlg.setStyleSheet(this->styleSheet()); + dlgAuthorization = new DialogAuthorization(parent); + + dlgAuthorization->setWindowTitle(tr("Instructor authorization")); + dlgAuthorization->setWindowFlags(dlgAuthorization->windowFlags() & ~Qt::WindowContextHelpButtonHint); + dlgAuthorization->setStyleSheet(this->styleSheet()); #ifdef PROJECT_TYPE_DEBUG - dlg.setLogin("admin"); - dlg.setPassword("admin"); + dlgAuthorization->setLogin("admin"); + dlgAuthorization->setPassword("admin"); #endif do { - switch( dlg.exec() ) + switch( dlgAuthorization->exec() ) { case QDialog::Accepted: { - QString login = dlg.getLogin(); - QString password = dlg.getPassword(); + QString login = dlgAuthorization->getLogin(); + QString password = dlgAuthorization->getPassword(); // Вычисление MD5 хэша password = HashTools::hashingMD5string(password); @@ -440,6 +464,12 @@ bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent } while(true); + if(dlgAuthorization) + { + delete dlgAuthorization; + dlgAuthorization = nullptr; + } + return false; } diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 7f2dc8d..307754b 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -12,6 +12,7 @@ #include "metatypes.h" #include "dialogtaskscommon.h" #include "dialogsettings.h" +#include "dialogauthorization.h" namespace Ui { @@ -103,6 +104,7 @@ private: DialogTasksCommon* dlgTasksCommon; DialogSettings* dlgSettings; + DialogAuthorization* dlgAuthorization; bool adminMode; QString loginInstructorLoggedInLocal; From 00c9ec889347d4dd931615876590964f11f09500 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 15:02:04 +0300 Subject: [PATCH 27/31] refact0 --- InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 0465a35..6bac7e4 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -285,7 +285,7 @@ void InstructorsAndTraineesWidget::slot_ServerBlocked() waitAnimationWidget->hideWithStop(); ui->btnAuthorizationInstructor->setChecked(false); - SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Attention!") + "\n" + tr("Server blocked!")).exec(); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Server blocked!")).exec(); } } From bf87a2c982314b63f94d665a349950ff935bf31e Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 16:54:40 +0300 Subject: [PATCH 28/31] =?UTF-8?q?GUI.=D0=A2=D0=B8=D0=BF=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/interfacedatabaselms.cpp | 40 ++++++++++-- DataBaseLMS/interfacedatabaselms.h | 13 +++- .../Core/recognizesystem.cpp | 21 +++++- .../connectorToServer/Core/recognizesystem.h | 1 + .../connectorToServer/Core/tools.h | 8 +++ .../connectorToServer/connectortoserver.cpp | 6 ++ .../connectorToServer/connectortoserver.h | 2 + .../instructorsandtraineeswidget.cpp | 45 +++++++++++-- .../instructorsandtraineeswidget.h | 1 + ServerLMS/Data/typesDataServerClient.h | 10 ++- ServerLMS/Systems/processingsystem.cpp | 65 ++++++++++++++----- ServerLMS/providerdblms/providerdblms.cpp | 8 +-- ServerLMS/providerdblms/providerdblms.h | 4 +- 13 files changed, 182 insertions(+), 42 deletions(-) diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 6c8c0eb..1cea546 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -37,16 +37,32 @@ bool InterfaceDataBaseLMS::DBisConnected() //Инструкторы -bool InterfaceDataBaseLMS::authorizationInstructor(QString login, QString password) +bool InterfaceDataBaseLMS::authorizationInstructor(QString login, QString password, ErrorAuth& error) { + error = ErrorAuth::errNo; + if(int id = selectUserID(DataBaseLMS::TypeUserDBInstructor, login, password)) { - if(selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id)) + if(selectUserArchived(DataBaseLMS::TypeUserDBInstructor, id)) + { + error = ErrorAuth::errArchived; return false; + } + + if(selectUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id)) + { + error = ErrorAuth::errAlreadyLogIn; + return false; + } if(updateUserLoggedIn(DataBaseLMS::TypeUserDBInstructor, id, true)) return true; + else + error = ErrorAuth::errDB; } + else + error = ErrorAuth::errLoginOrPassword; + return false; } @@ -118,16 +134,32 @@ bool InterfaceDataBaseLMS::isLoggedInInstructor(int id) //Инструкторы -bool InterfaceDataBaseLMS::authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name) +bool InterfaceDataBaseLMS::authorizationTrainee(QString login, QString password, ErrorAuth& error, QString classroom_name, QString computer_name) { + error = ErrorAuth::errNo; + if(int id = selectUserID(DataBaseLMS::TypeUserDBTrainee, login, password)) { - if(selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id) || selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id)) + if(selectUserArchived(DataBaseLMS::TypeUserDBTrainee, id)) + { + error = ErrorAuth::errArchived; return false; + } + + if(selectUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id)) + { + error = ErrorAuth::errAlreadyLogIn; + return false; + } if(updateUserLoggedIn(DataBaseLMS::TypeUserDBTrainee, id, true)) return true; + else + error = ErrorAuth::errDB; } + else + error = ErrorAuth::errLoginOrPassword; + return false; } diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 5ad17a4..a63f7c4 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -10,6 +10,15 @@ class DATABASELMS_EXPORT InterfaceDataBaseLMS : public DataBaseLMS { +public: + enum ErrorAuth + { + errNo = 0, + errDB, + errLoginOrPassword, + errArchived, + errAlreadyLogIn + }; public: InterfaceDataBaseLMS(QWidget *ownerWidget, QObject *parent = nullptr); @@ -22,7 +31,7 @@ public: //Инструкторы - bool authorizationInstructor(QString login, QString password); + bool authorizationInstructor(QString login, QString password, ErrorAuth& error); bool deAuthorizationInstructor(QString login); bool deAuthorizationAllInstructors(); @@ -43,7 +52,7 @@ public: //Обучаемые - bool authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name); + bool authorizationTrainee(QString login, QString password, ErrorAuth& error, QString classroom_name, QString computer_name); bool deAuthorizationTrainee(QString login); bool deAuthorizationAllTrainees(); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 3d4dab8..8705ca1 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -456,16 +456,33 @@ void RecognizeSystem::xmlParser(QByteArray array) if(name == "Code") { - if (value == "END") + if (value == NOTIFY_SERVER_END) { emit sigSocketDisabled(); } - if(value == "BLOCKED") + if(value == NOTIFY_SERVER_BLOCKED) { emit sigServerBlocked(); } + if(value == NOTIFY_ERROR_AUTH_DB) + { + emit sigErrorAuth(value); + } + if(value == NOTIFY_ERROR_AUTH_LOGINORPASSWORD) + { + emit sigErrorAuth(value); + } + if(value == NOTIFY_ERROR_AUTH_ARCHIVED) + { + emit sigErrorAuth(value); + } + if(value == NOTIFY_ERROR_AUTH_ALREADYLOGIN) + { + emit sigErrorAuth(value); + } + if(value == "HASHSENDCOMPLETE") { emit sigStartCompare(); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index 60f232c..f679249 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -34,6 +34,7 @@ signals: void sigSendDebugLog(QString message); void sigSocketDisabled(); void sigServerBlocked(); + void sigErrorAuth(QString error); void sigAuth(ServerAuthorization *serverAuth); void sigDeAuth(ServerDeAuthorization *serverDeAuth); void sigAnswerQueryToDB(QList* listInstructors, diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index 622badb..25c1152 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -71,6 +71,14 @@ enum PacketType{ FREE = 155 }; +#define NOTIFY_ERROR_AUTH_DB "ERROR_AUTH_DB" +#define NOTIFY_ERROR_AUTH_LOGINORPASSWORD "ERROR_AUTH_LOGINORPASSWORD" +#define NOTIFY_ERROR_AUTH_ARCHIVED "ERROR_AUTH_ARCHIVED" +#define NOTIFY_ERROR_AUTH_ALREADYLOGIN "ERROR_AUTH_ALREADYLOGIN" +#define NOTIFY_SERVER_END "END" +#define NOTIFY_SERVER_BLOCKED "BLOCKED" +#define SERVER_HELLO "NewConnection. I am server LMS!" + //Q_DECLARE_METATYPE(PacketType) class Tools { diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index d82e95b..839809e 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -90,6 +90,11 @@ void ConnectorToServer::slot_ServerBlocked() emit sigServerBlocked(); } +void ConnectorToServer::slot_ErrorAuth(QString error) +{ + emit sigErrorAuth(error); +} + void ConnectorToServer::slot_SendDeleteVersion(StreamingVersionData *streaming) { emit signal_SendDeleteVersion(streaming); @@ -133,6 +138,7 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult); connect(recognizeSystem,&RecognizeSystem::sigServerBlocked,this,&ConnectorToServer::slot_ServerBlocked); + connect(recognizeSystem,&RecognizeSystem::sigErrorAuth,this,&ConnectorToServer::slot_ErrorAuth); connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage,Qt::AutoConnection); connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::slot_showServerList); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index d4663bb..be5d2db 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -108,6 +108,7 @@ public slots: void slot_HashReady(); void slot_Auth(ServerAuthorization * serverAuth); void slot_ServerBlocked(); + void slot_ErrorAuth(QString error); void slot_SendDeleteVersion(StreamingVersionData *streaming); void slot_SendSwitchVersion(StreamingVersionData *selectVersion); @@ -125,6 +126,7 @@ signals: void sigLoginResult(ServerAuthorization * serverAuth); void sigDeLoginResult(ServerDeAuthorization * serverDeAuth); void sigServerBlocked(); + void sigErrorAuth(QString error); void signal_UpdateDB(bool treeInstructor, bool treeTrainee); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 6bac7e4..ec8ec36 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -54,6 +54,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer, &ConnectorToServer::sigLoginResult, this, &InstructorsAndTraineesWidget::slot_checkLoginResult); connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult); connect(connectorToServer, &ConnectorToServer::sigServerBlocked, this, &InstructorsAndTraineesWidget::slot_ServerBlocked); + connect(connectorToServer, &ConnectorToServer::sigErrorAuth, this, &InstructorsAndTraineesWidget::slot_ErrorAuth); connect(connectorToServer,&ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); messangerController = new MessangerController(connectorToServer, this); @@ -239,16 +240,14 @@ void InstructorsAndTraineesWidget::slot_checkLoginResult(ServerAuthorization *se viewerInstructors->activate(); waitAnimationWidget->hideWithStop(); + + flTryLogin = false; } else { - waitAnimationWidget->hideWithStop(); - - ui->btnAuthorizationInstructor->setChecked(false); - SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::critical, tr("Instructor authorization.") + "\n" + tr("Invalid login or password!")).exec(); + //waitAnimationWidget->hideWithStop(); + //ui->btnAuthorizationInstructor->setChecked(false); } - - flTryLogin = false; } void InstructorsAndTraineesWidget::slot_checkDeLoginResult(ServerDeAuthorization *serverDeAuth) @@ -285,7 +284,39 @@ void InstructorsAndTraineesWidget::slot_ServerBlocked() waitAnimationWidget->hideWithStop(); ui->btnAuthorizationInstructor->setChecked(false); - SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Server blocked!")).exec(); + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Instructor authorization.") + "\n" + tr("Server blocked!")).exec(); + } +} + +void InstructorsAndTraineesWidget::slot_ErrorAuth(QString error) +{ + if(flTryLogin) + { + flTryLogin = false; + waitAnimationWidget->hideWithStop(); + + ui->btnAuthorizationInstructor->setChecked(false); + + QString errorTextMsg = ""; + + if(error == NOTIFY_ERROR_AUTH_DB) + { + errorTextMsg = tr("Database error!"); + } + else if(error == NOTIFY_ERROR_AUTH_ARCHIVED) + { + errorTextMsg = tr("The user is archived!"); + } + else if(error == NOTIFY_ERROR_AUTH_ALREADYLOGIN) + { + errorTextMsg = tr("The user is already logged in!"); + } + else if(error == NOTIFY_ERROR_AUTH_LOGINORPASSWORD) + { + errorTextMsg = tr("Login or password error!"); + } + + SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Instructor authorization.") + "\n" + errorTextMsg).exec(); } } diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 307754b..2cd5624 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -54,6 +54,7 @@ public Q_SLOTS: void slot_checkDeLoginResult(ServerDeAuthorization * serverDeAuth); void slot_ServerBlocked(); + void slot_ErrorAuth(QString error); //Слот обработки результата подключения к серверу void slot_ConnectedToServer(bool state); diff --git a/ServerLMS/Data/typesDataServerClient.h b/ServerLMS/Data/typesDataServerClient.h index 7135dff..7a6ab49 100644 --- a/ServerLMS/Data/typesDataServerClient.h +++ b/ServerLMS/Data/typesDataServerClient.h @@ -5,9 +5,13 @@ #include #include "typeQueryToDB.h" -#define NOTIFY_SERVER_END "END" -#define NOTIFY_SERVER_BLOCKED "BLOCKED" -#define SERVER_HELLO "NewConnection. I am server LMS!" +#define NOTIFY_ERROR_AUTH_DB "ERROR_AUTH_DB" +#define NOTIFY_ERROR_AUTH_LOGINORPASSWORD "ERROR_AUTH_LOGINORPASSWORD" +#define NOTIFY_ERROR_AUTH_ARCHIVED "ERROR_AUTH_ARCHIVED" +#define NOTIFY_ERROR_AUTH_ALREADYLOGIN "ERROR_AUTH_ALREADYLOGIN" +#define NOTIFY_SERVER_END "END" +#define NOTIFY_SERVER_BLOCKED "BLOCKED" +#define SERVER_HELLO "NewConnection. I am server LMS!" enum EStateServer{started, stoped}; enum EStateBlockAutorization{blocked, unblocked}; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 61d5997..96b15e9 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -39,8 +39,6 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien { QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(NOTIFY_SERVER_BLOCKED); client->sendXmlAnswer(arrayAnswer); - - QString str = QString(arrayAnswer); return; } @@ -50,8 +48,10 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien QByteArray arrayAnswer; int clientID = 0; + InterfaceDataBaseLMS::ErrorAuth errorAuth = InterfaceDataBaseLMS::ErrorAuth::errNo; - if(providerDBLMS->authorizationInstructor(clientAutorization.Login, clientAutorization.Password)) + + if(providerDBLMS->authorizationInstructor(clientAutorization.Login, clientAutorization.Password, errorAuth)) {//Авторизуется инструктор client->getClient()->setLogin(clientAutorization.Login); @@ -67,7 +67,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien } else if(clientAutorization.TypeClient != TypeClientAutorization::TYPE_GUI) { - if(providerDBLMS->authorizationTrainee(clientAutorization.Login, clientAutorization.Password, "", "")) + if(providerDBLMS->authorizationTrainee(clientAutorization.Login, clientAutorization.Password, errorAuth, "", "")) {//Авторизуется обучаемый client->getClient()->setLogin(clientAutorization.Login); @@ -91,15 +91,42 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien arrayAnswer = dataParser->ClientAnswer()->authorization(false, "", "", "", "", 0); } client->sendXmlAnswer(arrayAnswer); - client->sendVersion(); - //client->sendPacketType(PacketType::BUSY); - //client->sendPacketType(PacketType::FREE); + if(errorAuth == InterfaceDataBaseLMS::ErrorAuth::errNo) + { + client->sendVersion(); - QString str = QString(arrayAnswer); - //logger->addTextToLogger("To Client: " + str); - //Извещаем об изменениях в авторизации - emit sigListsInstructorsTraineesChanged(); + //client->sendPacketType(PacketType::BUSY); + //client->sendPacketType(PacketType::FREE); + + //Извещаем об изменениях в авторизации + emit sigListsInstructorsTraineesChanged(); + } + else + { + QString notifyText = ""; + + switch (errorAuth) + { + case InterfaceDataBaseLMS::ErrorAuth::errDB: + notifyText = NOTIFY_ERROR_AUTH_DB; + break; + case InterfaceDataBaseLMS::ErrorAuth::errArchived: + notifyText = NOTIFY_ERROR_AUTH_ARCHIVED; + break; + case InterfaceDataBaseLMS::ErrorAuth::errAlreadyLogIn: + notifyText = NOTIFY_ERROR_AUTH_ALREADYLOGIN; + break; + case InterfaceDataBaseLMS::ErrorAuth::errLoginOrPassword: + notifyText = NOTIFY_ERROR_AUTH_LOGINORPASSWORD; + break; + default: + break; + } + + QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(notifyText); + client->sendXmlAnswer(arrayAnswer); + } } void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization) @@ -129,6 +156,10 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli emit sigUpdateListClients(); arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login); + client->sendXmlAnswer(arrayAnswer); + + //Извещаем об изменениях в авторизации + emit sigListsInstructorsTraineesChanged(); } else if(providerDBLMS->deAuthorizationInstructor(clientDeAutorization.Login)) {//ДеАвторизуется инструктор @@ -139,18 +170,16 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli emit sigUpdateListClients(); arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login); + client->sendXmlAnswer(arrayAnswer); + + //Извещаем об изменениях в авторизации + emit sigListsInstructorsTraineesChanged(); } else {//Никто не ДеАвторизовался arrayAnswer = dataParser->ClientAnswer()->deAuthorization(false, ""); + client->sendXmlAnswer(arrayAnswer); } - client->sendXmlAnswer(arrayAnswer); - - QString str = QString(arrayAnswer); - //logger->addTextToLogger("To Client: " + str); - - //Извещаем об изменениях в авторизации - emit sigListsInstructorsTraineesChanged(); } void ProcessingSystem::processingClientBlockAuth(ClientHandler *client, bool block) diff --git a/ServerLMS/providerdblms/providerdblms.cpp b/ServerLMS/providerdblms/providerdblms.cpp index 1a2a57e..8707b58 100644 --- a/ServerLMS/providerdblms/providerdblms.cpp +++ b/ServerLMS/providerdblms/providerdblms.cpp @@ -108,7 +108,7 @@ QString ProviderDBLMS::getMainInstructorName() return QStringLiteral(""); } -bool ProviderDBLMS::authorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name) +bool ProviderDBLMS::authorizationTrainee(QString login, QString password, InterfaceDataBaseLMS::ErrorAuth& error, QString classroom_name, QString computer_name) { mtxAccess.lock(); @@ -120,7 +120,7 @@ bool ProviderDBLMS::authorizationTrainee(QString login, QString password, QStrin //Q_EMIT signal_BlockAutorization(true); - bool res = dbLMS->authorizationTrainee(login, password, classroom_name, computer_name); + bool res = dbLMS->authorizationTrainee(login, password, error, classroom_name, computer_name); //Q_EMIT signal_BlockAutorization(false); @@ -164,7 +164,7 @@ QString ProviderDBLMS::getNameTraineeByLogin(QString login) return res; } -bool ProviderDBLMS::authorizationInstructor(QString login, QString password) +bool ProviderDBLMS::authorizationInstructor(QString login, QString password, InterfaceDataBaseLMS::ErrorAuth& error) { mtxAccess.lock(); @@ -176,7 +176,7 @@ bool ProviderDBLMS::authorizationInstructor(QString login, QString password) //Q_EMIT signal_BlockAutorization(true); - bool res = dbLMS->authorizationInstructor(login, password); + bool res = dbLMS->authorizationInstructor(login, password, error); //Q_EMIT signal_BlockAutorization(false); diff --git a/ServerLMS/providerdblms/providerdblms.h b/ServerLMS/providerdblms/providerdblms.h index 2c58257..bda33fb 100644 --- a/ServerLMS/providerdblms/providerdblms.h +++ b/ServerLMS/providerdblms/providerdblms.h @@ -16,12 +16,12 @@ public: QString getMainInstructorName(); //Авторизация обучаемого на клиенте - bool authorizationTrainee(QString login, QString password, QString classroom_name = QStringLiteral(""), QString computer_name = QStringLiteral("")); + bool authorizationTrainee(QString login, QString password, InterfaceDataBaseLMS::ErrorAuth& error, QString classroom_name = QStringLiteral(""), QString computer_name = QStringLiteral("")); bool deAuthorizationTrainee(QString login); QString getNameTraineeByLogin(QString login); //Авторизация инструктора на клиенте - bool authorizationInstructor(QString login, QString password); + bool authorizationInstructor(QString login, QString password, InterfaceDataBaseLMS::ErrorAuth& error); bool deAuthorizationInstructor(QString login); QString getNameInstructorByLogin(QString login); From ace95db3df0fbf4a4131406e6df26860c51dbd7e Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 17:05:26 +0300 Subject: [PATCH 29/31] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstructorsAndTraineesWidget_ru_RU.qm | Bin 23118 -> 23603 bytes .../InstructorsAndTraineesWidget_ru_RU.ts | 59 ++++++++++++------ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm index 1490a1caf5f0e0d76bc07e3ee0136b8dea195f01..5cbd0056316c09893e9409a2475fa504f68b54bb 100644 GIT binary patch delta 1505 zcmaKsdrVtp7{;F-zOJ!Q;w5;Cb1^fp_^zKu^bgaV{!Y(#&htL+ z^M0o@?9OA59`xoy*X`CQKZn;U3p(&Yw(veO-N99pPMuYtjl!u4O z;vJ~g*~nrOXWIwA#lGAE)3#&$2g#5TGno z-WL!rRAk8S2Smr_SlIbND^StGuAYCMhPO|dK6noh?7lFcYc`=|@C=HRfu{Eoz zTUF9q&jGPeNf*Bcmi4O=dwT(Mw#xVFHG1j=&YUyyC6=g4>w6u@{YhSA(ZR03z#SFc zBv{W`drD4LMhmsAa=EfOr#N5zz+P&_Jf&VfJqE-Ls+}Q2z{-{C_OC2tZ$#a7i#A%) zZS`*7c{=%kvsjXURK{!{QO`@1Ud^C-{=hixmkQ3RSxrQ?9>`zdbe-1ZCf@~Cyr^mX zhHNKp)NCB3{p0*d(^Gm6NbS;`yK{{q8Ww{u(C{*u7<`?Er#K}>>=*+qsbc!GF;v~n znSMoFAM+tit$elElSBrR4vKwj4hTu$ED7RtZ4>t_7Es|Y#IeaUfVPm+?hy|SrP1z~ z7ms*o3f3<9vt^MR!hbgb1wTtUWfY02SE`z&`5Edslh#SiFH^4NC#69~_vL*ejZ9Zj zlkw8%BWr-L{nEQ`s-;^i9jiYEWM7s}Dk%8K6`c8AIay`jP&^)FwjH37zXmzBDyUp< z(C`dpux3}#P)m6Y@Rx>?N3vPdy zKK*8QclT3XU)$gE2J0&M`{L%p1ZH6A^kmBYZ_>#m9TTZo$aj`sG3CDBC7Rk=kFUq$ z)38Kw-jTf%xHi}6=4BLxeo8CfAInpqiX7O@PLPE4W0N>>ZX@jsnM*R^}} zPj-`HN4MVH>GQbTp4NAIH*NB?={vgoK{Q+bN4=7&QP+N5D|N5;Ct)M^DgKmmm(&XT ZS1n&_dq)p-ARDX+a?kptDU%~A_)qFDgku>u+!}S3?>dWX12QPXk9W;9S>CA0m{Ri z)plU_H?;CJ(0mOr=5qS_fEQ_8^ABg>F3?Z&_MbU}PO$I*P_)8X-Z`{VXio;abrNul zb2>wut_WxO45x2_v$}(`CLb!(C7|M*+^8tfx|X4;Fw^I4c}!7I@4N@q<+Ie{8q~Ee zYO#^i{sh!l{~*CvVA5>>uGe9DDh}B70M><4k~lXQ6ylFp7GGT_D}TPI+AL8|^=&q_@=u1?IqfEoU`~jd4XjIto!IB({YXeqctEtRueG#fqavuF0h@X?$R9c z_fUmXoYjA61_unJDx^8lLj9&UaBi#B3}2_dtHbghRg=T&(zC{|==N5%NxeDLK+Z*JkgWhQS)48pr)N?+ zwoyife~`ixUjupvr}Mn@{+WDgAXB>OyAI?QN=p_xKc!!Kcrc3Of1)e)l08rN>4M*p zi(7Yd=G5w%-g+0P`crpqI*4@G_Ugv!@_@M0x({2ZkYStdGX=$wkjQBpmwjq?vtu!; z#C3sE%8jacNkPU;MV*}`;duj56SMp2*R$wr)Wa0VxBB6`g zuTejj^uJ!+OuAg{Kuw37ny@9J(cG{^@*NXGhLt5VGuz3^n2Bv?MXZE*St+Yx7NpX< zjqRYZQu&cHF2jqh8j_7o^cXy$-j>exy{VmD``SaPUEQhsTY7p9c6G}Ncb44jYK>&O Lr-aCTPgV4Pw=_T2 diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts index 95175e0..e14cbb0 100644 --- a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts +++ b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.ts @@ -993,65 +993,86 @@ Delete it anyway? - + none нет - + The file could not be opened Файл не может быть открыт - + + Instructor authorization. Авторизация инструктора. - + Instructor deauthorization Деавторизация инструктора - + Error! Ошибка! - + + Server blocked! + Сервер заблокирован! + + + + Database error! + Ошибка базы данных! + + + + The user is archived! + Пользователь является архивным! + + + + The user is already logged in! + Пользователь уже в сети! + + + + Login or password error! + Ошибка логина или пароля! + + + The server is not available! Сервер недоступен! - + Connection attempt Попытка соединения - + connected подключен - + not connected не подключен - + Server settings have been changed. Please reconnect to the server. Настройки сервера изменены. Выполните переподключение к серверу. - + Instructor authorization Авторизация инструктора - - - Invalid login or password! - Неправильный логин или пароль! - InstructorsView @@ -1251,17 +1272,17 @@ Delete it anyway? Файл не может быть открыт - + You cannot delete the basic version! Вы не можете удалить базовую версию! - + You cannot delete the active version Вы не можете удалить активную версию - + This name already exists Это имя уже существует From 6f44b6125efb49619d5804131dff927a420e453c Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 17:35:56 +0300 Subject: [PATCH 30/31] =?UTF-8?q?Server.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerLMS/serverlmswidget.cpp | 2 + ServerLMS/serverlmswidget.ui | 358 ++++++++++++++++++---------------- 2 files changed, 191 insertions(+), 169 deletions(-) diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 7d9c147..8e4f422 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -38,6 +38,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : qDebug() << "ServerLMSWidget init thread ID " << QThread::currentThreadId(); + ui->widget_Control->setObjectName("widgetControl"); + registerMetaType(); updateMyStyleSheet(); diff --git a/ServerLMS/serverlmswidget.ui b/ServerLMS/serverlmswidget.ui index 273043d..8821854 100644 --- a/ServerLMS/serverlmswidget.ui +++ b/ServerLMS/serverlmswidget.ui @@ -23,187 +23,207 @@ - + - + - 130 - 58 + 100 + 0 - - - 80 - 55 - - - - - 80 - 40 - - - - Qt::LeftToRight - - - Start - - - - :/resources/icons/rocket.png:/resources/icons/rocket.png - - - - 32 - 32 - - - - Qt::ToolButtonTextUnderIcon - + + + + + + + + 130 + 58 + + + + + 80 + 55 + + + + + 80 + 40 + + + + Qt::LeftToRight + + + Start + + + + :/resources/icons/rocket.png:/resources/icons/rocket.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + + 130 + 58 + + + + + 80 + 55 + + + + + 80 + 40 + + + + Qt::LeftToRight + + + Stop + + + + :/resources/icons/stop.png:/resources/icons/stop.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 130 + 58 + + + + Settings + + + + :/resources/icons/settings.png:/resources/icons/settings.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + + - - - - 130 - 58 - - - - - 80 - 55 - - - - - 80 - 40 - - - - Qt::LeftToRight - - - Stop - - - - :/resources/icons/stop.png:/resources/icons/stop.png - - - - 32 - 32 - - - - Qt::ToolButtonTextUnderIcon - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 130 - 58 - - - - Settings - - - - :/resources/icons/settings.png:/resources/icons/settings.png - - - - 32 - 32 - - - - Qt::ToolButtonTextUnderIcon - - + + + + + Clients + + + + + + + + + 0 + 0 + + + + + 16777215 + 120 + + + + + + + + + + + + + + 0 + 0 + + + + Logger + + + + + + + + true + + + + + + + + + - - - Clients - - - - - - - - - 0 - 0 - - - - - 16777215 - 120 - - - - - - - - - - - - - - 0 - 0 - - - - Logger - - - - - - - - true - - - - - - - - - - + From c61066cfd1bd47ffbbed624a0da5aba4c68acf57 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 27 Nov 2025 18:06:13 +0300 Subject: [PATCH 31/31] Refact --- .../instructorsandtraineeswidget.cpp | 9 ++++++- .../instructorsandtraineeswidget.h | 1 + .../instructorsandtraineeswidget.ui | 24 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index ec8ec36..ecd32f6 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -55,7 +55,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer, &ConnectorToServer::sigDeLoginResult, this, &InstructorsAndTraineesWidget::slot_checkDeLoginResult); connect(connectorToServer, &ConnectorToServer::sigServerBlocked, this, &InstructorsAndTraineesWidget::slot_ServerBlocked); connect(connectorToServer, &ConnectorToServer::sigErrorAuth, this, &InstructorsAndTraineesWidget::slot_ErrorAuth); - connect(connectorToServer,&ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); + connect(connectorToServer, &ConnectorToServer::signal_SetVersion, this, &InstructorsAndTraineesWidget::slot_SetVersion); + connect(connectorToServer, &ConnectorToServer::signal_AnswerDocsChanged,this, &InstructorsAndTraineesWidget::slot_AnswerDocsChanged); messangerController = new MessangerController(connectorToServer, this); @@ -320,6 +321,12 @@ void InstructorsAndTraineesWidget::slot_ErrorAuth(QString error) } } +void InstructorsAndTraineesWidget::slot_SetVersion(StreamingVersionData *serverVersion) +{ + QString viewName = serverVersion->getViewName(); + ui->lblVersionText->setText(viewName); +} + void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) { if(state) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 2cd5624..747ffd6 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -55,6 +55,7 @@ public Q_SLOTS: void slot_ServerBlocked(); void slot_ErrorAuth(QString error); + void slot_SetVersion(StreamingVersionData* serverVersion); //Слот обработки результата подключения к серверу void slot_ConnectedToServer(bool state); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.ui b/InstructorsAndTrainees/instructorsandtraineeswidget.ui index 60c6bbf..f6b7147 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.ui +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.ui @@ -365,6 +365,12 @@ + + + 400 + 0 + + none @@ -372,6 +378,24 @@ + + + + + + Version of materials: + + + + + + + ... + + + + +