Modify stretch background image functionality (#198)
* Modify stretch background image functionality Changes the stretch functionality to fill out the playlist background completely by zooming the image (if keep aspect ratio is selected) instead of filling it only height-wise. * Add option to keep old background fill * Fix playlist background image width and height * Fix width calculation * Remove old calculations
This commit is contained in:
parent
1185b910c4
commit
bcfd1d39bb
|
@ -136,6 +136,7 @@ PlaylistView::PlaylistView(QWidget *parent)
|
|||
background_image_position_(AppearanceSettingsPage::BackgroundImagePosition_BottomRight),
|
||||
background_image_maxsize_(0),
|
||||
background_image_stretch_(false),
|
||||
background_image_do_not_cut_(true),
|
||||
background_image_keep_aspect_ratio_(true),
|
||||
blur_radius_(AppearanceSettingsPage::kDefaultBlurRadius),
|
||||
opacity_level_(AppearanceSettingsPage::kDefaultOpacityLevel),
|
||||
|
@ -802,8 +803,11 @@ void PlaylistView::paintEvent(QPaintEvent *event) {
|
|||
if (!background_image_.isNull() || !previous_background_image_.isNull()) {
|
||||
QPainter background_painter(viewport());
|
||||
|
||||
int pb_height = height() - header_->height();
|
||||
int pb_width = verticalScrollBar()->isVisible() ? width() - style()->pixelMetric(QStyle::PM_ScrollBarExtent) : width();
|
||||
|
||||
// Check if we should recompute the background image
|
||||
if (height() != last_height_ || width() != last_width_ || force_background_redraw_) {
|
||||
if (pb_height != last_height_ || pb_width != last_width_ || force_background_redraw_) {
|
||||
|
||||
if (background_image_.isNull()) {
|
||||
cached_scaled_background_image_ = QPixmap();
|
||||
|
@ -811,21 +815,31 @@ void PlaylistView::paintEvent(QPaintEvent *event) {
|
|||
else {
|
||||
if (background_image_stretch_) {
|
||||
if (background_image_keep_aspect_ratio_) {
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled(width(), height(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
if (background_image_do_not_cut_){
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled(pb_width, pb_height, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
}
|
||||
else {
|
||||
if (pb_height >= pb_width){
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaledToHeight(pb_height, Qt::SmoothTransformation));
|
||||
}
|
||||
else {
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaledToWidth(pb_width, Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled(pb_width, pb_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
else {
|
||||
int resize_width = qMin(qMin(background_image_.size().width(), (width() >= 50 ? (width() - 25) : width())), background_image_maxsize_);
|
||||
int resize_height = qMin(qMin(background_image_.size().height(), (height() >= 50 ? (height() - 25) : height())), background_image_maxsize_);
|
||||
int resize_width = qMin(qMin(background_image_.size().width(), pb_width), background_image_maxsize_);
|
||||
int resize_height = qMin(qMin(background_image_.size().height(), pb_height), background_image_maxsize_);
|
||||
cached_scaled_background_image_ = QPixmap::fromImage(background_image_.scaled(resize_width, resize_height, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
|
||||
last_height_ = height();
|
||||
last_width_ = width();
|
||||
last_height_ = pb_height;
|
||||
last_width_ = pb_width;
|
||||
force_background_redraw_ = false;
|
||||
}
|
||||
|
||||
|
@ -841,21 +855,21 @@ void PlaylistView::paintEvent(QPaintEvent *event) {
|
|||
current_background_image_y_ = 0;
|
||||
break;
|
||||
case AppearanceSettingsPage::BackgroundImagePosition_UpperRight:
|
||||
current_background_image_x_ = (width() - cached_scaled_background_image_.width() - 0);
|
||||
current_background_image_x_ = (pb_width - cached_scaled_background_image_.width());
|
||||
current_background_image_y_ = 0;
|
||||
break;
|
||||
case AppearanceSettingsPage::BackgroundImagePosition_Middle:
|
||||
current_background_image_x_ = ((width() - cached_scaled_background_image_.width()) / 2);
|
||||
current_background_image_y_ = ((height() - cached_scaled_background_image_.height()) / 2);
|
||||
current_background_image_x_ = ((pb_width - cached_scaled_background_image_.width()) / 2);
|
||||
current_background_image_y_ = ((pb_height - cached_scaled_background_image_.height()) / 2);
|
||||
break;
|
||||
case AppearanceSettingsPage::BackgroundImagePosition_BottomLeft:
|
||||
current_background_image_x_ = 0;
|
||||
current_background_image_y_ = (height() - cached_scaled_background_image_.height() - 25);
|
||||
current_background_image_y_ = (pb_height - cached_scaled_background_image_.height());
|
||||
break;
|
||||
case AppearanceSettingsPage::BackgroundImagePosition_BottomRight:
|
||||
default:
|
||||
current_background_image_x_ = (width() - cached_scaled_background_image_.width() - 0);
|
||||
current_background_image_y_ = (height() - cached_scaled_background_image_.height() - 25);
|
||||
current_background_image_x_ = (pb_width - cached_scaled_background_image_.width());
|
||||
current_background_image_y_ = (pb_height - cached_scaled_background_image_.height());
|
||||
}
|
||||
background_painter.drawPixmap(current_background_image_x_, current_background_image_y_, cached_scaled_background_image_);
|
||||
}
|
||||
|
@ -987,6 +1001,7 @@ void PlaylistView::ReloadSettings() {
|
|||
if (background_image_maxsize <= 10) background_image_maxsize = 9000;
|
||||
QString background_image_filename = s.value(AppearanceSettingsPage::kBackgroundImageFilename).toString();
|
||||
bool background_image_stretch = s.value(AppearanceSettingsPage::kBackgroundImageStretch, false).toBool();
|
||||
bool background_image_do_not_cut = s.value(AppearanceSettingsPage::kBackgroundImageDoNotCut, true).toBool();
|
||||
bool background_image_keep_aspect_ratio = s.value(AppearanceSettingsPage::kBackgroundImageKeepAspectRatio, true).toBool();
|
||||
int blur_radius = s.value(AppearanceSettingsPage::kBlurRadius, AppearanceSettingsPage::kDefaultBlurRadius).toInt();
|
||||
int opacity_level = s.value(AppearanceSettingsPage::kOpacityLevel, AppearanceSettingsPage::kDefaultOpacityLevel).toInt();
|
||||
|
@ -1049,6 +1064,7 @@ void PlaylistView::ReloadSettings() {
|
|||
background_image_position != background_image_position_ ||
|
||||
background_image_maxsize != background_image_maxsize_ ||
|
||||
background_image_stretch != background_image_stretch_ ||
|
||||
background_image_do_not_cut != background_image_do_not_cut_ ||
|
||||
background_image_keep_aspect_ratio != background_image_keep_aspect_ratio_ ||
|
||||
blur_radius_ != blur_radius ||
|
||||
opacity_level_ != opacity_level
|
||||
|
@ -1060,6 +1076,7 @@ void PlaylistView::ReloadSettings() {
|
|||
background_image_position_ = background_image_position;
|
||||
background_image_maxsize_ = background_image_maxsize;
|
||||
background_image_stretch_ = background_image_stretch;
|
||||
background_image_do_not_cut_ = background_image_do_not_cut;
|
||||
background_image_keep_aspect_ratio_ = background_image_keep_aspect_ratio;
|
||||
blur_radius_ = blur_radius;
|
||||
opacity_level_ = opacity_level;
|
||||
|
|
|
@ -207,6 +207,7 @@ class PlaylistView : public QTreeView {
|
|||
AppearanceSettingsPage::BackgroundImagePosition background_image_position_;
|
||||
int background_image_maxsize_;
|
||||
bool background_image_stretch_;
|
||||
bool background_image_do_not_cut_;
|
||||
bool background_image_keep_aspect_ratio_;
|
||||
int blur_radius_;
|
||||
int opacity_level_;
|
||||
|
|
|
@ -52,6 +52,7 @@ const char *AppearanceSettingsPage::kBackgroundImageType = "background_image_typ
|
|||
const char *AppearanceSettingsPage::kBackgroundImageFilename = "background_image_file";
|
||||
const char *AppearanceSettingsPage::kBackgroundImagePosition = "background_image_position";
|
||||
const char *AppearanceSettingsPage::kBackgroundImageStretch = "background_image_stretch";
|
||||
const char *AppearanceSettingsPage::kBackgroundImageDoNotCut = "background_image_do_not_cut";
|
||||
const char *AppearanceSettingsPage::kBackgroundImageKeepAspectRatio = "background_image_keep_aspect_ratio";
|
||||
const char *AppearanceSettingsPage::kBackgroundImageMaxSize = "background_image_max_size";
|
||||
|
||||
|
@ -94,6 +95,7 @@ AppearanceSettingsPage::AppearanceSettingsPage(SettingsDialog *dialog)
|
|||
connect(ui_->use_custom_background_image, SIGNAL(toggled(bool)), ui_->background_image_filename, SLOT(setEnabled(bool)));
|
||||
connect(ui_->use_custom_background_image, SIGNAL(toggled(bool)), ui_->select_background_image_filename_button, SLOT(setEnabled(bool)));
|
||||
|
||||
connect(ui_->checkbox_background_image_stretch, SIGNAL(toggled(bool)), ui_->checkbox_background_image_do_not_cut, SLOT(setEnabled(bool)));
|
||||
connect(ui_->checkbox_background_image_stretch, SIGNAL(toggled(bool)), ui_->checkbox_background_image_keep_aspect_ratio, SLOT(setEnabled(bool)));
|
||||
connect(ui_->checkbox_background_image_stretch, SIGNAL(toggled(bool)), ui_->spinbox_background_image_maxsize, SLOT(setDisabled(bool)));
|
||||
|
||||
|
@ -151,12 +153,16 @@ void AppearanceSettingsPage::Load() {
|
|||
ui_->combobox_backgroundimageposition->setCurrentIndex(ui_->combobox_backgroundimageposition->findData(s.value(kBackgroundImagePosition, BackgroundImagePosition_BottomRight).toInt()));
|
||||
ui_->spinbox_background_image_maxsize->setValue(s.value(kBackgroundImageMaxSize, 0).toInt());
|
||||
ui_->checkbox_background_image_stretch->setChecked(s.value(kBackgroundImageStretch, false).toBool());
|
||||
ui_->checkbox_background_image_do_not_cut->setChecked(s.value(kBackgroundImageDoNotCut, true).toBool());
|
||||
ui_->checkbox_background_image_keep_aspect_ratio->setChecked(s.value(kBackgroundImageKeepAspectRatio, true).toBool());
|
||||
ui_->blur_slider->setValue(s.value(kBlurRadius, kDefaultBlurRadius).toInt());
|
||||
ui_->opacity_slider->setValue(s.value(kOpacityLevel, kDefaultOpacityLevel).toInt());
|
||||
ui_->checkbox_system_icons->setChecked(s.value(kSystemThemeIcons, false).toBool());
|
||||
|
||||
if (!ui_->checkbox_background_image_stretch->isChecked()) ui_->checkbox_background_image_keep_aspect_ratio->setDisabled(true);
|
||||
if (!ui_->checkbox_background_image_stretch->isChecked()) {
|
||||
ui_->checkbox_background_image_do_not_cut->setDisabled(true);
|
||||
ui_->checkbox_background_image_keep_aspect_ratio->setDisabled(true);
|
||||
}
|
||||
|
||||
s.endGroup();
|
||||
|
||||
|
@ -201,6 +207,7 @@ void AppearanceSettingsPage::Save() {
|
|||
s.setValue(kBackgroundImageMaxSize, ui_->spinbox_background_image_maxsize->value());
|
||||
s.setValue(kBackgroundImagePosition, backgroundimageposition);
|
||||
s.setValue(kBackgroundImageStretch, ui_->checkbox_background_image_stretch->isChecked());
|
||||
s.setValue(kBackgroundImageDoNotCut, ui_->checkbox_background_image_do_not_cut->isChecked());
|
||||
s.setValue(kBackgroundImageKeepAspectRatio, ui_->checkbox_background_image_keep_aspect_ratio->isChecked());
|
||||
|
||||
s.setValue(kBlurRadius, ui_->blur_slider->value());
|
||||
|
|
|
@ -52,6 +52,7 @@ public:
|
|||
static const char *kBackgroundImageFilename;
|
||||
static const char *kBackgroundImagePosition;
|
||||
static const char *kBackgroundImageStretch;
|
||||
static const char *kBackgroundImageDoNotCut;
|
||||
static const char *kBackgroundImageKeepAspectRatio;
|
||||
static const char *kBackgroundImageMaxSize;
|
||||
|
||||
|
|
|
@ -268,6 +268,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkbox_background_image_do_not_cut">
|
||||
<property name="text">
|
||||
<string>Do not cut image</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkbox_background_image_keep_aspect_ratio">
|
||||
<property name="text">
|
||||
|
|
Loading…
Reference in New Issue