From 1fd6ce531084d4e1ee99ed9bc6cb548b31aa1fe2 Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Fri, 22 Jun 2018 16:31:52 -0700 Subject: [PATCH] Finally a good command parsing technique yeilds loads more usable data. Dark mode is in too! --- commhandler.cpp | 87 +- commhandler.h | 3 + main.cpp | 2 + qdarkstyle/rc/Hmovetoolbar.png | Bin 0 -> 220 bytes qdarkstyle/rc/Hsepartoolbar.png | Bin 0 -> 172 bytes qdarkstyle/rc/Vmovetoolbar.png | Bin 0 -> 228 bytes qdarkstyle/rc/Vsepartoolbar.png | Bin 0 -> 187 bytes qdarkstyle/rc/branch_closed-on.png | Bin 0 -> 147 bytes qdarkstyle/rc/branch_closed.png | Bin 0 -> 160 bytes qdarkstyle/rc/branch_open-on.png | Bin 0 -> 150 bytes qdarkstyle/rc/branch_open.png | Bin 0 -> 166 bytes qdarkstyle/rc/checkbox_checked.png | Bin 0 -> 492 bytes qdarkstyle/rc/checkbox_checked_disabled.png | Bin 0 -> 491 bytes qdarkstyle/rc/checkbox_checked_focus.png | Bin 0 -> 252 bytes qdarkstyle/rc/checkbox_indeterminate.png | Bin 0 -> 493 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 249 bytes qdarkstyle/rc/checkbox_unchecked.png | Bin 0 -> 464 bytes qdarkstyle/rc/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes qdarkstyle/rc/checkbox_unchecked_focus.png | Bin 0 -> 240 bytes qdarkstyle/rc/close-hover.png | Bin 0 -> 598 bytes qdarkstyle/rc/close-pressed.png | Bin 0 -> 598 bytes qdarkstyle/rc/close.png | Bin 0 -> 586 bytes qdarkstyle/rc/down_arrow.png | Bin 0 -> 165 bytes qdarkstyle/rc/down_arrow_disabled.png | Bin 0 -> 166 bytes qdarkstyle/rc/left_arrow.png | Bin 0 -> 166 bytes qdarkstyle/rc/left_arrow_disabled.png | Bin 0 -> 166 bytes qdarkstyle/rc/radio_checked.png | Bin 0 -> 940 bytes qdarkstyle/rc/radio_checked_disabled.png | Bin 0 -> 972 bytes qdarkstyle/rc/radio_checked_focus.png | Bin 0 -> 846 bytes qdarkstyle/rc/radio_unchecked.png | Bin 0 -> 728 bytes qdarkstyle/rc/radio_unchecked_disabled.png | Bin 0 -> 760 bytes qdarkstyle/rc/radio_unchecked_focus.png | Bin 0 -> 646 bytes qdarkstyle/rc/right_arrow.png | Bin 0 -> 160 bytes qdarkstyle/rc/right_arrow_disabled.png | Bin 0 -> 160 bytes qdarkstyle/rc/sizegrip.png | Bin 0 -> 129 bytes qdarkstyle/rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes qdarkstyle/rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes qdarkstyle/rc/stylesheet-vline.png | Bin 0 -> 239 bytes qdarkstyle/rc/transparent.png | Bin 0 -> 195 bytes qdarkstyle/rc/undock.png | Bin 0 -> 578 bytes qdarkstyle/rc/up_arrow.png | Bin 0 -> 158 bytes qdarkstyle/rc/up_arrow_disabled.png | Bin 0 -> 159 bytes qdarkstyle/style.qrc | 46 + qdarkstyle/style.qss | 1235 +++++++++++++++++ rigcommander.cpp | 185 ++- wfmain.cpp | 77 +- wfmain.h | 5 +- wfmain.ui | 4 +- wfview.pro | 3 + 49 files changed, 1566 insertions(+), 81 deletions(-) create mode 100644 qdarkstyle/rc/Hmovetoolbar.png create mode 100644 qdarkstyle/rc/Hsepartoolbar.png create mode 100644 qdarkstyle/rc/Vmovetoolbar.png create mode 100644 qdarkstyle/rc/Vsepartoolbar.png create mode 100644 qdarkstyle/rc/branch_closed-on.png create mode 100644 qdarkstyle/rc/branch_closed.png create mode 100644 qdarkstyle/rc/branch_open-on.png create mode 100644 qdarkstyle/rc/branch_open.png create mode 100644 qdarkstyle/rc/checkbox_checked.png create mode 100644 qdarkstyle/rc/checkbox_checked_disabled.png create mode 100644 qdarkstyle/rc/checkbox_checked_focus.png create mode 100644 qdarkstyle/rc/checkbox_indeterminate.png create mode 100644 qdarkstyle/rc/checkbox_indeterminate_focus.png create mode 100644 qdarkstyle/rc/checkbox_unchecked.png create mode 100644 qdarkstyle/rc/checkbox_unchecked_disabled.png create mode 100644 qdarkstyle/rc/checkbox_unchecked_focus.png create mode 100644 qdarkstyle/rc/close-hover.png create mode 100644 qdarkstyle/rc/close-pressed.png create mode 100644 qdarkstyle/rc/close.png create mode 100644 qdarkstyle/rc/down_arrow.png create mode 100644 qdarkstyle/rc/down_arrow_disabled.png create mode 100644 qdarkstyle/rc/left_arrow.png create mode 100644 qdarkstyle/rc/left_arrow_disabled.png create mode 100644 qdarkstyle/rc/radio_checked.png create mode 100644 qdarkstyle/rc/radio_checked_disabled.png create mode 100644 qdarkstyle/rc/radio_checked_focus.png create mode 100644 qdarkstyle/rc/radio_unchecked.png create mode 100644 qdarkstyle/rc/radio_unchecked_disabled.png create mode 100644 qdarkstyle/rc/radio_unchecked_focus.png create mode 100644 qdarkstyle/rc/right_arrow.png create mode 100644 qdarkstyle/rc/right_arrow_disabled.png create mode 100644 qdarkstyle/rc/sizegrip.png create mode 100644 qdarkstyle/rc/stylesheet-branch-end.png create mode 100644 qdarkstyle/rc/stylesheet-branch-more.png create mode 100644 qdarkstyle/rc/stylesheet-vline.png create mode 100644 qdarkstyle/rc/transparent.png create mode 100644 qdarkstyle/rc/undock.png create mode 100644 qdarkstyle/rc/up_arrow.png create mode 100644 qdarkstyle/rc/up_arrow_disabled.png create mode 100644 qdarkstyle/style.qrc create mode 100644 qdarkstyle/style.qss diff --git a/commhandler.cpp b/commhandler.cpp index a27942c..a86ac65 100644 --- a/commhandler.cpp +++ b/commhandler.cpp @@ -18,6 +18,10 @@ commHandler::commHandler() setupComm(); // basic parameters openPort(); + qDebug() << "Serial buffer size: " << port->readBufferSize(); + //port->setReadBufferSize(1024); // manually. 256 never saw any return from the radio. why... + //qDebug() << "Serial buffer size: " << port->readBufferSize(); + connect(port, SIGNAL(readyRead()), this, SLOT(receiveDataIn())); } @@ -60,10 +64,57 @@ void commHandler::receiveDataIn() // connected to comm port data signal // inPortData.append(port->readAll()); + // OLD: inPortData = port->readAll(); + + // new code: + port->startTransaction(); inPortData = port->readAll(); + if(inPortData.startsWith("\xFE\xFE")) + { + if(inPortData.endsWith("\xFD")) + { + // good! + port->commitTransaction(); + emit haveDataFromPort(inPortData); + // PRoblem: We often get several chunks together this way + // if we can split and individually send them that would be better. + // could emit several at each FE....FD segment. + // should probbly make the buffer smaller to reduce this + if(rolledBack) + { + qDebug() << "Rolled back and was successfull. Length: " << inPortData.length(); + //printHex(inPortData, false, true); + rolledBack = false; + } + } else { + // did not receive the entire thing so roll back: + qDebug() << "Rolling back transaction. End not detected. Lenth: " << inPortData.length(); + //printHex(inPortData, false, true); + port->rollbackTransaction(); + rolledBack = true; + } + } else { + port->commitTransaction(); + qDebug() << "Warning: received data with invalid start. Dropping data."; + qDebug() << "THIS SHOULD ONLY HAPPEN ONCE!!"; + // THIS SHOULD ONLY HAPPEN ONCE! + + //qDebug() << "Data start: 0x" << (char)inPortData[00] << (char)inPortData[01]; // danger + // unrecoverable. We did not receive the start and must + // have missed it earlier because we did not roll back to + // preserve the beginning. + //printHex(inPortData, false, true); + + } + + + + // Here is where we can be smart about this: + // port->startTransaction(); port->rollbackTransaction(); + // port->commitTransaction(); // qDebug() << "Data: " << inPortData; - emit haveDataFromPort(inPortData); + // OLD: emit haveDataFromPort(inPortData); } void commHandler::openPort() @@ -100,3 +151,37 @@ void commHandler::debugThis() emit haveDataFromPort(inPortData); } + + +void commHandler::printHex(const QByteArray &pdata, bool printVert, bool printHoriz) +{ + qDebug() << "---- Begin hex dump -----:"; + QString sdata("DATA: "); + QString index("INDEX: "); + QStringList strings; + + for(int i=0; i < pdata.length(); i++) + { + strings << QString("[%1]: %2").arg(i,8,10,QChar('0')).arg((unsigned char)pdata[i], 2, 16, QChar('0')); + sdata.append(QString("%1 ").arg((unsigned char)pdata[i], 2, 16, QChar('0')) ); + index.append(QString("%1 ").arg(i, 2, 10, QChar('0'))); + } + + if(printVert) + { + for(int i=0; i < strings.length(); i++) + { + //sdata = QString(strings.at(i)); + qDebug() << strings.at(i); + } + } + + if(printHoriz) + { + qDebug() << index; + qDebug() << sdata; + } + qDebug() << "----- End hex dump -----"; +} + + diff --git a/commhandler.h b/commhandler.h index 3125783..c319690 100644 --- a/commhandler.h +++ b/commhandler.h @@ -50,10 +50,13 @@ private: QSerialPort *port; qint32 baudrate; unsigned char stopbits; + bool rolledBack; bool isConnected; // port opened mutable QMutex mutex; + void printHex(const QByteArray &pdata, bool printVert, bool printHoriz); + }; #endif // COMMHANDLER_H diff --git a/main.cpp b/main.cpp index df26f3a..b20814f 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + //a.setStyle( "Fusion" ); + wfmain w; w.show(); diff --git a/qdarkstyle/rc/Hmovetoolbar.png b/qdarkstyle/rc/Hmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..cead99ed108a83715a939fc293dd7692008ac6b2 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3HFSYrjteQfx`y?k)_Q87dhn@7xXk0~Fyb z@Q5sCVBi)8VMc~ob0mO*>?NMQuI%?&Bn5OO*L%Ib02GqV42dXl&d<$F%_{+N85o?4 zQWHy3QxwWGOEMJPJ$(aG^itV@;trlJjv*0;-<~t%Vo=~=cKEuuHadP)@WGQuU7r}S zO7(3kn;EC7l=k(^o8K==q_@k14TBON%sx1ZaXWETh=#i?0*QIL`njxgN@xNAL{>as literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/Hsepartoolbar.png b/qdarkstyle/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..7f183c8b3ee5ffaa6157867cb88ebb7e67f9c0fa GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^>_BYK!3HFCsxJuxDYhhUcNd1u43!L(ckTxN0g7-I zctjR6FmMB9xrG@SX3dcR3bL1Y`ns~;XOR@p6Zv)R$U2~qrKgKyh{fsT1O>Ju$B!EW z@!}4{#Nd`-q4nn`YMg93@~{6$nhfv4z>`4eS;NZqID=!NmZu#9Lx(rZWlOyY_CP}z NJYD@<);T3K0RUVxGDiRa literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/Vmovetoolbar.png b/qdarkstyle/rc/Vmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..512edcecd69bd11ef3d58930ba8304473319e183 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^W%Wd+bj3AjN&xsQ+Rrz=y7dXn1bJS$(l?zvsn?)HIstmk1 U3t#Ex0qtY(boFyt=akR{0D|pGN&o-= literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/Vsepartoolbar.png b/qdarkstyle/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dc1561b473019a12091725e724a44d979dc238 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^_CU| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf9S(6$Q|-`GL0Lc{Yfl%)5R22v z2@<^xoY4VJd!B_UMqU2{D9-fNiI+30b a28PTOZq~oq5vPF0FnGH9xvXAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/branch_closed.png b/qdarkstyle/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d652159a365396a046329cfc7695c89ee54431ca GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/branch_open.png b/qdarkstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8e1ac619d242f3d5a31ffb11291c09ea40468 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac*foG2iHXppcfQi(?4K_2h&D z3_UzN#dZqZOE?US3>3JRaTpjFIL#0^D8eWr9I$mUBg3(s>=R~}U&3=E8!o-U3d z5v^~hTl*b$5NO-KaZ$^2My7CvC3jk<^u2WvDUf$c)s+rzv%V1E9{A4TMP-Z4lZ6F6 zJvyqaW~@Kfmu*$9pTBmh4fB87Nq1MQib$?;e-iXiZ<}* z4@CWD;9;1v<$&N$mS=`@#Ch2ZV#{}RJvQ4QaCNnQ-mU-(MmI+R8*yI$%dfxAYY;s7 z_m>{S8>aWE2aPM4zg_apbyj4!CUG}xvu2#YiDkvbx1hxrj-4fv9WXW}Qu2zs*=;EB~B@C9lD4Pt3jc#EK9uo4$63*ah<+ zss)BhMo2G`V&I;1@X1nvU9S{R&b}_{bpE^krGqN=vm#%w`~A&$lHbmbGYy8TuE%Y! g4!>ah-@}e^jYL&g^Ys^bz?fn1boFyt=akR{0GqMPK>z>% literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/checkbox_checked_disabled.png b/qdarkstyle/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/checkbox_checked_focus.png b/qdarkstyle/rc/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..671be273b06e2b721f494379ab61e527932ba69e GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pirl$i(^Q{;p7B~mkolg-~Zb$e)}u@ ze@5oRhYp5nY;MQ?&){3o{PczlV|l~dUDN*uim-MX2VD+|d1jngsyJ2mc)FUftqnvzx5JtA;>!fgJt|n_5jQ7B^fH6Ii)cTP@1u pu!mvshZ3I`*Gv}|E|RNaU|1Y$kt#XS(go-!22WQ%mvv4FO#o$0SI__e literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/checkbox_indeterminate.png b/qdarkstyle/rc/checkbox_indeterminate.png new file mode 100644 index 0000000000000000000000000000000000000000..41024f7688c0623c853ee9ceb8138949cb167738 GIT binary patch literal 493 zcmVq3^Yy%*$?9v7vi2H2P(8128Bb|(G4PNvN{@ZTf(3sn_sOi&WJR5%589C1Db zhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3LmgKot?w^!;`wQO?#_V**LxkEL?C;d$Q3 z34D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a2k<;^G*6NSFcsCSFK#waI05=$7(Tm( zXKA)Hc7gXz!E<>7_ErgOC56D&1`2f;E;YP`4SSj=K`lQnqN;26wzVN;k)FHnvrk3C?wm`aM7umdKI;Vst05m34zW@LL literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/checkbox_unchecked.png b/qdarkstyle/rc/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..2159aca9a10f75729912579b33a1226e575799aa GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/checkbox_unchecked_disabled.png b/qdarkstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000U^V1tLjO7h)cTN8vD8kxl9CSG-=9zI~sp3@KWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/down_arrow_disabled.png b/qdarkstyle/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WSF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/left_arrow_disabled.png b/qdarkstyle/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZIJL>K{la{0H2c zs~|?9C^x;rMaWb-8PX3|8pCWt!biMuy0?XQWQb<;X|43Tx`%u2d*Ay#=bm%m2uC>V zP+^=~UTj8M8r2nG5a!!_AedR2Z~X` z^C#k-|Ev48KfKp7anB!#d;YJu=VuP2fR+8R!0=+yodD>W_Zv61xCvYrMa;V91*W48 zlk+`pV9$aJo67F4y{x)QP|# zuvAI7%`!tkOxID(?!{Xg)et~F>Au&7WnfWmGWAJX(Q5Xad@h zW4pXoZt`faArQrMmE8|4geKr9vZClrczyyP>M$wW1;^C+m=Rbk24>RMfiB>Tz-(v& zg}`J5R?CJlfcYLbaD)NiLsho($9hS_#bPR2np!I<+q}LsH82yJKrt09X&4bjD(?9s z0J&awy%3nQz-?_<0DQpLhJ}c5s}PuT`K0>|VEpS=+R8ut=DfSL?<|gce#SPIk-hj& zt(8>gOaGp2U}Fbv$L{QRX+PHZKoq0E9FWc@-S;(`SC^H&KO$sSHiG-Rwc{`Y$)JXZ zz-et*7KJCUW)t9~eK8%t7hpJ_bZ7s|NY)%tmqqQ2WNlR=*;_}EZE9fVKruhU5e^-G Y1NpBZRoRadK>z>%07*qoM6N<$f;w}DFaQ7m literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/radio_unchecked.png b/qdarkstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/radio_unchecked_disabled.png b/qdarkstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000;(ZNqD1xa&r7l*n1_#$VNv$@8uKpD^(Yg!rs-u&mySz3x zZPmewoA|3(5ed=3lvIQo?lU4S?;e*cbV-``!^wBndk*Jwe%*6`Ofvc3g`y}Qe%Lrf zM~=<{C<7<~DB7nM*t{X(_-1F@|8?!;Zt4JTJ(y!=55OpZ_h7S5!fDy(A~R0{I738D zL8$7fp+~8t=)#MxT`%|Gok$E|orn3AV17^=sdPmu z9ZIFWq|WE0((KlQ>oIJr*0vn02W-QAB%)70FAq({4B!bfkMfUi~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`&XaJb+PUn~Z%}G`mo&kx!C)voplk7DK$Im&m^!<{% gmtDJ=WHPAy0n)7IgxW`FVE_OC07*qoM6N<$f`lX-a{vGU literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/right_arrow.png b/qdarkstyle/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/sizegrip.png b/qdarkstyle/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/stylesheet-branch-more.png b/qdarkstyle/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/stylesheet-vline.png b/qdarkstyle/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/undock.png b/qdarkstyle/rc/undock.png new file mode 100644 index 0000000000000000000000000000000000000000..88691d779507c9b809391396407f5cb4a6497c40 GIT binary patch literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM literal 0 HcmV?d00001 diff --git a/qdarkstyle/rc/up_arrow.png b/qdarkstyle/rc/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc7245212f19a5dbff1bb19647b1dd4bb05b6a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) + + rc/up_arrow_disabled.png + rc/Hmovetoolbar.png + rc/stylesheet-branch-end.png + rc/branch_closed-on.png + rc/stylesheet-vline.png + rc/branch_closed.png + rc/branch_open-on.png + rc/transparent.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/close.png + rc/close-hover.png + rc/close-pressed.png + rc/down_arrow.png + rc/Vmovetoolbar.png + rc/left_arrow.png + rc/stylesheet-branch-more.png + rc/up_arrow.png + rc/right_arrow.png + rc/left_arrow_disabled.png + rc/Hsepartoolbar.png + rc/branch_open.png + rc/Vsepartoolbar.png + rc/down_arrow_disabled.png + rc/undock.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_checked.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_checked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/radio_unchecked.png + + + style.qss + + diff --git a/qdarkstyle/style.qss b/qdarkstyle/style.qss new file mode 100644 index 0000000..399c38d --- /dev/null +++ b/qdarkstyle/style.qss @@ -0,0 +1,1235 @@ +QToolTip { + border: 1px solid #76797C; + background-color: #5A7566; + color: white; + padding: 0px; /*remove padding, for fix combobox tooltip.*/ + opacity: 200; +} + +QWidget { + color: #eff0f1; + background-color: #31363b; + selection-background-color: #3daee9; + selection-color: #eff0f1; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover { + background-color: #18465d; + color: #eff0f1; +} + +QWidget:item:selected { + background-color: #18465d; +} + +QCheckBox { + spacing: 5px; + outline: none; + color: #eff0f1; + margin-bottom: 2px; +} + +QCheckBox:disabled { + color: #76797C; +} + +QCheckBox::indicator, +QGroupBox::indicator { + width: 18px; + height: 18px; +} + +QGroupBox::indicator { + margin-left: 2px; +} + +QCheckBox::indicator:unchecked, +QGroupBox::indicator:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:focus, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked, +QGroupBox::indicator:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed { + border: none; + image: url(:/qss_icons/rc/checkbox_checked_focus.png); +} + +QCheckBox::indicator:indeterminate { + image: url(:/qss_icons/rc/checkbox_indeterminate.png); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed { + image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QRadioButton { + spacing: 5px; + outline: none; + color: #eff0f1; + margin-bottom: 2px; +} + +QRadioButton:disabled { + color: #76797C; +} + +QRadioButton::indicator { + width: 21px; + height: 21px; +} + +QRadioButton::indicator:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:focus, +QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_unchecked_focus.png); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked.png); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked_focus.png); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenuBar { + background-color: #31363b; + color: #eff0f1; +} + +QMenuBar::item { + background: transparent; +} + +QMenuBar::item:selected { + background: transparent; + border: 1px solid #76797C; +} + +QMenuBar::item:pressed { + border: 1px solid #76797C; + background-color: #3daee9; + color: #eff0f1; + margin-bottom: -1px; + padding-bottom: 1px; +} + +QMenu { + border: 1px solid #76797C; + color: #eff0f1; + margin: 2px; +} + +QMenu::icon { + margin: 5px; +} + +QMenu::item { + padding: 5px 30px 5px 30px; + border: 1px solid transparent; + /* reserve space for selection border */ +} + +QMenu::item:selected { + color: #eff0f1; +} + +QMenu::separator { + height: 2px; + background: lightblue; + margin-left: 10px; + margin-right: 5px; +} + +QMenu::indicator { + width: 18px; + height: 18px; +} + + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ + +QMenu::indicator:non-exclusive:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QMenu::indicator:non-exclusive:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ + +QMenu::indicator:exclusive:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenu::indicator:exclusive:checked { + image: url(:/qss_icons/rc/radio_checked.png); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QMenu::right-arrow { + margin: 5px; + image: url(:/qss_icons/rc/right_arrow.png) +} + +QWidget:disabled { + color: #454545; + background-color: #31363b; +} + +QAbstractItemView { + alternate-background-color: #31363b; + color: #eff0f1; + border: 1px solid #3A3939; + border-radius: 2px; +} + +QWidget:focus, +QMenuBar:focus { + border: 1px solid #3daee9; +} + +QTabWidget:focus, +QCheckBox:focus, +QRadioButton:focus, +QSlider:focus { + border: none; +} + +QLineEdit { + background-color: #232629; + padding: 5px; + border-style: solid; + border: 1px solid #76797C; + border-radius: 2px; + color: #eff0f1; +} + +QAbstractItemView QLineEdit { + padding: 0; +} + +QGroupBox { + border: 1px solid #76797C; + border-radius: 2px; + margin-top: 20px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top center; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; +} + +QAbstractScrollArea { + border-radius: 2px; + border: 1px solid #76797C; + background-color: transparent; +} + +QScrollBar:horizontal { + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal { + background-color: #605F5F; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(:/qss_icons/rc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(:/qss_icons/rc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: #2A2929; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: #605F5F; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(:/qss_icons/rc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(:/qss_icons/rc/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QTextEdit { + background-color: #232629; + color: #eff0f1; + border: 1px solid #76797C; +} + +QPlainTextEdit { + background-color: #232629; + ; + color: #eff0f1; + border-radius: 2px; + border: 1px solid #76797C; +} + +QHeaderView::section { + background-color: #76797C; + color: #eff0f1; + padding: 5px; + border: 1px solid #76797C; +} + +QSizeGrip { + image: url(:/qss_icons/rc/sizegrip.png); + width: 12px; + height: 12px; +} + +QMainWindow::separator { + background-color: #31363b; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #76797C; +} + +QMainWindow::separator:hover { + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #76797C; + spacing: 2px; +} + +QMenu::separator { + height: 1px; + background-color: #76797C; + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QFrame { + border-radius: 2px; + border: 1px solid #76797C; +} + +QFrame[frameShape="0"] { + border-radius: 2px; + border: 1px transparent #76797C; +} + +QStackedWidget { + border: 1px transparent black; +} + +QToolBar { + border: 1px transparent #393838; + background: 1px solid #31363b; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(:/qss_icons/rc/Hmovetoolbar.png); +} + +QToolBar::handle:vertical { + image: url(:/qss_icons/rc/Vmovetoolbar.png); +} + +QToolBar::separator:horizontal { + image: url(:/qss_icons/rc/Hsepartoolbar.png); +} + +QToolBar::separator:vertical { + image: url(:/qss_icons/rc/Vsepartoolbar.png); +} + +QToolButton#qt_toolbar_ext_button { + background: #58595a +} + +QPushButton { + color: #eff0f1; + background-color: #31363b; + border-width: 1px; + border-color: #76797C; + border-style: solid; + padding: 5px; + border-radius: 2px; + outline: none; +} + +QPushButton:disabled { + background-color: #31363b; + border-width: 1px; + border-color: #454545; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 2px; + color: #454545; +} + +QPushButton:focus { + background-color: #3daee9; + color: white; +} + +QPushButton:pressed { + background-color: #3daee9; + padding-top: -15px; + padding-bottom: -17px; +} + +QComboBox { + selection-background-color: #3daee9; + border-style: solid; + border: 1px solid #76797C; + border-radius: 2px; + padding: 5px; + min-width: 75px; +} + +QPushButton:checked { + background-color: #76797C; + border-color: #6A6969; +} + +QComboBox:hover, +QPushButton:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover, +QTreeView:hover { + border: 1px solid #3daee9; + color: #eff0f1; +} + +QComboBox:on { + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView { + background-color: #232629; + border-radius: 2px; + border: 1px solid #76797C; + selection-background-color: #18465d; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow { + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QAbstractSpinBox { + padding: 5px; + border: 1px solid #76797C; + background-color: #232629; + color: #eff0f1; + border-radius: 2px; + min-width: 75px; +} + +QAbstractSpinBox:up-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off { + image: url(:/qss_icons/rc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(:/qss_icons/rc/up_arrow.png); +} + +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off { + image: url(:/qss_icons/rc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QLabel { + border: 0px solid black; +} + +QTabWidget { + border: 0px transparent black; +} + +QTabWidget::pane { + border: 1px solid #76797C; + padding: 5px; + margin: 0px; +} + +QTabWidget::tab-bar { + /* left: 5px; move to the right by 5px */ +} + +QTabBar { + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar:focus { + border: 0px transparent black; +} + +QTabBar::close-button { + image: url(:/qss_icons/rc/close.png); + background: transparent; +} + +QTabBar::close-button:hover { + image: url(:/qss_icons/rc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:/qss_icons/rc/close-pressed.png); + background: transparent; +} + + +/* TOP TABS */ + +QTabBar::tab:top { + color: #eff0f1; + border: 1px solid #76797C; + border-bottom: 1px transparent black; + background-color: #31363b; + padding: 5px; + min-width: 50px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-bottom: 2px solid #3daee9; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:!selected:hover { + background-color: #3daee9; +} + + +/* BOTTOM TABS */ + +QTabBar::tab:bottom { + color: #eff0f1; + border: 1px solid #76797C; + border-top: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + min-width: 50px; +} + +QTabBar::tab:bottom:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-top: 2px solid #3daee9; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #3daee9; +} + + +/* LEFT TABS */ + +QTabBar::tab:left { + color: #eff0f1; + border: 1px solid #76797C; + border-left: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:left:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-left: 2px solid #3daee9; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:left:!selected:hover { + background-color: #3daee9; +} + + +/* RIGHT TABS */ + +QTabBar::tab:right { + color: #eff0f1; + border: 1px solid #76797C; + border-right: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:right:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-right: 2px solid #3daee9; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar::tab:right:!selected:hover { + background-color: #3daee9; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(:/qss_icons/rc/right_arrow.png); +} + +QTabBar QToolButton::left-arrow:enabled { + image: url(:/qss_icons/rc/left_arrow.png); +} + +QTabBar QToolButton::right-arrow:disabled { + image: url(:/qss_icons/rc/right_arrow_disabled.png); +} + +QTabBar QToolButton::left-arrow:disabled { + image: url(:/qss_icons/rc/left_arrow_disabled.png); +} + +QDockWidget { + background: #31363b; + border: 1px solid #403F3F; + titlebar-close-icon: url(:/qss_icons/rc/close.png); + titlebar-normal-icon: url(:/qss_icons/rc/undock.png); +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background: rgba(255, 255, 255, 10); +} + +QDockWidget::close-button:pressed, +QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QTreeView, +QListView { + border: 1px solid #76797C; + background-color: #232629; +} + +QTreeView:branch:selected, +QTreeView:branch:hover { + background: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_open-on.png); +} + +QListView::item:!selected:hover, +QTreeView::item:!selected:hover { + background: #18465d; + outline: 0; + color: #eff0f1 +} + +QListView::item:selected:hover, +QTreeView::item:selected:hover { + background: #287399; + color: #eff0f1; +} + +QTreeView::indicator:checked, +QListView::indicator:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate { + image: url(:/qss_icons/rc/checkbox_indeterminate.png); +} + +QTreeView::indicator:checked:hover, +QTreeView::indicator:checked:focus, +QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed { + image: url(:/qss_icons/rc/checkbox_checked_focus.png); +} + +QTreeView::indicator:unchecked:hover, +QTreeView::indicator:unchecked:focus, +QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed { + image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +} + +QTreeView::indicator:indeterminate:hover, +QTreeView::indicator:indeterminate:focus, +QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed { + image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +} + +QSlider::groove:horizontal { + border: 1px solid #565a5e; + height: 4px; + background: #565a5e; + margin: 0px; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: -8px 0; + border-radius: 9px; +} + +QSlider::groove:vertical { + border: 1px solid #565a5e; + width: 4px; + background: #565a5e; + margin: 0px; + border-radius: 3px; +} + +QSlider::handle:vertical { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: 0 -8px; + border-radius: 9px; +} + +QToolButton { + background-color: transparent; + border: 1px transparent #76797C; + border-radius: 2px; + margin: 3px; + padding: 5px; +} + +QToolButton[popupMode="1"] { + /* only for MenuButtonPopup */ + padding-right: 20px; + /* make way for the popup button */ + border: 1px #76797C; + border-radius: 5px; +} + +QToolButton[popupMode="2"] { + /* only for InstantPopup */ + padding-right: 10px; + /* make way for the popup button */ + border: 1px #76797C; +} + +QToolButton:hover, +QToolButton::menu-button:hover { + background-color: transparent; + border: 1px solid #3daee9; + padding: 5px; +} + +QToolButton:checked, +QToolButton:pressed, +QToolButton::menu-button:pressed { + background-color: #3daee9; + border: 1px solid #3daee9; + padding: 5px; +} + + +/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ + +QToolButton::menu-indicator { + image: url(:/qss_icons/rc/down_arrow.png); + top: -7px; + left: -2px; + /* shift it a bit */ +} + + +/* the subcontrols below are used only in the MenuButtonPopup mode */ + +QToolButton::menu-button { + border: 1px transparent #76797C; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; + outline: none; +} + +QToolButton::menu-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QToolButton::menu-arrow:open { + border: 1px solid #76797C; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView { + border: 1px solid #76797C; + gridline-color: #31363b; + background-color: #232629; +} + +QTableView, +QHeaderView { + border-radius: 0px; +} + +QTableView::item:pressed, +QListView::item:pressed, +QTreeView::item:pressed { + background: #18465d; + color: #eff0f1; +} + +QTableView::item:selected:active, +QTreeView::item:selected:active, +QListView::item:selected:active { + background: #287399; + color: #eff0f1; +} + +QHeaderView { + background-color: #31363b; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: #31363b; + color: #eff0f1; + padding: 5px; + border: 1px solid #76797C; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one { + border-top: 1px solid #76797C; +} + +QHeaderView::section::vertical { + border-top: transparent; +} + +QHeaderView::section::horizontal::first, +QHeaderView::section::horizontal::only-one { + border-left: 1px solid #76797C; +} + +QHeaderView::section::horizontal { + border-left: transparent; +} + +QHeaderView::section:checked { + color: white; + background-color: #334e5e; +} + + +/* style the sort indicator */ + +QHeaderView::down-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(:/qss_icons/rc/up_arrow.png); +} + +QTableCornerButton::section { + background-color: #31363b; + border: 1px transparent #76797C; + border-radius: 0px; +} + +QToolBox { + padding: 5px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #eff0f1; + background-color: #31363b; + border: 1px solid #76797C; + border-bottom: 1px transparent #31363b; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +QToolBox::tab:selected { + /* italicize selected tabs */ + font: italic; + background-color: #31363b; + border-color: #3daee9; +} + +QStatusBar::item { + border: 0px transparent dark; +} + +QFrame[height="3"], +QFrame[width="3"] { + background-color: #76797C; +} + +QSplitter::handle { + border: 1px dashed #76797C; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #76797C; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +QProgressBar { + border: 1px solid #76797C; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #05B8CC; +} + +QDateEdit { + selection-background-color: #3daee9; + border-style: solid; + border: 1px solid #3375A3; + border-radius: 2px; + padding: 1px; + min-width: 75px; +} + +QDateEdit:on { + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QDateEdit QAbstractItemView { + background-color: #232629; + border-radius: 2px; + border: 1px solid #3375A3; + selection-background-color: #3daee9; +} + +QDateEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QDateEdit::down-arrow { + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QDateEdit::down-arrow:on, +QDateEdit::down-arrow:hover, +QDateEdit::down-arrow:focus { + image: url(:/qss_icons/rc/down_arrow.png); +} diff --git a/rigcommander.cpp b/rigcommander.cpp index 910405b..5704acb 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -243,91 +243,126 @@ void rigCommander::handleNewData(const QByteArray &data) parseData(data); } -void rigCommander::parseData(QByteArray data) +void rigCommander::parseData(QByteArray dataInput) { + // TODO: Clean this up. + // It finally works very nicely, needs to be streamlined. + // - // Data echo'd back from the rig start with this: - // fe fe 94 e0 ...... fd + int index = 0; + volatile int count = 0; // debug purposes - // Data from the rig that is not an echo start with this: - // fe fe e0 94 ...... fd (for example, a reply to a query) - - // Data from the rig that was not asked for is sent to controller 0x00: - // fe fe 00 94 ...... fd (for example, user rotates the tune control or changes the mode) - - //qDebug() << "Data received: "; - //printHex(data, false, true); - if(data.length() < 4) + // use this: + QList dataList = dataInput.split('\xFD'); + QByteArray data; + // qDebug() << "data list has this many elements: " << dataList.size(); + if (dataList.last().isEmpty()) { - if(data.length()) - { - qDebug() << "Data length too short: " << data.length() << " bytes. Data:"; - printHex(data, false, true); - } - return; + dataList.removeLast(); // if the original ended in FD, then there is a blank entry at the end. } - - if(!data.startsWith("\xFE\xFE")) + // Only thing is, each frame is missing '\xFD' at the end. So append! Keeps the frames intact. + for(index = 0; index < dataList.count(); index++) { - qDebug() << "Warning: Invalid data received, did not start with FE FE."; - // find 94 e0 and shift over, - // or look inside for a second FE FE - // Often a local echo will miss a few bytes at the beginning. - if(data.startsWith('\xFE')) + data = dataList[index]; + data.append('\xFD'); // because we expect it to be there. + // foreach(listitem) + // listitem.append('\xFD'); + // continue parsing... + + count++; + // Data echo'd back from the rig start with this: + // fe fe 94 e0 ...... fd + + // Data from the rig that is not an echo start with this: + // fe fe e0 94 ...... fd (for example, a reply to a query) + + // Data from the rig that was not asked for is sent to controller 0x00: + // fe fe 00 94 ...... fd (for example, user rotates the tune control or changes the mode) + + //qDebug() << "Data received: "; + //printHex(data, false, true); + if(data.length() < 4) { - data.prepend('\xFE'); - qDebug() << "Warning: Working with prepended data stream."; - parseData(payloadIn); - return; - } else { - qDebug() << "Error: Could not reconstruct corrupted data: "; - printHex(data, false, true); - // data.right(data.length() - data.find('\xFE\xFE')); - // if found do not return and keep going. - return; + if(data.length()) + { + // Finally this almost never happens + qDebug() << "Data length too short: " << data.length() << " bytes. Data:"; + printHex(data, false, true); + } + // no + //return; + // maybe: + // continue; + } + + if(!data.startsWith("\xFE\xFE")) + { + qDebug() << "Warning: Invalid data received, did not start with FE FE."; + // find 94 e0 and shift over, + // or look inside for a second FE FE + // Often a local echo will miss a few bytes at the beginning. + if(data.startsWith('\xFE')) + { + data.prepend('\xFE'); + qDebug() << "Warning: Working with prepended data stream."; + parseData(payloadIn); + return; + } else { + qDebug() << "Error: Could not reconstruct corrupted data: "; + printHex(data, false, true); + // data.right(data.length() - data.find('\xFE\xFE')); + // if found do not return and keep going. + return; + } + } + + if((unsigned char)data[02] == civAddr) + { + // data is or begins with an echoback from what we sent + // find the first 'fd' and cut it. Then continue. + //payloadIn = data.right(data.length() - data.indexOf('\xfd')-1); + // qDebug() << "[FOUND] Trimmed off echo:"; + //printHex(payloadIn, false, true); + //parseData(payloadIn); + //return; + } + + switch(data[02]) + { + // case civAddr: // can't have a variable here :-( + // // data is or begins with an echoback from what we sent + // // find the first 'fd' and cut it. Then continue. + // payloadIn = data.right(data.length() - data.indexOf('\xfd')-1); + // //qDebug() << "Trimmed off echo:"; + // //printHex(payloadIn, false, true); + // parseData(payloadIn); + // break; + case '\xE0': + // data is a reply to some query we sent + // extract the payload out and parse. + // payload = getpayload(data); // or something + // parse (payload); // recursive ok? + payloadIn = data.right(data.length() - 4); + parseCommand(); + break; + case '\x00': + // data send initiated by the rig due to user control + // extract the payload out and parse. + payloadIn = data.right(data.length() - 4); + parseCommand(); + break; + default: + // could be for other equipment on the CIV network. + // just drop for now. + break; } } - - if((unsigned char)data[02] == civAddr) + /* + if(dataList.length() > 1) { - // data is or begins with an echoback from what we sent - // find the first 'fd' and cut it. Then continue. - payloadIn = data.right(data.length() - data.indexOf('\xfd')-1); - //qDebug() << "Trimmed off echo:"; - //printHex(payloadIn, false, true); - parseData(payloadIn); - return; - } - - switch(data[02]) - { -// case civAddr: // can't have a variable here :-( -// // data is or begins with an echoback from what we sent -// // find the first 'fd' and cut it. Then continue. -// payloadIn = data.right(data.length() - data.indexOf('\xfd')-1); -// //qDebug() << "Trimmed off echo:"; -// //printHex(payloadIn, false, true); -// parseData(payloadIn); -// break; - case '\xE0': - // data is a reply to some query we sent - // extract the payload out and parse. - // payload = getpayload(data); // or something - // parse (payload); // recursive ok? - payloadIn = data.right(data.length() - 4); - parseCommand(); - break; - case '\x00': - // data send initiated by the rig due to user control - // extract the payload out and parse. - payloadIn = data.right(data.length() - 4); - parseCommand(); - break; - default: - // could be for other equipment on the CIV network. - // just drop for now. - break; + qDebug() << "Recovered " << count << " frames from single data with size" << dataList.count(); } + */ } void rigCommander::parseCommand() @@ -373,6 +408,8 @@ void rigCommander::parseCommand() printHex(payloadIn, false, true); break; } + // is any payload left? + } void rigCommander::parseSpectrum() diff --git a/wfmain.cpp b/wfmain.cpp index f00bd5c..01ebb31 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -126,9 +126,78 @@ wfmain::~wfmain() delete ui; } -void wfmain::setDarkTheme(bool dark) +void wfmain::on_useDarkThemeChk_clicked(bool checked) { - //theParent->setStyle(); + setAppTheme(checked); + setPlotTheme(wf, checked); + setPlotTheme(plot, checked); + +} + +void wfmain::setAppTheme(bool isDark) +{ + if(isDark) + { + QFile f(":qdarkstyle/style.qss"); + if (!f.exists()) + { + printf("Unable to set stylesheet, file not found\n"); + } + else + { + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + qApp->setStyleSheet(ts.readAll()); + } + } else { + qApp->setStyleSheet(""); + } + +} + +void wfmain::setPlotTheme(QCustomPlot *plot, bool isDark) +{ + if(isDark) + { + plot->setBackground(QColor(0,0,0,255)); + plot->xAxis->grid()->setPen(QColor(75,75,75,255)); + plot->yAxis->grid()->setPen(QColor(75,75,75,255)); + + plot->legend->setTextColor(QColor(255,255,255,255)); + plot->legend->setBorderPen(QColor(255,255,255,255)); + plot->legend->setBrush(QColor(0,0,0,200)); + + plot->xAxis->setTickLabelColor(Qt::white); + plot->xAxis->setLabelColor(Qt::white); + plot->yAxis->setTickLabelColor(Qt::white); + plot->yAxis->setLabelColor(Qt::white); + plot->xAxis->setBasePen(QPen(Qt::white)); + plot->xAxis->setTickPen(QPen(Qt::white)); + plot->yAxis->setBasePen(QPen(Qt::white)); + plot->yAxis->setTickPen(QPen(Qt::white)); + plot->graph(0)->setPen(QPen(Qt::lightGray)); // magenta, yellow, green, lightGray + } else { + plot->setBackground(QColor(255,255,255,255)); + + plot->xAxis->grid()->setPen(QColor(200,200,200,255)); + plot->yAxis->grid()->setPen(QColor(200,200,200,255)); + + plot->legend->setTextColor(QColor(0,0,0,255)); + plot->legend->setBorderPen(QColor(0,0,0,255)); + plot->legend->setBrush(QColor(255,255,255,200)); + + plot->xAxis->setTickLabelColor(Qt::black); + plot->xAxis->setLabelColor(Qt::black); + plot->yAxis->setTickLabelColor(Qt::black); + plot->yAxis->setLabelColor(Qt::black); + plot->xAxis->setBasePen(QPen(Qt::black)); + plot->xAxis->setTickPen(QPen(Qt::black)); + plot->yAxis->setBasePen(QPen(Qt::black)); + plot->yAxis->setTickPen(QPen(Qt::black)); + plot->graph(0)->setPen(QPen(Qt::blue)); + + } + } void wfmain::runDelayedCommand() @@ -170,7 +239,7 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e //qDebug() << "Spectrum data received at UI! Length: " << specLen; if(specLen != 475) { - //qDebug () << "Unusual spectrum: length: " << specLen; + qDebug () << "Unusual spectrum: length: " << specLen; if(specLen > 475) { specLen = 475; @@ -508,3 +577,5 @@ void wfmain::on_modeSelectCombo_currentIndexChanged(int index) } } } + + diff --git a/wfmain.h b/wfmain.h index 2216ea3..f2055d1 100644 --- a/wfmain.h +++ b/wfmain.h @@ -94,13 +94,16 @@ private slots: void on_modeSelectCombo_currentIndexChanged(int index); + void on_useDarkThemeChk_clicked(bool checked); + private: Ui::wfmain *ui; QCustomPlot *plot; // line plot QCustomPlot *wf; // waterfall image QCPItemTracer * tracer; // marker of current frequency //commHandler *comm; - void setDarkTheme(bool dark); + void setAppTheme(bool isDark); + void setPlotTheme(QCustomPlot *plot, bool isDark); QWidget * theParent; rigCommander * rig; diff --git a/wfmain.ui b/wfmain.ui index 84a79af..5de3a85 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -18,7 +18,7 @@ - 0 + 3 @@ -910,7 +910,7 @@ - + Use Dark Theme diff --git a/wfview.pro b/wfview.pro index 8251ccf..62fbdb6 100644 --- a/wfview.pro +++ b/wfview.pro @@ -20,6 +20,9 @@ QMAKE_CXXFLAGS += -march=native DEFINES += QT_DEPRECATED_WARNINGS DEFINES += QCUSTOMPLOT_COMPILE_LIBRARY +RESOURCES += qdarkstyle/style.qrc + + #CONFIG(debug, release|debug) { # win32:QCPLIB = qcustomplotd1 # else: QCPLIB = qcustomplotd