From 553568ddc8de533194fcfde5e2df9fc5b1473e52 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 4 May 2024 11:26:31 +0200 Subject: [PATCH 1/4] Renamed a variable --- src/contentmanagerdelegate.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/contentmanagerdelegate.cpp b/src/contentmanagerdelegate.cpp index 40acde8..b590f42 100644 --- a/src/contentmanagerdelegate.cpp +++ b/src/contentmanagerdelegate.cpp @@ -117,6 +117,8 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow int arcW = w - 90; int arcH = h - 40; + QRect pauseResumeButtonRect(arcX, arcY, arcW, arcH); + double progress = (double) (downloadInfo.progress) / 100; progress = -progress; auto completedLength = downloadInfo.completedLength; @@ -135,15 +137,13 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow painter->setPen(pen); painter->setRenderHint(QPainter::Antialiasing); - QRect rectangle(arcX, arcY, arcW, arcH); - pen.setColor("#eaecf0"); - createArc(painter, 0, 360, rectangle, pen); + createArc(painter, 0, 360, pauseResumeButtonRect, pen); int startAngle = 0; int spanAngle = progress * 360; pen.setColor("#3366cc"); - createArc(painter, startAngle, spanAngle, rectangle, pen); + createArc(painter, startAngle, spanAngle, pauseResumeButtonRect, pen); } void ContentManagerDelegate::paintButton(QPainter *p, const QRect &r, QString t) const From ec89f87d5507c78a3735c613a57699b7d085c2a4 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 4 May 2024 11:37:56 +0200 Subject: [PATCH 2/4] Cleaner download control button drawing primitives --- src/contentmanagerdelegate.cpp | 47 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/contentmanagerdelegate.cpp b/src/contentmanagerdelegate.cpp index b590f42..39dba1e 100644 --- a/src/contentmanagerdelegate.cpp +++ b/src/contentmanagerdelegate.cpp @@ -24,13 +24,16 @@ ContentManagerDelegate::ContentManagerDelegate(QObject *parent) placeholderIconFile.save(&buffer, "png"); } -void createPauseSymbol(QPainter *painter, int x, int y) +namespace +{ + +void createPauseSymbol(QPainter *painter, const QRect& buttonRect) { QPen pen; pen.setWidth(3); QPainterPath path; - x += 12.5; - y += 10; + const int x = buttonRect.left() + 12.5; + const int y = buttonRect.top() + 10; pen.setColor("#3366cc"); path.moveTo(x, y); path.lineTo(x, y + 10); @@ -40,13 +43,13 @@ void createPauseSymbol(QPainter *painter, int x, int y) painter->strokePath(path, pen); } -void createResumeSymbol(QPainter *painter, int x, int y) +void createResumeSymbol(QPainter *painter, const QRect& buttonRect) { QPen pen; pen.setWidth(3); QPainterPath path; - x += 12.5; - y += 8; + const int x = buttonRect.left() + 12.5; + const int y = buttonRect.top() + 8; pen.setColor("#3366cc"); path.moveTo(x, y); path.lineTo(x, y + 15); @@ -69,20 +72,18 @@ void createArc(QPainter *painter, int startAngle, int spanAngle, QRect rectangle painter->strokePath(path, pen); } -void createCancelSymbol(QPainter *painter, int x, int y, int w, int h) +void createCancelButton(QPainter *painter, const QRect& r) { QPen p; p.setWidth(3); p.setColor("#dd3333"); - QRect r(x, y, w, h); createArc(painter, 0, 360, r, p); painter->setPen(p); - QRect nRect(x, y, w, h); auto oldFont = painter->font(); auto bFont = oldFont; bFont.setBold(true); painter->setFont(bFont); - painter->drawText(nRect, Qt::AlignCenter | Qt::AlignJustify, "X"); + painter->drawText(r, Qt::AlignCenter | Qt::AlignJustify, "X"); painter->setFont(oldFont); } @@ -106,18 +107,16 @@ void createDownloadStats(QPainter *painter, QRect box, QString downloadSpeed, QS void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& downloadInfo) { - int x,y,w,h; - x = box.left(); - y = box.top(); - w = box.width(); - h = box.height(); + const int x = box.left(); + const int y = box.top(); + const int w = box.width(); + const int h = box.height(); - int arcX = x + w/2 + 20; - int arcY = y + 20; - int arcW = w - 90; - int arcH = h - 40; + const int buttonW = w - 90; + const int buttonH = h - 40; - QRect pauseResumeButtonRect(arcX, arcY, arcW, arcH); + QRect pauseResumeButtonRect(x + w/2 + 20, y + 20, buttonW, buttonH); + QRect cancelButtonRect (x + w/2 - 20, y + 20, buttonW, buttonH); double progress = (double) (downloadInfo.progress) / 100; progress = -progress; @@ -125,10 +124,10 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow auto downloadSpeed = downloadInfo.downloadSpeed; if (downloadInfo.paused) { - createResumeSymbol(painter, arcX, arcY); - createCancelSymbol(painter, x + w/2 - 20, arcY, arcW, arcH); + createResumeSymbol(painter, pauseResumeButtonRect); + createCancelButton(painter, cancelButtonRect); } else { - createPauseSymbol(painter, arcX, arcY); + createPauseSymbol(painter, pauseResumeButtonRect); createDownloadStats(painter, box, downloadSpeed, completedLength); } @@ -146,6 +145,8 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow createArc(painter, startAngle, spanAngle, pauseResumeButtonRect, pen); } +} // unnamed namespace + void ContentManagerDelegate::paintButton(QPainter *p, const QRect &r, QString t) const { QStyleOptionButton button; From 42d5e78dc08b730877049cf57c4e5b1a6c55b80a Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 4 May 2024 11:53:29 +0200 Subject: [PATCH 3/4] Introduced DownloadControlLayout --- src/contentmanagerdelegate.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/contentmanagerdelegate.cpp b/src/contentmanagerdelegate.cpp index 39dba1e..7bb6cf8 100644 --- a/src/contentmanagerdelegate.cpp +++ b/src/contentmanagerdelegate.cpp @@ -105,7 +105,13 @@ void createDownloadStats(QPainter *painter, QRect box, QString downloadSpeed, QS painter->setFont(oldFont); } -void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& downloadInfo) +struct DownloadControlLayout +{ + QRect pauseResumeButtonRect; + QRect cancelButtonRect; +}; + +DownloadControlLayout getDownloadControlLayout(QRect box) { const int x = box.left(); const int y = box.top(); @@ -115,19 +121,25 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow const int buttonW = w - 90; const int buttonH = h - 40; - QRect pauseResumeButtonRect(x + w/2 + 20, y + 20, buttonW, buttonH); - QRect cancelButtonRect (x + w/2 - 20, y + 20, buttonW, buttonH); + DownloadControlLayout dcl; + dcl.pauseResumeButtonRect = QRect(x + w/2 + 20, y + 20, buttonW, buttonH); + dcl.cancelButtonRect = QRect(x + w/2 - 20, y + 20, buttonW, buttonH); + return dcl; +} +void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& downloadInfo) +{ + const DownloadControlLayout dcl = getDownloadControlLayout(box); double progress = (double) (downloadInfo.progress) / 100; progress = -progress; auto completedLength = downloadInfo.completedLength; auto downloadSpeed = downloadInfo.downloadSpeed; if (downloadInfo.paused) { - createResumeSymbol(painter, pauseResumeButtonRect); - createCancelButton(painter, cancelButtonRect); + createResumeSymbol(painter, dcl.pauseResumeButtonRect); + createCancelButton(painter, dcl.cancelButtonRect); } else { - createPauseSymbol(painter, pauseResumeButtonRect); + createPauseSymbol(painter, dcl.pauseResumeButtonRect); createDownloadStats(painter, box, downloadSpeed, completedLength); } @@ -137,12 +149,12 @@ void showDownloadProgress(QPainter *painter, QRect box, const DownloadState& dow painter->setRenderHint(QPainter::Antialiasing); pen.setColor("#eaecf0"); - createArc(painter, 0, 360, pauseResumeButtonRect, pen); + createArc(painter, 0, 360, dcl.pauseResumeButtonRect, pen); int startAngle = 0; int spanAngle = progress * 360; pen.setColor("#3366cc"); - createArc(painter, startAngle, spanAngle, pauseResumeButtonRect, pen); + createArc(painter, startAngle, spanAngle, dcl.pauseResumeButtonRect, pen); } } // unnamed namespace From 390193a3a64c1b6b3deb252d7e874ba88546bf2f Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 4 May 2024 12:09:49 +0200 Subject: [PATCH 4/4] Fixed detection of clicks on download control buttons Note that the button region is considered to be the bounding rectangle of the button icon circle rather than the circle itself. --- src/contentmanagerdelegate.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/contentmanagerdelegate.cpp b/src/contentmanagerdelegate.cpp index 7bb6cf8..14d7583 100644 --- a/src/contentmanagerdelegate.cpp +++ b/src/contentmanagerdelegate.cpp @@ -263,11 +263,11 @@ void ContentManagerDelegate::handleLastColumnClicked(const QModelIndex& index, Q { const auto node = static_cast(index.internalPointer()); const auto id = node->getBookId(); - int clickX = portutils::getX(*mouseEvent); - QRect r = option.rect; - int x = r.left(); - int w = r.width(); + const int clickX = portutils::getX(*mouseEvent); + const int clickY = portutils::getY(*mouseEvent); + const QPoint clickPoint(clickX, clickY); + const DownloadControlLayout dcl = getDownloadControlLayout(option.rect); ContentManager& contentMgr = *KiwixApp::instance()->getContentManager(); switch ( contentMgr.getBookState(id) ) { @@ -278,12 +278,18 @@ void ContentManagerDelegate::handleLastColumnClicked(const QModelIndex& index, Q return contentMgr.downloadBook(id, index); case ContentManager::BookState::DOWNLOADING: - return contentMgr.pauseBook(id, index); + if ( dcl.pauseResumeButtonRect.contains(clickPoint) ) { + contentMgr.pauseBook(id, index); + } + return; case ContentManager::BookState::DOWNLOAD_PAUSED: - return clickX < (x + w/2) - ? contentMgr.cancelBook(id) - : contentMgr.resumeBook(id, index); + if ( dcl.cancelButtonRect.contains(clickPoint) ) { + contentMgr.cancelBook(id); + } else if ( dcl.pauseResumeButtonRect.contains(clickPoint) ) { + contentMgr.resumeBook(id, index); + } + return; default: return;