From 5f6988eaa9485747c258edd56d6c4f3b65679270 Mon Sep 17 00:00:00 2001 From: LoudSnorer Date: Mon, 9 Jan 2023 20:10:53 -0500 Subject: [PATCH] Added Help menu , improved Icons , fixed minor display issues --- oscar/Resources.qrc | 3 +- oscar/daily.cpp | 2 +- oscar/daily.ui | 2 +- oscar/icons/brick-wall.png | Bin 12788 -> 0 bytes oscar/icons/cog.png | Bin 4902 -> 3949 bytes oscar/icons/exit.png | Bin 4090 -> 4114 bytes oscar/icons/plus.png | Bin 2128 -> 2337 bytes oscar/icons/question_mark.png | Bin 0 -> 3148 bytes oscar/icons/rename.png | Bin 4306 -> 3647 bytes oscar/icons/restore.png | Bin 3339 -> 3047 bytes oscar/icons/return.png | Bin 0 -> 3238 bytes oscar/icons/trash_can.png | Bin 3485 -> 3238 bytes oscar/icons/update.png | Bin 3345 -> 3128 bytes oscar/oscar.pro | 4 +- oscar/overview.ui | 2 +- oscar/saveGraphLayoutSettings.cpp | 496 +++++++++++++++++++++++------- oscar/saveGraphLayoutSettings.h | 92 ++++-- 17 files changed, 458 insertions(+), 143 deletions(-) delete mode 100644 oscar/icons/brick-wall.png create mode 100644 oscar/icons/question_mark.png create mode 100644 oscar/icons/return.png diff --git a/oscar/Resources.qrc b/oscar/Resources.qrc index 23f9ba55..9b3ab92a 100644 --- a/oscar/Resources.qrc +++ b/oscar/Resources.qrc @@ -59,12 +59,13 @@ icons/up-down.png icons/warning.png icons/exit.png - icons/brick-wall.png icons/plus.png icons/rename.png icons/restore.png icons/trash_can.png icons/update.png icons/cog.png + icons/question_mark.png + icons/return.png diff --git a/oscar/daily.cpp b/oscar/daily.cpp index db836edc..8a1e4757 100644 --- a/oscar/daily.cpp +++ b/oscar/daily.cpp @@ -7,7 +7,7 @@ * License. See the file COPYING in the main directory of the source code * for more details. */ -#define TEST_MACROS_ENABLEDoff +#define TEST_MACROS_ENABLED #include #include diff --git a/oscar/daily.ui b/oscar/daily.ui index 502fbb5b..9dd0ad79 100644 --- a/oscar/daily.ui +++ b/oscar/daily.ui @@ -1567,7 +1567,7 @@ QToolButton:pressed { :/icons/cog.png:/icons/cog.png - Save and Restore graph layout settings + Save and Restore Graph Layout Settings diff --git a/oscar/icons/brick-wall.png b/oscar/icons/brick-wall.png deleted file mode 100644 index b82d5ac4b5852d5fce0acba2d4962acc9190d89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12788 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 delta 3028 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 Ib4q9e07&qE0RR91 diff --git a/oscar/icons/question_mark.png b/oscar/icons/question_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd4b9d1c7b4bd0575e50bf2a3c75aff1690a3b7 GIT binary patch literal 3148 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 P{{+yz18LQs>(l-Nbc@yp literal 0 HcmV?d00001 diff --git a/oscar/icons/rename.png b/oscar/icons/rename.png index b4976f4631e3641009aad9a55cd636a317f9c943..0adf88d063aab484e5f7618d701c1c768ba26eee 100644 GIT binary patch delta 2593 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 W>ZMtGA8+8j2{O_%N7U=wiT)3r^%7|S diff --git a/oscar/icons/restore.png b/oscar/icons/restore.png index 0f6922fe82d3802b982014ae7a8e9467e0abca8c..d0cdac5feec7ead040e7cc98b5992b6051993fc2 100644 GIT binary patch delta 1748 zcmchXSyU1T1BF3Q!LgFX+@={NH%vfq%ZpNpsZ9EejWvaV*7sInv~4 ze=dPIxt(N`aZq!aG@UdP6DXq6)PBsVLG$l@lhWxmsha@E9w*K)k)94Z+dY0b^zBXk~@cFf=sGzL@HGCO#uNE;=LHJvt-a z1x2tT{FA?@0I37D{+U*5sHQ-Uh#Z&z0I;AsU)6v<;1A0$0*g92)|j47OR)Bk$%!w0noC8=A&b~X_A7?2S$>(9CscZ;BKqAm{?5V)rwcEX z!-|9lK3r79ZN@kOJ&)Y}fm-thN~!*tZWb43-nf6T671qI7um6?>AK$<&Ce{likLDe zd6yQYEBl7$BFN!3{j|nxv43RW*>vRyby2+YbLZHAB>9-*=HrH=%DQ9%XVRGep=N^eq4GZ8D7p^YF8H<@H;kM(!I*MWM9g z78y5oilbAEim;$|wrhh)$mPG)G3L2`Xl-=Ac~^?h`h6#bRPsm0!pyg()p1q0#x3;< z&5w%z{`%KSJ#Nxc;p(6MA3E?Z#t9N%Jev>5?%Z%SWhdo32&4>4;B1}#Be3-$J`(}M zP78>F6S&^VSpAdUWX5Z4g$;JVJa*iSK+tDP-+Sk%9Ye<^loJUtZ5ufJBK0}QEW}If zLQo^qfVf(nOc$EU7Q&hUCp+Z7tO-kmdx?LK6NU}n1aYw(x{0kIL0DPoI;9YtyWQ6= z%_FJl;m<~(d(PAfCnj~91OeVO5OX>yqAyY9Yu4`%$cD0WHg|;c;Bx$Du)bR-bxT+S zA;#+KLEHG6cP%(Fw~tjSaYAxVtFXUpbYk)Wrl8_%2>NJt7e9qXLY(}ruu>v<_Nocy z#J_UAo}SzmB8DKE0!mD`xnNYhpM19(MoeKf5bL{_@;jtMZO(Zyo}Q0Na+reZTs-O-AH%Gwj5)1}EyL4nMg;)-fK?-EL8yba+22U~}T#Vl3P z#kZE5>#HO1n`_dPu_Q0V2bP4Ls*wc@RLh=~pkXFSrMa(M-*XTtKhj$~j@ngC=5RD&$E6uRIM3T>yMF zdSm`tecx%sVgQslT6z*Z({^$gV&wl7;9BhMo2%$`Sn270buNLC@%$MiSvu8Bx3l~4 z@7)=d1MLj1bB~}A<=cKRV63T)`ag;O@0zYp{W0<9{_3!?@?2#n1e#0yv!)Z`puSh6 zB)#;9z-hUq_si$ zm8KK0ZYRH1NSFH-8JK)8kH|S32O|^>2{YEt?}UzDH0X7PY<%2bIWEeZtLAOngKF&2fEb#bv;lzdFPx?k$VcHkDb47_5k8GXAYY zTh2lVC;7_8d&_gksf~T*1odET(}**s@CZ|}C<@1B!CL~ZZ&6yNWK2tT rQ#`}@u&7b?!d8~O3^ez?`tfUv%a_UR8LQmS-v;pV_|Bc{7FGB^{C@6t delta 2042 zcmchY`#Td18^>23l0%M#NN7Sf*&LH4=Tiw=wegI$424aMcNu1}Nyu@8$&0r+ALi5n z6Hn}Nevo64@-lMHvo;U%_War(@cwXL*L{7i?{(eR_xt_f<|!qgPFE2>3IG5Obt0BE}Cx#MohoIG7gH5c;dW zaYy9X5!qj9mV_u?+~UPSApmeBHY-k4l`^bv=b^~8@_($Hip6MN@9GP5$KHitbwNG4 z@q+_K1cyP@I)OuGO~cLXDPi;c#XD8i3@y)wY!kNi@avuTPD>w$U`2cF0_Fxx$&y{| zKeec781_*A^zmb?1tV&oPPDN|&3kR*4{AkfPd!HG2zu~si}L%7D}uW5fwEv}N?&Ed zG2^j5$u#jaFzDU}o_~_brfx_;ZWTSN~Shp|Eq< zQlHbKUSyz0V>e2DzPK*3&TF?kHp3`r+dKo5N*`jDz!uxT?lfCVh@s{Ty7*)szrT9 zdhnllUxa1b&c7}8tYtVA$X3K9NIyIGg?KLMHPX9LWYMp zf`|K&!3$IgO>yiA$`TQ<`=7BDCtw(fv`o|xLljoK>%O0uh+Lfjmx(}Z5YiQh3(8XW zskA>ZW#{_Jy!^VcY$}!7rUO+wQRb;vW_!8#!apn{LvApGW1RBzDTgc=S^-$iw^jQ= zE6&0VY<@qxcUoQD4JhxHsFxs%Fo#8mi^Z#|s(x)*r7R?7FQmHbHZ?W*1t93=4^0vJ zQ4sjwWFJnniUciKvRcr!HhoFv@mWk=< zUdpAHhNkc-Q#uZ{vAH=J;4^1`PFbo43;FOxsbw65%1NZthwvAMZ#z12t8Uk=Ia^Pi z)6cu+1!YOapgUq`TXss%h;o{nBf`VsM!1t+?J~a|9SMBDu#KF231NV@DiB|1nu8dI zFE&HSWE5=eu}pUh-90VTMI;&U-SmT)RwV_SO%-rn8} zCl`d%#CX+hK1*twWVx`gu!Mv3oY&Do8^r%u<~nZgMsI%VsI&7q)$an7kD|coPt`3+ z^=)lTx3b%}ZVmKj0-eR#9UX^Xx|1s^^lXDpgTY{i&~nBF)!O>gKs$ZJ%*152gL1es zR+e|oA;^~wO7(+YGBY!SKsq)#s^*BNCgoR5;tNHLA(591Z={3Psw&edK<7-*Q0>sNojOwf?eR@@N(V?q-5Ll%UYe_4+pjRjz6I_o{#V z^%2GNH4rLv?XnM!QyT#P1_5*><7xtI?LGVh0*WjjYW0Ur7aI16iHWgTEH7_waLS%L%RdDcE&P+xGJkVT6@`E4U5Gpp`x3dp&z()1x8!`^`_$pK6n1H~ z#E2HtV5vS_>X^1M+sbXs3s=e?9zBUmkqr}Upp$KkB(F{k4Y^sW>u?Ehm*0an?>2?- z-;|cd%gUpK9A3dEOJ2;PeKc|F`}()&kdT`G#V2-JUr3%cc;z`zB#+XatRzB>+qD(( z-})RXoNf$QYBjJP3;_EcY_Zy64ux#1=7U^q45@w2P7A|<-SN|V;`vF~omxjZ#gr_T z?WD~ogj>IwXNnsnl+2Z00lwQ7#o3;$ zIUrXx8)~Eb(}P2-igtor-?FoagC08X;QMl@5-|`tn0ep8xG9Yq$yVEBSZ^{q$37I& zi5td;$PxdpEmUn>&yG2U{7w8~^|S diff --git a/oscar/icons/return.png b/oscar/icons/return.png new file mode 100644 index 0000000000000000000000000000000000000000..ca57b8205abd6a37eb327ee71fa185256004c948 GIT binary patch literal 3238 zcmai1d0bQ15)KH+Dj%zMMt5Vzd{*5eP*;W^kAwjN*f*aoH#;of`$Bglq`L5eR~-5Tepz zK>-j2Ml(4?|s!;=S0^XwV1bLJIB7a344zbkq%h2?RzNvA0b(?@%~I9$O?03!j++#)dsgxUT*jpz@T@>ggC^hd!jt^9)t z0^2QpgC`R_;?VDA94x$>k{|~jjXZb;Ui3(tMj+(UneYzysPYJeRc?Il#qDI0*5Ow7 z^`jXgq`tmpW@rEbh@s_5758YH3vpM9$h}X6GnryZq_MviyIJ+MTBBZ#A}K(j?$(Y0 z&tIMT6;^ltP~UL>O#)-6L^09v>`ex!S!Q=a+ejm(f&aW{+;ENAj*52UfN~cn;_C96 zeRsVYhbRR>)qC%@hBoQi>0PKgc=$Lctew`bQ+;Ck$#+nLx95oieh2p*`qY2^r-3s` zsd0|EZHF_JP%*UgkEN(LKe!l8W|yrwRtUuy#Mze|L@5VbN(Nx24V+}Uv0htH=2K6e<@^GkRAI~h@*9&Pc_jJE} z`RvxDy#E}1m}@G%BbqtIPBZ)Y_ZQm1gm#be!Y_&G8HodYkLyjE8pcpU_+Y6sbV)^` zncOLU<*kPudFt5w#eZI#Y>6OWce@mQkbiV$T{CKTykb+zjg3z=j<{k;(S3K?`+kAX zG8JfBI3Iyf(~(_rh@w*l@YxsV zJ^EQzDKf-eK@#{V@2uWlZIaen-HmRSSLRxWRE?eu2{`UzrQNxm&8)kza_UUze$Ph9 zj^V74&ch94`;NZ8zB%Uxek#<mD{USGcmhf$6~iq#_fzbg;Oay7HNN`ugQoftu^8ZRW9@|l&g#$ zb&1>ron4@GnC@@W-%-?QDNYHM_e)+V1n|Pn6sqV^)STJvVwAlK&evMaa)q^Q+rFXHOEqs zRD<yZbHBl-avb^8&0(uoyo z5h>?pGx#S~yiC8Jq1{twL0wPGxrR3$8dj%QKM4CgP)O>FsudS0hF(;+R8+O;HF!eV zu9cFr>jE+_3qV=V*-FWgrN6eAT3NYX>$Q4Hw%KX9n$O)GyZ+AQZX)&A5p+%Zw?P0}~7etp1c#BV0}q1j{WIZ~wa2#zMf z_7{4z`F`J|`o=SGy5&$2a#A3DpuFn7cSogLuyVcDyj5w(Ew2*mu8V+LZVg*EdgYBD z*{AG%H_gdODbiZ;aEsaxowJoCwQH=l7t2Zal~ylkLbdya&qo7Hbi-fwhM4sX{O-6l zT_G>v>?2_3Kah%OaU%>C(wc(66;kPP@c|?s@C*q{qZpwvYgv!zK zTY{RPhVx3z@`Riqj1oa}>h_dmU03iP@Jx6`Nomqf>6$X7<|?4A{*LB#zN=r3b)e71 zRkhg(l^aAGw&@AONs(aVNFyf8;?;Ln$~D;u>R|)cy$1C+>nGc;?(vg8U@DUGZzcTM zRe?PAD4fLIygAgOJY$lXr)}WzJ@rA^;PufvTd?!ZHoG>(%007EynXri@28OT$LAMZ z#uODvFG_Ja!&x^>PA>Si$P=oih~z8f;u|BTv+7knxv#P&_iwDfjwsG7oS2^VKX*7I zPjyvIjJ*cS;$d*hxvv`~q-o2DwPg(F>}+PL`h``7DOyLo`47^_m(CkaR2XGVj04YC z4qm_U2cqRGH_83Ed&SH;&ujM&&DgcBU5Mo_#1(p&wIu7#YtQ2@Uy5qTnm6Bc)cke7 z=T#pd>7`>S>#FNr9%T4TFjgTlar3-lYzVExPFPl1O-3l})bGytMr_%OO6ER1ZhdHi z<3g<-d1!HSb)9m!M(s}0y*M4l#YbDqof6G^Risf4)W;hn0|zw5y156QL?61X6<`_k zj4e1Vy30NA+B>zosEvIks(H%drcIL08V6gG8LR`Z^-`R8sgrBy~zstfF1Wq$Euz>1By}(uF+S%!0~8TOdy#7u@g+i nv5hqm@v0MCSJIW@wuKd*-Lt~{p@;dh-wQ7fU-w$KNYQ@*_h$lL literal 0 HcmV?d00001 diff --git a/oscar/icons/trash_can.png b/oscar/icons/trash_can.png index 575c7f03180f4085624e99ea7267a72043fb8225..5e745bcdc7044c657eb375964f18385881d9a71b 100644 GIT binary patch delta 2154 zcmZXUdpHx08pk&y_xmNc)eKRMxegmLv#}&}!OGZd!!-A~6q@Uh1-#_R4@jmbKdEe*zectzZ-sdgTxUQC`Cbb6u0EE5GKLr4Y zxN>v_Tvs4mhf1-51~QppNH{z!DuQ7c8W8}eQs6WOEtnRTV-4@qH$cuXzbVkn9z{uFZ z2yx2T0%>NBG)HjrK@ise77dKdkw!*P+g(3vDh0`;Ga0l$1hI~w`XkW{=3n#|GU$-l zU4c}ET=>L`fp}+OkJGLI@D!|RjV@D*OC_XuPSY%}0U@lr0d{)6$elsuvJ*ROp*K=!p{#4o#m)Fn= zh}YRP;!R)8-bJC|loF}z+I7L|QSRn<$(!sEo>*5`)V%?sMU20V9efcn&=c9|R;RQi;0=JK*Qfm^9ZrRo=L|DN=;u^RBbxh7?|T}5t- zPDxPg(O`cLC#f!AcsBg=4aMa%=@k~QEb5BmWY4^w-KebVY?@<$k!vG`DuM!rNqx6Y zn1vsChBsEpu7Bf&jt%9fLscIXsEGeLt6vEfE&^slg535RI$((( zdJ-=+%Z0x?bO_ zhM60wJS@Q2D{m#f1;09oqIfb@y+HA}3jr{YGv9k^`F;PsK~&}GApT4Db1c@Pl`$e)X>UAN*7@i7 z(uFwb$Lh20vrV>(Z{$D3V>;?LLh|-%m$Q_4O}WyFoZ#ndiR&wk=1(;{rO>047ON6) zi6rmwQ4Zx3x6!pLM<^FqWfrWyq_y3?etHjSZ&-OJtKgPV&gWMsds9z5D^6_8wfD+o zQmv>F|6lHxqkRA&LGh{}4^XY1sUy8AS=?0@oZlzAoOkbD)Vu8i&PU^aEy`u*-3v^m zvft;Gz7oT`mdJKFDQZoJ5XN$xd+oj+4|dv4nHX7#OH8PjHcc*4y{a@jpS@?v6W8j5 zb+=ZNX5Bbfn%_9#0qg@I$SOlBL&ZaVB84Ll&llfHXibVdsji$EJ}W;PP;B)%bXJ#i zsDk+0Sn?ylKD62M0 zm6rGL`SGc@+gJA3aMl&p{=u6{D-?a}UC6hVVi}9HiMGAl5_ohatt2f`qCa-Q#qTH= zp!WS!=d5LG9?>`kwOm$VLpKD4lCP?S(>sebmSJ5gxQ<62viz!+x&3;hV+V~Rfnv!Mk4E}jQH@G&5 zwMcFRo2*^?+PrV(-}5bX3tK_5#KCCwEn6ZZ{qh0}UfnVNQM(!@)7{=%C*J#jNwCt+ zmRr3mQE4V4e%``LwS(CgVW02pQTN zy?%TbP}MN`6RO3-9hF26w35nF@vtdor#`Gj?zT;5U9Rcvu}#nCK1_CkzTRhL8K5a$#G zYuCy)CI-3!R;(vO6bFOR>Qih+e*rS=se6oDJMR9K)lxTKWx@Mjan>IN1C=WYqTnii zt_sVh>|Bf7?Ci_@% delta 2418 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 diff --git a/oscar/icons/update.png b/oscar/icons/update.png index bb465ba78e88e18f1758b27607c375d1583cf2e7..8f4d0e9caba663784afcee0e0e122007bc940698 100644 GIT binary patch delta 1830 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 diff --git a/oscar/oscar.pro b/oscar/oscar.pro index 9ebec841..12ce9a97 100644 --- a/oscar/oscar.pro +++ b/oscar/oscar.pro @@ -255,8 +255,8 @@ lessThan(QT_MAJOR_VERSION,5)|lessThan(QT_MINOR_VERSION,12) { SOURCES += \ checkupdates.cpp \ - overview.cpp \ saveGraphLayoutSettings.cpp \ + overview.cpp \ common_gui.cpp \ cprogressbar.cpp \ daily.cpp \ @@ -362,8 +362,8 @@ QMAKE_EXTRA_COMPILERS += optimize HEADERS += \ checkupdates.h \ - overview.h \ saveGraphLayoutSettings.h \ + overview.h \ common_gui.h \ cprogressbar.h \ daily.h \ diff --git a/oscar/overview.ui b/oscar/overview.ui index e7281f70..65483855 100644 --- a/oscar/overview.ui +++ b/oscar/overview.ui @@ -269,7 +269,7 @@ QToolButton:pressed { :/icons/cog.png:/icons/cog.png - Save and Restore graph layout settings + Save and Restore Graph Layout Settings diff --git a/oscar/saveGraphLayoutSettings.cpp b/oscar/saveGraphLayoutSettings.cpp index a754503b..0c3cf1d5 100644 --- a/oscar/saveGraphLayoutSettings.cpp +++ b/oscar/saveGraphLayoutSettings.cpp @@ -18,9 +18,13 @@ #include "SleepLib/profiles.h" #include "saveGraphLayoutSettings.h" +#define USE_FRAMELESS_WINDOW +#define USE_PROFILE_SPECIFIC_FOLDERoff // off implies saved layouts worked for all profiles. SaveGraphLayoutSettings::SaveGraphLayoutSettings(QString title,QWidget* parent) : parent(parent),title(title) { + fontSizeIncrease = 1; + helpFontSizeIncrease = 1; createSaveFolder(); if (dir==nullptr) return; dir->setFilter(QDir::Files | QDir::Readable | QDir::Writable | QDir::NoSymLinks); @@ -30,36 +34,40 @@ SaveGraphLayoutSettings::SaveGraphLayoutSettings(QString title,QWidget* parent) createMenu() ; - menuDialog->connect(menuAddFullBtn, SIGNAL(clicked()), this, SLOT (addFull_feature() )); - menuDialog->connect(menuAddBtn, SIGNAL(clicked()), this, SLOT (add_feature() )); + menuDialog->connect(menuAddFullBtn, SIGNAL(clicked()), this, SLOT (addFull_feature() )); + menuDialog->connect(menuAddBtn, SIGNAL(clicked()), this, SLOT (add_feature() )); menuDialog->connect(menuRestoreBtn, SIGNAL(clicked()), this, SLOT (restore_feature() )); menuDialog->connect(menuUpdateBtn, SIGNAL(clicked()), this, SLOT (update_feature() )); menuDialog->connect(menuRenameBtn, SIGNAL(clicked()), this, SLOT (rename_feature() )); menuDialog->connect(menuDeleteBtn, SIGNAL(clicked()), this, SLOT (delete_feature() )); + menuDialog->connect(menuHelpBtn, SIGNAL(clicked()), this, SLOT (help_feature() )); menuDialog->connect(menuExitBtn, SIGNAL(clicked()), this, SLOT (exit() )); + menuDialog->connect(menuList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged() )); + - menuDialog->connect(menulist, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*) )); - menuDialog->connect(menulist, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged() )); singleLineRe = new QRegularExpression( QString("^\\s*([^\\r\\n]{0,%1})").arg(1+maxDescriptionLen) ); - fileNumRe = new QRegularExpression( QString("%1(\\d+)(.shg)?$").arg(baseName) ); - parseFilenameRe = new QRegularExpression(QString("^(%1[.](%2(\\d*)))[.]shg$").arg(title).arg(baseName)); + fileNumRe = new QRegularExpression( QString("%1(\\d+)(.shg)?$").arg(fileBaseName) ); + parseFilenameRe = new QRegularExpression(QString("^(%1[.](%2(\\d*)))[.]shg$").arg(title).arg(fileBaseName)); } SaveGraphLayoutSettings::~SaveGraphLayoutSettings() { if (dir==nullptr) {return;} - menuDialog->disconnect(menuAddFullBtn, SIGNAL(clicked()), this, SLOT (addFull_feature() )); - menuDialog->disconnect(menuAddBtn, SIGNAL(clicked()), this, SLOT (add_feature() )); + menuDialog->disconnect(menuAddFullBtn, SIGNAL(clicked()), this, SLOT (addFull_feature() )); + menuDialog->disconnect(menuAddBtn, SIGNAL(clicked()), this, SLOT (add_feature() )); menuDialog->disconnect(menuRestoreBtn, SIGNAL(clicked()), this, SLOT (restore_feature() )); menuDialog->disconnect(menuUpdateBtn, SIGNAL(clicked()), this, SLOT (update_feature() )); - menuDialog->disconnect(menuDeleteBtn, SIGNAL(clicked()), this, SLOT (delete_feature() )); menuDialog->disconnect(menuRenameBtn, SIGNAL(clicked()), this, SLOT (rename_feature() )); + menuDialog->disconnect(menuDeleteBtn, SIGNAL(clicked()), this, SLOT (delete_feature() )); menuDialog->disconnect(menuExitBtn, SIGNAL(clicked()), this, SLOT (exit() )); + menuDialog->disconnect(menuHelpBtn, SIGNAL(clicked()), this, SLOT (help_feature() )); + menuDialog->disconnect(menuList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged() )); + helpDestructor(); - menuDialog->disconnect(menulist, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged() )); delete descriptionMap; delete singleLineRe; @@ -107,97 +115,239 @@ void SaveGraphLayoutSettings::createSaveFolder() { dir=tmpDir; } -void SaveGraphLayoutSettings::createMenu() { - styleOn= calculateStyle(true,false); - styleOff= calculateStyle(false,false); - styleExitBtn=calculateStyle(true,true); +QPushButton* SaveGraphLayoutSettings::menuBtn(QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip) { + return newBtnRtn(menuLayoutButtons, name, icon, style, hPolicy,tooltip) ; +} +QPushButton* SaveGraphLayoutSettings::helpBtn(QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip) { + return newBtnRtn(helpLayoutButtons, name, icon, style, hPolicy,tooltip) ; +} +QPushButton* SaveGraphLayoutSettings::newBtnRtn(QHBoxLayout* layout,QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip) { + QPushButton* button = new QPushButton(name, menuDialog); + button->setIcon(*icon); + button->setStyleSheet(style); + button->setSizePolicy(hPolicy,QSizePolicy::Fixed); + button->setToolTip(tooltip); + button->setToolTipDuration(AppSetting->tooltipTimeout()); + button->setFont(*mediumfont); + layout->addWidget(button); + return button; +} + +void SaveGraphLayoutSettings::createStyleSheets() { + styleOn= calculateButtonStyle(true,false); + styleOff= calculateButtonStyle(false,false); + styleExit= calculateButtonStyle(true,true); styleMessageBox= "QMessageBox { " "background-color:yellow;" - "color:black;" + //"color:black;" + "color:red;" "border: 2px solid black;" - "text-align: center;" + "text-align: right;" + "font-size: 16px;" "}" - "QPushButton { " - "color:black;" + "QTextEdit {" + "background-color:lightblue;" + //"color:black;" + "color:red;" + "border: 9px solid black;" + "text-align: center;" + "vertical-align:top;" "}" ; styleDialog= "QDialog { " "border: 3px solid black;" - "min-width:30em;" // make large fonts in message box "}"; +} - menuDialog= new QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint|Qt::WindowSystemMenuHint); - menuDialog->setWindowFlag(Qt::FramelessWindowHint); +void SaveGraphLayoutSettings::createMenu() { - menuAddFullBtn =new QPushButton("Add", parent); - menuAddBtn =new QPushButton(tr("Add"), parent); - menuRestoreBtn = new QPushButton(tr("Restore"), parent); - menuUpdateBtn = new QPushButton(tr("Update"), parent); - menuRenameBtn = new QPushButton(tr("Rename"), parent); - menuDeleteBtn = new QPushButton(tr("Delete"), parent); - menuExitBtn = new QPushButton(*m_icon_exit,tr(""),parent); + menuListFont =*defaultfont; + menuListFont.setPointSize(fontSizeIncrease+menuListFont.pointSize()); - menulist=new QListWidget(menuDialog); - menulist->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - menuLayout = new QVBoxLayout(menuDialog); - menuLayout1 = new QHBoxLayout(); - menuLayout2 = new QVBoxLayout(); - menuLayout2->setMargin(6); - menuLayout->addLayout(menuLayout1); - menuLayout->addLayout(menuLayout2); - - menuLayout1->addWidget(menuAddFullBtn); - menuLayout1->addWidget(menuAddBtn); - menuLayout1->addWidget(menuRestoreBtn); - menuLayout1->addWidget(menuRenameBtn); - menuLayout1->addWidget(menuUpdateBtn); - menuLayout1->addWidget(menuDeleteBtn); - menuLayout1->addWidget(menuExitBtn); - menuLayout2->addWidget(menulist, 1); -/*TRANSLATION*/ - menuAddFullBtn-> setToolTip(tr("Add Feature inhibited. The maximum number has been exceeded.")); - menuAddBtn-> setToolTip(tr("Save current settings.")); - menuRestoreBtn-> setToolTip(tr("Restores saved settings.")); - menuRenameBtn-> setToolTip(tr("Renames the selection. Must edit existing name then press enter.")); - menuUpdateBtn-> setToolTip(tr("Updates the selection with current settings.")); - menuDeleteBtn-> setToolTip(tr("Delete the selection.")); - menuExitBtn-> setToolTip(tr("Closes the dialog menu. Returns to previous menu.")); + createStyleSheets(); + #ifdef USE_FRAMELESS_WINDOW + menuDialog= new QDialog(parent, Qt::FramelessWindowHint); + menuDialog->setSizeGripEnabled(true); // allows lower right hand corner to resize dialog + #else + menuDialog= new QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint|Qt::WindowSystemMenuHint); + menuDialog->setWindowTitle(tr("Manage Save Layout Settings")) ; + #endif menuDialog->setStyleSheet(styleDialog); - menuAddFullBtn->setStyleSheet(styleOff); - menuAddBtn->setStyleSheet(styleOn); - menuRestoreBtn->setStyleSheet(styleOn); - menuUpdateBtn->setStyleSheet(styleOn); - menuRenameBtn->setStyleSheet(styleOn); - menuDeleteBtn->setStyleSheet(styleOn); - menuExitBtn->setStyleSheet( styleExitBtn ); + + menuLayout = new QVBoxLayout(menuDialog); + menuLayoutButtons = new QHBoxLayout(); + + menuAddFullBtn = menuBtn(tr("Add" ),m_icon_add , styleOff ,QSizePolicy::Minimum, tr("Add Feature inhibited. The maximum number of Items has been exceeded.") ); + menuAddBtn = menuBtn(tr("Add" ),m_icon_add , styleOn ,QSizePolicy::Minimum, tr("creates new copy of current settings.")); + menuRestoreBtn = menuBtn(tr("Restore"),m_icon_restore , styleOn ,QSizePolicy::Minimum, tr("Restores saved settings from selection.")); + menuRenameBtn = menuBtn(tr("Rename" ),m_icon_rename , styleOn ,QSizePolicy::Minimum, tr("Renames the selection. Must edit existing name then press enter.")); + menuUpdateBtn = menuBtn(tr("Update" ),m_icon_update , styleOn ,QSizePolicy::Minimum, tr("Updates the selection with current settings.")); + menuDeleteBtn = menuBtn(tr("Delete" ),m_icon_delete , styleOn ,QSizePolicy::Minimum, tr("Deletes the selection.")); + menuHelpBtn = menuBtn("" ,m_icon_help , styleOn ,QSizePolicy::Fixed , tr("Expanded Help menu.")); + menuExitBtn = menuBtn("" ,m_icon_exit , styleExit,QSizePolicy::Fixed , tr("Exits the Layout menu.")); + + #ifndef USE_FRAMELESS_WINDOW + menuExitBtn->hide(); + #endif + + menuList = new QListWidget(menuDialog); + menuList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + menuList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + menuList->setFont(menuListFont); - menuAddFullBtn->setIcon(*m_icon_add ); - menuAddBtn->setIcon(*m_icon_add ); - menuRestoreBtn->setIcon(*m_icon_restore ); - menuRenameBtn->setIcon(*m_icon_rename ); - menuUpdateBtn->setIcon(*m_icon_update ); - menuDeleteBtn->setIcon(*m_icon_delete ); - menuDeleteBtn->setIcon(*m_icon_delete ); + menuLayout->addLayout(menuLayoutButtons); + menuLayout->addWidget(menuList, 1); + //menuList->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); + menuList->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); - int timeout = AppSetting->tooltipTimeout(); - menuAddFullBtn->setToolTipDuration(timeout); - menuAddBtn->setToolTipDuration(timeout); - menuRestoreBtn->setToolTipDuration(timeout); - menuUpdateBtn->setToolTipDuration(timeout); - menuRenameBtn->setToolTipDuration(timeout); - menuDeleteBtn->setToolTipDuration(timeout); - menuExitBtn->setToolTipDuration(timeout); }; -bool SaveGraphLayoutSettings::confirmAction(QString name,QString question,QIcon* icon) { +void SaveGraphLayoutSettings::createHelp() { + if(helpDialog) return; + + helpDialog= new QDialog(parent, Qt::FramelessWindowHint); + helpDialog->setStyleSheet(styleDialog); + menuDialog->setSizeGripEnabled(true); // allows lower right hand corner to resize dialog + + QFont helpInfoFont = menuListFont; + helpInfoFont.setPointSize(helpFontSizeIncrease+helpInfoFont.pointSize()); + + QFont helpInfoLabelFont = helpInfoFont; + helpInfoLabelFont.setPointSize(fontSizeIncrease+ helpInfoFont.pointSize()); + + + //QHBoxLayout* helpLayoutButtons; + //QLabel* helpInfoHeaderLabel; + //QFont helpInfoFont; + //QVBoxLayout* helpLayout; + + + QLabel* helpInfoHeaderLabel = new QLabel("helpInfoHeaderLabel",parent); + helpInfoHeaderLabel->setText(QString( tr("

Help Menu - Manage Graph Layout Settings

"))); + helpInfoHeaderLabel->setFont(helpInfoLabelFont); + + QLabel* helpInfoLabel = new QLabel("helpInfo",parent); + helpInfoLabel->setFont(helpInfoFont); + helpInfoLabel->setText(helpInfo()) ; + + + helpLayoutButtons = new QHBoxLayout(); + helpLayoutButtons->addWidget(helpInfoHeaderLabel); + helpInfoExitBtn= helpBtn("" ,m_icon_return , styleOn ,QSizePolicy::Fixed , tr("Exits the help menu.")); + helpExitBtn = helpBtn("" ,m_icon_exit , styleExit,QSizePolicy::Fixed , tr("Exits the dialog menu.")); + + QVBoxLayout* helpLayout = new QVBoxLayout(helpDialog); + helpLayout->addLayout(helpLayoutButtons); + helpLayout->addWidget(helpInfoLabel, 1); + + helpDialog->connect(helpInfoExitBtn,SIGNAL(clicked()), this, SLOT (help_off_feature() )); + helpDialog->connect(helpExitBtn, SIGNAL(clicked()), this, SLOT (help_exit_feature() )); + +} + +void SaveGraphLayoutSettings::helpDestructor() { + if(!helpDialog) return; + helpDialog->disconnect(helpInfoExitBtn,SIGNAL(clicked()), this, SLOT (help_off_feature() )); + helpDialog->disconnect(helpExitBtn, SIGNAL(clicked()), this, SLOT (help_exit_feature() )); +} + +QString SaveGraphLayoutSettings::helpInfo() { + +return QString( tr("\ +
Button Description
\ +

\ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Add Creates a new saved Setting item. The default descripton is the currenti date.
\ + The description may be changed by the User.
\ + The Add button will be greyed out when maximum number of saved layouts is reached.
Other Buttons These buttons will be greyed out when no items are selected
Restore Loads the current graph layout setting with the swlected saved settings then returns.
Rename Allows the user to modify the description of the selected saved session.\ + Same as a double click on the item.
Update Saves the current graph layout setting to the selected saved settings.
Prompts for confirmation.
Delete Deletes the selected graph layout setting.
Prompts for confirmation.
Exit (Red circle with a white \"X.\") Returns to OSCAR menu.
\ +

Graph Layout Settings
\ + \ + \ + \ +
* Name * Order * Pinning * Height
* Height Options * Event Flags * Plots Enabled * Dotted Lines
\ +
General Information
\ + \ + * Maximum description size = 80 characters.\ + * Maximum Saved Graph Layout Settings = 30 \ + * Saved Graprhg Layout Setting are available for all user profiles\ + * Graph Layout Settings only impact how graphs are displayed.
\ + They do not contains any other data.\ + * The Escape key \"esc\" will always exit a dialog menu - like this help or the layout menu\ + \ +

\ +")); + +} + +const QString SaveGraphLayoutSettings::calculateStyleMessageBox(QFont* font , QString& s1, QString& s2) { + QFontMetrics fm = QFontMetrics(*font); + int width = fm.boundingRect(s1).size().width(); + int width2 = fm.boundingRect(s2).size().width(); + width = qMax(width,width2) + iconWidthMessageBox; + + QString style = QString("%1 QLabel{%2 min-width: %3px;}" ). + arg(styleMessageBox). + arg("text-align: center;" "color:black;"). + arg(width); + + return style; +} + +bool SaveGraphLayoutSettings::verifyItem(QListWidgetItem* item,QString text,QIcon* icon) { + //if (verifyhelp() ) return false; + if (item) return true; + initminMenuListSize(); + confirmAction( text ,"" , icon); + return false; +} + +#if 1 +bool SaveGraphLayoutSettings::confirmAction(QString top ,QString bottom,QIcon* icon,QMessageBox::StandardButtons flags , QMessageBox::StandardButton adefault, QMessageBox::StandardButton success) { + //QString topText=QString("
%1
").arg(top); + //QString bottomText=QString("
%1
").arg(bottom); + QString topText=QString("

%1

").arg(top); + QString bottomText=QString("

%1

").arg(bottom); + + QMessageBox msgBox(menuDialog); + msgBox.setText(topText); + msgBox.setInformativeText(bottomText); + if (icon!=nullptr) { + msgBox.setIconPixmap(icon->pixmap(QSize(iconWidthMessageBox,iconWidthMessageBox))); + } + // may be good for help menu. a pull down box with box of data. msgBox.setDetailedText("some detailed string"); + msgBox.setStandardButtons(flags); + msgBox.setDefaultButton(adefault); + msgBox.setWindowFlag(Qt::FramelessWindowHint,true); + + msgBox.setStyleSheet(calculateStyleMessageBox(&menuListFont,top,bottom)); + + // displaywidgets((QWidget*)&msgBox); + bool ret= msgBox.exec()==success; + return ret; +} +#else +bool SaveGraphLayoutSettings::confirmAction(QString name ,QString question,QIcon* icon,QMessageBox::StandardButtons flags , QMessageBox::StandardButton adefault, QMessageBox::StandardButton success) { +//bool SaveGraphLayoutSettings::confirmAction(QString name,QString question,QIcon* icon) + Q_UNUSED(flags); + Q_UNUSED(adefault); + Q_UNUSED(success); QMessageBox msgBox(menuDialog); msgBox.setText(question); if (icon!=nullptr) { @@ -213,8 +363,9 @@ bool SaveGraphLayoutSettings::confirmAction(QString name,QString question,QIcon* Q_UNUSED(name); } +#endif -QString SaveGraphLayoutSettings::calculateStyle(bool on,bool exitBtn){ +QString SaveGraphLayoutSettings::calculateButtonStyle(bool on,bool exitBtn){ QString btnStyle=QString("QPushButton{%1%2}").arg(on ?"color: black;background-color:white;" :"color: darkgray;background-color:#e8e8e8 ;" @@ -239,27 +390,33 @@ QString SaveGraphLayoutSettings::calculateStyle(bool on,bool exitBtn){ } void SaveGraphLayoutSettings::looksOn(QPushButton* button,bool on){ - button->setEnabled(on); + //button->setEnabled(on); button->setStyleSheet(on?styleOn:styleOff); } -void SaveGraphLayoutSettings::enableButtons(bool enable) { +void SaveGraphLayoutSettings::manageButtonApperance() { + + bool enable = menuList->currentItem(); looksOn(menuUpdateBtn,enable); looksOn(menuRestoreBtn,enable); looksOn(menuDeleteBtn,enable); looksOn(menuRenameBtn,enable); + if (nextNumToUse<0) { // check if at Maximum limit + // must always hide first menuAddBtn->hide(); menuAddFullBtn->show(); } else { + // must always hide first menuAddFullBtn->hide(); menuAddBtn->show(); } } + void SaveGraphLayoutSettings::add_feature() { if(!graphView) return; - QString fileName = QString("%1%2").arg(baseName).arg(nextNumToUse,fileNumMaxLength,10,QLatin1Char('0')); + QString fileName = QString("%1%2").arg(fileBaseName).arg(nextNumToUse,fileNumMaxLength,10,QLatin1Char('0')); writeSettings(fileName); // create a default description - use formatted datetime. QString desc=QDateTime::currentDateTime().toString(); @@ -267,25 +424,21 @@ void SaveGraphLayoutSettings::add_feature() { descriptionMap->save(); QListWidgetItem* item = updateFileList( fileName); if (item!=nullptr) { - menulist->setCurrentItem(item,QItemSelectionModel::ClearAndSelect); - menulist->editItem(item); + menuList->setCurrentItem(item,QItemSelectionModel::ClearAndSelect); + menuList->editItem(item); } + menuList->sortItems(); + resizeMenu(); } void SaveGraphLayoutSettings::addFull_feature() { - QMessageBox msgBox(menuDialog); - msgBox.setText(tr("Maximum number exceeded.")); - msgBox.setStandardButtons(QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Cancel); - msgBox.setWindowFlag(Qt::FramelessWindowHint,true); - msgBox.setStyleSheet(styleMessageBox); - msgBox.setIconPixmap(m_icon_addFull->pixmap(QSize(50,50))); - msgBox.exec(); + verifyItem( nullptr,tr("Maximum number of Items exceeded.") , m_icon_add); } void SaveGraphLayoutSettings::update_feature() { if(!graphView) return; - QListWidgetItem * item=menulist->currentItem(); + QListWidgetItem * item=menuList->currentItem(); + if (!verifyItem(item, tr("No Item Selected") , m_icon_update)) return ; if(!confirmAction( item->text(), tr("Ok to Update?") , m_icon_update) ) return; QString fileName = item->data(fileNameRole).toString(); writeSettings(fileName); @@ -293,8 +446,8 @@ void SaveGraphLayoutSettings::update_feature() { void SaveGraphLayoutSettings::restore_feature() { if(!graphView) return; - QListWidgetItem * item=menulist->currentItem(); - if (!item) return; + QListWidgetItem * item=menuList->currentItem(); + if (!verifyItem(item, tr("No Item Selected") , m_icon_restore)) return ; QString fileName = item->data(fileNameRole).toString(); loadSettings(fileName); exit(); @@ -302,17 +455,35 @@ void SaveGraphLayoutSettings::restore_feature() { void SaveGraphLayoutSettings::rename_feature() { if(!graphView) return; - QListWidgetItem * item=menulist->currentItem(); - if (!item) return; - menulist->editItem(item); + QListWidgetItem * item=menuList->currentItem(); + if (!verifyItem(item, tr("No Item Selected") , m_icon_rename)) return ; + menuList->editItem(item); // SaveGraphLayoutSettings::itemChanged(QListWidgetItem *item) is called when edit changes the entry. // itemChanged will update the description map } +void SaveGraphLayoutSettings::help_exit_feature() { + helpDialog->close(); + exit(); +} + +void SaveGraphLayoutSettings::help_off_feature() { + helpDialog->close(); +} + +void SaveGraphLayoutSettings::help_feature() { + initminMenuListSize(); + createHelp(); + if(!helpDialog) return; + helpDialog->raise(); + helpDialog->exec(); + manageButtonApperance(); +} + void SaveGraphLayoutSettings::delete_feature() { if(!graphView) return; - QListWidgetItem * item=menulist->currentItem(); - if (!item) return; + QListWidgetItem * item=menuList->currentItem(); + if (!verifyItem(item, tr("No Item Selected") , m_icon_delete)) return ; if(!confirmAction(item->text(), tr("Ok To Delete?") ,m_icon_delete) ) return; QString fileName = item->data(fileNameRole).toString(); @@ -323,7 +494,8 @@ void SaveGraphLayoutSettings::delete_feature() { if (nextNumToUse<0) { nextNumToUse=fileNum(fileName); } - enableButtons(true); + manageButtonApperance(); + resizeMenu(); } void SaveGraphLayoutSettings::itemChanged(QListWidgetItem *item) @@ -352,13 +524,34 @@ void SaveGraphLayoutSettings::itemChanged(QListWidgetItem *item) descriptionMap->save(); } item->setText(desc); + menuList->sortItems(); + menuList->setCurrentItem(item); + resizeMenu(); + } void SaveGraphLayoutSettings::itemSelectionChanged() { - enableButtons(true); + initminMenuListSize(); + manageButtonApperance(); } +void SaveGraphLayoutSettings::initminMenuListSize() { + if (minMenuDialogSize.width()==0) { + menuDialogSize = menuDialog->size(); + minMenuDialogSize = menuDialogSize; + + menuListSize = menuList->size(); + minMenuListSize = menuListSize; + + dialogListDiff = menuDialogSize - menuListSize; + + dialogListDiff.setWidth (horizontalWidthAdjustment + dialogListDiff.width()); + + resizeMenu(); + } +}; + void SaveGraphLayoutSettings::writeSettings(QString filename) { graphView->SaveSettings(title+"."+filename,dirName); }; @@ -381,9 +574,79 @@ int SaveGraphLayoutSettings::fileNum(QString fileName) { return value; } + +QSize SaveGraphLayoutSettings::maxSize(const QSize AA , const QSize BB ) { + return QSize ( qMax(AA.width(),BB.width()) , qMax(AA.height(),BB.height() ) ); +} + +bool SaveGraphLayoutSettings::sizeEqual(const QSize AA , const QSize BB ) { + return (AA.width()==BB.width()) && ( AA.height()==BB.height()) ; +} + + + +void SaveGraphLayoutSettings::resizeMenu() { + if (minMenuDialogSize.width()==0) return; + + QSize newSize = calculateMenuDialogSize(); + newSize.setWidth ( newSize.width()); + + menuDialogSize = menuDialog->size(); + + if ( sizeEqual(newSize , menuDialogSize)) { + // no work to do + return; + }; + + if ( menuDialogSize.width() < newSize.width() ) { + menuDialog->setMinimumWidth(newSize.width()); + menuDialog->setMaximumWidth(QWIDGETSIZE_MAX); + } else if ( menuDialogSize.width() > newSize.width() ) { + menuDialog->setMaximumWidth(newSize.width()); + menuDialog->setMinimumWidth(newSize.width()); + } + if ( menuDialogSize.height() < newSize.height() ) { + menuDialog->setMinimumHeight(newSize.height()); + menuDialog->setMaximumHeight(QWIDGETSIZE_MAX); + } else if ( menuDialogSize.height() > newSize.height() ) { + menuDialog->setMaximumHeight(newSize.height()); + menuDialog->setMinimumHeight(newSize.height()); + } + menuDialogSize = newSize; +} + +QSize SaveGraphLayoutSettings::calculateMenuDialogSize() { + if (menuDialogSize.width()==0) return QSize(0,0); + QListWidgetItem* item; + widestItem=nullptr; + QFontMetrics fm = QFontMetrics(menuListFont); + + // account for scrollbars. + QSize returnValue = QSize( 0 , fm.height() ); // add an extra space at the bottom. width didn't work + + // Account for dialog Size + returnValue += dialogListDiff; + QSize size; + + for (int index = 0; index < menuList->count(); ++index) { + item = menuList->item(index); + if (!item) continue; + size = fm.boundingRect(item->text()).size(); + if (returnValue.width() < size.width()) { + returnValue.setWidth( qMax( returnValue.width(),size.width())); + widestItem=item; + } + returnValue.setHeight( returnValue.height()+size.height()); + } + returnValue.setWidth( horizontalWidthAdjustment + returnValue.width() ) ; + + returnValue = maxSize(returnValue, minMenuDialogSize); + return returnValue; +} + QListWidgetItem* SaveGraphLayoutSettings::updateFileList(QString find) { QListWidgetItem* ret=nullptr; - enableButtons(false); + manageButtonApperance(); dir->refresh(); QFileInfoList filelist = dir->entryInfoList( QDir::Files | QDir::Readable | QDir::Writable | QDir::NoSymLinks,QDir::Name); @@ -391,7 +654,7 @@ QListWidgetItem* SaveGraphLayoutSettings::updateFileList(QString find) { int row=0; int count=0; - menulist->clear(); + menuList->clear(); nextNumToUse=-1; descriptionMap->load(); for (int i = 0; i < filelist.size(); ++i) { @@ -414,7 +677,7 @@ QListWidgetItem* SaveGraphLayoutSettings::updateFileList(QString find) { QListWidgetItem *item = new QListWidgetItem(descriptionMap->get(fileName)); item->setData(fileNameRole,fileName); item->setFlags(item->flags() | Qt::ItemIsEditable); - menulist->insertItem(row,item); + menuList->insertItem(row,item); row++; if (find!=nullptr && fileName==find) { ret=item; @@ -429,8 +692,8 @@ QListWidgetItem* SaveGraphLayoutSettings::updateFileList(QString find) { nextNumToUse=count; } } - enableButtons(false); - menulist->sortItems(); + manageButtonApperance(); + menuList->sortItems(); return ret; } @@ -447,6 +710,7 @@ void SaveGraphLayoutSettings::menu(gGraphView* graphView) { } this->graphView=graphView; updateFileList(); + manageButtonApperance(); menuDialog->raise(); menuDialog->exec(); exit(); @@ -569,19 +833,19 @@ switch (ret) { عذرا ، لا يمكن تحديد موقع ملف. - menuDialog->connect(menulist, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(itemActivated(QListWidgetItem*) )); - menuDialog->connect(menulist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*) )); - menuDialog->connect(menulist, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*) )); - menuDialog->connect(menulist, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); - menuDialog->connect(menulist, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(itemActivated(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); + menuDialog->connect(menuList, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(itemActivated(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); - menuDialog->disconnect(menulist, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(itemActivated(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); + menuDialog->disconnect(menuList, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(itemEntered(QListWidgetItem*) )); void SaveGraphLayoutSettings::itemActivated(QListWidgetItem *item) diff --git a/oscar/saveGraphLayoutSettings.h b/oscar/saveGraphLayoutSettings.h index c75f2b62..d3e5e3be 100644 --- a/oscar/saveGraphLayoutSettings.h +++ b/oscar/saveGraphLayoutSettings.h @@ -16,9 +16,11 @@ #include #include #include - +#include +#include #include #include + #include "Graphs/gGraphView.h" class DescriptionMap @@ -35,7 +37,7 @@ private: QString filename; QMap descriptions; const QRegularExpression* parseDescriptionsRe; - QChar delimiter = QChar(177); + const QChar delimiter = QChar(':'); }; class SaveGraphLayoutSettings : public QWidget @@ -46,19 +48,35 @@ public: ~SaveGraphLayoutSettings(); void menu(gGraphView* graphView); protected: + QIcon* m_icon_return = new QIcon(":/icons/return.png"); + QIcon* m_icon_help = new QIcon(":/icons/question_mark.png"); QIcon* m_icon_exit = new QIcon(":/icons/exit.png"); QIcon* m_icon_delete = new QIcon(":/icons/trash_can.png"); QIcon* m_icon_update = new QIcon(":/icons/update.png"); QIcon* m_icon_restore = new QIcon(":/icons/restore.png"); QIcon* m_icon_rename = new QIcon(":/icons/rename.png"); QIcon* m_icon_add = new QIcon(":/icons/plus.png"); - QIcon* m_icon_addFull = new QIcon(":/icons/brick-wall.png"); private: - const static int fileNumMaxLength=3; - const static int maxFiles=20; // Max supported design limited is 1000 - based on layoutName has has 3 numeric digits fileNumMaxLength=3. - const static int maxDescriptionLen=80; - const QString baseName=QString("layout"); + const static int fileNumMaxLength = 3; + const static int maxFiles = 30; // Max supported design limited is 1000 10**fileNumMaxLength(3). + const static int iconWidthMessageBox = 50; + const static int maxDescriptionLen = 80; + const QString fileBaseName = QString("layout"); + const int fileNameRole = Qt::UserRole; + int fontSizeIncrease = 0; + int horizontalWidthAdjustment=60; // this seem to make menu size changes work. Testing says it is 60 but what causes it is unknown. + + QSize minMenuListSize = QSize(0,0); + QSize minMenuDialogSize = QSize(0,0); + + QSize dialogListDiff = QSize(0,0); + QSize menuDialogSize = QSize(0,0); + QSize menuListSize = QSize(0,0); + void initminMenuListSize(); + QSize calculateMenuDialogSize(); + QSize maxSize(const QSize AA , const QSize BB ) ; + bool sizeEqual(const QSize AA , const QSize BB ) ; const QRegularExpression* singleLineRe; const QRegularExpression* fileNumRe; @@ -67,10 +85,11 @@ private: QWidget* parent; const QString title; - gGraphView* graphView=nullptr; + gGraphView* graphView = nullptr; + QFont menuListFont; QDialog* menuDialog; - QListWidget* menulist; + QListWidget* menuList; QPushButton* menuAddFullBtn; // Must be first item for workaround. QPushButton* menuAddBtn; @@ -79,31 +98,59 @@ private: QPushButton* menuUpdateBtn; QPushButton* menuRenameBtn; QPushButton* menuExitBtn; + QPushButton* menuHelpBtn; + QVBoxLayout* menuLayout; - QHBoxLayout* menuLayout1; - QVBoxLayout* menuLayout2; + QHBoxLayout* menuLayoutButtons; - QDir* dir=nullptr; + void createHelp(); + void helpDestructor(); + QString helpInfo(); + QDialog* helpDialog=nullptr; + QPushButton* helpInfoExitBtn=nullptr; + QPushButton* helpExitBtn=nullptr; + int helpFontSizeIncrease = 0; + QHBoxLayout* helpLayoutButtons = nullptr; + + + + QDir* dir = nullptr; QString dirName; int nextNumToUse; - QListWidgetItem* updateFileList(QString find=QString()); + QListWidgetItem* updateFileList(QString find = QString()); + QListWidgetItem* widestItem=nullptr; QString styleOn; QString styleOff; - QString styleExitBtn; + QString styleExit; QString styleMessageBox; QString styleDialog; - QString calculateStyle(bool on,bool border); + + QString calculateButtonStyle(bool on,bool border); void looksOn(QPushButton* button,bool on); DescriptionMap* descriptionMap; - bool confirmAction(QString name,QString question,QIcon* icon); + bool confirmAction(QString name,QString question,QIcon* icon, + QMessageBox::StandardButtons flags = (QMessageBox::Cancel|QMessageBox::Yes) , + QMessageBox::StandardButton adefault = QMessageBox::Cancel, + QMessageBox::StandardButton success = QMessageBox::Yes + ); + bool verifyItem(QListWidgetItem* item,QString name,QIcon* icon) ; + + const QString calculateStyleMessageBox( QFont* font, QString& s1, QString& s2); + + void displaywidgets(QWidget* widget); + QSize calculateParagraphSize(QString& text,QFont& font, QString& ); void createMenu(); + void createStyleSheets(); void createSaveFolder(); - void enableButtons(bool enable); - void add_featurertn(); + QPushButton* newBtnRtn(QHBoxLayout*, QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip); + QPushButton* menuBtn( QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip); + QPushButton* helpBtn( QString name, QIcon* icon, QString style,QSizePolicy::Policy hPolicy,QString tooltip); + + void manageButtonApperance(); + void resizeMenu(); - const int fileNameRole = Qt::UserRole; int fileNum(QString fileName); void writeSettings(QString filename); void loadSettings(QString filename); @@ -113,10 +160,13 @@ public slots: private slots: void add_feature(); void addFull_feature(); - void update_feature(); void restore_feature(); - void delete_feature(); void rename_feature(); + void update_feature(); + void help_feature(); + void help_off_feature(); + void help_exit_feature(); + void delete_feature(); void exit(); void itemChanged(QListWidgetItem *item);