summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMavridis Philippe <mavridisf@gmail.com>2021-12-12 16:24:28 +0200
committerMavridis Philippe <mavridisf@gmail.com>2024-03-28 18:47:19 +0200
commitd1b9bae155425c2d500b136111cc4f2f28fc0c16 (patch)
tree5e0309e574fd8762cbd0b5dfdcbad176d18b459c
parentd2ab59b4284b371fb9e7cb143c3632e379d339b7 (diff)
downloadtdemultimedia-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)
-rw-r--r--kmix/appearanceconfig.ui130
-rw-r--r--kmix/kmix.kcfg17
-rw-r--r--kmix/kmixdockwidget.cpp97
-rw-r--r--kmix/kmixdockwidget.h2
-rw-r--r--kmix/pics/CMakeLists.txt6
-rw-r--r--kmix/pics/crystal/CMakeLists.txt13
-rw-r--r--kmix/pics/crystal/audio-volume-error.png (renamed from kmix/pics/kmixdocked_error.png)bin1176 -> 1176 bytes
-rw-r--r--kmix/pics/crystal/audio-volume-high.pngbin0 -> 1581 bytes
-rw-r--r--kmix/pics/crystal/audio-volume-low.pngbin0 -> 1379 bytes
-rw-r--r--kmix/pics/crystal/audio-volume-medium.pngbin0 -> 1423 bytes
-rw-r--r--kmix/pics/crystal/audio-volume-muted.pngbin0 -> 809 bytes
-rw-r--r--kmix/pics/oldcrystal/CMakeLists.txt13
-rw-r--r--kmix/pics/oldcrystal/audio-volume-error.pngbin0 -> 1176 bytes
l---------kmix/pics/oldcrystal/audio-volume-high.png1
-rw-r--r--kmix/pics/oldcrystal/audio-volume-low.png (renamed from kmix/pics/kmixdocked.png)bin1215 -> 1215 bytes
l---------kmix/pics/oldcrystal/audio-volume-medium.png1
-rw-r--r--kmix/pics/oldcrystal/audio-volume-muted.png (renamed from kmix/pics/kmixdocked_mute.png)bin607 -> 607 bytes
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 &amp;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 &amp;tickmarks</string>
+ <string>Show &amp;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 &amp;labels</string>
+ <string>Show &amp;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 &amp;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
index b0497662..b0497662 100644
--- a/kmix/pics/kmixdocked_error.png
+++ b/kmix/pics/crystal/audio-volume-error.png
Binary files differ
diff --git a/kmix/pics/crystal/audio-volume-high.png b/kmix/pics/crystal/audio-volume-high.png
new file mode 100644
index 00000000..bfa7234b
--- /dev/null
+++ b/kmix/pics/crystal/audio-volume-high.png
Binary files differ
diff --git a/kmix/pics/crystal/audio-volume-low.png b/kmix/pics/crystal/audio-volume-low.png
new file mode 100644
index 00000000..e42f7c8b
--- /dev/null
+++ b/kmix/pics/crystal/audio-volume-low.png
Binary files differ
diff --git a/kmix/pics/crystal/audio-volume-medium.png b/kmix/pics/crystal/audio-volume-medium.png
new file mode 100644
index 00000000..4be127eb
--- /dev/null
+++ b/kmix/pics/crystal/audio-volume-medium.png
Binary files differ
diff --git a/kmix/pics/crystal/audio-volume-muted.png b/kmix/pics/crystal/audio-volume-muted.png
new file mode 100644
index 00000000..8ceb8690
--- /dev/null
+++ b/kmix/pics/crystal/audio-volume-muted.png
Binary files differ
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
new file mode 100644
index 00000000..b0497662
--- /dev/null
+++ b/kmix/pics/oldcrystal/audio-volume-error.png
Binary files differ
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
index 0c3f17d7..9e8997e5 100644
--- a/kmix/pics/kmixdocked.png
+++ b/kmix/pics/oldcrystal/audio-volume-low.png
Binary files differ
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
index 0dae0f15..70764025 100644
--- a/kmix/pics/kmixdocked_mute.png
+++ b/kmix/pics/oldcrystal/audio-volume-muted.png
Binary files differ