diff options
author | Mavridis Philippe <mavridisf@gmail.com> | 2021-12-12 16:24:28 +0200 |
---|---|---|
committer | Mavridis Philippe <mavridisf@gmail.com> | 2024-03-28 18:47:19 +0200 |
commit | d1b9bae155425c2d500b136111cc4f2f28fc0c16 (patch) | |
tree | 5e0309e574fd8762cbd0b5dfdcbad176d18b459c /kmix | |
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)
Diffstat (limited to 'kmix')
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 <mavridisf@gmail.com> # +# # +# 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 <mavridisf@gmail.com> # +# # +# 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 |