Refresh pieces bar colors once color scheme is changed

PR #21183.
Closes #21155.
This commit is contained in:
Vladimir Golovnev 2024-08-13 09:11:21 +03:00 committed by Vladimir Golovnev (Glassez)
parent a8cffbb205
commit a67bd271c6
No known key found for this signature in database
GPG key ID: 52A2C7DEE2DFA6F7
6 changed files with 86 additions and 55 deletions

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org> * Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -46,9 +47,9 @@ namespace
} }
DownloadedPiecesBar::DownloadedPiecesBar(QWidget *parent) DownloadedPiecesBar::DownloadedPiecesBar(QWidget *parent)
: base {parent} : base(parent)
, m_dlPieceColor {dlPieceColor(pieceColor())}
{ {
updateColorsImpl();
} }
QVector<float> DownloadedPiecesBar::bitfieldToFloatVector(const QBitArray &vecin, int reqSize) QVector<float> DownloadedPiecesBar::bitfieldToFloatVector(const QBitArray &vecin, int reqSize)
@ -128,25 +129,24 @@ QVector<float> DownloadedPiecesBar::bitfieldToFloatVector(const QBitArray &vecin
return result; return result;
} }
bool DownloadedPiecesBar::updateImage(QImage &image) QImage DownloadedPiecesBar::renderImage()
{ {
// qDebug() << "updateImage"; // qDebug() << "updateImage";
QImage image2(width() - 2 * borderWidth, 1, QImage::Format_RGB888); QImage image {width() - 2 * borderWidth, 1, QImage::Format_RGB888};
if (image2.isNull()) if (image.isNull())
{ {
qDebug() << "QImage image2() allocation failed, width():" << width(); qDebug() << "QImage allocation failed, width():" << width();
return false; return image;
} }
if (m_pieces.isEmpty()) if (m_pieces.isEmpty())
{ {
image2.fill(backgroundColor()); image.fill(backgroundColor());
image = image2; return image;
return true;
} }
QVector<float> scaledPieces = bitfieldToFloatVector(m_pieces, image2.width()); QVector<float> scaledPieces = bitfieldToFloatVector(m_pieces, image.width());
QVector<float> scaledPiecesDl = bitfieldToFloatVector(m_downloadedPieces, image2.width()); QVector<float> scaledPiecesDl = bitfieldToFloatVector(m_downloadedPieces, image.width());
// filling image // filling image
for (int x = 0; x < scaledPieces.size(); ++x) for (int x = 0; x < scaledPieces.size(); ++x)
@ -161,15 +161,15 @@ bool DownloadedPiecesBar::updateImage(QImage &image)
QRgb mixedColor = mixTwoColors(pieceColor().rgb(), m_dlPieceColor.rgb(), ratio); QRgb mixedColor = mixTwoColors(pieceColor().rgb(), m_dlPieceColor.rgb(), ratio);
mixedColor = mixTwoColors(backgroundColor().rgb(), mixedColor, fillRatio); mixedColor = mixTwoColors(backgroundColor().rgb(), mixedColor, fillRatio);
image2.setPixel(x, 0, mixedColor); image.setPixel(x, 0, mixedColor);
} }
else else
{ {
image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); image.setPixel(x, 0, pieceColors()[piecesToValue * 255]);
} }
} }
image = image2;
return true; return image;
} }
void DownloadedPiecesBar::setProgress(const QBitArray &pieces, const QBitArray &downloadedPieces) void DownloadedPiecesBar::setProgress(const QBitArray &pieces, const QBitArray &downloadedPieces)
@ -177,7 +177,7 @@ void DownloadedPiecesBar::setProgress(const QBitArray &pieces, const QBitArray &
m_pieces = pieces; m_pieces = pieces;
m_downloadedPieces = downloadedPieces; m_downloadedPieces = downloadedPieces;
requestImageUpdate(); redraw();
} }
void DownloadedPiecesBar::clear() void DownloadedPiecesBar::clear()
@ -198,3 +198,14 @@ QString DownloadedPiecesBar::simpleToolTipText() const
+ u"</table>"; + u"</table>";
} }
void DownloadedPiecesBar::updateColors()
{
PiecesBar::updateColors();
updateColorsImpl();
}
void DownloadedPiecesBar::updateColorsImpl()
{
m_dlPieceColor = dlPieceColor(pieceColor());
}

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org> * Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -52,11 +53,13 @@ public:
private: private:
// scale bitfield vector to float vector // scale bitfield vector to float vector
QVector<float> bitfieldToFloatVector(const QBitArray &vecin, int reqSize); QVector<float> bitfieldToFloatVector(const QBitArray &vecin, int reqSize);
bool updateImage(QImage &image) override; QImage renderImage() override;
QString simpleToolTipText() const override; QString simpleToolTipText() const override;
void updateColors() override;
void updateColorsImpl();
// incomplete piece color // incomplete piece color
const QColor m_dlPieceColor; QColor m_dlPieceColor;
// last used bitfields, uses to better resize redraw // last used bitfields, uses to better resize redraw
// TODO: make a diff pieces to new pieces and update only changed pixels, speedup when update > 20x faster // TODO: make a diff pieces to new pieces and update only changed pixels, speedup when update > 20x faster
QBitArray m_pieces; QBitArray m_pieces;

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org> * Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -126,39 +127,38 @@ QVector<float> PieceAvailabilityBar::intToFloatVector(const QVector<int> &vecin,
return result; return result;
} }
bool PieceAvailabilityBar::updateImage(QImage &image) QImage PieceAvailabilityBar::renderImage()
{ {
QImage image2(width() - 2 * borderWidth, 1, QImage::Format_RGB888); QImage image {width() - 2 * borderWidth, 1, QImage::Format_RGB888};
if (image2.isNull()) if (image.isNull())
{ {
qDebug() << "QImage image2() allocation failed, width():" << width(); qDebug() << "QImage allocation failed, width():" << width();
return false; return image;
} }
if (m_pieces.empty()) if (m_pieces.empty())
{ {
image2.fill(backgroundColor()); image.fill(backgroundColor());
image = image2; return image;
return true;
} }
QVector<float> scaledPieces = intToFloatVector(m_pieces, image2.width()); QVector<float> scaledPieces = intToFloatVector(m_pieces, image.width());
// filling image // filling image
for (int x = 0; x < scaledPieces.size(); ++x) for (int x = 0; x < scaledPieces.size(); ++x)
{ {
float piecesToValue = scaledPieces.at(x); float piecesToValue = scaledPieces.at(x);
image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); image.setPixel(x, 0, pieceColors()[piecesToValue * 255]);
} }
image = image2;
return true; return image;
} }
void PieceAvailabilityBar::setAvailability(const QVector<int> &avail) void PieceAvailabilityBar::setAvailability(const QVector<int> &avail)
{ {
m_pieces = avail; m_pieces = avail;
requestImageUpdate(); redraw();
} }
void PieceAvailabilityBar::clear() void PieceAvailabilityBar::clear()

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org> * Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -46,7 +47,7 @@ public:
void clear() override; void clear() override;
private: private:
bool updateImage(QImage &image) override; QImage renderImage() override;
QString simpleToolTipText() const override; QString simpleToolTipText() const override;
// last used int vector, uses to better resize redraw // last used int vector, uses to better resize redraw

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2016 Eugene Shalygin * Copyright (C) 2016 Eugene Shalygin
* Copyright (C) 2006 Christophe Dumez * Copyright (C) 2006 Christophe Dumez
* *
@ -41,6 +42,7 @@
#include "base/indexrange.h" #include "base/indexrange.h"
#include "base/path.h" #include "base/path.h"
#include "base/utils/misc.h" #include "base/utils/misc.h"
#include "gui/uithememanager.h"
namespace namespace
{ {
@ -114,10 +116,16 @@ namespace
} }
PiecesBar::PiecesBar(QWidget *parent) PiecesBar::PiecesBar(QWidget *parent)
: QWidget {parent} : QWidget(parent)
{ {
updatePieceColors();
setMouseTracking(true); setMouseTracking(true);
updateColorsImpl();
connect(UIThemeManager::instance(), &UIThemeManager::themeChanged, this, [this]
{
updateColors();
redraw();
});
} }
void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent) void PiecesBar::setTorrent(const BitTorrent::Torrent *torrent)
@ -154,7 +162,7 @@ void PiecesBar::leaveEvent(QEvent *e)
{ {
m_hovered = false; m_hovered = false;
m_highlightedRegion = {}; m_highlightedRegion = {};
requestImageUpdate(); redraw();
base::leaveEvent(e); base::leaveEvent(e);
} }
@ -178,7 +186,10 @@ void PiecesBar::paintEvent(QPaintEvent *)
else else
{ {
if (m_image.width() != imageRect.width()) if (m_image.width() != imageRect.width())
updateImage(m_image); {
if (const QImage image = renderImage(); !image.isNull())
m_image = image;
}
painter.drawImage(imageRect, m_image); painter.drawImage(imageRect, m_image);
} }
@ -196,30 +207,33 @@ void PiecesBar::paintEvent(QPaintEvent *)
painter.drawPath(border); painter.drawPath(border);
} }
void PiecesBar::requestImageUpdate() void PiecesBar::redraw()
{ {
if (updateImage(m_image)) if (const QImage image = renderImage(); !image.isNull())
{
m_image = image;
update(); update();
}
} }
QColor PiecesBar::backgroundColor() const QColor PiecesBar::backgroundColor() const
{ {
return palette().color(QPalette::Base); return palette().color(QPalette::Active, QPalette::Base);
} }
QColor PiecesBar::borderColor() const QColor PiecesBar::borderColor() const
{ {
return palette().color(QPalette::Dark); return palette().color(QPalette::Active, QPalette::Dark);
} }
QColor PiecesBar::pieceColor() const QColor PiecesBar::pieceColor() const
{ {
return palette().color(QPalette::Highlight); return palette().color(QPalette::Active, QPalette::Highlight);
} }
QColor PiecesBar::colorBoxBorderColor() const QColor PiecesBar::colorBoxBorderColor() const
{ {
return palette().color(QPalette::ToolTipText); return palette().color(QPalette::Active, QPalette::ToolTipText);
} }
const QVector<QRgb> &PiecesBar::pieceColors() const const QVector<QRgb> &PiecesBar::pieceColors() const
@ -325,12 +339,17 @@ void PiecesBar::highlightFile(int imagePos)
} }
} }
void PiecesBar::updatePieceColors() void PiecesBar::updateColors()
{
updateColorsImpl();
}
void PiecesBar::updateColorsImpl()
{ {
m_pieceColors = QVector<QRgb>(256); m_pieceColors = QVector<QRgb>(256);
for (int i = 0; i < 256; ++i) for (int i = 0; i < 256; ++i)
{ {
float ratio = (i / 255.0); const float ratio = (i / 255.0);
m_pieceColors[i] = mixTwoColors(backgroundColor().rgb(), pieceColor().rgb(), ratio); m_pieceColors[i] = mixTwoColors(backgroundColor().rgb(), pieceColor().rgb(), ratio);
} }
} }

View file

@ -1,5 +1,6 @@
/* /*
* Bittorrent Client using Qt and libtorrent. * Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2016 Eugene Shalygin * Copyright (C) 2016 Eugene Shalygin
* Copyright (C) 2006 Christophe Dumez * Copyright (C) 2006 Christophe Dumez
* *
@ -54,17 +55,15 @@ public:
virtual void clear(); virtual void clear();
// QObject interface
bool event(QEvent *e) override;
protected: protected:
// QWidget interface bool event(QEvent *e) override;
void enterEvent(QEnterEvent *e) override; void enterEvent(QEnterEvent *e) override;
void leaveEvent(QEvent *e) override; void leaveEvent(QEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override;
void paintEvent(QPaintEvent *e) override; void paintEvent(QPaintEvent *e) override;
void requestImageUpdate();
virtual void updateColors();
void redraw();
QColor backgroundColor() const; QColor backgroundColor() const;
QColor borderColor() const; QColor borderColor() const;
@ -82,11 +81,9 @@ private:
void highlightFile(int imagePos); void highlightFile(int imagePos);
virtual QString simpleToolTipText() const = 0; virtual QString simpleToolTipText() const = 0;
virtual QImage renderImage() = 0;
// draw new image to replace the actual image void updateColorsImpl();
// returns true if image was successfully updated
virtual bool updateImage(QImage &image) = 0;
void updatePieceColors();
const BitTorrent::Torrent *m_torrent = nullptr; const BitTorrent::Torrent *m_torrent = nullptr;
QImage m_image; QImage m_image;