From 579cf0afe98b34653ea51204802679e1158ddd9e Mon Sep 17 00:00:00 2001 From: tsic404 Date: Mon, 8 May 2023 13:48:04 +0800 Subject: [PATCH] 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 --- .reuse/dep5 | 2 +- .../dock-control-panel.dci.license | 3 -- plugins/sound/CMakeLists.txt | 2 +- .../audio-volume-high-symbolic.dci | Bin 0 -> 811 bytes .../audio-volume-low-symbolic.dci | Bin 0 -> 773 bytes .../audio-volume-medium-symbolic.dci | Bin 0 -> 795 bytes .../audio-volume-muted-symbolic.dci | Bin 0 -> 879 bytes .../audio-volume-off-symbolic.dci | Bin 0 -> 755 bytes plugins/sound/resources/sound.qrc | 9 ++++++ plugins/sound/sounddeviceswidget.cpp | 26 ++++++++++++---- plugins/sound/sounddeviceswidget.h | 1 - plugins/sound/soundwidget.cpp | 29 +++++++++--------- 12 files changed, 45 insertions(+), 27 deletions(-) delete mode 100644 plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci.license create mode 100644 plugins/sound/resources/built-in-icons/audio-volume-high-symbolic.dci create mode 100644 plugins/sound/resources/built-in-icons/audio-volume-low-symbolic.dci create mode 100644 plugins/sound/resources/built-in-icons/audio-volume-medium-symbolic.dci create mode 100644 plugins/sound/resources/built-in-icons/audio-volume-muted-symbolic.dci create mode 100644 plugins/sound/resources/built-in-icons/audio-volume-off-symbolic.dci create mode 100644 plugins/sound/resources/sound.qrc diff --git a/.reuse/dep5 b/.reuse/dep5 index 3e2a4628c..3741bb24c 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -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 diff --git a/plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci.license b/plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci.license deleted file mode 100644 index c0469f3bd..000000000 --- a/plugins/pluginmanager/resources/built-in-icons/dock-control-panel.dci.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. - -SPDX-License-Identifier: LGPL-3.0-or-later diff --git a/plugins/sound/CMakeLists.txt b/plugins/sound/CMakeLists.txt index 822bade30..6f095c5ea 100644 --- a/plugins/sound/CMakeLists.txt +++ b/plugins/sound/CMakeLists.txt @@ -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 diff --git a/plugins/sound/resources/built-in-icons/audio-volume-high-symbolic.dci b/plugins/sound/resources/built-in-icons/audio-volume-high-symbolic.dci new file mode 100644 index 0000000000000000000000000000000000000000..3cf8bdfa4185bb6b293178853a413b9ea7de7f73 GIT binary patch literal 811 zcmZ>9_GDmWWME)2G-IFy+-8F4X3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUycpfkUK!8$Dhe6F@ggFdi zEXgDv)SMtsH#asQJKWVNAS}Sb=NHf=&if42YMqvRPh=Z=hp8|(M|2P{k! z7$-z9GTvZdwGhbI)4<)xa)4dqK)(Y66T=3E1U7~{4K4|8Ok51S4Np8KDQULPoH?_y zSk3(3|E&wxMA*1}sb_j3e*dc8%!4NwSXR#c6?0X3UC2>xhGlOU*OzXU*4TPjnvGj{ z?qgX7N1^0`spbk@&!rFh8@NQB=C|nb@ZYWXQnSYONP^r%%|8qkTMlkp6m0dUTH|il zI%n~j8$HvWr5lKMmRx&vEM9## eAZXW~Zx%fv`8$d{|Jo>geqt;U8NNHkUKIc+%Z@7m literal 0 HcmV?d00001 diff --git a/plugins/sound/resources/built-in-icons/audio-volume-low-symbolic.dci b/plugins/sound/resources/built-in-icons/audio-volume-low-symbolic.dci new file mode 100644 index 0000000000000000000000000000000000000000..c6dccc57a12304d680e68b4fca5d96a3952dfadf GIT binary patch literal 773 zcmZ>9_GDmWWME)2G-IFyY-NJzX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxB?gfAV8_74WQ;Q!W;%M zmSpk;R7a4fo7)2*JKWVNAS}Sb=Q5D3uYZ7B;JD%c&-VX&lstpx+>xrw#yY(b7;Z<{=23by%TX`okPwV-cs{wa!i|Y71@X=p+(Pr+= qKYX(nf0dtfced1_wNiT)OD$@bdZll=CE4^#QCgHl&9tPaiVOgV8h$_k literal 0 HcmV?d00001 diff --git a/plugins/sound/resources/built-in-icons/audio-volume-medium-symbolic.dci b/plugins/sound/resources/built-in-icons/audio-volume-medium-symbolic.dci new file mode 100644 index 0000000000000000000000000000000000000000..5c3f47a26427b8d3884804c758aeb587576be925 GIT binary patch literal 795 zcmZ>9_GDmWWME)2G-IFyoMwXPX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxDOZsAV8_7-Js?$!W;%M zmSplDR7a4fo7*=aJKWVNAS}Sb=OvJ>uYZ7B;JD%c&-VX&lstpx+>xsyj~vcka_s{10z;PDjpr^Xel#dy-z6BEby#g_ z@4WW#iC11^Oi@c)^SONAwRo04eIM>xZT74?sy0)0w#Yg~IlD9_GDmWWME)2G-IFy$TLH9Gv(zMF^;}M7dPa%9u|CXfn5V(wBpDA;{0JBUAV8_7XF<(jggFdi zEXiaL)SMtsH#aXJJKWVNAS}Sb#}3HW*FV55kiTd_uJo}#p4+Vzp4I;oHJNnf*^Q;; zE)Hgyo7FSlJDgBpc3}_*6kuc#kQ8L#U|?fmkQ7{?%$URQp36$kis6TV;Gx~D7Z@B^ z85}xx-l=WLXJBQRr0m(XL?$gQ?O9~nv)=#qD>k_WZ>;Efv7dSSM3Iwsx1Oo~!2WZ4 z=;ORIzE7FoUwJZ*!9aL7Tlfo^n0w3xtYHtd<~5y|pQUei@WD&Dy$AH#POvddPG{aE zH-{(9v$W~Wo>c3yAf|Pb)%bs$iH@6_a?fY>1Ixt5+dfxI?k>^b33G0B-YPoljdH_n zm0l~UE0rEsI@^BPOkqBHwew5mp(*D*edT>i4_+#tJu~i=aOiqBYrE&s;?-d#r`6{D xJNY_}L)52yn)Sq0HOJHrn$G^gcT=V0pxQ@ivy=9WKbrn)=9#`%|0J(12msVatiu2R literal 0 HcmV?d00001 diff --git a/plugins/sound/resources/built-in-icons/audio-volume-off-symbolic.dci b/plugins/sound/resources/built-in-icons/audio-volume-off-symbolic.dci new file mode 100644 index 0000000000000000000000000000000000000000..98176725f5c87a373ac7408caa6a472dd3aad6b5 GIT binary patch literal 755 zcmZ>9_GDmWWME)2G-IFyEM|h}X3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyI1Ly9AV8_7<)G#;!W;%M zmSpl8R7a4fo7*`cJKWVNAS}Sb=OB=+uYZ7BV7=l0&-VX&lstoE?!H-?{Gnhy_Y`OL z5QdO74Gd-u%rYESaR*u#Fg;-Y!@mt2Zm^Fm|VZXxX%omX#gKMCJ8xt+tWe)5a< zdJUZ~x9?kWA7opUTd3)`)4l8Vqc)3l&&`h}rJXC7zUf~3)q7LE-m$r$Gw1S|=*v1* Y7uVD*jI>=A`FdSX>fGBB)8v^L0AH$p_W%F@ literal 0 HcmV?d00001 diff --git a/plugins/sound/resources/sound.qrc b/plugins/sound/resources/sound.qrc new file mode 100644 index 000000000..fa66482fc --- /dev/null +++ b/plugins/sound/resources/sound.qrc @@ -0,0 +1,9 @@ + + + built-in-icons/audio-volume-high-symbolic.dci + built-in-icons/audio-volume-low-symbolic.dci + built-in-icons/audio-volume-medium-symbolic.dci + built-in-icons/audio-volume-muted-symbolic.dci + built-in-icons/audio-volume-off-symbolic.dci + + diff --git a/plugins/sound/sounddeviceswidget.cpp b/plugins/sound/sounddeviceswidget.cpp index ce321972b..a475dfa35 100644 --- a/plugins/sound/sounddeviceswidget.cpp +++ b/plugins/sound/sounddeviceswidget.cpp @@ -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()); + } + }); } /** diff --git a/plugins/sound/sounddeviceswidget.h b/plugins/sound/sounddeviceswidget.h index 4e97a07b8..8359f0f2c 100644 --- a/plugins/sound/sounddeviceswidget.h +++ b/plugins/sound/sounddeviceswidget.h @@ -83,7 +83,6 @@ private Q_SLOTS: private: Dock::TipsWidget *m_tipsLabel; - QLabel *m_titleLabel; SliderContainer *m_sliderContainer; QLabel *m_descriptionLabel; DListView *m_deviceList; diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 030e71316..c7ac4664a 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include 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);