From bdb85a3f54c828de7419709717d549b077556757 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 1 Jul 2015 20:04:12 +0000 Subject: [PATCH] fixed up FileTransferInfoWidget for high DPI git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@8575 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- .../FileTransfer/FileTransferInfoWidget.cpp | 79 ++++++++++-------- retroshare-gui/src/gui/icons.qrc | 4 + .../src/gui/icons/tile_checking_48.png | Bin 0 -> 2419 bytes .../src/gui/icons/tile_downloaded_48.png | Bin 0 -> 1997 bytes .../src/gui/icons/tile_downloading_48.png | Bin 0 -> 2364 bytes .../src/gui/icons/tile_inactive_48.png | Bin 0 -> 1029 bytes 6 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 retroshare-gui/src/gui/icons/tile_checking_48.png create mode 100644 retroshare-gui/src/gui/icons/tile_downloaded_48.png create mode 100644 retroshare-gui/src/gui/icons/tile_downloading_48.png create mode 100644 retroshare-gui/src/gui/icons/tile_inactive_48.png diff --git a/retroshare-gui/src/gui/FileTransfer/FileTransferInfoWidget.cpp b/retroshare-gui/src/gui/FileTransfer/FileTransferInfoWidget.cpp index 25c5d95f4..a2889d2a0 100644 --- a/retroshare-gui/src/gui/FileTransfer/FileTransferInfoWidget.cpp +++ b/retroshare-gui/src/gui/FileTransfer/FileTransferInfoWidget.cpp @@ -30,15 +30,15 @@ #include "FileTransferInfoWidget.h" #include -// Variables to decide of display behaviour. Should be adapted to window size. +// Variables to decide of display behaviour. All variables are expressed as a factor of font height // -static const int chunk_square_size = 13 ; -static const int text_height = 10 ; // should be set according to the font size -static const int block_sep = 4 ; // separator between blocks -static const int ch_num_size = 50 ; // size of field for chunk number -static const int availability_map_size_X = 400 ;// length of availability bar -static const int availability_map_size_Y = 20 ; // height of availability bar -static const int tab_size = 200 ;// size between tabulated entries +static const float chunk_square_size_factor = 1.0 ; +static const float text_height_factor = 0.9 ;// should be set according to the font size +static const float block_sep_factor = 0.4 ;// separator between blocks +static const float ch_num_size_factor = 5.0 ;// size of field for chunk number +static const float availability_map_size_X_factor = 40.0;// length of availability bar +static const float availability_map_size_Y_factor = 2.0 ;// height of availability bar +static const float tab_size_factor = 20.0;// size between tabulated entries FileTransferInfoWidget::FileTransferInfoWidget(QWidget * /*parent*/, Qt::WindowFlags /*f*/ ) { @@ -48,10 +48,12 @@ FileTransferInfoWidget::FileTransferInfoWidget(QWidget * /*parent*/, Qt::WindowF pixmap = QPixmap(size()); pixmap.fill(Qt::transparent); - downloadedPixmap.load(":images/graph-downloaded.png"); - downloadingPixmap.load(":images/graph-downloading.png"); - notDownloadPixmap.load(":images/graph-notdownload.png"); - checkingPixmap.load(":images/graph-checking.png"); + int S = 0.9*QFontMetricsF(font()).height(); + + downloadedPixmap = QPixmap(":/icons/tile_downloaded_48.png").scaledToHeight(S,Qt::SmoothTransformation); + downloadingPixmap = QPixmap(":/icons/tile_downloading_48.png").scaledToHeight(S,Qt::SmoothTransformation); + notDownloadPixmap = QPixmap(":/icons/tile_inactive_48.png").scaledToHeight(S,Qt::SmoothTransformation); + checkingPixmap = QPixmap(":/icons/tile_checking_48.png").scaledToHeight(S,Qt::SmoothTransformation); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } @@ -77,8 +79,6 @@ void FileTransferInfoWidget::updateDisplay() //std::cout << "got details for file " << nfo.fname << std::endl ; -// pixmap = QPixmap(size()); -// pixmap.fill(this, 0, 0); pixmap = QPixmap(maxWidth, maxHeight); pixmap.fill(Qt::transparent); setFixedHeight(maxHeight); @@ -86,13 +86,16 @@ void FileTransferInfoWidget::updateDisplay() QPainter painter(&pixmap); painter.initFrom(this); + float S = QFontMetricsF(font()).height(); + int chunk_square_size = S*chunk_square_size_factor; + if(ok) { int blocks = info.chunks.size() ; int columns = maxWidth/chunk_square_size; y = blocks/columns*chunk_square_size; x = blocks%columns*chunk_square_size; - maxHeight = y+150+info.active_chunks.size()*(block_sep+text_height); // warning: this should be computed from the different size parameter and the number of objects drawn, otherwise the last objects to be displayed will be truncated. + maxHeight = y+15*S+info.active_chunks.size()*(block_sep_factor*S+text_height_factor*S); // warning: this should be computed from the different size parameter and the number of objects drawn, otherwise the last objects to be displayed will be truncated. draw(nfo,info,&painter) ; } @@ -110,14 +113,24 @@ void FileTransferInfoWidget::paintEvent(QPaintEvent */*event*/) void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info,QPainter *painter) { + float S = QFontMetricsF(font()).height() ; + x=0; - y=5; + y=0.5*S; int blocks = info.chunks.size() ; uint64_t fileSize = info.file_size ; uint32_t blockSize = info.chunk_size ; if (fileSize%blockSize == 0) blocks--; - QRectF source(0.0, 0.0, 12.0, 12.0); + QRectF source(0.0, 0.0, 1.05*S, 1.05*S); + + int chunk_square_size = chunk_square_size_factor*S ; + int availability_map_size_X = availability_map_size_X_factor*S ; + int availability_map_size_Y = availability_map_size_Y_factor*S ; + int text_height = text_height_factor*S ; + int block_sep = block_sep_factor*S ; + int ch_num_size = ch_num_size_factor*S ; + int tab_size = tab_size_factor*S ; painter->setPen(QColor::fromRgb(0,0,0)) ; y += text_height ; @@ -133,7 +146,7 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info x = 0; y += chunk_square_size; } - QRectF target(x, y, 12.0, 12.0); + QRectF target(x, y, 1.05*S, 1.05*S); switch(info.chunks[i]) { @@ -159,8 +172,8 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info painter->setPen(QColor::fromRgb(70,70,70)) ; painter->drawLine(0,y,maxWidth,y) ; - uint32_t sizeX = 100 ; - uint32_t sizeY = 10 ; + uint32_t sizeX = 10*S ; + uint32_t sizeY = 1*S ; y += block_sep ; y += text_height ; painter->setPen(QColor::fromRgb(0,0,0)) ; @@ -170,7 +183,7 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info for(uint i=0;isetPen(QColor::fromRgb(0,0,0)) ; - painter->drawText(5,y+text_height,QString::number(info.active_chunks[i].first)) ; + painter->drawText(0.5*S,y+text_height*0.9,QString::number(info.active_chunks[i].first)) ; int size_of_this_chunk = ( info.active_chunks[i].first == info.chunks.size()-1 && ((info.file_size % blockSize)>0) )?(info.file_size % blockSize):blockSize ; uint32_t s = (uint32_t)rint(sizeX*(size_of_this_chunk - info.active_chunks[i].second)/(float)size_of_this_chunk) ; @@ -202,7 +215,7 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info painter->setPen(QColor::fromRgb(0,0,0)) ; float percent = (size_of_this_chunk - info.active_chunks[i].second)*100.0/size_of_this_chunk ; - painter->drawText(sizeX+55,y+text_height,QString::number(percent,'f',2) + " %") ; + painter->drawText(sizeX+5.5*S,y+text_height*0.9,QString::number(percent,'f',2) + " %") ; y += sizeY+block_sep ; } @@ -244,25 +257,25 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info painter->setPen(QColor::fromRgb(0,0,0)) ; y += text_height ; painter->drawText(0,y,tr("File info") + ":") ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("File name") + ":") ; painter->drawText(tab_size,y,QString::fromUtf8(nfo.fname.c_str())) ; + y += text_height ; painter->drawText(2*S,y,tr("File name") + ":") ; painter->drawText(tab_size,y,QString::fromUtf8(nfo.fname.c_str())) ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Destination folder") + ":") ; painter->drawText(tab_size,y,QString::fromUtf8(nfo.path.c_str())) ; + y += text_height ; painter->drawText(2*S,y,tr("Destination folder") + ":") ; painter->drawText(tab_size,y,QString::fromUtf8(nfo.path.c_str())) ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("File hash") + ":") ; painter->drawText(tab_size,y,QString::fromStdString(nfo.hash.toStdString())) ; + y += text_height ; painter->drawText(2*S,y,tr("File hash") + ":") ; painter->drawText(tab_size,y,QString::fromStdString(nfo.hash.toStdString())) ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("File size") + ":") ; painter->drawText(tab_size,y,QString::number(info.file_size) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.file_size) + ")") ; + y += text_height ; painter->drawText(2*S,y,tr("File size") + ":") ; painter->drawText(tab_size,y,QString::number(info.file_size) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.file_size) + ")") ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Chunk size") + ":") ; painter->drawText(tab_size,y,QString::number(info.chunk_size) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.chunk_size) + ")") ; + y += text_height ; painter->drawText(2*S,y,tr("Chunk size") + ":") ; painter->drawText(tab_size,y,QString::number(info.chunk_size) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.chunk_size) + ")") ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Number of chunks") + ":") ; painter->drawText(tab_size,y,QString::number(info.chunks.size())) ; + y += text_height ; painter->drawText(2*S,y,tr("Number of chunks") + ":") ; painter->drawText(tab_size,y,QString::number(info.chunks.size())) ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Transferred") + ":") ; painter->drawText(tab_size,y,QString::number(nfo.transfered) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(nfo.transfered) + ")") ; + y += text_height ; painter->drawText(2*S,y,tr("Transferred") + ":") ; painter->drawText(tab_size,y,QString::number(nfo.transfered) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(nfo.transfered) + ")") ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Remaining") + ":") ; painter->drawText(tab_size,y,QString::number(info.file_size - nfo.transfered) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.file_size - nfo.transfered) + ")") ; + y += text_height ; painter->drawText(2*S,y,tr("Remaining") + ":") ; painter->drawText(tab_size,y,QString::number(info.file_size - nfo.transfered) + " " + tr("bytes") + " " + "(" + misc::friendlyUnit(info.file_size - nfo.transfered) + ")") ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Number of sources") + ":") ; painter->drawText(tab_size,y,QString::number(info.compressed_peer_availability_maps.size())) ; + y += text_height ; painter->drawText(2*S,y,tr("Number of sources") + ":") ; painter->drawText(tab_size,y,QString::number(info.compressed_peer_availability_maps.size())) ; y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Chunk strategy") + ":") ; + y += text_height ; painter->drawText(2*S,y,tr("Chunk strategy") + ":") ; switch(info.strategy) { case FileChunksInfo::CHUNK_STRATEGY_RANDOM: painter->drawText(tab_size,y,"Random") ; break ; @@ -271,7 +284,7 @@ void FileTransferInfoWidget::draw(const FileInfo& nfo,const FileChunksInfo& info case FileChunksInfo::CHUNK_STRATEGY_STREAMING: painter->drawText(tab_size,y,"Streaming") ; break ; } y += block_sep ; - y += text_height ; painter->drawText(20,y,tr("Transfer type") + ":") ; + y += text_height ; painter->drawText(2*S,y,tr("Transfer type") + ":") ; if(nfo.transfer_info_flags & RS_FILE_REQ_ANONYMOUS_ROUTING) painter->drawText(tab_size,y,tr("Anonymous F2F")) ; if(nfo.transfer_info_flags & RS_FILE_REQ_ASSUME_AVAILABILITY) painter->drawText(tab_size,y,tr("Direct friend transfer / Availability assumed")) ; y += text_height ; diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index af2f41c96..834e4a10d 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -43,5 +43,9 @@ icons/security_low_128.png icons/security_medium_128.png icons/system_128.png + icons/tile_checking_48.png + icons/tile_downloaded_48.png + icons/tile_downloading_48.png + icons/tile_inactive_48.png diff --git a/retroshare-gui/src/gui/icons/tile_checking_48.png b/retroshare-gui/src/gui/icons/tile_checking_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7765f3b899368843264132d3e8c43955e6fcd4 GIT binary patch literal 2419 zcmV-(35@oMP)?k% zK~!ko)tXC^BxwzVKm8Fk7+i@xOIDnKgRtiSa1b~Q=U~C~ROByr7E(MiE4sT31Dheu z$};j1k$SjXE=9%P|MFYM8UPRjJBT>{On(N%<@k6nKE8MNuzemAfC!9jBoQQbVkN1> z`9PW|HULVh+d%`fEuERTLh=!|V=uw&Baq zZ@Anx$z&#yz+xt>mA+_00}Em-umrY04UzxV!wzT%q}dK6b5agq;r?Po@Y~=2`8@H+ z-Kh8E|G)r$_p==u^&5#XFcHE|Vo97yg!$WF|G>;LUWPR@0T=`1IDasr42}VI7v6m~ zZXJsc2RBaDXHp&2`++4KzyLxBK^V#W_^&dawa#1dtczqbidDusJAK9xrxSX{=GTl2 zz7cuG)qBeBps+$ALf|mDY#1>lVw#^i@_Mh+S3A#Z&5puuY*a>+MW>FyidSpCR(hYK zRPO<3N7@-jV9Xb7$jNWAh-I4<`TcQZpl}2xv36t4vi*Z4wqgPMFzgB2<2ywt-80xXcL%Nq9bBdtg6sB$_%R=jqd+1kd<7r1X-pMy*G{ zd>o%u;C$3u&Ojbm^^El~1AeVSZ`grD$dm9p($?K?9v9l{p&WTO`r!Az_S0{SOSEm+ zHavg=Q5HM&8Johw*#wuoGq*9(%;QCXOG| zp=AO?o`q-(IZ1WD3DCQc2J$5RhP{w;DW^AotbvHv8knGtcs>~OpD6paTdVB&-}^%7 zfRYU1{LsfviE=5}{ZA%awB=aHTu=@YV=Z{kfIpJ~%_E(qQN9!lbX^<{c;{_jin{rI z>Q;vD(Yv0rOJ#YG3ZyLTj}^_tEGViDBI08WeEgY-6exwJ32i7{e}ighcEM-woTewL zOE;bO65<$2I`Rkmcz~m#t$|Xcss=gQUxq?AUAAObBbEw*`qZ7_Z)Cm0a}0qX*;E@8uyuuP&3SA zTwo!cL&~lmuCK8U*4aNVi7-$P0m)hcTcbO(aIE-76t2(WEKu%ZZXg9C->W9n%_|>_ zsJS%4$9#Il_D+&l%JYSZ_UCMoml{Z;_X_Jl4%%FuIjZxWaQtQwt5T|+i6%}FHj5Hj zWUoOodo_Yll<3=`q`lx);GyGKj|&^Aope+NH0oOJYr1RE#w@pjaeZA|;OfNn2lj(y zOtvr8xb}#rTG%xmRt8EvUb7knDJ35HRq90=u}o9`7m>bm{QX5r3+K&Wg5ZCTf__4zDWs&cMqk34YTYKRTf7i0sO5 zk`WCZH)M1;!Nma%+T&oOyJogSYJW}*g08tG3dZWm$09OoRL(mGtV1obwn}WFWnrpA_!G?!rpE z7&adTyGQ?=5zGh`^e&o5oKEDi&3Mj0QKP#TG<32uY1KYxA9e1<-1O6SB*>BsL`eeA zOBZe@x}oiiq#nv%dH#91;uqM&A<1_qDj1h7#Y#7_p6TX|oF1!g6k|nGZah996H>b- zIx}%KTKd?5Z#PCd8(ocy?jkms#tF3!X{UOzcDICDUp*>X+=CW)OEdy6Mw7$v%;(PQ zo8tYN6T9K{)vm9-Tkji?0p5D!(cigcq1Ua%&ToNh53>k=;aF*04WD_e)(&mIpL<6_ zJBAOa>_vTXMm9t-9?|r@w%7N4;AJlqNs&yzsA$hwyVHHqGovan+$`-cR=lhP3sT)VN}{bX1y>5OHrAYUFfYO zL}EO;@r>f@Yxvdu!n z6{Sz$`qOtFpDr};1DL;tAt2FMdTj|YzTOFSOF{0PY{{`b;?;(txiWegCXp~ot zb=|JSpZ<7mEB1S@Ghuu5Yn|_3)A!``fBEscgdX3xg*A5QT#fuDbNn3tYM^g9@ETeF l@*MbPwyse4e=>Z3{2TrCTd6NU-Nyg`002ovPDHLkV1hPCg#7>j literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/icons/tile_downloaded_48.png b/retroshare-gui/src/gui/icons/tile_downloaded_48.png new file mode 100644 index 0000000000000000000000000000000000000000..39e3b5396afcd267a902796834cf4d31660668f3 GIT binary patch literal 1997 zcmV;;2Qv7HP)pm9Gk_Vk)0N?l5c!GBs(w8W-onyj zWmVnPpY#Y1k57*M{?ES^U;qF!gTXH6{xF-@Fyq1Ds3csDiii(E`2H_{02%z3goo2(dCdbspZ0<@!&Gmq^tD#Kd#+5G zIM@#a&CmJ~{BPhNlrI*i*p{sDN{elSwevTK?>7K?2ui?nfN%hgdV0GbZ+CJVreg`0(fE-@Ad}ex}ebD8>b;aWUroZAt=ipq^DM(*7s4X{j ziGcoHng9JuO+XRwkl|N)py&WpAQh;tzxJTGyii$(1x#gXt{B%!nM0odfa&f906LF3 z&h27+L_|wg1*Rin)bSobBnw9sK?)+_O&y?Qv7sbWsdUNIN-y@sV|cNvOIM^0!UPx% zhYUuCAq)$?1#pI(k*KU-OX*b(k<(&Ya`+2Mg&0`!1ea(vR6UzF8_;n!7!8F%P)oR8CH_kwo{(%-F?qo(I9L(@gDwCzr$-Eg z2Snn7|3vkkz9SZ-6~JV5rc_T-zR+tLI__4TLH4ou0x*=Xu%PfjQM_(9rP|d4Er>~> zQh4$MCpiEO5a?$@V&k*`l-1g(3%Gb^8L{N5L*e4)0|yO-2M!h#9RWmkE8`arIBNt~ zTlDF~$rJRTP_IE&09Sd{usYN0?b%S85Q|VbH4iwPVf}*#jt0Q+$^*E@K(Em&EB?X1 zLq5ybuvYU#T71^>{X2V*PWfC9G|7x0?bIpFSdP*p)NVbX-2)z990dqI_yG{H_(3C% z!Yc#ltnZ7x6mYr&fR<`4JV0xdIdITH9Vk5)+yU6Ld{qrDHj6*`jBAg2T$;7`YJG0` z;o46uUTTXU+~-uD0N@}WI3yG?f*9A*{sO@1qXvf(0BR()0pNy0vl;4vYm1O-Btsw8e9AKkt(Sd@H)As=6!vi32>N)t|X*A=2m&K1ep~hD@Ouv`ZXl%IOT=x%iQN+xM$=HATPyg_rbM3TXr2jsGtw#3Z5D#V1O2 z-uJZ3S@)PCfh`Ip;7}yLw-gc-0FrA@o+*gA1o5jF$X?YN3?py{2+qpWR8W}ngC!Ao zL7^|I5D~QsLp?Zx*hez!v2e}C%2o6VMsrjW@(CCVOvJ&N+ze&5wZP|8h?zo~#obV# zg+d8HPG(ydwmePL$O>c(t?#9@i!gb_<(P_;&j8>O#I72}BB$z*JB2tptf@Y)0n8X^ z!-PSf-pV=*C4K`$0b^cu(_TN68;&-W$Zj5`h4vUorG%L39i>F9mkm2E0NS+-R6$9e zC1O%STuYS4h_N>OSvs`Vr$}nO|LaNlWhx=;F~F9{ zurxN(JR?<>`^vuv06hjUW}QnlYk7Vo*v)kL0>HJ#07<|FIZ{cXQAuhq4PJ~3wGX*8 z2gs&t?W8^&YNNWjZ?OUJZPc}l8m$2!0z}PJYVPKioW3wtzXB7~3N*V>o8f_`kg}U% zE)RE?Qi6br^8Y< zItJd2;Ts5paD=YouxMb4wKg(QM;8FT0q{0Htb!`n;7WQw0OiKyOC`kZ!^VdSEC86{ z&@WNipN(GFA{O2Ps6M91^EQm|ds{ zHji~rq(1eDIyCJeY&)8}6hDT=yL9fERX6UpH?-E*?`GzbzQ7=qwrjIhwOoJSzWZY` zt|PW^DxecX`$PX{lXIzMzV*Xy&Ue=U9zzDx0vG!I9RA%vuf1E87yMIN^(WX*9v#`* fVBr7b(boAdD7Z4&*pSYp00000NkvXXu0mjf#u=aW literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/icons/tile_downloading_48.png b/retroshare-gui/src/gui/icons/tile_downloading_48.png new file mode 100644 index 0000000000000000000000000000000000000000..addf81bbbd51d52110654b33a78740ca085e1ee5 GIT binary patch literal 2364 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 literal 0 HcmV?d00001