mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-18 12:28:31 +01:00
Add the ability to modify the playlistview's background image.
Updates issue 365 It is now possible to also modify background image, instead of just hide the default one
This commit is contained in:
parent
96eccdfabf
commit
2f710a9395
@ -12,7 +12,7 @@ darwin QMenu {
|
||||
|
||||
}
|
||||
|
||||
#playlist[background_enabled = "true"] {
|
||||
#playlist[default_background_enabled = "true"] {
|
||||
background-image: url(:logo.png);
|
||||
background-attachment: fixed;
|
||||
background-position: bottom right;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* This file is part of Clementine.
|
||||
Copyright 2010, David Sansome <me@davidsansome.com>
|
||||
Copyright 2012, David Sansome <me@davidsansome.com>
|
||||
|
||||
Clementine is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -41,6 +41,12 @@ const int PlaylistView::kGlowIntensitySteps = 24;
|
||||
const int PlaylistView::kAutoscrollGraceTimeout = 60; // seconds
|
||||
const int PlaylistView::kDropIndicatorWidth = 2;
|
||||
const int PlaylistView::kDropIndicatorGradientWidth = 5;
|
||||
// Opacity value used by all background images but the default clementine one
|
||||
// (because it is already opaque and load through the mainwindow.css file)
|
||||
const qreal PlaylistView::kBackgroundOpacity = 0.3;
|
||||
|
||||
const char* PlaylistView::kSettingBackgroundImageType = "playlistview_background_type";
|
||||
const char* PlaylistView::kSettingBackgroundImageFilename = "playlistview_background_image_file";
|
||||
|
||||
|
||||
PlaylistProxyStyle::PlaylistProxyStyle(QStyle* base)
|
||||
@ -91,6 +97,9 @@ PlaylistView::PlaylistView(QWidget *parent)
|
||||
upgrading_from_qheaderview_(false),
|
||||
read_only_settings_(true),
|
||||
upgrading_from_version_(-1),
|
||||
background_image_type_(Default),
|
||||
last_height_(-1),
|
||||
last_width_(-1),
|
||||
glow_enabled_(true),
|
||||
currently_glowing_(false),
|
||||
glow_intensity_step_(0),
|
||||
@ -775,13 +784,33 @@ void PlaylistView::JumpToLastPlayedTrack() {
|
||||
}
|
||||
|
||||
void PlaylistView::paintEvent(QPaintEvent* event) {
|
||||
// Reimplemented to draw the drop indicator
|
||||
// Reimplemented to draw the background image.
|
||||
// Reimplemented also to draw the drop indicator
|
||||
// When the user is dragging some stuff over the playlist paintEvent gets
|
||||
// called for the entire viewport every time the user moves the mouse.
|
||||
// The drawTree is kinda expensive, so we cache the result and draw from the
|
||||
// cache while the user is dragging. The cached pixmap gets invalidated in
|
||||
// dragLeaveEvent, dropEvent and scrollContentsBy.
|
||||
|
||||
// Draw background
|
||||
if (background_image_type_ == Custom) {
|
||||
if (!background_image_.isNull()) {
|
||||
QPainter background_painter(viewport());
|
||||
if (height() != last_height_ || width() != last_width_) {
|
||||
cached_scaled_background_image_ = background_image_.scaled(
|
||||
width(), height(),
|
||||
Qt::KeepAspectRatioByExpanding,
|
||||
Qt::SmoothTransformation);
|
||||
last_height_ = height();
|
||||
last_width_ = width();
|
||||
}
|
||||
background_painter.setOpacity(kBackgroundOpacity);
|
||||
background_painter.drawPixmap((width() - cached_scaled_background_image_.width()) / 2,
|
||||
(height() - cached_scaled_background_image_.height()) / 2,
|
||||
cached_scaled_background_image_);
|
||||
}
|
||||
}
|
||||
|
||||
QPainter p(viewport());
|
||||
|
||||
if (drop_indicator_row_ != -1) {
|
||||
@ -882,7 +911,20 @@ void PlaylistView::ReloadSettings() {
|
||||
QSettings s;
|
||||
s.beginGroup(Playlist::kSettingsGroup);
|
||||
glow_enabled_ = s.value("glow_effect", true).toBool();
|
||||
background_enabled_ = s.value("bg_enabled", true).toBool();
|
||||
|
||||
QVariant playlistview_background_type = s.value(kSettingBackgroundImageType);
|
||||
// bg_enabled should also be checked for backward compatibility (in releases
|
||||
// <= 1.0, there was just a boolean to activate/deactivate the background)
|
||||
QVariant bg_enabled = s.value("bg_enabled");
|
||||
if (playlistview_background_type.isValid()) {
|
||||
background_image_type_ = static_cast<BackgroundImageType>(playlistview_background_type.toInt());
|
||||
} else if (bg_enabled.isValid()) {
|
||||
if (bg_enabled.toBool()) {
|
||||
background_image_type_ = Default;
|
||||
} else {
|
||||
background_image_type_ = None;
|
||||
}
|
||||
}
|
||||
|
||||
if (setting_initial_header_layout_ || upgrading_from_qheaderview_) {
|
||||
header_->SetStretchEnabled(s.value("stretch", true).toBool());
|
||||
@ -894,7 +936,8 @@ void PlaylistView::ReloadSettings() {
|
||||
if (!glow_enabled_)
|
||||
StopGlowing();
|
||||
|
||||
setProperty("background_enabled", background_enabled_);
|
||||
setProperty("default_background_enabled", background_image_type_ == Default);
|
||||
emit BackgroundPropertyChanged();
|
||||
|
||||
if (setting_initial_header_layout_) {
|
||||
header_->SetColumnWidth(Playlist::Column_Length, 0.06);
|
||||
@ -914,6 +957,11 @@ void PlaylistView::ReloadSettings() {
|
||||
column_alignment_ = DefaultColumnAlignment();
|
||||
}
|
||||
|
||||
QString background_image_filename = s.value(kSettingBackgroundImageFilename).toString();
|
||||
if (!background_image_filename.isEmpty()) {
|
||||
background_image_ = QPixmap(background_image_filename);
|
||||
}
|
||||
|
||||
emit ColumnAlignmentChanged(column_alignment_);
|
||||
}
|
||||
|
||||
@ -925,7 +973,7 @@ void PlaylistView::SaveSettings() {
|
||||
s.beginGroup(Playlist::kSettingsGroup);
|
||||
s.setValue("glow_effect", glow_enabled_);
|
||||
s.setValue("column_alignments", QVariant::fromValue(column_alignment_));
|
||||
s.setValue("bg_enabled", background_enabled_);
|
||||
s.setValue(kSettingBackgroundImageType, background_image_type_);
|
||||
}
|
||||
|
||||
void PlaylistView::StretchChanged(bool stretch) {
|
||||
|
@ -57,14 +57,20 @@ private:
|
||||
|
||||
class PlaylistView : public QTreeView {
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(bool background_enabled
|
||||
READ background_enabled
|
||||
WRITE set_background_enabled
|
||||
NOTIFY BackgroundPropertyChanged)
|
||||
public:
|
||||
|
||||
enum BackgroundImageType {
|
||||
Default,
|
||||
None,
|
||||
Custom,
|
||||
};
|
||||
|
||||
PlaylistView(QWidget* parent = 0);
|
||||
|
||||
static const int kStateVersion;
|
||||
// Constants for settings: are persistent, values should not be changed
|
||||
static const char* kSettingBackgroundImageType;
|
||||
static const char* kSettingBackgroundImageFilename;
|
||||
|
||||
static ColumnAlignmentMap DefaultColumnAlignment();
|
||||
|
||||
@ -76,7 +82,7 @@ class PlaylistView : public QTreeView {
|
||||
void SetPlayer(Player* player) { player_ = player; }
|
||||
|
||||
Playlist* playlist() const { return playlist_; }
|
||||
bool background_enabled() const { return background_enabled_; }
|
||||
BackgroundImageType background_image_type() const { return background_image_type_; }
|
||||
Qt::Alignment column_alignment(int section) const;
|
||||
|
||||
// QTreeView
|
||||
@ -150,13 +156,14 @@ class PlaylistView : public QTreeView {
|
||||
void UpdateCachedCurrentRowPixmap(QStyleOptionViewItemV4 option,
|
||||
const QModelIndex& index);
|
||||
|
||||
inline void set_background_enabled(bool bg) { background_enabled_ = bg; emit BackgroundPropertyChanged(); }
|
||||
void set_background_image_type(BackgroundImageType bg) { background_image_type_ = bg; emit BackgroundPropertyChanged(); }
|
||||
|
||||
private:
|
||||
static const int kGlowIntensitySteps;
|
||||
static const int kAutoscrollGraceTimeout;
|
||||
static const int kDropIndicatorWidth;
|
||||
static const int kDropIndicatorGradientWidth;
|
||||
static const qreal kBackgroundOpacity;
|
||||
|
||||
QList<int> GetEditableColumns();
|
||||
QModelIndex NextEditableIndex(const QModelIndex& current);
|
||||
@ -172,7 +179,11 @@ class PlaylistView : public QTreeView {
|
||||
bool read_only_settings_;
|
||||
int upgrading_from_version_;
|
||||
|
||||
bool background_enabled_;
|
||||
BackgroundImageType background_image_type_;
|
||||
QPixmap background_image_;
|
||||
QPixmap cached_scaled_background_image_;
|
||||
int last_height_;
|
||||
int last_width_;
|
||||
|
||||
bool glow_enabled_;
|
||||
bool currently_glowing_;
|
||||
|
@ -36,6 +36,10 @@ class AlbumCoverChoiceController : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static const char* kLoadImageFileFilter;
|
||||
static const char* kSaveImageFileFilter;
|
||||
static const char* kAllFilesFilter;
|
||||
|
||||
AlbumCoverChoiceController(QWidget* parent = 0);
|
||||
~AlbumCoverChoiceController();
|
||||
|
||||
@ -108,10 +112,6 @@ private:
|
||||
QString GetInitialPathForFileDialog(const Song& song,
|
||||
const QString& filename);
|
||||
|
||||
static const char* kLoadImageFileFilter;
|
||||
static const char* kSaveImageFileFilter;
|
||||
static const char* kAllFilesFilter;
|
||||
|
||||
static bool IsKnownImageExtension(const QString& suffix);
|
||||
static QSet<QString>* sImageExtensions;
|
||||
|
||||
|
@ -19,18 +19,23 @@
|
||||
|
||||
#include <QApplication>
|
||||
#include <QColorDialog>
|
||||
#include <QFileDialog>
|
||||
#include <QSettings>
|
||||
|
||||
#include "iconloader.h"
|
||||
#include "mainwindow.h"
|
||||
#include "settingsdialog.h"
|
||||
#include "ui_appearancesettingspage.h"
|
||||
#include "core/appearance.h"
|
||||
#include "core/logging.h"
|
||||
#include "playlist/playlistview.h"
|
||||
#include "ui/albumcoverchoicecontroller.h"
|
||||
|
||||
AppearanceSettingsPage::AppearanceSettingsPage(SettingsDialog* dialog)
|
||||
: SettingsPage(dialog),
|
||||
ui_(new Ui_AppearanceSettingsPage),
|
||||
original_use_a_custom_color_set_(false)
|
||||
original_use_a_custom_color_set_(false),
|
||||
playlist_view_background_image_type_(PlaylistView::Default)
|
||||
{
|
||||
ui_->setupUi(this);
|
||||
setWindowIcon(IconLoader::Load("view-media-visualization"));
|
||||
@ -43,6 +48,25 @@ AppearanceSettingsPage::AppearanceSettingsPage(SettingsDialog* dialog)
|
||||
connect(ui_->select_foreground_color, SIGNAL(pressed()), SLOT(SelectForegroundColor()));
|
||||
connect(ui_->select_background_color, SIGNAL(pressed()), SLOT(SelectBackgroundColor()));
|
||||
connect(ui_->use_a_custom_color_set, SIGNAL(toggled(bool)), SLOT(UseCustomColorSetOptionChanged(bool)));
|
||||
|
||||
connect(ui_->select_background_image_filename_button, SIGNAL(pressed()), SLOT(SelectBackgroundImage()));
|
||||
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)));
|
||||
|
||||
switch (playlist_view_background_image_type_) {
|
||||
case PlaylistView::None:
|
||||
ui_->use_no_background->setChecked(true);
|
||||
break;
|
||||
case PlaylistView::Custom:
|
||||
ui_->use_custom_background_image->setChecked(true);
|
||||
break;
|
||||
case PlaylistView::Default:
|
||||
default:
|
||||
ui_->use_default_background->setChecked(true);
|
||||
}
|
||||
ui_->background_image_filename->setText(playlist_view_background_image_filename_);
|
||||
}
|
||||
|
||||
AppearanceSettingsPage::~AppearanceSettingsPage() {
|
||||
@ -67,6 +91,14 @@ void AppearanceSettingsPage::Load() {
|
||||
current_background_color_ = original_background_color_;
|
||||
|
||||
InitColorSelectorsColors();
|
||||
|
||||
QSettings playlist_settings;
|
||||
playlist_settings.beginGroup(Playlist::kSettingsGroup);
|
||||
playlist_view_background_image_type_ =
|
||||
static_cast<PlaylistView::BackgroundImageType>(
|
||||
playlist_settings.value(PlaylistView::kSettingBackgroundImageType).toInt());
|
||||
playlist_view_background_image_filename_ =
|
||||
playlist_settings.value(PlaylistView::kSettingBackgroundImageFilename).toString();
|
||||
}
|
||||
|
||||
void AppearanceSettingsPage::Save() {
|
||||
@ -80,6 +112,21 @@ void AppearanceSettingsPage::Save() {
|
||||
} else {
|
||||
dialog()->appearance()->ResetToSystemDefaultTheme();
|
||||
}
|
||||
|
||||
QSettings playlist_settings;
|
||||
playlist_settings.beginGroup(Playlist::kSettingsGroup);
|
||||
playlist_view_background_image_filename_ = ui_->background_image_filename->text();
|
||||
if (ui_->use_no_background->isChecked()) {
|
||||
playlist_view_background_image_type_ = PlaylistView::None;
|
||||
} else if (ui_->use_default_background->isChecked()) {
|
||||
playlist_view_background_image_type_ = PlaylistView::Default;
|
||||
} else if (ui_->use_custom_background_image->isChecked()) {
|
||||
playlist_view_background_image_type_ = PlaylistView::Custom;
|
||||
playlist_settings.setValue(PlaylistView::kSettingBackgroundImageFilename,
|
||||
playlist_view_background_image_filename_);
|
||||
}
|
||||
playlist_settings.setValue(PlaylistView::kSettingBackgroundImageType,
|
||||
playlist_view_background_image_type_);
|
||||
}
|
||||
|
||||
void AppearanceSettingsPage::Cancel() {
|
||||
@ -134,3 +181,15 @@ void AppearanceSettingsPage::UpdateColorSelectorColor(QWidget* color_selector, c
|
||||
.arg(color.blue());
|
||||
color_selector->setStyleSheet(css);
|
||||
}
|
||||
|
||||
void AppearanceSettingsPage::SelectBackgroundImage() {
|
||||
QString selected_filename =
|
||||
QFileDialog::getOpenFileName(this, tr("Select background image"),
|
||||
playlist_view_background_image_filename_,
|
||||
tr(AlbumCoverChoiceController::kLoadImageFileFilter) + ";;" +
|
||||
tr(AlbumCoverChoiceController::kAllFilesFilter));
|
||||
if (selected_filename.isEmpty())
|
||||
return;
|
||||
playlist_view_background_image_filename_ = selected_filename;
|
||||
ui_->background_image_filename->setText(playlist_view_background_image_filename_);
|
||||
}
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
#include "settingspage.h"
|
||||
|
||||
#include "playlist/playlistview.h"
|
||||
|
||||
class QWidget;
|
||||
|
||||
class Ui_AppearanceSettingsPage;
|
||||
@ -39,6 +41,7 @@ private slots:
|
||||
void SelectForegroundColor();
|
||||
void SelectBackgroundColor();
|
||||
void UseCustomColorSetOptionChanged(bool);
|
||||
void SelectBackgroundImage();
|
||||
|
||||
private:
|
||||
// Set the widget's background to new_color
|
||||
@ -52,6 +55,8 @@ private:
|
||||
QColor original_background_color_;
|
||||
QColor current_foreground_color_;
|
||||
QColor current_background_color_;
|
||||
PlaylistView::BackgroundImageType playlist_view_background_image_type_;
|
||||
QString playlist_view_background_image_filename_;
|
||||
};
|
||||
|
||||
#endif // APPEARANCESETTINGSPAGE_H
|
||||
|
@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>596</width>
|
||||
<height>199</height>
|
||||
<height>397</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -82,6 +82,65 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Background image</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="use_default_background">
|
||||
<property name="text">
|
||||
<string>Default background image</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="use_no_background">
|
||||
<property name="text">
|
||||
<string>No background image</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="use_custom_background_image">
|
||||
<property name="text">
|
||||
<string>Custom image:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="background_image_filename">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="select_background_image_filename_button">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Browse...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
|
@ -111,7 +111,6 @@ void BehaviourSettingsPage::Load() {
|
||||
|
||||
s.beginGroup(Playlist::kSettingsGroup);
|
||||
ui_->b_grey_out_deleted_->setChecked(s.value("greyoutdeleted", false).toBool());
|
||||
ui_->b_enable_background_img_->setChecked(s.value("bg_enabled", true).toBool());
|
||||
s.endGroup();
|
||||
}
|
||||
|
||||
@ -146,7 +145,6 @@ void BehaviourSettingsPage::Save() {
|
||||
|
||||
s.beginGroup(Playlist::kSettingsGroup);
|
||||
s.setValue("greyoutdeleted", ui_->b_grey_out_deleted_->isChecked());
|
||||
s.setValue("bg_enabled", ui_->b_enable_background_img_->isChecked());
|
||||
s.endGroup();
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>497</width>
|
||||
<width>516</width>
|
||||
<height>516</height>
|
||||
</rect>
|
||||
</property>
|
||||
@ -31,16 +31,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="b_enable_background_img_">
|
||||
<property name="text">
|
||||
<string>Enable playlist background image</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
|
Loading…
Reference in New Issue
Block a user