Fix dbz possibility in moodbar

Took me forever to find this. Randomly happens when changing tracks.
This commit is contained in:
Mark Furneaux 2014-05-25 00:16:12 -04:00
parent f65c48ef9c
commit af42ccea38
1 changed files with 20 additions and 14 deletions

View File

@ -241,15 +241,15 @@ void MoodbarProxyStyle::EnsureMoodbarRendered(const QStyleOptionSlider* opt) {
} }
if (moodbar_pixmap_dirty_) { if (moodbar_pixmap_dirty_) {
moodbar_pixmap_ = moodbar_pixmap_ = MoodbarPixmap(moodbar_colors_, slider_->size(),
MoodbarPixmap(moodbar_colors_, slider_->size(), slider_->palette(), opt); slider_->palette(), opt);
moodbar_pixmap_dirty_ = false; moodbar_pixmap_dirty_ = false;
} }
} }
int MoodbarProxyStyle::GetExtraSpace(const QStyleOptionComplex* opt) const { int MoodbarProxyStyle::GetExtraSpace(const QStyleOptionComplex* opt) const {
int space_available = int space_available = slider_->style()->pixelMetric(
slider_->style()->pixelMetric(QStyle::PM_SliderSpaceAvailable, opt, slider_); QStyle::PM_SliderSpaceAvailable, opt, slider_);
int w = slider_->width(); int w = slider_->width();
return w - space_available; return w - space_available;
} }
@ -272,20 +272,25 @@ QRect MoodbarProxyStyle::subControlRect(ComplexControl cc,
switch (sc) { switch (sc) {
case SC_SliderGroove: { case SC_SliderGroove: {
int margin_leftright = GetExtraSpace(opt) / 2; int margin_leftright = GetExtraSpace(opt) / 2;
return opt->rect.adjusted(margin_leftright, kMarginSize, -margin_leftright, return opt->rect.adjusted(margin_leftright, kMarginSize,
-kMarginSize); -margin_leftright, -kMarginSize);
} }
case SC_SliderHandle: { case SC_SliderHandle: {
const QStyleOptionSlider* slider_opt = const QStyleOptionSlider* slider_opt =
qstyleoption_cast<const QStyleOptionSlider*>(opt); qstyleoption_cast<const QStyleOptionSlider*>(opt);
int space_available = int space_available = slider_->style()->pixelMetric(
slider_->style()->pixelMetric(QStyle::PM_SliderSpaceAvailable, opt, slider_); QStyle::PM_SliderSpaceAvailable, opt, slider_);
int w = slider_->width(); int w = slider_->width();
int margin = (w - space_available) / 2; int margin = (w - space_available) / 2;
int x = (slider_opt->sliderValue - slider_opt->minimum) * int x = 0;
(space_available - kArrowWidth) /
(slider_opt->maximum - slider_opt->minimum); if (slider_opt->maximum != slider_opt->minimum) {
x = (slider_opt->sliderValue - slider_opt->minimum) *
(space_available - kArrowWidth) /
(slider_opt->maximum - slider_opt->minimum);
}
x += margin; x += margin;
return QRect(QPoint(opt->rect.left() + x, opt->rect.top()), return QRect(QPoint(opt->rect.left() + x, opt->rect.top()),
@ -325,14 +330,14 @@ QPixmap MoodbarProxyStyle::MoodbarPixmap(const ColorVector& colors,
const QSize& size, const QSize& size,
const QPalette& palette, const QPalette& palette,
const QStyleOptionSlider* opt) { const QStyleOptionSlider* opt) {
int margin_leftright = GetExtraSpace(opt); int margin_leftright = GetExtraSpace(opt);
const QRect rect(QPoint(0, 0), size); const QRect rect(QPoint(0, 0), size);
QRect border_rect(rect); QRect border_rect(rect);
// I would expect we need to adjust by margin_lr/2, so the extra space is // I would expect we need to adjust by margin_lr/2, so the extra space is
// distributed on both side, but if we do so, the margin is too small, and I'm // distributed on both side, but if we do so, the margin is too small, and I'm
// not sure why... // not sure why...
border_rect.adjust(margin_leftright, kMarginSize, -margin_leftright, -kMarginSize); border_rect.adjust(margin_leftright, kMarginSize, -margin_leftright,
-kMarginSize);
QRect inner_rect(border_rect); QRect inner_rect(border_rect);
inner_rect.adjust(kBorderSize, kBorderSize, -kBorderSize, -kBorderSize); inner_rect.adjust(kBorderSize, kBorderSize, -kBorderSize, -kBorderSize);
@ -355,7 +360,8 @@ QPixmap MoodbarProxyStyle::MoodbarPixmap(const ColorVector& colors,
p.drawRect(rect.adjusted(1, 1, -2, -2)); p.drawRect(rect.adjusted(1, 1, -2, -2));
// Then, thicker border on left and right, because of the margins. // Then, thicker border on left and right, because of the margins.
p.setPen(QPen(palette.brush(QPalette::Active, QPalette::Background), p.setPen(QPen(palette.brush(QPalette::Active, QPalette::Background),
margin_leftright*2-kBorderSize, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); margin_leftright * 2 - kBorderSize, Qt::SolidLine, Qt::FlatCap,
Qt::MiterJoin));
p.drawLine(rect.topLeft(), rect.bottomLeft()); p.drawLine(rect.topLeft(), rect.bottomLeft());
p.drawLine(rect.topRight(), rect.bottomRight()); p.drawLine(rect.topRight(), rect.bottomRight());