diff options
author | Mavridis Philippe <[email protected]> | 2021-12-12 16:24:28 +0200 |
---|---|---|
committer | Mavridis Philippe <[email protected]> | 2024-03-28 18:47:19 +0200 |
commit | d1b9bae155425c2d500b136111cc4f2f28fc0c16 (patch) | |
tree | 5e0309e574fd8762cbd0b5dfdcbad176d18b459c | |
parent | d2ab59b4284b371fb9e7cb143c3632e379d339b7 (diff) | |
download | tdemultimedia-d1b9bae155425c2d500b136111cc4f2f28fc0c16.tar.gz tdemultimedia-d1b9bae155425c2d500b136111cc4f2f28fc0c16.zip |
KMix: system tray icon enhancements
* XDG-compliant icon names with volume level specification (low, medium, high)
Low-Medium threshold: 33%
Medium-High threshold: 67%
* Improved built-in icon theme with distinct volume levels (according to above)
* Choice between classic KMix icon theme, imrpoved KMix icon theme and system theme.
* New KMixDockWidget::getAvgVolume() method
Gets average volume in %. Code actually comes from KMixDockWidget::setVolumeTip(),
but was put into a separate method to be reused for determination of icon according
to the volume level
(cherry picked from commit 3168c39ef1e445db1a6e22a7ba63e8cb4714e6e8)
17 files changed, 222 insertions, 58 deletions
diff --git a/kmix/appearanceconfig.ui b/kmix/appearanceconfig.ui index a55f5a11..294b00fb 100644 --- a/kmix/appearanceconfig.ui +++ b/kmix/appearanceconfig.ui @@ -8,8 +8,8 @@ <rect> <x>0</x> <y>0</y> - <width>464</width> - <height>280</height> + <width>487</width> + <height>278</height> </rect> </property> <property name="caption"> @@ -19,30 +19,18 @@ <property name="name"> <cstring>unnamed</cstring> </property> - <widget class="TQComboBox" row="0" column="1"> - <item> - <property name="text"> - <string>Horizontal</string> - </property> - </item> - <item> - <property name="text"> - <string>Vertical</string> - </property> - </item> + <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="2"> <property name="name"> - <cstring>kcfg_Orientation</cstring> + <cstring>kcfg_Menubar</cstring> </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="text"> + <string>Show &menu bar</string> + </property> + <property name="checked"> + <bool>true</bool> </property> </widget> - <widget class="TQLabel" row="1" column="0"> + <widget class="TQLabel" row="2" column="0"> <property name="name"> <cstring>lblValueStyle</cstring> </property> @@ -50,20 +38,12 @@ <string>Volume values:</string> </property> </widget> - <widget class="TQLabel" row="0" column="0"> + <widget class="TQCheckBox" row="5" column="0" rowspan="1" colspan="2"> <property name="name"> - <cstring>lblOrientation</cstring> - </property> - <property name="text"> - <string>Sliders orientation:</string> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>kcfg_Tickmarks</cstring> + <cstring>kcfg_Labels</cstring> </property> <property name="text"> - <string>Show &tickmarks</string> + <string>Show &labels</string> </property> <property name="checked"> <bool>true</bool> @@ -71,27 +51,44 @@ </widget> <widget class="TQCheckBox" row="4" column="0" rowspan="1" colspan="2"> <property name="name"> - <cstring>kcfg_Labels</cstring> + <cstring>kcfg_Tickmarks</cstring> </property> <property name="text"> - <string>Show &labels</string> + <string>Show &tickmarks</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> - <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="2"> + <widget class="TQComboBox" row="2" column="1"> + <item> + <property name="text"> + <string>None</string> + </property> + </item> + <item> + <property name="text"> + <string>Absolute</string> + </property> + </item> + <item> + <property name="text"> + <string>Relative</string> + </property> + </item> <property name="name"> - <cstring>kcfg_Menubar</cstring> - </property> - <property name="text"> - <string>Show &menu bar</string> + <cstring>kcfg_ValueStyle</cstring> </property> - <property name="checked"> - <bool>true</bool> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> </widget> - <spacer row="5" column="1"> + <spacer row="6" column="1"> <property name="name"> <cstring>spacer5</cstring> </property> @@ -108,24 +105,63 @@ </size> </property> </spacer> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>lblOrientation</cstring> + </property> + <property name="text"> + <string>Sliders orientation:</string> + </property> + </widget> <widget class="TQComboBox" row="1" column="1"> <item> <property name="text"> - <string>None</string> + <string>Horizontal</string> </property> </item> <item> <property name="text"> - <string>Absolute</string> + <string>Vertical</string> </property> </item> + <property name="name"> + <cstring>kcfg_Orientation</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>lblOrientation_2</cstring> + </property> + <property name="text"> + <string>Icon theme:</string> + </property> + </widget> + <widget class="TQComboBox" row="0" column="1"> <item> <property name="text"> - <string>Relative</string> + <string>Crystal</string> + </property> + </item> + <item> + <property name="text"> + <string>Classic (Old Crystal)</string> + </property> + </item> + <item> + <property name="text"> + <string>System</string> </property> </item> <property name="name"> - <cstring>kcfg_ValueStyle</cstring> + <cstring>kcfg_IconTheme</cstring> </property> <property name="sizePolicy"> <sizepolicy> diff --git a/kmix/kmix.kcfg b/kmix/kmix.kcfg index b6d595bd..d4ca0956 100644 --- a/kmix/kmix.kcfg +++ b/kmix/kmix.kcfg @@ -99,4 +99,21 @@ <default></default> </entry> </group> + <group name="Appearance"> + <entry key="IconTheme" type="Enum"> + <choices> + <choice name="Crystal"> + <label>Crystal</label> + </choice> + <choice name="OldCrystal"> + <label>Classic (Old Crystal)</label> + </choice> + <choice name="System"> + <label>System theme</label> + </choice> + </choices> + <default>Crystal</default> + <label>Icon Theme</label> + </entry> + </group> </kcfg>
\ No newline at end of file diff --git a/kmix/kmixdockwidget.cpp b/kmix/kmixdockwidget.cpp index 574a996c..fba30421 100644 --- a/kmix/kmixdockwidget.cpp +++ b/kmix/kmixdockwidget.cpp @@ -34,6 +34,7 @@ #include <tdelocale.h> #include <tdepopupmenu.h> #include <tdeglobalsettings.h> +#include <kstandarddirs.h> #include <tdemainwindow.h> #include <tqapplication.h> @@ -47,6 +48,7 @@ #include "mixer.h" #include "mixdevicewidget.h" #include "kmixdockwidget.h" +#include "kmixsettings.h" #include "viewdockareapopup.h" KMixDockWidget::KMixDockWidget( Mixer *mixer, TQWidget *parent, const char *name, bool volumePopup, bool dockIconMuting ) @@ -72,6 +74,9 @@ KMixDockWidget::KMixDockWidget( Mixer *mixer, TQWidget *parent, const char *name createActions(); createMasterVolWidget(); connect(this, TQ_SIGNAL(quitSelected()), kapp, TQ_SLOT(quitExtended())); + + TDEGlobal::dirs()->addResourceDir("icons_crystal", locate("appdata", "pics/crystal/")); + TDEGlobal::dirs()->addResourceDir("icons_oldcrystal", locate("appdata", "pics/oldcrystal/")); } KMixDockWidget::~KMixDockWidget() @@ -254,6 +259,20 @@ void KMixDockWidget::handleNewMaster(bool defaultMaster, int soundcard_id, const } +long +KMixDockWidget::getAvgVolume() +{ + MixDevice *md = 0; + if ( _dockAreaPopup != 0 ) { + md = _dockAreaPopup->dockDevice(); + } + + if ( md == 0 || md->maxVolume() == 0 ) + return -1; + + return (md->getVolume().getAvgVolume(Volume::MMAIN)*100 )/( md->maxVolume() ); +} + void KMixDockWidget::setVolumeTip() { @@ -261,6 +280,7 @@ KMixDockWidget::setVolumeTip() if ( _dockAreaPopup != 0 ) { md = _dockAreaPopup->dockDevice(); } + TQString tip = ""; int newToolTipValue = 0; @@ -271,10 +291,7 @@ KMixDockWidget::setVolumeTip() } else { - long val = -1; - if ( md->maxVolume() != 0 ) { - val = (md->getVolume().getAvgVolume(Volume::MMAIN)*100 )/( md->maxVolume() ); - } + long val = getAvgVolume(); newToolTipValue = val + 10000*md->isMuted(); if ( _oldToolTipValue != newToolTipValue ) { tip = i18n( "Volume at %1%" ).arg( val ); @@ -316,7 +333,13 @@ KMixDockWidget::updatePixmap(bool force) } else { - newPixmapType = 'd'; + long avgVol = getAvgVolume(); + if ( avgVol <= 33 ) + newPixmapType = 'L'; + else if ( avgVol <= 67 ) + newPixmapType = 'M'; + else + newPixmapType = 'H'; } if (( newPixmapType != _oldPixmapType ) || (force == true)) { @@ -325,12 +348,23 @@ KMixDockWidget::updatePixmap(bool force) TQPixmap origpixmap; TQPixmap scaledpixmap; TQImage newIcon; + + TQStringList fallback; switch ( newPixmapType ) { - case 'e': origpixmap = isShown() ? loadSizedIcon( "kmixdocked_error", width() ) : loadIcon( "kmixdocked_error"); break; - case 'm': origpixmap = isShown() ? loadSizedIcon( "kmixdocked_mute" , width() ) : loadIcon( "kmixdocked_mute"); break; - case 'd': origpixmap = isShown() ? loadSizedIcon( "kmixdocked" , width() ) : loadIcon( "kmixdocked "); break; + case 'm': fallback << "audio-volume-muted" << "kmixdocked_mute"; break; + case 'L': fallback << "audio-volume-low" << "kmixdocked"; break; + case 'M': fallback << "audio-volume-medium" << "kmixdocked"; break; + case 'H': fallback << "audio-volume-high" << "kmixdocked"; break; } - newIcon = origpixmap; + + TQString icon = getIconPath(fallback); + if (icon.isNull()) + { + icon = getIconPath("audio-volume-error"); + } + + origpixmap = isShown() ? loadSizedIcon(icon, width()) : loadIcon(icon); + newIcon = origpixmap; if (isShown()) { newIcon = newIcon.smoothScale(width(), height()); } @@ -341,6 +375,51 @@ KMixDockWidget::updatePixmap(bool force) } } +TQString KMixDockWidget::getIconPath(TQStringList fallback) +{ + auto iconTheme = KMixSettings::iconTheme(); + + TQCString iconThemeName; + if (iconTheme != KMixSettings::EnumIconTheme::System) + { + switch (iconTheme) + { + case KMixSettings::EnumIconTheme::OldCrystal: + iconThemeName = "oldcrystal"; + break; + + default: + case KMixSettings::EnumIconTheme::Crystal: + iconThemeName = "crystal"; + break; + } + } + + for (TQStringList::iterator it = fallback.begin(); it != fallback.end(); ++it) + { + if (iconTheme == KMixSettings::EnumIconTheme::System) + { + TQString iconPath = kapp->iconLoader()->iconPath((*it), TDEIcon::Panel, true); + if (!iconPath.isNull()) + { + return iconPath; + } + } + + else + { + TQCString type = "icons_" + iconThemeName; + + TQString iconPath = TDEGlobal::dirs()->findResource(type, TQString("%1.png").arg(*it)); + if (!iconPath.isNull()) return iconPath; + + iconPath = TDEGlobal::dirs()->findResource(type, TQString("%1.svg").arg(*it)); + if (!iconPath.isNull()) return iconPath; + } + } + return TQString::null; +} + void KMixDockWidget::resizeEvent ( TQResizeEvent * ) { updatePixmap(true); diff --git a/kmix/kmixdockwidget.h b/kmix/kmixdockwidget.h index a7b420a0..8f119ace 100644 --- a/kmix/kmixdockwidget.h +++ b/kmix/kmixdockwidget.h @@ -70,6 +70,8 @@ class KMixDockWidget : public KSystemTray { void toggleMinimizeRestore(); void resizeEvent(TQResizeEvent *); void showEvent(TQShowEvent *); + long getAvgVolume(); + TQString getIconPath(TQStringList fallback); private: bool _playBeepOnVolumeChange; diff --git a/kmix/pics/CMakeLists.txt b/kmix/pics/CMakeLists.txt index 35ea82c5..92af67f8 100644 --- a/kmix/pics/CMakeLists.txt +++ b/kmix/pics/CMakeLists.txt @@ -16,8 +16,10 @@ install( FILES mix_microphone.png mix_midi.png mix_recmon.png mix_treble.png mix_unknown.png mix_volume.png mix_surround.png mix_video.png mix_headphone.png - mix_digital.png mix_ac97.png kmixdocked.png - kmixdocked_mute.png kmixdocked_error.png mix_record.png + mix_digital.png mix_ac97.png mix_record.png SpeakerFrontLeft.png SpeakerRearLeft.png SpeakerFrontRight.png SpeakerRearRight.png Listener.png DESTINATION ${DATA_INSTALL_DIR}/kmix/pics ) + +add_subdirectory(oldcrystal) +add_subdirectory(crystal)
\ No newline at end of file diff --git a/kmix/pics/crystal/CMakeLists.txt b/kmix/pics/crystal/CMakeLists.txt new file mode 100644 index 00000000..71f61d26 --- /dev/null +++ b/kmix/pics/crystal/CMakeLists.txt @@ -0,0 +1,13 @@ +################################################################################ +# Copyright © 2024 Mavridis Philippe <[email protected]> # +# # +# This file is released under the GNU GPL version 3 or later. # +# Improvements and feedback are welcome! # +################################################################################ + +set(theme "crystal") + +install(FILES audio-volume-error.png audio-volume-muted.png + audio-volume-low.png audio-volume-medium.png + audio-volume-high.png + DESTINATION ${DATA_INSTALL_DIR}/kmix/pics/${theme})
\ No newline at end of file diff --git a/kmix/pics/kmixdocked_error.png b/kmix/pics/crystal/audio-volume-error.png Binary files differindex b0497662..b0497662 100644 --- a/kmix/pics/kmixdocked_error.png +++ b/kmix/pics/crystal/audio-volume-error.png diff --git a/kmix/pics/crystal/audio-volume-high.png b/kmix/pics/crystal/audio-volume-high.png Binary files differnew file mode 100644 index 00000000..bfa7234b --- /dev/null +++ b/kmix/pics/crystal/audio-volume-high.png diff --git a/kmix/pics/crystal/audio-volume-low.png b/kmix/pics/crystal/audio-volume-low.png Binary files differnew file mode 100644 index 00000000..e42f7c8b --- /dev/null +++ b/kmix/pics/crystal/audio-volume-low.png diff --git a/kmix/pics/crystal/audio-volume-medium.png b/kmix/pics/crystal/audio-volume-medium.png Binary files differnew file mode 100644 index 00000000..4be127eb --- /dev/null +++ b/kmix/pics/crystal/audio-volume-medium.png diff --git a/kmix/pics/crystal/audio-volume-muted.png b/kmix/pics/crystal/audio-volume-muted.png Binary files differnew file mode 100644 index 00000000..8ceb8690 --- /dev/null +++ b/kmix/pics/crystal/audio-volume-muted.png diff --git a/kmix/pics/oldcrystal/CMakeLists.txt b/kmix/pics/oldcrystal/CMakeLists.txt new file mode 100644 index 00000000..47b37e11 --- /dev/null +++ b/kmix/pics/oldcrystal/CMakeLists.txt @@ -0,0 +1,13 @@ +################################################################################ +# Copyright © 2024 Mavridis Philippe <[email protected]> # +# # +# This file is released under the GNU GPL version 3 or later. # +# Improvements and feedback are welcome! # +################################################################################ + +set(theme "oldcrystal") + +install(FILES audio-volume-error.png audio-volume-muted.png + audio-volume-low.png audio-volume-medium.png + audio-volume-high.png + DESTINATION ${DATA_INSTALL_DIR}/kmix/pics/${theme})
\ No newline at end of file diff --git a/kmix/pics/oldcrystal/audio-volume-error.png b/kmix/pics/oldcrystal/audio-volume-error.png Binary files differnew file mode 100644 index 00000000..b0497662 --- /dev/null +++ b/kmix/pics/oldcrystal/audio-volume-error.png diff --git a/kmix/pics/oldcrystal/audio-volume-high.png b/kmix/pics/oldcrystal/audio-volume-high.png new file mode 120000 index 00000000..dd3d1eea --- /dev/null +++ b/kmix/pics/oldcrystal/audio-volume-high.png @@ -0,0 +1 @@ +audio-volume-low.png
\ No newline at end of file diff --git a/kmix/pics/kmixdocked.png b/kmix/pics/oldcrystal/audio-volume-low.png Binary files differindex 0c3f17d7..9e8997e5 100644 --- a/kmix/pics/kmixdocked.png +++ b/kmix/pics/oldcrystal/audio-volume-low.png diff --git a/kmix/pics/oldcrystal/audio-volume-medium.png b/kmix/pics/oldcrystal/audio-volume-medium.png new file mode 120000 index 00000000..dd3d1eea --- /dev/null +++ b/kmix/pics/oldcrystal/audio-volume-medium.png @@ -0,0 +1 @@ +audio-volume-low.png
\ No newline at end of file diff --git a/kmix/pics/kmixdocked_mute.png b/kmix/pics/oldcrystal/audio-volume-muted.png Binary files differindex 0dae0f15..70764025 100644 --- a/kmix/pics/kmixdocked_mute.png +++ b/kmix/pics/oldcrystal/audio-volume-muted.png |