fix: sound checked item highlight do not follow theme

1. update sound icon when theme changed
2. add built-in dci resources to prevent it become a white icon when changed into theme without dci resources

log: update sound icon when theme changed
This commit is contained in:
tsic404 2023-05-08 13:48:04 +08:00 committed by deepin-bot[bot]
parent 31958dfe1b
commit 579cf0afe9
12 changed files with 45 additions and 27 deletions

View File

@ -24,7 +24,7 @@ Copyright: UnionTech Software Technology Co., Ltd.
License: LGPL-3.0-or-later
# png svg
Files: plugins/*.png plugins/*.svg frame/*.svg tests/*.png tests/*.svg
Files: plugins/*.png plugins/*.svg frame/*.svg tests/*.png tests/*.svg plugins/*.dci
Copyright: UnionTech Software Technology Co., Ltd.
License: LGPL-3.0-or-later

View File

@ -1,3 +0,0 @@
SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
SPDX-License-Identifier: LGPL-3.0-or-later

View File

@ -25,7 +25,7 @@ pkg_check_modules(XCB_LIBS REQUIRED IMPORTED_TARGET xcursor)
pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt)
add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN")
add_library(${PLUGIN_NAME} SHARED ${SRCS})
add_library(${PLUGIN_NAME} SHARED ${SRCS} resources/sound.qrc)
set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../quick-trays)
target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS}
./dbusinterface

View File

@ -0,0 +1,9 @@
<RCC>
<qresource prefix="/dsg">
<file>built-in-icons/audio-volume-high-symbolic.dci</file>
<file>built-in-icons/audio-volume-low-symbolic.dci</file>
<file>built-in-icons/audio-volume-medium-symbolic.dci</file>
<file>built-in-icons/audio-volume-muted-symbolic.dci</file>
<file>built-in-icons/audio-volume-off-symbolic.dci</file>
</qresource>
</RCC>

View File

@ -29,7 +29,7 @@
DWIDGET_USE_NAMESPACE
#define HEADERHEIGHT 30
#define HEADERHEIGHT 10
#define ITEMSPACE 16
#define ROWSPACE 5
#define DESCRIPTIONHEIGHT 20
@ -49,7 +49,6 @@ using namespace Dock;
SoundDevicesWidget::SoundDevicesWidget(QWidget *parent)
: QWidget(parent)
, m_tipsLabel(new TipsWidget(this))
, m_titleLabel(new QLabel(tr("Sound"), this))
, m_sliderContainer(new SliderContainer(this))
, m_descriptionLabel(new QLabel(tr("Output Device"), this))
, m_deviceList(new DListView(this))
@ -94,9 +93,6 @@ void SoundDevicesWidget::initUi()
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setContentsMargins(10, 0, 10, 0);
m_titleLabel->setFixedHeight(HEADERHEIGHT);
m_titleLabel->setAlignment(Qt::AlignCenter);
QPixmap leftPixmap = QIcon::fromTheme(QString("audio-volume-%1-symbolic").arg(m_sinkInter->mute() ? "muted" : "off")).pixmap(18, 18);
m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 5);
QPixmap rightPixmap = QIcon::fromTheme("audio-volume-high-symbolic").pixmap(18, 18);
@ -112,7 +108,6 @@ void SoundDevicesWidget::initUi()
topLayout->setContentsMargins(7, 0, 7, 0);
topLayout->setSpacing(0);
topLayout->addWidget(m_titleLabel);
topLayout->addWidget(m_sliderContainer);
m_descriptionLabel->setMargin(5);
@ -220,6 +215,25 @@ void SoundDevicesWidget::initConnection()
}
emit iconChanged();
});
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [ = ] {
// 更新右icon左icon放在pixmap跟随refreshIcon一起更新
QPixmap rightPixmap = QIcon::fromTheme("audio-volume-high-symbolic").pixmap(18, 18);
m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(), 7);
// 主题变更时更新checked的背景色
for (int i =0; i < m_model->rowCount() -1; i++) {
auto item = m_model->item(i);
if (item->checkState() == Qt::Checked) {
item->setBackground(DPaletteHelper::instance()->palette(this).highlight());
}
}
});
connect(m_sliderContainer, &SliderContainer::iconClicked, this, [ this ](const SliderContainer::IconPosition icon) {
if (SliderContainer::IconPosition::LeftIcon == icon) {
m_sinkInter->SetMute(!m_sinkInter->mute());
}
});
}
/**

View File

@ -83,7 +83,6 @@ private Q_SLOTS:
private:
Dock::TipsWidget *m_tipsLabel;
QLabel *m_titleLabel;
SliderContainer *m_sliderContainer;
QLabel *m_descriptionLabel;
DListView *m_deviceList;

View File

@ -23,6 +23,8 @@
#include <QHBoxLayout>
#include <QMetaMethod>
#include <QPainter>
#include <QIcon>
#include <QPixmap>
DGUI_USE_NAMESPACE
@ -73,7 +75,11 @@ void SoundWidget::initConnection()
m_defaultSink = new DBusSink("org.deepin.dde.Audio1", value.path(), QDBusConnection::sessionBus(), this);
connect(m_defaultSink, &DBusSink::VolumeChanged, this, [ this ](double value) { m_sliderContainer->updateSliderValue(std::round(value * 100.00)); });
connect(m_defaultSink, &DBusSink::MuteChanged, this, [ = ] { m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100); });
connect(m_defaultSink, &DBusSink::MuteChanged, this, [ = ] {
m_sliderContainer->updateSliderValue(m_defaultSink->volume() * 100);
m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,
QIcon::fromTheme(leftIcon()).pixmap(ICON_SIZE, ICON_SIZE), QSize(), 10);
});
m_sliderContainer->updateSliderValue(std::round(m_defaultSink->volume() * 100.00));
});
@ -90,7 +96,8 @@ void SoundWidget::initConnection()
});
connect(m_defaultSink, &DBusSink::MuteChanged, this, [ this ] {
m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, QIcon(leftIcon()));
m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon,
QIcon::fromTheme(leftIcon()).pixmap(ICON_SIZE, ICON_SIZE), QSize(), 10);
});
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SoundWidget::onThemeTypeChanged);
@ -114,21 +121,13 @@ void SoundWidget::initConnection()
const QString SoundWidget::leftIcon()
{
const bool mute = existActiveOutputDevice() ? m_defaultSink->mute() : true;
if (mute) {
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType)
return QString(":/audio-volume-muted-symbolic-dark.svg");
return QString(":/audio-volume-muted-symbolic.svg");
}
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType)
return QString(":/audio-volume-medium-symbolic-dark.svg");
return QString(":/audio-volume-medium-symbolic.svg");
return QString("audio-volume-%1-symbolic").arg(mute? "muted": "medium");
}
const QString SoundWidget::rightIcon()
{
// TODO: broadcast ???
// svg from display plugins
return QString(":/icons/resources/broadcast.svg");
}
@ -171,8 +170,8 @@ bool SoundWidget::existActiveOutputDevice() const
void SoundWidget::onThemeTypeChanged()
{
QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE));
QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE));
QPixmap leftPixmap = QIcon::fromTheme(leftIcon()).pixmap(ICON_SIZE, ICON_SIZE);
QPixmap rightPixmap = QIcon::fromTheme(rightIcon()).pixmap(ICON_SIZE, ICON_SIZE);
convertThemePixmap(rightPixmap);
m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10);
m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12);